test_denserinfill.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. //#define CATCH_CONFIG_DISABLE
  2. #include <catch_main.hpp>
  3. #include "test_data.hpp"
  4. #include <libslic3r/libslic3r.h>
  5. #include <libslic3r/Print.hpp>
  6. #include <libslic3r/Layer.hpp>
  7. using namespace Slic3r;
  8. using namespace Slic3r::Geometry;
  9. const ExtrusionEntitiesPtr& get_island(const ExtrusionEntityCollection &coll, int island) {
  10. return dynamic_cast<const ExtrusionEntityCollection*>(coll.entities()[island])->entities();
  11. }
  12. const ExtrusionEntitiesPtr& remove_unique_collection_(const ExtrusionEntityCollection &coll, int island) {
  13. //TODO
  14. }
  15. SCENARIO("denser infills: ")
  16. {
  17. GIVEN("center hole")
  18. {
  19. WHEN("dense infill to enlarged") {
  20. Model model{};
  21. Print print{};
  22. DynamicPrintConfig config = Slic3r::DynamicPrintConfig::full_print_config();
  23. config.set_key_value("layer_height", new ConfigOptionFloat(0.2));
  24. config.set_key_value("first_layer_height", new ConfigOptionFloatOrPercent(0.2, false));
  25. config.set_key_value("infill_dense", new ConfigOptionBool(true));
  26. config.set_key_value("infill_dense_algo", new ConfigOptionEnum<DenseInfillAlgo>(dfaEnlarged));
  27. config.save("C:\\Users\\Admin\\Desktop\\config_def.ini");
  28. Slic3r::Test::init_print(print, { Slic3r::Test::TestMesh::di_5mm_center_notch }, model, &config, false);
  29. print.process();
  30. const PrintObject& object = *(print.get_object(0));
  31. //for (int lidx = 0; lidx < object.layers().size(); lidx++) {
  32. // std::cout << "layer " << lidx << " : \n";
  33. // std::cout << " - region_count= " << object.layers()[lidx]->region_count() << "\n";
  34. // for (int ridx = 0; ridx < object.layers()[lidx]->regions().size(); ridx++) {
  35. // std::cout << " region " << ridx << " : \n";
  36. // std::cout << " - fills= " << get_island(object.layers()[lidx]->regions()[ridx]->fills(),0).size() << "\n";
  37. // std::cout << " - surfaces= " << object.layers()[lidx]->regions()[ridx]->fill_surfaces().surfaces.size() << "\n";
  38. // for (int sidx = 0; sidx < object.layers()[lidx]->regions()[ridx]->fill_surfaces().surfaces.size(); sidx++) {
  39. // std::cout << " - type= " << object.layers()[lidx]->regions()[ridx]->fill_surfaces().surfaces[sidx].surface_type << "\n";
  40. // }
  41. // }
  42. //}
  43. /*THEN("67 layers exist in the model") {
  44. REQUIRE(object.layers().size() == 25);
  45. }
  46. THEN("at layer 16 , there are 1 region") {
  47. REQUIRE(object.layers()[16]->region_count() == 1);
  48. }
  49. THEN("at layer 17 , there are 2 region") {
  50. REQUIRE(object.layers()[17]->region_count() == 2);
  51. }
  52. THEN("at layer 18 , there are 2 region") {
  53. REQUIRE(object.layers()[18]->region_count() == 2);
  54. }*/
  55. THEN("correct number of fills") {
  56. REQUIRE(get_island(object.layers()[20]->regions()[0]->fills(),0).size() == 1); //sparse
  57. REQUIRE(get_island(object.layers()[21]->regions()[0]->fills(),0).size() == 2); //sparse + dense
  58. REQUIRE(object.layers()[21]->regions()[0]->fill_surfaces().surfaces.size() == 2);
  59. REQUIRE(object.layers()[21]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal | stModBridge));
  60. REQUIRE(object.layers()[21]->regions()[0]->fill_surfaces().surfaces[1].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
  61. REQUIRE(std::min(object.layers()[21]->regions()[0]->fill_surfaces().surfaces[0].maxNbSolidLayersOnTop, object.layers()[21]->regions()[0]->fill_surfaces().surfaces[1].maxNbSolidLayersOnTop) == 1);
  62. Surface* srfSparse = &object.layers()[21]->regions()[0]->set_fill_surfaces().surfaces[0];
  63. Surface* srfDense = &object.layers()[21]->regions()[0]->set_fill_surfaces().surfaces[1];
  64. if (srfSparse->maxNbSolidLayersOnTop == 1) {
  65. srfSparse = srfDense;
  66. srfDense = &object.layers()[21]->regions()[0]->set_fill_surfaces().surfaces[0];
  67. }
  68. //std::cout << "sparse area = " << unscaled(unscaled(srfSparse->area())) << " , dense area = " << unscaled(unscaled(srfDense->area())) << "\n";
  69. REQUIRE(unscaled(unscaled(srfSparse->area())) > unscaled(unscaled(srfDense->area())));
  70. REQUIRE(get_island(object.layers()[22]->regions()[0]->fills(),0).size() == 2); //sparse + solid-bridge
  71. REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces().surfaces.size() == 2);
  72. if (object.layers()[22]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal)) {
  73. REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces().surfaces[1].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal | SurfaceType::stModBridge));
  74. } else {
  75. REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal | SurfaceType::stModBridge));
  76. REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces().surfaces[1].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
  77. }
  78. REQUIRE(get_island(object.layers()[23]->regions()[0]->fills(),0).size() == 2); //sparse + solid
  79. REQUIRE(get_island(object.layers()[24]->regions()[0]->fills(),0).size() == 3); //sparse + solid-top + solid-top (over perimeters)
  80. REQUIRE(get_island(object.layers()[25]->regions()[0]->fills(),0).size() == 1); //sparse
  81. }
  82. }
  83. }
  84. GIVEN("side hole")
  85. {
  86. WHEN("dense infill to auto") {
  87. Model model{};
  88. Print print{};
  89. DynamicPrintConfig config = Slic3r::DynamicPrintConfig::full_print_config();
  90. config.set_key_value("layer_height", new ConfigOptionFloat(0.2));
  91. config.set_key_value("first_layer_height", new ConfigOptionFloatOrPercent(0.2, false));
  92. config.set_key_value("infill_dense", new ConfigOptionBool(true));
  93. config.set_key_value("infill_dense_algo", new ConfigOptionEnum<DenseInfillAlgo>(dfaAutomatic));
  94. config.save("C:\\Users\\Admin\\Desktop\\config_def.ini");
  95. Slic3r::Test::init_print(print, { Slic3r::Test::TestMesh::di_10mm_notch }, model, &config, false);
  96. print.process();
  97. const PrintObject& object = *(print.get_object(0));
  98. THEN("correct number of fills") {
  99. REQUIRE(object.layers().size() == 50);
  100. REQUIRE(get_island(object.layers()[20]->regions()[0]->fills(),0).size() == 1); //sparse
  101. REQUIRE(get_island(object.layers()[21]->regions()[0]->fills(),0).size() == 2); //sparse + dense
  102. REQUIRE(object.layers()[21]->regions()[0]->fill_surfaces().surfaces.size() == 2);
  103. REQUIRE(object.layers()[21]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
  104. REQUIRE(object.layers()[21]->regions()[0]->fill_surfaces().surfaces[1].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
  105. REQUIRE(std::min(object.layers()[21]->regions()[0]->fill_surfaces().surfaces[0].maxNbSolidLayersOnTop, object.layers()[21]->regions()[0]->fill_surfaces().surfaces[1].maxNbSolidLayersOnTop) == 1);
  106. Surface* srfSparse = &object.layers()[21]->regions()[0]->set_fill_surfaces().surfaces[0];
  107. Surface* srfDense = &object.layers()[21]->regions()[0]->set_fill_surfaces().surfaces[1];
  108. if (srfSparse->maxNbSolidLayersOnTop == 1) {
  109. srfSparse = srfDense;
  110. srfDense = &object.layers()[21]->regions()[0]->set_fill_surfaces().surfaces[0];
  111. }
  112. REQUIRE(unscaled(unscaled(srfSparse->area())) > unscaled(unscaled(srfDense->area())));
  113. REQUIRE(get_island(object.layers()[22]->regions()[0]->fills(),0).size() == 2); //sparse + solid-bridge
  114. REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces().surfaces.size() == 2);
  115. if (object.layers()[22]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal)) {
  116. REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces().surfaces[1].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal | SurfaceType::stModBridge));
  117. } else {
  118. REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal | SurfaceType::stModBridge));
  119. REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces().surfaces[1].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
  120. }
  121. REQUIRE(get_island(object.layers()[23]->regions()[0]->fills(),0).size() == 2); //sparse + solid
  122. REQUIRE(get_island(object.layers()[24]->regions()[0]->fills(),0).size() == 3); //sparse + solid-top + solid-top (over perimeters)
  123. REQUIRE(get_island(object.layers()[25]->regions()[0]->fills(),0).size() == 1); //sparse
  124. REQUIRE(get_island(object.layers()[45]->regions()[0]->fills(),0).size() == 1); //sparse
  125. REQUIRE(object.layers()[45]->regions()[0]->fill_surfaces().surfaces.size() == 1);
  126. REQUIRE(object.layers()[45]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
  127. REQUIRE(object.layers()[45]->regions()[0]->fill_surfaces().surfaces[0].maxNbSolidLayersOnTop > 1);
  128. REQUIRE(get_island(object.layers()[46]->regions()[0]->fills(),0).size() == 1); //dense
  129. REQUIRE(get_island(object.layers()[46]->regions()[0]->fills(),0).size() == 1);
  130. REQUIRE(object.layers()[46]->regions()[0]->fill_surfaces().surfaces.size() == 1);
  131. REQUIRE(object.layers()[46]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
  132. REQUIRE(object.layers()[46]->regions()[0]->fill_surfaces().surfaces[0].maxNbSolidLayersOnTop == 1);
  133. REQUIRE(get_island(object.layers()[47]->regions()[0]->fills(),0).size() == 1); //solid-bridge
  134. REQUIRE(object.layers()[47]->regions()[0]->fill_surfaces().surfaces.size() == 1);
  135. REQUIRE(object.layers()[47]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal | SurfaceType::stModBridge));
  136. REQUIRE(object.layers()[47]->regions()[0]->fill_surfaces().surfaces[0].maxNbSolidLayersOnTop > 1);
  137. REQUIRE(get_island(object.layers()[48]->regions()[0]->fills(),0).size() == 1); //solid
  138. REQUIRE(object.layers()[48]->regions()[0]->fill_surfaces().surfaces.size() == 1);
  139. REQUIRE(object.layers()[48]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal));
  140. REQUIRE(object.layers()[48]->regions()[0]->fill_surfaces().surfaces[0].maxNbSolidLayersOnTop > 1);
  141. REQUIRE(get_island(object.layers()[49]->regions()[0]->fills(),0).size() == 1); //top
  142. REQUIRE(object.layers()[49]->regions()[0]->fill_surfaces().surfaces.size() == 1);
  143. REQUIRE(object.layers()[49]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosTop));
  144. REQUIRE(object.layers()[49]->regions()[0]->fill_surfaces().surfaces[0].maxNbSolidLayersOnTop > 1);
  145. }
  146. }
  147. WHEN("dense infill to auto-not-full") {
  148. Model model{};
  149. Print print{};
  150. DynamicPrintConfig config = Slic3r::DynamicPrintConfig::full_print_config();
  151. config.set_key_value("layer_height", new ConfigOptionFloat(0.2));
  152. config.set_key_value("first_layer_height", new ConfigOptionFloatOrPercent(0.2, false));
  153. config.set_key_value("infill_dense", new ConfigOptionBool(true));
  154. config.set_key_value("infill_dense_algo", new ConfigOptionEnum<DenseInfillAlgo>(dfaAutoNotFull));
  155. config.save("C:\\Users\\Admin\\Desktop\\config_def.ini");
  156. Slic3r::Test::init_print(print, { Slic3r::Test::TestMesh::di_10mm_notch }, model, &config, false);
  157. print.process();
  158. const PrintObject& object = *(print.get_object(0));
  159. THEN("correct number of fills") {
  160. REQUIRE(object.layers().size() == 50);
  161. REQUIRE(get_island(object.layers()[20]->regions()[0]->fills(),0).size() == 1); //sparse
  162. REQUIRE(get_island(object.layers()[21]->regions()[0]->fills(),0).size() == 2); //sparse + dense
  163. REQUIRE(object.layers()[21]->regions()[0]->fill_surfaces().surfaces.size() == 2);
  164. REQUIRE(object.layers()[21]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
  165. REQUIRE(object.layers()[21]->regions()[0]->fill_surfaces().surfaces[1].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
  166. REQUIRE(std::min(object.layers()[21]->regions()[0]->fill_surfaces().surfaces[0].maxNbSolidLayersOnTop, object.layers()[21]->regions()[0]->fill_surfaces().surfaces[1].maxNbSolidLayersOnTop) == 1);
  167. Surface* srfSparse = &object.layers()[21]->regions()[0]->set_fill_surfaces().surfaces[0];
  168. Surface* srfDense = &object.layers()[21]->regions()[0]->set_fill_surfaces().surfaces[1];
  169. if (srfSparse->maxNbSolidLayersOnTop == 1) {
  170. srfSparse = srfDense;
  171. srfDense = &object.layers()[21]->regions()[0]->set_fill_surfaces().surfaces[0];
  172. }
  173. REQUIRE(unscaled(unscaled(srfSparse->area())) > unscaled(unscaled(srfDense->area())));
  174. REQUIRE(get_island(object.layers()[22]->regions()[0]->fills(),0).size() == 2); //sparse + solid-bridge
  175. REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces().surfaces.size() == 2);
  176. if (object.layers()[22]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal)) {
  177. REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces().surfaces[1].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal | SurfaceType::stModBridge));
  178. } else {
  179. REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal | SurfaceType::stModBridge));
  180. REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces().surfaces[1].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
  181. }
  182. REQUIRE(get_island(object.layers()[23]->regions()[0]->fills(),0).size() == 2); //sparse + solid
  183. REQUIRE(get_island(object.layers()[24]->regions()[0]->fills(),0).size() == 3); //sparse + solid-top + solid-top (over perimeters)
  184. REQUIRE(get_island(object.layers()[25]->regions()[0]->fills(),0).size() == 1); //sparse
  185. REQUIRE(get_island(object.layers()[45]->regions()[0]->fills(),0).size() == 1); //sparse
  186. REQUIRE(object.layers()[45]->regions()[0]->fill_surfaces().surfaces.size() == 1);
  187. REQUIRE(object.layers()[45]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
  188. REQUIRE(object.layers()[45]->regions()[0]->fill_surfaces().surfaces[0].maxNbSolidLayersOnTop > 1);
  189. REQUIRE(get_island(object.layers()[46]->regions()[0]->fills(),0).size() == 1); //dense
  190. REQUIRE(object.layers()[46]->regions()[0]->fill_surfaces().surfaces.size() == 1);
  191. REQUIRE(object.layers()[46]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
  192. REQUIRE(object.layers()[46]->regions()[0]->fill_surfaces().surfaces[0].maxNbSolidLayersOnTop > 1);
  193. REQUIRE(get_island(object.layers()[47]->regions()[0]->fills(),0).size() == 1); //solid-bridge
  194. REQUIRE(object.layers()[47]->regions()[0]->fill_surfaces().surfaces.size() == 1);
  195. REQUIRE(object.layers()[47]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal | SurfaceType::stModBridge));
  196. REQUIRE(object.layers()[47]->regions()[0]->fill_surfaces().surfaces[0].maxNbSolidLayersOnTop > 1);
  197. REQUIRE(get_island(object.layers()[48]->regions()[0]->fills(),0).size() == 1); //solid
  198. REQUIRE(object.layers()[48]->regions()[0]->fill_surfaces().surfaces.size() == 1);
  199. REQUIRE(object.layers()[48]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal));
  200. REQUIRE(object.layers()[48]->regions()[0]->fill_surfaces().surfaces[0].maxNbSolidLayersOnTop > 1);
  201. REQUIRE(get_island(object.layers()[49]->regions()[0]->fills(),0).size() == 1); //top
  202. REQUIRE(object.layers()[49]->regions()[0]->fill_surfaces().surfaces.size() == 1);
  203. REQUIRE(object.layers()[49]->regions()[0]->fill_surfaces().surfaces[0].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosTop));
  204. REQUIRE(object.layers()[49]->regions()[0]->fill_surfaces().surfaces[0].maxNbSolidLayersOnTop > 1);
  205. }
  206. }
  207. }
  208. }