From 77a15a2d7fd630bad1cee6f086460ef3cf5b4c61 Mon Sep 17 00:00:00 2001 From: supermerill Date: Mon, 26 Oct 2020 21:31:23 +0100 Subject: [PATCH] fix some tests, add a dense infill test --- src/libslic3r/ExtrusionEntity.cpp | 7 ++ src/libslic3r/ExtrusionEntity.hpp | 27 +++++-- src/libslic3r/Print.cpp | 3 +- src/libslic3r/Print.hpp | 4 + src/libslic3r/PrintConfig.cpp | 2 +- tests/libslic3r/test_clipper_utils.cpp | 25 ++++++- tests/superslicerlibslic3r/CMakeLists.txt | 1 + .../test_complete_objects.cpp | 8 +- tests/superslicerlibslic3r/test_data.cpp | 4 +- .../test_dense_infill.cpp | 75 +++++++++++++++++++ tests/superslicerlibslic3r/test_print.cpp | 16 ++-- 11 files changed, 150 insertions(+), 22 deletions(-) create mode 100644 tests/superslicerlibslic3r/test_dense_infill.cpp diff --git a/src/libslic3r/ExtrusionEntity.cpp b/src/libslic3r/ExtrusionEntity.cpp index 585e271b7..220e5f563 100644 --- a/src/libslic3r/ExtrusionEntity.cpp +++ b/src/libslic3r/ExtrusionEntity.cpp @@ -391,6 +391,13 @@ void ExtrusionPrinter::use(const ExtrusionEntityCollection &collection) { } +void ExtrusionLength::default_use(const ExtrusionEntity& entity) { dist += entity.length(); }; +void ExtrusionLength::use(const ExtrusionEntityCollection& collection) { + for (int i = 0; i < collection.entities.size(); i++) { + collection.entities[i]->visit(*this); + } +} + //class ExtrusionTreeVisitor : ExtrusionVisitor { //public: // //virtual void use(ExtrusionEntity &entity) { assert(false); }; diff --git a/src/libslic3r/ExtrusionEntity.hpp b/src/libslic3r/ExtrusionEntity.hpp index fd54a1042..13aa1169c 100644 --- a/src/libslic3r/ExtrusionEntity.hpp +++ b/src/libslic3r/ExtrusionEntity.hpp @@ -552,19 +552,32 @@ class ExtrusionPrinter : public ExtrusionVisitorConst { bool trunc; public: ExtrusionPrinter(double mult = 0.0001, bool trunc = false) : mult(mult), trunc(trunc) { } - virtual void use(const ExtrusionPath &path) override; - virtual void use(const ExtrusionPath3D &path3D) override; - virtual void use(const ExtrusionMultiPath &multipath) override; - virtual void use(const ExtrusionMultiPath3D &multipath) override; - virtual void use(const ExtrusionLoop &loop) override; - virtual void use(const ExtrusionEntityCollection &collection) override; + virtual void use(const ExtrusionPath& path) override; + virtual void use(const ExtrusionPath3D& path3D) override; + virtual void use(const ExtrusionMultiPath& multipath) override; + virtual void use(const ExtrusionMultiPath3D& multipath) override; + virtual void use(const ExtrusionLoop& loop) override; + virtual void use(const ExtrusionEntityCollection& collection) override; std::string str() { return ss.str(); } - std::string print(const ExtrusionEntity &entity) && { + std::string print(const ExtrusionEntity& entity)&& { entity.visit(*this); return ss.str(); } }; +class ExtrusionLength : public ExtrusionVisitorConst { + double dist; +public: + ExtrusionLength() : dist(0){ } + virtual void default_use(const ExtrusionEntity& path) override; + virtual void use(const ExtrusionEntityCollection& collection) override; + double get() { return dist; } + double length(const ExtrusionEntity& entity)&& { + entity.visit(*this); + return get(); + } +}; + } #endif diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 26ba8b694..3a6ba6201 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1724,7 +1724,8 @@ void Print::process() m_skirt.clear(); m_skirt_convex_hull.clear(); - m_first_layer_convex_hull.points.clear(); for (PrintObject *obj : m_objects) { + m_first_layer_convex_hull.points.clear(); + for (PrintObject *obj : m_objects) { obj->m_skirt.clear(); } if (this->has_skirt()) { diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 5bb55a088..79a8069ff 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -556,6 +556,10 @@ private: friend class PrintObject; }; +//for testing purpose +ExPolygons dense_fill_fit_to_size(const ExPolygon &polygon_to_cover, const ExPolygons& allowedPoints, + const ExPolygon& growing_area, const coord_t offset, float coverage); + } /* slic3r_Print_hpp_ */ #endif diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index a54490ba0..3cbde26ca 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -4865,7 +4865,7 @@ double PrintConfig::min_object_distance() const return PrintConfig::min_object_distance(static_cast(this)); } -double PrintConfig::min_object_distance(const ConfigBase *config, double ref_height) +double PrintConfig::min_object_distance(const ConfigBase *config, double ref_height /* = 0*/) { if (printer_technology(*config) == ptSLA) return 6.; diff --git a/tests/libslic3r/test_clipper_utils.cpp b/tests/libslic3r/test_clipper_utils.cpp index 6f492acca..f83d973b3 100644 --- a/tests/libslic3r/test_clipper_utils.cpp +++ b/tests/libslic3r/test_clipper_utils.cpp @@ -10,6 +10,29 @@ using namespace Slic3r; +SCENARIO("test clipper limits", "[ClipperUtils]") { + GIVEN("100mm square") { + WHEN("offset") { + Slic3r::Polygon square{ Point::new_scale(200, 100), Point::new_scale(200, 200), Point::new_scale(100, 200), Point::new_scale(100, 100) }; + THEN("offset 100") { + REQUIRE(offset(square, scale_(100)).size() == 1); + } + THEN("offset 1000") { + REQUIRE(offset(square, scale_(1000)).size() == 1); + } + THEN("offset 10000") { + REQUIRE(offset(square, scale_(10000)).size() == 1); + } + THEN("offset 100000") { + REQUIRE(offset(square, scale_(100000)).size() == 1); + } + THEN("offset 1000000") { + REQUIRE(offset(square, scale_(1000000)).size() == 1); + } + } + } +} + SCENARIO("Various Clipper operations - xs/t/11_clipper.t", "[ClipperUtils]") { // CCW oriented contour Slic3r::Polygon square{ { 200, 100 }, {200, 200}, {100, 200}, {100, 100} }; @@ -246,7 +269,7 @@ TEST_CASE("Traversing Clipper PolyTree", "[ClipperUtils]") { // Create a polygon representing unit box Polygon unitbox; const coord_t UNIT = coord_t(1. / SCALING_FACTOR); - unitbox.points = Points{Point{0, 0}, Point{UNIT, 0}, Point{UNIT, UNIT}, Point{0, UNIT}}; + unitbox.points = Points{Point{0, 0}, Point{UNIT, coord_t(0)}, Point{UNIT, UNIT}, Point{coord_t(0), UNIT}}; Polygon box_frame = unitbox; box_frame.scale(20, 10); diff --git a/tests/superslicerlibslic3r/CMakeLists.txt b/tests/superslicerlibslic3r/CMakeLists.txt index e21252161..150400ef9 100644 --- a/tests/superslicerlibslic3r/CMakeLists.txt +++ b/tests/superslicerlibslic3r/CMakeLists.txt @@ -16,6 +16,7 @@ add_executable(${_TEST_NAME}_tests test_data.hpp test_data.cpp # test_clipper_utils.cpp + test_dense_infill.cpp ) diff --git a/tests/superslicerlibslic3r/test_complete_objects.cpp b/tests/superslicerlibslic3r/test_complete_objects.cpp index bd2fb285f..d2f2b97ce 100644 --- a/tests/superslicerlibslic3r/test_complete_objects.cpp +++ b/tests/superslicerlibslic3r/test_complete_objects.cpp @@ -1,7 +1,7 @@ -//#define CATCH_CONFIG_DISABLE -//#include -#include +#define CATCH_CONFIG_DISABLE +#include +//#include #include #include "test_data.hpp" @@ -38,7 +38,7 @@ std::unique_ptr init_print_with_dist(DynamicPrintConfig &config, float di if (distance <= 0) { print->apply(model, config); - arrange_objects(*print, model, InfiniteBed{}, ArrangeParams{ scaled(min_object_distance(config)) });// print->config().min_object_distance(&print->config(), 999999)); + arrange_objects(print.get(), model, InfiniteBed{}, ArrangeParams{ scaled(/*min_object_distance(config)) });/*/ print->config().min_object_distance(&print->config(), 999999)) }); model.center_instances_around_point(Slic3r::Vec2d(100, 100)); } diff --git a/tests/superslicerlibslic3r/test_data.cpp b/tests/superslicerlibslic3r/test_data.cpp index c67b8faa4..fba077374 100644 --- a/tests/superslicerlibslic3r/test_data.cpp +++ b/tests/superslicerlibslic3r/test_data.cpp @@ -288,7 +288,7 @@ void init_print(Print& print, std::initializer_list meshes, Slic3r::Mo } print.apply(model, config); // apply config for the arrange_objects - arrange_objects(&print, model, InfiniteBed{}, ArrangeParams{ scaled(min_object_distance(config)) }); + arrange_objects(&print, model, InfiniteBed{}, ArrangeParams{ scaled(print.config().min_object_distance()) }); model.center_instances_around_point(Slic3r::Vec2d(100,100)); for (auto* mo : model.objects) { print.auto_assign_extruders(mo); @@ -324,7 +324,7 @@ void init_print(Print& print, std::vector meshes, Slic3r::Model& m } print.apply(model, config); // apply config for the arrange_objects - arrange_objects(&print, model, InfiniteBed{}, ArrangeParams{ scaled(min_object_distance(config)) }); + arrange_objects(&print, model, InfiniteBed{}, ArrangeParams{ scaled(print.config().min_object_distance()) }); model.center_instances_around_point(Slic3r::Vec2d(100,100)); print.apply(model, config); for (ModelObject* mo : model.objects) { diff --git a/tests/superslicerlibslic3r/test_dense_infill.cpp b/tests/superslicerlibslic3r/test_dense_infill.cpp new file mode 100644 index 000000000..060483cec --- /dev/null +++ b/tests/superslicerlibslic3r/test_dense_infill.cpp @@ -0,0 +1,75 @@ + +//#define CATCH_CONFIG_DISABLE +//#include +#include +//#include + +#include +#include "test_data.hpp" +#include +//#include +//#include +//#include +//#include + +using namespace Slic3r::Test; +using namespace Slic3r; +using namespace std::literals; + +Slic3r::Polygon get_polygon_scale(std::vector> points) { + Slic3r::Polygon poly; + for (std::vector& point : points) { + poly.points.push_back(Point::new_scale(point[0], point[1])); + } + return poly; +} + +SCENARIO("test auto generation") { + GIVEN("triangle with top to fill") { + //DynamicPrintConfig& config = Slic3r::DynamicPrintConfig::full_print_config(); + //config.set_key_value("fill_density", new ConfigOptionPercent(0)); + //config.set_deserialize("nozzle_diameter", "0.4"); + //config.set_deserialize("layer_height", "0.3"); + //config.set_deserialize("infill_dense_algo", "50"); + //config.set_deserialize("extruder_clearance_radius", "10"); + WHEN("little surface") { + ExPolygon polygon_to_cover; + polygon_to_cover.contour = get_polygon_scale({ {0,0}, {10,0}, {10,10}, {0,10} }); + ExPolygon growing_area; + growing_area.contour = get_polygon_scale({ {0,0}, {40,0}, {0,40} }); + ExPolygons allowedPoints; + allowedPoints.emplace_back(); + //diff_ex(offset_ex(growing_area, scale_(1)), offset_ex(layerm->fill_no_overlap_expolygons, double(-layerm->flow(frInfill).scaled_width()))); + allowedPoints.back().contour = get_polygon_scale({ {0,0}, {40,0}, {0,40} }); + coord_t offset = scale_(2); + float coverage = 1.f; + + ExPolygons solution = dense_fill_fit_to_size(polygon_to_cover, allowedPoints, growing_area, offset, coverage); + THEN("little support") { + double area_result = 0; + for (ExPolygon& p : solution) + area_result += unscaled(unscaled(p.area())); + double area_full = unscaled(unscaled(growing_area.area())); + //for (ExPolygon& p : allowedPoints) + // area_full += unscaled(unscaled(p.area()); + for (ExPolygon& po : solution) + for (Point& p : po.contour.points) + std::cout << ", " << unscaled(p.x()) << ":" << unscaled(p.y()); + std::cout << "\n"; + std::cout << "area_result= " << area_result << "\n"; + std::cout << "area_full = " << area_full << "\n"; + REQUIRE(area_full > 1.5 * area_result); + } + } + //THEN("(too near)") { + // result = init_print_with_dist(config, 40)->validate(); + // REQUIRE(result.first == PrintBase::PrintValidationError::pveWrongPosition); + //} + //THEN("(ok far)") { + // result = init_print_with_dist(config, 40.8)->validate(); + // REQUIRE(result.second == ""); + // REQUIRE(result.first == PrintBase::PrintValidationError::pveNone); + //} + } +} + diff --git a/tests/superslicerlibslic3r/test_print.cpp b/tests/superslicerlibslic3r/test_print.cpp index a8c1c4b9b..8528fb5d7 100644 --- a/tests/superslicerlibslic3r/test_print.cpp +++ b/tests/superslicerlibslic3r/test_print.cpp @@ -165,26 +165,30 @@ SCENARIO("Print: Brim generation") { } } WHEN("Brim without first layer compensation") { - config.set_key_value("brim_width", new ConfigOptionFloat(2)); + config.set_key_value("brim_width", new ConfigOptionFloat(1)); config.set_key_value("brim_offset", new ConfigOptionFloat(0)); Print print{}; Slic3r::Test::init_print(print, { m }, model, &config); print.process(); THEN("First Brim Extrusion has a length of ~88") { - REQUIRE(unscaled(print.brim().entities.front()->length()) > 22*4); - REQUIRE(unscaled(print.brim().entities.front()->length()) < 22*4+1); + REQUIRE(print.brim().entities.size() > 0); + double dist = unscaled(ExtrusionLength{}.length(*print.brim().entities.front())); + REQUIRE(dist > 22*4); + REQUIRE(dist < 22*4+1); } } WHEN("Brim with 1mm first layer compensation") { - config.set_key_value("brim_width", new ConfigOptionFloat(2)); + config.set_key_value("brim_width", new ConfigOptionFloat(1)); config.set_key_value("brim_offset", new ConfigOptionFloat(0)); config.set_key_value("first_layer_size_compensation", new ConfigOptionFloat(-1)); Print print{}; Slic3r::Test::init_print(print, { m }, model, &config); print.process(); THEN("First Brim Extrusion has a length of ~80") { - REQUIRE(unscaled(print.brim().entities.front()->length()) > 20 * 4); - REQUIRE(unscaled(print.brim().entities.front()->length()) < 20 * 4 + 1); + REQUIRE(print.brim().entities.size() > 0); + double dist = unscaled(ExtrusionLength{}.length(*print.brim().entities.front())); + REQUIRE(dist > 20 * 4); + REQUIRE(dist < 20 * 4 + 1); } } WHEN("Brim is set to 6mm, extrusion width 0.5mm") {