Skip to content

Commit 1a49b2b

Browse files
committed
Apply skirt height
CURA-12250
1 parent 95be5c2 commit 1a49b2b

File tree

5 files changed

+45
-18
lines changed

5 files changed

+45
-18
lines changed

include/feature_generation/SkirtBrimAppender.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class SkirtBrimAppender : public PrintOperationTransformer<PrintPlan>
3737
bool inside_polys_; //!< Whether to generate brim on the inside
3838
coord_t line_width_; //!< The skirt/brim line width
3939
coord_t skirt_brim_minimal_length_; //!< The minimal brim length
40-
int line_count_; //!< The (minimal) number of brim lines to generate
40+
size_t line_count_; //!< The (minimal) number of brim lines to generate
4141
coord_t gap_; //!< The gap between the part and the first brim/skirt line
4242
coord_t brim_inside_margin_;
4343
size_t skirt_height_;
@@ -72,9 +72,9 @@ class SkirtBrimAppender : public PrintOperationTransformer<PrintPlan>
7272
const ExtrudersSet& used_extruders,
7373
const std::vector<ConstExtruderPlanPtr> first_extruder_plans,
7474
const std::map<ExtruderNumber, Shape>& starting_outlines,
75-
std::map<ExtruderNumber, Shape>& allowed_areas_per_extruder,
75+
std::map<ExtruderNumber, Shape> allowed_areas_per_extruder,
7676
const std::map<ExtruderNumber, ExtruderConfig>& extruders_configs,
77-
PrintPlan* print_plan);
77+
const LayerPlanPtr& layer_plan);
7878

7979
static std::vector<ContinuousExtruderMoveSequencePtr> generateOffset(
8080
const ExtruderNumber extruder_nr,

include/print_operation/PrintPlan.h

+4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <list>
88
#include <vector>
99

10+
#include "LayerPlanPtr.h"
1011
#include "Preheat.h"
1112
#include "print_operation/PrintOperationSequence.h"
1213
#include "settings/Settings.h"
@@ -15,6 +16,7 @@
1516
namespace cura
1617
{
1718

19+
struct LayerIndex;
1820
class LayerPlan;
1921
class ExtruderPlan;
2022
class GCodeExporter;
@@ -87,6 +89,8 @@ class PrintPlan : public PrintOperationSequence
8789

8890
void applyProcessors(const std::vector<const PrintOperation*>& parents = {}) override;
8991

92+
LayerPlanPtr findLayerPlan(const LayerIndex &layer_nr) const;
93+
9094
/*!
9195
* Write all remaining layer plans (LayerPlan) to gcode and empty the buffer.
9296
*/

include/settings/types/LayerIndex.h

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
namespace cura
1414
{
1515

16+
// FIXME: Replace by a using (and maybe a 32-bit value is enough ???)
1617
struct LayerIndex
1718
{
1819
using value_type = int64_t;

src/feature_generation/SkirtBrimAppender.cpp

+28-15
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,17 @@ void SkirtBrimAppender::process(PrintPlan* print_plan)
5858
const std::map<ExtruderNumber, ExtruderConfig> extruders_configs = generateExtrudersConfigs(used_extruders, adhesion_type);
5959
const size_t height = calculateMaxHeight(extruders_configs, adhesion_type);
6060

61-
std::map<ExtruderNumber, Shape> starting_outlines = generateStartingOutlines(print_plan, skirt_brim_extruder_nr, height, adhesion_type, used_extruders);
62-
std::map<ExtruderNumber, Shape> allowed_areas_per_extruder = generateAllowedAreas(starting_outlines, adhesion_type, used_extruders, skirt_brim_extruder_nr, extruders_configs);
61+
const std::map<ExtruderNumber, Shape> starting_outlines = generateStartingOutlines(print_plan, skirt_brim_extruder_nr, height, adhesion_type, used_extruders);
62+
const std::map<ExtruderNumber, Shape> allowed_areas_per_extruder = generateAllowedAreas(starting_outlines, adhesion_type, used_extruders, skirt_brim_extruder_nr, extruders_configs);
6363

64-
generateSkirtBrim(adhesion_type, used_extruders, first_extruder_plans, starting_outlines, allowed_areas_per_extruder, extruders_configs, print_plan);
64+
for (LayerIndex actual_height = 0 ; actual_height < height; ++actual_height)
65+
{
66+
LayerPlanPtr layer_plan = print_plan->findLayerPlan(actual_height);
67+
if (layer_plan)
68+
{
69+
generateSkirtBrim(adhesion_type, used_extruders, first_extruder_plans, starting_outlines, allowed_areas_per_extruder, extruders_configs, layer_plan);
70+
}
71+
}
6572
}
6673

6774
std::tuple<std::vector<ConstExtruderPlanPtr>, ExtrudersSet> SkirtBrimAppender::generateUsedExtruders(const PrintPlan* print_plan)
@@ -107,11 +114,12 @@ std::map<ExtruderNumber, SkirtBrimAppender::ExtruderConfig> SkirtBrimAppender::g
107114
const Settings& settings = Application::getInstance().current_slice_->scene.getExtruder(extruder_nr).settings_;
108115

109116
const auto& location = settings.get<BrimLocation>("brim_location");
117+
// FIXME: Use initial_layer_line_width_factor only on first layer, and also handle the initial-layer speed and flow
110118
extruder_config.line_width_ = settings.get<coord_t>("skirt_brim_line_width") * settings.get<Ratio>("initial_layer_line_width_factor");
111119
extruder_config.skirt_brim_minimal_length_ = settings.get<coord_t>("skirt_brim_minimal_length");
112120
extruder_config.outside_polys_ = adhesion_type == EPlatformAdhesion::SKIRT || (location & BrimLocation::OUTSIDE);
113121
extruder_config.inside_polys_ = adhesion_type == EPlatformAdhesion::BRIM && (location & BrimLocation::INSIDE);
114-
extruder_config.line_count_ = settings.get<int>(adhesion_type == EPlatformAdhesion::BRIM ? "brim_line_count" : "skirt_line_count");
122+
extruder_config.line_count_ = settings.get<size_t>(adhesion_type == EPlatformAdhesion::BRIM ? "brim_line_count" : "skirt_line_count");
115123
extruder_config.gap_ = settings.get<coord_t>(adhesion_type == EPlatformAdhesion::BRIM ? "brim_gap" : "skirt_gap");
116124
extruder_config.brim_inside_margin_ = settings.get<coord_t>("brim_inside_margin");
117125
extruder_config.skirt_height_ = settings.get<size_t>("skirt_height");
@@ -326,9 +334,9 @@ void SkirtBrimAppender::generateSkirtBrim(
326334
const ExtrudersSet &used_extruders,
327335
const std::vector<ConstExtruderPlanPtr> first_extruder_plans,
328336
const std::map<ExtruderNumber, Shape>& starting_outlines,
329-
std::map<ExtruderNumber, Shape>& allowed_areas_per_extruder,
337+
std::map<ExtruderNumber, Shape> allowed_areas_per_extruder,
330338
const std::map<ExtruderNumber, ExtruderConfig>& extruders_configs,
331-
PrintPlan* print_plan)
339+
const LayerPlanPtr& layer_plan)
332340
{
333341
struct ExtruderOffsetData
334342
{
@@ -345,12 +353,15 @@ void SkirtBrimAppender::generateSkirtBrim(
345353
for (const ExtruderNumber extruder_nr : used_extruders)
346354
{
347355
const ExtruderConfig &extruder_config = extruders_configs.at(extruder_nr);
348-
const coord_t first_offset = extruder_config.gap_ + (extruder_config.line_width_ / 2);
349-
extruder_offset_datas.push_back(ExtruderOffsetData{
350-
.extruder_nr = extruder_nr,
351-
.next_offset = first_offset,
352-
.extrusion = std::make_shared<FeatureExtrusion>(PrintFeatureType::SkirtBrim, extruder_config.line_width_)
353-
});
356+
if (extruder_config.skirt_height_ > layer_plan->getLayerIndex())
357+
{
358+
const coord_t first_offset = extruder_config.gap_ + (extruder_config.line_width_ / 2);
359+
extruder_offset_datas.push_back(ExtruderOffsetData{
360+
.extruder_nr = extruder_nr,
361+
.next_offset = first_offset,
362+
.extrusion = std::make_shared<FeatureExtrusion>(PrintFeatureType::SkirtBrim, extruder_config.line_width_)
363+
});
364+
}
354365
}
355366

356367
// Create a cache containing the extruders processing ordering, we are going to need it extensively
@@ -388,7 +399,7 @@ void SkirtBrimAppender::generateSkirtBrim(
388399
covered_areas.at(extruder_nr),
389400
allowed_areas_per_extruder,
390401
extruders_configs,
391-
print_plan->getOperationsAs<LayerPlan>().front());
402+
layer_plan);
392403

393404
for (const ContinuousExtruderMoveSequencePtr& offset_extrusion : offset_extrusions)
394405
{
@@ -398,7 +409,9 @@ void SkirtBrimAppender::generateSkirtBrim(
398409

399410
extruder_offset_data.next_offset = extruder_config.line_width_ / 2;
400411

401-
if (offset_extrusions.empty() || (extruder_offset_data.processed_offsets >= extruder_config.line_count_ && extruder_offset_data.extruded_length >= extruder_config.skirt_brim_minimal_length_))
412+
if (offset_extrusions.empty() ||
413+
layer_plan->getLayerIndex() > 0 ||
414+
(extruder_offset_data.processed_offsets >= extruder_config.line_count_ && extruder_offset_data.extruded_length >= extruder_config.skirt_brim_minimal_length_))
402415
{
403416
extruder_offset_data.done = true;
404417
}
@@ -407,7 +420,7 @@ void SkirtBrimAppender::generateSkirtBrim(
407420
for (auto & extrusion : extruder_offset_datas)
408421
{
409422
const auto &feature = extrusion.extrusion;
410-
print_plan->getOperationsAs<LayerPlan>().front()->getOperationsAs<ExtruderPlan>().front()->appendFeatureExtrusion(feature);
423+
layer_plan->getOperationsAs<ExtruderPlan>().front()->appendFeatureExtrusion(feature);
411424
}
412425
}
413426

src/print_operation/PrintPlan.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,15 @@ void PrintPlan::applyProcessors(const std::vector<const PrintOperation*>& parent
6969
}
7070
}
7171

72+
LayerPlanPtr PrintPlan::findLayerPlan(const LayerIndex& layer_nr) const
73+
{
74+
return findOperationByType<LayerPlan>(
75+
SearchOrder::Forward,
76+
SearchDepth::DirectChildren,
77+
[&layer_nr](const LayerPlanPtr &layer_plan) { return layer_plan->getLayerIndex() == layer_nr; }
78+
);
79+
}
80+
7281
// LayerPlan* PrintPlan::processBuffer()
7382
// {
7483
// if (buffer_.empty())

0 commit comments

Comments
 (0)