FIX: can't merge paths with different attributes
jira:NONE Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I0c853de6b1938c7e2addbaab5a45b35daf5a32fa
This commit is contained in:
parent
8df9311c87
commit
43e4569f55
|
@ -66,6 +66,19 @@ void ExtrusionPath::polygons_covered_by_spacing(Polygons &out, const float scale
|
||||||
polygons_append(out, offset(this->polyline, 0.5f * float(flow.scaled_spacing()) + scaled_epsilon));
|
polygons_append(out, offset(this->polyline, 0.5f * float(flow.scaled_spacing()) + scaled_epsilon));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ExtrusionPath::can_merge(const ExtrusionPath& other)
|
||||||
|
{
|
||||||
|
return overhang_degree == other.overhang_degree &&
|
||||||
|
curve_degree==other.curve_degree &&
|
||||||
|
mm3_per_mm == other.mm3_per_mm &&
|
||||||
|
width == other.width &&
|
||||||
|
height == other.height &&
|
||||||
|
m_can_reverse == other.m_can_reverse &&
|
||||||
|
m_role == other.m_role &&
|
||||||
|
m_no_extrusion == other.m_no_extrusion &&
|
||||||
|
smooth_speed == other.smooth_speed;
|
||||||
|
}
|
||||||
|
|
||||||
void ExtrusionMultiPath::reverse()
|
void ExtrusionMultiPath::reverse()
|
||||||
{
|
{
|
||||||
for (ExtrusionPath &path : this->paths)
|
for (ExtrusionPath &path : this->paths)
|
||||||
|
|
|
@ -285,6 +285,8 @@ public:
|
||||||
void set_reverse() override { m_can_reverse = false; }
|
void set_reverse() override { m_can_reverse = false; }
|
||||||
bool can_reverse() const override { return m_can_reverse; }
|
bool can_reverse() const override { return m_can_reverse; }
|
||||||
|
|
||||||
|
bool can_merge(const ExtrusionPath& other);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void _inflate_collection(const Polylines &polylines, ExtrusionEntityCollection* collection) const;
|
void _inflate_collection(const Polylines &polylines, ExtrusionEntityCollection* collection) const;
|
||||||
bool m_can_reverse = true;
|
bool m_can_reverse = true;
|
||||||
|
|
|
@ -4677,41 +4677,37 @@ ExtrusionPaths GCode::split_and_mapping_speed(double &other_path_v, double &fina
|
||||||
ExtrusionPaths GCode::merge_same_speed_paths(const ExtrusionPaths &paths)
|
ExtrusionPaths GCode::merge_same_speed_paths(const ExtrusionPaths &paths)
|
||||||
{
|
{
|
||||||
ExtrusionPaths output_paths;
|
ExtrusionPaths output_paths;
|
||||||
|
std::optional<ExtrusionPath> merged_path;
|
||||||
|
|
||||||
size_t path_idx = 0;
|
for(size_t path_idx=0;path_idx<paths.size();++path_idx){
|
||||||
int merge_start = 0;
|
|
||||||
ExtrusionPath merge_path;
|
|
||||||
for (; path_idx < paths.size(); path_idx++) {
|
|
||||||
ExtrusionPath path = paths[path_idx];
|
ExtrusionPath path = paths[path_idx];
|
||||||
path.smooth_speed = get_path_speed(path);
|
path.smooth_speed = get_path_speed(path);
|
||||||
|
|
||||||
// 100% overhang speed will not to set smooth speed
|
if(path.role() == erOverhangPerimeter){
|
||||||
if (path.role() == erOverhangPerimeter) {
|
if(merged_path.has_value()){
|
||||||
if (!merge_path.empty()) {
|
output_paths.push_back(std::move(*merged_path));
|
||||||
output_paths.push_back(std::move(merge_path));
|
merged_path=std::nullopt;
|
||||||
merge_path.polyline.clear();
|
|
||||||
}
|
}
|
||||||
output_paths.push_back(std::move(path));
|
output_paths.emplace_back(path);
|
||||||
merge_start = path_idx + 1;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (merge_start == path_idx) {
|
if(!merged_path.has_value()){
|
||||||
merge_path = path;
|
merged_path=path;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// merge path with same speed
|
if(merged_path->can_merge(path)){
|
||||||
if (merge_path.smooth_speed == path.smooth_speed) {
|
merged_path->polyline.append(path.polyline);
|
||||||
merge_path.polyline.append(path.polyline);
|
}
|
||||||
} else {
|
else{
|
||||||
output_paths.push_back(std::move(merge_path));
|
output_paths.push_back(std::move(*merged_path));
|
||||||
merge_path = path;
|
merged_path = path;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!merge_path.empty() && merge_start < paths.size())
|
if(merged_path.has_value())
|
||||||
output_paths.push_back(std::move(merge_path));
|
output_paths.push_back(std::move(*merged_path));
|
||||||
|
|
||||||
return output_paths;
|
return output_paths;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue