ENH: Change the collision calculation
of the wipe tower's outer wall to use the actual outer wall path. jira: none Change-Id: Ib45ecbc328c88c1abe6d9e8567f715331a3ddd37
This commit is contained in:
parent
edb9583f76
commit
0a20f1fe6d
|
@ -227,7 +227,8 @@ ConflictResultOpt ConflictChecker::find_inter_of_lines_in_diff_objs(PrintObjectP
|
||||||
LinesBucketQueue conflictQueue;
|
LinesBucketQueue conflictQueue;
|
||||||
|
|
||||||
if (wtdptr.has_value()) { // wipe tower at 0 by default
|
if (wtdptr.has_value()) { // wipe tower at 0 by default
|
||||||
auto wtpaths = wtdptr.value()->getFakeExtrusionPathsFromWipeTower();
|
//auto wtpaths = wtdptr.value()->getFakeExtrusionPathsFromWipeTower();
|
||||||
|
auto wtpaths = wtdptr.value()->getTrueExtrusionPathsFromWipeTower();
|
||||||
ExtrusionLayers wtels;
|
ExtrusionLayers wtels;
|
||||||
wtels.type = ExtrusionLayersType::WIPE_TOWER;
|
wtels.type = ExtrusionLayersType::WIPE_TOWER;
|
||||||
for (int i = 0; i < wtpaths.size(); ++i) { // assume that wipe tower always has same height
|
for (int i = 0; i < wtpaths.size(); ++i) { // assume that wipe tower always has same height
|
||||||
|
|
|
@ -2966,26 +2966,17 @@ WipeTower::ToolChangeResult WipeTower::finish_layer_new(bool extrude_perimeter,
|
||||||
// for skirt calculation and pass it to GLCanvas for precise preview box
|
// for skirt calculation and pass it to GLCanvas for precise preview box
|
||||||
m_wipe_tower_brim_width_real = loops_num * spacing + spacing / 2.f;
|
m_wipe_tower_brim_width_real = loops_num * spacing + spacing / 2.f;
|
||||||
//m_wipe_tower_brim_width_real = wt_box.ld.x() - box.ld.x() + spacing / 2.f;
|
//m_wipe_tower_brim_width_real = wt_box.ld.x() - box.ld.x() + spacing / 2.f;
|
||||||
|
|
||||||
// set wipe_tower_bbx
|
|
||||||
auto real_polygon = outer_wall;
|
|
||||||
real_polygon = offset(real_polygon, scaled(spacing/2.f)).front();
|
|
||||||
auto real_box = get_extents(real_polygon);
|
|
||||||
m_wipe_tower_bbx = BoundingBoxf(unscale(real_box.min), unscale(real_box.max));
|
|
||||||
}
|
}
|
||||||
//wt_box = box;
|
//wt_box = box;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
if (first_layer) {
|
|
||||||
auto real_polygon = outer_wall;
|
|
||||||
real_polygon = offset(real_polygon, scaled(spacing / 2.f)).front();
|
|
||||||
auto real_box = get_extents(real_polygon);
|
|
||||||
m_wipe_tower_bbx = BoundingBoxf(unscale(real_box.min), unscale(real_box.max));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (extrude_perimeter || loops_num > 0)
|
if (extrude_perimeter || loops_num > 0) {
|
||||||
writer.add_wipe_path(outer_wall, m_filpar[m_current_tool].wipe_dist);
|
writer.add_wipe_path(outer_wall, m_filpar[m_current_tool].wipe_dist);
|
||||||
|
if (!extrude_perimeter)
|
||||||
|
m_outer_wall.back() = to_polyline(outer_wall);
|
||||||
|
else
|
||||||
|
m_outer_wall.push_back(to_polyline(outer_wall));
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
// Now prepare future wipe. box contains rectangle that was extruded last (ccw).
|
// Now prepare future wipe. box contains rectangle that was extruded last (ccw).
|
||||||
Vec2f target = (writer.pos() == wt_box.ld ? wt_box.rd : (writer.pos() == wt_box.rd ? wt_box.ru : (writer.pos() == wt_box.ru ? wt_box.lu : wt_box.ld)));
|
Vec2f target = (writer.pos() == wt_box.ld ? wt_box.rd : (writer.pos() == wt_box.rd ? wt_box.ru : (writer.pos() == wt_box.ru ? wt_box.lu : wt_box.ld)));
|
||||||
|
@ -3637,7 +3628,7 @@ void WipeTower::generate_new(std::vector<std::vector<WipeTower::ToolChangeResult
|
||||||
int wall_filament = get_wall_filament_for_all_layer();
|
int wall_filament = get_wall_filament_for_all_layer();
|
||||||
|
|
||||||
std::vector<WipeTower::ToolChangeResult> layer_result;
|
std::vector<WipeTower::ToolChangeResult> layer_result;
|
||||||
|
m_outer_wall.reserve(m_plan.size());
|
||||||
int index = 0;
|
int index = 0;
|
||||||
for (auto layer : m_plan) {
|
for (auto layer : m_plan) {
|
||||||
reset_block_status();
|
reset_block_status();
|
||||||
|
@ -3797,6 +3788,7 @@ void WipeTower::generate_new(std::vector<std::vector<WipeTower::ToolChangeResult
|
||||||
}
|
}
|
||||||
result.emplace_back(std::move(layer_result));
|
result.emplace_back(std::move(layer_result));
|
||||||
}
|
}
|
||||||
|
assert(m_outer_wall.size() == m_plan.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3946,13 +3938,13 @@ WipeTower::ToolChangeResult WipeTower::only_generate_out_wall(bool is_new_mode)
|
||||||
//else
|
//else
|
||||||
// writer.rectangle(wt_box, feedrate);
|
// writer.rectangle(wt_box, feedrate);
|
||||||
outer_wall = generate_support_wall_new(writer, wt_box, feedrate, first_layer, m_use_rib_wall, true, m_use_gap_wall);
|
outer_wall = generate_support_wall_new(writer, wt_box, feedrate, first_layer, m_use_rib_wall, true, m_use_gap_wall);
|
||||||
|
m_outer_wall.push_back( to_polyline(outer_wall));
|
||||||
// Now prepare future wipe. box contains rectangle that was extruded last (ccw).
|
// Now prepare future wipe. box contains rectangle that was extruded last (ccw).
|
||||||
|
|
||||||
// Vec2f target = (writer.pos() == wt_box.ld ? wt_box.rd : (writer.pos() == wt_box.rd ? wt_box.ru : (writer.pos() == wt_box.ru ? wt_box.lu : wt_box.ld)));
|
// Vec2f target = (writer.pos() == wt_box.ld ? wt_box.rd : (writer.pos() == wt_box.rd ? wt_box.ru : (writer.pos() == wt_box.ru ? wt_box.lu : wt_box.ld)));
|
||||||
//writer.add_wipe_point(writer.pos()).add_wipe_point(target);
|
//writer.add_wipe_point(writer.pos()).add_wipe_point(target);
|
||||||
|
|
||||||
writer.add_wipe_path(outer_wall, m_filpar[m_current_tool].wipe_dist);
|
writer.add_wipe_path(outer_wall, m_filpar[m_current_tool].wipe_dist);
|
||||||
|
|
||||||
writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Wipe_Tower_End) + "\n");
|
writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Wipe_Tower_End) + "\n");
|
||||||
|
|
||||||
// Ask our writer about how much material was consumed.
|
// Ask our writer about how much material was consumed.
|
||||||
|
|
|
@ -186,7 +186,19 @@ public:
|
||||||
Polygon generate_rib_polygon(const box_coordinates &wt_box);
|
Polygon generate_rib_polygon(const box_coordinates &wt_box);
|
||||||
float get_depth() const { return m_wipe_tower_depth; }
|
float get_depth() const { return m_wipe_tower_depth; }
|
||||||
float get_brim_width() const { return m_wipe_tower_brim_width_real; }
|
float get_brim_width() const { return m_wipe_tower_brim_width_real; }
|
||||||
BoundingBoxf get_bbx() const { return m_wipe_tower_bbx; }
|
BoundingBoxf get_bbx() const {
|
||||||
|
BoundingBox box = get_extents(m_outer_wall.front());
|
||||||
|
BoundingBoxf res = BoundingBoxf(unscale(box.min), unscale(box.max));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
Polylines get_outer_wall() const {
|
||||||
|
Polylines res = m_outer_wall;
|
||||||
|
Point trans = scaled(m_rib_offset);
|
||||||
|
for (auto &polyline : res)
|
||||||
|
for (auto &p : polyline.points)
|
||||||
|
p += trans;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
float get_height() const { return m_wipe_tower_height; }
|
float get_height() const { return m_wipe_tower_height; }
|
||||||
float get_layer_height() const { return m_layer_height; }
|
float get_layer_height() const { return m_layer_height; }
|
||||||
|
|
||||||
|
@ -454,8 +466,8 @@ private:
|
||||||
bool m_left_to_right = true;
|
bool m_left_to_right = true;
|
||||||
float m_extra_spacing = 1.f;
|
float m_extra_spacing = 1.f;
|
||||||
float m_tpu_fixed_spacing = 2;
|
float m_tpu_fixed_spacing = 2;
|
||||||
BoundingBoxf m_wipe_tower_bbx;
|
|
||||||
std::vector<Vec2f> m_wall_skip_points;
|
std::vector<Vec2f> m_wall_skip_points;
|
||||||
|
std::vector<Polyline> m_outer_wall;
|
||||||
bool is_first_layer() const { return size_t(m_layer_info - m_plan.begin()) == m_first_layer_idx; }
|
bool is_first_layer() const { return size_t(m_layer_info - m_plan.begin()) == m_first_layer_idx; }
|
||||||
|
|
||||||
// Calculates length of extrusion line to extrude given volume
|
// Calculates length of extrusion line to extrude given volume
|
||||||
|
|
|
@ -2027,7 +2027,6 @@ void Print::process(std::unordered_map<std::string, long long>* slice_time, bool
|
||||||
std::optional<const FakeWipeTower *> wipe_tower_opt = {};
|
std::optional<const FakeWipeTower *> wipe_tower_opt = {};
|
||||||
if (this->has_wipe_tower()) {
|
if (this->has_wipe_tower()) {
|
||||||
m_fake_wipe_tower.set_pos({m_config.wipe_tower_x.get_at(m_plate_index), m_config.wipe_tower_y.get_at(m_plate_index)});
|
m_fake_wipe_tower.set_pos({m_config.wipe_tower_x.get_at(m_plate_index), m_config.wipe_tower_y.get_at(m_plate_index)});
|
||||||
m_fake_wipe_tower.set_bbx();
|
|
||||||
wipe_tower_opt = std::make_optional<const FakeWipeTower *>(&m_fake_wipe_tower);
|
wipe_tower_opt = std::make_optional<const FakeWipeTower *>(&m_fake_wipe_tower);
|
||||||
}
|
}
|
||||||
auto conflictRes = ConflictChecker::find_inter_of_lines_in_diff_objs(m_objects, wipe_tower_opt);
|
auto conflictRes = ConflictChecker::find_inter_of_lines_in_diff_objs(m_objects, wipe_tower_opt);
|
||||||
|
@ -2751,7 +2750,7 @@ void Print::_make_wipe_tower()
|
||||||
const Vec3d origin = this->get_plate_origin();
|
const Vec3d origin = this->get_plate_origin();
|
||||||
m_fake_wipe_tower.set_fake_extrusion_data(wipe_tower.position(), wipe_tower.width(), wipe_tower.get_height(), wipe_tower.get_layer_height(), m_wipe_tower_data.depth,
|
m_fake_wipe_tower.set_fake_extrusion_data(wipe_tower.position(), wipe_tower.width(), wipe_tower.get_height(), wipe_tower.get_layer_height(), m_wipe_tower_data.depth,
|
||||||
m_wipe_tower_data.brim_width, {scale_(origin.x()), scale_(origin.y())});
|
m_wipe_tower_data.brim_width, {scale_(origin.x()), scale_(origin.y())});
|
||||||
m_fake_wipe_tower.real_bbx = wipe_tower.get_bbx();
|
m_fake_wipe_tower.outer_wall = wipe_tower.get_outer_wall();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate a recommended G-code output file name based on the format template, default extension, and template parameters
|
// Generate a recommended G-code output file name based on the format template, default extension, and template parameters
|
||||||
|
|
|
@ -614,7 +614,7 @@ struct FakeWipeTower
|
||||||
float depth;
|
float depth;
|
||||||
float brim_width;
|
float brim_width;
|
||||||
Vec2d plate_origin;
|
Vec2d plate_origin;
|
||||||
BoundingBoxf real_bbx;
|
Polylines outer_wall; //wipe tower's true outer wall
|
||||||
|
|
||||||
void set_fake_extrusion_data(Vec2f p, float w, float h, float lh, float d, float bd, Vec2d o)
|
void set_fake_extrusion_data(Vec2f p, float w, float h, float lh, float d, float bd, Vec2d o)
|
||||||
{
|
{
|
||||||
|
@ -626,11 +626,6 @@ struct FakeWipeTower
|
||||||
brim_width = bd;
|
brim_width = bd;
|
||||||
plate_origin = o;
|
plate_origin = o;
|
||||||
}
|
}
|
||||||
void set_bbx()
|
|
||||||
{
|
|
||||||
real_bbx.min += pos.cast<double>();
|
|
||||||
real_bbx.max += pos.cast<double>();
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_pos(Vec2f p) { pos = p; }
|
void set_pos(Vec2f p) { pos = p; }
|
||||||
|
|
||||||
|
@ -639,10 +634,8 @@ struct FakeWipeTower
|
||||||
int d = scale_(depth);
|
int d = scale_(depth);
|
||||||
int w = scale_(width);
|
int w = scale_(width);
|
||||||
int bd = scale_(brim_width);
|
int bd = scale_(brim_width);
|
||||||
//Point minCorner = {scale_(pos.x()), scale_(pos.y())};
|
Point minCorner = {scale_(pos.x()), scale_(pos.y())};
|
||||||
//Point maxCorner = {minCorner.x() + w, minCorner.y() + d};
|
Point maxCorner = {minCorner.x() + w, minCorner.y() + d};
|
||||||
Point minCorner = {scale_(real_bbx.min.x()), scale_(real_bbx.min.y())};
|
|
||||||
Point maxCorner = {scale_(real_bbx.max.x()), scale_(real_bbx.max.y())};
|
|
||||||
|
|
||||||
std::vector<ExtrusionPaths> paths;
|
std::vector<ExtrusionPaths> paths;
|
||||||
for (float h = 0.f; h < height; h += layer_height) {
|
for (float h = 0.f; h < height; h += layer_height) {
|
||||||
|
@ -650,13 +643,26 @@ struct FakeWipeTower
|
||||||
path.polyline = {minCorner, {maxCorner.x(), minCorner.y()}, maxCorner, {minCorner.x(), maxCorner.y()}, minCorner};
|
path.polyline = {minCorner, {maxCorner.x(), minCorner.y()}, maxCorner, {minCorner.x(), maxCorner.y()}, minCorner};
|
||||||
paths.push_back({path});
|
paths.push_back({path});
|
||||||
|
|
||||||
//if (h == 0.f) { // add brim
|
if (h == 0.f) { // add brim
|
||||||
// ExtrusionPath fakeBrim(ExtrusionRole::erBrim, 0.0, 0.0, layer_height);
|
ExtrusionPath fakeBrim(ExtrusionRole::erBrim, 0.0, 0.0, layer_height);
|
||||||
// Point wtbminCorner = {minCorner - Point{bd, bd}};
|
Point wtbminCorner = {minCorner - Point{bd, bd}};
|
||||||
// Point wtbmaxCorner = {maxCorner + Point{bd, bd}};
|
Point wtbmaxCorner = {maxCorner + Point{bd, bd}};
|
||||||
// fakeBrim.polyline = {wtbminCorner, {wtbmaxCorner.x(), wtbminCorner.y()}, wtbmaxCorner, {wtbminCorner.x(), wtbmaxCorner.y()}, wtbminCorner};
|
fakeBrim.polyline = {wtbminCorner, {wtbmaxCorner.x(), wtbminCorner.y()}, wtbmaxCorner, {wtbminCorner.x(), wtbmaxCorner.y()}, wtbminCorner};
|
||||||
// paths.back().push_back(fakeBrim);
|
paths.back().push_back(fakeBrim);
|
||||||
//}
|
}
|
||||||
|
}
|
||||||
|
return paths;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<ExtrusionPaths> getTrueExtrusionPathsFromWipeTower() const
|
||||||
|
{
|
||||||
|
std::vector<ExtrusionPaths> paths;
|
||||||
|
Point trans = {scale_(pos.x()), scale_(pos.y())};
|
||||||
|
for (auto &polyline : outer_wall) {
|
||||||
|
ExtrusionPath path(ExtrusionRole::erWipeTower, 0.0, 0.0, layer_height);
|
||||||
|
path.polyline.points.reserve( polyline.points.size());
|
||||||
|
for (auto &p : polyline.points) path.polyline.points.push_back(p + trans);
|
||||||
|
paths.push_back({path});
|
||||||
}
|
}
|
||||||
return paths;
|
return paths;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue