mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-07-30 18:01:59 +08:00
Add offset to extrusions an make sure to reset origin
This commit is contained in:
parent
dca7318896
commit
131f05c3c4
@ -2576,7 +2576,6 @@ LayerResult GCodeGenerator::process_layer(
|
||||
}
|
||||
this->m_label_objects.update(nullptr);
|
||||
|
||||
this->set_origin(0., 0.);
|
||||
m_avoid_crossing_perimeters.use_external_mp();
|
||||
Flow layer_skirt_flow = print.skirt_flow().with_height(float(m_skirt_done.back() - (m_skirt_done.size() == 1 ? 0. : m_skirt_done[m_skirt_done.size() - 2])));
|
||||
double mm3_per_mm = layer_skirt_flow.mm3_per_mm();
|
||||
@ -2585,8 +2584,8 @@ LayerResult GCodeGenerator::process_layer(
|
||||
//FIXME using the support_material_speed of the 1st object printed.
|
||||
gcode += this->extrude_skirt(smooth_path,
|
||||
// Override of skirt extrusion parameters. extrude_skirt() will fill in the extrusion width.
|
||||
ExtrusionFlow{ mm3_per_mm, 0., layer_skirt_flow.height() },
|
||||
"skirt"sv, m_config.support_material_speed.value);
|
||||
ExtrusionFlow{ mm3_per_mm, 0., layer_skirt_flow.height() }
|
||||
);
|
||||
}
|
||||
m_avoid_crossing_perimeters.use_external_mp(false);
|
||||
// Allow a straight travel move to the first object point if this is the first layer (but don't in next layers).
|
||||
@ -2601,7 +2600,6 @@ LayerResult GCodeGenerator::process_layer(
|
||||
}
|
||||
this->m_label_objects.update(nullptr);
|
||||
|
||||
this->set_origin(0., 0.);
|
||||
m_avoid_crossing_perimeters.use_external_mp();
|
||||
|
||||
for (const GCode::ExtrusionOrder::BrimPath &brim_path : extruder_extrusions.brim) {
|
||||
@ -2618,14 +2616,15 @@ LayerResult GCodeGenerator::process_layer(
|
||||
size_t gcode_size_old = gcode.size();
|
||||
for (std::size_t i{0}; i < instances_to_print.size(); ++i) {
|
||||
const InstanceToPrint &instance{instances_to_print[i]};
|
||||
const std::vector<SliceExtrusions> overriden_extrusions{extruder_extrusions.overriden_extrusions[i]};
|
||||
if (is_empty(overriden_extrusions)) {
|
||||
using GCode::ExtrusionOrder::OverridenExtrusions;
|
||||
const OverridenExtrusions &overriden_extrusions{extruder_extrusions.overriden_extrusions[i]};
|
||||
if (is_empty(overriden_extrusions.slices_extrusions)) {
|
||||
continue;
|
||||
}
|
||||
this->initialize_layer(instance, layers[instance.object_layer_to_print_id]);
|
||||
this->initialize_instance(instance, layers[instance.object_layer_to_print_id]);
|
||||
gcode += this->extrude_slices(
|
||||
instance, layers[instance.object_layer_to_print_id],
|
||||
overriden_extrusions
|
||||
overriden_extrusions.slices_extrusions
|
||||
);
|
||||
}
|
||||
if (gcode_size_old < gcode.size()) {
|
||||
@ -2645,7 +2644,7 @@ LayerResult GCodeGenerator::process_layer(
|
||||
continue;
|
||||
}
|
||||
|
||||
this->initialize_layer(instance, layers[instance.object_layer_to_print_id]);
|
||||
this->initialize_instance(instance, layers[instance.object_layer_to_print_id]);
|
||||
|
||||
if (!support_extrusions.empty()) {
|
||||
m_layer = layer_to_print.support_layer;
|
||||
@ -2657,6 +2656,7 @@ LayerResult GCodeGenerator::process_layer(
|
||||
instance, layer_to_print, slices_extrusions
|
||||
);
|
||||
}
|
||||
this->set_origin(0.0, 0.0);
|
||||
}
|
||||
|
||||
// During layer change the starting position of next layer is now known.
|
||||
@ -2737,7 +2737,7 @@ LayerResult GCodeGenerator::process_layer(
|
||||
|
||||
static const auto comment_perimeter = "perimeter"sv;
|
||||
|
||||
void GCodeGenerator::initialize_layer(
|
||||
void GCodeGenerator::initialize_instance(
|
||||
const InstanceToPrint &print_instance,
|
||||
const ObjectLayerToPrint &layer_to_print
|
||||
) {
|
||||
@ -2765,7 +2765,6 @@ std::string GCodeGenerator::extrude_slices(
|
||||
const std::vector<SliceExtrusions> &slices_extrusions
|
||||
) {
|
||||
const PrintObject &print_object = print_instance.print_object;
|
||||
const Print &print = *print_object.print();
|
||||
|
||||
m_layer = layer_to_print.layer();
|
||||
// To control print speed of the 1st object layer printed over raft interface.
|
||||
@ -2775,7 +2774,7 @@ std::string GCodeGenerator::extrude_slices(
|
||||
std::string gcode;
|
||||
for (const SliceExtrusions &slice_extrusions : slices_extrusions) {
|
||||
for (const IslandExtrusions &island_extrusions : slice_extrusions.common_extrusions) {
|
||||
if (print.config().infill_first) {
|
||||
if (island_extrusions.infill_first) {
|
||||
gcode += this->extrude_infill_ranges(island_extrusions.infill_ranges, "infill");
|
||||
gcode += this->extrude_perimeters(*island_extrusions.region, island_extrusions.perimeters, print_instance);
|
||||
} else {
|
||||
@ -2938,8 +2937,7 @@ std::string GCodeGenerator::extrude_smooth_path(
|
||||
}
|
||||
|
||||
std::string GCodeGenerator::extrude_skirt(
|
||||
GCode::SmoothPath smooth_path, const ExtrusionFlow &extrusion_flow_override,
|
||||
const std::string_view description, double speed)
|
||||
GCode::SmoothPath smooth_path, const ExtrusionFlow &extrusion_flow_override)
|
||||
{
|
||||
// Extrude along the smooth path.
|
||||
std::string gcode;
|
||||
@ -2949,7 +2947,7 @@ std::string GCodeGenerator::extrude_skirt(
|
||||
el.path_attributes.height = extrusion_flow_override.height;
|
||||
}
|
||||
|
||||
gcode += this->extrude_smooth_path(smooth_path, true, description, m_config.support_material_speed.value);
|
||||
gcode += this->extrude_smooth_path(smooth_path, true, "skirt"sv, m_config.support_material_speed.value);
|
||||
|
||||
return gcode;
|
||||
}
|
||||
|
@ -284,7 +284,7 @@ private:
|
||||
std::string extrude_smooth_path(
|
||||
const GCode::SmoothPath &smooth_path, const bool is_loop, const std::string_view description, const double speed
|
||||
);
|
||||
std::string extrude_skirt(GCode::SmoothPath smooth_path, const ExtrusionFlow &extrusion_flow_override, const std::string_view description, double speed);
|
||||
std::string extrude_skirt(GCode::SmoothPath smooth_path, const ExtrusionFlow &extrusion_flow_override);
|
||||
|
||||
std::vector<InstanceToPrint> sort_print_object_instances(
|
||||
// Object and Support layers for the current print_z, collected for a single object, or for possibly multiple objects with multiple instances.
|
||||
@ -305,7 +305,7 @@ private:
|
||||
const std::string &commment
|
||||
);
|
||||
|
||||
void initialize_layer(
|
||||
void initialize_instance(
|
||||
const InstanceToPrint &print_instance,
|
||||
const ObjectLayerToPrint &layer_to_print
|
||||
);
|
||||
|
@ -50,28 +50,6 @@ std::optional<InstancePoint> get_instance_point(const std::optional<Point> &poin
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
std::optional<Point> get_last_position(const ExtrusionEntityReferences &extrusions, const Point &offset) {
|
||||
if (!extrusions.empty()) {
|
||||
const ExtrusionEntityReference &last_extrusion{extrusions.back()};
|
||||
auto last_loop{dynamic_cast<const ExtrusionLoop *>(&last_extrusion.extrusion_entity())};
|
||||
if (last_loop != nullptr) {
|
||||
return get_gcode_point(InstancePoint{last_loop->seam}, offset);
|
||||
}
|
||||
const InstancePoint last_point{
|
||||
last_extrusion.flipped() ? last_extrusion.extrusion_entity().first_point() :
|
||||
last_extrusion.extrusion_entity().last_point()};
|
||||
return get_gcode_point(last_point, offset);
|
||||
}
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
std::optional<Point> get_last_position(const ExtrusionEntitiesPtr &extrusions, const Point &offset){
|
||||
if (!extrusions.empty()) {
|
||||
return get_last_position({{*extrusions.back(), false}}, offset);
|
||||
}
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
using ExtractEntityPredicate = std::function<bool(const ExtrusionEntityCollection&, const PrintRegion&)>;
|
||||
|
||||
ExtrusionEntitiesPtr extract_infill_extrusions(
|
||||
@ -234,6 +212,7 @@ std::vector<IslandExtrusions> extract_island_extrusions(
|
||||
|
||||
result.push_back(IslandExtrusions{®ion});
|
||||
IslandExtrusions &island_extrusions{result.back()};
|
||||
island_extrusions.infill_first = print.config().infill_first;
|
||||
|
||||
if (print.config().infill_first) {
|
||||
island_extrusions.infill_ranges = extract_infill_ranges(
|
||||
@ -378,7 +357,7 @@ std::vector<SupportPath> get_support_extrusions(
|
||||
return {};
|
||||
}
|
||||
|
||||
std::vector<std::vector<SliceExtrusions>> get_overriden_extrusions(
|
||||
std::vector<OverridenExtrusions> get_overriden_extrusions(
|
||||
const Print &print,
|
||||
const GCode::ObjectsLayerToPrint &layers,
|
||||
const LayerTools &layer_tools,
|
||||
@ -387,7 +366,7 @@ std::vector<std::vector<SliceExtrusions>> get_overriden_extrusions(
|
||||
const PathSmoothingFunction &smooth_path,
|
||||
std::optional<Point> &previous_position
|
||||
) {
|
||||
std::vector<std::vector<SliceExtrusions>> result;
|
||||
std::vector<OverridenExtrusions> result;
|
||||
|
||||
for (const InstanceToPrint &instance : instances_to_print) {
|
||||
if (const Layer *layer = layers[instance.object_layer_to_print_id].object_layer; layer) {
|
||||
@ -408,9 +387,9 @@ std::vector<std::vector<SliceExtrusions>> get_overriden_extrusions(
|
||||
const PrintObject &print_object = instance.print_object;
|
||||
const Point &offset = print_object.instances()[instance.instance_id].shift;
|
||||
|
||||
result.emplace_back(get_slices_extrusions(
|
||||
result.push_back({offset, get_slices_extrusions(
|
||||
print, *layer, predicate, smooth_path, offset, extruder_id, previous_position
|
||||
));
|
||||
)});
|
||||
}
|
||||
}
|
||||
return result;
|
||||
@ -433,6 +412,7 @@ std::vector<NormalExtrusions> get_normal_extrusions(
|
||||
const Point &offset = print_object.instances()[instance.instance_id].shift;
|
||||
|
||||
result.emplace_back();
|
||||
result.back().instance_offset = offset;
|
||||
|
||||
if (layers[instance.object_layer_to_print_id].support_layer != nullptr) {
|
||||
result.back().support_extrusions = get_support_extrusions(
|
||||
@ -486,8 +466,8 @@ bool is_empty(const std::vector<SliceExtrusions> &extrusions) {
|
||||
}
|
||||
|
||||
bool is_empty(const ExtruderExtrusions &extruder_extrusions) {
|
||||
for (const std::vector<SliceExtrusions> &slices_extrusions : extruder_extrusions.overriden_extrusions) {
|
||||
if (!is_empty(slices_extrusions)) {
|
||||
for (const OverridenExtrusions &overriden_extrusions : extruder_extrusions.overriden_extrusions) {
|
||||
if (!is_empty(overriden_extrusions.slices_extrusions)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -543,7 +523,6 @@ std::vector<ExtruderExtrusions> get_extrusions(
|
||||
}
|
||||
|
||||
// Extrude brim with the extruder of the 1st region.
|
||||
using GCode::ExtrusionOrder::get_last_position;
|
||||
if (get_brim) {
|
||||
for (const ExtrusionEntity *entity : print.brim().entities) {
|
||||
const ExtrusionEntityReference entity_reference{*entity, false};
|
||||
|
@ -67,6 +67,7 @@ struct IslandExtrusions {
|
||||
const PrintRegion *region;
|
||||
std::vector<Perimeter> perimeters;
|
||||
std::vector<InfillRange> infill_ranges;
|
||||
bool infill_first{false};
|
||||
};
|
||||
|
||||
struct SliceExtrusions {
|
||||
@ -74,18 +75,21 @@ struct SliceExtrusions {
|
||||
std::vector<InfillRange> ironing_extrusions;
|
||||
};
|
||||
|
||||
|
||||
struct SupportPath {
|
||||
SmoothPath path;
|
||||
bool is_interface;
|
||||
};
|
||||
|
||||
struct NormalExtrusions {
|
||||
Point instance_offset;
|
||||
std::vector<SupportPath> support_extrusions;
|
||||
std::vector<SliceExtrusions> slices_extrusions;
|
||||
};
|
||||
|
||||
std::optional<Point> get_last_position(const ExtrusionEntitiesPtr &extrusions, const Point &offset);
|
||||
struct OverridenExtrusions {
|
||||
Point instance_offset;
|
||||
std::vector<SliceExtrusions> slices_extrusions;
|
||||
};
|
||||
|
||||
struct InstancePoint {
|
||||
Point value;
|
||||
@ -104,7 +108,7 @@ struct ExtruderExtrusions {
|
||||
unsigned extruder_id;
|
||||
std::vector<std::pair<std::size_t, GCode::SmoothPath>> skirt;
|
||||
std::vector<BrimPath> brim;
|
||||
std::vector<std::vector<SliceExtrusions>> overriden_extrusions;
|
||||
std::vector<OverridenExtrusions> overriden_extrusions;
|
||||
std::vector<NormalExtrusions> normal_extrusions;
|
||||
};
|
||||
|
||||
@ -125,7 +129,6 @@ std::vector<ExtruderExtrusions> get_extrusions(
|
||||
bool get_brim,
|
||||
std::optional<Point> previous_position
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
#endif // slic3r_GCode_ExtrusionOrder_hpp_
|
||||
|
Loading…
x
Reference in New Issue
Block a user