Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/libslic3r/test_denserinfill.cpp')
-rw-r--r--src/test/libslic3r/test_denserinfill.cpp191
1 files changed, 182 insertions, 9 deletions
diff --git a/src/test/libslic3r/test_denserinfill.cpp b/src/test/libslic3r/test_denserinfill.cpp
index a00c2841a..8c54002c4 100644
--- a/src/test/libslic3r/test_denserinfill.cpp
+++ b/src/test/libslic3r/test_denserinfill.cpp
@@ -13,25 +13,198 @@ SCENARIO("denser infills: ")
GIVEN("center hole")
{
- WHEN("creating the medial axis"){
+ WHEN("dense infill to enlarged") {
Model model{};
Print print{};
DynamicPrintConfig *config = Slic3r::DynamicPrintConfig::new_from_defaults();
+ config->set_key_value("layer_height", new ConfigOptionFloat(0.2));
+ config->set_key_value("first_layer_height", new ConfigOptionFloatOrPercent(0.2, false));
+ config->set_key_value("infill_dense", new ConfigOptionBool(true));
+ config->set_key_value("infill_dense_algo", new ConfigOptionEnum<DenseInfillAlgo>(dfaEnlarged));
+ config->save("C:\\Users\\Admin\\Desktop\\config_def.ini");
+ std::cout << "dense infill : " << config->opt_bool("infill_dense") << "\n";
Slic3r::Test::init_print(print, { Slic3r::Test::TestMesh::di_5mm_center_notch }, model, config, false);
print.process();
PrintObject& object = *(print.objects().at(0));
- THEN("67 layers exist in the model") {
- REQUIRE(object.layers().size() == 67);
+ //for (int lidx = 0; lidx < object.layers().size(); lidx++) {
+ // std::cout << "layer " << lidx << " : \n";
+ // std::cout << " - region_count= " << object.layers()[lidx]->region_count() << "\n";
+ // for (int ridx = 0; ridx < object.layers()[lidx]->regions().size(); ridx++) {
+ // std::cout << " region " << ridx << " : \n";
+ // std::cout << " - fills= " << object.layers()[lidx]->regions()[ridx]->fills.entities.size() << "\n";
+ // std::cout << " - surfaces= " << object.layers()[lidx]->regions()[ridx]->fill_surfaces.surfaces.size() << "\n";
+ // for (int sidx = 0; sidx < object.layers()[lidx]->regions()[ridx]->fill_surfaces.surfaces.size(); sidx++) {
+ // std::cout << " - type= " << object.layers()[lidx]->regions()[ridx]->fill_surfaces.surfaces[sidx].surface_type << "\n";
+ // }
+ // }
+ //}
+ /*THEN("67 layers exist in the model") {
+ REQUIRE(object.layers().size() == 25);
}
- THEN("at layer 13 , there are 1 region") {
- REQUIRE(object.layers()[13]->region_count() == 2);
+ THEN("at layer 16 , there are 1 region") {
+ REQUIRE(object.layers()[16]->region_count() == 1);
}
- THEN("at layer 14 , there are 2 region") {
- REQUIRE(object.layers()[14]->region_count() == 2);
+ THEN("at layer 17 , there are 2 region") {
+ REQUIRE(object.layers()[17]->region_count() == 2);
}
- THEN("at layer 15 , there are 2 region") {
- REQUIRE(object.layers()[15]->region_count() == 2);
+ THEN("at layer 18 , there are 2 region") {
+ REQUIRE(object.layers()[18]->region_count() == 2);
+ }*/
+ THEN("correct number of fills") {
+ REQUIRE(object.layers()[20]->regions()[0]->fills.entities.size() == 1); //sparse
+ REQUIRE(object.layers()[21]->regions()[0]->fills.entities.size() == 2); //sparse + dense
+ REQUIRE(object.layers()[21]->regions()[0]->fill_surfaces.surfaces.size() == 2);
+ REQUIRE(object.layers()[21]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
+ REQUIRE(object.layers()[21]->regions()[0]->fill_surfaces.surfaces[1].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
+ REQUIRE(std::min(object.layers()[21]->regions()[0]->fill_surfaces.surfaces[0].maxNbSolidLayersOnTop, object.layers()[21]->regions()[0]->fill_surfaces.surfaces[1].maxNbSolidLayersOnTop) == 1);
+ Surface* srfSparse = &object.layers()[21]->regions()[0]->fill_surfaces.surfaces[0];
+ Surface* srfDense = &object.layers()[21]->regions()[0]->fill_surfaces.surfaces[1];
+ if (srfSparse->maxNbSolidLayersOnTop == 1) {
+ srfSparse = srfDense;
+ srfDense = &object.layers()[21]->regions()[0]->fill_surfaces.surfaces[0];
+ }
+ std::cout << "sparse area = " << unscaled(unscaled(srfSparse->area())) << " , dense area = " << unscaled(unscaled(srfDense->area())) << "\n";
+ REQUIRE(unscaled(unscaled(srfSparse->area())) > unscaled(unscaled(srfDense->area())));
+ REQUIRE(object.layers()[22]->regions()[0]->fills.entities.size() == 2); //sparse + solid-bridge
+ REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces.surfaces.size() == 2);
+ if (object.layers()[22]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal)) {
+ REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces.surfaces[1].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal | SurfaceType::stModBridge));
+ } else {
+ REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal | SurfaceType::stModBridge));
+ REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces.surfaces[1].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
+ }
+ REQUIRE(object.layers()[23]->regions()[0]->fills.entities.size() == 2); //sparse + solid
+ REQUIRE(object.layers()[24]->regions()[0]->fills.entities.size() == 3); //sparse + solid-top + solid-top (over perimeters)
+ REQUIRE(object.layers()[25]->regions()[0]->fills.entities.size() == 1); //sparse
+ }
+ }
+ }
+
+ GIVEN("side hole")
+ {
+ WHEN("dense infill to auto") {
+ Model model{};
+ Print print{};
+ DynamicPrintConfig *config = Slic3r::DynamicPrintConfig::new_from_defaults();
+ config->set_key_value("layer_height", new ConfigOptionFloat(0.2));
+ config->set_key_value("first_layer_height", new ConfigOptionFloatOrPercent(0.2, false));
+ config->set_key_value("infill_dense", new ConfigOptionBool(true));
+ config->set_key_value("infill_dense_algo", new ConfigOptionEnum<DenseInfillAlgo>(dfaAutomatic));
+ config->save("C:\\Users\\Admin\\Desktop\\config_def.ini");
+ std::cout << "dense infill : " << config->opt_bool("infill_dense") << "\n";
+ Slic3r::Test::init_print(print, { Slic3r::Test::TestMesh::di_10mm_notch }, model, config, false);
+ print.process();
+ PrintObject& object = *(print.objects().at(0));
+ THEN("correct number of fills") {
+ REQUIRE(object.layers().size() == 50);
+ REQUIRE(object.layers()[20]->regions()[0]->fills.entities.size() == 1); //sparse
+ REQUIRE(object.layers()[21]->regions()[0]->fills.entities.size() == 2); //sparse + dense
+ REQUIRE(object.layers()[21]->regions()[0]->fill_surfaces.surfaces.size() == 2);
+ REQUIRE(object.layers()[21]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
+ REQUIRE(object.layers()[21]->regions()[0]->fill_surfaces.surfaces[1].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
+ REQUIRE(std::min(object.layers()[21]->regions()[0]->fill_surfaces.surfaces[0].maxNbSolidLayersOnTop, object.layers()[21]->regions()[0]->fill_surfaces.surfaces[1].maxNbSolidLayersOnTop) == 1);
+ Surface* srfSparse = &object.layers()[21]->regions()[0]->fill_surfaces.surfaces[0];
+ Surface* srfDense = &object.layers()[21]->regions()[0]->fill_surfaces.surfaces[1];
+ if (srfSparse->maxNbSolidLayersOnTop == 1) {
+ srfSparse = srfDense;
+ srfDense = &object.layers()[21]->regions()[0]->fill_surfaces.surfaces[0];
+ }
+ REQUIRE(unscaled(unscaled(srfSparse->area())) > unscaled(unscaled(srfDense->area())));
+ REQUIRE(object.layers()[22]->regions()[0]->fills.entities.size() == 2); //sparse + solid-bridge
+ REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces.surfaces.size() == 2);
+ if (object.layers()[22]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal)) {
+ REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces.surfaces[1].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal | SurfaceType::stModBridge));
+ } else {
+ REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal | SurfaceType::stModBridge));
+ REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces.surfaces[1].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
+ }
+ REQUIRE(object.layers()[23]->regions()[0]->fills.entities.size() == 2); //sparse + solid
+ REQUIRE(object.layers()[24]->regions()[0]->fills.entities.size() == 3); //sparse + solid-top + solid-top (over perimeters)
+ REQUIRE(object.layers()[25]->regions()[0]->fills.entities.size() == 1); //sparse
+ REQUIRE(object.layers()[45]->regions()[0]->fills.entities.size() == 1); //sparse
+ REQUIRE(object.layers()[45]->regions()[0]->fill_surfaces.surfaces.size() == 1);
+ REQUIRE(object.layers()[45]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
+ REQUIRE(object.layers()[45]->regions()[0]->fill_surfaces.surfaces[0].maxNbSolidLayersOnTop > 1);
+ REQUIRE(object.layers()[46]->regions()[0]->fills.entities.size() == 1); //dense
+ REQUIRE(object.layers()[46]->regions()[0]->fills.entities.size() == 1);
+ REQUIRE(object.layers()[46]->regions()[0]->fill_surfaces.surfaces.size() == 1);
+ REQUIRE(object.layers()[46]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
+ REQUIRE(object.layers()[46]->regions()[0]->fill_surfaces.surfaces[0].maxNbSolidLayersOnTop == 1);
+ REQUIRE(object.layers()[47]->regions()[0]->fills.entities.size() == 1); //solid-bridge
+ REQUIRE(object.layers()[47]->regions()[0]->fill_surfaces.surfaces.size() == 1);
+ REQUIRE(object.layers()[47]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal | SurfaceType::stModBridge));
+ REQUIRE(object.layers()[47]->regions()[0]->fill_surfaces.surfaces[0].maxNbSolidLayersOnTop > 1);
+ REQUIRE(object.layers()[48]->regions()[0]->fills.entities.size() == 1); //solid
+ REQUIRE(object.layers()[48]->regions()[0]->fill_surfaces.surfaces.size() == 1);
+ REQUIRE(object.layers()[48]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal));
+ REQUIRE(object.layers()[48]->regions()[0]->fill_surfaces.surfaces[0].maxNbSolidLayersOnTop > 1);
+ REQUIRE(object.layers()[49]->regions()[0]->fills.entities.size() == 1); //top
+ REQUIRE(object.layers()[49]->regions()[0]->fill_surfaces.surfaces.size() == 1);
+ REQUIRE(object.layers()[49]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosTop));
+ REQUIRE(object.layers()[49]->regions()[0]->fill_surfaces.surfaces[0].maxNbSolidLayersOnTop > 1);
+ }
+ }
+
+ WHEN("dense infill to auto-not-full") {
+ Model model{};
+ Print print{};
+ DynamicPrintConfig *config = Slic3r::DynamicPrintConfig::new_from_defaults();
+ config->set_key_value("layer_height", new ConfigOptionFloat(0.2));
+ config->set_key_value("first_layer_height", new ConfigOptionFloatOrPercent(0.2, false));
+ config->set_key_value("infill_dense", new ConfigOptionBool(true));
+ config->set_key_value("infill_dense_algo", new ConfigOptionEnum<DenseInfillAlgo>(dfaAutoNotFull));
+ config->save("C:\\Users\\Admin\\Desktop\\config_def.ini");
+ std::cout << "dense infill : " << config->opt_bool("infill_dense") << "\n";
+ Slic3r::Test::init_print(print, { Slic3r::Test::TestMesh::di_10mm_notch }, model, config, false);
+ print.process();
+ PrintObject& object = *(print.objects().at(0));
+ THEN("correct number of fills") {
+ REQUIRE(object.layers().size() == 50);
+ REQUIRE(object.layers()[20]->regions()[0]->fills.entities.size() == 1); //sparse
+ REQUIRE(object.layers()[21]->regions()[0]->fills.entities.size() == 2); //sparse + dense
+ REQUIRE(object.layers()[21]->regions()[0]->fill_surfaces.surfaces.size() == 2);
+ REQUIRE(object.layers()[21]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
+ REQUIRE(object.layers()[21]->regions()[0]->fill_surfaces.surfaces[1].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
+ REQUIRE(std::min(object.layers()[21]->regions()[0]->fill_surfaces.surfaces[0].maxNbSolidLayersOnTop, object.layers()[21]->regions()[0]->fill_surfaces.surfaces[1].maxNbSolidLayersOnTop) == 1);
+ Surface* srfSparse = &object.layers()[21]->regions()[0]->fill_surfaces.surfaces[0];
+ Surface* srfDense = &object.layers()[21]->regions()[0]->fill_surfaces.surfaces[1];
+ if (srfSparse->maxNbSolidLayersOnTop == 1) {
+ srfSparse = srfDense;
+ srfDense = &object.layers()[21]->regions()[0]->fill_surfaces.surfaces[0];
+ }
+ REQUIRE(unscaled(unscaled(srfSparse->area())) > unscaled(unscaled(srfDense->area())));
+ REQUIRE(object.layers()[22]->regions()[0]->fills.entities.size() == 2); //sparse + solid-bridge
+ REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces.surfaces.size() == 2);
+ if (object.layers()[22]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal)) {
+ REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces.surfaces[1].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal | SurfaceType::stModBridge));
+ } else {
+ REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal | SurfaceType::stModBridge));
+ REQUIRE(object.layers()[22]->regions()[0]->fill_surfaces.surfaces[1].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
+ }
+ REQUIRE(object.layers()[23]->regions()[0]->fills.entities.size() == 2); //sparse + solid
+ REQUIRE(object.layers()[24]->regions()[0]->fills.entities.size() == 3); //sparse + solid-top + solid-top (over perimeters)
+ REQUIRE(object.layers()[25]->regions()[0]->fills.entities.size() == 1); //sparse
+ REQUIRE(object.layers()[45]->regions()[0]->fills.entities.size() == 1); //sparse
+ REQUIRE(object.layers()[45]->regions()[0]->fill_surfaces.surfaces.size() == 1);
+ REQUIRE(object.layers()[45]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
+ REQUIRE(object.layers()[45]->regions()[0]->fill_surfaces.surfaces[0].maxNbSolidLayersOnTop > 1);
+ REQUIRE(object.layers()[46]->regions()[0]->fills.entities.size() == 1); //dense
+ REQUIRE(object.layers()[46]->regions()[0]->fill_surfaces.surfaces.size() == 1);
+ REQUIRE(object.layers()[46]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSparse | SurfaceType::stPosInternal));
+ REQUIRE(object.layers()[46]->regions()[0]->fill_surfaces.surfaces[0].maxNbSolidLayersOnTop > 1);
+ REQUIRE(object.layers()[47]->regions()[0]->fills.entities.size() == 1); //solid-bridge
+ REQUIRE(object.layers()[47]->regions()[0]->fill_surfaces.surfaces.size() == 1);
+ REQUIRE(object.layers()[47]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal | SurfaceType::stModBridge));
+ REQUIRE(object.layers()[47]->regions()[0]->fill_surfaces.surfaces[0].maxNbSolidLayersOnTop > 1);
+ REQUIRE(object.layers()[48]->regions()[0]->fills.entities.size() == 1); //solid
+ REQUIRE(object.layers()[48]->regions()[0]->fill_surfaces.surfaces.size() == 1);
+ REQUIRE(object.layers()[48]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosInternal));
+ REQUIRE(object.layers()[48]->regions()[0]->fill_surfaces.surfaces[0].maxNbSolidLayersOnTop > 1);
+ REQUIRE(object.layers()[49]->regions()[0]->fills.entities.size() == 1); //top
+ REQUIRE(object.layers()[49]->regions()[0]->fill_surfaces.surfaces.size() == 1);
+ REQUIRE(object.layers()[49]->regions()[0]->fill_surfaces.surfaces[0].surface_type == (SurfaceType::stDensSolid | SurfaceType::stPosTop));
+ REQUIRE(object.layers()[49]->regions()[0]->fill_surfaces.surfaces[0].maxNbSolidLayersOnTop > 1);
}
}
}