diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index c88760c16..e24a97566 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -427,39 +427,44 @@ std::string WipeTowerIntegration::post_process_wipe_tower_moves(const WipeTower: Vec2f pos = tcr.start_pos; Vec2f transformed_pos = pos; Vec2f old_pos(-1000.1f, -1000.1f); + std::string never_skip_tag = WipeTower::never_skip_tag(); while (gcode_str) { std::getline(gcode_str, line); // we read the gcode line by line - // All G1 commands should be translated and rotated + // All G1 commands should be translated and rotated. X and Y coords are + // only pushed to the output when they differ from last time. + // WT generator can override this by appending the never_skip_tag if (line.find("G1 ") == 0) { + bool never_skip = false; + auto it = line.find(never_skip_tag); + if (it != std::string::npos) { + // remove the tag and remember we saw it + never_skip = true; + line.erase(it, it+never_skip_tag.size()); + } std::ostringstream line_out; std::istringstream line_str(line); line_str >> std::noskipws; // don't skip whitespace char ch = 0; while (line_str >> ch) { - if (ch == 'X') - line_str >> pos.x(); + if (ch == 'X' || ch =='Y') + line_str >> (ch == 'X' ? pos.x() : pos.y()); else - if (ch == 'Y') - line_str >> pos.y(); - else - line_out << ch; + line_out << ch; } - transformed_pos = pos; - transformed_pos = Eigen::Rotation2Df(angle) * transformed_pos; - transformed_pos += translation; + transformed_pos = Eigen::Rotation2Df(angle) * pos + translation; - if (transformed_pos != old_pos) { + if (transformed_pos != old_pos || never_skip) { line = line_out.str(); std::ostringstream oss; oss << std::fixed << std::setprecision(3) << "G1 "; - if (transformed_pos.x() != old_pos.x()) + if (transformed_pos.x() != old_pos.x() || never_skip) oss << " X" << transformed_pos.x() - extruder_offset.x(); - if (transformed_pos.y() != old_pos.y()) + if (transformed_pos.y() != old_pos.y() || never_skip) oss << " Y" << transformed_pos.y() - extruder_offset.y(); - + oss << " "; line.replace(line.find("G1 "), 3, oss.str()); old_pos = transformed_pos; } diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index cd326b9a0..5ee577482 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -1004,9 +1004,10 @@ void WipeTower::toolchange_Change( writer.append("[toolchange_gcode]\n"); // Travel to where we assume we are. Custom toolchange or some special T code handling (parking extruder etc) - // gcode could have left the extruder somewhere, we cannot just start extruding. - Vec2f current_pos = writer.pos_rotated(); - writer.append(std::string("G1 X") + std::to_string(current_pos.x()) + " Y" + std::to_string(current_pos.y()) + "\n"); + // gcode could have left the extruder somewhere, we cannot just start extruding. We should also inform the + // postprocessor that we absolutely want to have this in the gcode, even if it thought it is the same as before. + Vec2f current_pos = writer.pos_rotated(); + writer.append(std::string("G1 X") + std::to_string(current_pos.x()) + " Y" + std::to_string(current_pos.y()) + never_skip_tag() + "\n"); // The toolchange Tn command will be inserted later, only in case that the user does // not provide a custom toolchange gcode. diff --git a/src/libslic3r/GCode/WipeTower.hpp b/src/libslic3r/GCode/WipeTower.hpp index 311490055..e6832958e 100644 --- a/src/libslic3r/GCode/WipeTower.hpp +++ b/src/libslic3r/GCode/WipeTower.hpp @@ -17,9 +17,12 @@ class PrintConfig; enum GCodeFlavor : unsigned char; + class WipeTower { public: + static char const* never_skip_tag() { return "_GCODE_WIPE_TOWER_NEVER_SKIP_TAG"; } + struct Extrusion { Extrusion(const Vec2f &pos, float width, unsigned int tool) : pos(pos), width(width), tool(tool) {} @@ -96,6 +99,8 @@ public: + + // Switch to a next layer. void set_layer( // Print height of this layer. diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 0d2f65076..a62eec583 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1680,11 +1680,18 @@ void Print::_make_skirt() if (has_wipe_tower() && ! m_wipe_tower_data.tool_changes.empty()) { double width = m_config.wipe_tower_width + 2*m_wipe_tower_data.brim_width; double depth = m_wipe_tower_data.depth + 2*m_wipe_tower_data.brim_width; - Vec2d pt = Vec2d(m_config.wipe_tower_x-m_wipe_tower_data.brim_width, m_config.wipe_tower_y-m_wipe_tower_data.brim_width); - points.push_back(Point(scale_(pt.x()), scale_(pt.y()))); - points.push_back(Point(scale_(pt.x()+width), scale_(pt.y()))); - points.push_back(Point(scale_(pt.x()+width), scale_(pt.y()+depth))); - points.push_back(Point(scale_(pt.x()), scale_(pt.y()+depth))); + Vec2d pt = Vec2d(-m_wipe_tower_data.brim_width, -m_wipe_tower_data.brim_width); + + std::vector pts; + pts.push_back(Vec2d(pt.x(), pt.y())); + pts.push_back(Vec2d(pt.x()+width, pt.y())); + pts.push_back(Vec2d(pt.x()+width, pt.y()+depth)); + pts.push_back(Vec2d(pt.x(), pt.y()+depth)); + for (Vec2d& pt : pts) { + pt = Eigen::Rotation2Dd(Geometry::deg2rad(m_config.wipe_tower_rotation_angle.value)) * pt; + pt += Vec2d(m_config.wipe_tower_x.value, m_config.wipe_tower_y.value); + points.push_back(Point(scale_(pt.x()), scale_(pt.y()))); + } } if (points.size() < 3) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 891582dbb..401fb94d8 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -185,7 +185,9 @@ bool GUI_App::on_init_inner() wxCHECK_MSG(wxDirExists(resources_dir), false, wxString::Format("Resources path does not exist or is not a directory: %s", resources_dir)); - SetAppName(SLIC3R_APP_KEY); + // Profiles for the alpha are stored into the PrusaSlicer-alpha directory to not mix with the current release. + // SetAppName(SLIC3R_APP_KEY); + SetAppName(SLIC3R_APP_KEY "-alpha"); SetAppDisplayName(SLIC3R_APP_NAME); // Enable this to get the default Win32 COMCTRL32 behavior of static boxes.