sla_zcorrection_tests.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include <catch2/catch.hpp>
  2. #include <test_utils.hpp>
  3. #include <algorithm>
  4. #include "libslic3r/TriangleMeshSlicer.hpp"
  5. #include "libslic3r/SLA/ZCorrection.hpp"
  6. #include "libslic3r/MTUtils.hpp"
  7. #include "libslic3r/SVG.hpp"
  8. void print_depthmap(std::string_view prefix,
  9. const Slic3r::BoundingBox &bb,
  10. const Slic3r::sla::zcorr_detail::DepthMap &dm)
  11. {
  12. using namespace Slic3r;
  13. size_t cnt = 0;
  14. for (const sla::zcorr_detail::DepthMapLayer &layer : dm) {
  15. SVG svg(std::string(prefix) + std::to_string(cnt++) + ".svg", bb);
  16. for (const auto &[depth, dpolys] : layer) {
  17. svg.draw_outline(dpolys);
  18. svg.draw(dpolys, "green", 1. + depth / 10.f);
  19. }
  20. }
  21. }
  22. TEST_CASE("Number of layers should be equal after z correction", "[ZCorr]")
  23. {
  24. using namespace Slic3r;
  25. const size_t Layers = random_value(size_t{1}, size_t{100});
  26. INFO("Layers = " << Layers);
  27. float zcorr_depth = GENERATE(0.f, random_value(0.01f, 10.f));
  28. std::vector<ExPolygons> slices(Layers);
  29. std::vector<float> hgrid = grid(0.f, Layers * 1.f, 1.f);
  30. std::vector<ExPolygons> output = sla::apply_zcorrection(slices, hgrid, zcorr_depth);
  31. REQUIRE(slices.size() == output.size());
  32. }
  33. TEST_CASE("Testing DepthMap for a cube", "[ZCorr]")
  34. {
  35. using namespace Slic3r;
  36. TriangleMesh mesh = load_model("20mm_cube.obj");
  37. auto bb = bounding_box(mesh);
  38. bb.offset(-0.1);
  39. std::vector<float> hgrid = grid<float>(bb.min.z(), bb.max.z(), 1.f);
  40. std::vector<ExPolygons> slices = slice_mesh_ex(mesh.its, hgrid, {});
  41. sla::zcorr_detail::DepthMap dmap = sla::zcorr_detail::create_depthmap(slices, hgrid);
  42. REQUIRE(dmap.size() == slices.size());
  43. for (size_t i = 0; i < slices.size(); ++i) {
  44. const auto &dlayer = dmap[i];
  45. const ExPolygons &slayer = slices[i];
  46. REQUIRE(dlayer.size() == 1);
  47. REQUIRE(dlayer.begin()->first == i);
  48. double ad = area(dlayer.begin()->second);
  49. double as = area(slayer);
  50. REQUIRE(ad == Approx(as).margin(EPSILON));
  51. }
  52. }
  53. TEST_CASE("Testing DepthMap for arbitrary shapes", "[ZCorr]")
  54. {
  55. using namespace Slic3r;
  56. auto modelname = GENERATE("V_standing.obj", "A_upsidedown.obj");
  57. TriangleMesh mesh = load_model(modelname);
  58. auto bb = bounding_box(mesh);
  59. bb.offset(-0.1);
  60. std::vector<float> hgrid = grid<float>(bb.min.z(), bb.max.z(), 0.5f);
  61. std::vector<ExPolygons> slices = slice_mesh_ex(mesh.its, hgrid, {});
  62. size_t zcorr_layers = GENERATE(size_t{0}, random_value(size_t{1}, size_t{10}));
  63. sla::zcorr_detail::DepthMap dmap =
  64. sla::zcorr_detail::create_depthmap(slices, hgrid, zcorr_layers);
  65. #ifndef NDEBUG
  66. print_depthmap("debug_dmap", scaled(to_2d(bb)), dmap);
  67. #endif
  68. REQUIRE(dmap.size() == slices.size());
  69. auto corrslices_fast = sla::apply_zcorrection(slices, zcorr_layers);
  70. sla::zcorr_detail::apply_zcorrection(dmap, zcorr_layers);
  71. for (size_t i = 0; i < corrslices_fast.size(); ++i) {
  72. ExPolygons dlayer = sla::zcorr_detail::merged_layer(dmap[i]);
  73. const ExPolygons &slayer = corrslices_fast[i];
  74. double ad = area(dlayer);
  75. double as = area(slayer);
  76. REQUIRE(ad == Approx(as).margin(EPSILON));
  77. }
  78. }
  79. TEST_CASE("Test depth to layers calculation", "[ZCorr]") {
  80. using namespace Slic3r;
  81. float layer_h = 0.5f;
  82. std::vector<float> hgrid = grid(0.f, 100.f, layer_h);
  83. float depth = GENERATE(0.f,
  84. random_value(0.01f, 0.499f),
  85. 0.5f,
  86. random_value(0.501f, 10.f));
  87. for (size_t i = 0; i < hgrid.size(); ++i) {
  88. auto expected_lyrs = std::min(i, static_cast<size_t>(std::ceil(depth/layer_h)));
  89. REQUIRE(sla::zcorr_detail::depth_to_layers(hgrid, i, depth) == expected_lyrs);
  90. }
  91. }