mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-01 14:52:04 +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->m_label_objects.update(nullptr);
|
||||||
|
|
||||||
this->set_origin(0., 0.);
|
|
||||||
m_avoid_crossing_perimeters.use_external_mp();
|
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])));
|
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();
|
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.
|
//FIXME using the support_material_speed of the 1st object printed.
|
||||||
gcode += this->extrude_skirt(smooth_path,
|
gcode += this->extrude_skirt(smooth_path,
|
||||||
// Override of skirt extrusion parameters. extrude_skirt() will fill in the extrusion width.
|
// Override of skirt extrusion parameters. extrude_skirt() will fill in the extrusion width.
|
||||||
ExtrusionFlow{ mm3_per_mm, 0., layer_skirt_flow.height() },
|
ExtrusionFlow{ mm3_per_mm, 0., layer_skirt_flow.height() }
|
||||||
"skirt"sv, m_config.support_material_speed.value);
|
);
|
||||||
}
|
}
|
||||||
m_avoid_crossing_perimeters.use_external_mp(false);
|
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).
|
// 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->m_label_objects.update(nullptr);
|
||||||
|
|
||||||
this->set_origin(0., 0.);
|
|
||||||
m_avoid_crossing_perimeters.use_external_mp();
|
m_avoid_crossing_perimeters.use_external_mp();
|
||||||
|
|
||||||
for (const GCode::ExtrusionOrder::BrimPath &brim_path : extruder_extrusions.brim) {
|
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();
|
size_t gcode_size_old = gcode.size();
|
||||||
for (std::size_t i{0}; i < instances_to_print.size(); ++i) {
|
for (std::size_t i{0}; i < instances_to_print.size(); ++i) {
|
||||||
const InstanceToPrint &instance{instances_to_print[i]};
|
const InstanceToPrint &instance{instances_to_print[i]};
|
||||||
const std::vector<SliceExtrusions> overriden_extrusions{extruder_extrusions.overriden_extrusions[i]};
|
using GCode::ExtrusionOrder::OverridenExtrusions;
|
||||||
if (is_empty(overriden_extrusions)) {
|
const OverridenExtrusions &overriden_extrusions{extruder_extrusions.overriden_extrusions[i]};
|
||||||
|
if (is_empty(overriden_extrusions.slices_extrusions)) {
|
||||||
continue;
|
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(
|
gcode += this->extrude_slices(
|
||||||
instance, layers[instance.object_layer_to_print_id],
|
instance, layers[instance.object_layer_to_print_id],
|
||||||
overriden_extrusions
|
overriden_extrusions.slices_extrusions
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (gcode_size_old < gcode.size()) {
|
if (gcode_size_old < gcode.size()) {
|
||||||
@ -2645,7 +2644,7 @@ LayerResult GCodeGenerator::process_layer(
|
|||||||
continue;
|
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()) {
|
if (!support_extrusions.empty()) {
|
||||||
m_layer = layer_to_print.support_layer;
|
m_layer = layer_to_print.support_layer;
|
||||||
@ -2657,6 +2656,7 @@ LayerResult GCodeGenerator::process_layer(
|
|||||||
instance, layer_to_print, slices_extrusions
|
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.
|
// 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;
|
static const auto comment_perimeter = "perimeter"sv;
|
||||||
|
|
||||||
void GCodeGenerator::initialize_layer(
|
void GCodeGenerator::initialize_instance(
|
||||||
const InstanceToPrint &print_instance,
|
const InstanceToPrint &print_instance,
|
||||||
const ObjectLayerToPrint &layer_to_print
|
const ObjectLayerToPrint &layer_to_print
|
||||||
) {
|
) {
|
||||||
@ -2765,7 +2765,6 @@ std::string GCodeGenerator::extrude_slices(
|
|||||||
const std::vector<SliceExtrusions> &slices_extrusions
|
const std::vector<SliceExtrusions> &slices_extrusions
|
||||||
) {
|
) {
|
||||||
const PrintObject &print_object = print_instance.print_object;
|
const PrintObject &print_object = print_instance.print_object;
|
||||||
const Print &print = *print_object.print();
|
|
||||||
|
|
||||||
m_layer = layer_to_print.layer();
|
m_layer = layer_to_print.layer();
|
||||||
// To control print speed of the 1st object layer printed over raft interface.
|
// 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;
|
std::string gcode;
|
||||||
for (const SliceExtrusions &slice_extrusions : slices_extrusions) {
|
for (const SliceExtrusions &slice_extrusions : slices_extrusions) {
|
||||||
for (const IslandExtrusions &island_extrusions : slice_extrusions.common_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_infill_ranges(island_extrusions.infill_ranges, "infill");
|
||||||
gcode += this->extrude_perimeters(*island_extrusions.region, island_extrusions.perimeters, print_instance);
|
gcode += this->extrude_perimeters(*island_extrusions.region, island_extrusions.perimeters, print_instance);
|
||||||
} else {
|
} else {
|
||||||
@ -2938,8 +2937,7 @@ std::string GCodeGenerator::extrude_smooth_path(
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string GCodeGenerator::extrude_skirt(
|
std::string GCodeGenerator::extrude_skirt(
|
||||||
GCode::SmoothPath smooth_path, const ExtrusionFlow &extrusion_flow_override,
|
GCode::SmoothPath smooth_path, const ExtrusionFlow &extrusion_flow_override)
|
||||||
const std::string_view description, double speed)
|
|
||||||
{
|
{
|
||||||
// Extrude along the smooth path.
|
// Extrude along the smooth path.
|
||||||
std::string gcode;
|
std::string gcode;
|
||||||
@ -2949,7 +2947,7 @@ std::string GCodeGenerator::extrude_skirt(
|
|||||||
el.path_attributes.height = extrusion_flow_override.height;
|
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;
|
return gcode;
|
||||||
}
|
}
|
||||||
|
@ -284,7 +284,7 @@ private:
|
|||||||
std::string extrude_smooth_path(
|
std::string extrude_smooth_path(
|
||||||
const GCode::SmoothPath &smooth_path, const bool is_loop, const std::string_view description, const double speed
|
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(
|
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.
|
// 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
|
const std::string &commment
|
||||||
);
|
);
|
||||||
|
|
||||||
void initialize_layer(
|
void initialize_instance(
|
||||||
const InstanceToPrint &print_instance,
|
const InstanceToPrint &print_instance,
|
||||||
const ObjectLayerToPrint &layer_to_print
|
const ObjectLayerToPrint &layer_to_print
|
||||||
);
|
);
|
||||||
|
@ -50,28 +50,6 @@ std::optional<InstancePoint> get_instance_point(const std::optional<Point> &poin
|
|||||||
return std::nullopt;
|
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&)>;
|
using ExtractEntityPredicate = std::function<bool(const ExtrusionEntityCollection&, const PrintRegion&)>;
|
||||||
|
|
||||||
ExtrusionEntitiesPtr extract_infill_extrusions(
|
ExtrusionEntitiesPtr extract_infill_extrusions(
|
||||||
@ -234,6 +212,7 @@ std::vector<IslandExtrusions> extract_island_extrusions(
|
|||||||
|
|
||||||
result.push_back(IslandExtrusions{®ion});
|
result.push_back(IslandExtrusions{®ion});
|
||||||
IslandExtrusions &island_extrusions{result.back()};
|
IslandExtrusions &island_extrusions{result.back()};
|
||||||
|
island_extrusions.infill_first = print.config().infill_first;
|
||||||
|
|
||||||
if (print.config().infill_first) {
|
if (print.config().infill_first) {
|
||||||
island_extrusions.infill_ranges = extract_infill_ranges(
|
island_extrusions.infill_ranges = extract_infill_ranges(
|
||||||
@ -378,7 +357,7 @@ std::vector<SupportPath> get_support_extrusions(
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::vector<SliceExtrusions>> get_overriden_extrusions(
|
std::vector<OverridenExtrusions> get_overriden_extrusions(
|
||||||
const Print &print,
|
const Print &print,
|
||||||
const GCode::ObjectsLayerToPrint &layers,
|
const GCode::ObjectsLayerToPrint &layers,
|
||||||
const LayerTools &layer_tools,
|
const LayerTools &layer_tools,
|
||||||
@ -387,7 +366,7 @@ std::vector<std::vector<SliceExtrusions>> get_overriden_extrusions(
|
|||||||
const PathSmoothingFunction &smooth_path,
|
const PathSmoothingFunction &smooth_path,
|
||||||
std::optional<Point> &previous_position
|
std::optional<Point> &previous_position
|
||||||
) {
|
) {
|
||||||
std::vector<std::vector<SliceExtrusions>> result;
|
std::vector<OverridenExtrusions> result;
|
||||||
|
|
||||||
for (const InstanceToPrint &instance : instances_to_print) {
|
for (const InstanceToPrint &instance : instances_to_print) {
|
||||||
if (const Layer *layer = layers[instance.object_layer_to_print_id].object_layer; layer) {
|
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 PrintObject &print_object = instance.print_object;
|
||||||
const Point &offset = print_object.instances()[instance.instance_id].shift;
|
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
|
print, *layer, predicate, smooth_path, offset, extruder_id, previous_position
|
||||||
));
|
)});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
@ -433,6 +412,7 @@ std::vector<NormalExtrusions> get_normal_extrusions(
|
|||||||
const Point &offset = print_object.instances()[instance.instance_id].shift;
|
const Point &offset = print_object.instances()[instance.instance_id].shift;
|
||||||
|
|
||||||
result.emplace_back();
|
result.emplace_back();
|
||||||
|
result.back().instance_offset = offset;
|
||||||
|
|
||||||
if (layers[instance.object_layer_to_print_id].support_layer != nullptr) {
|
if (layers[instance.object_layer_to_print_id].support_layer != nullptr) {
|
||||||
result.back().support_extrusions = get_support_extrusions(
|
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) {
|
bool is_empty(const ExtruderExtrusions &extruder_extrusions) {
|
||||||
for (const std::vector<SliceExtrusions> &slices_extrusions : extruder_extrusions.overriden_extrusions) {
|
for (const OverridenExtrusions &overriden_extrusions : extruder_extrusions.overriden_extrusions) {
|
||||||
if (!is_empty(slices_extrusions)) {
|
if (!is_empty(overriden_extrusions.slices_extrusions)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -543,7 +523,6 @@ std::vector<ExtruderExtrusions> get_extrusions(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Extrude brim with the extruder of the 1st region.
|
// Extrude brim with the extruder of the 1st region.
|
||||||
using GCode::ExtrusionOrder::get_last_position;
|
|
||||||
if (get_brim) {
|
if (get_brim) {
|
||||||
for (const ExtrusionEntity *entity : print.brim().entities) {
|
for (const ExtrusionEntity *entity : print.brim().entities) {
|
||||||
const ExtrusionEntityReference entity_reference{*entity, false};
|
const ExtrusionEntityReference entity_reference{*entity, false};
|
||||||
|
@ -67,6 +67,7 @@ struct IslandExtrusions {
|
|||||||
const PrintRegion *region;
|
const PrintRegion *region;
|
||||||
std::vector<Perimeter> perimeters;
|
std::vector<Perimeter> perimeters;
|
||||||
std::vector<InfillRange> infill_ranges;
|
std::vector<InfillRange> infill_ranges;
|
||||||
|
bool infill_first{false};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SliceExtrusions {
|
struct SliceExtrusions {
|
||||||
@ -74,18 +75,21 @@ struct SliceExtrusions {
|
|||||||
std::vector<InfillRange> ironing_extrusions;
|
std::vector<InfillRange> ironing_extrusions;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct SupportPath {
|
struct SupportPath {
|
||||||
SmoothPath path;
|
SmoothPath path;
|
||||||
bool is_interface;
|
bool is_interface;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NormalExtrusions {
|
struct NormalExtrusions {
|
||||||
|
Point instance_offset;
|
||||||
std::vector<SupportPath> support_extrusions;
|
std::vector<SupportPath> support_extrusions;
|
||||||
std::vector<SliceExtrusions> slices_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 {
|
struct InstancePoint {
|
||||||
Point value;
|
Point value;
|
||||||
@ -104,7 +108,7 @@ struct ExtruderExtrusions {
|
|||||||
unsigned extruder_id;
|
unsigned extruder_id;
|
||||||
std::vector<std::pair<std::size_t, GCode::SmoothPath>> skirt;
|
std::vector<std::pair<std::size_t, GCode::SmoothPath>> skirt;
|
||||||
std::vector<BrimPath> brim;
|
std::vector<BrimPath> brim;
|
||||||
std::vector<std::vector<SliceExtrusions>> overriden_extrusions;
|
std::vector<OverridenExtrusions> overriden_extrusions;
|
||||||
std::vector<NormalExtrusions> normal_extrusions;
|
std::vector<NormalExtrusions> normal_extrusions;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -125,7 +129,6 @@ std::vector<ExtruderExtrusions> get_extrusions(
|
|||||||
bool get_brim,
|
bool get_brim,
|
||||||
std::optional<Point> previous_position
|
std::optional<Point> previous_position
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // slic3r_GCode_ExtrusionOrder_hpp_
|
#endif // slic3r_GCode_ExtrusionOrder_hpp_
|
||||||
|
Loading…
x
Reference in New Issue
Block a user