test_complete_objects.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. //#define CATCH_CONFIG_DISABLE
  2. //#include <catch2/catch.hpp>
  3. #include <catch_main.hpp>
  4. #include <string>
  5. #include "test_data.hpp"
  6. #include <libslic3r/libslic3r.h>
  7. #include <libslic3r/SVG.hpp>
  8. using namespace Slic3r::Test;
  9. using namespace Slic3r;
  10. using namespace std::literals;
  11. std::unique_ptr<Print> init_print_with_dist(DynamicPrintConfig &config, float distance) {
  12. TestMesh m = TestMesh::cube_20x20x20;
  13. Model model{};
  14. std::unique_ptr<Print> print(new Print{});
  15. ModelObject* object{ model.add_object() };
  16. object->name += std::string(mesh_names.at(m)) + ".stl"s;
  17. object->add_volume(mesh(m));
  18. ModelInstance* inst1{ object->add_instance() };
  19. inst1->set_offset(Vec3d(-distance/2, 0, 0));
  20. inst1->set_rotation(Vec3d(0, 0, 0));
  21. inst1->set_scaling_factor(Vec3d(1, 1, 1));
  22. ModelInstance* inst2{ object->add_instance() };
  23. inst2->set_offset(Vec3d(distance/2, 0, 0));
  24. inst2->set_rotation(Vec3d(0, 0, 0));
  25. inst2->set_scaling_factor(Vec3d(1, 1, 1));
  26. for (auto* mo : model.objects) {
  27. print->auto_assign_extruders(mo);
  28. }
  29. if (distance <= 0) {
  30. print->apply(model, config);
  31. model.arrange_objects(&*print);// print->config().min_object_distance(&print->config(), 999999));
  32. model.center_instances_around_point(Slic3r::Vec2d(100, 100));
  33. }
  34. std::cout << "inst1 pos = " << inst1->get_offset().x() << ":" << inst1->get_offset().y() << "\n";
  35. std::cout << "inst2 pos = " << inst2->get_offset().x() << ":" << inst2->get_offset().y() << "\n";
  36. print->apply(model, config);
  37. return print;
  38. }
  39. SCENARIO("Complete objects separatly") {
  40. GIVEN("20mm cubes and extruder_clearance_radius to 10") {
  41. DynamicPrintConfig& config = Slic3r::DynamicPrintConfig::full_print_config();
  42. config.set_key_value("fill_density", new ConfigOptionPercent(0));
  43. config.set_deserialize("nozzle_diameter", "0.4");
  44. config.set_deserialize("layer_height", "0.3");
  45. config.set_deserialize("extruder_clearance_height", "50");
  46. config.set_deserialize("extruder_clearance_radius", "10");
  47. config.set_deserialize("skirts", "0");
  48. config.set_deserialize("skirt_height", "0");
  49. config.set_deserialize("brim_width", "0");
  50. std::pair<PrintBase::PrintValidationError, std::string> result;
  51. WHEN("2 mm appart") {
  52. //model.arrange_objects(print.config().min_object_distance());
  53. //model.center_instances_around_point(Slic3r::Vec2d(100, 100));
  54. THEN("no complete objects") {
  55. result = init_print_with_dist(config, 22)->validate();
  56. REQUIRE(result.second == "");
  57. }
  58. //now with complete_objects
  59. THEN("complete objects") {
  60. config.set_key_value("complete_objects", new ConfigOptionBool(true));
  61. result = init_print_with_dist(config, 22)->validate();
  62. REQUIRE(result.first == PrintBase::PrintValidationError::pveWrongPosition);
  63. }
  64. }
  65. WHEN("at the limit (~30 mm)") {
  66. config.set_key_value("complete_objects", new ConfigOptionBool(true));
  67. THEN("(too near)") {
  68. result = init_print_with_dist(config, 29.9)->validate();
  69. REQUIRE(result.first == PrintBase::PrintValidationError::pveWrongPosition);
  70. }
  71. THEN("(ok far)") {
  72. result = init_print_with_dist(config, 30.1)->validate();
  73. REQUIRE(result.second == "");
  74. REQUIRE(result.first == PrintBase::PrintValidationError::pveNone);
  75. }
  76. }
  77. WHEN("with a 10 mm brim, so the dist should be 40mm ") {
  78. config.set_key_value("complete_objects", new ConfigOptionBool(true));
  79. config.set_deserialize("brim_width", "10");
  80. THEN("(too near)") {
  81. result = init_print_with_dist(config, 39.9)->validate();
  82. REQUIRE(result.first == PrintBase::PrintValidationError::pveWrongPosition);
  83. }
  84. THEN("(ok far)") {
  85. result = init_print_with_dist(config, 40.1)->validate();
  86. REQUIRE(result.second == "");
  87. REQUIRE(result.first == PrintBase::PrintValidationError::pveNone);
  88. }
  89. }
  90. WHEN("with a 10 mm dist short skirt, so the dist should be 40mm +extrusionwidth") {
  91. config.set_key_value("complete_objects", new ConfigOptionBool(true));
  92. config.set_deserialize("skirts", "1");
  93. config.set_deserialize("skirt_height", "1");
  94. config.set_deserialize("skirt_distance", "10");
  95. config.set_deserialize("complete_objects_one_skirt", "0");
  96. THEN("(too near)") {
  97. result = init_print_with_dist(config, 40)->validate();
  98. REQUIRE(result.first == PrintBase::PrintValidationError::pveWrongPosition);
  99. }
  100. THEN("(ok far)") {
  101. result = init_print_with_dist(config, 40.8)->validate();
  102. REQUIRE(result.second == "");
  103. REQUIRE(result.first == PrintBase::PrintValidationError::pveNone);
  104. }
  105. }
  106. }
  107. }
  108. SCENARIO("Arrange is good enough") {
  109. GIVEN("20mm cubes and extruder_clearance_radius to 10") {
  110. DynamicPrintConfig& config = Slic3r::DynamicPrintConfig::full_print_config();
  111. config.set_key_value("fill_density", new ConfigOptionPercent(0));
  112. config.set_deserialize("nozzle_diameter", "0.4");
  113. config.set_deserialize("layer_height", "0.3");
  114. config.set_deserialize("extruder_clearance_height", "50");
  115. config.set_deserialize("extruder_clearance_radius", "10");
  116. config.set_deserialize("skirts", "0");
  117. config.set_deserialize("skirt_height", "0");
  118. config.set_deserialize("brim_width", "0");
  119. std::pair<PrintBase::PrintValidationError, std::string> result;
  120. WHEN("no complete objects") {
  121. result = init_print_with_dist(config,-1)->validate();
  122. REQUIRE(result.second == "");
  123. }
  124. WHEN("complete objects") {
  125. config.set_key_value("complete_objects", new ConfigOptionBool(true));
  126. result = init_print_with_dist(config, -1)->validate();
  127. REQUIRE(result.second == "");
  128. }
  129. WHEN("complete objects whith brim") {
  130. config.set_key_value("complete_objects", new ConfigOptionBool(true));
  131. config.set_deserialize("brim_width", "10");
  132. result = init_print_with_dist(config, -1)->validate();
  133. REQUIRE(result.second == "");
  134. }
  135. WHEN("complete objects whith skirt") {
  136. config.set_key_value("complete_objects", new ConfigOptionBool(true));
  137. config.set_deserialize("skirts", "1");
  138. config.set_deserialize("skirt_height", "1");
  139. config.set_deserialize("skirt_distance", "10");
  140. config.set_deserialize("complete_objects_one_skirt", "0");
  141. result = init_print_with_dist(config, -1)->validate();
  142. REQUIRE(result.second == "");
  143. }
  144. }
  145. }