From 7a378d2fc4b06590d98bebe14a2bb8cebdc2257d Mon Sep 17 00:00:00 2001 From: SoftFever Date: Sun, 26 Jul 2026 01:22:53 +0800 Subject: [PATCH 001/106] Sync WipeTower from BambuStudio(through ca1881761) --- src/libslic3r/GCode.cpp | 22 +- src/libslic3r/GCode/GCodeProcessor.cpp | 4 +- src/libslic3r/GCode/WipeTower.cpp | 2123 ++++++++++++++---------- src/libslic3r/GCode/WipeTower.hpp | 219 ++- src/libslic3r/Polyline.hpp | 4 +- src/libslic3r/Print.cpp | 83 +- 6 files changed, 1453 insertions(+), 1002 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index a08554654a..04ac442da3 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -998,6 +998,7 @@ static std::vector get_path_of_change_filament(const Print& print) std::string change_filament_gcode = gcodegen.config().change_filament_gcode.value; bool is_used_travel_avoid_perimeter = gcodegen.m_config.prime_tower_skip_points.value; + if (is_nozzle_change && !tcr.nozzle_change_result.is_extruder_change) is_used_travel_avoid_perimeter = false; // add nozzle change gcode into change filament gcode std::string nozzle_change_gcode_trans; @@ -1307,20 +1308,23 @@ static std::vector get_path_of_change_filament(const Print& print) } // do unretract after setting current extruder_id - // PETG filaments on a device with a filament switcher get a small (2 mm) pre-extrusion - // before the tool change. has_filament_switcher is a develop-only key read defensively from the - // full config (Orca does not carry it as a static PrintConfig member — same convention as - // enable_filament_dynamic_map); no shipping profile sets it (grep resources/profiles = 0), so - // is_petg_pre_extrusion is always false -> extra_unretract stays 0 -> byte-identical to the plain - // unretract() fleet-wide. The tower-interface contact pre-extrusion length (the - // is_contact_pre_extrusion branch) is NOT applied here; it is only computed as the guard used to - // give the contact path priority over PETG. + // BBS pattern: the wipe tower shifts the toolchange start position outward for the + // tower-interface (contact) pre-extrusion and for the PETG-with-filament-switcher case; + // the pre-extrusion material itself is laid down here as extra unretract on the approach. + // has_filament_switcher is a develop-only key read defensively from the full config (Orca + // does not carry it as a static PrintConfig member — same convention as + // enable_filament_dynamic_map); no shipping profile sets it, so is_petg_pre_extrusion is + // always false fleet-wide. const ConfigOptionBool* has_filament_switcher_opt = gcodegen.m_print->full_print_config().option("has_filament_switcher"); bool is_contact_pre_extrusion = tcr.is_contact && gcodegen.m_config.enable_tower_interface_features; bool is_petg_pre_extrusion = !is_contact_pre_extrusion && gcodegen.config().filament_type.get_at(tcr.new_tool) == "PETG" && has_filament_switcher_opt && has_filament_switcher_opt->value; - float extra_unretract = is_petg_pre_extrusion ? 2.f : 0.f; + float extra_unretract = 0.f; + if (is_contact_pre_extrusion) + extra_unretract = gcodegen.m_config.filament_tower_interface_pre_extrusion_length.get_at(tcr.new_tool); + else if (is_petg_pre_extrusion) + extra_unretract = 2.f; std::string toolchange_unretract_str = (extra_unretract > 0.f) ? gcodegen.unretract(extra_unretract) : gcodegen.unretract(); check_add_eol(toolchange_unretract_str); diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index cc53cd0e51..d66398354c 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -1450,8 +1450,8 @@ void GCodeProcessor::run_post_process() // flag) runs none of this. It is pure data construction — it only fills m_filament_blocks / // m_extruder_blocks / m_machine_*_gcode_*_line_id and never touches the exported g-code, so even // the enable_pre_heating fleet stays byte-identical (nothing reads the blocks until the injection - // pass). In practice it also stays empty/degenerate today because no template/code yet emits the - // MACHINE_*_GCODE_* / NOZZLE_CHANGE_* / CP_TOOLCHANGE_WIPE markers it keys off. + // pass). The wipe tower emits the NOZZLE_CHANGE_* (ramming) and CP_TOOLCHANGE_WIPE markers this + // builder keys off; the MACHINE_*_GCODE_* markers come from the machine g-code templates. m_filament_blocks.clear(); m_extruder_blocks.clear(); m_machine_start_gcode_end_line_id = (unsigned int) (-1); diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index 06bca292d4..3fbc0cccaa 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -3,11 +3,9 @@ #include #include #include -#include #include #include #include - #include "GCodeProcessor.hpp" #include "BoundingBox.hpp" #include "ClipperUtils.hpp" @@ -17,12 +15,16 @@ namespace Slic3r { -constexpr float flat_iron_speed = 10.f * 60.f; +float flat_iron_speed = 10.f * 60.f; static const double wipe_tower_wall_infill_overlap = 0.0; static constexpr double WIPE_TOWER_RESOLUTION = 0.1; +// Orca: SCALING_FACTOR is a runtime variable (large-printer switch), so this cannot be constexpr #define WT_SIMPLIFY_TOLERANCE_SCALED (0.001 / SCALING_FACTOR) static constexpr int arc_fit_size = 20; #define SCALED_WIPE_TOWER_RESOLUTION (WIPE_TOWER_RESOLUTION / SCALING_FACTOR) +enum class LimitFlow { None, LimitPrintFlow, LimitRammingFlow, LimitRammingFlowNC};//nc:nozzle change +static const std::map nozzle_diameter_to_nozzle_change_width{{0.2f, 0.5f}, {0.4f, 1.0f}, {0.6f, 1.2f}, {0.8f, 1.4f}}; + inline float align_round(float value, float base) { return std::round(value / base) * base; @@ -67,7 +69,7 @@ static bool is_valid_gcode(const std::string &gcode) return is_valid; } -static Polygon chamfer_polygon(Polygon &polygon, double chamfer_dis = 2., double angle_tol = 30. / 180. * PI) +Polygon chamfer_polygon(Polygon &polygon, double chamfer_dis = 2., double angle_tol = 30. / 180. * PI) { if (polygon.points.size() < 3) return polygon; Polygon res; @@ -169,7 +171,7 @@ Polygon WipeTower::rounding_polygon(Polygon &polygon, double rounding /*= 2.*/, return res; } -static Polygon rounding_rectangle(Polygon &polygon, double rounding = 2., double angle_tol = 30. / 180. * PI) { +Polygon rounding_rectangle(Polygon &polygon, double rounding = 2., double angle_tol = 30. / 180. * PI) { if (polygon.points.size() < 3) return polygon; Polygon res; res.points.reserve(polygon.points.size() * 2); @@ -226,7 +228,7 @@ static Polygon rounding_rectangle(Polygon &polygon, double rounding = 2., double return res; } -static std::pair ray_intersetion_line(const Vec2f &a, const Vec2f &v1, const Vec2f &b, const Vec2f &c) +std::pair ray_intersetion_line(const Vec2f &a, const Vec2f &v1, const Vec2f &b, const Vec2f &c) { const Vec2f v2 = c - b; double denom = cross2(v1, v2); @@ -243,19 +245,19 @@ static std::pair ray_intersetion_line(const Vec2f &a, const Vec2f & } return std::pair(false, Vec2f{0, 0}); } -static Polygon scale_polygon(const std::vector &points) { +Polygon scale_polygon(const std::vector &points) { Polygon res; for (const auto &p : points) res.points.push_back(scaled(p)); return res; } -static std::vector unscale_polygon(const Polygon& polygon) +std::vector unscale_polygon(const Polygon& polygon) { std::vector res; for (const auto &p : polygon.points) res.push_back(unscaled(p)); return res; } -static Polygon generate_rectange(const Line &line, coord_t offset) +Polygon generate_rectange(const Line &line, coord_t offset) { Point p1 = line.a; Point p2 = line.b; @@ -294,7 +296,7 @@ struct Segment bool is_valid() const { return start.y() < end.y(); } }; -static std::vector remove_points_from_segment(const Segment &segment, const std::vector &skip_points, double range) +std::vector remove_points_from_segment(const Segment &segment, const std::vector &skip_points, double range) { std::vector result; result.push_back(segment); @@ -333,7 +335,7 @@ struct PointWithFlag int pair_idx; // gap_pair idx bool is_forward; }; -static IntersectionInfo move_point_along_polygon(const std::vector &points, const Vec2f &startPoint, int startIdx, float offset, bool forward, int pair_idx) +IntersectionInfo move_point_along_polygon(const std::vector &points, const Vec2f &startPoint, int startIdx, float offset, bool forward, int pair_idx) { float remainingDistance = offset; IntersectionInfo res; @@ -395,7 +397,7 @@ static IntersectionInfo move_point_along_polygon(const std::vector &point return res; }; -static void insert_points(std::vector &pl, int idx, Vec2f pos, int pair_idx, bool is_forward) +void insert_points(std::vector &pl, int idx, Vec2f pos, int pair_idx, bool is_forward) { int next = (idx + 1) % pl.size(); Vec2f pos1 = pl[idx].pos; @@ -411,15 +413,111 @@ static void insert_points(std::vector &pl, int idx, Vec2f pos, in } } -static Polylines remove_points_from_polygon(const Polygon &polygon, const std::vector &skip_points, double range, bool is_left ,Polygon& insert_skip_pg) +// For skip_point +// TODO: Optimize the skip_point algorithm itself instead of adding guards here +Polygon add_extra_point(const Polygon &polygon, int scale_range) { - assert(polygon.size() > 2); + Polygon res; + if (polygon.size() < 2) return polygon; + + // Compute bounding box of the polygon + auto polygon_box = get_extents(polygon); + + // Anchor point: X at bbox center, Y at bbox bottom + Vec2f anchor_point(float(polygon_box.center()[0]), float(polygon_box.min[1])); + + // Find the edge whose midpoint is closest to the anchor point + size_t closest_edge_idx = 0; + float min_dist_sq = std::numeric_limits::max(); + + for (size_t i = 0; i < polygon.size(); ++i) { + const Point &a_i = polygon[i]; + const Point &b_i = polygon[(i + 1) % polygon.size()]; + + Vec2f a(float(a_i.x()), float(a_i.y())); + Vec2f b(float(b_i.x()), float(b_i.y())); + Vec2f mid = (a + b) * 0.5f; + + float dist_sq = (anchor_point - mid).squaredNorm(); + if (dist_sq < min_dist_sq) { + min_dist_sq = dist_sq; + closest_edge_idx = i; + } + } + + // Edge endpoints (integer space) + const Point &a_i = polygon[closest_edge_idx]; + const Point &b_i = polygon[(closest_edge_idx + 1) % polygon.size()]; + + // Convert to float for geometric computation + Vec2f a(float(a_i.x()), float(a_i.y())); + Vec2f b(float(b_i.x()), float(b_i.y())); + + Vec2f mid = (a + b) * 0.5f; + + // Direction vectors from midpoint towards A and B + Vec2f dir_to_a = a - mid; + Vec2f dir_to_b = b - mid; + + float len_a = dir_to_a.norm(); + float len_b = dir_to_b.norm(); + + // Guard against degenerated edges + if (len_a < EPSILON || len_b < EPSILON) return polygon; + + dir_to_a /= len_a; + dir_to_b /= len_b; + + // Clamp range to avoid overshooting the edge + float max_range = std::min(len_a, len_b) * 0.9f; + float range = std::min(float(scale_range), max_range); + + // Offset points (float space) + Vec2f offset_to_a_f = mid + dir_to_a * range; + Vec2f offset_to_b_f = mid + dir_to_b * range; + + // Safe cast back to scaled integer Point + auto to_int_point = [](const Vec2f &p) { + auto clamp = [](float v) -> coord_t { + constexpr float kMin = float(std::numeric_limits::min()); + constexpr float kMax = float(std::numeric_limits::max()); + v = std::clamp(v, kMin, kMax); + return static_cast(std::lround(v)); + }; + return Point(clamp(p.x()), clamp(p.y())); + }; + + Point mid_i = to_int_point(mid); + Point offset_to_a_i = to_int_point(offset_to_a_f); + Point offset_to_b_i = to_int_point(offset_to_b_f); + + // Rebuild polygon with inserted points + for (size_t i = 0; i < polygon.size(); ++i) { + res.points.push_back(polygon[i]); + + // Insert points right after the selected edge start vertex + if (i == closest_edge_idx) { + res.points.push_back(offset_to_a_i); + res.points.push_back(mid_i); + res.points.push_back(offset_to_b_i); + } + } + + return res; +} + + + +Polylines remove_points_from_polygon(const Polygon &polygon_ori, const std::vector &skip_points, double range, float wt_width, Polygon &insert_skip_pg) +{ + Polygon polygon = add_extra_point(polygon_ori, scale_(range)); + if (polygon.size() < 2) return Polylines{to_polyline(polygon)}; Polylines result; std::vector new_pl; // add intersection points for gaps, where bool indicates whether it's a gap point. std::vector inter_info; - Vec2f ray = is_left ? Vec2f(-1, 0) : Vec2f(1, 0); auto polygon_box = get_extents(polygon); - Point anchor_point = is_left ? Point{polygon_box.max[0], polygon_box.min[1]} : polygon_box.min; // rd:ld + //Point anchor_point = /*is_left ? Point{polygon_box.max[0], polygon_box.min[1]} :*/ polygon_box.min; // rd:ld + Point anchor_point = Point{polygon_box.center()[0], polygon_box.min[1]}; // for next reconnect std::vector points; { points.reserve(polygon.points.size()); @@ -430,6 +528,8 @@ static Polylines remove_points_from_polygon(const Polygon &polygon, const std::v } for (int i = 0; i < skip_points.size(); i++) { + bool is_left = abs(skip_points[i].x()) < wt_width / 2.f; + Vec2f ray = is_left ? Vec2f(-1, 0) : Vec2f(1, 0); for (int j = 0; j < points.size(); j++) { Vec2f& p1 = points[j]; Vec2f& p2 = points[(j + 1) % points.size()]; @@ -493,22 +593,22 @@ static Polylines remove_points_from_polygon(const Polygon &polygon, const std::v return result; } -static Polylines contrust_gap_for_skip_points(const Polygon &polygon, const std::vector & skip_points ,float wt_width,float gap_length,Polygon& insert_skip_polygon) +Polylines contrust_gap_for_skip_points(const Polygon &polygon, const std::vector & skip_points ,float wt_width,float gap_length,Polygon& insert_skip_polygon) { if (skip_points.empty()) { insert_skip_polygon = polygon; return Polylines{to_polyline(polygon)}; } - bool is_left = false; - const auto &pt = skip_points.front(); - if (abs(pt.x()) < wt_width/2.f) { - is_left = true; - } - return remove_points_from_polygon(polygon, skip_points, gap_length, is_left, insert_skip_polygon); + //bool is_left = false; + //const auto &pt = skip_points.front(); + //if (abs(pt.x()) < wt_width/2.f) { + // is_left = true; + //} + return remove_points_from_polygon(polygon, skip_points, gap_length, wt_width, insert_skip_polygon); }; -static Polygon generate_rectange_polygon(const Vec2f &wt_box_min ,const Vec2f & wt_box_max) { +Polygon generate_rectange_polygon(const Vec2f &wt_box_min ,const Vec2f & wt_box_max) { Polygon res; res.points.push_back(scaled(wt_box_min)); res.points.push_back(scaled(Vec2f{wt_box_max[0], wt_box_min[1]})); @@ -520,7 +620,7 @@ static Polygon generate_rectange_polygon(const Vec2f &wt_box_min ,const Vec2f & class WipeTowerWriter { public: - WipeTowerWriter(float layer_height, float line_width, GCodeFlavor flavor, const std::vector& filament_parameters) : + WipeTowerWriter(float layer_height, float line_width, GCodeFlavor flavor, const std::vector& filament_parameters, bool enable_arc_fitting) : m_current_pos(std::numeric_limits::max(), std::numeric_limits::max()), m_current_z(0.f), m_current_feedrate(0.f), @@ -528,9 +628,13 @@ public: m_extrusion_flow(0.f), m_preview_suppressed(false), m_elapsed_time(0.f), - m_gcode_flavor(flavor), - m_filpar(filament_parameters) - { +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + m_default_analyzer_line_width(line_width), +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING + m_gcode_flavor(flavor), + m_enable_arc_fitting(enable_arc_fitting), + m_filpar(filament_parameters) + { // ORCA: This class is only used by BBL printers, so set the parameter appropriately. // This fixes an issue where the wipe tower was using BBL tags resulting in statistics for purging in the purge tower not being displayed. GCodeProcessor::s_IsBBLPrinter = true; @@ -550,6 +654,18 @@ public: return *this; } +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + WipeTowerWriter& change_analyzer_mm3_per_mm(float len, float e) { + static const float area = float(M_PI) * 1.75f * 1.75f / 4.f; + float mm3_per_mm = (len == 0.f ? 0.f : area * e / len); + // adds tag for processor: + std::stringstream str; + str << ";" << GCodeProcessor::Mm3_Per_Mm_Tag << mm3_per_mm << "\n"; + m_gcode += str.str(); + return *this; + } +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING + WipeTowerWriter& set_initial_position(const Vec2f &pos, float width = 0.f, float depth = 0.f, float internal_angle = 0.f) { m_wipe_tower_width = width; m_wipe_tower_depth = depth; @@ -587,8 +703,13 @@ public: // Suppress / resume G-code preview in Slic3r. Slic3r will have difficulty to differentiate the various // filament loading and cooling moves from normal extrusion moves. Therefore the writer // is asked to suppres output of some lines, which look like extrusions. +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + WipeTowerWriter& suppress_preview() { change_analyzer_line_width(0.f); m_preview_suppressed = true; return *this; } + WipeTowerWriter& resume_preview() { change_analyzer_line_width(m_default_analyzer_line_width); m_preview_suppressed = false; return *this; } +#else WipeTowerWriter& suppress_preview() { m_preview_suppressed = true; return *this; } - WipeTowerWriter& resume_preview() { m_preview_suppressed = false; return *this; } + WipeTowerWriter& resume_preview() { m_preview_suppressed = false; return *this; } +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING WipeTowerWriter& feedrate(float f) { @@ -610,9 +731,9 @@ public: float get_and_reset_used_filament_length() { float temp = m_used_filament_length; m_used_filament_length = 0.f; return temp; } // Extrude with an explicitely provided amount of extrusion. - WipeTowerWriter& extrude_explicit(float x, float y, float e, float f = 0.f, bool record_length = false, bool limit_volumetric_flow = true) + WipeTowerWriter &extrude_explicit(float x, float y, float e, float f = 0.f, bool record_length = false ,LimitFlow limit_flow = LimitFlow::LimitPrintFlow) { - if (x == m_current_pos.x() && y == m_current_pos.y() && e == 0.f && (f == 0.f || f == m_current_feedrate)) + if ((std::abs(x - m_current_pos.x()) <= (float)EPSILON) && (std::abs(y - m_current_pos.y()) < (float)EPSILON) && e == 0.f && (f == 0.f || f == m_current_feedrate)) // Neither extrusion nor a travel move. return *this; @@ -627,9 +748,12 @@ public: Vec2f rot(this->rotate(Vec2f(x,y))); // this is where we want to go if (! m_preview_suppressed && e > 0.f && len > 0.f) { - // Width of a squished extrusion, corrected for the roundings of the squished extrusions. +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + change_analyzer_mm3_per_mm(len, e); +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING + // Width of a squished extrusion, corrected for the roundings of the squished extrusions. // This is left zero if it is a travel move. - float width = e * m_filpar[0].filament_area / (len * m_layer_height); + float width = e * m_filpar[0].filament_area / (len * m_layer_height); // Correct for the roundings of a squished extrusion. width += m_layer_height * float(1. - M_PI / 4.); if (m_extrusions.empty() || m_extrusions.back().pos != rotated_current_pos) @@ -637,6 +761,12 @@ public: m_extrusions.emplace_back(WipeTower::Extrusion(rot, width, m_current_tool)); } + if (e == 0.f) { + m_gcode += set_travel_acceleration(); + } else { + m_gcode += set_normal_acceleration(); + } + m_gcode += "G1"; if (std::abs(rot.x() - rotated_current_pos.x()) > (float)EPSILON) m_gcode += set_format_X(rot.x()); @@ -649,9 +779,12 @@ public: m_gcode += set_format_E(e); if (f != 0.f && f != m_current_feedrate) { - if (limit_volumetric_flow) { + if (limit_flow!= LimitFlow::None) { float e_speed = e / (((len == 0.f) ? std::abs(e) : len) / f * 60.f); - f /= std::max(1.f, e_speed / m_filpar[m_current_tool].max_e_speed); + float tmp = m_filpar[m_current_tool].max_e_speed; + if (limit_flow == LimitFlow::LimitRammingFlow) tmp = m_filpar[m_current_tool].max_e_ramming_speed.first; + else if (limit_flow == LimitFlow::LimitRammingFlowNC) tmp = m_filpar[m_current_tool].max_e_ramming_speed.second; + f /= std::max(1.f, e_speed / tmp); } m_gcode += set_format_F(f); } @@ -666,7 +799,7 @@ public: } // Extrude with an explicitely provided amount of extrusion. - WipeTowerWriter &extrude_arc_explicit(ArcSegment &arc, float f = 0.f, bool record_length = false, bool limit_volumetric_flow = true) + WipeTowerWriter &extrude_arc_explicit(ArcSegment &arc, float f = 0.f, bool record_length = false, LimitFlow limit_flow = LimitFlow::LimitPrintFlow) { float x = (float)unscale(arc.end_point).x(); float y = (float)unscale(arc.end_point).y(); @@ -706,6 +839,13 @@ public: } } + + if (e == 0.f) { + m_gcode += set_travel_acceleration(); + } else { + m_gcode += set_normal_acceleration(); + } + m_gcode += arc.direction == ArcDirection::Arc_Dir_CCW ? "G3" : "G2"; const Vec2f center_offset = this->rotate(unscaled(arc.center)) - rotated_current_pos; m_gcode += set_format_X(rot.x()); @@ -716,9 +856,13 @@ public: if (e != 0.f) m_gcode += set_format_E(e); if (f != 0.f && f != m_current_feedrate) { - if (limit_volumetric_flow) { + if (limit_flow != LimitFlow::None) { float e_speed = e / (((len == 0.f) ? std::abs(e) : len) / f * 60.f); - f /= std::max(1.f, e_speed / m_filpar[m_current_tool].max_e_speed); + float tmp = m_filpar[m_current_tool].max_e_speed; + if (limit_flow == LimitFlow::LimitRammingFlow) tmp = m_filpar[m_current_tool].max_e_ramming_speed.first; + else if (limit_flow == LimitFlow::LimitRammingFlowNC) + tmp = m_filpar[m_current_tool].max_e_ramming_speed.second; + f /= std::max(1.f, e_speed / tmp); } m_gcode += set_format_F(f); } @@ -732,8 +876,10 @@ public: return *this; } - WipeTowerWriter& extrude_explicit(const Vec2f &dest, float e, float f = 0.f, bool record_length = false, bool limit_volumetric_flow = true) - { return extrude_explicit(dest.x(), dest.y(), e, f, record_length); } + WipeTowerWriter &extrude_explicit(const Vec2f &dest, float e, float f = 0.f, bool record_length = false, LimitFlow limit_flow = LimitFlow::LimitPrintFlow) + { + return extrude_explicit(dest.x(), dest.y(), e, f, record_length, limit_flow); + } // Travel to a new XY position. f=0 means use the current value. WipeTowerWriter& travel(float x, float y, float f = 0.f) @@ -743,15 +889,15 @@ public: { return extrude_explicit(dest.x(), dest.y(), 0.f, f); } // Extrude a line from current position to x, y with the extrusion amount given by m_extrusion_flow. - WipeTowerWriter& extrude(float x, float y, float f = 0.f) + WipeTowerWriter &extrude(float x, float y, float f = 0.f, LimitFlow limit_flow = LimitFlow::LimitPrintFlow) { float dx = x - m_current_pos.x(); float dy = y - m_current_pos.y(); - return extrude_explicit(x, y, std::sqrt(dx*dx+dy*dy) * m_extrusion_flow, f, true); + return extrude_explicit(x, y, std::sqrt(dx * dx + dy * dy) * m_extrusion_flow, f, false, limit_flow); } - WipeTowerWriter &extrude_arc(ArcSegment &arc, float f = 0.f) + WipeTowerWriter &extrude_arc(ArcSegment &arc, float f = 0.f, LimitFlow limit_flow = LimitFlow::LimitPrintFlow) { - return extrude_arc_explicit(arc, f, true); + return extrude_arc_explicit(arc, f, false , limit_flow); } WipeTowerWriter& extrude(const Vec2f &dest, const float f = 0.f) @@ -866,7 +1012,12 @@ public: { Polyline pl = to_polyline(wall_polygon); pl.simplify(WT_SIMPLIFY_TOLERANCE_SCALED); - pl.simplify_by_fitting_arc(SCALED_WIPE_TOWER_RESOLUTION); + if (m_enable_arc_fitting) { + pl.simplify_by_fitting_arc(SCALED_WIPE_TOWER_RESOLUTION); + } else { + pl.simplify(SCALED_WIPE_TOWER_RESOLUTION); + pl.reset_to_linear_move(); + } auto get_closet_idx = [this](std::vector &corners) -> int { Vec2f anchor{this->m_current_pos.x(), this->m_current_pos.y()}; @@ -895,6 +1046,9 @@ public: } } + if (segments.empty()) + return (*this); + int index_of_closest = get_closet_idx(segments); int i = index_of_closest; travel(segments[i].start); // travel to the closest points @@ -937,7 +1091,7 @@ public: } float end_point = x() + (farthest_x > x() ? 1.f : -1.f) * x_distance; - return extrude_explicit(end_point, y(), loading_dist, x_speed * 60.f, false, false); + return extrude_explicit(end_point, y(), loading_dist, x_speed * 60.f, false, LimitFlow::None); } // Elevate the extruder head above the current print_z position. @@ -958,8 +1112,8 @@ public: // extrude quickly amount e to x2 with feed f. WipeTowerWriter& ram(float x1, float x2, float dy, float e0, float e, float f) { - extrude_explicit(x1, m_current_pos.y() + dy, e0, f, true, false); - extrude_explicit(x2, m_current_pos.y(), e, 0.f, true, false); + extrude_explicit(x1, m_current_pos.y() + dy, e0, f, true, LimitFlow::None); + extrude_explicit(x2, m_current_pos.y(), e, 0.f, true, LimitFlow::None); return *this; } @@ -968,8 +1122,8 @@ public: // at the current Y position to spread the leaking material. WipeTowerWriter& cool(float x1, float x2, float e1, float e2, float f) { - extrude_explicit(x1, m_current_pos.y(), e1, f, false, false); - extrude_explicit(x2, m_current_pos.y(), e2, false, false); + extrude_explicit(x1, m_current_pos.y(), e1, f, false, LimitFlow::None); + extrude_explicit(x2, m_current_pos.y(), e2, 0.f, false, LimitFlow::None); return *this; } @@ -1002,26 +1156,22 @@ public: return *this; } - // Let the firmware back up the active speed override value. - WipeTowerWriter& speed_override_backup() + // Let the firmware back up the active speed override value. + WipeTowerWriter& speed_override_backup() { // BBS: BBL machine don't support speed backup -#if 0 if (m_gcode_flavor == gcfMarlinLegacy || m_gcode_flavor == gcfMarlinFirmware) m_gcode += "M220 B\n"; -#endif - return *this; + return *this; } - // Let the firmware restore the active speed override value. - WipeTowerWriter& speed_override_restore() - { - // BBS: BBL machine don't support speed restore -#if 0 + // Let the firmware restore the active speed override value. + WipeTowerWriter& speed_override_restore() + { + // BBS: BBL machine don't support speed restore if (m_gcode_flavor == gcfMarlinLegacy || m_gcode_flavor == gcfMarlinFirmware) m_gcode += "M220 R\n"; -#endif - return *this; + return *this; } // Set digital trimpot motor @@ -1115,7 +1265,14 @@ public: } return closestIndex; }; - for (auto &pl : pls) pl.simplify_by_fitting_arc(SCALED_WIPE_TOWER_RESOLUTION); + if (m_enable_arc_fitting) { + for (auto &pl : pls) pl.simplify_by_fitting_arc(SCALED_WIPE_TOWER_RESOLUTION); + } else { + for (auto &pl : pls) { + pl.simplify(SCALED_WIPE_TOWER_RESOLUTION); + pl.reset_to_linear_move(); + } + } std::vector segments; for (const auto &pl : pls) { @@ -1131,9 +1288,11 @@ public: segments.back().is_arc = true; segments.back().arcsegment = pl.fitting_result[i].arc_data; } - } } + if (segments.empty()) + return; + int index_of_closest = get_closet_idx(segments); int i = index_of_closest; travel(segments[i].start); // travel to the closest points @@ -1158,7 +1317,7 @@ public: Vec2f box_max = center + Vec2f{step_length, step_length}; Vec2f box_min = center - Vec2f{step_length, step_length}; int n = std::ceil(edge_length / step_length / 2.f); - assert(n > 0); + if (n <= 0) return; while (n--) { travel(box_max.x(), m_current_pos.y(), feedrate); travel(m_current_pos.x(), box_max.y(), feedrate); @@ -1170,6 +1329,120 @@ public: } } + WipeTowerWriter &format_line_M104(int target_temp, int target_extruder, bool wait_for_moves = true, const std::string &comment = std::string()) + { + std::string buffer; + if (wait_for_moves) + buffer += "M400\n"; + buffer += "M104"; + if (target_extruder != -1) + buffer += (" T" + std::to_string(m_physical_extruder_map[target_extruder])); + buffer += " S" + std::to_string(target_temp) + " N0"; // N0 means the gcode is generated by slicer + if (!comment.empty()) buffer += " ;" + comment; + buffer += '\n'; + append(buffer); + return *this; + } + + WipeTowerWriter &format_line_M109(int target_temp, int target_extruder, const std::string &comment = std::string()) + { + std::string buffer = "M109"; + if (target_extruder != -1) + buffer += (" T" + std::to_string(m_physical_extruder_map[target_extruder])); + buffer += " S" + std::to_string(target_temp) + " N0"; // N0 means the gcode is generated by slicer + if (!comment.empty()) buffer += " ;" + comment; + buffer += '\n'; + append(buffer); + return *this; + }; + + void set_first_layer(bool is_first_layer) { m_is_first_layer = is_first_layer; } + void set_normal_acceleration(const std::vector &accelerations) { m_normal_accelerations = accelerations; }; + void set_first_layer_normal_acceleration(const std::vector &accelerations) { m_first_layer_normal_accelerations = accelerations; }; + void set_travel_acceleration(const std::vector &accelerations) { m_travel_accelerations = accelerations; }; + void set_first_layer_travel_acceleration(const std::vector &accelerations) { m_first_layer_travel_accelerations = accelerations; }; + void set_max_acceleration(unsigned int acceleration) { m_max_acceleration = acceleration; }; + void set_accel_to_decel_enable(bool enable) { m_accel_to_decel_enable = enable; } + void set_accel_to_decel_factor(float factor) { m_accel_to_decel_factor = factor; } + void set_layer_id(int layer_id) { m_layer_id = layer_id; } + void set_multi_nozzle_group_result(const MultiNozzleUtils::LayeredNozzleGroupResult *multi_nozzle_group_result) { m_multi_nozzle_group_result = multi_nozzle_group_result; } + void set_physical_extruder_map(const std::vector &physical_extruder_map) { m_physical_extruder_map = physical_extruder_map; } + +private: + std::string set_normal_acceleration() { + std::vector accelerations = m_is_first_layer ? m_first_layer_normal_accelerations : m_normal_accelerations; + if (accelerations.empty() || !m_multi_nozzle_group_result) + return std::string(); + int extruder_id = m_multi_nozzle_group_result->get_extruder_id(m_current_tool, m_layer_id); + // Orca: get_extruder_id returns -1 when the filament is not covered by the map + // (reachable with a stale manual filament map); skip instead of indexing out of bounds. + if (extruder_id < 0 || extruder_id >= (int) accelerations.size()) + return std::string(); + unsigned int acc = accelerations[extruder_id]; + return set_acceleration_impl(acc); + } + std::string set_travel_acceleration() + { + std::vector accelerations = m_is_first_layer ? m_first_layer_travel_accelerations : m_travel_accelerations; + if (accelerations.empty() || !m_multi_nozzle_group_result) + return std::string(); + int extruder_id = m_multi_nozzle_group_result->get_extruder_id(m_current_tool, m_layer_id); + // Orca: get_extruder_id returns -1 when the filament is not covered by the map + // (reachable with a stale manual filament map); skip instead of indexing out of bounds. + if (extruder_id < 0 || extruder_id >= (int) accelerations.size()) + return std::string(); + unsigned int acc = accelerations[extruder_id]; + return set_acceleration_impl(acc); + } + std::string set_acceleration_impl(unsigned int acceleration) { + // Clamp the acceleration to the allowed maximum. + if (m_max_acceleration > 0 && acceleration > m_max_acceleration) + acceleration = m_max_acceleration; + + if (acceleration == 0 || acceleration == m_last_acceleration) + return std::string(); + + m_last_acceleration = acceleration; + + std::ostringstream gcode; + if (m_gcode_flavor == gcfRepetier) { + // M201: Set max printing acceleration + gcode << "M201 X" << acceleration << " Y" << acceleration; + gcode << "\n"; + // M202: Set max travel acceleration + gcode << "M202 X" << acceleration << " Y" << acceleration; + } else if (m_gcode_flavor == gcfRepRapFirmware) { + // M204: Set default acceleration + gcode << "M204 P" << acceleration; + } else if (m_gcode_flavor == gcfMarlinFirmware) { + // This is new MarlinFirmware with separated print/retraction/travel acceleration. + // Use M204 P, we don't want to override travel acc by M204 S (which is deprecated anyway). + gcode << "M204 P" << acceleration; + } + else if (m_gcode_flavor == gcfKlipper && m_accel_to_decel_enable) { + gcode << "SET_VELOCITY_LIMIT ACCEL_TO_DECEL=" << acceleration * m_accel_to_decel_factor / 100; + gcode << "\nM204 S" << acceleration; + } + else { + // M204: Set default acceleration + gcode << "M204 S" << acceleration; + } + gcode << "\n"; + return gcode.str(); + } + std::vector m_normal_accelerations; + std::vector m_first_layer_normal_accelerations; + std::vector m_travel_accelerations; + std::vector m_first_layer_travel_accelerations; + bool m_is_first_layer{false}; + unsigned int m_max_acceleration{0}; + unsigned int m_last_acceleration{0}; + bool m_accel_to_decel_enable; + float m_accel_to_decel_factor; + const MultiNozzleUtils::LayeredNozzleGroupResult *m_multi_nozzle_group_result{nullptr}; + int m_layer_id = -1; + std::vector m_physical_extruder_map; + private: Vec2f m_start_pos; Vec2f m_current_pos; @@ -1189,8 +1462,12 @@ private: float m_wipe_tower_depth = 0.f; unsigned m_last_fan_speed = 0; int current_temp = -1; +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + const float m_default_analyzer_line_width; +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING float m_used_filament_length = 0.f; GCodeFlavor m_gcode_flavor; + bool m_enable_arc_fitting = true; const std::vector& m_filpar; std::string set_format_X(float x) @@ -1244,7 +1521,7 @@ WipeTower::ToolChangeResult WipeTower::construct_tcr(WipeTowerWriter& writer, bool is_finish, bool is_tool_change, float purge_volume, - bool is_contact) const + bool is_contact ) const { ToolChangeResult result; result.priming = priming; @@ -1261,9 +1538,8 @@ WipeTower::ToolChangeResult WipeTower::construct_tcr(WipeTowerWriter& writer, result.is_finish_first = is_finish; result.nozzle_change_result = m_nozzle_change_result; result.is_tool_change = is_tool_change; - result.is_contact = is_contact; result.tool_change_start_pos = is_tool_change ? result.start_pos : Vec2f(0, 0); - + result.is_contact = is_contact; // BBS result.purge_volume = purge_volume; return result; @@ -1285,7 +1561,6 @@ WipeTower::ToolChangeResult WipeTower::construct_block_tcr(WipeTowerWriter &writ result.wipe_path = std::move(writer.wipe_path()); result.is_finish_first = is_finish; result.is_tool_change = false; - result.is_contact = false; result.tool_change_start_pos = Vec2f(0, 0); // BBS result.purge_volume = purge_volume; @@ -1480,40 +1755,43 @@ WipeTower::WipeTower(const PrintConfig& config, int plate_idx, Vec3d plate_origi m_enable_wrapping_detection(config.enable_wrapping_detection), m_wrapping_detection_layers(config.wrapping_detection_layers.value && (config.wrapping_exclude_area.values.size() > 2)), m_slice_used_filaments(slice_used_filaments.size()), - m_filaments_change_length(config.filament_change_length.values), m_is_multi_extruder(config.nozzle_diameter.size() > 1), m_use_gap_wall(config.prime_tower_skip_points.value), + // Orca: rib-wall options live under wipe_tower_* names and the wall type is an enum m_use_rib_wall(config.wipe_tower_wall_type.value == WipeTowerWallType::wtwRib), m_extra_rib_length((float)config.wipe_tower_extra_rib_length.value), m_rib_width((float)config.wipe_tower_rib_width.value), m_used_fillet(config.wipe_tower_fillet_wall.value), m_extra_spacing((float)config.prime_tower_infill_gap.value/100.f), m_tower_framework(config.prime_tower_enable_framework.value), + // Orca: prime_tower_max_speed is named wipe_tower_max_purge_speed (same default/min) + m_max_speed((float)config.wipe_tower_max_purge_speed.value*60.f), + m_accel_to_decel_enable(config.accel_to_decel_enable.value), + m_accel_to_decel_factor(config.accel_to_decel_factor.value), + m_printable_height(config.extruder_printable_height.values), m_flat_ironing(config.prime_tower_flat_ironing.value), m_enable_tower_interface_features(config.enable_tower_interface_features.value), - m_enable_tower_interface_cooldown_during_tower(config.enable_tower_interface_cooldown_during_tower.value) + m_physical_extruder_map(config.physical_extruder_map.values), + m_enable_arc_fitting(config.enable_arc_fitting.value) + // Orca: has_filament_switcher is a device-set dynamic key, not a PrintConfig member; + // it is pushed in from Print via set_has_filament_switcher() instead of read here. { + m_contact_speed = 20 * 60.f; + m_filaments_change_length.first = config.filament_change_length.values; + m_filaments_change_length.second = config.filament_change_length_nc.values; + m_hotend_heating_rate = config.hotend_heating_rate.values; + m_hotend_cooling_rate = config.hotend_cooling_rate.values; m_flat_ironing = (m_flat_ironing && m_use_gap_wall); - - // Prime-tower heating during wipe. m_is_multiple_nozzle mirrors the gate used in ToolOrdering/GCode - // (std::any_of extruder_max_nozzle_count > 1); it is false for every current printer, so the - // heating-during-wipe logic in toolchange_wipe_new is inert. - m_hotend_heating_rate = config.hotend_heating_rate.values; - m_physical_extruder_map = config.physical_extruder_map.values; - m_is_multiple_nozzle = std::any_of(config.extruder_max_nozzle_count.values.begin(), - config.extruder_max_nozzle_count.values.end(), - [](int v) { return v > 1; }); - - // Per-extruder printable-height clamp. Empty for single-extruder printers - // (extruder_printable_height = []), so is_valid_last_layer is inert there. - m_printable_height = config.extruder_printable_height.values; - m_last_layer_id.assign(config.nozzle_diameter.size(), -1); + // Orca: default/initial-layer/travel acceleration are object-scope options here (PrintConfig + // members in BBS), so Print pushes the resolved columns in via set_accelerations() instead of + // the ctor reading them from config. + m_max_accels = config.machine_max_acceleration_extruding.values.front(); // Read absolute value of first layer speed, if given as percentage, // it is taken over following default. Speeds from config are not // easily accessible here. const float default_speed = 60.f; - m_first_layer_speed = config.initial_layer_speed.get_at(get_extruder_index(config, (unsigned int)initial_tool)); + m_first_layer_speed = config.initial_layer_speed.get_at(get_extruder_index(config, (unsigned int) initial_tool)); if (m_first_layer_speed == 0.f) // just to make sure autospeed doesn't break it. m_first_layer_speed = default_speed / 2.f; @@ -1550,6 +1828,9 @@ WipeTower::WipeTower(const PrintConfig& config, int plate_idx, Vec3d plate_origi m_bed_bottom_left = m_bed_shape == RectangularBed ? Vec2f(bed_points.front().x(), bed_points.front().y()) : Vec2f::Zero(); + m_last_layer_id.resize(config.nozzle_diameter.size(), -1); + m_origin = {plate_origin[0], plate_origin[1]}; + m_is_multiple_nozzle = std::any_of(config.extruder_max_nozzle_count.values.begin(), config.extruder_max_nozzle_count.values.end(), [](auto &elem) { return elem > 1; }); } @@ -1559,31 +1840,16 @@ void WipeTower::set_extruder(size_t idx, const PrintConfig& config) //while (m_filpar.size() < idx+1) // makes sure the required element is in the vector m_filpar.push_back(FilamentParameters()); - // Orca: one row per filament, indexed by the raw filament id. Under a per-layer nozzle - // grouping the per-variant arrays may hold several columns per filament; the tower has no - // layer dimension here, so it keeps the filament's first column (tower x per-layer - // grouping is a documented follow-up). m_filpar[idx].material = config.filament_type.get_at(idx); + // Orca: wipe_tower_filament (issue #10971) forces a specific filament to print the tower wall by + // marking every other filament as "soluble"; 0 keeps the plain per-filament soluble flag. m_filpar[idx].is_soluble = config.wipe_tower_filament == 0 ? config.filament_soluble.get_at(idx) : (idx != size_t(config.wipe_tower_filament - 1)); // BBS m_filpar[idx].is_support = config.filament_is_support.get_at(idx); m_filpar[idx].nozzle_temperature = config.nozzle_temperature.get_at(idx); m_filpar[idx].nozzle_temperature_initial_layer = config.nozzle_temperature_initial_layer.get_at(idx); m_filpar[idx].category = config.filament_adhesiveness_category.get_at(idx); - { - int interface_temp = config.filament_tower_interface_print_temp.get_at(idx); - if (interface_temp == -1) - interface_temp = config.nozzle_temperature_range_high.get_at(idx); - m_filpar[idx].interface_print_temperature = interface_temp; - } - m_filpar[idx].tower_interface_pre_extrusion_dist = config.filament_tower_interface_pre_extrusion_dist.get_at(idx); - m_filpar[idx].tower_interface_pre_extrusion_length = config.filament_tower_interface_pre_extrusion_length.get_at(idx); - // PETG pre-extrusion offset reuses the tower-interface pre-extrusion distance. Only read by the - // has_filament_switcher-gated PETG branch in get_next_pos (inert fleet-wide). - m_filpar[idx].petg_pre_extrusion_offset_dist = config.filament_tower_interface_pre_extrusion_dist.get_at(idx); - m_filpar[idx].tower_ironing_area = config.filament_tower_ironing_area.get_at(idx); - m_filpar[idx].tower_interface_purge_length = config.filament_tower_interface_purge_volume.get_at(idx); - m_filpar[idx].filament_cooling_before_tower = config.filament_cooling_before_tower.get_at(idx); + m_filpar[idx].flat_iron_area = config.filament_tower_ironing_area.get_at(idx); // If this is a single extruder MM printer, we will use all the SE-specific config values. // Otherwise, the defaults will be used to turn off the SE stuff. @@ -1609,14 +1875,10 @@ void WipeTower::set_extruder(size_t idx, const PrintConfig& config) if (max_vol_speed!= 0.f) m_filpar[idx].max_e_speed = (max_vol_speed / filament_area()); - // Vortek H2C: carousel-specific ramming, precool, and reverse travel parameters + //set extruder change and nozzle change ramming speed { - // Ramming speed: .first = extruder change, .second = nozzle change (carousel) - // Use the dedicated ramming volumetric speed, falling back to max_vol_speed only when - // the setting is nil/-1. float ramming_vol_speed = float(config.filament_ramming_volumetric_speed.get_at(idx)); - if (config.filament_ramming_volumetric_speed.is_nil(idx) || is_approx(config.filament_ramming_volumetric_speed.get_at(idx), -1.)) - ramming_vol_speed = max_vol_speed; + if (config.filament_ramming_volumetric_speed.is_nil(idx) || is_approx(config.filament_ramming_volumetric_speed.get_at(idx), -1.)) ramming_vol_speed = max_vol_speed; m_filpar[idx].max_e_ramming_speed.first = (ramming_vol_speed / filament_area()); float ramming_vol_speed_nc = float(config.filament_ramming_volumetric_speed_nc.get_at(idx)); @@ -1624,51 +1886,57 @@ void WipeTower::set_extruder(size_t idx, const PrintConfig& config) ramming_vol_speed_nc = max_vol_speed; m_filpar[idx].max_e_ramming_speed.second = (ramming_vol_speed_nc / filament_area()); } - { - // Precool target temp: .first = extruder change, .second = nozzle change (carousel) - // Precool is only active when enable_pre_heating is on; otherwise no precool temp/timing is - // applied and the downstream precool_t stays 0, matching printers with pre-heating disabled. - m_filpar[idx].precool_target_temp = {0, 0}; - if (config.enable_pre_heating.value) { - if (!config.filament_pre_cooling_temperature.is_nil(idx) && config.filament_pre_cooling_temperature.get_at(idx) != 0) - m_filpar[idx].precool_target_temp.first = config.filament_pre_cooling_temperature.get_at(idx); - if (!config.filament_pre_cooling_temperature_nc.is_nil(idx) && config.filament_pre_cooling_temperature_nc.get_at(idx) != 0) - m_filpar[idx].precool_target_temp.second = config.filament_pre_cooling_temperature_nc.get_at(idx); - } - } - { - // Precool timing: (nozzle_temp - precool_temp) / hotend_cooling_rate - int extruder_count = m_is_multi_extruder ? 2 : 1; // H2C = 2 extruders - float nozzle_temp = float(config.nozzle_temperature.is_nil(idx) ? 0 : config.nozzle_temperature.get_at(idx)); - float nozzle_temp_fl = float(config.nozzle_temperature_initial_layer.is_nil(idx) ? nozzle_temp : config.nozzle_temperature_initial_layer.get_at(idx)); - m_filpar[idx].precool_t.first.resize(extruder_count, 0.f); - m_filpar[idx].precool_t.second.resize(extruder_count, 0.f); - m_filpar[idx].precool_t_first_layer.first.resize(extruder_count, 0.f); - m_filpar[idx].precool_t_first_layer.second.resize(extruder_count, 0.f); - std::vector cooling_rates = config.hotend_cooling_rate.values; - for (int i = 0; i < extruder_count && i < (int)cooling_rates.size(); i++) { - if (cooling_rates[i] < EPSILON) continue; - if (m_filpar[idx].precool_target_temp.first != 0) { - m_filpar[idx].precool_t.first[i] = std::max(0.f, nozzle_temp - float(m_filpar[idx].precool_target_temp.first)) / float(cooling_rates[i]); - m_filpar[idx].precool_t_first_layer.first[i] = std::max(0.f, nozzle_temp_fl - float(m_filpar[idx].precool_target_temp.first)) / float(cooling_rates[i]); - } - if (m_filpar[idx].precool_target_temp.second != 0) { - m_filpar[idx].precool_t.second[i] = std::max(0.f, nozzle_temp - float(m_filpar[idx].precool_target_temp.second)) / float(cooling_rates[i]); - m_filpar[idx].precool_t_first_layer.second[i] = std::max(0.f, nozzle_temp_fl - float(m_filpar[idx].precool_target_temp.second)) / float(cooling_rates[i]); - } - } - } - { - // Ramming travel time: .first = extruder change, .second = nozzle change (carousel) - m_filpar[idx].ramming_travel_time = {0.f, 0.f}; - if (!config.filament_ramming_travel_time.is_nil(idx)) - m_filpar[idx].ramming_travel_time.first = float(config.filament_ramming_travel_time.get_at(idx)); - if (!config.filament_ramming_travel_time_nc.is_nil(idx)) - m_filpar[idx].ramming_travel_time.second = float(config.filament_ramming_travel_time_nc.get_at(idx)); - } + //set precooling time/precooling target temp during extruder change and nozzle change + { + int extruder_count = m_multi_nozzle_group_result->get_extruder_count(); + m_filpar[idx].precool_t.first.resize(extruder_count, 0.f); + m_filpar[idx].precool_t_first_layer.first.resize(extruder_count, 0.f); + m_filpar[idx].precool_t.second.resize(extruder_count, 0.f); + m_filpar[idx].precool_t_first_layer.second.resize(extruder_count, 0.f); + m_filpar[idx].precool_target_temp.first = 0; + m_filpar[idx].precool_target_temp.second = 0; + float nozzle_temp_first_layer = config.nozzle_temperature_initial_layer.is_nil(idx) ? -1.f : float(config.nozzle_temperature_initial_layer.get_at(idx)); + float nozzle_temp_other_layer = config.nozzle_temperature.is_nil(idx) ? -1.f : float(config.nozzle_temperature.get_at(idx)); + std::vector hotend_cooling_rates = config.hotend_cooling_rate.values; + auto is_need_precooling = [&](bool extruder_change) -> bool + { + bool res = config.enable_pre_heating.value; + if (extruder_change) return res &&!config.filament_pre_cooling_temperature.is_nil(idx) && config.filament_pre_cooling_temperature.get_at(idx) != 0; + return res &&!config.filament_pre_cooling_temperature_nc.is_nil(idx) && config.filament_pre_cooling_temperature_nc.get_at(idx) != 0; + }; + if (is_need_precooling(true)) { + for (int i = 0; i < m_filpar[idx].precool_t.first.size(); i++) { + if (config.hotend_cooling_rate.is_nil(i)) continue; + m_filpar[idx].precool_t.first[i] = std::max(0.f, nozzle_temp_other_layer - float(config.filament_pre_cooling_temperature.get_at(idx))) / float(hotend_cooling_rates[i]); + m_filpar[idx].precool_t_first_layer.first[i] = std::max(0.f, nozzle_temp_first_layer -float(config.filament_pre_cooling_temperature.get_at(idx))) /float(hotend_cooling_rates[i]); + } + m_filpar[idx].precool_target_temp.first = config.filament_pre_cooling_temperature.get_at(idx); + } + + if (is_need_precooling(false)) { + for (int i = 0; i < m_filpar[idx].precool_t.second.size(); i++) { + if (config.hotend_cooling_rate.is_nil(i)) continue; + m_filpar[idx].precool_t.second[i] = std::max(0.f, nozzle_temp_other_layer - float(config.filament_pre_cooling_temperature_nc.get_at(idx))) / float(hotend_cooling_rates[i]); + m_filpar[idx].precool_t_first_layer.second[i] = std::max(0.f, nozzle_temp_first_layer -float(config.filament_pre_cooling_temperature_nc.get_at(idx))) /float(hotend_cooling_rates[i]); + } + m_filpar[idx].precool_target_temp.second = config.filament_pre_cooling_temperature_nc.get_at(idx); + } + + } + //set ramming reverse travel time during extruder change and nozzle change + { + m_filpar[idx].ramming_travel_time = {0, 0}; + if (!config.filament_ramming_travel_time.is_nil(idx)) m_filpar[idx].ramming_travel_time.first = float(config.filament_ramming_travel_time.get_at(idx)); + if (!config.filament_ramming_travel_time_nc.is_nil(idx)) m_filpar[idx].ramming_travel_time.second = float(config.filament_ramming_travel_time_nc.get_at(idx)); + } m_perimeter_width = nozzle_diameter * Width_To_Nozzle_Ratio; // all extruders are now assumed to have the same diameter - m_nozzle_change_perimeter_width = 2*m_perimeter_width; + // Orca: custom presets may use nozzle diameters outside the BBS table; fall back to the + // previous 2*perimeter_width rule (identical to the table for 0.4) instead of throwing. + { + auto nc_width_it = nozzle_diameter_to_nozzle_change_width.find(nozzle_diameter); + m_nozzle_change_perimeter_width = nc_width_it != nozzle_diameter_to_nozzle_change_width.end() ? nc_width_it->second : 2.f * m_perimeter_width; + } // BBS: remove useless config #if 0 if (m_semm) { @@ -1687,6 +1955,18 @@ void WipeTower::set_extruder(size_t idx, const PrintConfig& config) m_filpar[idx].retract_length = config.retraction_length.get_at(idx); m_filpar[idx].retract_speed = config.retraction_speed.get_at(idx); m_filpar[idx].wipe_dist = config.wipe_distance.get_at(idx); + m_filpar[idx].filament_cooling_before_tower = config.filament_cooling_before_tower.get_at(idx); + m_filpar[idx].filament_petg_pre_extrusion_offset_dist = config.filament_tower_interface_pre_extrusion_dist.get_at(idx); + if (config.enable_tower_interface_features.value) { + m_filpar[idx].filament_tower_interface_print_temp = config.filament_tower_interface_print_temp.get_at(idx) == -1 ? config.nozzle_temperature_range_high.get_at(idx) : + config.filament_tower_interface_print_temp.get_at(idx); + m_filpar[idx].filament_tower_interface_pre_extrusion_dist = config.filament_tower_interface_pre_extrusion_dist.get_at(idx); + m_filpar[idx].filament_tower_interface_pre_extrusion_length = config.filament_tower_interface_pre_extrusion_length.get_at(idx); + } else { + m_filpar[idx].filament_tower_interface_print_temp = config.nozzle_temperature.get_at(idx); + m_filpar[idx].filament_tower_interface_pre_extrusion_dist = 0.f; + m_filpar[idx].filament_tower_interface_pre_extrusion_length = 0.f; + } } @@ -1704,13 +1984,13 @@ std::vector WipeTower::prime( return std::vector(); } -Vec2f WipeTower::get_next_pos(const WipeTower::box_coordinates &cleaning_box, float wipe_length, bool interface_layer, size_t interface_tool) +Vec2f WipeTower::get_next_pos(const WipeTower::box_coordinates &cleaning_box, float wipe_length, bool solid_toolchange) { const float &xl = cleaning_box.ld.x(); const float &xr = cleaning_box.rd.x(); int line_count = wipe_length / (xr - xl); - float dy = m_layer_info->extra_spacing * m_perimeter_width; + float dy = m_layer_info->extra_spacing * get_block_gap_width(m_current_tool,false); float y_offset = float(line_count) * dy; const Vec2f pos_offset = Vec2f(0.f, m_depth_traversed); @@ -1733,23 +2013,20 @@ Vec2f WipeTower::get_next_pos(const WipeTower::box_coordinates &cleaning_box, fl break; default: break; } - // Shift the wipe start outward for a PETG pre-extrusion on filament-switcher devices, clamped to the - // shared printable bed. Gated on m_has_filament_switcher, which is false for the whole shipping fleet - // (no profile sets the key), so is_petg_pre_extrusion is always false and res is returned unchanged. - // The tower-interface contact branch is deliberately NOT applied here (enable_tower_interface_features - // DOES ship on H2C/X2D; applying it would change their g-code); is_contact_pre_extrusion is computed - // only as the guard that gives the contact path priority over PETG. - bool is_contact_pre_extrusion = interface_layer && m_enable_tower_interface_features; - bool is_petg_pre_extrusion = !is_contact_pre_extrusion && is_petg_filament(m_current_tool) && m_has_filament_switcher; - if (is_petg_pre_extrusion) { - Vec2f stop_pos = res; - float offset_dist = m_filpar[m_current_tool].petg_pre_extrusion_offset_dist; - auto printer_bbx = unscaled(get_extents(m_shared_print_bed)); // BoundingBoxBase - printer_bbx.translate((-m_wipe_tower_pos - m_rib_offset).cast()); + bool is_contact_pre_extrusion = solid_toolchange && m_enable_tower_interface_features; + bool is_petg_pre_extrusion = !is_contact_pre_extrusion && is_petg_filament(m_current_tool) && m_has_filament_switcher; + if (is_contact_pre_extrusion || is_petg_pre_extrusion) { + Vec2f stop_pos = res; + float filament_tower_interface_pre_extrusion_dist = is_petg_pre_extrusion + ? m_filpar[m_current_tool].filament_petg_pre_extrusion_offset_dist + : m_filpar[m_current_tool].filament_tower_interface_pre_extrusion_dist; + // Orca: unscaled(BoundingBox) here is a template returning BoundingBoxBase, not BoundingBoxf + auto printer_bbx = unscaled(get_extents(m_shared_print_bed)); + printer_bbx.translate((-m_wipe_tower_pos - m_rib_offset).cast()); // first layer never be contact if (stop_pos.x() < m_wipe_tower_width / 2.f) - stop_pos = Vec2f(stop_pos.x() - offset_dist, stop_pos.y()); + stop_pos = Vec2f(stop_pos.x() - filament_tower_interface_pre_extrusion_dist, stop_pos.y()); else - stop_pos = Vec2f(stop_pos.x() + offset_dist, stop_pos.y()); + stop_pos = Vec2f(stop_pos.x() + filament_tower_interface_pre_extrusion_dist, stop_pos.y()); if (stop_pos.x() < printer_bbx.min[0]) stop_pos.x() = printer_bbx.min[0]; if (stop_pos.x() > printer_bbx.max[0]) stop_pos.x() = printer_bbx.max[0]; res = stop_pos; @@ -1759,10 +2036,11 @@ Vec2f WipeTower::get_next_pos(const WipeTower::box_coordinates &cleaning_box, fl WipeTower::ToolChangeResult WipeTower::tool_change(size_t tool, bool extrude_perimeter, bool first_toolchange_to_nonsoluble) { - m_nozzle_change_result.gcode.clear(); - if (!m_filament_map.empty() && tool < m_filament_map.size() && m_filament_map[m_current_tool] != m_filament_map[tool]) { - m_nozzle_change_result = nozzle_change(m_current_tool, tool); - } + //only for tool = unsigned (-1) ,never get here + //m_nozzle_change_result.gcode.clear(); + //if (!m_filament_map.empty() && tool < m_filament_map.size() && m_filament_map[m_current_tool] != m_filament_map[tool]) { + // m_nozzle_change_result = nozzle_change(m_current_tool, tool); + //} size_t old_tool = m_current_tool; @@ -1792,7 +2070,7 @@ WipeTower::ToolChangeResult WipeTower::tool_change(size_t tool, bool extrude_per (tool != (unsigned int)(-1) ? wipe_depth + m_depth_traversed - m_perimeter_width : m_wipe_tower_depth - m_perimeter_width)); - WipeTowerWriter writer(m_layer_height, m_perimeter_width, m_gcode_flavor, m_filpar); + WipeTowerWriter writer(m_layer_height, m_perimeter_width, m_gcode_flavor, m_filpar, m_enable_arc_fitting); writer.set_extrusion_flow(m_extrusion_flow) .set_z(m_z_pos) .set_initial_tool(m_current_tool) @@ -1801,13 +2079,14 @@ WipeTower::ToolChangeResult WipeTower::tool_change(size_t tool, bool extrude_per "; CP TOOLCHANGE START\n") .comment_with_value(" toolchange #", m_num_tool_changes + 1); // the number is zero-based + set_for_wipe_tower_writer(writer); if (tool != (unsigned)(-1)) writer.append(std::string("; material : " + (m_current_tool < m_filpar.size() ? m_filpar[m_current_tool].material : "(NONE)") + " -> " + m_filpar[tool].material + "\n").c_str()) .append(";--------------------\n"); writer.speed_override_backup(); - writer.speed_override(100); + writer.speed_override(100); float feedrate = is_first_layer() ? std::min(m_first_layer_speed * 60.f, 5400.f) : std::min(60.0f * m_filpar[m_current_tool].max_e_speed / m_extrusion_flow, 5400.f); @@ -1857,7 +2136,7 @@ WipeTower::ToolChangeResult WipeTower::tool_change(size_t tool, bool extrude_per } } - Vec2f initial_position = get_next_pos(cleaning_box, wipe_length, false, tool); + Vec2f initial_position = get_next_pos(cleaning_box, wipe_length,false); writer.set_initial_position(initial_position, m_wipe_tower_width, m_wipe_tower_depth, m_internal_rotation); if (extrude_perimeter) { @@ -1901,7 +2180,7 @@ WipeTower::ToolChangeResult WipeTower::tool_change(size_t tool, bool extrude_per //BBS //if (m_set_extruder_trimpot) // writer.set_extruder_trimpot(550); // Reset the extruder current to a normal value. - writer.speed_override_restore(); + writer.speed_override_restore(); writer.feedrate(m_travel_speed * 60.f) .flush_planner_queue() .reset_extruder() @@ -1913,9 +2192,9 @@ WipeTower::ToolChangeResult WipeTower::tool_change(size_t tool, bool extrude_per if (m_current_tool < m_used_filament_length.size()) m_used_filament_length[m_current_tool] += writer.get_and_reset_used_filament_length(); - return construct_tcr(writer, false, old_tool, false, true, purge_volume, false); + return construct_tcr(writer, false, old_tool, false, true, purge_volume,false); } - +#if 0 WipeTower::NozzleChangeResult WipeTower::nozzle_change(int old_filament_id, int new_filament_id) { float wipe_depth = 0.f; @@ -1940,18 +2219,27 @@ WipeTower::NozzleChangeResult WipeTower::nozzle_change(int old_filament_id, int // Otherwise we are going to Unload only. And m_layer_info would be invalid. } + auto format_nozzle_change_line = [](bool start, int old_filament_id, int new_filament_id)->std::string { + char buff[64]; + std::string tag = start ? GCodeProcessor::reserved_tag(GCodeProcessor::ETags::NozzleChangeStart) : GCodeProcessor::reserved_tag(GCodeProcessor::ETags::NozzleChangeEnd); + snprintf(buff, sizeof(buff), ";%s OF%d NF%d\n", tag.c_str(), old_filament_id, new_filament_id); + return std::string(buff); + }; + float nozzle_change_speed = 60.0f * m_filpar[m_current_tool].max_e_speed / m_extrusion_flow; if (is_tpu_filament(m_current_tool)) { nozzle_change_speed *= 0.25; } - WipeTowerWriter writer(m_layer_height, m_perimeter_width, m_gcode_flavor, m_filpar); + WipeTowerWriter writer(m_layer_height, m_perimeter_width, m_gcode_flavor, m_filpar, m_enable_arc_fitting); writer.set_extrusion_flow(m_extrusion_flow) .set_z(m_z_pos) .set_initial_tool(m_current_tool) .set_extrusion_flow(m_extrusion_flow) .set_y_shift(m_y_shift + (new_filament_id != (unsigned int) (-1) && (m_current_shape == SHAPE_REVERSED) ? m_layer_info->depth - m_layer_info->toolchanges_depth() : 0.f)) - .append(format_nozzle_change_tag(true, old_filament_id, new_filament_id)); + .append(format_nozzle_change_line(true,old_filament_id,new_filament_id)); + + set_for_wipe_tower_writer(writer); box_coordinates cleaning_box(Vec2f(m_perimeter_width, m_perimeter_width), m_wipe_tower_width - 2 * m_perimeter_width, (new_filament_id != (unsigned int) (-1) ? wipe_depth + m_depth_traversed - m_perimeter_width : m_wipe_tower_depth - m_perimeter_width)); @@ -2027,14 +2315,14 @@ WipeTower::NozzleChangeResult WipeTower::nozzle_change(int old_filament_id, int } } - writer.append(format_nozzle_change_tag(false, old_filament_id, new_filament_id)); + writer.append(format_nozzle_change_line(false, old_filament_id, new_filament_id)); result.start_pos = writer.start_pos_rotated(); result.end_pos = writer.pos(); - result.gcode = std::move(writer.gcode()); + result.gcode = writer.gcode(); return result; } - +#endif // Ram the hot material out of the melt zone, retract the filament into the cooling tubes and let it cool. void WipeTower::toolchange_Unload( WipeTowerWriter &writer, @@ -2248,12 +2536,12 @@ void WipeTower::toolchange_Wipe( float wipe_length) { // Increase flow on first layer, slow down print. - writer.set_extrusion_flow(m_extrusion_flow * (is_first_layer() ? 1.15f : 1.f)) + writer.set_extrusion_flow(m_extrusion_flow * (is_first_layer() ? m_first_layer_flow_ratio : 1.f)) .append("; CP TOOLCHANGE WIPE\n"); // BBS: add the note for gcode-check, when the flow changed, the width should follow the change if (is_first_layer()) { - writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Width) + std::to_string(1.15 * m_perimeter_width) + "\n"); + writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Width) + std::to_string(m_first_layer_flow_ratio * m_perimeter_width) + "\n"); } const float& xl = cleaning_box.ld.x(); @@ -2287,7 +2575,7 @@ void WipeTower::toolchange_Wipe( if (m_depth_traversed != 0) writer.travel(xl, writer.y() + dy); #endif - + bool need_change_flow = false; // now the wiping itself: for (int i = 0; true; ++i) { @@ -2382,6 +2670,21 @@ WipeTower::box_coordinates WipeTower::align_perimeter(const WipeTower::box_coord return aligned_box; } +void WipeTower::set_for_wipe_tower_writer(WipeTowerWriter &writer) +{ + writer.set_normal_acceleration(m_normal_accels); + writer.set_travel_acceleration(m_travel_accels); + writer.set_first_layer_normal_acceleration(m_first_layer_normal_accels); + writer.set_first_layer_travel_acceleration(m_first_layer_travel_accels); + writer.set_max_acceleration(m_max_accels); + writer.set_multi_nozzle_group_result(m_multi_nozzle_group_result); + writer.set_accel_to_decel_enable(m_accel_to_decel_enable); + writer.set_accel_to_decel_factor(m_accel_to_decel_factor); + writer.set_first_layer(m_cur_layer_id == 0); + writer.set_layer_id(m_cur_layer_id); + writer.set_physical_extruder_map(m_physical_extruder_map); +} +#if 0 WipeTower::ToolChangeResult WipeTower::finish_layer(bool extrude_perimeter, bool extruder_fill) { assert(! this->layer_finished()); @@ -2389,20 +2692,20 @@ WipeTower::ToolChangeResult WipeTower::finish_layer(bool extrude_perimeter, bool size_t old_tool = m_current_tool; - WipeTowerWriter writer(m_layer_height, m_perimeter_width, m_gcode_flavor, m_filpar); + WipeTowerWriter writer(m_layer_height, m_perimeter_width, m_gcode_flavor, m_filpar, m_enable_arc_fitting); writer.set_extrusion_flow(m_extrusion_flow) .set_z(m_z_pos) .set_initial_tool(m_current_tool) .set_y_shift(m_y_shift - (m_current_shape == SHAPE_REVERSED ? m_layer_info->toolchanges_depth() : 0.f)); + set_for_wipe_tower_writer(writer); + writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Wipe_Tower_Start) + "\n"); // Slow down on the 1st layer. bool first_layer = is_first_layer(); // BBS: speed up perimeter speed to 90mm/s for non-first layer float feedrate = first_layer ? std::min(m_first_layer_speed * 60.f, 5400.f) : std::min(60.0f * m_filpar[m_current_tool].max_e_speed / m_extrusion_flow, 5400.f); - if (m_enable_tower_interface_features && m_prev_layer_had_interface) - feedrate = std::min(feedrate, 20.f * 60.f); float fill_box_y = m_layer_info->toolchanges_depth() + m_perimeter_width; box_coordinates fill_box(Vec2f(m_perimeter_width, fill_box_y), m_wipe_tower_width - 2 * m_perimeter_width, m_layer_info->depth - fill_box_y); @@ -2545,12 +2848,40 @@ WipeTower::ToolChangeResult WipeTower::finish_layer(bool extrude_perimeter, bool if (m_current_tool < m_used_filament_length.size()) m_used_filament_length[m_current_tool] += writer.get_and_reset_used_filament_length(); - return construct_tcr(writer, false, old_tool, true, false, 0.f, false); + return construct_tcr(writer, false, old_tool, true, false, 0.f,false); +} +#endif +WipeTower::WipeTowerInfo::ToolChange WipeTower::set_toolchange(int old_tool, int new_tool, float layer_height, float wipe_volume, float purge_volume,int layer_id) +{ + float depth = 0.f; + float width = m_wipe_tower_width - 2 * m_perimeter_width; + float nozzle_change_width = m_wipe_tower_width - (m_nozzle_change_perimeter_width + m_perimeter_width); + float length_to_extrude = volume_to_length(wipe_volume, m_perimeter_width, layer_height); + float toolchange_gap_width = get_block_gap_width(new_tool,false); + float nozzlechange_gap_width = get_block_gap_width(old_tool,true); + float filament_change_length = !is_same_extruder(old_tool, new_tool, layer_id) ? m_filaments_change_length.first[old_tool] : m_filaments_change_length.second[old_tool]; + depth += std::ceil(length_to_extrude / width) * toolchange_gap_width; + // depth *= m_extra_spacing; + + float nozzle_change_depth = 0; + float nozzle_change_length = 0; + if (is_need_ramming(old_tool, new_tool, layer_id)) { + double e_flow = nozzle_change_extrusion_flow(layer_height); + double length = filament_change_length / e_flow; + int nozzle_change_line_count = std::ceil(length / nozzle_change_width); + nozzle_change_depth = nozzle_change_line_count * nozzlechange_gap_width; + depth += nozzle_change_depth; + nozzle_change_length = length; + } + WipeTowerInfo::ToolChange tool_change = WipeTowerInfo::ToolChange(old_tool, new_tool, depth, 0.f, 0.f, wipe_volume, length_to_extrude, purge_volume); + tool_change.nozzle_change_depth = nozzle_change_depth; + tool_change.nozzle_change_length = nozzle_change_length; + return tool_change; } // Appends a toolchange into m_plan and calculates neccessary depth of the corresponding box void WipeTower::plan_toolchange(float z_par, float layer_height_par, unsigned int old_tool, - unsigned int new_tool, float wipe_volume, float purge_volume) + unsigned int new_tool, float wipe_volume_ec,float wipe_volume_nc,float purge_volume) { assert(m_plan.empty() || m_plan.back().z <= z_par + WT_EPSILON); // refuses to add a layer below the last one @@ -2570,7 +2901,8 @@ void WipeTower::plan_toolchange(float z_par, float layer_height_par, unsigned in // BBS: if the wipe tower width is too small, the depth will be infinity if (width <= EPSILON) return; - + int layer_id = static_cast(m_plan.size()) - 1; + float wipe_volume = is_same_extruder(old_tool, new_tool, layer_id) && !is_same_nozzle(old_tool, new_tool, layer_id) ? wipe_volume_nc : wipe_volume_ec; // BBS: remove old filament ramming and first line #if 0 float length_to_extrude = volume_to_length(0.25f * std::accumulate(m_filpar[old_tool].ramming_speed.begin(), m_filpar[old_tool].ramming_speed.end(), 0.f), @@ -2592,39 +2924,24 @@ void WipeTower::plan_toolchange(float z_par, float layer_height_par, unsigned in depth += std::ceil(length_to_extrude / width) * m_perimeter_width; //depth *= m_extra_spacing; - + float filament_change_length = !is_same_extruder(old_tool, new_tool, layer_id) ? m_filaments_change_length.first[old_tool] : m_filaments_change_length.second[old_tool]; float nozzle_change_depth = 0; - if (!m_filament_map.empty() && m_filament_map[old_tool] != m_filament_map[new_tool]) { + float nozzle_change_length = 0; + if (is_need_ramming(old_tool, new_tool, layer_id)) { double e_flow = nozzle_change_extrusion_flow(layer_height_par); - double length = m_filaments_change_length[old_tool] / e_flow; - int nozzle_change_line_count = length / (m_wipe_tower_width - 2*m_nozzle_change_perimeter_width) + 1; - if (has_tpu_filament()) - nozzle_change_depth = m_tpu_fixed_spacing * nozzle_change_line_count * m_nozzle_change_perimeter_width; - else - nozzle_change_depth = nozzle_change_line_count * m_nozzle_change_perimeter_width; - depth += nozzle_change_depth; - } - if (nozzle_change_depth == 0 - && !m_filament_nozzle_map.empty() - && old_tool < m_filament_nozzle_map.size() && new_tool < m_filament_nozzle_map.size() - && m_filament_nozzle_map[old_tool] != m_filament_nozzle_map[new_tool]) { - double e_flow = nozzle_change_extrusion_flow(layer_height_par); - double length = m_filaments_change_length[old_tool] / e_flow; - int nozzle_change_line_count = length / (m_wipe_tower_width - 2*m_nozzle_change_perimeter_width) + 1; - if (has_tpu_filament()) - nozzle_change_depth = m_tpu_fixed_spacing * nozzle_change_line_count * m_nozzle_change_perimeter_width; - else - nozzle_change_depth = nozzle_change_line_count * m_nozzle_change_perimeter_width; + double length = filament_change_length / e_flow; + int nozzle_change_line_count = std::ceil(length / (m_wipe_tower_width - 2*m_nozzle_change_perimeter_width)); + nozzle_change_depth = nozzle_change_line_count * m_nozzle_change_perimeter_width; depth += nozzle_change_depth; + nozzle_change_length = length; } WipeTowerInfo::ToolChange tool_change = WipeTowerInfo::ToolChange(old_tool, new_tool, depth, 0.f, 0.f, wipe_volume, length_to_extrude, purge_volume); tool_change.nozzle_change_depth = nozzle_change_depth; + tool_change.nozzle_change_length = nozzle_change_length; m_plan.back().tool_changes.push_back(tool_change); #endif } - - - +#if 0 void WipeTower::plan_tower() { // BBS @@ -2755,7 +3072,7 @@ void WipeTower::save_on_last_wipe() } } } - +#endif bool WipeTower::is_tpu_filament(int filament_id) const { return m_filpar[filament_id].material == "TPU"; @@ -2766,11 +3083,11 @@ bool WipeTower::is_petg_filament(int filament_id) const return m_filpar[filament_id].material == "PETG"; } -bool WipeTower::is_need_reverse_travel(int filament_id, bool extruder_change) const +bool WipeTower::is_need_reverse_travel(int filament_id,bool extruder_change) const { if (extruder_change) - return m_filpar[filament_id].ramming_travel_time.first > EPSILON; - return m_filpar[filament_id].ramming_travel_time.second > EPSILON; + return m_filpar[filament_id].ramming_travel_time.first > EPSILON && m_filaments_change_length.first[filament_id]>EPSILON; + return m_filpar[filament_id].ramming_travel_time.second > EPSILON && m_filaments_change_length.second[filament_id] > EPSILON; } // BBS: consider both soluable and support properties @@ -2785,15 +3102,13 @@ int WipeTower::first_toolchange_to_nonsoluble_nonsupport( return -1; } -static WipeTower::ToolChangeResult merge_tcr(WipeTower::ToolChangeResult& first, - WipeTower::ToolChangeResult& second) +WipeTower::ToolChangeResult WipeTower::merge_tcr(ToolChangeResult &first, ToolChangeResult &second) { assert(first.new_tool == second.initial_tool); WipeTower::ToolChangeResult out = first; - out.is_contact = first.is_contact || second.is_contact; if ((first.end_pos - second.start_pos).norm() > (float)EPSILON) { std::string travel_gcode = "G1 X" + Slic3r::float_to_string_decimal_point(second.start_pos.x(), 3) + " Y" + - Slic3r::float_to_string_decimal_point(second.start_pos.y(), 3) + " F5400" + "\n"; + Slic3r::float_to_string_decimal_point(second.start_pos.y(), 3) + " F" + std::to_string(m_max_speed) + "\n"; bool need_insert_travel = true; if (second.is_tool_change && is_approx(second.start_pos.x(), second.tool_change_start_pos.x()) @@ -2811,7 +3126,7 @@ static WipeTower::ToolChangeResult merge_tcr(WipeTower::ToolChangeResult& first, out.wipe_path = second.wipe_path; out.initial_tool = first.initial_tool; out.new_tool = second.new_tool; - + out.is_contact = first.is_contact || second.is_contact; if (!first.nozzle_change_result.gcode.empty()) out.nozzle_change_result = first.nozzle_change_result; else if (!second.nozzle_change_result.gcode.empty()) @@ -2834,75 +3149,108 @@ static WipeTower::ToolChangeResult merge_tcr(WipeTower::ToolChangeResult& first, return out; } -void WipeTower::get_wall_skip_points(const WipeTowerInfo &layer) -{ +void WipeTower::get_all_wall_skip_points() { m_wall_skip_points.clear(); + m_wall_skip_points.resize(m_plan.size()); + for (int i = 0; i < m_plan.size(); i++) { + const WipeTowerInfo &layer = m_plan[i]; + get_wall_skip_points(m_plan[i],i); + } +} + + +void WipeTower::get_wall_skip_points(const WipeTowerInfo &layer, int layer_id) +{ + const int pre_access_layer = 4; std::unordered_map cur_block_depth; for (int i = 0; i < int(layer.tool_changes.size()); ++i) { const WipeTowerInfo::ToolChange &tool_change = layer.tool_changes[i]; size_t old_filament = tool_change.old_tool; size_t new_filament = tool_change.new_tool; - float spacing = m_layer_info->extra_spacing; - if (has_tpu_filament() && m_layer_info->extra_spacing < m_tpu_fixed_spacing) spacing = 1; - float nozzle_change_depth = tool_change.nozzle_change_depth * spacing; - // Drop the nozzle-change depth on an extruder's final layer above its printable height - // (inert unless is_valid_last_layer clamps, i.e. multi-extruder near Z-max). - if (!is_valid_last_layer(old_filament, m_cur_layer_id, layer.z)) nozzle_change_depth = 0.f; - //float nozzle_change_depth = tool_change.nozzle_change_depth * (has_tpu_filament() ? m_tpu_fixed_spacing : layer.extra_spacing); - auto* block = get_block_by_category(m_filpar[new_filament].category, false); - if (!block) - continue; - //float wipe_depth = tool_change.required_depth - nozzle_change_depth; - float wipe_depth = ceil(tool_change.wipe_length / (m_wipe_tower_width - 2 * m_perimeter_width)) * m_perimeter_width*layer.extra_spacing; - float process_depth = 0.f; - if (!cur_block_depth.count(m_filpar[new_filament].category)) - cur_block_depth[m_filpar[new_filament].category] = block->start_depth; + float nozzle_change_depth = tool_change.nozzle_change_depth; + float wipe_depth = tool_change.required_depth - nozzle_change_depth; + if (!is_valid_last_layer(old_filament, layer_id, m_plan[layer_id].z)) nozzle_change_depth = 0.f; + auto *block = get_block_by_category(m_filpar[new_filament].category, false); + if (!block) continue; + float process_depth = 0.f; + if (!cur_block_depth.count(m_filpar[new_filament].category)) cur_block_depth[m_filpar[new_filament].category] = block->start_depth; process_depth = cur_block_depth[m_filpar[new_filament].category]; - if (!m_filament_map.empty() && new_filament < m_filament_map.size() && m_filament_map[old_filament] != m_filament_map[new_filament]) { + if (is_need_ramming(new_filament, old_filament, layer_id)) { if (m_filament_categories[new_filament] == m_filament_categories[old_filament]) process_depth += nozzle_change_depth; else { if (!cur_block_depth.count(m_filpar[old_filament].category)) { - auto* old_block = get_block_by_category(m_filpar[old_filament].category, false); - if (!old_block) - continue; + auto *old_block = get_block_by_category(m_filpar[old_filament].category, false); + if (!old_block) continue; cur_block_depth[m_filpar[old_filament].category] = old_block->start_depth; } cur_block_depth[m_filpar[old_filament].category] += nozzle_change_depth; } } - { - Vec2f res; - int index = m_cur_layer_id % 4; - switch (index % 4) { - case 0: res = Vec2f(0, process_depth); break; - case 1: res = Vec2f(m_wipe_tower_width, process_depth + wipe_depth - layer.extra_spacing*m_perimeter_width); break; - case 2: res = Vec2f(m_wipe_tower_width, process_depth); break; - case 3: res = Vec2f(0, process_depth + wipe_depth - layer.extra_spacing * m_perimeter_width); break; - default: break; - } - m_wall_skip_points.emplace_back(res); + float infill_gap_width = get_block_gap_width(new_filament, false); + Vec2f res; + int index = layer_id % 4; + switch (index % 4) { + case 0: res = Vec2f(0, process_depth); break; + case 1: res = Vec2f(m_wipe_tower_width, process_depth + wipe_depth - m_plan[layer_id].extra_spacing * infill_gap_width); break; + case 2: res = Vec2f(m_wipe_tower_width, process_depth); break; + case 3: res = Vec2f(0, process_depth + wipe_depth - m_plan[layer_id].extra_spacing * infill_gap_width); break; + default: break; + } + + m_wall_skip_points[layer_id].emplace_back(res); + + cur_block_depth[m_filpar[new_filament].category] = process_depth + wipe_depth; + + bool solid_toolchange = block->layers_type[layer_id] == WipeTowerLayerType::Contact; + if (solid_toolchange && m_enable_tower_interface_features) { + for (int j = 0; j < pre_access_layer; j++) { + int pre_layer_id = layer_id - j; + if (pre_layer_id < 0) break; + m_wall_skip_points[pre_layer_id].push_back(res); + } } - cur_block_depth[m_filpar[new_filament].category] = process_depth + tool_change.required_depth - tool_change.nozzle_change_depth * layer.extra_spacing; } + if (m_enable_tower_interface_features) { + for (auto &block : m_wipe_tower_blocks) { + float block_depth = cur_block_depth.count(block.filament_adhesiveness_category) ? cur_block_depth[block.filament_adhesiveness_category] : block.start_depth; + if (block_depth + EPSILON >= block.start_depth + block.layer_depths[layer_id] - m_perimeter_width) { continue; } + bool block_solid = block.layers_type[layer_id] == WipeTowerLayerType::Contact; + bool add_skip_point = block_solid && std::abs(block_depth - block.start_depth) < EPSILON; + if (add_skip_point) { + Vec2f res; + int index = layer_id % 4; + + float dy_skip = block.layer_depths[layer_id] - m_perimeter_width; + int n_skip = (int) ((dy_skip + 0.25f * m_perimeter_width) / m_perimeter_width + 1); + float gird_depth = m_perimeter_width * (n_skip - 1); // in sync with finish_block_solid + switch (index % 4) { + case 0: res = Vec2f(0, block_depth); break; + case 1: res = Vec2f(m_wipe_tower_width, block_depth + gird_depth); break; + case 2: res = Vec2f(m_wipe_tower_width, block_depth); break; + case 3: res = Vec2f(0, block_depth + gird_depth); break; + default: break; + } + m_wall_skip_points[layer_id].emplace_back(res); + for (int j = 0; j < pre_access_layer; j++) { + int pre_layer_id = layer_id - j; + if (pre_layer_id < 0) break; + m_wall_skip_points[pre_layer_id].push_back(res); + } + } + } } +} WipeTower::ToolChangeResult WipeTower::tool_change_new(size_t new_tool, bool solid_toolchange,bool solid_nozzlechange) { m_nozzle_change_result.gcode.clear(); - // Skip the cross-extruder nozzle change (ramming) on an extruder's final layer above its printable - // height. is_valid_last_layer is inert unless multi-extruder near Z-max. - if (!m_filament_map.empty() && new_tool < m_filament_map.size() && m_filament_map[m_current_tool] != m_filament_map[new_tool] - && is_valid_last_layer(m_current_tool, m_cur_layer_id, m_z_pos)) { - m_nozzle_change_result = nozzle_change_new(m_current_tool, new_tool, solid_nozzlechange); - } - if (m_nozzle_change_result.gcode.empty() - && !m_filament_nozzle_map.empty() - && m_current_tool < m_filament_nozzle_map.size() && new_tool < m_filament_nozzle_map.size() - && m_filament_nozzle_map[m_current_tool] != m_filament_nozzle_map[new_tool] - && is_valid_last_layer(m_current_tool, m_cur_layer_id, m_z_pos)) { - m_nozzle_change_result = nozzle_change_new(m_current_tool, new_tool, solid_nozzlechange); + bool hotend_change = false; + if (is_need_ramming(m_current_tool,new_tool, m_cur_layer_id)) { + hotend_change = is_same_extruder(m_current_tool, new_tool, m_cur_layer_id); + //If it is the last layer and exceeds the printable height, cancel ramming + if (is_valid_last_layer(m_current_tool, m_cur_layer_id, m_z_pos)) m_nozzle_change_result = ramming(m_current_tool, new_tool, solid_nozzlechange, !hotend_change); } size_t old_tool = m_current_tool; @@ -2919,32 +3267,19 @@ WipeTower::ToolChangeResult WipeTower::tool_change_new(size_t new_tool, bool sol wipe_depth = b.required_depth; purge_volume = b.purge_volume; nozzle_change_depth = b.nozzle_change_depth; - if (has_tpu_filament()) - nozzle_change_line_count = ((b.nozzle_change_depth + WT_EPSILON) / m_nozzle_change_perimeter_width) / 2; - else - nozzle_change_line_count = (b.nozzle_change_depth + WT_EPSILON) / m_nozzle_change_perimeter_width; break; } } - - bool interface_layer = solid_toolchange && m_enable_tower_interface_features; - if (interface_layer && new_tool < m_filpar.size()) { - float extra_purge_length = m_filpar[new_tool].tower_interface_purge_length; - if (extra_purge_length > 0.f) { - purge_volume += extra_purge_length * m_filpar[new_tool].filament_area; - wipe_length += extra_purge_length; - } - } - + m_current_tool = new_tool; WipeTowerBlock* block = get_block_by_category(m_filpar[new_tool].category, false); if (!block) { assert(block != nullptr); return WipeTower::ToolChangeResult(); } m_cur_block = block; - box_coordinates cleaning_box(Vec2f(m_perimeter_width, block->cur_depth), m_wipe_tower_width - 2 * m_perimeter_width, wipe_depth-m_layer_info->extra_spacing*nozzle_change_depth); + box_coordinates cleaning_box(Vec2f(m_perimeter_width, block->cur_depth), m_wipe_tower_width - 2 * m_perimeter_width, wipe_depth-nozzle_change_depth); - WipeTowerWriter writer(m_layer_height, m_perimeter_width, m_gcode_flavor, m_filpar); + WipeTowerWriter writer(m_layer_height, m_perimeter_width, m_gcode_flavor, m_filpar, m_enable_arc_fitting); writer.set_extrusion_flow(m_extrusion_flow) .set_z(m_z_pos) .set_initial_tool(m_current_tool) @@ -2953,6 +3288,8 @@ WipeTower::ToolChangeResult WipeTower::tool_change_new(size_t new_tool, bool sol "; CP TOOLCHANGE START\n") .comment_with_value(" toolchange #", m_num_tool_changes + 1); // the number is zero-based + set_for_wipe_tower_writer(writer); + if (new_tool != (unsigned) (-1)) writer.append( std::string("; material : " + (m_current_tool < m_filpar.size() ? m_filpar[m_current_tool].material : "(NONE)") + " -> " + m_filpar[new_tool].material + "\n").c_str()) .append(";--------------------\n"); @@ -2962,7 +3299,7 @@ WipeTower::ToolChangeResult WipeTower::tool_change_new(size_t new_tool, bool sol // Ram the hot material out of the melt zone, retract the filament into the cooling tubes and let it cool. if (new_tool != (unsigned int) -1) { // This is not the last change. - Vec2f initial_position = get_next_pos(cleaning_box, wipe_length, interface_layer, new_tool); + Vec2f initial_position = get_next_pos(cleaning_box, wipe_length, solid_toolchange); writer.set_initial_position(initial_position, m_wipe_tower_width, m_wipe_tower_depth, m_internal_rotation); writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Wipe_Tower_Start) + "\n"); @@ -2970,25 +3307,8 @@ WipeTower::ToolChangeResult WipeTower::tool_change_new(size_t new_tool, bool sol is_first_layer() ? m_filpar[new_tool].nozzle_temperature_initial_layer : m_filpar[new_tool].nozzle_temperature); toolchange_Change(writer, new_tool, m_filpar[new_tool].material); // Change the tool, set a speed override for soluble and flex materials. toolchange_Load(writer, cleaning_box); - - int base_temp = is_first_layer() ? m_filpar[new_tool].nozzle_temperature_initial_layer : m_filpar[new_tool].nozzle_temperature; - if (interface_layer) { - int interface_temp = m_filpar[new_tool].interface_print_temperature; - if (interface_temp > 0 && interface_temp != base_temp) - writer.set_extruder_temp(interface_temp, true); - if (m_enable_tower_interface_cooldown_during_tower && interface_temp > 0 && interface_temp != base_temp) - writer.set_extruder_temp(base_temp, false); - float pre_dist = m_filpar[new_tool].tower_interface_pre_extrusion_dist; - float pre_len = m_filpar[new_tool].tower_interface_pre_extrusion_length; - if (pre_dist > 0.f && pre_len > 0.f) { - bool start_left = (m_cur_layer_id % 4 == 0 || m_cur_layer_id % 4 == 3); - float target_x = writer.x() + (start_left ? pre_dist : -pre_dist); - target_x = std::max(cleaning_box.ld.x(), std::min(cleaning_box.rd.x(), target_x)); - writer.extrude_explicit(target_x, writer.y(), pre_len, 600.f); - } - } - - if (m_is_multi_extruder && is_tpu_filament(new_tool)) { +# if 0 + if (m_is_multi_extruder && is_need_reverse_travel(new_tool)) { float dy = m_layer_info->extra_spacing * m_nozzle_change_perimeter_width; if (m_layer_info->extra_spacing < m_tpu_fixed_spacing) { dy = m_tpu_fixed_spacing * m_nozzle_change_perimeter_width; @@ -3019,22 +3339,15 @@ WipeTower::ToolChangeResult WipeTower::tool_change_new(size_t new_tool, bool sol } writer.travel(initial_position); } - +#endif toolchange_wipe_new(writer, cleaning_box, wipe_length, solid_toolchange); - if (interface_layer) { - int base_temp = is_first_layer() ? m_filpar[new_tool].nozzle_temperature_initial_layer : m_filpar[new_tool].nozzle_temperature; - int interface_temp = m_filpar[new_tool].interface_print_temperature; - if (!m_enable_tower_interface_cooldown_during_tower && interface_temp > 0 && interface_temp != base_temp) - writer.set_extruder_temp(base_temp, false); - } - writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Wipe_Tower_End) + "\n"); ++m_num_tool_changes; } else toolchange_Unload(writer, cleaning_box, m_filpar[m_current_tool].material, m_filpar[m_current_tool].nozzle_temperature); - block->cur_depth += (wipe_depth - nozzle_change_depth * m_layer_info->extra_spacing); + block->cur_depth += (wipe_depth - nozzle_change_depth); block->last_filament_change_id = new_tool; // BBS @@ -3050,192 +3363,187 @@ WipeTower::ToolChangeResult WipeTower::tool_change_new(size_t new_tool, bool sol if (m_current_tool < m_used_filament_length.size()) m_used_filament_length[m_current_tool] += writer.get_and_reset_used_filament_length(); - return construct_tcr(writer, false, old_tool, false, true, purge_volume, interface_layer); + return construct_tcr(writer, false, old_tool, false, true, purge_volume, solid_toolchange); } -WipeTower::NozzleChangeResult WipeTower::nozzle_change_new(int old_filament_id, int new_filament_id, bool solid_infill) +//for extruder change and nozzle change +WipeTower::NozzleChangeResult WipeTower::ramming(int old_filament_id, int new_filament_id, bool solid_infill, bool extruder_change) { + auto format_line_M106 = []() { return std::string{"M106 S255\n"};}; + auto format_line_M633 = []() { return std::string{"M633\n"};}; + auto format_line_M632 = [](int filament_id, int nozzle_id) { + std::string buffer = "M632 S" + std::to_string(filament_id); + if (nozzle_id >= 0) + buffer += " H" + std::to_string(nozzle_id); + buffer += " M N\n"; + return buffer; + }; + int nozzle_change_line_count = 0; + float x_offset = m_perimeter_width + (m_nozzle_change_perimeter_width - m_perimeter_width) / 2; + float nozzle_change_box_width = m_wipe_tower_width - 2 * x_offset; + float nozzle_change_depth = 0.f; if (new_filament_id != (unsigned int) (-1)) { for (const auto &b : m_layer_info->tool_changes) if (b.new_tool == new_filament_id) { - if (has_tpu_filament()) - nozzle_change_line_count = ((b.nozzle_change_depth + WT_EPSILON) / m_nozzle_change_perimeter_width) / 2; - else - nozzle_change_line_count = (b.nozzle_change_depth + WT_EPSILON) / m_nozzle_change_perimeter_width; + nozzle_change_line_count = std::ceil(b.nozzle_change_length / nozzle_change_box_width); + nozzle_change_depth = b.nozzle_change_depth; break; } } + auto format_nozzle_change_line = [this](bool start, int old_filament_id, int new_filament_id) -> std::string { + char buff[64]; + // Orca: the nozzle-change markers are standalone tag constants, not ETags entries + // (the Reserved_Tags parallel arrays have a non-BBL variant that must stay aligned). + std::string tag = start ? GCodeProcessor::Nozzle_Change_Start_Tag : GCodeProcessor::Nozzle_Change_End_Tag; + int old_nozzle_id = get_nozzle_id(old_filament_id, m_cur_layer_id); + int new_nozzle_id = get_nozzle_id(new_filament_id, m_cur_layer_id); + snprintf(buff, sizeof(buff), ";%s OF%d NF%d ON%d NN%d\n", tag.c_str(), old_filament_id, new_filament_id,old_nozzle_id,new_nozzle_id); + return std::string(buff); + }; float nz_extrusion_flow = nozzle_change_extrusion_flow(m_layer_height); - bool extruder_change = !is_in_same_extruder(old_filament_id, new_filament_id); - float max_e_ramming = extruder_change - ? m_filpar[m_current_tool].max_e_ramming_speed.first - : m_filpar[m_current_tool].max_e_ramming_speed.second; - if (max_e_ramming < EPSILON) max_e_ramming = m_filpar[m_current_tool].max_e_speed; // fallback - float nozzle_change_speed = 60.0f * max_e_ramming / nz_extrusion_flow; - nozzle_change_speed = solid_infill ? 40.f * 60.f : nozzle_change_speed; - - if (is_tpu_filament(m_current_tool)) { - nozzle_change_speed *= 0.25; - } - float bridge_speed = std::min(60.0f * max_e_ramming / nozzle_change_extrusion_flow(0.2), nozzle_change_speed); - - WipeTowerWriter writer(m_layer_height, m_nozzle_change_perimeter_width, m_gcode_flavor, m_filpar); + WipeTowerWriter writer(m_layer_height, m_nozzle_change_perimeter_width, m_gcode_flavor, m_filpar, m_enable_arc_fitting); writer.set_extrusion_flow(nz_extrusion_flow) .set_z(m_z_pos) .set_initial_tool(m_current_tool) - .set_y_shift(m_y_shift + (new_filament_id != (unsigned int) (-1) && (m_current_shape == SHAPE_REVERSED) ? m_layer_info->depth - m_layer_info->toolchanges_depth() : 0.f)) - .append(format_nozzle_change_tag(true, old_filament_id, new_filament_id)); - - if (!extruder_change && m_is_multiple_nozzle) { - writer.append("M632 S" + std::to_string(new_filament_id) + " M N\n"); - // Use m_physical_extruder_map for heater index (matches format_line_M104 in add_M104_by_requirement) - if (m_filpar[m_current_tool].precool_target_temp.second != 0) { - int logical_ext = m_filament_map.empty() ? 0 : m_filament_map[m_current_tool] - 1; - int phys_ext = (logical_ext >= 0 && logical_ext < (int)m_physical_extruder_map.size()) - ? m_physical_extruder_map[logical_ext] : logical_ext; - writer.append("M400\n"); - writer.append("M104 T" + std::to_string(phys_ext) + " S" + - std::to_string(m_filpar[m_current_tool].precool_target_temp.second) + " N0\n"); - writer.append("M106 S255\n"); - } - writer.append("M633\n"); - } + .set_y_shift(m_y_shift + (new_filament_id != (unsigned int) (-1) && (m_current_shape == SHAPE_REVERSED) ? m_layer_info->depth - m_layer_info->toolchanges_depth() : 0.f)); + set_for_wipe_tower_writer(writer); WipeTowerBlock* block = get_block_by_category(m_filpar[old_filament_id].category, false); if (!block) { assert(false); return WipeTower::NozzleChangeResult(); } - m_cur_block = block; - float dy = m_layer_info->extra_spacing * m_nozzle_change_perimeter_width; - if (has_tpu_filament() && m_extra_spacing < m_tpu_fixed_spacing) - dy = m_tpu_fixed_spacing * m_nozzle_change_perimeter_width; - - float x_offset = m_perimeter_width + (m_nozzle_change_perimeter_width - m_perimeter_width) / 2; - box_coordinates cleaning_box(Vec2f(x_offset,block->cur_depth + (m_nozzle_change_perimeter_width - m_perimeter_width) / 2), - m_wipe_tower_width - 2 * x_offset, - nozzle_change_line_count * dy - (m_nozzle_change_perimeter_width - m_perimeter_width) / 2); + m_cur_block = block; + float dy = is_first_layer() ? m_nozzle_change_perimeter_width : m_layer_info->extra_spacing * get_block_gap_width(m_current_tool, true); + box_coordinates cleaning_box(Vec2f(x_offset, block->cur_depth + (m_nozzle_change_perimeter_width - m_perimeter_width) / 2), + nozzle_change_box_width, + nozzle_change_depth); Vec2f initial_position = cleaning_box.ld; writer.set_initial_position(initial_position, m_wipe_tower_width, m_wipe_tower_depth, m_internal_rotation); - const float &xl = cleaning_box.ld.x(); - const float &xr = cleaning_box.rd.x(); - dy = solid_infill ? m_nozzle_change_perimeter_width : dy; - nozzle_change_line_count = solid_infill ? std::numeric_limits::max() : nozzle_change_line_count; - m_left_to_right = true; - - if (extruder_change) { - float ramming_length = nozzle_change_line_count * (xr - xl); - int extruder_id = m_filament_map.empty() ? 0 : m_filament_map[m_current_tool] - 1; - float precool_t = (extruder_id >= 0 && extruder_id < (int)m_filpar[m_current_tool].precool_t.first.size()) - ? m_filpar[m_current_tool].precool_t.first[extruder_id] : 0.f; - float precool_t_fl = (extruder_id >= 0 && extruder_id < (int)m_filpar[m_current_tool].precool_t_first_layer.first.size()) - ? m_filpar[m_current_tool].precool_t_first_layer.first[extruder_id] : 0.f; - float per_cooling_max_speed = nozzle_change_speed; - if (is_first_layer() && precool_t_fl > EPSILON) - per_cooling_max_speed = ramming_length / precool_t_fl * 60.f; - else if (precool_t > EPSILON) - per_cooling_max_speed = ramming_length / precool_t * 60.f; - if (nozzle_change_speed > per_cooling_max_speed) nozzle_change_speed = per_cooling_max_speed; - if (bridge_speed > per_cooling_max_speed) bridge_speed = per_cooling_max_speed; - } - - int real_nozzle_change_line_count = 0; - bool need_change_flow = false; - for (int i = 0; true; ++i) { - if (need_thick_bridge_flow(writer.pos().y())) { - writer.set_extrusion_flow(nozzle_change_extrusion_flow(0.2)); - writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Height) + std::to_string(0.2) + "\n"); - need_change_flow = true; + // --- Nozzle change preamble: notify firmware + precool --- + writer.append(format_nozzle_change_line(true, old_filament_id, new_filament_id)); + if (!extruder_change) { + int new_nozzle_id = m_multi_nozzle_group_result->is_support_dynamic_nozzle_map() + ? get_nozzle_id(new_filament_id, m_cur_layer_id) : -1; + writer.append(format_line_M632(new_filament_id, new_nozzle_id)); + if (m_filpar[m_current_tool].precool_target_temp.second != 0) { + writer.format_line_M104(m_filpar[m_current_tool].precool_target_temp.second, get_extruder_id(m_current_tool, m_cur_layer_id)) + .append(format_line_M106()); } - if (m_left_to_right) - writer.extrude(xr + wipe_tower_wall_infill_overlap * m_perimeter_width, writer.y(), need_change_flow ? bridge_speed : nozzle_change_speed); - else - writer.extrude(xl - wipe_tower_wall_infill_overlap * m_perimeter_width, writer.y(), need_change_flow ? bridge_speed : nozzle_change_speed); - real_nozzle_change_line_count++; - if (i == nozzle_change_line_count - 1) - break; - if ((writer.y() + dy - cleaning_box.ru.y()+(m_nozzle_change_perimeter_width+m_perimeter_width)/2) > (float)EPSILON) break; - if (need_change_flow) { - writer.set_extrusion_flow(nozzle_change_extrusion_flow(m_layer_height)); - writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Height) + std::to_string(m_layer_height) + "\n"); - need_change_flow = false; - } - writer.extrude(writer.x(), writer.y() + dy, nozzle_change_speed); - m_left_to_right = !m_left_to_right; + writer.append(format_line_M633()); } - if (need_change_flow) { - writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Height) + std::to_string(m_layer_height) + "\n"); - } - writer.set_extrusion_flow(nz_extrusion_flow); // Reset the extrusion flow. - block->cur_depth += real_nozzle_change_line_count * dy; - block->last_nozzle_change_id = old_filament_id; NozzleChangeResult result; - if (!extruder_change && m_is_multiple_nozzle) { - writer.append("M632 S" + std::to_string(new_filament_id) + " M N\n"); - } - if (is_need_reverse_travel(m_current_tool, extruder_change)) { - bool left_to_right = !m_left_to_right; - int tpu_line_count = real_nozzle_change_line_count; - float reverse_speed = nozzle_change_speed * 2; // reverse travel runs at double the nozzle-change speed - float rt_time = extruder_change ? m_filpar[m_current_tool].ramming_travel_time.first - : m_filpar[m_current_tool].ramming_travel_time.second; - float need_reverse_travel_dis = rt_time * reverse_speed / 60.f; - float real_travel_dis = tpu_line_count * (xr - xl - 2 * m_perimeter_width); - if (real_travel_dis < need_reverse_travel_dis) - reverse_speed *= real_travel_dis / need_reverse_travel_dis; - writer.travel(writer.x(), writer.y() + dy/2); + if (nozzle_change_line_count > 0) { + float max_e_ramming_speed = extruder_change ? m_filpar[m_current_tool].max_e_ramming_speed.first : m_filpar[m_current_tool].max_e_ramming_speed.second; + float nozzle_change_speed = 60.0f * max_e_ramming_speed / nz_extrusion_flow; + if (solid_infill) + nozzle_change_speed = std::min(40.f * 60.f, nozzle_change_speed); + float bridge_speed = std::min(60.0f * max_e_ramming_speed / nozzle_change_extrusion_flow(0.2), nozzle_change_speed); + const float &xl = cleaning_box.ld.x(); + const float &xr = cleaning_box.rd.x(); + dy = solid_infill ? m_nozzle_change_perimeter_width : dy; + if (solid_infill) + nozzle_change_line_count = std::floor(EPSILON + (cleaning_box.ru[1] - cleaning_box.rd[1] + (m_nozzle_change_perimeter_width - m_perimeter_width) / 2.f) / + m_nozzle_change_perimeter_width); + m_left_to_right = true; + bool need_change_flow = false; + float ramming_length = nozzle_change_line_count * (xr - xl); + int extruder_id = get_extruder_id(m_current_tool, m_cur_layer_id); + float precool_t = extruder_change ? m_filpar[m_current_tool].precool_t.first[extruder_id] : m_filpar[m_current_tool].precool_t.second[extruder_id]; + float precool_t_first_layer = extruder_change ? m_filpar[m_current_tool].precool_t_first_layer.first[extruder_id] : + m_filpar[m_current_tool].precool_t_first_layer.second[extruder_id]; + float per_cooling_max_speed = nozzle_change_speed; + if (extruder_change) { + if (is_first_layer() && precool_t_first_layer > EPSILON) + per_cooling_max_speed = ramming_length / precool_t_first_layer * 60.f; + else if (precool_t > EPSILON) + per_cooling_max_speed = ramming_length / precool_t * 60.f; + }//BBS:nozzle change does not require forcing a cooldown to a specific temperature. + if (nozzle_change_speed > per_cooling_max_speed) nozzle_change_speed = per_cooling_max_speed; + if (bridge_speed > per_cooling_max_speed) bridge_speed = per_cooling_max_speed; + LimitFlow LimitRamming = extruder_change ? LimitFlow::LimitRammingFlow : LimitFlow::LimitRammingFlowNC; for (int i = 0; true; ++i) { - need_reverse_travel_dis -= (xr - xl - 2 * m_perimeter_width); - float offset_dis = 0.f; - if (need_reverse_travel_dis < 0) - offset_dis = -need_reverse_travel_dis; - if (left_to_right) - writer.travel(xr - m_perimeter_width - offset_dis, writer.y(), reverse_speed); + if (need_thick_bridge_flow(writer.pos().y())) { + writer.set_extrusion_flow(nozzle_change_extrusion_flow(0.2)); + writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Height) + std::to_string(0.2) + "\n"); + need_change_flow = true; + } + if (m_left_to_right) + writer.extrude(xr + wipe_tower_wall_infill_overlap * m_perimeter_width, writer.y(), need_change_flow ? bridge_speed : nozzle_change_speed, LimitRamming); else - writer.travel(xl + m_perimeter_width + offset_dis, writer.y(), reverse_speed); - if (need_reverse_travel_dis < EPSILON) break; - if (i == tpu_line_count - 1) + writer.extrude(xl - wipe_tower_wall_infill_overlap * m_perimeter_width, writer.y(), need_change_flow ? bridge_speed : nozzle_change_speed, LimitRamming); + if (i == nozzle_change_line_count - 1) break; - writer.travel(writer.x(), writer.y() - dy); - left_to_right = !left_to_right; + if ((writer.y() + dy - cleaning_box.ru.y()+(m_nozzle_change_perimeter_width+m_perimeter_width)/2) > (float)EPSILON) break; + if (need_change_flow) { + writer.set_extrusion_flow(nozzle_change_extrusion_flow(m_layer_height)); + writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Height) + std::to_string(m_layer_height) + "\n"); + need_change_flow = false; + } + writer.extrude(writer.x(), writer.y() + dy, nozzle_change_speed, LimitRamming); + m_left_to_right = !m_left_to_right; } - } else if (is_tpu_filament(m_current_tool)) { - bool left_to_right = !m_left_to_right; - int tpu_line_count = (real_nozzle_change_line_count + 2 - 1) / 2; - nozzle_change_speed *= 2; - writer.travel(writer.x(), writer.y() - m_nozzle_change_perimeter_width); - - for (int i = 0; true; ++i) { - if (left_to_right) - writer.travel(xr - m_perimeter_width, writer.y(), nozzle_change_speed); - else - writer.travel(xl + m_perimeter_width, writer.y(), nozzle_change_speed); - - if (i == tpu_line_count - 1) - break; - - writer.travel(writer.x(), writer.y() - dy); - left_to_right = !left_to_right; + if (need_change_flow) { + writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Height) + std::to_string(m_layer_height) + "\n"); } - } else { - result.wipe_path.push_back(writer.pos_rotated()); - if (m_left_to_right) { - result.wipe_path.push_back(Vec2f(0, writer.pos_rotated().y())); + + writer.set_extrusion_flow(nz_extrusion_flow); + block->cur_depth += nozzle_change_depth; + block->last_nozzle_change_id = old_filament_id; + // --- Post-ramming: re-arm nozzle change for travel phase --- + if (!extruder_change) { + int new_nozzle_id = m_multi_nozzle_group_result->is_support_dynamic_nozzle_map() + ? get_nozzle_id(new_filament_id, m_cur_layer_id) : -1; + writer.append(format_line_M632(new_filament_id, new_nozzle_id)); + } + + if (is_need_reverse_travel(m_current_tool, extruder_change)) { + bool left_to_right = !m_left_to_right; + int tpu_line_count = nozzle_change_line_count; + nozzle_change_speed *= 2; // due to nozzle change 2 perimeter + float ramming_travel_time = extruder_change ? m_filpar[m_current_tool].ramming_travel_time.first : m_filpar[m_current_tool].ramming_travel_time.second; + float need_reverse_travel_dis = ramming_travel_time * nozzle_change_speed / 60.f; + float real_travel_dis = tpu_line_count * (xr - xl - 2 * m_perimeter_width); + if (real_travel_dis < need_reverse_travel_dis) + nozzle_change_speed *= real_travel_dis / need_reverse_travel_dis; + writer.travel(writer.x(), writer.y() + dy/2); + + for (int i = 0; true; ++i) { + need_reverse_travel_dis -= (xr - xl - 2 * m_perimeter_width); + float offset_dis = 0.f; + if (need_reverse_travel_dis < 0) { + offset_dis = -need_reverse_travel_dis; + } + if (left_to_right) + writer.travel(xr - m_perimeter_width - offset_dis, writer.y(), nozzle_change_speed); + else + writer.travel(xl + m_perimeter_width + offset_dis , writer.y(), nozzle_change_speed); + if (need_reverse_travel_dis < EPSILON) break; + if (i == tpu_line_count - 1) + break; + + writer.travel(writer.x(), writer.y() - dy); + left_to_right = !left_to_right; + } } else { - result.wipe_path.push_back(Vec2f(m_wipe_tower_width, writer.pos_rotated().y())); + result.wipe_path.push_back(writer.pos_rotated()); + if (m_left_to_right) { + result.wipe_path.push_back(Vec2f(0, writer.pos_rotated().y())); + } else { + result.wipe_path.push_back(Vec2f(m_wipe_tower_width, writer.pos_rotated().y())); + } } + if (!extruder_change) writer.append(format_line_M633()); } - if (!extruder_change && m_is_multiple_nozzle) writer.append("M633\n"); - - writer.append(format_nozzle_change_tag(false, old_filament_id, new_filament_id)); + writer.append(format_nozzle_change_line(false, old_filament_id, new_filament_id)); result.start_pos = writer.start_pos_rotated(); result.origin_start_pos = initial_position; @@ -3250,91 +3558,110 @@ WipeTower::ToolChangeResult WipeTower::finish_layer_new(bool extrude_perimeter, assert(!this->layer_finished()); m_current_layer_finished = true; - WipeTowerWriter writer(m_layer_height, m_perimeter_width, m_gcode_flavor, m_filpar); + WipeTowerWriter writer(m_layer_height, m_perimeter_width, m_gcode_flavor, m_filpar, m_enable_arc_fitting); writer.set_extrusion_flow(m_extrusion_flow) .set_z(m_z_pos) .set_initial_tool(m_current_tool) .set_y_shift(m_y_shift - (m_current_shape == SHAPE_REVERSED ? m_layer_info->toolchanges_depth() : 0.f)); + set_for_wipe_tower_writer(writer); + writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Wipe_Tower_Start) + "\n"); // Slow down on the 1st layer. bool first_layer = is_first_layer(); // BBS: speed up perimeter speed to 90mm/s for non-first layer - float feedrate = first_layer ? std::min(m_first_layer_speed * 60.f, 5400.f) : std::min(60.0f * m_filpar[m_current_tool].max_e_speed / m_extrusion_flow, 5400.f); - - float fill_box_depth = m_wipe_tower_depth - 2 * m_perimeter_width; - if (m_wipe_tower_blocks.size() == 1) { - fill_box_depth = m_layer_info->depth - 2 * m_perimeter_width; - } - box_coordinates fill_box(Vec2f(m_perimeter_width, m_perimeter_width), m_wipe_tower_width - 2 * m_perimeter_width, fill_box_depth); - - writer.set_initial_position((m_left_to_right ? fill_box.ru : fill_box.lu), m_wipe_tower_width, m_wipe_tower_depth, m_internal_rotation); + float feedrate = first_layer ? std::min(m_first_layer_speed * 60.f, m_max_speed) : std::min(60.0f * m_filpar[m_current_tool].max_e_speed / m_extrusion_flow, m_max_speed); bool toolchanges_on_layer = m_layer_info->toolchanges_depth() > WT_EPSILON; std::vector finish_rect_wipe_path; - if (extrude_fill_wall) { - // inner perimeter of the sparse section, if there is space for it: - if (fill_box.ru.y() - fill_box.rd.y() > WT_EPSILON) { - writer.rectangle_fill_box(this, fill_box, finish_rect_wipe_path, feedrate); + const bool multi_block_fill = (m_wipe_tower_blocks.size() > 1) && (extrude_fill_wall || extrude_fill); + + // Build list of fill boxes: one per block when multi_block_fill, else one for whole tower. + std::vector fill_boxes; + if (multi_block_fill) { + for (const WipeTowerBlock &block : m_wipe_tower_blocks) { + float block_fill_height = block.depth - 2 * m_perimeter_width; + if (m_cur_layer_id >= 0 && size_t(m_cur_layer_id) < block.layer_depths.size()) + block_fill_height = block.layer_depths[m_cur_layer_id] - 2 * m_perimeter_width; + if (block_fill_height <= WT_EPSILON) + continue; + fill_boxes.emplace_back( + Vec2f(m_perimeter_width, block.start_depth + m_perimeter_width), + m_wipe_tower_width - 2 * m_perimeter_width, + block_fill_height); } } + if (fill_boxes.empty()) { + float fill_box_depth = m_wipe_tower_depth - 2 * m_perimeter_width; + if (m_wipe_tower_blocks.size() == 1) + fill_box_depth = m_layer_info->depth - 2 * m_perimeter_width; + fill_boxes.emplace_back(Vec2f(m_perimeter_width, m_perimeter_width), m_wipe_tower_width - 2 * m_perimeter_width, fill_box_depth); + } - // Extrude infill to support the material to be printed above. - const float dy = (fill_box.lu.y() - fill_box.ld.y() - m_perimeter_width); - float left = fill_box.lu.x() + 2 * m_perimeter_width; - float right = fill_box.ru.x() - 2 * m_perimeter_width; - if (extrude_fill && dy > m_perimeter_width) { - writer.travel(fill_box.ld + Vec2f(m_perimeter_width * 2, 0.f)) - .append(";--------------------\n" - "; CP EMPTY GRID START\n") - .comment_with_value(" layer #", m_num_layer_changes + 1); + writer.set_initial_position((m_left_to_right ? fill_boxes.front().ru : fill_boxes.front().lu), m_wipe_tower_width, m_wipe_tower_depth, m_internal_rotation); - // Is there a soluble filament wiped/rammed at the next layer? - // If so, the infill should not be sparse. - bool solid_infill = m_layer_info + 1 == m_plan.end() ? - false : - std::any_of((m_layer_info + 1)->tool_changes.begin(), (m_layer_info + 1)->tool_changes.end(), - [this](const WipeTowerInfo::ToolChange &tch) { return m_filpar[tch.new_tool].is_soluble || m_filpar[tch.old_tool].is_soluble; }); - solid_infill |= first_layer && m_adhesion; + bool solid_infill = (m_layer_info + 1 == m_plan.end()) ? false : + std::any_of((m_layer_info + 1)->tool_changes.begin(), (m_layer_info + 1)->tool_changes.end(), + [this](const WipeTowerInfo::ToolChange &tch) { return m_filpar[tch.new_tool].is_soluble || m_filpar[tch.old_tool].is_soluble; }); + solid_infill |= first_layer && m_adhesion; - if (solid_infill) { - float sparse_factor = 1.5f; // 1=solid, 2=every other line, etc. - if (first_layer) { // the infill should touch perimeters - left -= m_perimeter_width; - right += m_perimeter_width; - sparse_factor = 1.f; - } - float y = fill_box.ld.y() + m_perimeter_width; - int n = dy / (m_perimeter_width * sparse_factor); - float spacing = (dy - m_perimeter_width) / (n - 1); - int i = 0; - for (i = 0; i < n; ++i) { - writer.extrude(writer.x(), y, feedrate).extrude(i % 2 ? left : right, y); - y = y + spacing; - } - writer.extrude(writer.x(), fill_box.lu.y()); - } else { - // Extrude an inverse U at the left of the region and the sparse infill. - writer.extrude(fill_box.lu + Vec2f(m_perimeter_width * 2, 0.f), feedrate); + for (size_t i = 0; i < fill_boxes.size(); ++i) { + const box_coordinates &fill_box = fill_boxes[i]; + if (i > 0) + writer.travel(m_left_to_right ? fill_box.ru : fill_box.lu); - const int n = 1 + int((right - left) / m_bridging); - const float dx = (right - left) / n; - for (int i = 1; i <= n; ++i) { - float x = left + dx * i; - writer.travel(x, writer.y()); - writer.extrude(x, i % 2 ? fill_box.rd.y() : fill_box.ru.y()); + if (extrude_fill_wall && (fill_box.ru.y() - fill_box.rd.y() > WT_EPSILON)) + writer.rectangle_fill_box(this, fill_box, finish_rect_wipe_path, feedrate); + // Extrude infill to support the material to be printed above. + const float dy = (fill_box.lu.y() - fill_box.ld.y() - m_perimeter_width); + float left = fill_box.lu.x() + 2 * m_perimeter_width; + float right = fill_box.ru.x() - 2 * m_perimeter_width; + + if (extrude_fill && dy > m_perimeter_width) { + writer.travel(fill_box.ld + Vec2f(m_perimeter_width * 2, 0.f)) + .append(";--------------------\n" + "; CP EMPTY GRID START\n") + .comment_with_value(" layer #", m_num_layer_changes + 1); + + if (solid_infill) { + float sparse_factor = 1.5f; // 1=solid, 2=every other line, etc. + if (first_layer) { // the infill should touch perimeters + left -= m_perimeter_width; + right += m_perimeter_width; + sparse_factor = 1.f; + } + float y = fill_box.ld.y() + m_perimeter_width; + int n = dy / (m_perimeter_width * sparse_factor); + float spacing = (dy - m_perimeter_width) / (n - 1); + int i = 0; + for (i = 0; i < n; ++i) { + writer.extrude(writer.x(), y, feedrate).extrude(i % 2 ? left : right, y); + y = y + spacing; + } + writer.extrude(writer.x(), fill_box.lu.y()); + } else { + // Extrude an inverse U at the left of the region and the sparse infill. + writer.extrude(fill_box.lu + Vec2f(m_perimeter_width * 2, 0.f), feedrate); + + const int n = 1 + int((right - left) / m_bridging); + const float dx = (right - left) / n; + for (int i = 1; i <= n; ++i) { + float x = left + dx * i; + writer.travel(x, writer.y()); + writer.extrude(x, i % 2 ? fill_box.rd.y() : fill_box.ru.y()); + } + + finish_rect_wipe_path.clear(); + // BBS: add wipe_path for this case: only with finish rectangle + finish_rect_wipe_path.emplace_back(writer.pos()); + finish_rect_wipe_path.emplace_back(Vec2f(left + dx * n, n % 2 ? fill_box.ru.y() : fill_box.rd.y())); } - finish_rect_wipe_path.clear(); - // BBS: add wipe_path for this case: only with finish rectangle - finish_rect_wipe_path.emplace_back(writer.pos()); - finish_rect_wipe_path.emplace_back(Vec2f(left + dx * n, n % 2 ? fill_box.ru.y() : fill_box.rd.y())); + writer.append("; CP EMPTY GRID END\n" + ";------------------\n\n\n\n\n\n\n"); } - - writer.append("; CP EMPTY GRID END\n" - ";------------------\n\n\n\n\n\n\n"); } // outer perimeter (always): @@ -3419,23 +3746,25 @@ WipeTower::ToolChangeResult WipeTower::finish_layer_new(bool extrude_perimeter, m_used_filament_length[m_current_tool] += writer.get_and_reset_used_filament_length(); m_nozzle_change_result.gcode.clear(); - return construct_tcr(writer, false, m_current_tool, true, false, 0.f, false); + return construct_tcr(writer, false, m_current_tool, true, false, 0.f,false); } WipeTower::ToolChangeResult WipeTower::finish_block(const WipeTowerBlock &block, int filament_id, bool extrude_fill) { - WipeTowerWriter writer(m_layer_height, m_perimeter_width, m_gcode_flavor, m_filpar); + WipeTowerWriter writer(m_layer_height, m_perimeter_width, m_gcode_flavor, m_filpar, m_enable_arc_fitting); writer.set_extrusion_flow(m_extrusion_flow) .set_z(m_z_pos) .set_initial_tool(filament_id) .set_y_shift(m_y_shift - (m_current_shape == SHAPE_REVERSED ? m_layer_info->toolchanges_depth() : 0.f)); + set_for_wipe_tower_writer(writer); + writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Wipe_Tower_Start) + "\n"); // Slow down on the 1st layer. bool first_layer = is_first_layer(); // BBS: speed up perimeter speed to 90mm/s for non-first layer - float feedrate = first_layer ? std::min(m_first_layer_speed * 60.f, 5400.f) : std::min(60.0f * m_filpar[filament_id].max_e_speed / m_extrusion_flow, 5400.f); + float feedrate = first_layer ? std::min(m_first_layer_speed * 60.f, m_max_speed) : std::min(60.0f * m_filpar[filament_id].max_e_speed / m_extrusion_flow, m_max_speed); box_coordinates fill_box(Vec2f(0, 0), 0, 0); fill_box = box_coordinates(Vec2f(m_perimeter_width, block.cur_depth), m_wipe_tower_width - 2 * m_perimeter_width, block.start_depth + block.layer_depths[m_cur_layer_id] - block.cur_depth - m_perimeter_width); @@ -3529,49 +3858,96 @@ WipeTower::ToolChangeResult WipeTower::finish_block(const WipeTowerBlock &block, return construct_block_tcr(writer, false, filament_id, true, 0.f); } -WipeTower::ToolChangeResult WipeTower::finish_block_solid(const WipeTowerBlock &block, int filament_id, bool extrude_fill, bool interface_solid) +WipeTower::ToolChangeResult WipeTower::finish_block_solid(const WipeTowerBlock &block, int filament_id, bool extrude_fill, WipeTowerLayerType layer_type) { float layer_height = m_layer_height; float e_flow = m_extrusion_flow; - if (m_cur_layer_id > 1 && !block.solid_infill[m_cur_layer_id - 1] && m_extrusion_flow < extrusion_flow(0.2)) { + if (m_cur_layer_id > 1 && block.layers_type[m_cur_layer_id - 1]==WipeTowerLayerType::Normal && m_extrusion_flow < extrusion_flow(0.2)) { layer_height = 0.2; e_flow = extrusion_flow(0.2); } - WipeTowerWriter writer(layer_height, m_perimeter_width, m_gcode_flavor, m_filpar); + WipeTowerWriter writer(layer_height, m_perimeter_width, m_gcode_flavor, m_filpar, m_enable_arc_fitting); writer.set_extrusion_flow(e_flow) .set_z(m_z_pos) .set_initial_tool(filament_id) .set_y_shift(m_y_shift - (m_current_shape == SHAPE_REVERSED ? m_layer_info->toolchanges_depth() : 0.f)); + set_for_wipe_tower_writer(writer); + writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Wipe_Tower_Start) + "\n"); // Slow down on the 1st layer. bool first_layer = is_first_layer(); // BBS: speed up perimeter speed to 90mm/s for non-first layer - float feedrate = first_layer ? std::min(m_first_layer_speed * 60.f, 5400.f) : std::min(60.0f * m_filpar[filament_id].max_e_speed / m_extrusion_flow, 5400.f); - feedrate = interface_solid ? 20.f * 60.f : feedrate; + float feedrate = first_layer ? std::min(m_first_layer_speed * 60.f, m_max_speed) : std::min(60.0f * m_filpar[filament_id].max_e_speed / m_extrusion_flow, m_max_speed); + feedrate = (layer_type == WipeTowerLayerType::Contact || layer_type == WipeTowerLayerType::Contact_UP) ? 20.f * 60.f : feedrate; box_coordinates fill_box(Vec2f(0, 0), 0, 0); fill_box = box_coordinates(Vec2f(m_perimeter_width, block.cur_depth), m_wipe_tower_width - 2 * m_perimeter_width, block.start_depth + block.layer_depths[m_cur_layer_id] - block.cur_depth - m_perimeter_width); - - writer.set_initial_position((m_left_to_right ? fill_box.rd : fill_box.ld), m_wipe_tower_width, m_wipe_tower_depth, m_internal_rotation); - m_left_to_right = !m_left_to_right; bool toolchanges_on_layer = m_layer_info->toolchanges_depth() > WT_EPSILON; - + const float dy = (fill_box.lu.y() - fill_box.ld.y()); + int n = (dy + 0.25 * m_perimeter_width) / m_perimeter_width+1; + float spacing = m_perimeter_width; + Vec2f initial_pos(0, 0); + bool up_to_down = false; + //set initial pos + { + int index = m_cur_layer_id % 4; + float gird_depth = spacing * (n-1); + switch (index % 4) { + case 0: + initial_pos = fill_box.ld; + m_left_to_right = true; + up_to_down = false; + break; + case 1: + initial_pos = Vec2f(fill_box.rd.x(), fill_box.rd.y() + gird_depth); + m_left_to_right = false; + up_to_down = true; + break; + case 2: + initial_pos = fill_box.rd; + m_left_to_right = false; + up_to_down = false; + break; + case 3: + initial_pos = Vec2f(fill_box.ld.x(), gird_depth + fill_box.ld.y()); + m_left_to_right = true; + up_to_down = true; + break; + default: break; + } + } // Extrude infill to support the material to be printed above. - const float dy = (fill_box.lu.y() - fill_box.ld.y()); float left = fill_box.lu.x(); float right = fill_box.ru.x(); std::vector finish_rect_wipe_path; { - writer.append(";--------------------\n" + writer + .append(";--------------------\n" "; CP EMPTY GRID START\n") .comment_with_value(" layer #", m_num_layer_changes + 1); + bool is_full_block = std::abs(block.cur_depth - block.start_depth) < EPSILON; + if (is_full_block && layer_type == WipeTowerLayerType::Contact && m_enable_tower_interface_features ) { + Vec2f stop_pos = initial_pos; + float filament_tower_interface_pre_extrusion_dist = m_filpar[m_current_tool].filament_tower_interface_pre_extrusion_dist; + // Orca: unscaled(BoundingBox) here is a template returning BoundingBoxBase, not BoundingBoxf + auto printer_bbx = unscaled(get_extents(m_shared_print_bed)); + printer_bbx.translate((- m_wipe_tower_pos - m_rib_offset).cast()); // first layer never be contact + if (stop_pos.x() < m_wipe_tower_width/2.f) + stop_pos = Vec2f(stop_pos.x() - filament_tower_interface_pre_extrusion_dist, stop_pos.y()); + else + stop_pos = Vec2f(stop_pos.x() + filament_tower_interface_pre_extrusion_dist, stop_pos.y()); + if (stop_pos.x() < printer_bbx.min[0]) stop_pos.x() = printer_bbx.min[0]; + if (stop_pos.x() > printer_bbx.max[0]) stop_pos.x() = printer_bbx.max[0]; + initial_pos = stop_pos; + if (m_filpar[m_current_tool].filament_tower_interface_print_temp != m_filpar[m_current_tool].nozzle_temperature) + writer.format_line_M109(m_filpar[m_current_tool].filament_tower_interface_print_temp, get_extruder_id(m_current_tool, m_cur_layer_id)); + writer.retract(-m_filpar[m_current_tool].filament_tower_interface_pre_extrusion_length - 2.f, 100.f); + } + writer.set_initial_position(initial_pos, m_wipe_tower_width, m_wipe_tower_depth, m_internal_rotation); - float y = fill_box.ld.y(); - int n = (dy + 0.25 * m_perimeter_width) / m_perimeter_width + 1; - float spacing = m_perimeter_width; int i = 0; for (i = 0; i < n; ++i) { writer.extrude(m_left_to_right ? right : left, writer.y(), feedrate); @@ -3580,10 +3956,10 @@ WipeTower::ToolChangeResult WipeTower::finish_block_solid(const WipeTowerBlock & break; } m_left_to_right = !m_left_to_right; - y = y + spacing; - writer.extrude(writer.x(), y, feedrate); + writer.extrude(writer.x(), writer.y()+spacing*(up_to_down?-1:1), feedrate); } - + if (layer_type == WipeTowerLayerType::Contact && m_enable_tower_interface_features && m_filpar[m_current_tool].filament_tower_interface_print_temp != m_filpar[m_current_tool].nozzle_temperature) + writer.format_line_M104(m_filpar[m_current_tool].nozzle_temperature, get_extruder_id(m_current_tool, m_cur_layer_id)); writer.append("; CP EMPTY GRID END\n" ";------------------\n\n\n\n\n\n\n"); } @@ -3601,50 +3977,53 @@ WipeTower::ToolChangeResult WipeTower::finish_block_solid(const WipeTowerBlock & void WipeTower::toolchange_wipe_new(WipeTowerWriter &writer, const box_coordinates &cleaning_box, float wipe_length,bool solid_tool_toolchange) { - writer.set_extrusion_flow(m_extrusion_flow * (is_first_layer() ? 1.15f : 1.f)).append("; CP TOOLCHANGE WIPE\n"); - + writer.set_extrusion_flow(m_extrusion_flow * (is_first_layer() ? m_first_layer_flow_ratio : 1.f)) + // Orca: CP_TOOLCHANGE_WIPE is a standalone tag constant, not an ETags entry + .append(";" + GCodeProcessor::Toolchange_Wipe_Tag + " CT" + std::to_string(solid_tool_toolchange) + " FL" + std::to_string(is_first_layer()) + "\n"); if (!m_nozzle_change_result.gcode.empty()) writer.change_analyzer_line_width(m_perimeter_width); // BBS: add the note for gcode-check, when the flow changed, the width should follow the change if (is_first_layer()) { - writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Width) + std::to_string(1.15 * m_perimeter_width) + "\n"); + writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Width) + std::to_string(m_first_layer_flow_ratio * m_perimeter_width) + "\n"); } + + //if (solid_tool_toolchange && m_filpar[m_current_tool].filament_tower_interface_print_temp != m_filpar[m_current_tool].nozzle_temperature) + // writer.append(format_line_M109(m_filpar[m_current_tool].filament_tower_interface_print_temp, m_filament_map[this->m_current_tool] - 1)); + //if (solid_tool_toolchange && m_filpar[m_current_tool].filament_tower_interface_pre_extrusion_length != 0) + // writer.retract(-m_filpar[m_current_tool].filament_tower_interface_pre_extrusion_length, 100.f); + float retract_length = m_filpar[m_current_tool].retract_length; float retract_speed = m_filpar[m_current_tool].retract_speed * 60; - const float ironing_area = m_filpar[m_current_tool].tower_ironing_area; - const bool do_ironing = m_flat_ironing && (!solid_tool_toolchange || !m_enable_tower_interface_features); - const float &xl = cleaning_box.ld.x(); const float &xr = cleaning_box.rd.x(); - + bool should_flat_ironging = m_flat_ironing; + bool should_line_ironing = true; + if (!m_contact_ironing && solid_tool_toolchange) { + should_flat_ironging = false; + should_line_ironing = false; + } + bool should_cooling_before_tower = !solid_tool_toolchange; + bool should_cooling_before_object = false;//interface layer heating print tower, then cooling print object + int cooling_begin_line = 2; float x_to_wipe = wipe_length; - float dy = solid_tool_toolchange ? m_perimeter_width :m_layer_info->extra_spacing * m_perimeter_width; + float dy = is_first_layer() ? m_perimeter_width : m_layer_info->extra_spacing * get_block_gap_width(m_current_tool,false); + if (solid_tool_toolchange) + dy = m_perimeter_width; x_to_wipe = solid_tool_toolchange ? std::numeric_limits::max(): x_to_wipe; - float target_speed = is_first_layer() ? std::min(m_first_layer_speed * 60.f, 4800.f) : 4800.f; - target_speed = solid_tool_toolchange ? 20.f * 60.f : target_speed; - // Nominal wipe-speed schedule. The applied wipe_speed is nominal_speed * speed_factor; speed_factor - // stays 1.0 unless the H2C prime-tower heating-during-wipe model below slows the wipe so the hotend - // can reach temperature (nominal_speed == wipe_speed when speed_factor == 1, i.e. single-nozzle). - float nominal_speed = 0.33f * target_speed; + float target_speed = is_first_layer() ? std::min(m_first_layer_speed * 60.f, m_max_speed) : m_max_speed; + target_speed = solid_tool_toolchange ? m_contact_speed : target_speed; + const std::vector WipeSpeedMap{0.33f * target_speed, 0.375f * target_speed, 0.458f * target_speed, 0.875f * target_speed, + std::min(target_speed, 0.875f * target_speed + 50.f)}; + float wipe_speed = WipeSpeedMap[0]; m_left_to_right = ((m_cur_layer_id + 3) % 4 >= 2); bool is_from_up = (m_cur_layer_id % 2 == 1); - // Prime-tower heating during wipe. Everything here is gated on m_is_multiple_nozzle (false for every - // current printer); the lambdas emit nothing until add_M104_by_requirement's gate opens, so the - // single-nozzle wipe is untouched. - // WipeSpeedMap mirrors the nominal schedule above and is read only by estimate_wipe_time. It is a - // std::array (stack, no per-call heap allocation); values depend on runtime target_speed so it - // cannot be static const. - const std::array WipeSpeedMap{0.33f * target_speed, 0.375f * target_speed, 0.458f * target_speed, - 0.875f * target_speed, std::min(target_speed, 0.875f * target_speed + 50.f)}; - auto estimate_wipe_time = [&cleaning_box, &x_to_wipe, &xr, &xl, &dy, &WipeSpeedMap, &solid_tool_toolchange]() -> float { - int n = std::ceil(x_to_wipe / (xr - xl)); - if (solid_tool_toolchange) n = (cleaning_box.lu[1] - cleaning_box.ld[1]) / dy; + auto estimate_time_kernel = [&WipeSpeedMap,&xr,&xl](int n) { + float time = std::numeric_limits::max(); float one_line_len = xr - xl; - float time = std::numeric_limits::max(); if (n <= 1) time = one_line_len / WipeSpeedMap[0]; else if (n <= 2) @@ -3659,65 +4038,51 @@ void WipeTower::toolchange_wipe_new(WipeTowerWriter &writer, const box_coordinat } return time * 60.f; }; - // Emit the arriving-hotend pre-heat inside the M632/M633 nozzle-change barrier. `M632 S[ H] - // M N` opens the barrier (M = firmware nozzle-change flag, N = slicer generated), the M104 sets the - // arriving hotend temp, and `M633` closes it. H2C's grouping is static (no dynamic nozzle map), so the - // H field is omitted (a dynamic nozzle map would supply a real nozzle id, a static map -1 =>no - // H). The counterproductive fan-on (M106 S255) used for departing-tool cooldown is intentionally - // omitted, since this is a pre-HEAT of the arriving tool. The whole helper is only ever called from - // add_M104_by_requirement, which is gated on m_is_multiple_nozzle (extruder_max_nozzle_count>1) => H2C - // only; every other printer's wipe tower is untouched. - // BBS: extruder change preheat uses M400 + M104 WITHOUT M632/M633 barrier. - // M632 barriers are only for carousel nozzle changes (emitted in nozzle_change_new/ramming). - auto format_line_M104 = [this](int target_temp, int target_extruder = -1, bool wait_for_moves = true, const std::string &comment = "") { - std::string buffer; - if (wait_for_moves) - buffer += "M400\n"; - buffer += "M104"; - if (target_extruder != -1 && target_extruder < (int) m_physical_extruder_map.size()) - buffer += (" T" + std::to_string(m_physical_extruder_map[target_extruder])); - buffer += " S" + std::to_string(target_temp) + " N0"; // N0 means the gcode is generated by the slicer - if (!comment.empty()) buffer += " ;" + comment; - buffer += '\n'; - return buffer; + auto estimate_wipe_time = [&estimate_time_kernel, & cleaning_box, &target_speed, &x_to_wipe, &xr, &xl, &dy, &WipeSpeedMap, &solid_tool_toolchange](int begin_line) -> float { + int n = std::ceil(x_to_wipe / (xr - xl)); + if (solid_tool_toolchange) n = (cleaning_box.lu[1] - cleaning_box.ld[1]) / dy; + float total_time = estimate_time_kernel(n); + float beg_time = n <= 0 ? 0 : estimate_time_kernel(begin_line); + return total_time-beg_time; }; - // m_is_multiple_nozzle gate needed because Orca calls toolchange_wipe_new for ALL printers (BBS has it H2C-only). - bool should_heating = m_is_multiple_nozzle && m_filpar[m_current_tool].filament_cooling_before_tower > EPSILON && - !solid_tool_toolchange && !is_first_layer(); - auto add_M104_by_requirement = [&writer, &format_line_M104, &should_heating, this]() { + + bool should_heating = m_filpar[m_current_tool].filament_cooling_before_tower > EPSILON && !solid_tool_toolchange && !is_first_layer(); + auto add_M104_by_requirement = [&writer, &should_heating, this]() { if (m_filpar[m_current_tool].filament_cooling_before_tower < EPSILON) return; if (!should_heating) return; float target_temp = is_first_layer() ? m_filpar[m_current_tool].nozzle_temperature_initial_layer : m_filpar[m_current_tool].nozzle_temperature; - writer.append(format_line_M104(target_temp, m_filament_map[m_current_tool] - 1)); + writer.format_line_M104(target_temp, get_extruder_id(m_current_tool, m_cur_layer_id)); }; float speed_factor = 1.f; - if (should_heating) { - // The heating-slowdown scaling is disabled — no additional heating time is required, so - // speed_factor stays 1.0. The structure and estimate_wipe_time/WipeSpeedMap are retained for - // future H2C tuning; the divide-by-zero/bounds guard is preserved in the commented body below. - // int extruder_id = m_filament_map[m_current_tool] - 1; - // if (extruder_id >= 0 && extruder_id < (int) m_hotend_heating_rate.size() && m_hotend_heating_rate[extruder_id] > 0.) { - // float estimate_time = estimate_wipe_time(); - // float heat_time = m_filpar[m_current_tool].filament_cooling_before_tower / m_hotend_heating_rate[extruder_id]; - // if (estimate_time < heat_time) speed_factor = estimate_time / heat_time; - // } - (void) estimate_wipe_time; // retain scaffolding above without an unused-lambda warning + if (should_heating) + { + //No additional heating time is required. + //float estimate_time = estimate_wipe_time(0); + //int extruder_id = m_filament_map[m_current_tool] - 1; + //float heat_time = m_filpar[m_current_tool].filament_cooling_before_tower / m_hotend_heating_rate[extruder_id]; + //heat_time /= 2.f; + //speed_factor = estimate_time / (heat_time+estimate_time); + //wipe_speed *= speed_factor; } - float wipe_speed = nominal_speed * speed_factor; - - // now the wiping itself: - for (int i = 0; true; ++i) { - if (i != 0) { - if (nominal_speed < 0.34f * target_speed) - nominal_speed = 0.375f * target_speed; - else if (nominal_speed < 0.377 * target_speed) - nominal_speed = 0.458f * target_speed; - else if (nominal_speed < 0.46f * target_speed) - nominal_speed = 0.875f * target_speed; - else - nominal_speed = std::min(target_speed, nominal_speed + 50.f); - wipe_speed = nominal_speed * speed_factor; + if (should_cooling_before_object) { + int n = (cleaning_box.lu[1] - cleaning_box.ld[1]) / dy; + int extruder_id = get_extruder_id(m_current_tool, m_cur_layer_id); + float cooling_time = (m_filpar[m_current_tool].filament_tower_interface_print_temp - m_filpar[m_current_tool].nozzle_temperature) / m_hotend_cooling_rate[extruder_id]; + if (n < 2) { + float estimate_time = estimate_wipe_time(0); + speed_factor = estimate_time > cooling_time? 1: estimate_time / cooling_time; + cooling_begin_line = 0; + } else { + float estimate_time = estimate_wipe_time(2); + speed_factor = estimate_time > cooling_time ? 1 : estimate_time / cooling_time; + cooling_begin_line = 2; //TODO: No slowdown for the first two lines. } + wipe_speed *= speed_factor; + } + + + for (int i = 0; true; ++i) { + if (i < WipeSpeedMap.size()) wipe_speed = WipeSpeedMap[i] * speed_factor; bool need_change_flow = need_thick_bridge_flow(writer.y()); // BBS: check the bridging area and use the bridge flow @@ -3725,44 +4090,53 @@ void WipeTower::toolchange_wipe_new(WipeTowerWriter &writer, const box_coordinat writer.set_extrusion_flow(extrusion_flow(0.2)); writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Height) + std::to_string(0.2) + "\n"); } - + float flat_iron_area = m_filpar[m_current_tool].flat_iron_area; float ironing_length = 3.; + + if (should_cooling_before_object && i == cooling_begin_line) { + writer.format_line_M104(m_filpar[m_current_tool].nozzle_temperature, get_extruder_id(m_current_tool, m_cur_layer_id)); + } + if (i == 0 && m_use_gap_wall) { // BBS: add ironing after extruding start if (m_left_to_right) { - float dx = xr + wipe_tower_wall_infill_overlap * m_perimeter_width - writer.pos().x(); - if (abs(dx) < ironing_length) ironing_length = abs(dx); - writer.extrude(writer.x() + ironing_length, writer.y(), wipe_speed); - writer.retract(retract_length, retract_speed); - writer.travel(writer.x() - 1.5 * ironing_length, writer.y(), 600.); - if (do_ironing && ironing_area > 0.f) { - writer.travel(writer.x() + 0.5f * ironing_length, writer.y(), 240.); - Vec2f pos{writer.x() + 1.f * ironing_length, writer.y()}; - writer.spiral_flat_ironing(writer.pos(), ironing_area, m_perimeter_width, flat_iron_speed); - writer.travel(pos, wipe_speed); - } else - writer.travel(writer.x() + 1.5 * ironing_length, writer.y(), 240.); - writer.retract(-retract_length, retract_speed); - add_M104_by_requirement(); // Pre-heat the arriving hotend during the wipe + if (should_line_ironing) { + float dx = xr + wipe_tower_wall_infill_overlap * m_perimeter_width - writer.pos().x(); + if (abs(dx) < ironing_length) ironing_length = abs(dx); + writer.extrude(writer.x() + ironing_length, writer.y(), wipe_speed); + writer.retract(retract_length, retract_speed); + writer.travel(writer.x() - 1.5 * ironing_length, writer.y(), 600.); + if (should_flat_ironging) { + writer.travel(writer.x() + 0.5f * ironing_length, writer.y(), 240.); + Vec2f pos{writer.x() + 1.f * ironing_length, writer.y()}; + writer.spiral_flat_ironing(writer.pos(), flat_iron_area, m_perimeter_width, flat_iron_speed); + writer.travel(pos, wipe_speed); + } else + writer.travel(writer.x() + 1.5 * ironing_length, writer.y(), 240.); + writer.retract(-retract_length, retract_speed); + } + add_M104_by_requirement(); writer.extrude(xr + wipe_tower_wall_infill_overlap * m_perimeter_width, writer.y(), wipe_speed); } else { - float dx = xl - wipe_tower_wall_infill_overlap * m_perimeter_width - writer.pos().x(); - if (abs(dx) < ironing_length) ironing_length = abs(dx); - writer.extrude(writer.x() - ironing_length, writer.y(), wipe_speed); - writer.retract(retract_length, retract_speed); - writer.travel(writer.x() + 1.5 * ironing_length, writer.y(), 600.); - if (do_ironing && ironing_area > 0.f) { - writer.travel(writer.x() - 0.5f * ironing_length, writer.y(), 240.); - Vec2f pos{writer.x() - 1.0f * ironing_length, writer.y()}; - writer.spiral_flat_ironing(writer.pos(), ironing_area, m_perimeter_width, flat_iron_speed); - writer.travel(pos, wipe_speed); - }else - writer.travel(writer.x() - 1.5 * ironing_length, writer.y(), 240.); - writer.retract(-retract_length, retract_speed); - add_M104_by_requirement(); // Pre-heat the arriving hotend during the wipe + if (should_line_ironing) { + float dx = xl - wipe_tower_wall_infill_overlap * m_perimeter_width - writer.pos().x(); + if (abs(dx) < ironing_length) ironing_length = abs(dx); + writer.extrude(writer.x() - ironing_length, writer.y(), wipe_speed); + writer.retract(retract_length, retract_speed); + writer.travel(writer.x() + 1.5 * ironing_length, writer.y(), 600.); + if (should_flat_ironging) { + writer.travel(writer.x() - 0.5f * ironing_length, writer.y(), 240.); + Vec2f pos{writer.x() - 1.0f * ironing_length, writer.y()}; + writer.spiral_flat_ironing(writer.pos(), flat_iron_area, m_perimeter_width, flat_iron_speed); + writer.travel(pos, wipe_speed); + } else + writer.travel(writer.x() - 1.5 * ironing_length, writer.y(), 240.); + writer.retract(-retract_length, retract_speed); + } + add_M104_by_requirement(); writer.extrude(xl - wipe_tower_wall_infill_overlap * m_perimeter_width, writer.y(), wipe_speed); } } else { - if (i == 0) add_M104_by_requirement(); // Pre-heat the arriving hotend during the wipe + if (i == 0) add_M104_by_requirement(); if (m_left_to_right) writer.extrude(xr + wipe_tower_wall_infill_overlap * m_perimeter_width, writer.y(), wipe_speed); else @@ -3855,67 +4229,6 @@ int WipeTower::get_filament_category(int filament_id) return m_filament_categories[filament_id]; } -bool WipeTower::is_in_same_extruder(int filament_id_1, int filament_id_2) -{ - if (filament_id_1 >= m_filament_map.size() || filament_id_2 >= m_filament_map.size()) - return true; - - return m_filament_map[filament_id_1] == m_filament_map[filament_id_2]; -} - -std::string WipeTower::format_nozzle_change_tag(bool start, int old_filament_id, int new_filament_id) const -{ - const std::string &tag = start ? GCodeProcessor::Nozzle_Change_Start_Tag : GCodeProcessor::Nozzle_Change_End_Tag; - int old_nozzle = (old_filament_id >= 0 && old_filament_id < (int)m_filament_nozzle_map.size()) - ? m_filament_nozzle_map[old_filament_id] : -1; - int new_nozzle = (new_filament_id >= 0 && new_filament_id < (int)m_filament_nozzle_map.size()) - ? m_filament_nozzle_map[new_filament_id] : -1; - char buff[96]; - snprintf(buff, sizeof(buff), ";%s OF%d NF%d ON%d NN%d\n", tag.c_str(), old_filament_id, new_filament_id, old_nozzle, new_nozzle); - return std::string(buff); -} - -// Per-extruder printable-height clamp: is an extruder still allowed to print on this wipe-tower layer, -// or is it its final layer above the extruder's printable height? -// Orca: the arriving extruder id is resolved as m_filament_map[tool]-1 (1-based map, layer-static), -// because Orca's wipe tower is extruder-level rather than tracking a per-layer nozzle map (the same -// idiom the pre-heat path uses in toolchange_wipe_new). Gated on m_is_multi_extruder so that -// single-extruder printers (including ones whose extruder_printable_height defaults to {0}) always -// return true and leave wipe-tower g-code unchanged. -bool WipeTower::is_valid_last_layer(int tool, int layer_id, double layer_z) const -{ - if (!m_is_multi_extruder) - return true; - int extruder_id = (tool >= 0 && tool < (int) m_filament_map.size()) ? m_filament_map[tool] - 1 : -1; - if (extruder_id < 0 || extruder_id >= (int) m_printable_height.size() || extruder_id >= (int) m_last_layer_id.size()) - return true; - if (m_last_layer_id[extruder_id] == layer_id && layer_z > m_printable_height[extruder_id]) - return false; - return true; -} - -// Records, per extruder, the last wipe-tower layer index that uses it, so is_valid_last_layer can -// recognise the extruder's final layer. Inert for single-extruder printers (early return); -// bounds-checked because m_filament_map may be empty/short. -void WipeTower::set_nozzle_last_layer_id() -{ - if (!m_is_multi_extruder) - return; - for (int idx = 0; idx < (int) m_plan.size(); ++idx) { - const auto &info = m_plan[idx]; - for (const auto &tc : info.tool_changes) { - int old_tool = (int) tc.old_tool; - int new_tool = (int) tc.new_tool; - int old_ext = (old_tool >= 0 && old_tool < (int) m_filament_map.size()) ? m_filament_map[old_tool] - 1 : -1; - int new_ext = (new_tool >= 0 && new_tool < (int) m_filament_map.size()) ? m_filament_map[new_tool] - 1 : -1; - if (old_ext >= 0 && old_ext < (int) m_last_layer_id.size()) - m_last_layer_id[old_ext] = idx; - if (new_ext >= 0 && new_ext < (int) m_last_layer_id.size()) - m_last_layer_id[new_ext] = idx; - } - } -} - void WipeTower::reset_block_status() { for (auto &block : m_wipe_tower_blocks) { @@ -3924,6 +4237,39 @@ void WipeTower::reset_block_status() block.last_nozzle_change_id = -1; } } +void WipeTower::set_nozzle_last_layer_id() +{ + for (int idx = 0; idx < m_plan.size(); idx++) { + auto &info = m_plan[idx]; + for(int i =0 ; i= 0) m_last_layer_id[get_extruder_id(old_tool, idx)] = idx; + m_last_layer_id[get_extruder_id(new_tool, idx)] = idx; + } + } +} + +void WipeTower::set_first_layer_flow_ratio(const float flow_ratio) +{ + m_first_layer_flow_ratio = flow_ratio; +} + +// Orca: default/initial-layer/travel acceleration are object-scope options here (PrintConfig +// members read directly in the BBS ctor), so Print resolves the columns and pushes them in. +void WipeTower::set_accelerations(const std::vector &normal, const std::vector &first_layer_normal, + const std::vector &travel, const std::vector &first_layer_travel) +{ + auto to_accels = [](const std::vector &values, std::vector &accels) { + accels.clear(); + for (double value : values) + accels.emplace_back((unsigned int) floor(value + 0.5)); + }; + to_accels(normal, m_normal_accels); + to_accels(first_layer_normal, m_first_layer_normal_accels); + to_accels(travel, m_travel_accels); + to_accels(first_layer_travel, m_first_layer_travel_accels); +} void WipeTower::update_all_layer_depth(float wipe_tower_depth) { @@ -3956,7 +4302,7 @@ void WipeTower::update_all_layer_depth(float wipe_tower_depth) } } -void WipeTower::generate_wipe_tower_blocks() +void WipeTower::generate_wipe_tower_blocks(bool add_solid_flag) { // 1. generate all layer depth m_all_layers_depth.clear(); @@ -3964,7 +4310,7 @@ void WipeTower::generate_wipe_tower_blocks() m_cur_layer_id = 0; for (auto& info : m_plan) { for (const WipeTowerInfo::ToolChange &tool_change : info.tool_changes) { - if (is_in_same_extruder(tool_change.old_tool, tool_change.new_tool)) { + if (!is_need_ramming(tool_change.old_tool, tool_change.new_tool, m_cur_layer_id)) { int filament_adhesiveness_category = get_filament_category(tool_change.new_tool); add_depth_to_block(tool_change.new_tool, filament_adhesiveness_category, tool_change.required_depth); } @@ -3997,35 +4343,13 @@ void WipeTower::generate_wipe_tower_blocks() auto* block = get_block_by_category(iter->first, true); if (block->layer_depths.empty()) { block->layer_depths.resize(all_layer_category_to_depth.size(), 0); - block->solid_infill.resize(all_layer_category_to_depth.size(), false); block->finish_depth.resize(all_layer_category_to_depth.size(), 0); + block->layers_type.resize(all_layer_category_to_depth.size(), WipeTowerLayerType::Normal); } block->depth = std::max(block->depth, iter->second); block->layer_depths[layer_id] = iter->second; } } - - // add solid infill flag - int solid_infill_layer = 4; - for (WipeTowerBlock& block : m_wipe_tower_blocks) { - for (int layer_id = 0; layer_id < all_layer_category_to_depth.size(); ++layer_id) { - std::unordered_map &category_to_depth = all_layer_category_to_depth[layer_id]; - if (is_approx(category_to_depth[block.filament_adhesiveness_category], 0.f)) { - int layer_count = solid_infill_layer; - while (layer_count > 0) { - if (layer_id + layer_count < all_layer_category_to_depth.size()) { - std::unordered_map& up_layer_depth = all_layer_category_to_depth[layer_id + layer_count]; - if (!is_approx(up_layer_depth[block.filament_adhesiveness_category], 0.f)) { - block.solid_infill[layer_id] = true; - break; - } - } - --layer_count; - } - } - } - } - // 4. get real depth for every layer for (int layer_id = m_plan.size() - 1; layer_id >= 0; --layer_id) { m_plan[layer_id].depth = 0; @@ -4045,54 +4369,166 @@ void WipeTower::generate_wipe_tower_blocks() } } } + + // add solid infill flag + if (add_solid_flag) { + int solid_infill_layer_low = 4; + std::vector> layers_used_tools; + + int first_tool = -1; + for (const auto &layer : m_plan) { + if (!layer.tool_changes.empty()) { + first_tool = layer.tool_changes.front().old_tool; + break; + } + } + for (auto &info : m_plan) { + std::unordered_set used_tools; + if (info.tool_changes.empty()) { + used_tools.insert(get_filament_category(first_tool)); + } else { + for (const WipeTowerInfo::ToolChange &tool_change : info.tool_changes) { + used_tools.insert(get_filament_category(tool_change.old_tool)); + used_tools.insert(get_filament_category(tool_change.new_tool)); + } + first_tool = info.tool_changes.back().new_tool; + } + layers_used_tools.push_back(used_tools); + } + + for (WipeTowerBlock &block : m_wipe_tower_blocks) { + for (int layer_id = 0; layer_id < all_layer_category_to_depth.size(); ++layer_id) { + std::unordered_map &category_to_depth = all_layer_category_to_depth[layer_id]; + if (category_to_depth[block.filament_adhesiveness_category] < block.layer_depths[layer_id] - m_perimeter_width) { + bool cur_has_block_category = layers_used_tools[layer_id].count(block.filament_adhesiveness_category); + int layer_count = solid_infill_layer_low; + while (layer_count > 0) { + if (layer_id + layer_count < all_layer_category_to_depth.size()) { + std::unordered_map &up_layer_depth = all_layer_category_to_depth[layer_id + layer_count]; + { + bool up_has_block_category = layers_used_tools[layer_id + layer_count].count(block.filament_adhesiveness_category); + if (cur_has_block_category != up_has_block_category) { + block.layers_type[layer_id] = WipeTowerLayerType::Solid; + break; + } + } + } + --layer_count; + } + } + if (layer_id > 0) { + bool cur_has_block_category = layers_used_tools[layer_id].count(block.filament_adhesiveness_category); + bool pre_has_block_category = layers_used_tools[layer_id - 1].count(block.filament_adhesiveness_category); + if (cur_has_block_category != pre_has_block_category) { block.layers_type[layer_id] = WipeTowerLayerType::Contact; } + if (block.layers_type[layer_id - 1] == WipeTowerLayerType::Contact && block.layers_type[layer_id] != WipeTowerLayerType::Contact) { + block.layers_type[layer_id] = WipeTowerLayerType::Contact_UP; + } + } + } + } + } + +} +void WipeTower::calc_block_infill_gap() +{ + //1.calc block infill gap width + struct BlockInfo + { + bool has_ramming = false; + bool has_reverse_travel = false; + float depth = 0.f; + }; + std::unordered_map block_info; + std::unordered_map high_block_info; + for (int i= (int)m_plan.size()-1;i>=0;i--) + { + for (auto &toolchange : m_plan[i].tool_changes) { + int new_tool =toolchange.new_tool; + int old_tool =toolchange.old_tool; + if (is_need_ramming(old_tool,new_tool, i)) { + bool extruder_change = !is_same_extruder(new_tool, old_tool, i); + block_info[m_filpar[old_tool].category].has_ramming=true; + if (is_need_reverse_travel(old_tool, extruder_change)) block_info[m_filpar[old_tool].category].has_reverse_travel = true; + block_info[m_filpar[old_tool].category].depth += toolchange.nozzle_change_depth; + } + if (!block_info.count(m_filpar[new_tool].category)) block_info.insert({m_filpar[new_tool].category,BlockInfo{}}); + block_info[m_filpar[new_tool].category].depth += toolchange.required_depth - toolchange.nozzle_change_depth; + } + for (auto &block : block_info) { + if (high_block_info.count(block.first) && high_block_info[block.first].depth > block.second.depth) + block.second.depth = high_block_info[block.first].depth; + } + high_block_info = block_info; + + for (auto &block : block_info) { block.second.depth = 0.f;} + if (i == 0) block_info = high_block_info; + } + float max_depth = std::accumulate(block_info.begin(), block_info.end(), 0.f, [](float value, const std::pair &block) { return value + block.second.depth; }); + float height_to_depth = get_limit_depth_by_height(m_wipe_tower_height); + float height_to_spacing = max_depth > height_to_depth ? 1.f : height_to_depth / max_depth; + + float spacing_ratio = m_extra_spacing - 1.f; + float extra_width = spacing_ratio * m_perimeter_width; + float line_gap_tol = 2.f * m_nozzle_change_perimeter_width; //If the block's line_gap is greater than it, the block should be aligned. + for (auto &info : block_info) { + //case1: no ramming, it can always align + if (!info.second.has_ramming) { + m_block_infill_gap_width[info.first].first = m_block_infill_gap_width[info.first].second = extra_width + m_perimeter_width; + } + // case2: has ramming, but no reverse travel + // + else if (!info.second.has_reverse_travel) { + float line_gap = m_nozzle_change_perimeter_width + extra_width; + if (!m_use_rib_wall) line_gap *= height_to_spacing; + if (line_gap < line_gap_tol) { + m_block_infill_gap_width[info.first].first = m_perimeter_width + extra_width; + m_block_infill_gap_width[info.first].second = m_nozzle_change_perimeter_width + extra_width; + } else { + m_block_infill_gap_width[info.first].first = m_block_infill_gap_width[info.first].second = m_nozzle_change_perimeter_width + extra_width; + } + } + // case 3: has ramming and reverse travel + else { + float extra_tpu_fix_spacing = m_tpu_fixed_spacing - 1.f; + float line_gap = m_nozzle_change_perimeter_width + std::max(extra_tpu_fix_spacing * m_perimeter_width, extra_width); + if (!m_use_rib_wall) line_gap = height_to_spacing * line_gap; + if (line_gap < line_gap_tol) { + m_block_infill_gap_width[info.first].first = m_perimeter_width + extra_width; + m_block_infill_gap_width[info.first].second = m_nozzle_change_perimeter_width + std::max(extra_tpu_fix_spacing * m_perimeter_width, extra_width); + } else { + m_block_infill_gap_width[info.first].first = m_block_infill_gap_width[info.first].second = m_nozzle_change_perimeter_width + + std::max(extra_tpu_fix_spacing * m_perimeter_width, extra_width); + } + } + } + + //2. recalculate toolchange depth + for (int idx = 0; idx < m_plan.size(); idx++) { + for (auto &toolchange : m_plan[idx].tool_changes) { + toolchange = set_toolchange(toolchange.old_tool, toolchange.new_tool, m_plan[idx].height, toolchange.wipe_volume, toolchange.purge_volume,idx); + } + } + m_extra_spacing = 1.f; } void WipeTower::plan_tower_new() { if (m_wipe_tower_brim_width < 0) m_wipe_tower_brim_width = get_auto_brim_by_height(m_wipe_tower_height); + calc_block_infill_gap(); if (m_use_rib_wall) { // recalculate wipe_tower_with and layer's depth - generate_wipe_tower_blocks(); + generate_wipe_tower_blocks(false); float max_depth = std::accumulate(m_wipe_tower_blocks.begin(), m_wipe_tower_blocks.end(), 0.f, [](float a, const auto &t) { return a + t.depth; }) + m_perimeter_width; float square_width = align_ceil(std::sqrt(max_depth * m_wipe_tower_width * m_extra_spacing), m_perimeter_width); - //std::cout << " before m_wipe_tower_width = " << m_wipe_tower_width << " max_depth = " << max_depth << std::endl; m_wipe_tower_width = square_width; - float width = m_wipe_tower_width - 2 * m_perimeter_width; for (int idx = 0; idx < m_plan.size(); idx++) { for (auto &toolchange : m_plan[idx].tool_changes) { - float length_to_extrude = toolchange.wipe_length; - float depth = std::ceil(length_to_extrude / width) * m_perimeter_width; - float nozzle_change_depth = 0; - if (!m_filament_map.empty() && m_filament_map[toolchange.old_tool] != m_filament_map[toolchange.new_tool]) { - double e_flow = nozzle_change_extrusion_flow(m_plan[idx].height); - double length = m_filaments_change_length[toolchange.old_tool] / e_flow; - int nozzle_change_line_count = length / (m_wipe_tower_width - 2*m_nozzle_change_perimeter_width) + 1; - if (has_tpu_filament()) - nozzle_change_depth = m_tpu_fixed_spacing * nozzle_change_line_count * m_nozzle_change_perimeter_width; - else - nozzle_change_depth = nozzle_change_line_count * m_nozzle_change_perimeter_width; - depth += nozzle_change_depth; - } - if (nozzle_change_depth == 0 - && !m_filament_nozzle_map.empty() - && toolchange.old_tool < (int)m_filament_nozzle_map.size() && toolchange.new_tool < (int)m_filament_nozzle_map.size() - && m_filament_nozzle_map[toolchange.old_tool] != m_filament_nozzle_map[toolchange.new_tool]) { - double e_flow = nozzle_change_extrusion_flow(m_plan[idx].height); - double length = m_filaments_change_length[toolchange.old_tool] / e_flow; - int nozzle_change_line_count = length / (m_wipe_tower_width - 2*m_nozzle_change_perimeter_width) + 1; - if (has_tpu_filament()) - nozzle_change_depth = m_tpu_fixed_spacing * nozzle_change_line_count * m_nozzle_change_perimeter_width; - else - nozzle_change_depth = nozzle_change_line_count * m_nozzle_change_perimeter_width; - depth += nozzle_change_depth; - } - toolchange.nozzle_change_depth = nozzle_change_depth; - toolchange.required_depth = depth; + toolchange = set_toolchange(toolchange.old_tool, toolchange.new_tool, m_plan[idx].height, toolchange.wipe_volume, toolchange.purge_volume,idx); } } } - generate_wipe_tower_blocks(); + generate_wipe_tower_blocks(true); float max_depth = 0.f; for (const auto &block : m_wipe_tower_blocks) { @@ -4126,28 +4562,29 @@ void WipeTower::plan_tower_new() for (int idx = 0; idx < m_plan.size(); idx++) { auto &info = m_plan[idx]; - if (idx == 0 && m_extra_spacing > 1.f + EPSILON) { + if (idx == 0 /*&& m_extra_spacing > 1.f + EPSILON*/) { // apply solid fill for the first layer info.extra_spacing = 1.f; for (auto &toolchange : info.tool_changes) { - float x_to_wipe = volume_to_length(toolchange.wipe_volume, m_perimeter_width, info.height); + //float x_to_wipe = volume_to_length(toolchange.wipe_volume, m_perimeter_width, info.height); float line_len = m_wipe_tower_width - 2 * m_perimeter_width; - float x_to_wipe_new = x_to_wipe * m_extra_spacing; - x_to_wipe_new = std::floor(x_to_wipe_new / line_len) * line_len; - x_to_wipe_new = std::max(x_to_wipe_new, x_to_wipe); + float wipe_depth = (toolchange.required_depth - toolchange.nozzle_change_depth) * m_extra_spacing; + float wipe_line_count = wipe_depth / m_perimeter_width; + float nozzle_change_depth = toolchange.nozzle_change_depth * m_extra_spacing; - int line_count = std::ceil((x_to_wipe_new - WT_EPSILON) / line_len); - // nozzle change length - int nozzle_change_line_count = (toolchange.nozzle_change_depth + WT_EPSILON) / m_nozzle_change_perimeter_width; + int nozzle_change_line_count = (toolchange.nozzle_change_depth * m_extra_spacing + WT_EPSILON) / m_nozzle_change_perimeter_width; - toolchange.required_depth = line_count * m_perimeter_width + nozzle_change_line_count * m_nozzle_change_perimeter_width; - toolchange.wipe_volume = x_to_wipe_new / x_to_wipe * toolchange.wipe_volume; - toolchange.wipe_length = x_to_wipe_new; + toolchange.required_depth = wipe_depth + nozzle_change_depth; + toolchange.wipe_length = wipe_line_count * line_len; + toolchange.wipe_volume = length_to_volume(toolchange.wipe_length, m_perimeter_width, info.height); + toolchange.nozzle_change_length = nozzle_change_line_count * (m_wipe_tower_width - (m_nozzle_change_perimeter_width + m_perimeter_width)); + toolchange.nozzle_change_depth = nozzle_change_depth; } } else { info.extra_spacing = m_extra_spacing; for (auto &toolchange : info.tool_changes) { toolchange.required_depth *= m_extra_spacing; + toolchange.nozzle_change_depth *= m_extra_spacing; toolchange.wipe_length = volume_to_length(toolchange.wipe_volume, m_perimeter_width, info.height); } } @@ -4155,7 +4592,8 @@ void WipeTower::plan_tower_new() } update_all_layer_depth(max_depth); - set_nozzle_last_layer_id(); // record per-extruder last layer for is_valid_last_layer + set_nozzle_last_layer_id(); + if(m_use_gap_wall) get_all_wall_skip_points(); float diagonal = sqrt(m_wipe_tower_depth * m_wipe_tower_depth + m_wipe_tower_width * m_wipe_tower_width); m_rib_length = std::max({m_rib_length, diagonal}); m_rib_length += m_extra_rib_length; @@ -4227,7 +4665,6 @@ void WipeTower::generate_new(std::vector layer_result; int index = 0; - std::unordered_set solid_blocks_id;// The contact surface of different bonded materials is solid. for (auto layer : m_plan) { reset_block_status(); m_cur_layer_id = index++; - m_prev_layer_had_interface = m_current_layer_has_interface; - m_current_layer_has_interface = !solid_blocks_id.empty(); set_layer(layer.z, layer.height, 0, false, layer.z == m_plan.back().z); - if (m_layer_info->depth < m_perimeter_width) continue; - if (m_wipe_tower_blocks.size() == 1) { if (m_layer_info->depth < m_wipe_tower_depth - m_perimeter_width) { // align y shift to perimeter width @@ -4263,32 +4695,30 @@ void WipeTower::generate_new(std::vector int { + auto get_wall_filament_for_this_layer = [this, &layer, &wall_filament]() -> int { if (layer.tool_changes.size() == 0) return -1; int candidate_id = -1; for (size_t idx = 0; idx < layer.tool_changes.size(); ++idx) { if (idx == 0) { - // An extruder's last-layer filament above its printable height cannot supply the - // outer wall. is_valid_last_layer is inert unless it clamps. - if (layer.tool_changes[idx].old_tool == wall_filament_id && is_valid_last_layer(layer.tool_changes[idx].old_tool, m_cur_layer_id, layer.z)) - return wall_filament_id; - else if (m_filpar[layer.tool_changes[idx].old_tool].category == m_filpar[wall_filament_id].category && - is_valid_last_layer(layer.tool_changes[idx].old_tool, m_cur_layer_id, layer.z)) { + if (layer.tool_changes[idx].old_tool == wall_filament && is_valid_last_layer(layer.tool_changes[idx].old_tool, this->m_cur_layer_id, layer.z)) + return wall_filament; + else if (m_filpar[layer.tool_changes[idx].old_tool].category == m_filpar[wall_filament].category && + is_valid_last_layer(layer.tool_changes[idx].old_tool, this->m_cur_layer_id, layer.z)) { candidate_id = layer.tool_changes[idx].old_tool; } } - if (layer.tool_changes[idx].new_tool == wall_filament_id) { - return wall_filament_id; + if (layer.tool_changes[idx].new_tool == wall_filament) { + return wall_filament; } - if ((candidate_id == -1) && (m_filpar[layer.tool_changes[idx].new_tool].category == m_filpar[wall_filament_id].category)) + if ((candidate_id == -1) && (m_filpar[layer.tool_changes[idx].new_tool].category == m_filpar[wall_filament].category)) candidate_id = layer.tool_changes[idx].new_tool; } return candidate_id == -1 ? layer.tool_changes[0].new_tool : candidate_id; @@ -4300,7 +4730,7 @@ void WipeTower::generate_new(std::vectorlayers_type[m_cur_layer_id] == WipeTowerLayerType::Contact; const auto * block2 = get_block_by_category(m_filpar[layer.tool_changes[i].old_tool].category, false); - id = std::find_if(m_wipe_tower_blocks.begin(), m_wipe_tower_blocks.end(), [&](const WipeTowerBlock &b) { return &b == block2; }) - m_wipe_tower_blocks.begin(); - bool solid_nozzlechange = solid_blocks_id.count(id); + if(block2) solid_nozzlechange = block2->layers_type[m_cur_layer_id] == WipeTowerLayerType::Contact; layer_result.emplace_back(tool_change_new(layer.tool_changes[i].new_tool, solid_toolchange,solid_nozzlechange)); if (i == 0 && (layer.tool_changes[i].old_tool == wall_idx)) { @@ -4348,7 +4777,6 @@ void WipeTower::generate_new(std::vector next_solid_blocks_id; // insert finish block if (wall_idx != -1) { if (layer.tool_changes.empty()) { @@ -4361,7 +4789,8 @@ void WipeTower::generate_new(std::vector> &result) @@ -4521,7 +4940,7 @@ void WipeTower::generate(std::vector> & } if (i == idx) { - layer_result.emplace_back(tool_change(layer.tool_changes[i].new_tool, m_enable_timelapse_print ? false : true)); + layer_result.emplace_back(tool_change(layer.tool_changes[i].new_tool, m_enable_timelapse_print ? false : true, false)); // finish_layer will be called after this toolchange finish_layer_tcr = finish_layer(false, layer.extruder_fill); } @@ -4529,7 +4948,7 @@ void WipeTower::generate(std::vector> & if (idx == -1 && i == 0) { layer_result.emplace_back(tool_change(layer.tool_changes[i].new_tool, false, true)); } else { - layer_result.emplace_back(tool_change(layer.tool_changes[i].new_tool)); + layer_result.emplace_back(tool_change(layer.tool_changes[i].new_tool, false, false)); } } } @@ -4552,21 +4971,23 @@ void WipeTower::generate(std::vector> & result.emplace_back(std::move(layer_result)); } } - +#endif WipeTower::ToolChangeResult WipeTower::only_generate_out_wall(bool is_new_mode) { size_t old_tool = m_current_tool; - WipeTowerWriter writer(m_layer_height, m_perimeter_width, m_gcode_flavor, m_filpar); + WipeTowerWriter writer(m_layer_height, m_perimeter_width, m_gcode_flavor, m_filpar, m_enable_arc_fitting); writer.set_extrusion_flow(m_extrusion_flow) .set_z(m_z_pos) .set_initial_tool(m_current_tool) .set_y_shift(m_y_shift - (m_current_shape == SHAPE_REVERSED ? m_layer_info->toolchanges_depth() : 0.f)); + set_for_wipe_tower_writer(writer); + // Slow down on the 1st layer. bool first_layer = is_first_layer(); // BBS: speed up perimeter speed to 90mm/s for non-first layer - float feedrate = first_layer ? std::min(m_first_layer_speed * 60.f, 5400.f) : std::min(60.0f * m_filpar[m_current_tool].max_e_speed / m_extrusion_flow, 5400.f); + float feedrate = first_layer ? std::min(m_first_layer_speed * 60.f, m_max_speed) : std::min(60.0f * m_filpar[m_current_tool].max_e_speed / m_extrusion_flow, m_max_speed); float fill_box_y = m_layer_info->toolchanges_depth() + m_perimeter_width; box_coordinates fill_box(Vec2f(m_perimeter_width, fill_box_y), m_wipe_tower_width - 2 * m_perimeter_width, m_layer_info->depth - fill_box_y); @@ -4679,7 +5100,9 @@ Polygon WipeTower::generate_support_wall_new(WipeTowerWriter &writer, const box_ } if (!extrude_perimeter) return wall_polygon; - if (skip_points) { result_wall = contrust_gap_for_skip_points(wall_polygon,m_wall_skip_points,m_wipe_tower_width,2.5*m_perimeter_width,insert_skip_polygon); } + if (skip_points) { + result_wall = contrust_gap_for_skip_points(wall_polygon, m_wall_skip_points[m_cur_layer_id], m_wipe_tower_width, 2.5 * m_perimeter_width, insert_skip_polygon); + } else { result_wall.push_back(to_polyline(wall_polygon)); insert_skip_polygon = wall_polygon; @@ -4689,7 +5112,6 @@ Polygon WipeTower::generate_support_wall_new(WipeTowerWriter &writer, const box_ BoundingBox bbox = get_extents(result_wall); m_rib_offset = Vec2f(-unscaled(bbox.min.x()), -unscaled(bbox.min.y())); } - return insert_skip_polygon; } @@ -4699,7 +5121,7 @@ Polygon WipeTower::generate_support_wall(WipeTowerWriter &writer, const box_coor float retract_speed = m_filpar[m_current_tool].retract_speed *60 ; bool is_left = false; bool is_right = false; - for (auto pt : m_wall_skip_points) { + for (auto pt : m_wall_skip_points[m_cur_layer_id]) { if (abs(pt.x()) < EPSILON) { is_left = true; } else if (abs(pt.x() - m_wipe_tower_width) < EPSILON) { @@ -4750,7 +5172,7 @@ Polygon WipeTower::generate_support_wall(WipeTowerWriter &writer, const box_coor index = (index + 1) % 4; if (index == 2) { if (is_right) { - std::vector break_segments = remove_points_from_segment(Segment(wt_box.rd, wt_box.ru), m_wall_skip_points, 2.5 * m_perimeter_width); + std::vector break_segments = remove_points_from_segment(Segment(wt_box.rd, wt_box.ru), m_wall_skip_points[m_cur_layer_id], 2.5 * m_perimeter_width); for (auto iter = break_segments.begin(); iter != break_segments.end(); ++iter) { float dx = iter->start.x() - writer.pos().x(); float dy = iter->start.y() - writer.pos().y(); @@ -4770,7 +5192,7 @@ Polygon WipeTower::generate_support_wall(WipeTowerWriter &writer, const box_coor } } else if (index == 0) { if (is_left) { - std::vector break_segments = remove_points_from_segment(Segment(wt_box.ld, wt_box.lu), m_wall_skip_points, 2.5 * m_perimeter_width); + std::vector break_segments = remove_points_from_segment(Segment(wt_box.ld, wt_box.lu), m_wall_skip_points[m_cur_layer_id], 2.5 * m_perimeter_width); for (auto iter = break_segments.rbegin(); iter != break_segments.rend(); ++iter) { float dx = iter->end.x() - writer.pos().x(); float dy = iter->end.y() - writer.pos().y(); @@ -4831,4 +5253,43 @@ bool WipeTower::need_thick_bridge_flow(float pos_y) const { return false; } +bool WipeTower::is_valid_last_layer(int tool, int layer_id, double layer_z) const +{ + int extruder_id = get_extruder_id(tool, layer_id); + if (extruder_id < 0 || extruder_id >= m_printable_height.size()) return true; + if (m_last_layer_id[extruder_id] == layer_id && layer_z > m_printable_height[extruder_id]) return false; + return true; +} +float WipeTower::get_block_gap_width(int tool,bool is_nozzlechangle) +{ + //assert(m_block_infill_gap_width.count(m_filpar[tool].category));//The code contains logic that attempts to access non-existent blocks, + // such as in case of involving two extruders with only a single head and a single layer, + // some code will attempt to access the block's nozzle_change_gap_width, even though the block does not exist. + if (!m_block_infill_gap_width.count(m_filpar[tool].category)) { + return is_nozzlechangle ? m_nozzle_change_perimeter_width : m_perimeter_width; + } + return is_nozzlechangle ? m_block_infill_gap_width[m_filpar[tool].category].second : m_block_infill_gap_width[m_filpar[tool].category].first; + +} + +bool WipeTower::is_need_ramming(int filament_id_1, int filament_id_2, int layer_id) const +{ + return !m_multi_nozzle_group_result->are_filaments_same_nozzle(filament_id_1, filament_id_2, layer_id); +} +bool WipeTower::is_same_extruder(int filament_id_1, int filament_id_2, int layer_id) const +{ + return m_multi_nozzle_group_result->are_filaments_same_extruder(filament_id_1, filament_id_2, layer_id); +} + +bool WipeTower::is_same_nozzle(int filament_id_1, int filament_id_2, int layer_id) const +{ + return m_multi_nozzle_group_result->are_filaments_same_nozzle(filament_id_1, filament_id_2, layer_id); +} + +int WipeTower::get_nozzle_id(int filament_id, int layer_id) const { return m_multi_nozzle_group_result->get_nozzle_id(filament_id, layer_id); } + +int WipeTower::get_extruder_id(int filament_id, int layer_id) const { + return m_multi_nozzle_group_result->get_extruder_id(filament_id, layer_id); +} + } // namespace Slic3r diff --git a/src/libslic3r/GCode/WipeTower.hpp b/src/libslic3r/GCode/WipeTower.hpp index 508765824e..07f9a8f269 100644 --- a/src/libslic3r/GCode/WipeTower.hpp +++ b/src/libslic3r/GCode/WipeTower.hpp @@ -12,7 +12,7 @@ #include "libslic3r/Polyline.hpp" #include "libslic3r/TriangleMesh.hpp" #include - +#include "libslic3r/MultiNozzleUtils.hpp" namespace Slic3r { @@ -84,7 +84,6 @@ public: bool priming; bool is_tool_change{false}; - bool is_contact{false}; Vec2f tool_change_start_pos; // Pass a polyline so that normal G-code generator can do a wipe for us. @@ -108,6 +107,7 @@ public: // executing the gcode finish_layer_tcr. bool is_finish_first = false; + bool is_contact = false; NozzleChangeResult nozzle_change_result; // Sum the total length of the extrusion. @@ -122,6 +122,8 @@ public: } return e_length; } + // Orca: set by WipeTower2 (non-BBL tower) to force a travel to the tower even when the + // previous position is unknown; read by WipeTowerIntegration::append_tcr2 (GCode.cpp). bool force_travel = false; }; @@ -162,15 +164,12 @@ public: bool priming, size_t old_tool, bool is_finish, - bool is_tool_change, - float purge_volume, - bool is_contact = false) const; + bool is_tool_change, float purge_volume, bool is_contact) const; ToolChangeResult construct_block_tcr(WipeTowerWriter& writer, bool priming, size_t filament_id, - bool is_finish, - float purge_volume) const; + bool is_finish, float purge_volume) const; // x -- x coordinates of wipe tower in mm ( left bottom corner ) @@ -184,9 +183,14 @@ public: // Set the extruder properties. void set_extruder(size_t idx, const PrintConfig& config); + void set_shared_print_bed(const Polygons &bed) { m_shared_print_bed = bed; } + // Orca: has_filament_switcher is not a static PrintConfig member here, so it is pushed in from + // Print via a setter rather than read in the ctor. Device-set only. + void set_has_filament_switcher(bool v) { m_has_filament_switcher = v; } // Appends into internal structure m_plan containing info about the future wipe tower // to be used before building begins. The entries must be added ordered in z. - void plan_toolchange(float z_par, float layer_height_par, unsigned int old_tool, unsigned int new_tool, float wipe_volume = 0.f, float prime_volume = 0.f); + void plan_toolchange(float z_par, float layer_height_par, unsigned int old_tool, unsigned int new_tool, float wipe_volume_ec = 0.f, float wipe_volume_nc = 0.f, float prime_volume = 0.f); + // Iterates through prepared m_plan, generates ToolChangeResults and appends them to "result" void generate(std::vector> &result); @@ -219,9 +223,6 @@ public: } } - void set_wipe_volume(std::vector>& wiping_matrix) { - wipe_volumes = wiping_matrix; - } // Switch to a next layer. void set_layer( @@ -250,7 +251,6 @@ public: // Calculate extrusion flow from desired line width, nozzle diameter, filament diameter and layer_height: m_extrusion_flow = extrusion_flow(layer_height); - // Advance m_layer_info iterator, making sure we got it right while (!m_plan.empty() && m_layer_info->z < print_z - WT_EPSILON && m_layer_info+1 != m_plan.end()) ++m_layer_info; @@ -309,20 +309,9 @@ public: std::vector get_used_filament() const { return m_used_filament_length; } int get_number_of_toolchanges() const { return m_num_tool_changes; } - void set_filament_map(const std::vector &filament_map) { m_filament_map = filament_map; } - // Vortek H2C: filament_id → physical nozzle_id for carousel rotation detection - void set_filament_nozzle_map(const std::vector &nozzle_map) { m_filament_nozzle_map = nozzle_map; } - void set_has_tpu_filament(bool has_tpu) { m_has_tpu_filament = has_tpu; } + bool has_tpu_filament() const { return m_has_tpu_filament; } - - // Orca: has_filament_switcher is not a static PrintConfig member, so it is pushed in from Print - // via a setter rather than read in the ctor. Device-set only. - void set_has_filament_switcher(bool v) { m_has_filament_switcher = v; } - // The region every extruder can reach, used to clamp the PETG pre-extrusion offset to the - // printable bed. - void set_shared_print_bed(const Polygons &bed) { m_shared_print_bed = bed; } - struct FilamentParameters { std::string material = "PLA"; int category; @@ -331,15 +320,15 @@ public: bool is_support = false; int nozzle_temperature = 0; int nozzle_temperature_initial_layer = 0; - int interface_print_temperature = 0; - float loading_speed = 0.f; - float loading_speed_start = 0.f; - float unloading_speed = 0.f; - float unloading_speed_start = 0.f; - float delay = 0.f ; - int cooling_moves = 0; - float cooling_initial_speed = 0.f; - float cooling_final_speed = 0.f; + // BBS: remove useless config + //float loading_speed = 0.f; + //float loading_speed_start = 0.f; + //float unloading_speed = 0.f; + //float unloading_speed_start = 0.f; + //float delay = 0.f ; + //int cooling_moves = 0; + //float cooling_initial_speed = 0.f; + //float cooling_final_speed = 0.f; float ramming_line_width_multiplicator = 1.f; float ramming_step_multiplicator = 1.f; float max_e_speed = std::numeric_limits::max(); @@ -349,41 +338,41 @@ public: float retract_length; float retract_speed; float wipe_dist; - float tower_interface_pre_extrusion_dist = 0.f; - float tower_interface_pre_extrusion_length = 0.f; - // Outward shift of the wipe start for a PETG pre-extrusion on filament-switcher devices; - // set from filament_tower_interface_pre_extrusion_dist. - float petg_pre_extrusion_offset_dist = 0.f; - float tower_ironing_area = 4.f; - float tower_interface_purge_length = 0.f; - // Distance (in mm of filament) that a hotend is allowed to pre-cool before the - // tower is reached; drives the prime-tower heating-during-wipe model (multi-nozzle only). - float filament_cooling_before_tower = 0.f; - // .first = extruder change, .second = nozzle change (carousel) - std::pair max_e_ramming_speed{0.f, 0.f}; - std::pair ramming_travel_time{0.f, 0.f}; - std::pair precool_target_temp{0, 0}; - std::pair,std::vector> precool_t; - std::pair,std::vector> precool_t_first_layer; + std::pair max_e_ramming_speed;//[0]extruder change [1]nozzle change + std::pair ramming_travel_time; // Travel time after ramming + std::pair,std::vector> precool_t;//Pre-cooling time, set to 0 to ensure the ramming speed is controlled solely by ramming volumetric speed. + std::pair, std::vector> precool_t_first_layer; + std::pair precool_target_temp; + float filament_cooling_before_tower = 0.f; + float flat_iron_area; + float filament_tower_interface_print_temp; + float filament_tower_interface_pre_extrusion_dist = 0; + float filament_tower_interface_pre_extrusion_length = 0; + float filament_petg_pre_extrusion_offset_dist = 0; }; - void set_used_filament_ids(const std::vector &used_filament_ids) { m_used_filament_ids = used_filament_ids; }; + void set_used_filament_ids(const std::vector &used_filament_ids) { m_used_filament_ids = used_filament_ids; }; void set_filament_categories(const std::vector & filament_categories) { m_filament_categories = filament_categories;}; - std::vector m_used_filament_ids; + void set_nozzle_group_result(const MultiNozzleUtils::LayeredNozzleGroupResult &multi_nozzle_group_result) { m_multi_nozzle_group_result = &multi_nozzle_group_result; }; + std::vector m_used_filament_ids; std::vector m_filament_categories; + const MultiNozzleUtils::LayeredNozzleGroupResult *m_multi_nozzle_group_result{nullptr}; + + enum class WipeTowerLayerType : unsigned char { Normal, Contact, Solid, Contact_UP};// Contact layer should be solid and reduce feed struct WipeTowerBlock { int block_id{0}; int filament_adhesiveness_category{0}; std::vector layer_depths; - std::vector solid_infill; + //std::vector solid_infill; std::vector finish_depth{0}; // the start pos of finish frame for every layer + std::vector layers_type; // type of the layer, normal, Contact or Solid float depth{0}; float start_depth{0}; float cur_depth{0}; - int last_filament_change_id{-1}; + int last_filament_change_id{-1}; int last_nozzle_change_id{-1}; }; @@ -403,25 +392,33 @@ public: WipeTowerBlock* get_block_by_category(int filament_adhesiveness_category, bool create); void add_depth_to_block(int filament_id, int filament_adhesiveness_category, float depth, bool is_nozzle_change = false); int get_filament_category(int filament_id); - bool is_in_same_extruder(int filament_id_1, int filament_id_2); - // Vortek H2C: format BBS-compatible NOZZLE_CHANGE_START/END tag with OF/NF/ON/NN payload - std::string format_nozzle_change_tag(bool start, int old_filament_id, int new_filament_id) const; void reset_block_status(); int get_wall_filament_for_all_layer(); // for generate new wipe tower void generate_new(std::vector> &result); void plan_tower_new(); - void generate_wipe_tower_blocks(); + void generate_wipe_tower_blocks(bool add_solid_flag); void update_all_layer_depth(float wipe_tower_depth); - + void set_nozzle_last_layer_id(); + void set_first_layer_flow_ratio(const float flow_ratio); + // Orca: default/initial-layer/travel acceleration are object-scope options here (PrintConfig + // members in BBS), so Print pushes the resolved per-variant columns in via this setter. + void set_accelerations(const std::vector &normal, const std::vector &first_layer_normal, + const std::vector &travel, const std::vector &first_layer_travel); + void calc_block_infill_gap(); ToolChangeResult tool_change_new(size_t new_tool, bool solid_change = false, bool solid_nozzlechange=false); - NozzleChangeResult nozzle_change_new(int old_filament_id, int new_filament_id, bool solid_change = false); + NozzleChangeResult ramming(int old_filament_id, int new_filament_id, bool solid_change = false, bool extruder_change = true); // extruder_chang means nozzle_change ToolChangeResult finish_layer_new(bool extrude_perimeter = true, bool extrude_fill = true, bool extrude_fill_wall = true); ToolChangeResult finish_block(const WipeTowerBlock &block, int filament_id, bool extrude_fill = true); - ToolChangeResult finish_block_solid(const WipeTowerBlock &block, int filament_id, bool extrude_fill = true ,bool interface_solid =false); + ToolChangeResult finish_block_solid(const WipeTowerBlock &block, int filament_id, bool extrude_fill = true, WipeTowerLayerType layer_type = WipeTowerLayerType::Normal); void toolchange_wipe_new(WipeTowerWriter &writer, const box_coordinates &cleaning_box, float wipe_length,bool solid_toolchange=false); Vec2f get_rib_offset() const { return m_rib_offset; } + bool is_need_ramming(int filament_id_1, int filament_id_2, int layer_id) const; + bool is_same_extruder(int filament_id_1, int filament_id_2, int layer_id) const; + bool is_same_nozzle(int filament_id_1, int filament_id_2, int layer_id) const; + int get_nozzle_id(int filament_id, int layer_id) const; + int get_extruder_id(int filament_id, int layer_id) const; private: enum wipe_shape // A fill-in direction @@ -441,7 +438,6 @@ private: bool m_enable_wrapping_detection = false; bool m_enable_timelapse_print = false; bool m_semm = true; // Are we using a single extruder multimaterial printer? - bool m_purge_in_prime_tower = false; // Do we purge in the prime tower? Vec2f m_wipe_tower_pos; // Left front corner of the wipe tower in mm. float m_wipe_tower_width; // Width of the wipe tower. float m_wipe_tower_depth = 0.f; // Depth of the wipe tower @@ -459,12 +455,11 @@ private: float m_travel_speed = 0.f; float m_first_layer_speed = 0.f; size_t m_first_layer_idx = size_t(-1); - - std::vector m_filaments_change_length; + Vec2f m_origin; + std::vector m_last_layer_id; + std::pair,std::vector> m_filaments_change_length;//[0]extruder change [1]nozzle change size_t m_cur_layer_id; NozzleChangeResult m_nozzle_change_result; - std::vector m_filament_map; - std::vector m_filament_nozzle_map; // Vortek H2C: filament_id → physical nozzle_id bool m_has_tpu_filament{false}; bool m_is_multi_extruder{false}; bool m_use_gap_wall{false}; @@ -475,33 +470,32 @@ private: bool m_used_fillet{false}; Vec2f m_rib_offset{Vec2f(0.f, 0.f)}; bool m_tower_framework{false}; - + bool m_need_reverse_travel{false}; + bool m_enable_tower_interface_features{false}; // G-code generator parameters. - float m_cooling_tube_retraction = 0.f; - float m_cooling_tube_length = 0.f; - float m_parking_pos_retraction = 0.f; - float m_extra_loading_move = 0.f; + // BBS: remove useless config + //float m_cooling_tube_retraction = 0.f; + //float m_cooling_tube_length = 0.f; + //float m_parking_pos_retraction = 0.f; + //float m_extra_loading_move = 0.f; float m_bridging = 0.f; bool m_no_sparse_layers = false; - bool m_set_extruder_trimpot = false; + // BBS: remove useless config + //bool m_set_extruder_trimpot = false; bool m_adhesion = true; GCodeFlavor m_gcode_flavor; - - // Multi-nozzle prime-tower heating during wipe. m_is_multiple_nozzle gates the whole - // feature; it is false for every current (single-nozzle) printer (extruder_max_nozzle_count - // defaults to 1), so the pre-heat/pre-cool path is inert and wipe-tower g-code is unchanged. - bool m_is_multiple_nozzle = false; - std::vector m_hotend_heating_rate; // config.hotend_heating_rate (deg/s per extruder) - std::vector m_physical_extruder_map; // logical extruder -> physical tool number (M104 T param) - - // Per-extruder printable-height clamp. m_printable_height = config.extruder_printable_height - // (per-extruder Z limit; empty for single-extruder printers, [320,325] for H2D). m_last_layer_id - // records, per extruder, the last wipe-tower layer that uses it. is_valid_last_layer() is gated on - // m_is_multi_extruder so single-extruder wipe-tower g-code is unchanged; the clamp only bites a - // multi-extruder wipe tower whose final per-extruder layer exceeds that extruder's printable - // height (near the Z limit). - std::vector m_printable_height; - std::vector m_last_layer_id; + bool m_is_multiple_nozzle = false; + std::vector m_normal_accels; + std::vector m_first_layer_normal_accels; + std::vector m_travel_accels; + std::vector m_first_layer_travel_accels; + unsigned int m_max_accels; + bool m_accel_to_decel_enable; + float m_accel_to_decel_factor; + bool m_enable_arc_fitting = true; + std::vector m_hotend_heating_rate; + std::vector m_hotend_cooling_rate; + Polygons m_shared_print_bed; // Bed properties enum { @@ -512,10 +506,11 @@ private: float m_bed_width; // width of the bed bounding box Vec2f m_bed_bottom_left; // bottom-left corner coordinates (for rectangular beds) + float m_first_layer_flow_ratio; float m_perimeter_width = 0.4f * Width_To_Nozzle_Ratio; // Width of an extrusion line, also a perimeter spacing for 100% infill. float m_nozzle_change_perimeter_width = 0.4f * Width_To_Nozzle_Ratio; float m_extrusion_flow = 0.038f; //0.029f;// Extrusion flow is derived from m_perimeter_width, layer height and filament diameter. - + std::unordered_map> m_block_infill_gap_width; // categories to infill_gap: toolchange gap, nozzlechange gap // Extruder specific parameters. std::vector m_filpar; @@ -528,50 +523,52 @@ private: // A fill-in direction (positive Y, negative Y) alternates with each layer. wipe_shape m_current_shape = SHAPE_NORMAL; size_t m_current_tool = 0; - // Orca: support mmu wipe tower - std::vector> wipe_volumes; + // BBS + //const std::vector> wipe_volumes; float m_depth_traversed = 0.f; // Current y position at the wipe tower. bool m_current_layer_finished = false; bool m_left_to_right = true; float m_extra_spacing = 1.f; float m_tpu_fixed_spacing = 2; - std::vector m_wall_skip_points; + float m_max_speed = 5400.f; // the maximum printing speed on the prime tower. + std::vector> m_wall_skip_points; std::map m_outer_wall; + std::vector m_printable_height; bool is_first_layer() const { return size_t(m_layer_info - m_plan.begin()) == m_first_layer_idx; } + bool is_valid_last_layer(int tool, int layer_id, double layer_z) const; bool m_flat_ironing=false; - bool m_enable_tower_interface_features=false; - bool m_enable_tower_interface_cooldown_during_tower=false; - // Filament-switcher device flag + shared printable bed for the PETG pre-extrusion offset. - // m_has_filament_switcher is false for the whole shipping fleet (no profile sets the key), so - // the PETG branch in get_next_pos never runs -> no change fleet-wide. - bool m_has_filament_switcher=false; - Polygons m_shared_print_bed; - bool m_prev_layer_had_interface=false; - bool m_current_layer_has_interface=false; + bool m_contact_ironing = false; + bool m_has_filament_switcher = false; + float m_contact_speed = 20 * 60.f; + std::vector m_physical_extruder_map; // Calculates length of extrusion line to extrude given volume float volume_to_length(float volume, float line_width, float layer_height) const { return std::max(0.f, volume / (layer_height * (line_width - layer_height * (1.f - float(M_PI) / 4.f)))); } - + // Calculates volume of extrusion line + float length_to_volume(float length,float line_width, float layer_height) const + { + return std::max(0.f, length * (layer_height * (line_width - layer_height * (1.f - float(M_PI) / 4.f)))); + } // Calculates depth for all layers and propagates them downwards void plan_tower(); // Goes through m_plan and recalculates depths and width of the WT to make it exactly square - experimental void make_wipe_tower_square(); - Vec2f get_next_pos(const WipeTower::box_coordinates &cleaning_box, float wipe_length, bool interface_layer, size_t interface_tool); + Vec2f get_next_pos(const WipeTower::box_coordinates &cleaning_box, float wipe_length, bool solid_toolchange); // Goes through m_plan, calculates border and finish_layer extrusions and subtracts them from last wipe void save_on_last_wipe(); bool is_tpu_filament(int filament_id) const; bool is_petg_filament(int filament_id) const; - bool is_need_reverse_travel(int filament_id, bool extruder_change) const; - + bool is_need_reverse_travel(int filament, bool extruder_change) const; // BBS box_coordinates align_perimeter(const box_coordinates& perimeter_box); + void set_for_wipe_tower_writer(WipeTowerWriter &writer); // to store information about tool changes for a given layer struct WipeTowerInfo{ @@ -584,6 +581,7 @@ private: float wipe_volume; float wipe_length; float nozzle_change_depth{0}; + float nozzle_change_length{0}; // BBS float purge_volume; ToolChange(size_t old, size_t newtool, float depth=0.f, float ramming_depth=0.f, float fwl=0.f, float wv=0.f, float wl = 0, float pv = 0) @@ -613,7 +611,7 @@ private: // ot -1 if there is no such toolchange. int first_toolchange_to_nonsoluble_nonsupport( const std::vector& tool_changes) const; - + WipeTowerInfo::ToolChange set_toolchange(int old_tool, int new_tool, float layer_height, float wipe_volume, float purge_volume,int layer_id); void toolchange_Unload( WipeTowerWriter &writer, const box_coordinates &cleaning_box, @@ -633,13 +631,10 @@ private: WipeTowerWriter &writer, const box_coordinates &cleaning_box, float wipe_volume); - void get_wall_skip_points(const WipeTowerInfo &layer); - - // Per-extruder printable-height clamp (see m_printable_height). is_valid_last_layer returns - // false only for a multi-extruder wipe tower's final per-extruder layer that exceeds that - // extruder's printable height; returns true (no clamp) in every other case. - bool is_valid_last_layer(int tool, int layer_id, double layer_z) const; - void set_nozzle_last_layer_id(); + void get_wall_skip_points(const WipeTowerInfo &layer,int layer_id); + void get_all_wall_skip_points(); + ToolChangeResult merge_tcr(ToolChangeResult &first, ToolChangeResult &second); + float get_block_gap_width(int tool, bool is_nozzlechangle = false); }; diff --git a/src/libslic3r/Polyline.hpp b/src/libslic3r/Polyline.hpp index 88671391db..f52c3c9bbd 100644 --- a/src/libslic3r/Polyline.hpp +++ b/src/libslic3r/Polyline.hpp @@ -129,13 +129,13 @@ public: std::vector fitting_result; //BBS: simplify points by arc fitting void simplify_by_fitting_arc(double tolerance); - //BBS: + void reset_to_linear_move(); + //BBS: Polylines equally_spaced_lines(double distance) const; private: void append_fitting_result_after_append_points(); void append_fitting_result_after_append_polyline(const Polyline& src); - void reset_to_linear_move(); bool split_fitting_result_before_index(const size_t index, Point &new_endpoint, std::vector& data) const; bool split_fitting_result_after_index(const size_t index, Point &new_startpoint, std::vector& data) const; }; diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 334bda84e9..3f06cd5b37 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -4017,10 +4017,33 @@ void Print::_make_wipe_tower() // in BBL machine, wipe tower is only use to prime extruder. So just use a global wipe volume. WipeTower wipe_tower(m_config, m_plate_index, m_origin, m_wipe_tower_data.tool_ordering.first_extruder(), m_wipe_tower_data.tool_ordering.empty() ? 0.f : m_wipe_tower_data.tool_ordering.back().print_z, m_wipe_tower_data.tool_ordering.all_extruders()); + // Orca: the tower's first-layer flow follows the user's first-layer flow ratio (BBS reads + // its initial_layer_flow_ratio here — STUDIO-14254; first_layer_flow_ratio is Orca's analog, + // default 1.0 in both). Honor the set_other_flow_ratios gate that governs the option + // everywhere else. + wipe_tower.set_first_layer_flow_ratio(m_default_object_config.set_other_flow_ratios + ? float(m_default_region_config.first_layer_flow_ratio) + : 1.f); wipe_tower.set_has_tpu_filament(this->has_tpu_filament()); - wipe_tower.set_filament_map(this->get_filament_maps()); - // Vortek H2C: pass nozzle-level map for carousel rotation detection in tool_change_new() - wipe_tower.set_filament_nozzle_map(this->get_filament_nozzle_maps()); + // Per-layer filament->nozzle grouping. sort_and_build_data() above publishes it on the Print + // for by-layer prints; by-object prints publish only later (psSkirtBrim), so fall back to the + // ToolOrdering's own copy there. set_extruder() below dereferences it, so it must be set first. + auto print_group_result = get_layered_nozzle_group_result(); + const MultiNozzleUtils::LayeredNozzleGroupResult &nozzle_group_result = + print_group_result ? *print_group_result : m_wipe_tower_data.tool_ordering.get_layered_nozzle_group_result(); + wipe_tower.set_nozzle_group_result(nozzle_group_result); + { + // Orca: acceleration options are object-scope (PrintConfig members in BBS), so resolve + // the per-variant columns here; initial_layer_travel_acceleration is FloatOrPercent + // over travel_acceleration and needs the full config to resolve. + std::vector first_layer_travel_accels; + for (size_t i = 0; i < m_config.initial_layer_travel_acceleration.values.size(); ++i) + first_layer_travel_accels.emplace_back(m_full_print_config.get_abs_value_at("initial_layer_travel_acceleration", i)); + wipe_tower.set_accelerations(m_default_object_config.default_acceleration.values, + m_default_object_config.initial_layer_acceleration.values, + m_default_object_config.travel_acceleration.values, + first_layer_travel_accels); + } // Feed the has_filament_switcher device flag (develop-only dynamic key, read defensively from // the full config — no shipping profile sets it) and the shared printable bed used by the PETG // pre-extrusion offset clamp. Both are inert unless has_filament_switcher is set. @@ -4056,27 +4079,19 @@ void Print::_make_wipe_tower() multi_extruder_flush.emplace_back(wipe_volumes); } - // Use NozzleStatusRecorder for per-carousel-slot tracking (BBS pattern). - // The original Orca code tracked per-extruder (2 slots), which collapsed all - // carousel filaments into one slot and caused massive redundant AMS flushing. - auto group_result = get_layered_nozzle_group_result(); + // Per-carousel-slot purge tracking via NozzleStatusRecorder (BBS pattern); the layered + // group result set on the tower above resolves each filament to its nozzle slot per layer. MultiNozzleUtils::NozzleStatusRecorder nozzle_recorder; - // Fallback (group_result == null) per-physical-nozzle tracking, matching the original - // pre-port behavior: remembers the last filament loaded in each physical nozzle slot. - std::vector nozzle_cur_filament_ids(nozzle_nums, (unsigned int) -1); std::vectorfilament_maps = get_filament_maps(); int layer_idx = -1; unsigned int current_filament_id = m_wipe_tower_data.tool_ordering.first_extruder(); // Initialize NozzleStatusRecorder with the first filament's carousel slot - if (group_result) { - auto nozzle = group_result->get_nozzle_for_filament(current_filament_id, layer_idx); + { + auto nozzle = nozzle_group_result.get_nozzle_for_filament(current_filament_id, layer_idx); if (nozzle) nozzle_recorder.set_nozzle_status(nozzle->group_id, current_filament_id, nozzle->extruder_id); - } else { - size_t cur_nozzle_id = filament_maps[current_filament_id] - 1; - nozzle_cur_filament_ids[cur_nozzle_id] = current_filament_id; } for (auto& layer_tools : m_wipe_tower_data.tool_ordering.layer_tools()) { // for all layers @@ -4095,8 +4110,8 @@ void Print::_make_wipe_tower() float volume_to_purge = 0; // Per-carousel-slot purge tracking via NozzleStatusRecorder - if (group_result) { - auto nozzle_info = group_result->get_nozzle_for_filament(filament_id, layer_idx); + { + auto nozzle_info = nozzle_group_result.get_nozzle_for_filament(filament_id, layer_idx); if (nozzle_info) { int extruder_id = nozzle_info->extruder_id; int nozzle_id = nozzle_info->group_id; @@ -4115,22 +4130,6 @@ void Print::_make_wipe_tower() } nozzle_recorder.set_nozzle_status(nozzle_id, filament_id, extruder_id); } - } else { - // Fallback: original Orca per-physical-nozzle path (non-carousel printers). - // Flush source is the last filament that occupied THIS nozzle, guarded so the - // first use of a nozzle incurs no flush. - int nozzle_id = filament_maps[filament_id] - 1; - unsigned int pre_filament_id = nozzle_cur_filament_ids[nozzle_id]; - if (pre_filament_id != (unsigned int) -1 && pre_filament_id != filament_id) { - volume_to_purge = multi_extruder_flush[nozzle_id][pre_filament_id][filament_id]; - float flush_multiplier = (m_config.prime_volume_mode == PrimeVolumeMode::pvmFast) - ? m_config.flush_multiplier_fast.get_at(nozzle_id) - : m_config.flush_multiplier.get_at(nozzle_id); - volume_to_purge *= flush_multiplier; - volume_to_purge = layer_tools.wiping_extrusions().mark_wiping_extrusions( - *this, current_filament_id, filament_id, volume_to_purge); - } - nozzle_cur_filament_ids[nozzle_id] = filament_id; } //During the filament change, the extruder will extrude an extra length of grab_length for the corresponding detection, so the purge can reduce this length. @@ -4138,29 +4137,21 @@ void Print::_make_wipe_tower() float grab_purge_volume = m_config.grab_length.get_at(grab_extruder_id) * 2.4; //(diameter/2)^2*PI=2.4 volume_to_purge = std::max(0.f, volume_to_purge - grab_purge_volume); - // Select prime volume per-filament: nozzle change (carousel rotation) uses - // filament_prime_volume_nc, filament change (same nozzle slot) uses filament_prime_volume. + // Prime volume per-filament: the tower now picks extruder-change vs nozzle-change + // (carousel) internally per plan layer, so pass both candidates (BBS pattern). float wipe_volume_ec = filament_id < m_config.filament_prime_volume.values.size() ? m_config.filament_prime_volume.values[filament_id] : (float) m_config.prime_volume; float wipe_volume_nc = filament_id < m_config.filament_prime_volume_nc.values.size() ? m_config.filament_prime_volume_nc.values[filament_id] : (float) m_config.prime_volume; - - float prime_volume = wipe_volume_ec; - if (group_result) { - bool is_nozzle_change = group_result->are_filaments_same_extruder(current_filament_id, filament_id, layer_idx) && - !group_result->are_filaments_same_nozzle(current_filament_id, filament_id, layer_idx); - if (is_nozzle_change) { - prime_volume = wipe_volume_nc; - } - } if (m_config.prime_volume_mode == PrimeVolumeMode::pvmSaving) { - prime_volume = 15.f; + wipe_volume_ec = 15.f; + wipe_volume_nc = 15.f; } wipe_tower.plan_toolchange((float)layer_tools.print_z, (float)layer_tools.wipe_tower_layer_height, current_filament_id, filament_id, - prime_volume, volume_to_purge); + wipe_volume_ec, wipe_volume_nc, volume_to_purge); current_filament_id = filament_id; } layer_tools.wiping_extrusions().ensure_perimeters_infills_order(*this); From bc016af1c959a61e470d740c5f8d7df8c28aef23 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Mon, 27 Jul 2026 00:25:59 +0800 Subject: [PATCH 002/106] Fix post-slice self-invalidation on custom multi-extruder printers --- src/libslic3r/Config.hpp | 21 ++- src/libslic3r/Print.cpp | 6 +- src/libslic3r/PrintApply.cpp | 16 ++- src/libslic3r/PrintConfig.cpp | 40 ++++++ .../test_config_variant_expansion.cpp | 121 +++++++++++++++++- .../test_toolordering_nozzle_group.cpp | 46 +++++++ 6 files changed, 240 insertions(+), 10 deletions(-) diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index da36321b6f..6f4117d249 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -2,6 +2,7 @@ #define slic3r_Config_hpp_ #include +#include #include #include #include @@ -780,10 +781,14 @@ public: this->values[i] = rhs_vec->values[i]; modified = true; } else { - if ((i < default_index.size()) && (default_index[i] < default_value.size())) + // Orca: a negative slot (failed variant lookup) must not silently collapse the + // whole array to the first slot's value — the int-vs-size_t comparison used to + // promote -1 past the bounds check. Keep the slot's own value (get_at-style + // clamp) when no valid index is available. + if ((i < default_index.size()) && (default_index[i] >= 0) && (size_t(default_index[i]) < default_value.size())) this->values[i] = default_value[default_index[i]]; else - this->values[i] = default_value[0]; + this->values[i] = default_value[std::min(i, default_value.size() - 1)]; } } return modified; @@ -2106,6 +2111,11 @@ public: throw ConfigurationError("ConfigOptionEnumGeneric: Assigning an incompatible type"); // rhs could be of the following type: ConfigOptionEnumGeneric or ConfigOptionEnum this->value = rhs->getInt(); + // Orca: options embedded in a StaticPrintConfig are constructed without a keys_map; + // adopt the source's so a later serialize() can emit names. + if (this->keys_map == nullptr) + if (auto rhs_generic = dynamic_cast(rhs)) + this->keys_map = rhs_generic->keys_map; } std::string serialize() const override @@ -2162,7 +2172,12 @@ public: if (rhs->type() != this->type()) throw ConfigurationError("ConfigOptionEnumGeneric: Assigning an incompatible type"); // rhs could be of the following type: ConfigOptionEnumsGeneric - this->values = dynamic_cast(rhs)->values; + auto rhs_enums = dynamic_cast(rhs); + this->values = rhs_enums->values; + // Orca: options embedded in a StaticPrintConfig are constructed without a keys_map; + // adopt the source's so a later serialize() emits names instead of empty tokens. + if (this->keys_map == nullptr) + this->keys_map = rhs_enums->keys_map; } std::string serialize() const override diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 3f06cd5b37..ecc2f39c88 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -3409,7 +3409,11 @@ void Print::update_filament_maps_to_config(std::vector f_maps, std::vector< } else if ((extruder_volume_type_count > extruder_count) && (m_config.filament_volume_map.values.size() > index)) nozzle_volume_type = (NozzleVolumeType)(m_config.filament_volume_map.values[index]); - m_config.filament_map_2.values[index] = m_ori_full_print_config.get_index_for_extruder(f_maps[index], "print_extruder_id", extruder_type, nozzle_volume_type, "print_extruder_variant"); + // Orca: when the process variant columns cannot be matched (degenerate + // print_extruder_id), key the override by plain extruder index like the seeding + // above instead of poisoning the map with -1. + int slot_index = m_ori_full_print_config.get_index_for_extruder(f_maps[index], "print_extruder_id", extruder_type, nozzle_volume_type, "print_extruder_variant"); + m_config.filament_map_2.values[index] = slot_index >= 0 ? slot_index : f_maps[index] - 1; } m_full_print_config = m_ori_full_print_config; diff --git a/src/libslic3r/PrintApply.cpp b/src/libslic3r/PrintApply.cpp index 0956cfe154..e2e9bc737d 100644 --- a/src/libslic3r/PrintApply.cpp +++ b/src/libslic3r/PrintApply.cpp @@ -1355,7 +1355,11 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ if ((extruder_volume_type_count > extruder_count) && opt_filament_volume_maps && opt_filament_volume_maps->values.size() == filament_maps.size()) nozzle_volume_type = (NozzleVolumeType)(opt_filament_volume_maps->values[index]); - m_config.filament_map_2.values[index] = new_full_config.get_index_for_extruder(filament_maps[index], "print_extruder_id", extruder_type, nozzle_volume_type, "print_extruder_variant"); + // Orca: when the process variant columns cannot be matched (degenerate + // print_extruder_id), key the override by plain extruder index like the seeding + // above instead of poisoning the map with -1. + int slot_index = new_full_config.get_index_for_extruder(filament_maps[index], "print_extruder_id", extruder_type, nozzle_volume_type, "print_extruder_variant"); + m_config.filament_map_2.values[index] = slot_index >= 0 ? slot_index : filament_maps[index] - 1; } // Do not use the ApplyStatus as we will use the max function when updating apply_status. @@ -1411,6 +1415,16 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ num_extruders_changed = true; } } + else if (! print_diff.empty()) { + // Orca: m_config can diverge from an unchanged full config (e.g. the in-slice retract + // override recompute writing different values than the apply-time computation). The + // invalidation above already fired for print_diff, so repair m_config here as well; + // otherwise the divergence is never corrected and every subsequent apply of the same + // config invalidates the result again, forever. + m_placeholder_parser.apply_config(filament_overrides); + m_config.apply_only(new_full_config, print_diff, true); + m_config.apply(filament_overrides); + } ModelObjectStatusDB model_object_status_db; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 8129ff741e..f0d82a9264 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -10495,6 +10495,44 @@ int DynamicPrintConfig::get_extruder_nozzle_volume_count(int extruder_count, std return count; } +// Orca: BBL system profiles ship full-width print_extruder_id/print_extruder_variant columns, but +// custom multi-extruder printers only ever get the machine-scope columns synthesized for them (see +// extend_extruder_variant); the process scope keeps the length-1 defaults, both in presets and in +// 3mf project configs. Expanding with that degenerate map makes every per-extruder lookup fail, and +// because both keys are themselves in print_options_with_variant, the expansion then latches a +// full-width-but-wrong [1,1,...] map that also defeats the generated_extruder_id fallback in +// get_index_for_extruder. Synthesize the process columns from the printer's extruder_variant_list +// (same token walk as extend_extruder_variant) before expanding. +static void ensure_process_variant_columns(DynamicPrintConfig &config, const DynamicPrintConfig &printer_config) +{ + auto id_opt = dynamic_cast(config.option("print_extruder_id")); + auto variant_opt = dynamic_cast(config.option("print_extruder_variant")); + auto list_opt = dynamic_cast(printer_config.option("extruder_variant_list")); + if (!id_opt || !variant_opt || !list_opt) + return; + if (id_opt->values.size() != 1 || variant_opt->values.size() != 1) + return; + + std::vector ids; + std::vector variants; + for (int i = 0; i < int(list_opt->values.size()); ++i) { + std::vector tokens; + boost::split(tokens, list_opt->get_at(i), boost::is_any_of(","), boost::token_compress_on); + for (std::string &token : tokens) { + boost::trim(token); + if (token.empty()) + continue; + ids.push_back(i + 1); + variants.push_back(token); + } + } + // A single column is the legitimate single-extruder layout, not a degenerate one. + if (ids.size() <= 1) + return; + id_opt->values = std::move(ids); + variant_opt->values = std::move(variants); +} + std::vector DynamicPrintConfig::update_values_to_printer_extruders(DynamicPrintConfig& printer_config, int extruder_count, int extruder_nozzle_volume_count, std::vector>& nv_types, std::set& key_set, std::string id_name, std::string variant_name, unsigned int stride, unsigned int extruder_id, NozzleVolumeType filament_nvt) { @@ -10536,6 +10574,8 @@ std::vector DynamicPrintConfig::update_values_to_printer_extruders(DynamicP variant_count = 1; } else { + if (id_name == "print_extruder_id") + ensure_process_variant_columns(*this, printer_config); // Orca: emit the slots first, then size variant_count from what was actually // emitted. extruder_nozzle_volume_count only equals the emitted total when every // extruder carries per-type stats; an extruder with an empty stats entry combined diff --git a/tests/libslic3r/test_config_variant_expansion.cpp b/tests/libslic3r/test_config_variant_expansion.cpp index 59f311eae5..5cff6ecee5 100644 --- a/tests/libslic3r/test_config_variant_expansion.cpp +++ b/tests/libslic3r/test_config_variant_expansion.cpp @@ -43,18 +43,33 @@ TEST_CASE("apply_override fills nil entries from the 0-based default index", "[C REQUIRE(resolved.values == std::vector({30., 42.})); } - SECTION("an index past the machine slots falls back to the first slot") { + SECTION("an index past the machine slots keeps the slot's own value") { std::vector slot_index{5, 0}; ConfigOptionFloats resolved(machine); REQUIRE(resolved.apply_override(&filament, slot_index)); REQUIRE(resolved.values == std::vector({10., 42.})); } - SECTION("a negative index (unresolved slot) falls back to the first slot") { - std::vector slot_index{-1, 0}; + SECTION("a negative index (unresolved slot) keeps the slot's own value") { + ConfigOptionFloatsNullable all_nil; + all_nil.values = {ConfigOptionFloatsNullable::nil_value(), ConfigOptionFloatsNullable::nil_value(), + ConfigOptionFloatsNullable::nil_value()}; + std::vector slot_index{2, -1, 0}; ConfigOptionFloats resolved(machine); - REQUIRE(resolved.apply_override(&filament, slot_index)); - REQUIRE(resolved.values == std::vector({10., 42.})); + REQUIRE(!resolved.apply_override(&all_nil, slot_index)); + REQUIRE(resolved.values == std::vector({30., 20., 10.})); + } + + SECTION("all-nil overrides keyed by unresolved slots leave the machine values intact") { + // The failed-lookup map a degenerate print_extruder_id used to produce; the negative + // slots must not collapse the machine array to its first value. + ConfigOptionFloats per_extruder({100., 70., 70., 70., 100.}); + ConfigOptionFloatsNullable all_nil; + all_nil.values.assign(5, ConfigOptionFloatsNullable::nil_value()); + std::vector slot_index{0, -1, -1, -1, 0}; + ConfigOptionFloats resolved(per_extruder); + REQUIRE(!resolved.apply_override(&all_nil, slot_index)); + REQUIRE(resolved.values == std::vector({100., 70., 70., 70., 100.})); } } @@ -238,6 +253,102 @@ TEST_CASE("update_values_to_printer_extruders expands one slot per (extruder x v } } +TEST_CASE("update_values_to_printer_extruders synthesizes degenerate process variant columns", "[Config]") +{ + // Non-BBL process presets and 3mf project configs keep the length-1 defaults for + // print_extruder_id/print_extruder_variant; only BBL system presets ship full-width columns. + auto add_degenerate_print_columns = [](DynamicPrintConfig &config) { + config.option("print_extruder_id", true)->values = {1}; + config.option("print_extruder_variant", true)->values = {"Direct Drive Standard"}; + config.option("outer_wall_speed", true)->values = {30.}; + }; + + SECTION("a single-column pair on a multi-extruder machine expands to one column per extruder") { + DynamicPrintConfig config; + config.option("extruder_type", true)->values = {etDirectDrive, etDirectDrive}; + config.option("nozzle_volume_type", true)->values = {nvtStandard, nvtStandard}; + config.option("extruder_variant_list", true)->values = {"Direct Drive Standard", "Direct Drive Standard"}; + add_degenerate_print_columns(config); + + std::vector> nozzle_volume_types; + int extruder_count = 2; + int count = config.get_extruder_nozzle_volume_count(extruder_count, nozzle_volume_types); + + std::vector variant_index = config.update_values_to_printer_extruders(config, extruder_count, count, nozzle_volume_types, + print_options_with_variant, "print_extruder_id", "print_extruder_variant"); + + REQUIRE(variant_index == std::vector({0, 1})); + REQUIRE(config.option("print_extruder_id")->values == std::vector({1, 2})); + REQUIRE(config.option("print_extruder_variant")->values == + std::vector({"Direct Drive Standard", "Direct Drive Standard"})); + // width-1 data arrays replicate their only column into every slot + REQUIRE(config.option("outer_wall_speed")->values == std::vector({30., 30.})); + } + + SECTION("a multi-variant list synthesizes one column per (extruder x variant)") { + DynamicPrintConfig config = make_hybrid_printer_config(); + add_degenerate_print_columns(config); + + std::vector> nozzle_volume_types; + int extruder_count = 2; + int count = config.get_extruder_nozzle_volume_count(extruder_count, nozzle_volume_types); + REQUIRE(count == 3); + + std::vector variant_index = config.update_values_to_printer_extruders(config, extruder_count, count, nozzle_volume_types, + print_options_with_variant, "print_extruder_id", "print_extruder_variant"); + + // same slot resolution as the explicit BBL-style 4-column layout + REQUIRE(variant_index == std::vector({0, 2, 3})); + REQUIRE(config.option("print_extruder_id")->values == std::vector({1, 2, 2})); + REQUIRE(config.option("print_extruder_variant")->values == + std::vector({"Direct Drive Standard", "Direct Drive Standard", "Direct Drive High Flow"})); + REQUIRE(config.option("outer_wall_speed")->values == std::vector({30., 30., 30.})); + } + + SECTION("a single-extruder single-column layout is not treated as degenerate") { + DynamicPrintConfig config; + config.option("extruder_type", true)->values = {etDirectDrive}; + config.option("nozzle_volume_type", true)->values = {nvtStandard}; + config.option("extruder_variant_list", true)->values = {"Direct Drive Standard"}; + add_degenerate_print_columns(config); + + std::vector> nozzle_volume_types; + int extruder_count = 1; + int count = config.get_extruder_nozzle_volume_count(extruder_count, nozzle_volume_types); + + config.update_values_to_printer_extruders(config, extruder_count, count, nozzle_volume_types, + print_options_with_variant, "print_extruder_id", "print_extruder_variant"); + + REQUIRE(config.option("print_extruder_id")->values == std::vector({1})); + REQUIRE(config.option("outer_wall_speed")->values == std::vector({30.})); + } + + SECTION("a second expansion leaves the synthesized layout unchanged") { + DynamicPrintConfig config; + config.option("extruder_type", true)->values = {etDirectDrive, etDirectDrive}; + config.option("nozzle_volume_type", true)->values = {nvtStandard, nvtStandard}; + config.option("extruder_variant_list", true)->values = {"Direct Drive Standard", "Direct Drive Standard"}; + add_degenerate_print_columns(config); + + std::vector> nozzle_volume_types; + int extruder_count = 2; + int count = config.get_extruder_nozzle_volume_count(extruder_count, nozzle_volume_types); + + config.update_values_to_printer_extruders(config, extruder_count, count, nozzle_volume_types, + print_options_with_variant, "print_extruder_id", "print_extruder_variant"); + DynamicPrintConfig once = config; + config.update_values_to_printer_extruders(config, extruder_count, count, nozzle_volume_types, + print_options_with_variant, "print_extruder_id", "print_extruder_variant"); + + REQUIRE(config.option("print_extruder_id")->values == + once.option("print_extruder_id")->values); + REQUIRE(config.option("print_extruder_variant")->values == + once.option("print_extruder_variant")->values); + REQUIRE(config.option("outer_wall_speed")->values == + once.option("outer_wall_speed")->values); + } +} + TEST_CASE("update_values_to_printer_extruders_for_multiple_filaments resolves per-filament slots", "[Config]") { auto make_filament_arrays = [](DynamicPrintConfig &config) { diff --git a/tests/libslic3r/test_toolordering_nozzle_group.cpp b/tests/libslic3r/test_toolordering_nozzle_group.cpp index ae6aac4dbe..5eee164eb0 100644 --- a/tests/libslic3r/test_toolordering_nozzle_group.cpp +++ b/tests/libslic3r/test_toolordering_nozzle_group.cpp @@ -500,6 +500,52 @@ TEST_CASE("Re-applying an unchanged config after slicing keeps the result valid" REQUIRE(print.is_step_done(psSlicingFinished)); } +TEST_CASE("A degenerate process variant map on a custom multi-extruder printer slices to a stable result", "[Print][Regression]") +{ + // Non-BBL multi-extruder printers get machine-scope variant columns synthesized on preset + // load (extend_extruder_variant), but nothing ships process-scope print_extruder_id / + // print_extruder_variant: presets and 3mf project configs carry the length-1 defaults. The + // apply-time expansion must synthesize the process columns from extruder_variant_list; + // otherwise the failed per-extruder lookups collapse the per-extruder retract overrides + // during slicing and the post-slice re-apply invalidates every fresh result, forever. + DynamicPrintConfig config = DynamicPrintConfig::full_print_config(); + config.option("nozzle_diameter", true)->values = {0.4, 0.4, 0.4, 0.4, 0.4}; + config.set_num_extruders(5); + // per-extruder machine values that a first-slot collapse would destroy + config.option("retract_before_wipe", true)->values = {100., 70., 70., 70., 100.}; + config.option("z_hop_types", true)->values = {zhtSlope, zhtNormal, zhtNormal, zhtNormal, zhtSlope}; + // filament presets carry the nullable override twins (all-nil = "no override"); they are what + // routes the machine values through apply_override in the in-slice override recompute + config.option("filament_retract_before_wipe", true)->values = + std::vector(5, ConfigOptionPercentsNullable::nil_value()); + config.option("filament_z_hop_types", true)->values = + std::vector(5, ConfigOptionEnumsGenericNullable::nil_value()); + config.option("filament_diameter", true)->values = std::vector(5, 1.75); + config.option("filament_colour", true)->values = {"#FF0000", "#00FF00", "#0000FF", "#FFFF00", "#00FFFF"}; + config.option("filament_map", true)->values = {1, 2, 3, 4, 1}; + + Model model; + model.add_object("cube", "", make_cube(20, 20, 20))->add_instance()->set_offset(Vec3d(100., 100., 0.)); + + Print print; + print.apply(model, config); + print.process(); + REQUIRE(print.is_step_done(psSlicingFinished)); + + // BackgroundSlicingProcess reads the engine-computed maps back into the plate config after + // slicing; the next apply overlays that written-back state. + config.option("filament_map", true)->values = print.get_filament_maps(); + config.option("filament_volume_map", true)->values = print.get_filament_volume_maps(); + config.option("filament_nozzle_map", true)->values = print.get_filament_nozzle_maps(); + + auto status = print.apply(model, config); + REQUIRE(status == PrintBase::APPLY_STATUS_UNCHANGED); + REQUIRE(print.is_step_done(psSlicingFinished)); + // the per-extruder machine values must survive the in-slice override recompute + REQUIRE(print.config().retract_before_wipe.values == std::vector({100., 70., 70., 70., 100.})); + REQUIRE(print.config().z_hop_types.values == std::vector({zhtSlope, zhtNormal, zhtNormal, zhtNormal, zhtSlope})); +} + TEST_CASE("normalize_nozzle_map_per_layer makes per-filament assignments gap-free", "[MultiNozzle][H2C][Dynamic]") { SECTION("gaps inherit the last used nozzle, entries on used layers stay untouched") { From 466c36eaa3931b9d1839357644d577242f6a75eb Mon Sep 17 00:00:00 2001 From: SoftFever Date: Mon, 27 Jul 2026 03:07:07 +0800 Subject: [PATCH 003/106] Complete the rib wipe tower port in WipeTower2 The rib tower is now always square (prime_tower_width is ignored, as the GUI already implies), carries the rib origin offset like the BBL tower so the rib tips sit inside the configured position, clamps the rib length to the tower diagonal, and extends the ribs for short towers. --- src/libslic3r/GCode.cpp | 6 ++- src/libslic3r/GCode/PrintExtents.cpp | 3 +- src/libslic3r/GCode/WipeTower2.cpp | 59 ++++++++++++++++++++++------ src/libslic3r/GCode/WipeTower2.hpp | 11 ++++-- src/libslic3r/Print.cpp | 7 +++- 5 files changed, 66 insertions(+), 20 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index c88649b267..7550ba8097 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1422,8 +1422,10 @@ static std::vector get_path_of_change_filament(const Print& print) // We want to rotate and shift all extrusions (gcode postprocessing) and starting and ending position float alpha = m_wipe_tower_rotation / 180.f * float(M_PI); + // The rib-wall offset is tower-local, so it rotates with the tower (unlike the BBL + // tower in append_tcr, which never rotates). Priming lines are absolute bed moves. auto transform_wt_pt = [&alpha, this](const Vec2f &pt) -> Vec2f { - Vec2f out = Eigen::Rotation2Df(alpha) * pt; + Vec2f out = Eigen::Rotation2Df(alpha) * (pt + m_rib_offset); out += m_wipe_tower_pos; return out; }; @@ -1435,7 +1437,7 @@ static std::vector get_path_of_change_filament(const Print& print) end_pos = transform_wt_pt(end_pos); } - Vec2f wipe_tower_offset = tcr.priming ? Vec2f::Zero() : m_wipe_tower_pos; + Vec2f wipe_tower_offset = tcr.priming ? Vec2f::Zero() : Vec2f(m_wipe_tower_pos + Eigen::Rotation2Df(alpha) * m_rib_offset); float wipe_tower_rotation = tcr.priming ? 0.f : alpha; Vec2f plate_origin_2d(m_plate_origin(0), m_plate_origin(1)); diff --git a/src/libslic3r/GCode/PrintExtents.cpp b/src/libslic3r/GCode/PrintExtents.cpp index 4a65ae5ae4..9008adaa9a 100644 --- a/src/libslic3r/GCode/PrintExtents.cpp +++ b/src/libslic3r/GCode/PrintExtents.cpp @@ -143,7 +143,8 @@ BoundingBoxf get_wipe_tower_extrusions_extents(const Print &print, const coordf_ double wipe_tower_y = print.config().wipe_tower_y.get_at(plate_idx) + plate_origin(1); Transform2d trafo = Eigen::Translation2d(wipe_tower_x, wipe_tower_y) * - Eigen::Rotation2Dd(Geometry::deg2rad(print.config().wipe_tower_rotation_angle.value)); + Eigen::Rotation2Dd(Geometry::deg2rad(print.config().wipe_tower_rotation_angle.value)) * + Eigen::Translation2d(print.wipe_tower_data().rib_offset.cast()); // tower-local rib-wall shift, zero unless rib BoundingBoxf bbox; for (const std::vector &tool_changes : print.wipe_tower_data().tool_changes) { diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index 34b385d4be..601992f515 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -2228,15 +2228,21 @@ void WipeTower2::plan_toolchange(float z_par, float layer_height_par, unsigned i return; // this is an actual toolchange - let's calculate depth to reserve on the wipe tower - float width = m_wipe_tower_width - 3*m_perimeter_width; + const bool first_layer_plan = (m_plan.size() - 1) == m_first_layer_idx; + m_plan.back().tool_changes.push_back(set_toolchange(old_tool, new_tool, layer_height_par, wipe_volume, first_layer_plan)); +} + +WipeTower2::WipeTowerInfo::ToolChange WipeTower2::set_toolchange(size_t old_tool, size_t new_tool, float layer_height, float wipe_volume, bool first_layer_plan) +{ + float width = m_wipe_tower_width - 3*m_perimeter_width; float length_to_extrude = volume_to_length(0.25f * std::accumulate(m_filpar[old_tool].ramming_speed.begin(), m_filpar[old_tool].ramming_speed.end(), 0.f), m_perimeter_width * m_filpar[old_tool].ramming_line_width_multiplicator, - layer_height_par); + layer_height); // Orca: Set ramming depth to 0 if ramming is disabled. float ramming_depth = m_enable_filament_ramming ? ((int(length_to_extrude / width) + 1) * (m_perimeter_width * m_filpar[old_tool].ramming_line_width_multiplicator * m_filpar[old_tool].ramming_step_multiplicator) * m_extra_spacing_ramming) : 0; float first_wipe_line = - (width*((length_to_extrude / width)-int(length_to_extrude / width)) - width); - float first_wipe_volume = length_to_volume(first_wipe_line, m_perimeter_width * m_extra_flow, layer_height_par); + float first_wipe_volume = length_to_volume(first_wipe_line, m_perimeter_width * m_extra_flow, layer_height); // ORCA: Keep wipe-depth planning consistent with toolchange_Wipe(). // ORCA: On the first layer, toolchange_Wipe() advances purge rows using @@ -2245,12 +2251,11 @@ void WipeTower2::plan_toolchange(float z_par, float layer_height_par, unsigned i // ORCA: float dy = (is_first_layer() ? m_extra_flow : m_extra_spacing_wipe) * m_perimeter_width; // ORCA: Use the same spacing here so reserved depth matches consumed depth // ORCA: and first-layer purge segments do not leave visible gaps. - const bool first_layer_plan = (m_plan.size() - 1) == m_first_layer_idx; const float planning_spacing = first_layer_plan ? m_extra_flow : m_extra_spacing_wipe; - float wiping_depth = get_wipe_depth(wipe_volume - first_wipe_volume, layer_height_par, m_perimeter_width, m_extra_flow, planning_spacing, width); - - m_plan.back().tool_changes.push_back(WipeTowerInfo::ToolChange(old_tool, new_tool, ramming_depth + wiping_depth, ramming_depth, first_wipe_line, wipe_volume)); + float wiping_depth = get_wipe_depth(wipe_volume - first_wipe_volume, layer_height, m_perimeter_width, m_extra_flow, planning_spacing, width); + + return WipeTowerInfo::ToolChange(old_tool, new_tool, ramming_depth + wiping_depth, ramming_depth, first_wipe_line, wipe_volume); } @@ -2378,9 +2383,35 @@ void WipeTower2::generate(std::vector> } #endif - m_rib_length = std::max({m_rib_length, sqrt(m_wipe_tower_depth * m_wipe_tower_depth + m_wipe_tower_width * m_wipe_tower_width)}); + if (m_wall_type == (int)wtwRib) { + // Rib wall: force a square tower like WipeTower::plan_tower_new(), ignoring the + // configured prime_tower_width (the GUI greys it out in rib mode). The planned depths + // already include the extra-spacing factors, so sqrt(depth * width) preserves the + // purge area. Replan every toolchange for the new width, then re-derive the depths. + float max_depth = 0.f; + for (const auto& current_plan : m_plan) + max_depth = std::max(max_depth, current_plan.depth); + if (max_depth > EPSILON) { + m_wipe_tower_width = align_ceil(std::sqrt(max_depth * m_wipe_tower_width), m_perimeter_width); + for (size_t idx = 0; idx < m_plan.size(); ++idx) + for (auto& toolchange : m_plan[idx].tool_changes) + toolchange = set_toolchange(toolchange.old_tool, toolchange.new_tool, + m_plan[idx].height, toolchange.wipe_volume, + idx == m_first_layer_idx); + plan_tower(); + } + + // Like WipeTower::plan_tower_new(): extend the ribs instead of the tower when the + // tower is smaller than the height-based stability minimum. + const float min_depth = WipeTower::get_limit_depth_by_height(m_wipe_tower_height); + if (m_wipe_tower_depth + EPSILON < min_depth) + m_rib_length = std::max(m_rib_length, min_depth * (float)std::sqrt(2.f)); + } + + const float diagonal = std::sqrt(m_wipe_tower_depth * m_wipe_tower_depth + m_wipe_tower_width * m_wipe_tower_width); + m_rib_length = std::max(m_rib_length, diagonal); m_rib_length += m_extra_rib_length; - m_rib_length = std::max(0.f, m_rib_length); + m_rib_length = std::max(diagonal, m_rib_length); // a negative extra length must not shrink the ribs below the diagonal m_rib_width = std::min(m_rib_width, std::min(m_wipe_tower_depth, m_wipe_tower_width) / 2.f); // Ensure that the rib wall of the wipetower are attached to the infill. @@ -2532,10 +2563,12 @@ Polygon WipeTower2::generate_support_rib_wall(WipeTowerWriter2& insert_skip_polygon = wall_polygon; } writer.generate_path(result_wall, feedrate, retract_length, retract_speed, m_used_fillet); - //if (m_cur_layer_id == 0) { - // BoundingBox bbox = get_extents(result_wall); - // m_rib_offset = Vec2f(-unscaled(bbox.min.x()), -unscaled(bbox.min.y())); - //} + // Tower-local shift that puts the rib wall's protruding first-layer min corner at the + // configured tower position, like WipeTower::generate_support_wall_new(). + if (rib_wall && is_first_layer()) { + BoundingBox bbox = get_extents(result_wall); + m_rib_offset = Vec2f(-unscaled(bbox.min.x()), -unscaled(bbox.min.y())); + } return insert_skip_polygon; } diff --git a/src/libslic3r/GCode/WipeTower2.hpp b/src/libslic3r/GCode/WipeTower2.hpp index 7060eefa4a..6169e8c392 100644 --- a/src/libslic3r/GCode/WipeTower2.hpp +++ b/src/libslic3r/GCode/WipeTower2.hpp @@ -69,9 +69,9 @@ public: const float brim = m_wipe_tower_brim_width_real; return BoundingBoxf(Vec2d(-brim, -brim), Vec2d(double(m_wipe_tower_width) + brim, double(m_wipe_tower_depth) + brim)); } - // WT2 doesn't currently compute a rib-origin compensation like WipeTower (m_rib_offset), - // so expose a zero offset for consistency purposes (to maintain API parity). - Vec2f get_rib_offset() const { return Vec2f::Zero(); } + // Tower-local shift that puts the rib wall's first-layer min corner at the configured + // tower position, like WipeTower::get_rib_offset(). Zero unless the rib wall is used. + Vec2f get_rib_offset() const { return m_rib_offset; } float get_rib_width() const { return m_rib_width; } float get_rib_length() const { return m_rib_length; } @@ -231,6 +231,7 @@ private: float m_rib_width = 10; float m_extra_rib_length = 0; float m_rib_length = 0; + Vec2f m_rib_offset = Vec2f::Zero(); bool m_enable_arc_fitting = false; @@ -372,6 +373,10 @@ private: float spacing); Polygon generate_rib_polygon(const WipeTower::box_coordinates& wt_box); + + // Computes the depth reserved for a toolchange (shared by plan_toolchange() and the + // rib-wall square-tower replanning in generate()). + WipeTowerInfo::ToolChange set_toolchange(size_t old_tool, size_t new_tool, float layer_height, float wipe_volume, bool first_layer_plan); }; diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index ecc2f39c88..371f1e68ea 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -4333,7 +4333,12 @@ void Print::_make_wipe_tower() wipe_tower.get_rib_width(), wipe_tower.get_rib_length(), config().wipe_tower_fillet_wall.value); const Vec3d origin = Vec3d::Zero(); - m_fake_wipe_tower.set_fake_extrusion_data(wipe_tower.position(), wipe_tower.width(), wipe_tower.get_wipe_tower_height(), + // FakeWipeTower::pos is a bed-frame translation applied after rotation + // (getFakeExtrusionPathsFromWipeTower2 rotates about the local origin), so the + // tower-local rib offset must be rotated into the bed frame first. + m_fake_wipe_tower.rib_offset = Eigen::Rotation2Df(Geometry::deg2rad((float)config().wipe_tower_rotation_angle.value)) * + wipe_tower.get_rib_offset(); + m_fake_wipe_tower.set_fake_extrusion_data(wipe_tower.position() + m_fake_wipe_tower.rib_offset, wipe_tower.width(), wipe_tower.get_wipe_tower_height(), config().initial_layer_print_height, m_wipe_tower_data.depth, m_wipe_tower_data.z_and_depth_pairs, m_wipe_tower_data.brim_width, config().wipe_tower_rotation_angle, config().wipe_tower_cone_angle, From 1696d5ca39fb9becfdf422d97ef19b43b0b51620 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Mon, 27 Jul 2026 03:08:47 +0800 Subject: [PATCH 004/106] Use the squared rib tower size in arrange estimates estimate_wipe_tower_polygon reserved the arrange footprint and clamped the tower X position with the raw prime_tower_width, under-reserving space whenever the rib wall squares the tower to a different width. --- src/slic3r/GUI/PartPlate.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index 4b52592f2d..4f57c2577d 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -2298,6 +2298,7 @@ arrangement::ArrangePolygon PartPlate::estimate_wipe_tower_polygon(const Dynamic bool enable_wrapping = (wrapping_opt != nullptr) && wrapping_opt->value; wt_size = estimate_wipe_tower_size(config, w, v, extruder_count, plate_extruder_size, use_global_objects, enable_wrapping); int plate_width=m_width, plate_depth=m_depth; + w = wt_size(0); // effective width; differs from prime_tower_width when the rib wall squares the tower float depth = wt_size(1); float margin = WIPE_TOWER_MARGIN + tower_brim_width, wp_brim_width = 0.f; const ConfigOption* wipe_tower_brim_width_opt = config.option("prime_tower_brim_width"); From c3c37e474a93fbe00d560dacf5d1ee22c2e7fa23 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Mon, 27 Jul 2026 12:30:57 +0800 Subject: [PATCH 005/106] Print the WipeTower2 shell with a non-support, non-soluble filament Like the BBL tower: the layer's sparse infill, wall, and brim go to the first toolchange to a non-support/non-soluble filament, or are printed with the incoming filament before any toolchange. The minimal-purge clamp now also covers toolchanges that get no finish-layer saving. Output is unchanged when no support/soluble filament is used. --- src/libslic3r/GCode/WipeTower2.cpp | 81 ++++++++++++++++++++---------- src/libslic3r/GCode/WipeTower2.hpp | 8 +-- 2 files changed, 59 insertions(+), 30 deletions(-) diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index 601992f515..ccb68efb7a 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -1342,6 +1342,7 @@ void WipeTower2::set_extruder(size_t idx, const PrintConfig& config) m_filpar[idx].is_soluble = (idx != size_t(m_wipe_tower_filament - 1)); else m_filpar[idx].is_soluble = config.filament_soluble.get_at(idx); + m_filpar[idx].is_support = config.filament_is_support.get_at(idx); m_filpar[idx].temperature = config.nozzle_temperature.get_at(idx); m_filpar[idx].first_layer_temperature = config.nozzle_temperature_initial_layer.get_at(idx); m_filpar[idx].filament_minimal_purge_on_wipe_tower = config.filament_minimal_purge_on_wipe_tower.get_at(idx); @@ -2293,49 +2294,64 @@ void WipeTower2::save_on_last_wipe() continue; // Which toolchange will finish_layer extrusions be subtracted from? - int idx = first_toolchange_to_nonsoluble(m_layer_info->tool_changes); + int idx = first_toolchange_to_nonsoluble_nonsupport(m_layer_info->tool_changes); if (idx == -1) { // In this case, finish_layer will be called at the very beginning. finish_layer().total_extrusion_length_in_plane(); } + const float width = m_wipe_tower_width - 3*m_perimeter_width; // width we draw into + auto recompute_toolchange = [this, width](WipeTowerInfo::ToolChange& toolchange, float volume_to_save) { + float volume_left_to_wipe = std::max(m_filpar[toolchange.new_tool].filament_minimal_purge_on_wipe_tower, toolchange.wipe_volume_total - volume_to_save); + float volume_we_need_depth_for = std::max(0.f, volume_left_to_wipe - length_to_volume(toolchange.first_wipe_line, m_perimeter_width*m_extra_flow, m_layer_info->height)); + + // ORCA: Keep wipe-depth planning consistent with toolchange_Wipe(). + // ORCA: On the first layer, toolchange_Wipe() advances purge rows using + // ORCA: m_extra_flow * m_perimeter_width, while later layers use + // ORCA: m_extra_spacing_wipe * m_perimeter_width. + // ORCA: float dy = (is_first_layer() ? m_extra_flow : m_extra_spacing_wipe) * m_perimeter_width; + // ORCA: Use the same spacing here so reserved depth matches consumed depth + // ORCA: and first-layer purge segments do not leave visible gaps. + const bool first_layer_plan = size_t(m_layer_info - m_plan.begin()) == m_first_layer_idx; + const float planning_spacing = first_layer_plan ? m_extra_flow : m_extra_spacing_wipe; + + float depth_to_wipe = get_wipe_depth(volume_we_need_depth_for, m_layer_info->height, m_perimeter_width, m_extra_flow, planning_spacing, width); + + toolchange.required_depth = toolchange.ramming_depth + depth_to_wipe; + toolchange.wipe_volume = volume_left_to_wipe; + }; + for (int i=0; itool_changes.size()); ++i) { auto& toolchange = m_layer_info->tool_changes[i]; tool_change(toolchange.new_tool); if (i == idx) { - float width = m_wipe_tower_width - 3*m_perimeter_width; // width we draw into - - float volume_to_save = length_to_volume(finish_layer().total_extrusion_length_in_plane(), m_perimeter_width, m_layer_info->height); - float volume_left_to_wipe = std::max(m_filpar[toolchange.new_tool].filament_minimal_purge_on_wipe_tower, toolchange.wipe_volume_total - volume_to_save); - float volume_we_need_depth_for = std::max(0.f, volume_left_to_wipe - length_to_volume(toolchange.first_wipe_line, m_perimeter_width*m_extra_flow, m_layer_info->height)); - - // ORCA: Keep wipe-depth planning consistent with toolchange_Wipe(). - // ORCA: On the first layer, toolchange_Wipe() advances purge rows using - // ORCA: m_extra_flow * m_perimeter_width, while later layers use - // ORCA: m_extra_spacing_wipe * m_perimeter_width. - // ORCA: float dy = (is_first_layer() ? m_extra_flow : m_extra_spacing_wipe) * m_perimeter_width; - // ORCA: Use the same spacing here so reserved depth matches consumed depth - // ORCA: and first-layer purge segments do not leave visible gaps. - const bool first_layer_plan = size_t(m_layer_info - m_plan.begin()) == m_first_layer_idx; - const float planning_spacing = first_layer_plan ? m_extra_flow : m_extra_spacing_wipe; - - float depth_to_wipe = get_wipe_depth(volume_we_need_depth_for, m_layer_info->height, m_perimeter_width, m_extra_flow, planning_spacing, width); - - toolchange.required_depth = toolchange.ramming_depth + depth_to_wipe; - toolchange.wipe_volume = volume_left_to_wipe; + recompute_toolchange(toolchange, length_to_volume(finish_layer().total_extrusion_length_in_plane(), m_perimeter_width, m_layer_info->height)); + } else if (toolchange.wipe_volume < m_filpar[toolchange.new_tool].filament_minimal_purge_on_wipe_tower) { + // Keep filament_minimal_purge_on_wipe_tower enforced for toolchanges that get + // no finish-layer saving, e.g. a support/soluble filament skipped as the + // finish filament above. Recomputing only when the clamp binds leaves all + // other toolchanges with their planned values bit-for-bit. + recompute_toolchange(toolchange, 0.f); } } } } -// Return index of first toolchange that switches to non-soluble extruder -// ot -1 if there is no such toolchange. -int WipeTower2::first_toolchange_to_nonsoluble( +// Return the index of the toolchange whose new filament should print the layer's +// finish extrusions (sparse infill + wall + brim), or -1 to print them with the +// layer's incoming filament before any toolchange happens. +// Like WipeTower::first_toolchange_to_nonsoluble_nonsupport(): support and soluble +// filaments bond poorly to the material printed on top of them, so they must not +// print the tower's shell when another filament is available on the layer. +int WipeTower2::first_toolchange_to_nonsoluble_nonsupport( const std::vector& tool_changes) const { + if (tool_changes.empty()) + return -1; + // If a specific wipe tower filament is forced, use it to decide where to finish the layer. if (m_wipe_tower_filament > 0) { for (size_t idx = 0; idx < tool_changes.size(); ++idx) { @@ -2344,8 +2360,19 @@ int WipeTower2::first_toolchange_to_nonsoluble( } return -1; } - // Orca: allow calculation of the required depth and wipe volume for soluble toolchanges as well. - return tool_changes.empty() ? -1 : 0; + + auto is_wall_filament = [this](size_t tool) { + return !m_filpar[tool].is_soluble && !m_filpar[tool].is_support; + }; + for (size_t idx = 0; idx < tool_changes.size(); ++idx) + if (is_wall_filament(tool_changes[idx].new_tool)) + return idx; + if (is_wall_filament(tool_changes.front().old_tool)) + return -1; + // Only support/soluble filaments on this layer: keep the first toolchange so the + // finish-layer saving and the minimal-purge clamp still apply to it (Orca depth + // and wipe volume accounting, see save_on_last_wipe()). + return 0; } static WipeTower::ToolChangeResult merge_tcr(WipeTower::ToolChangeResult& first, @@ -2441,7 +2468,7 @@ void WipeTower2::generate(std::vector> if (m_layer_info->depth < m_wipe_tower_depth - m_perimeter_width) m_y_shift = (m_wipe_tower_depth-m_layer_info->depth-m_perimeter_width)/2.f; - int idx = first_toolchange_to_nonsoluble(layer.tool_changes); + int idx = first_toolchange_to_nonsoluble_nonsupport(layer.tool_changes); WipeTower::ToolChangeResult finish_layer_tcr; if (idx == -1) { diff --git a/src/libslic3r/GCode/WipeTower2.hpp b/src/libslic3r/GCode/WipeTower2.hpp index 6169e8c392..792aed4204 100644 --- a/src/libslic3r/GCode/WipeTower2.hpp +++ b/src/libslic3r/GCode/WipeTower2.hpp @@ -149,6 +149,7 @@ public: struct FilamentParameters { std::string material = "PLA"; bool is_soluble = false; + bool is_support = false; int temperature = 0; int first_layer_temperature = 0; int interface_print_temperature = 0; @@ -329,9 +330,10 @@ private: std::vector m_used_filament_length; std::vector>> m_used_filament_length_until_layer; - // Return index of first toolchange that switches to non-soluble extruder - // ot -1 if there is no such toolchange. - int first_toolchange_to_nonsoluble( + // Return the index of the toolchange whose new filament should print the layer's + // finish extrusions (sparse infill + wall + brim), or -1 to print them with the + // layer's incoming filament before any toolchange happens. + int first_toolchange_to_nonsoluble_nonsupport( const std::vector& tool_changes) const; void toolchange_Unload( From 56810c8c7f9952ee3666d0d217eb52e79671f9b1 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Mon, 27 Jul 2026 21:18:53 +0800 Subject: [PATCH 006/106] Port the skip-points gap wall to WipeTower2 prime_tower_skip_points was stubbed for Type2 towers: the wall call hard-coded skip_points=false, the gap cutter received an empty vector, and append_tcr2 never routed the entry travel. Now the toolchange entry positions are precomputed from the finalized plan, the wall is cut open at each entry, and the entry travel approaches around the tower bounding box through the opening when it starts outside the tower. The geometry helpers are re-synced with the BBL versions (add_extra_point guards, per-point side selection). The cone wall keeps its separate path, where the option stays inert. Behavior change: non-BBL towers now honor the (default-on) checkbox with gap walls and routed entries; with the option off the output is unchanged, and the BBL tower path is untouched. --- src/libslic3r/GCode.cpp | 37 ++++++- src/libslic3r/GCode/WipeTower2.cpp | 150 ++++++++++++++++++++++++++--- src/libslic3r/GCode/WipeTower2.hpp | 7 ++ 3 files changed, 178 insertions(+), 16 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 7550ba8097..c5a1372f9d 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1472,7 +1472,42 @@ static std::vector get_path_of_change_filament(const Print& print) // then we could simplify the condition and make it more readable. gcode += gcodegen.retract(); gcodegen.m_avoid_crossing_perimeters.use_external_mp_once(); - gcode += gcodegen.travel_to(wipe_tower_point_to_object_point(gcodegen, start_pos + plate_origin_2d), erMixed, "Travel to a Wipe Tower"); + const Point start_wipe_pos = wipe_tower_point_to_object_point(gcodegen, start_pos + plate_origin_2d); + // With skip points enabled the tower wall has an opening at this tcr's start + // position: approach around the tower's bounding box and enter through it instead + // of dragging the oozing nozzle across the printed wall (append_tcr parity). + // Hops that already start inside the tower stay direct — they never cross the wall. + if (gcodegen.m_config.prime_tower_skip_points.value + && gcodegen.m_config.wipe_tower_wall_type.value != WipeTowerWallType::wtwCone + && !tcr.priming && gcodegen.last_pos_defined()) { + BoundingBox printer_bbx; + if (is_multi_nozzle_printer(gcodegen.m_config)) { + printer_bbx = get_extents(gcodegen.m_print->get_extruder_shared_printable_polygon()); + printer_bbx.min = wipe_tower_point_to_object_point(gcodegen, unscaled(printer_bbx.min) + plate_origin_2d); + printer_bbx.max = wipe_tower_point_to_object_point(gcodegen, unscaled(printer_bbx.max) + plate_origin_2d); + } else { + Points bed_points; + for (const auto& p : gcodegen.m_config.printable_area.values) + bed_points.push_back(wipe_tower_point_to_object_point(gcodegen, p.cast() + plate_origin_2d)); + printer_bbx = BoundingBox(bed_points); + } + // Transform the tower-local bbx corners exactly like the tcr points (rib + // offset, rotation, tower position); a rotated tower gets a conservative + // axis-aligned envelope. + Polygon avoid_points = scaled(m_wipe_tower_bbx).polygon(); + for (auto& p : avoid_points.points) { + Vec2f pp = transform_wt_pt(unscale(p).cast()); + p = wipe_tower_point_to_object_point(gcodegen, pp + plate_origin_2d); + } + BoundingBox avoid_bbx(avoid_points.points); + if (!avoid_bbx.contains(gcodegen.last_pos())) { + Polyline travel_polyline = generate_path_to_wipe_tower(gcodegen.last_pos(), start_wipe_pos, avoid_bbx, printer_bbx); + // The polyline's last point is start_wipe_pos itself — emitted below. + for (size_t i = 0; i + 1 < travel_polyline.points.size(); ++i) + gcode += gcodegen.travel_to(travel_polyline.points[i], erMixed, "Travel to a Wipe Tower"); + } + } + gcode += gcodegen.travel_to(start_wipe_pos, erMixed, "Travel to a Wipe Tower"); gcode += gcodegen.unretract(); } else { // When this is multiextruder printer without any ramming, we can just change diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index ccb68efb7a..03ce6a80e5 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -428,16 +428,109 @@ static void insert_points(std::vector& pl, int idx, Vec2f pos, in } } -static Polylines remove_points_from_polygon( - const Polygon& polygon, const std::vector& skip_points, double range, bool is_left, Polygon& insert_skip_pg) +// For skip_point +// TODO: Optimize the skip_point algorithm itself instead of adding guards here +static Polygon add_extra_point(const Polygon& polygon, int scale_range) { - assert(polygon.size() > 2); + Polygon res; + if (polygon.size() < 2) return polygon; + + // Compute bounding box of the polygon + auto polygon_box = get_extents(polygon); + + // Anchor point: X at bbox center, Y at bbox bottom + Vec2f anchor_point(float(polygon_box.center()[0]), float(polygon_box.min[1])); + + // Find the edge whose midpoint is closest to the anchor point + size_t closest_edge_idx = 0; + float min_dist_sq = std::numeric_limits::max(); + + for (size_t i = 0; i < polygon.size(); ++i) { + const Point &a_i = polygon[i]; + const Point &b_i = polygon[(i + 1) % polygon.size()]; + + Vec2f a(float(a_i.x()), float(a_i.y())); + Vec2f b(float(b_i.x()), float(b_i.y())); + Vec2f mid = (a + b) * 0.5f; + + float dist_sq = (anchor_point - mid).squaredNorm(); + if (dist_sq < min_dist_sq) { + min_dist_sq = dist_sq; + closest_edge_idx = i; + } + } + + // Edge endpoints (integer space) + const Point &a_i = polygon[closest_edge_idx]; + const Point &b_i = polygon[(closest_edge_idx + 1) % polygon.size()]; + + // Convert to float for geometric computation + Vec2f a(float(a_i.x()), float(a_i.y())); + Vec2f b(float(b_i.x()), float(b_i.y())); + + Vec2f mid = (a + b) * 0.5f; + + // Direction vectors from midpoint towards A and B + Vec2f dir_to_a = a - mid; + Vec2f dir_to_b = b - mid; + + float len_a = dir_to_a.norm(); + float len_b = dir_to_b.norm(); + + // Guard against degenerated edges + if (len_a < EPSILON || len_b < EPSILON) return polygon; + + dir_to_a /= len_a; + dir_to_b /= len_b; + + // Clamp range to avoid overshooting the edge + float max_range = std::min(len_a, len_b) * 0.9f; + float range = std::min(float(scale_range), max_range); + + // Offset points (float space) + Vec2f offset_to_a_f = mid + dir_to_a * range; + Vec2f offset_to_b_f = mid + dir_to_b * range; + + // Safe cast back to scaled integer Point + auto to_int_point = [](const Vec2f &p) { + auto clamp = [](float v) -> coord_t { + constexpr float kMin = float(std::numeric_limits::min()); + constexpr float kMax = float(std::numeric_limits::max()); + v = std::clamp(v, kMin, kMax); + return static_cast(std::lround(v)); + }; + return Point(clamp(p.x()), clamp(p.y())); + }; + + Point mid_i = to_int_point(mid); + Point offset_to_a_i = to_int_point(offset_to_a_f); + Point offset_to_b_i = to_int_point(offset_to_b_f); + + // Rebuild polygon with inserted points + for (size_t i = 0; i < polygon.size(); ++i) { + res.points.push_back(polygon[i]); + + // Insert points right after the selected edge start vertex + if (i == closest_edge_idx) { + res.points.push_back(offset_to_a_i); + res.points.push_back(mid_i); + res.points.push_back(offset_to_b_i); + } + } + + return res; +} + +static Polylines remove_points_from_polygon( + const Polygon& polygon_ori, const std::vector& skip_points, double range, float wt_width, Polygon& insert_skip_pg) +{ + Polygon polygon = add_extra_point(polygon_ori, scale_(range)); + if (polygon.size() < 2) return Polylines{to_polyline(polygon)}; Polylines result; std::vector new_pl; // add intersection points for gaps, where bool indicates whether it's a gap point. std::vector inter_info; - Vec2f ray = is_left ? Vec2f(-1, 0) : Vec2f(1, 0); auto polygon_box = get_extents(polygon); - Point anchor_point = is_left ? Point{polygon_box.max[0], polygon_box.min[1]} : polygon_box.min; // rd:ld + Point anchor_point = Point{polygon_box.center()[0], polygon_box.min[1]}; // for next reconnect std::vector points; { points.reserve(polygon.points.size()); @@ -449,6 +542,8 @@ static Polylines remove_points_from_polygon( } for (int i = 0; i < skip_points.size(); i++) { + bool is_left = abs(skip_points[i].x()) < wt_width / 2.f; + Vec2f ray = is_left ? Vec2f(-1, 0) : Vec2f(1, 0); for (int j = 0; j < points.size(); j++) { Vec2f& p1 = points[j]; Vec2f& p2 = points[(j + 1) % points.size()]; @@ -526,12 +621,7 @@ static Polylines contrust_gap_for_skip_points( insert_skip_polygon = polygon; return Polylines{to_polyline(polygon)}; } - bool is_left = false; - const auto& pt = skip_points.front(); - if (abs(pt.x()) < wt_width / 2.f) { - is_left = true; - } - return remove_points_from_polygon(polygon, skip_points, gap_length, is_left, insert_skip_polygon); + return remove_points_from_polygon(polygon, skip_points, gap_length, wt_width, insert_skip_polygon); }; static Polygon generate_rectange_polygon(const Vec2f& wt_box_min, const Vec2f& wt_box_max) @@ -1272,6 +1362,8 @@ WipeTower2::WipeTower2(const PrintConfig& config, const PrintRegionConfig& defau m_rib_width(config.wipe_tower_rib_width), m_extra_rib_length(config.wipe_tower_extra_rib_length), m_wall_type((int)config.wipe_tower_wall_type), + // The cone wall has its own fully separate generator with no gap machinery. + m_use_gap_wall(config.prime_tower_skip_points.value && config.wipe_tower_wall_type.value != wtwCone), m_flat_ironing(config.prime_tower_flat_ironing.value), m_enable_tower_interface_features(config.enable_tower_interface_features.value), m_enable_tower_interface_cooldown_during_tower(config.enable_tower_interface_cooldown_during_tower.value) @@ -2111,7 +2203,7 @@ WipeTower::ToolChangeResult WipeTower2::finish_layer() poly = generate_support_cone_wall(writer, wt_box, feedrate, infill_cone, spacing); } else { WipeTower::box_coordinates wt_box(Vec2f(0.f, 0.f), m_wipe_tower_width, m_layer_info->depth + m_perimeter_width); - poly = generate_support_rib_wall(writer, wt_box, feedrate, first_layer, m_wall_type == (int)wtwRib, true, false); + poly = generate_support_rib_wall(writer, wt_box, feedrate, first_layer, m_wall_type == (int)wtwRib, true, m_use_gap_wall); } // brim (first layer only) @@ -2397,6 +2489,23 @@ static WipeTower::ToolChangeResult merge_tcr(WipeTower::ToolChangeResult& first, // Processes vector m_plan and calls respective functions to generate G-code for the wipe tower // Resulting ToolChangeResults are appended into vector "result" +// Precompute, for every plan layer, the wall openings ("skip points") at each toolchange's +// entry, like WipeTower::get_all_wall_skip_points(). The entry is where tool_change() +// starts: cleaning_box.ld + (0, m_depth_traversed), with m_depth_traversed advancing by +// required_depth per toolchange — reproduced here from the finalized plan so each gap +// coincides with the entry travel's target (tcr.start_pos, pre-rotation frame). +void WipeTower2::compute_wall_skip_points() +{ + m_wall_skip_points.assign(m_plan.size(), std::vector()); + for (size_t layer_id = 0; layer_id < m_plan.size(); ++layer_id) { + float depth_traversed = 0.f; + for (const auto& toolchange : m_plan[layer_id].tool_changes) { + m_wall_skip_points[layer_id].emplace_back(m_perimeter_width / 2.f, m_perimeter_width / 2.f + depth_traversed); + depth_traversed += toolchange.required_depth; + } + } +} + void WipeTower2::generate(std::vector> &result) { if (m_plan.empty()) @@ -2442,6 +2551,9 @@ void WipeTower2::generate(std::vector> m_rib_width = std::min(m_rib_width, std::min(m_wipe_tower_depth, m_wipe_tower_width) / 2.f); // Ensure that the rib wall of the wipetower are attached to the infill. + if (m_use_gap_wall) + compute_wall_skip_points(); + m_layer_info = m_plan.begin(); m_current_height = 0.f; @@ -2583,7 +2695,14 @@ Polygon WipeTower2::generate_support_rib_wall(WipeTowerWriter2& return wall_polygon; if (skip_points) { - result_wall = contrust_gap_for_skip_points(wall_polygon, std::vector(), m_wipe_tower_width, 2.5 * m_perimeter_width, + // Cut the wall open at each toolchange's entry (see compute_wall_skip_points()). + // The vector is empty during the save_on_last_wipe planning passes, which therefore + // measure the un-gapped wall — same approximation as the BBL tower. + static const std::vector no_skip_points; + const size_t layer_id = size_t(m_layer_info - m_plan.begin()); + const std::vector& layer_skip_points = + layer_id < m_wall_skip_points.size() ? m_wall_skip_points[layer_id] : no_skip_points; + result_wall = contrust_gap_for_skip_points(wall_polygon, layer_skip_points, m_wipe_tower_width, 2.5 * m_perimeter_width, insert_skip_polygon); } else { result_wall.push_back(to_polyline(wall_polygon)); @@ -2591,9 +2710,10 @@ Polygon WipeTower2::generate_support_rib_wall(WipeTowerWriter2& } writer.generate_path(result_wall, feedrate, retract_length, retract_speed, m_used_fillet); // Tower-local shift that puts the rib wall's protruding first-layer min corner at the - // configured tower position, like WipeTower::generate_support_wall_new(). + // configured tower position, like WipeTower::generate_support_wall_new(). Measured on + // the un-gapped outline so a wall gap cannot shift the tower. if (rib_wall && is_first_layer()) { - BoundingBox bbox = get_extents(result_wall); + BoundingBox bbox = get_extents(insert_skip_polygon); m_rib_offset = Vec2f(-unscaled(bbox.min.x()), -unscaled(bbox.min.y())); } diff --git a/src/libslic3r/GCode/WipeTower2.hpp b/src/libslic3r/GCode/WipeTower2.hpp index 792aed4204..12e6573d73 100644 --- a/src/libslic3r/GCode/WipeTower2.hpp +++ b/src/libslic3r/GCode/WipeTower2.hpp @@ -233,6 +233,11 @@ private: float m_extra_rib_length = 0; float m_rib_length = 0; Vec2f m_rib_offset = Vec2f::Zero(); + bool m_use_gap_wall = false; + // Per plan layer, each toolchange's entry position (tower-local, un-shifted frame): + // where the wall is cut open so the entry travel does not cross the printed wall. + // Filled by compute_wall_skip_points() once the plan is final. + std::vector> m_wall_skip_points; bool m_enable_arc_fitting = false; @@ -376,6 +381,8 @@ private: Polygon generate_rib_polygon(const WipeTower::box_coordinates& wt_box); + void compute_wall_skip_points(); + // Computes the depth reserved for a toolchange (shared by plan_toolchange() and the // rib-wall square-tower replanning in generate()). WipeTowerInfo::ToolChange set_toolchange(size_t old_tool, size_t new_tool, float layer_height, float wipe_volume, bool first_layer_plan); From 5b475e5e989b773af8740fce324a3f7cd2f24240 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Tue, 28 Jul 2026 00:15:59 +0800 Subject: [PATCH 007/106] Route the in-place toolchange tower entry through the skip-point gap On multi-tool printers without ramming the tool changes away from the tower and the entry travel is the tcr's own positioning move, which went straight across the printed wall. Append the avoid-perimeter path to the change-filament gcode instead, so the head approaches around the tower and enters through the wall opening (append_tcr parity). --- src/libslic3r/GCode.cpp | 120 ++++++++++++++++++++++++++++------------ src/libslic3r/GCode.hpp | 1 + 2 files changed, 85 insertions(+), 36 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index c5a1372f9d..a93899036f 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -888,6 +888,50 @@ static std::vector get_path_of_change_filament(const Print& print) return res; } + // With skip points enabled the Type2 tower wall has an opening at each toolchange's + // entry (tcr.start_pos): route the approach around the tower's bounding box so the + // nozzle enters through that opening instead of dragging across the printed wall + // (append_tcr parity). Emits only the waypoints leading up to the opening — the + // caller still travels to start_wipe_pos itself. Returns an empty string when the + // option is off, the cone wall is active (it has no gap machinery), or the approach + // already starts inside the tower: such hops never cross the wall and must stay direct. + std::string WipeTowerIntegration::travel_to_tower_gap(GCode &gcodegen, const Point &route_start, const Point &start_wipe_pos) const + { + if (!gcodegen.m_config.prime_tower_skip_points.value + || gcodegen.m_config.wipe_tower_wall_type.value == WipeTowerWallType::wtwCone) + return {}; + const Vec2f plate_origin_2d(m_plate_origin(0), m_plate_origin(1)); + BoundingBox printer_bbx; + if (is_multi_nozzle_printer(gcodegen.m_config)) { + printer_bbx = get_extents(gcodegen.m_print->get_extruder_shared_printable_polygon()); + printer_bbx.min = wipe_tower_point_to_object_point(gcodegen, unscaled(printer_bbx.min) + plate_origin_2d); + printer_bbx.max = wipe_tower_point_to_object_point(gcodegen, unscaled(printer_bbx.max) + plate_origin_2d); + } else { + Points bed_points; + for (const auto& p : gcodegen.m_config.printable_area.values) + bed_points.push_back(wipe_tower_point_to_object_point(gcodegen, p.cast() + plate_origin_2d)); + printer_bbx = BoundingBox(bed_points); + } + // Transform the tower-local bbx corners exactly like the tcr points (rib + // offset, rotation, tower position); a rotated tower gets a conservative + // axis-aligned envelope. + const float alpha = m_wipe_tower_rotation / 180.f * float(M_PI); + Polygon avoid_points = scaled(m_wipe_tower_bbx).polygon(); + for (auto& p : avoid_points.points) { + Vec2f pp = Eigen::Rotation2Df(alpha) * (unscale(p).cast() + m_rib_offset) + m_wipe_tower_pos; + p = wipe_tower_point_to_object_point(gcodegen, pp + plate_origin_2d); + } + BoundingBox avoid_bbx(avoid_points.points); + if (avoid_bbx.contains(route_start)) + return {}; + Polyline travel_polyline = generate_path_to_wipe_tower(route_start, start_wipe_pos, avoid_bbx, printer_bbx); + std::string gcode; + // The polyline's last point is start_wipe_pos itself — emitted by the caller. + for (size_t i = 0; i + 1 < travel_polyline.points.size(); ++i) + gcode += gcodegen.travel_to(travel_polyline.points[i], erMixed, "Travel to a Wipe Tower"); + return gcode; + } + std::string WipeTowerIntegration::append_tcr(GCode& gcodegen, const WipeTower::ToolChangeResult& tcr, int new_filament_id, double z) const { if (new_filament_id != -1 && new_filament_id != tcr.new_tool) @@ -1467,51 +1511,22 @@ static std::vector get_path_of_change_filament(const Print& print) || is_ramming || tool_change_on_wipe_tower); - if (should_travel_to_tower || gcodegen.m_need_change_layer_lift_z) { + const bool travel_to_tower_now = should_travel_to_tower || gcodegen.m_need_change_layer_lift_z; + if (travel_to_tower_now) { // FIXME: It would be better if the wipe tower set the force_travel flag for all toolchanges, // then we could simplify the condition and make it more readable. gcode += gcodegen.retract(); gcodegen.m_avoid_crossing_perimeters.use_external_mp_once(); const Point start_wipe_pos = wipe_tower_point_to_object_point(gcodegen, start_pos + plate_origin_2d); - // With skip points enabled the tower wall has an opening at this tcr's start - // position: approach around the tower's bounding box and enter through it instead - // of dragging the oozing nozzle across the printed wall (append_tcr parity). - // Hops that already start inside the tower stay direct — they never cross the wall. - if (gcodegen.m_config.prime_tower_skip_points.value - && gcodegen.m_config.wipe_tower_wall_type.value != WipeTowerWallType::wtwCone - && !tcr.priming && gcodegen.last_pos_defined()) { - BoundingBox printer_bbx; - if (is_multi_nozzle_printer(gcodegen.m_config)) { - printer_bbx = get_extents(gcodegen.m_print->get_extruder_shared_printable_polygon()); - printer_bbx.min = wipe_tower_point_to_object_point(gcodegen, unscaled(printer_bbx.min) + plate_origin_2d); - printer_bbx.max = wipe_tower_point_to_object_point(gcodegen, unscaled(printer_bbx.max) + plate_origin_2d); - } else { - Points bed_points; - for (const auto& p : gcodegen.m_config.printable_area.values) - bed_points.push_back(wipe_tower_point_to_object_point(gcodegen, p.cast() + plate_origin_2d)); - printer_bbx = BoundingBox(bed_points); - } - // Transform the tower-local bbx corners exactly like the tcr points (rib - // offset, rotation, tower position); a rotated tower gets a conservative - // axis-aligned envelope. - Polygon avoid_points = scaled(m_wipe_tower_bbx).polygon(); - for (auto& p : avoid_points.points) { - Vec2f pp = transform_wt_pt(unscale(p).cast()); - p = wipe_tower_point_to_object_point(gcodegen, pp + plate_origin_2d); - } - BoundingBox avoid_bbx(avoid_points.points); - if (!avoid_bbx.contains(gcodegen.last_pos())) { - Polyline travel_polyline = generate_path_to_wipe_tower(gcodegen.last_pos(), start_wipe_pos, avoid_bbx, printer_bbx); - // The polyline's last point is start_wipe_pos itself — emitted below. - for (size_t i = 0; i + 1 < travel_polyline.points.size(); ++i) - gcode += gcodegen.travel_to(travel_polyline.points[i], erMixed, "Travel to a Wipe Tower"); - } - } + if (!tcr.priming && gcodegen.last_pos_defined()) + gcode += travel_to_tower_gap(gcodegen, gcodegen.last_pos(), start_wipe_pos); gcode += gcodegen.travel_to(start_wipe_pos, erMixed, "Travel to a Wipe Tower"); gcode += gcodegen.unretract(); } else { // When this is multiextruder printer without any ramming, we can just change - // the tool without travelling to the tower. + // the tool without travelling to the tower. The tower entry travel then lives + // inside the tcr gcode; with skip points on it is rerouted below, once the + // toolchange gcode (and the head position it ends at) is known. } if (will_go_down) { @@ -1534,6 +1549,39 @@ static std::vector get_path_of_change_filament(const Print& print) toolchange_temp_override = interface_temp; } toolchange_gcode_str = gcodegen.set_extruder(new_extruder_id, tcr.print_z, false, toolchange_temp_override); // TODO: toolchange_z vs print_z + if (!travel_to_tower_now && !tcr.priming && needs_toolchange + && gcodegen.m_config.prime_tower_skip_points.value + && gcodegen.m_config.wipe_tower_wall_type.value != WipeTowerWallType::wtwCone) { + // The tool changed in place (multi-tool printer without ramming), so the + // tower entry is the tcr's own positioning move — a straight line across + // the printed wall. Route it around the tower and in through the wall + // opening instead, riding at the end of the change_filament_gcode + // substitution so the generator's positioning move degrades to a + // zero-length one (append_tcr parity: travel after the filament change, + // retracted, with the new filament). + Vec3f last_gcode_pos = gcodegen.writer().get_position().cast(); + Point route_start; + bool have_start = false; + if (GCodeProcessor::get_last_position_from_gcode(toolchange_gcode_str, last_gcode_pos)) { + // A custom change_filament_gcode may have moved the head (tool docks + // etc.); recover the real position from the emitted gcode. + route_start = gcodegen.gcode_to_point(Vec2d(last_gcode_pos.x(), last_gcode_pos.y()) + plate_origin_2d.cast()); + have_start = true; + } else if (gcodegen.last_pos_defined()) { + route_start = gcodegen.last_pos(); + have_start = true; + } + if (have_start) { + gcodegen.set_last_pos(route_start); + gcodegen.m_avoid_crossing_perimeters.use_external_mp_once(); + const Point start_wipe_pos = wipe_tower_point_to_object_point(gcodegen, start_pos + plate_origin_2d); + std::string travel = travel_to_tower_gap(gcodegen, route_start, start_wipe_pos); + travel += gcodegen.travel_to(start_wipe_pos, erMixed, "Travel to a Wipe Tower"); + check_add_eol(travel); + toolchange_gcode_str += travel; + gcodegen.set_last_pos(start_wipe_pos); + } + } if (gcodegen.config().enable_prime_tower) { deretraction_str += gcodegen.writer().travel_to_z(z, "Force restore layer Z", true); Vec3d position{gcodegen.writer().get_position()}; diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 558d601e53..bda9cc43c0 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -132,6 +132,7 @@ private: std::string append_tcr(GCode &gcodegen, const WipeTower::ToolChangeResult &tcr, int new_extruder_id, double z = -1.) const; Polyline generate_path_to_wipe_tower(const Point &start_pos, const Point &end_pos, const BoundingBox &avoid_polygon, const BoundingBox &printer_bbx) const; std::string append_tcr2(GCode &gcodegen, const WipeTower::ToolChangeResult &tcr, int new_extruder_id, double z = -1.) const; + std::string travel_to_tower_gap(GCode &gcodegen, const Point &route_start, const Point &start_wipe_pos) const; // Postprocesses gcode: rotates and moves G1 extrusions and returns result std::string post_process_wipe_tower_moves(const WipeTower::ToolChangeResult& tcr, const Vec2f& translation, float angle) const; From 013a9452af837759cc4965b8d2b90b44d240d8e3 Mon Sep 17 00:00:00 2001 From: peachismomo Date: Tue, 28 Jul 2026 19:48:10 +0800 Subject: [PATCH 008/106] fix: prevent Windows OTA vendor profile update race --- src/slic3r/Utils/PresetUpdater.cpp | 96 ++++++++++++------------------ 1 file changed, 39 insertions(+), 57 deletions(-) diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 9ec57fd653..18a9db4e26 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -1,12 +1,14 @@ #include "PresetUpdater.hpp" #include +#include #include +#include #include #include #include -#include #include +#include #include #include #include @@ -19,6 +21,7 @@ #include #include +#include #include #include @@ -204,7 +207,6 @@ struct PresetUpdater::priv // Per-vendor update checking std::set checked_vendors; - std::mutex vendor_check_mutex; std::vector vendor_check_threads; std::atomic vendor_check_cancel{false}; @@ -221,10 +223,10 @@ struct PresetUpdater::priv priv(); void set_download_prefs(AppConfig *app_config); - bool get_file(const std::string &url, const fs::path &target_path) const; - //BBS: refine preset update logic + bool get_file(const std::string &url, const fs::path &target_path) const; + //BBS: refine preset update logic bool extract_file(const fs::path &source_path, const fs::path &dest_path = {}); - void prune_tmps() const; + void prune_tmp(const std::string& vendor_id) const; void sync_version() const; void parse_version_string(const std::string& body) const; void sync_resources(std::string http_url, std::map &resources, bool check_patch = false, std::string current_version="", std::string changelog_file=""); @@ -371,14 +373,14 @@ bool PresetUpdater::priv::extract_file(const fs::path &source_path, const fs::pa return true; } -// Remove leftover paritally downloaded files, if any. -void PresetUpdater::priv::prune_tmps() const +// Remove a leftover partial archive for the vendor about to be synchronized. +void PresetUpdater::priv::prune_tmp(const std::string& vendor_id) const { - for (auto &dir_entry : boost::filesystem::directory_iterator(cache_path)) - if (is_plain_file(dir_entry) && dir_entry.path().extension() == TMP_EXTENSION) { - BOOST_LOG_TRIVIAL(debug) << "[Orca Updater]remove old cached files: " << dir_entry.path().string(); - fs::remove(dir_entry.path()); - } + boost::system::error_code ec; + const fs::path tmp_path = cache_path / (vendor_id + TMP_EXTENSION); + fs::remove(tmp_path, ec); + if (ec) + BOOST_LOG_TRIVIAL(warning) << "[Orca Updater]failed to remove " << tmp_path.string() << ": " << ec.message(); } //BBS: refine the Preset Updater logic @@ -1060,10 +1062,9 @@ void PresetUpdater::priv::check_installed_vendor_profiles() const Semver resource_ver = get_version_from_json(file_path); Semver vendor_ver = get_version_from_json(path_in_vendor.string()); - bool version_match = ((resource_ver.maj() == vendor_ver.maj()) && (resource_ver.min() == vendor_ver.min())); - - if (!version_match || (vendor_ver < resource_ver)) { - BOOST_LOG_TRIVIAL(info) << "[Orca Updater]:found vendor "<set_download_prefs(GUI::wxGetApp().app_config); if (!p->enabled_version_check && !p->enabled_config_update) { return; } - // Copy the whole vendors data for use in the background thread - // Unfortunatelly as of C++11, it needs to be copied again - // into the closure (but perhaps the compiler can elide this). - VendorMap vendors = preset_bundle ? preset_bundle->vendors : VendorMap{}; - - // Determine active vendor before entering the thread - std::string active_vendor; - if (preset_bundle) { - const Preset& printer = preset_bundle->printers.get_edited_preset(); - if (printer.vendor) - active_vendor = printer.vendor->id; - } - - p->thread = std::thread([this, vendors, active_vendor, http_url, language, plugin_version]() { - this->p->prune_tmps(); - if (p->cancel) - return; - this->p->sync_version(); - if (p->cancel) - return; - // Per-vendor config check for the active vendor at startup - if (!active_vendor.empty() && !vendors.empty()) { - this->p->sync_vendor_config(active_vendor); - if (p->cancel) - return; - { - std::lock_guard lock(this->p->vendor_check_mutex); - this->p->checked_vendors.insert(active_vendor); - } - } - if (p->cancel) - return; - this->p->sync_plugins(http_url, plugin_version); - this->p->sync_printer_config(http_url); - //if (p->cancel) - // return; - //remove the tooltip currently - //this->p->sync_tooltip(http_url, language); + p->thread = std::thread([this, http_url, language, plugin_version]() { + try { + this->p->sync_version(); + if (p->cancel) + return; + // Vendor profile updates are triggered by check_vendor_update() + // after the startup printer preset has been restored. + this->p->sync_plugins(http_url, plugin_version); + this->p->sync_printer_config(http_url); + //if (p->cancel) + // return; + //remove the tooltip currently + //this->p->sync_tooltip(http_url, language); + } catch (const std::exception &e) { + BOOST_LOG_TRIVIAL(error) << "[Orca Updater] background sync failed: " << e.what(); + } catch (...) { + BOOST_LOG_TRIVIAL(error) << "[Orca Updater] background sync failed with an unknown exception"; + } }); } @@ -1356,16 +1337,17 @@ void PresetUpdater::check_vendor_update(const std::string& vendor_id) if (!p->enabled_config_update) return; if (vendor_id.empty()) return; - std::lock_guard lock(p->vendor_check_mutex); - if (!p->checked_vendors.insert(vendor_id).second) return; p->vendor_check_threads.emplace_back([this, vendor_id]() { try { + this->p->prune_tmp(vendor_id); this->p->sync_vendor_config(vendor_id); } catch (const std::exception& e) { BOOST_LOG_TRIVIAL(error) << "[Orca Updater] vendor update failed for " << vendor_id << ": " << e.what(); + } catch (...) { + BOOST_LOG_TRIVIAL(error) << "[Orca Updater] vendor update failed for " << vendor_id << " with an unknown exception"; } }); } From bef47b2c70085fccb7788f36c4b2505543c2c650 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Tue, 28 Jul 2026 21:21:50 +0800 Subject: [PATCH 009/106] Iron the purge start out through the skip-point gap in WipeTower2 Port the BBL tower's entry line ironing: extrude the first 3 mm of the purge, retract, drag the nozzle 1.5x back out through the wall gap at F600, creep back at F240 and unretract, so the toolchange start blob ends up in the gap instead of on the wall. Fires only when the purge starts at the left-edge entry heading right (in-place toolchangers); SEMM ram/cooling wipes start mid-box and the priming line has no wall, so both keep their previous output. --- src/libslic3r/GCode/WipeTower2.cpp | 27 ++++++++++++++++++++++++--- src/libslic3r/GCode/WipeTower2.hpp | 3 ++- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index 03ce6a80e5..c1d46e11c4 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -1571,11 +1571,11 @@ std::vector WipeTower2::prime( toolchange_Load(writer, cleaning_box); // Prime the tool. if (idx_tool + 1 == tools.size()) { // Last tool should not be unloaded, but it should be wiped enough to become of a pure color. - toolchange_Wipe(writer, cleaning_box, wipe_volumes[tools[idx_tool-1]][tool], false); + toolchange_Wipe(writer, cleaning_box, wipe_volumes[tools[idx_tool-1]][tool], false, true); } else { // Ram the hot material out of the melt zone, retract the filament into the cooling tubes and let it cool. //writer.travel(writer.x(), writer.y() + m_perimeter_width, 7200); - toolchange_Wipe(writer, cleaning_box , 20.f, false); + toolchange_Wipe(writer, cleaning_box , 20.f, false, true); WipeTower::box_coordinates box = cleaning_box; box.translate(0.f, writer.y() - cleaning_box.ld.y() + m_perimeter_width); toolchange_Unload(writer, box , m_filpar[m_current_tool].material, m_filpar[m_current_tool].first_layer_temperature, m_filpar[tools[idx_tool + 1]].first_layer_temperature); @@ -2013,7 +2013,8 @@ void WipeTower2::toolchange_Wipe( WipeTowerWriter2 &writer, const WipeTower::box_coordinates &cleaning_box, float wipe_volume, - bool interface_layer) + bool interface_layer, + bool priming) { // Increase flow on first layer, slow down print. writer.set_extrusion_flow(m_extrusion_flow * (is_first_layer() ? 1.18f : 1.f)) @@ -2056,6 +2057,26 @@ void WipeTower2::toolchange_Wipe( } float traversed_x = writer.x(); + + // BBS gap wall: iron the first few mm of the purge, then drag the retracted nozzle + // back out through the wall gap so the toolchange start blob is not left on the wall. + // WT2's entry gap always sits at the left-edge entry point, so only iron when the + // purge actually starts there heading right (in-place toolchangers do; SEMM + // ram/cooling moves leave the nozzle mid-box, far from any gap). + if (i == 0 && m_use_gap_wall && !interface_layer && !priming && m_left_to_right && + writer.x() - xl < 2.5f * line_width) { + float ironing_length = 3.f; + if (xr - writer.x() < ironing_length) + ironing_length = std::max(xr - writer.x(), 0.f); + const float retract_length = m_filpar[m_current_tool].retract_length; + const float retract_speed = m_filpar[m_current_tool].retract_speed * 60.f; + writer.extrude(writer.x() + ironing_length, writer.y(), wipe_speed); + writer.retract(retract_length, retract_speed); + writer.travel(writer.x() - 1.5f * ironing_length, writer.y(), 600.f); + writer.travel(writer.x() + 1.5f * ironing_length, writer.y(), 240.f); + writer.retract(-retract_length, retract_speed); + } + if (m_left_to_right) writer.extrude(xr - (i % 4 == 0 ? 0 : 1.5f*line_width), writer.y(), wipe_speed); else diff --git a/src/libslic3r/GCode/WipeTower2.hpp b/src/libslic3r/GCode/WipeTower2.hpp index 12e6573d73..855434d863 100644 --- a/src/libslic3r/GCode/WipeTower2.hpp +++ b/src/libslic3r/GCode/WipeTower2.hpp @@ -361,7 +361,8 @@ private: WipeTowerWriter2 &writer, const WipeTower::box_coordinates &cleaning_box, float wipe_volume, - bool interface_layer); + bool interface_layer, + bool priming = false); Polygon generate_support_rib_wall(WipeTowerWriter2& writer, From 0dc14aa87635c81818c993e23c2315ee626f43d0 Mon Sep 17 00:00:00 2001 From: Ru Date: Tue, 28 Jul 2026 23:11:05 +0300 Subject: [PATCH 010/106] feat(plugin): expose orca.host.app_language() for plugin localization Plugins have no way to localize their own dialogs: the UI language lives in OrcaSlicer.conf, which the plugin audit hook deny-lists because the file sits next to cloud secrets. Add a read-only host accessor that returns just the language code (current_language_code_safe), so plugins can match the app language without touching the config file. --- src/slic3r/plugin/host/PluginHostApp.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/slic3r/plugin/host/PluginHostApp.cpp b/src/slic3r/plugin/host/PluginHostApp.cpp index a17f160bb7..75acd4cc7b 100644 --- a/src/slic3r/plugin/host/PluginHostApp.cpp +++ b/src/slic3r/plugin/host/PluginHostApp.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -55,6 +56,15 @@ void host_bindings::register_app(py::module_& host) return current_plater()->model(); }, py::return_value_policy::reference); host.def("preset_bundle", ¤t_preset_bundle, py::return_value_policy::reference); + // UI language of the running app ("en_US", "ru_RU", ...), so plugins can + // localize their own dialogs. The app config file that stores this value + // is deny-listed by the audit hook (it sits next to cloud secrets), so a + // read-only accessor is the supported way to get just the language. + host.def("app_language", []() -> std::string { + if (wxTheApp == nullptr) + throw std::runtime_error("OrcaSlicer application is not initialized"); + return GUI::into_u8(GUI::wxGetApp().current_language_code_safe()); + }); } } // namespace Slic3r From 29d4513694d9ff0d6d9915eaddfdf1c37b9f1a3d Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Tue, 28 Jul 2026 23:46:14 +0300 Subject: [PATCH 011/106] Fix overlapping brims (#14991) --- src/libslic3r/Brim.cpp | 22 ++++++++++++++-------- tests/fff_print/test_skirt_brim.cpp | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp index 6473dc5c21..b22c9c323e 100644 --- a/src/libslic3r/Brim.cpp +++ b/src/libslic3r/Brim.cpp @@ -32,15 +32,13 @@ static void append_and_translate(ExPolygons &dst, const ExPolygons &src, const P for (; dst_idx < dst.size(); ++dst_idx) dst[dst_idx].translate(instance_shift); } -// BBS: generate brim area by objs -static void append_and_translate(ExPolygons& dst, const ExPolygons& src, - const PrintInstance& instance, size_t instance_idx, std::map& brimAreaMap) { +// Orca: Translate the brim area into print coordinates and store it per instance. +static void append_and_translate(const ExPolygons& src, const PrintInstance& instance, + size_t instance_idx, std::map& brimAreaMap) { ExPolygons srcShifted = src; Point instance_shift = instance.shift_without_plate_offset(); - for (size_t src_idx = 0; src_idx < srcShifted.size(); ++src_idx) - srcShifted[src_idx].translate(instance_shift); - srcShifted = diff_ex(srcShifted, dst); - //expolygons_append(dst, temp2); + for (ExPolygon& expoly : srcShifted) + expoly.translate(instance_shift); expolygons_append(brimAreaMap[{ instance.print_object->id(), instance_idx }], std::move(srcShifted)); } @@ -572,7 +570,7 @@ static ExPolygons outer_inner_brim_area(const Print& print, for (size_t instance_idx = 0; instance_idx < object->instances().size(); ++instance_idx) { const PrintInstance& instance = object->instances()[instance_idx]; if (!brim_area_object.empty()) - append_and_translate(brim_area, brim_area_object, instance, instance_idx, brimAreaMap); + append_and_translate(brim_area_object, instance, instance_idx, brimAreaMap); append_and_translate(no_brim_area, no_brim_area_object, instance); append_and_translate(holes, holes_object, instance); append_and_translate(objectIslands, objectIsland, instance); @@ -875,6 +873,14 @@ void make_brim(const Print& print, PrintTryCancel try_cancel, Polygons& islands_ ExPolygons islands_area_ex = outer_inner_brim_area(print, float(flow.scaled_spacing()), brimAreaMap, objPrintVec, printExtruders); + if (!print.config().combine_brims) { + ExPolygons claimed_area; + for (auto& [_, areas] : brimAreaMap) { + areas = diff_ex(areas, claimed_area); + expolygons_append(claimed_area, areas); + } + } + // BBS: Find boundingbox of the first layer for (const ObjectID printObjID : print.print_object_ids()) { BoundingBox bbx; diff --git a/tests/fff_print/test_skirt_brim.cpp b/tests/fff_print/test_skirt_brim.cpp index d957a4c649..3f63d3de5f 100644 --- a/tests/fff_print/test_skirt_brim.cpp +++ b/tests/fff_print/test_skirt_brim.cpp @@ -153,6 +153,24 @@ TEST_CASE("Object brims are generated per instance", "[SkirtBrim]") } } +TEST_CASE("Uncombined neighboring brims precede their respective objects", "[SkirtBrim]") +{ + Print print; + Model model; + place_two_cubes_apart(0, { + { "skirt_loops", 0 }, + { "brim_type", "outer_only" }, + { "brim_width", 5 }, + { "combine_brims", 0 }, + }, print, model); + print.process(); + + REQUIRE(print.skirt_brim_groups().size() == 1); + REQUIRE(print.skirt_brim_groups().front().brims.size() == 2); + CHECK(role_sequence(gcode(print), { "brim", "perimeter" }) == + std::vector{ "brim", "perimeter", "brim", "perimeter" }); +} + TEST_CASE("Combine brims merges neighboring object instances", "[SkirtBrim]") { Print print; From 9292db2f9fd229df7e963693f202e6587bc9dbca Mon Sep 17 00:00:00 2001 From: SoftFever Date: Wed, 29 Jul 2026 13:23:29 +0800 Subject: [PATCH 012/106] Reserve WipeTower2 toolchange depth to match the printed purge The planner reserved ramming rows gated only on enable_filament_ramming and sized them with the SEMM 0.25s time step, while toolchange_Unload rams on (semm && enable_filament_ramming) || filament_multitool_ramming with the multitool time step. Disabling multitool ramming therefore left ~3 unprinted rows per toolchange as blank bands in the tower. Without ramming the first wipe line also needs reserved depth of its own (it no longer rides the last ramming row), plus the y_step/2 offset the wipe start inherits from the ramming start position - otherwise the tightened boxes truncate the ordered purge at the box edge. --- src/libslic3r/GCode/WipeTower2.cpp | 28 ++++++++++++++++++++++------ src/libslic3r/GCode/WipeTower2.hpp | 5 +++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index c1d46e11c4..82beef263f 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -2346,15 +2346,29 @@ void WipeTower2::plan_toolchange(float z_par, float layer_height_par, unsigned i m_plan.back().tool_changes.push_back(set_toolchange(old_tool, new_tool, layer_height_par, wipe_volume, first_layer_plan)); } +float WipeTower2::wipe_start_depth_offset(size_t old_tool) const +{ + const bool do_ramming = (m_semm && m_enable_filament_ramming) || m_filpar[old_tool].multitool_ramming; + if (do_ramming) + return 0.f; + return 0.5f * m_perimeter_width * m_filpar[old_tool].ramming_line_width_multiplicator * m_filpar[old_tool].ramming_step_multiplicator * m_extra_spacing_ramming; +} + WipeTower2::WipeTowerInfo::ToolChange WipeTower2::set_toolchange(size_t old_tool, size_t new_tool, float layer_height, float wipe_volume, bool first_layer_plan) { float width = m_wipe_tower_width - 3*m_perimeter_width; - float length_to_extrude = volume_to_length(0.25f * std::accumulate(m_filpar[old_tool].ramming_speed.begin(), m_filpar[old_tool].ramming_speed.end(), 0.f), + float length_to_extrude = volume_to_length((m_semm ? 0.25f : m_filpar[old_tool].multitool_ramming_time) * std::accumulate(m_filpar[old_tool].ramming_speed.begin(), m_filpar[old_tool].ramming_speed.end(), 0.f), m_perimeter_width * m_filpar[old_tool].ramming_line_width_multiplicator, layer_height); - // Orca: Set ramming depth to 0 if ramming is disabled. - float ramming_depth = m_enable_filament_ramming ? ((int(length_to_extrude / width) + 1) * (m_perimeter_width * m_filpar[old_tool].ramming_line_width_multiplicator * m_filpar[old_tool].ramming_step_multiplicator) * m_extra_spacing_ramming) : 0; - float first_wipe_line = - (width*((length_to_extrude / width)-int(length_to_extrude / width)) - width); + // Orca: Reserve ramming depth only when toolchange_Unload() will actually ram + // (same condition as its do_ramming), otherwise the unprinted reservation + // leaves blank bands between the purge boxes. + const bool do_ramming = (m_semm && m_enable_filament_ramming) || m_filpar[old_tool].multitool_ramming; + float ramming_depth = do_ramming ? ((int(length_to_extrude / width) + 1) * (m_perimeter_width * m_filpar[old_tool].ramming_line_width_multiplicator * m_filpar[old_tool].ramming_step_multiplicator) * m_extra_spacing_ramming) : 0; + // first_wipe_line rides for free on the last (partially used) ramming row, which + // is already covered by ramming_depth. Without ramming that row does not exist, + // so the whole wipe volume needs reserved wiping depth. + float first_wipe_line = do_ramming ? - (width*((length_to_extrude / width)-int(length_to_extrude / width)) - width) : 0.f; float first_wipe_volume = length_to_volume(first_wipe_line, m_perimeter_width * m_extra_flow, layer_height); @@ -2367,7 +2381,8 @@ WipeTower2::WipeTowerInfo::ToolChange WipeTower2::set_toolchange(size_t old_tool // ORCA: and first-layer purge segments do not leave visible gaps. const float planning_spacing = first_layer_plan ? m_extra_flow : m_extra_spacing_wipe; - float wiping_depth = get_wipe_depth(wipe_volume - first_wipe_volume, layer_height, m_perimeter_width, m_extra_flow, planning_spacing, width); + float wiping_depth = get_wipe_depth(wipe_volume - first_wipe_volume, layer_height, m_perimeter_width, m_extra_flow, planning_spacing, width) + + wipe_start_depth_offset(old_tool); return WipeTowerInfo::ToolChange(old_tool, new_tool, ramming_depth + wiping_depth, ramming_depth, first_wipe_line, wipe_volume); } @@ -2429,7 +2444,8 @@ void WipeTower2::save_on_last_wipe() const bool first_layer_plan = size_t(m_layer_info - m_plan.begin()) == m_first_layer_idx; const float planning_spacing = first_layer_plan ? m_extra_flow : m_extra_spacing_wipe; - float depth_to_wipe = get_wipe_depth(volume_we_need_depth_for, m_layer_info->height, m_perimeter_width, m_extra_flow, planning_spacing, width); + float depth_to_wipe = get_wipe_depth(volume_we_need_depth_for, m_layer_info->height, m_perimeter_width, m_extra_flow, planning_spacing, width) + + wipe_start_depth_offset(toolchange.old_tool); toolchange.required_depth = toolchange.ramming_depth + depth_to_wipe; toolchange.wipe_volume = volume_left_to_wipe; diff --git a/src/libslic3r/GCode/WipeTower2.hpp b/src/libslic3r/GCode/WipeTower2.hpp index 855434d863..627204ce28 100644 --- a/src/libslic3r/GCode/WipeTower2.hpp +++ b/src/libslic3r/GCode/WipeTower2.hpp @@ -387,6 +387,11 @@ private: // Computes the depth reserved for a toolchange (shared by plan_toolchange() and the // rib-wall square-tower replanning in generate()). WipeTowerInfo::ToolChange set_toolchange(size_t old_tool, size_t new_tool, float layer_height, float wipe_volume, bool first_layer_plan); + + // Depth consumed before the first wipe row when no ramming is printed (the wipe + // still starts y_step/2 into the box, see toolchange_Unload()); 0 with ramming, + // whose planned rows already carry the slack for it. + float wipe_start_depth_offset(size_t old_tool) const; }; From 36bd453ac8f0fe01a5ea72bac2779264d898d0e5 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Wed, 29 Jul 2026 16:37:06 +0800 Subject: [PATCH 013/106] Tile WipeTower2 purge rows contiguously across toolchange blocks Without ramming, each purge block reserved one wipe pitch more than its rows occupy (ceil+1 rounding plus the ram-geometry start offset), and the wipe began a full pitch inside the block, leaving a blank band of exactly two pitches between adjacent blocks. Plan the block as whole wipe rows, start the first row so the row lattice continues across the block boundary, and fill the reserved box instead of stopping at the ordered volume, mirroring how the BBL WipeTower keeps planned depth identical to printed rows. Ram-printing toolchanges (SEMM with ramming enabled, multitool ramming) are unchanged. --- src/libslic3r/GCode/WipeTower2.cpp | 43 ++++++++++++++++++------------ src/libslic3r/GCode/WipeTower2.hpp | 8 ++---- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index 82beef263f..487a7d6c1c 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -1673,6 +1673,11 @@ WipeTower::ToolChangeResult WipeTower2::tool_change(size_t tool) // Ram the hot material out of the melt zone, retract the filament into the cooling tubes and let it cool. if (tool != (unsigned int)-1){ // This is not the last change. + // Without a ram the box was planned as whole wipe rows; the wipe then fills it + // completely so adjacent purge blocks stay contiguous. Uses the old tool + // (m_current_tool before toolchange_Change), same condition as + // toolchange_Unload()'s do_ramming. + const bool fill_box = !((m_semm && m_enable_filament_ramming) || m_filpar[m_current_tool].multitool_ramming); auto new_tool_temp = is_first_layer() ? m_filpar[tool].first_layer_temperature : m_filpar[tool].temperature; toolchange_Unload(writer, cleaning_box, m_filpar[m_current_tool].material, (is_first_layer() ? m_filpar[m_current_tool].first_layer_temperature : m_filpar[m_current_tool].temperature), @@ -1695,7 +1700,7 @@ WipeTower::ToolChangeResult WipeTower2::tool_change(size_t tool) writer.extrude_explicit(target_x, writer.y(), pre_len, 600.f); } } - toolchange_Wipe(writer, cleaning_box, wipe_volume, interface_layer); // Wipe the newly loaded filament until the end of the assigned wipe area. + toolchange_Wipe(writer, cleaning_box, wipe_volume, interface_layer, false, fill_box); // Wipe the newly loaded filament until the end of the assigned wipe area. if (interface_layer) { int interface_temp = m_filpar[tool].interface_print_temperature; if (!m_enable_tower_interface_cooldown_during_tower && interface_temp > 0 && interface_temp != base_temp) @@ -1933,8 +1938,18 @@ void WipeTower2::toolchange_Unload( Vec2f pos = Vec2f(end_of_ramming.x(), end_of_ramming.y() + (y_step/m_extra_spacing_ramming-m_perimeter_width) / 2.f + m_perimeter_width); if (do_ramming) writer.travel(pos, 2400.f); - else - writer.set_position(pos); + else { + // Orca: with no ram printed there is no ramming geometry to align with. Start the + // first wipe row so the purge row lattice continues across the block boundary + // (previous box's last row top edge sits at its box top): with the planned depth + // of rows * dy, the last row's top edge then lands exactly on this box's top and + // no blank band is left between adjacent purge blocks. Mirrors dy/line_width in + // toolchange_Wipe(). + const float wipe_dy = (is_first_layer() ? m_extra_flow : m_extra_spacing_wipe) * m_perimeter_width; + const float wipe_line_width = m_perimeter_width * m_extra_flow; + writer.set_position(Vec2f(end_of_ramming.x(), + cleaning_box.ld.y() + m_depth_traversed + wipe_dy - (m_perimeter_width + wipe_line_width) / 2.f + m_perimeter_width)); + } writer.resume_preview() .flush_planner_queue(); @@ -2014,7 +2029,8 @@ void WipeTower2::toolchange_Wipe( const WipeTower::box_coordinates &cleaning_box, float wipe_volume, bool interface_layer, - bool priming) + bool priming, + bool fill_box) { // Increase flow on first layer, slow down print. writer.set_extrusion_flow(m_extrusion_flow * (is_first_layer() ? 1.18f : 1.f)) @@ -2092,7 +2108,10 @@ void WipeTower2::toolchange_Wipe( traversed_x -= writer.x(); x_to_wipe -= std::abs(traversed_x); - if (x_to_wipe < WT_EPSILON) { + // Orca: with no ram printed the box was planned as whole wipe rows; fill it + // completely (quantizing the purge up to the planned rows) so the next block + // can start right above it without a blank band in between. + if (!fill_box && x_to_wipe < WT_EPSILON) { writer.travel(m_left_to_right ? xl + 1.5f*line_width : xr - 1.5f*line_width, writer.y(), 7200); break; } @@ -2346,14 +2365,6 @@ void WipeTower2::plan_toolchange(float z_par, float layer_height_par, unsigned i m_plan.back().tool_changes.push_back(set_toolchange(old_tool, new_tool, layer_height_par, wipe_volume, first_layer_plan)); } -float WipeTower2::wipe_start_depth_offset(size_t old_tool) const -{ - const bool do_ramming = (m_semm && m_enable_filament_ramming) || m_filpar[old_tool].multitool_ramming; - if (do_ramming) - return 0.f; - return 0.5f * m_perimeter_width * m_filpar[old_tool].ramming_line_width_multiplicator * m_filpar[old_tool].ramming_step_multiplicator * m_extra_spacing_ramming; -} - WipeTower2::WipeTowerInfo::ToolChange WipeTower2::set_toolchange(size_t old_tool, size_t new_tool, float layer_height, float wipe_volume, bool first_layer_plan) { float width = m_wipe_tower_width - 3*m_perimeter_width; @@ -2381,8 +2392,7 @@ WipeTower2::WipeTowerInfo::ToolChange WipeTower2::set_toolchange(size_t old_tool // ORCA: and first-layer purge segments do not leave visible gaps. const float planning_spacing = first_layer_plan ? m_extra_flow : m_extra_spacing_wipe; - float wiping_depth = get_wipe_depth(wipe_volume - first_wipe_volume, layer_height, m_perimeter_width, m_extra_flow, planning_spacing, width) - + wipe_start_depth_offset(old_tool); + float wiping_depth = get_wipe_depth(wipe_volume - first_wipe_volume, layer_height, m_perimeter_width, m_extra_flow, planning_spacing, width); return WipeTowerInfo::ToolChange(old_tool, new_tool, ramming_depth + wiping_depth, ramming_depth, first_wipe_line, wipe_volume); } @@ -2444,8 +2454,7 @@ void WipeTower2::save_on_last_wipe() const bool first_layer_plan = size_t(m_layer_info - m_plan.begin()) == m_first_layer_idx; const float planning_spacing = first_layer_plan ? m_extra_flow : m_extra_spacing_wipe; - float depth_to_wipe = get_wipe_depth(volume_we_need_depth_for, m_layer_info->height, m_perimeter_width, m_extra_flow, planning_spacing, width) - + wipe_start_depth_offset(toolchange.old_tool); + float depth_to_wipe = get_wipe_depth(volume_we_need_depth_for, m_layer_info->height, m_perimeter_width, m_extra_flow, planning_spacing, width); toolchange.required_depth = toolchange.ramming_depth + depth_to_wipe; toolchange.wipe_volume = volume_left_to_wipe; diff --git a/src/libslic3r/GCode/WipeTower2.hpp b/src/libslic3r/GCode/WipeTower2.hpp index 627204ce28..e264497f5a 100644 --- a/src/libslic3r/GCode/WipeTower2.hpp +++ b/src/libslic3r/GCode/WipeTower2.hpp @@ -362,7 +362,8 @@ private: const WipeTower::box_coordinates &cleaning_box, float wipe_volume, bool interface_layer, - bool priming = false); + bool priming = false, + bool fill_box = false); Polygon generate_support_rib_wall(WipeTowerWriter2& writer, @@ -387,11 +388,6 @@ private: // Computes the depth reserved for a toolchange (shared by plan_toolchange() and the // rib-wall square-tower replanning in generate()). WipeTowerInfo::ToolChange set_toolchange(size_t old_tool, size_t new_tool, float layer_height, float wipe_volume, bool first_layer_plan); - - // Depth consumed before the first wipe row when no ramming is printed (the wipe - // still starts y_step/2 into the box, see toolchange_Unload()); 0 with ramming, - // whose planned rows already carry the slack for it. - float wipe_start_depth_offset(size_t old_tool) const; }; From 67e1ce03a601a67b630000ab85a7fc9aebcdf7b5 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Wed, 29 Jul 2026 18:48:10 +0800 Subject: [PATCH 014/106] Scrub the WipeTower2 toolchange entry with the BBL flat-ironing spiral The entry scrub now matches the BBL tower's toolchange_wipe_new sequence: after the ironing drag the retracted nozzle runs a dry expanding-square spiral centred on the wall-gap entry point before resuming the purge row. The spiral runs whenever the gap wall is on (disable per filament via filament_tower_ironing_area = 0); WipeTower2 no longer reads prime_tower_flat_ironing. --- src/libslic3r/GCode/WipeTower2.cpp | 25 ++++++++++--------------- src/libslic3r/GCode/WipeTower2.hpp | 1 - 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index 487a7d6c1c..c032a1f2c2 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -24,7 +24,6 @@ namespace Slic3r { -static constexpr float flat_iron_area = 4.f; constexpr float flat_iron_speed = 10.f * 60.f; static const double wipe_tower_wall_infill_overlap = 0.0; static constexpr double WIPE_TOWER_RESOLUTION = 0.1; @@ -1364,7 +1363,6 @@ WipeTower2::WipeTower2(const PrintConfig& config, const PrintRegionConfig& defau m_wall_type((int)config.wipe_tower_wall_type), // The cone wall has its own fully separate generator with no gap machinery. m_use_gap_wall(config.prime_tower_skip_points.value && config.wipe_tower_wall_type.value != wtwCone), - m_flat_ironing(config.prime_tower_flat_ironing.value), m_enable_tower_interface_features(config.enable_tower_interface_features.value), m_enable_tower_interface_cooldown_during_tower(config.enable_tower_interface_cooldown_during_tower.value) { @@ -2060,9 +2058,6 @@ void WipeTower2::toolchange_Wipe( m_left_to_right = !m_left_to_right; } - const bool do_ironing = m_flat_ironing && (!interface_layer || !m_enable_tower_interface_features); - const float ironing_area = m_filpar[m_current_tool].tower_ironing_area; - // now the wiping itself: for (int i = 0; true; ++i) { if (i!=0) { @@ -2075,10 +2070,12 @@ void WipeTower2::toolchange_Wipe( float traversed_x = writer.x(); // BBS gap wall: iron the first few mm of the purge, then drag the retracted nozzle - // back out through the wall gap so the toolchange start blob is not left on the wall. - // WT2's entry gap always sits at the left-edge entry point, so only iron when the - // purge actually starts there heading right (in-place toolchangers do; SEMM - // ram/cooling moves leave the nozzle mid-box, far from any gap). + // back out through the wall gap and scrub it with a dry spiral centred on the entry + // point so the toolchange start blob is not left on the wall (same sequence as the + // BBL tower's toolchange_wipe_new; the spiral self-disables when the filament's + // tower ironing area is 0). WT2's entry gap always sits at the left-edge entry + // point, so only iron when the purge actually starts there heading right (in-place + // toolchangers do; SEMM ram/cooling moves leave the nozzle mid-box, far from any gap). if (i == 0 && m_use_gap_wall && !interface_layer && !priming && m_left_to_right && writer.x() - xl < 2.5f * line_width) { float ironing_length = 3.f; @@ -2089,7 +2086,10 @@ void WipeTower2::toolchange_Wipe( writer.extrude(writer.x() + ironing_length, writer.y(), wipe_speed); writer.retract(retract_length, retract_speed); writer.travel(writer.x() - 1.5f * ironing_length, writer.y(), 600.f); - writer.travel(writer.x() + 1.5f * ironing_length, writer.y(), 240.f); + writer.travel(writer.x() + 0.5f * ironing_length, writer.y(), 240.f); + const Vec2f iron_end(writer.x() + ironing_length, writer.y()); + writer.spiral_flat_ironing(writer.pos(), m_filpar[m_current_tool].tower_ironing_area, m_perimeter_width, flat_iron_speed); + writer.travel(iron_end, wipe_speed); writer.retract(-retract_length, retract_speed); } @@ -2098,11 +2098,6 @@ void WipeTower2::toolchange_Wipe( else writer.extrude(xl + (i % 4 == 1 ? 0 : 1.5f*line_width), writer.y(), wipe_speed); - if (i == 0 && do_ironing && ironing_area > 0.f) { - writer.travel(writer.x(), writer.y(), 600.f); - writer.spiral_flat_ironing(writer.pos(), ironing_area, m_perimeter_width, 10.f * 60.f); - } - if (writer.y()+float(EPSILON) > cleaning_box.lu.y()-0.5f*line_width) break; // in case next line would not fit diff --git a/src/libslic3r/GCode/WipeTower2.hpp b/src/libslic3r/GCode/WipeTower2.hpp index e264497f5a..46af0e426e 100644 --- a/src/libslic3r/GCode/WipeTower2.hpp +++ b/src/libslic3r/GCode/WipeTower2.hpp @@ -221,7 +221,6 @@ private: float m_perimeter_speed = 0.f; float m_first_layer_speed = 0.f; size_t m_first_layer_idx = size_t(-1); - bool m_flat_ironing = false; bool m_enable_tower_interface_features = false; bool m_enable_tower_interface_cooldown_during_tower = false; bool m_prev_layer_had_interface = false; From 086bbf986be86fa612d0ca86b1672f1a25cdca6e Mon Sep 17 00:00:00 2001 From: SoftFever Date: Wed, 29 Jul 2026 19:59:33 +0800 Subject: [PATCH 015/106] Restart the WipeTower2 wipe at the box boundary after multitool ramming With the gap wall on a multi-tool printer, quantize the ram band up to its whole reserved rows (as the BBL tower does for the old-tool purge) and start CP TOOLCHANGE WIPE at the left-edge boundary on a fresh row below it instead of continuing from wherever the ram serpentine ended. The entry scrub then runs at the wall gap on ram toolchanges too, and the wipe box is whole rows, so it is filled completely like the no-ram case. SEMM and skip-points-off behavior is unchanged. --- src/libslic3r/GCode/WipeTower2.cpp | 69 +++++++++++++++++++++++++----- 1 file changed, 59 insertions(+), 10 deletions(-) diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index c032a1f2c2..b846302abb 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -1671,11 +1671,13 @@ WipeTower::ToolChangeResult WipeTower2::tool_change(size_t tool) // Ram the hot material out of the melt zone, retract the filament into the cooling tubes and let it cool. if (tool != (unsigned int)-1){ // This is not the last change. - // Without a ram the box was planned as whole wipe rows; the wipe then fills it - // completely so adjacent purge blocks stay contiguous. Uses the old tool - // (m_current_tool before toolchange_Change), same condition as - // toolchange_Unload()'s do_ramming. - const bool fill_box = !((m_semm && m_enable_filament_ramming) || m_filpar[m_current_tool].multitool_ramming); + // Without a ram — or with the boundary wipe start, where the ram band is + // quantized to whole rows — the box is planned as whole wipe rows; the wipe + // then fills it completely so adjacent purge blocks stay contiguous. Uses the + // old tool (m_current_tool before toolchange_Change), same conditions as + // toolchange_Unload()'s do_ramming / boundary_wipe_start. + const bool do_ram_old = (m_semm && m_enable_filament_ramming) || m_filpar[m_current_tool].multitool_ramming; + const bool fill_box = !do_ram_old || (!m_semm && m_use_gap_wall); auto new_tool_temp = is_first_layer() ? m_filpar[tool].first_layer_temperature : m_filpar[tool].temperature; toolchange_Unload(writer, cleaning_box, m_filpar[m_current_tool].material, (is_first_layer() ? m_filpar[m_current_tool].first_layer_temperature : m_filpar[m_current_tool].temperature), @@ -1756,6 +1758,12 @@ void WipeTower2::toolchange_Unload( // Orca: Do ramming when SEMM and ramming is enabled or when multi tool head when ramming is enabled on the multi tool. const bool do_ramming = (m_semm && m_enable_filament_ramming) || m_filpar[m_current_tool].multitool_ramming; const bool cold_ramming = m_is_mk4mmu3; + // Orca: see set_toolchange() — quantized ram band + wipe restart at the boundary. + const bool boundary_wipe_start = do_ramming && !m_semm && m_use_gap_wall; + float planned_ramming_depth = 0.f; + if (boundary_wipe_start && m_layer_info != m_plan.end()) + for (const auto& tch : m_layer_info->tool_changes) + if (tch.old_tool == m_current_tool) { planned_ramming_depth = tch.ramming_depth; break; } if (do_ramming) { writer.travel(ramming_start_pos); // move to starting position @@ -1768,7 +1776,8 @@ void WipeTower2::toolchange_Unload( writer.set_position(ramming_start_pos); // if the ending point of the ram would end up in mid air, align it with the end of the wipe tower: - if (do_ramming && (m_layer_info > m_plan.begin() && m_layer_info < m_plan.end() && (m_layer_info-1!=m_plan.begin() || !m_adhesion ))) { + // (with a boundary wipe start the band is quantized to whole rows below, so no phase alignment is needed) + if (do_ramming && !boundary_wipe_start && (m_layer_info > m_plan.begin() && m_layer_info < m_plan.end() && (m_layer_info-1!=m_plan.begin() || !m_adhesion ))) { // this is y of the center of previous sparse infill border float sparse_beginning_y = 0.f; @@ -1827,6 +1836,28 @@ void WipeTower2::toolchange_Unload( e_done = 0; } } + + // Orca: quantize the ram band up to the whole reserved rows (BBL quantizes the + // old-tool purge the same way) so no unprinted void is left between the band and + // the wipe restarting at the boundary below it. + if (planned_ramming_depth > 0.f) { + const int reserved_rows = std::max(1, int(std::round(planned_ramming_depth / y_step))); + const float last_row_y = ramming_start_pos.y() + (reserved_rows - 1) * y_step; + // Same bead model as the ramming segments above: E per mm of ram line. + const float e_per_mm = 1.f / (volume_to_length(1.f, line_width, m_layer_height) * filament_area()); + const float fill_feed = m_filpar[m_current_tool].ramming_speed.empty() ? 3000.f : + 60.f * volume_to_length(m_filpar[m_current_tool].ramming_speed.back(), line_width, m_layer_height); + while (true) { + const float target_x = m_left_to_right ? xr : xl; + if (std::abs(target_x - writer.x()) > WT_EPSILON) + writer.ram(writer.x(), target_x, 0.f, 0.f, e_per_mm * std::abs(target_x - writer.x()), fill_feed); + if (writer.y() + 0.5f * y_step > last_row_y) + break; + writer.travel(writer.x(), writer.y() + y_step, 7200); + m_left_to_right = !m_left_to_right; + } + } + Vec2f end_of_ramming(writer.x(),writer.y()); writer.change_analyzer_line_width(m_perimeter_width); // so the next lines are not affected by ramming_line_width_multiplier @@ -1934,7 +1965,18 @@ void WipeTower2::toolchange_Unload( // this is to align ramming and future wiping extrusions, so the future y-steps can be uniform from the start: // the perimeter_width will later be subtracted, it is there to not load while moving over just extruded material Vec2f pos = Vec2f(end_of_ramming.x(), end_of_ramming.y() + (y_step/m_extra_spacing_ramming-m_perimeter_width) / 2.f + m_perimeter_width); - if (do_ramming) + if (planned_ramming_depth > 0.f) { + // Orca: restart the wipe at the left-edge boundary on a fresh row below the + // quantized ram band so the entry scrub always runs at the wall gap (BBL keeps + // CP_TOOLCHANGE_WIPE starting at a box corner the same way). Same lattice + // formula as the no-ram branch below, offset by the ram band. + const float wipe_dy = (is_first_layer() ? m_extra_flow : m_extra_spacing_wipe) * m_perimeter_width; + const float wipe_line_width = m_perimeter_width * m_extra_flow; + writer.travel(Vec2f(ramming_start_pos.x(), + cleaning_box.ld.y() + m_depth_traversed + planned_ramming_depth + wipe_dy - (m_perimeter_width + wipe_line_width) / 2.f + m_perimeter_width), 2400.f); + m_left_to_right = true; + } + else if (do_ramming) writer.travel(pos, 2400.f); else { // Orca: with no ram printed there is no ramming geometry to align with. Start the @@ -2370,11 +2412,18 @@ WipeTower2::WipeTowerInfo::ToolChange WipeTower2::set_toolchange(size_t old_tool // (same condition as its do_ramming), otherwise the unprinted reservation // leaves blank bands between the purge boxes. const bool do_ramming = (m_semm && m_enable_filament_ramming) || m_filpar[old_tool].multitool_ramming; + // Orca: with the gap wall on a multi-tool printer the ram band is quantized up to + // the whole reserved rows and the wipe restarts at the left-edge boundary on a + // fresh row below it (BBL parity: the old-tool purge is whole rows and the wipe + // always starts at the box corner, where the entry scrub runs). SEMM keeps the + // stock continue-from-ram-end behavior. Must match toolchange_Unload()/tool_change(). + const bool boundary_wipe_start = do_ramming && !m_semm && m_use_gap_wall; float ramming_depth = do_ramming ? ((int(length_to_extrude / width) + 1) * (m_perimeter_width * m_filpar[old_tool].ramming_line_width_multiplicator * m_filpar[old_tool].ramming_step_multiplicator) * m_extra_spacing_ramming) : 0; // first_wipe_line rides for free on the last (partially used) ramming row, which - // is already covered by ramming_depth. Without ramming that row does not exist, - // so the whole wipe volume needs reserved wiping depth. - float first_wipe_line = do_ramming ? - (width*((length_to_extrude / width)-int(length_to_extrude / width)) - width) : 0.f; + // is already covered by ramming_depth. Without ramming that row does not exist + // (and with a boundary wipe start the ram band is quantized to whole rows), so + // the whole wipe volume needs reserved wiping depth. + float first_wipe_line = (do_ramming && !boundary_wipe_start) ? - (width*((length_to_extrude / width)-int(length_to_extrude / width)) - width) : 0.f; float first_wipe_volume = length_to_volume(first_wipe_line, m_perimeter_width * m_extra_flow, layer_height); From 6489b4cad3e4935f71369500c75b5763b423c1c3 Mon Sep 17 00:00:00 2001 From: Ian Bassi Date: Wed, 29 Jul 2026 09:23:35 -0300 Subject: [PATCH 016/106] Fix: Only one wall top surfaces (#14929) --- src/libslic3r/PerimeterGenerator.cpp | 300 +++++++++++++++++++++++--- src/libslic3r/PrintObject.cpp | 83 ++++--- src/slic3r/GUI/ConfigManipulation.cpp | 15 +- tests/fff_print/CMakeLists.txt | 1 + tests/fff_print/test_perimeters.cpp | 257 ++++++++++++++++++++++ 5 files changed, 583 insertions(+), 73 deletions(-) create mode 100644 tests/fff_print/test_perimeters.cpp diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 1c785c3184..ad4d615807 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -360,6 +360,14 @@ static ClipperLib_Z::Paths clip_extrusion(const ClipperLib_Z::Path& subject, con return clipped_paths; } +static double clipper_z_path_length(const ClipperLib_Z::Path &path) +{ + double len = 0.; + for (size_t i = 1; i < path.size(); ++ i) + len += (Vec2d(double(path[i].x()), double(path[i].y())) - Vec2d(double(path[i - 1].x()), double(path[i - 1].y()))).norm(); + return len; +} + struct PerimeterGeneratorArachneExtrusion { Arachne::ExtrusionLine* extrusion = nullptr; @@ -571,17 +579,156 @@ static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator& p return extrusion_coll; } -// ORCA: only_one_wall_top detects the top as "slice − upper", so a feature rising from the middle of a -// top surface becomes an enclosed hole that gets ringed with extra inner walls. Fill those holes back -// into the top. Only holes that are both covered by the upper layer (excludes bridges) and backed by -// solid material (excludes voids) are filled. -static ExPolygons fill_enclosed_top_feature_holes(const ExPolygons &top, const Polygons &covered_by_upper, const ExPolygons &solid) +// ORCA: only_one_wall_top acts on top surfaces, so without a top shell there is nothing for it to act on: zero top +// shell layers retype the top surfaces as internal, see LayerRegion::prepare_fill_surfaces(). A 0% top surface +// density does leave a top surface - just an unfilled one - so it does not disable the feature. +// ConfigManipulation::toggle_print_fff_options() hides the option under the same condition, so a profile that left +// it enabled does not act behind a hidden checkbox. +static bool has_top_shell_layers(const PrintRegionConfig &config) { - ExPolygons filled = top; - for (ExPolygon &ex : filled) - ex.holes.clear(); - const ExPolygons feature_holes = intersection_ex(intersection_ex(diff_ex(filled, top), covered_by_upper), solid); - return feature_holes.empty() ? top : union_ex(top, feature_holes); + return config.top_shell_layers.value > 0; +} + +// ORCA: only_one_wall_first_layer thins the first layer to a single wall, the bottom counterpart of the above and +// gated the same way: zero bottom shell layers retype the bottom surfaces as internal, so that wall would ring +// sparse infill on the bed. The bottom surface density plays no part - an unfilled bottom surface is still a bottom +// surface, exactly as for the top - and it cannot reach zero anyway, being capped at a 10% minimum. +static bool has_bottom_shell_layers(const PrintRegionConfig &config) +{ + return config.bottom_shell_layers.value > 0; +} + +// ORCA: the inner walls are only given up when a top fill takes their space, and it has to actually reach it - +// a 0% top surface density leaves no fill at all, and without top_surface_expansion the fill never grows over +// them. Either way the original generation is kept (re-onion the not-top region), which is what users of +// only_one_wall_top alone have always got. +static bool top_fill_replaces_inner_walls(const PrintRegionConfig &config) +{ + return has_top_shell_layers(config) && config.top_surface_density.value > 0 && config.top_surface_expansion.value > 0; +} + +// ORCA: only_one_wall_top - cheap per-vertex classification of a wall against the top surface. Only Partial +// needs the geometry clipped or measured; a segment crossing the top with no vertex inside is rare enough to ignore. +enum class TopOverlap { None, Partial, Full }; + +static bool point_over_top(const Point &p, const ExPolygons &top_region, const BoundingBox &top_region_bbox) +{ + if (! top_region_bbox.contains(p)) + return false; + for (const ExPolygon &ex : top_region) + if (ex.contains(p, false)) + return true; + return false; +} + +static TopOverlap classify_over_top(const Points &pts, const ExPolygons &top_region, const BoundingBox &top_region_bbox) +{ + size_t inside = 0; + for (const Point &p : pts) + if (point_over_top(p, top_region, top_region_bbox)) + ++ inside; + return inside == 0 ? TopOverlap::None : inside == pts.size() ? TopOverlap::Full : TopOverlap::Partial; +} + +static TopOverlap classify_over_top(const Arachne::ExtrusionLine &el, const ExPolygons &top_region, const BoundingBox &top_region_bbox) +{ + size_t inside = 0; + for (const Arachne::ExtrusionJunction &j : el.junctions) + if (point_over_top(j.p, top_region, top_region_bbox)) + ++ inside; + return inside == 0 ? TopOverlap::None : inside == el.junctions.size() ? TopOverlap::Full : TopOverlap::Partial; +} + +// ORCA: only_one_wall_top for Arachne - cut out of the already generated inner walls the parts running over the top +// surface, so geometry that continues upward keeps its walls. A wall too short over the top to be worth slitting open +// is left whole, its footprint reported in kept_over_top for the caller to withhold from the top fill. +static void clip_inner_walls_over_top(std::vector &inner_perimeters, const ExPolygons &top_region, coord_t perimeter_width, Polygons &kept_over_top) +{ + const BoundingBox top_region_bbox = get_extents(top_region).inflated(SCALED_EPSILON); + auto covered_by = [](const Arachne::ExtrusionLine &el) { + Polyline centerline; + centerline.points.reserve(el.junctions.size()); + coord_t width = 0; + for (const Arachne::ExtrusionJunction &j : el.junctions) { + centerline.points.emplace_back(j.p); + width = std::max(width, j.w); + } + return offset(centerline, float(width) / 2.f); + }; + // Pull the cut back by half a wall width: the clip severs the centerline, but the bead's rounded end + // extends half a width past its endpoint and would otherwise overlap the top fill. + ClipperLib_Z::Paths top_paths_z; + for (const Polygon &poly : to_polygons(offset_ex(top_region, float(perimeter_width) / 2.f))) { + top_paths_z.emplace_back(); + ClipperLib_Z::Path &out = top_paths_z.back(); + out.reserve(poly.points.size()); + for (const Point &pt : poly.points) + out.emplace_back(pt.x(), pt.y(), 0); + } + for (Arachne::VariableWidthLines &inner_perimeter : inner_perimeters) { + Arachne::VariableWidthLines kept; + kept.reserve(inner_perimeter.size()); + for (Arachne::ExtrusionLine &el : inner_perimeter) { + if (el.empty()) + continue; + const TopOverlap overlap = classify_over_top(el, top_region, top_region_bbox); + if (overlap == TopOverlap::None) { + kept.emplace_back(std::move(el)); + continue; + } + if (overlap == TopOverlap::Full) + continue; // the clip below would return nothing anyway + ClipperLib_Z::Path subject; + subject.reserve(el.size()); + for (const Arachne::ExtrusionJunction &j : el.junctions) + subject.emplace_back(j.p.x(), j.p.y(), j.w); + ClipperLib_Z::Paths pieces = clip_extrusion(subject, top_paths_z, ClipperLib_Z::ctDifference); + + // Clipper treats the subject as an open polyline, so it also cuts a closed loop at its (arbitrary) + // start vertex and may reverse pieces. Stitch pieces sharing an endpoint back together. + auto same_pt = [](const ClipperLib_Z::IntPoint &p, const ClipperLib_Z::IntPoint &q) { + return std::abs(p.x() - q.x()) <= SCALED_EPSILON && std::abs(p.y() - q.y()) <= SCALED_EPSILON; + }; + for (size_t i = 0; i < pieces.size(); ++ i) { + for (size_t j = i + 1; j < pieces.size();) { + ClipperLib_Z::Path &a = pieces[i]; + ClipperLib_Z::Path &b = pieces[j]; + if (same_pt(a.front(), b.front()) || same_pt(a.front(), b.back())) + std::reverse(a.begin(), a.end()); + if (same_pt(a.back(), b.back())) + std::reverse(b.begin(), b.end()); + if (same_pt(a.back(), b.front())) { + a.insert(a.end(), b.begin() + 1, b.end()); + pieces.erase(pieces.begin() + j); + j = i + 1; // the merged path has new endpoints, restart the scan + } else + ++ j; + } + } + + // If the clip removed next to nothing, keep the loop untouched instead of slitting it open. The + // half-width pull-back above already costs about one width per crossing, hence two widths. + double kept_length = 0.; + for (const ClipperLib_Z::Path &path : pieces) + kept_length += clipper_z_path_length(path); + if (clipper_z_path_length(subject) - kept_length < 2. * double(perimeter_width)) { + append(kept_over_top, covered_by(el)); + kept.emplace_back(std::move(el)); + continue; + } + + for (const ClipperLib_Z::Path &path : pieces) { + Arachne::ExtrusionLine clipped(el.inset_idx, el.is_odd); + clipped.junctions.reserve(path.size()); + for (const ClipperLib_Z::IntPoint &pt : path) + clipped.junctions.emplace_back(Point(pt.x(), pt.y()), coord_t(pt.z()), el.inset_idx); + // Discard tiny leftovers that would print as zits. + if (clipped.size() >= 2 && clipped.getLength() >= perimeter_width) + kept.emplace_back(std::move(clipped)); + } + } + inner_perimeter = std::move(kept); + } } void PerimeterGenerator::split_top_surfaces(const ExPolygons &orig_polygons, ExPolygons &top_fills, @@ -649,7 +796,6 @@ void PerimeterGenerator::split_top_surfaces(const ExPolygons &orig_polygons, ExP ExPolygons delete_bridge = diff_ex(orig_polygons, bridge_checker, ApplySafetyOffset::Yes); ExPolygons top_polygons = diff_ex(delete_bridge, upper_polygons_series_clipped, ApplySafetyOffset::Yes); - top_polygons = fill_enclosed_top_feature_holes(top_polygons, upper_polygons_series_clipped, orig_polygons); // get the not-top surface, from the "real top" but enlarged by external_infill_margin (and the // min_width_top_surface we removed a bit before) @@ -1234,6 +1380,11 @@ void PerimeterGenerator::process_classic() for (const Surface &surface : all_surfaces) surface_exp.push_back(surface.expolygon); std::vector surface_order = chain_expolygons(surface_exp); + // ORCA: neither one-wall option has a surface to act on without the shell behind it, see + // has_top_shell_layers() / has_bottom_shell_layers(). Gated here so every use below - including the + // topmost and first layers - sees the same answer. + const bool only_one_wall_top = this->config->only_one_wall_top && has_top_shell_layers(*this->config); + const bool only_one_wall_first_layer = this->config->only_one_wall_first_layer && has_bottom_shell_layers(*this->config); for (size_t order_idx = 0; order_idx < surface_order.size(); order_idx++) { const Surface &surface = all_surfaces[surface_order[order_idx]]; // detect how many perimeters must be generated for this island @@ -1241,16 +1392,23 @@ void PerimeterGenerator::process_classic() int sparse_infill_density = this->config->sparse_infill_density.value; if (this->config->alternate_extra_wall && this->layer_id % 2 == 1 && !m_spiral_vase && sparse_infill_density > 0) // add alternating extra wall loop_number++; - if (this->layer_id == object_config->raft_layers && this->config->only_one_wall_first_layer) + if (this->layer_id == object_config->raft_layers && only_one_wall_first_layer) loop_number = 0; // Set the topmost layer to be one wall - if (loop_number > 0 && config->only_one_wall_top && this->upper_slices == nullptr) + if (loop_number > 0 && only_one_wall_top && this->upper_slices == nullptr) loop_number = 0; ExPolygons last = union_ex(surface.expolygon.simplify_p(surface_simplify_resolution)); ExPolygons gaps; ExPolygons top_fills; ExPolygons fill_clip; + // ORCA: only_one_wall_top, all empty unless this island has a top surface on this layer. See the + // post-onion reduction below: the region to keep clear of inner walls, the space freed by the dropped + // walls (goes to infill, not left as a void) and the space held by the kept ones (withheld from the fill). + ExPolygons one_wall_top_region; + ExPolygons one_wall_top_reclaimed; + Polygons one_wall_top_kept_bands; + bool apply_one_wall_top = false; if (loop_number >= 0) { // In case no perimeters are to be generated, loop_number will equal to -1. std::vector contours(loop_number+1); // depth => loops @@ -1389,8 +1547,19 @@ void PerimeterGenerator::process_classic() //BBS: refer to superslicer //store surface for top infill if only_one_wall_top - if (i == 0 && i!=loop_number && config->only_one_wall_top && !surface.is_bridge() && this->upper_slices != NULL) { - this->split_top_surfaces(last, top_fills, last, fill_clip); + if (i == 0 && i!=loop_number && only_one_wall_top && !surface.is_bridge() && this->upper_slices != NULL) { + if (top_fill_replaces_inner_walls(*this->config)) { + // ORCA: take the top fill and the keep-out region but leave `last` as the real geometry, + // so the onion follows it and the walls over the top are reduced in one step below. + ExPolygons non_top_polygons; + this->split_top_surfaces(last, top_fills, non_top_polygons, fill_clip); + apply_one_wall_top = !top_fills.empty(); + if (apply_one_wall_top) + one_wall_top_region = diff_ex(last, non_top_polygons); + } else { + // Onion the not-top region only, so the remaining walls stop at the top boundary. + this->split_top_surfaces(last, top_fills, last, fill_clip); + } } if (i == loop_number && (! has_gap_fill || this->config->sparse_infill_density.value == 0)) { @@ -1400,6 +1569,46 @@ void PerimeterGenerator::process_classic() } } + // ORCA: only_one_wall_top reduction - drop the inner walls (depth > 0) running over the top surface and + // take that space back from the gaps, leaving the top with the outer wall and the top infill. Classic + // perimeters are closed loops, so a wall can only be kept or dropped whole; one that merely grazes the + // top (same tolerance as the Arachne clip) is kept and withheld from the top fill instead. + if (apply_one_wall_top) { + const BoundingBox top_region_bbox = get_extents(one_wall_top_region).inflated(SCALED_EPSILON); + const double grazing_tolerance = 2. * double(perimeter_width); + // The band a wall covers, taken around its centerline so the orientation of holes does not matter. + auto wall_band = [perimeter_spacing](const Polygon &poly) { + Polygon centerline = poly; + centerline.make_counter_clockwise(); + return diff(offset(centerline, float(perimeter_spacing) / 2.f), + offset(centerline, -float(perimeter_spacing) / 2.f)); + }; + Polygons dropped_wall_bands; + auto reduce_over_top = [&](PerimeterGeneratorLoops &loops) { + loops.erase(std::remove_if(loops.begin(), loops.end(), [&](const PerimeterGeneratorLoop &loop) { + const TopOverlap overlap = classify_over_top(loop.polygon.points, one_wall_top_region, top_region_bbox); + if (overlap == TopOverlap::None) + return false; + // Only a wall straddling the boundary is worth measuring; a wall wholly over the top goes. + if (overlap == TopOverlap::Partial && + total_length(intersection_pl(Polylines{ loop.polygon.split_at_first_point() }, one_wall_top_region)) < grazing_tolerance) { + append(one_wall_top_kept_bands, wall_band(loop.polygon)); + return false; + } + append(dropped_wall_bands, wall_band(loop.polygon)); + return true; + }), loops.end()); + }; + for (int d = 1; d <= loop_number; ++ d) { + reduce_over_top(contours[d]); + reduce_over_top(holes[d]); + } + if (! gaps.empty()) + gaps = diff_ex(gaps, one_wall_top_region); + if (! dropped_wall_bands.empty()) + one_wall_top_reclaimed = diff_ex(dropped_wall_bands, one_wall_top_region); + } + // nest loops: holes first for (int d = 0; d <= loop_number; ++ d) { PerimeterGeneratorLoops &holes_d = holes[d]; @@ -1634,7 +1843,10 @@ void PerimeterGenerator::process_classic() and use zigzag). */ //FIXME Vojtech: This grows by a rounded extrusion width, not by line spacing, // therefore it may cover the area, but no the volume. - last = diff_ex(last, gap_fill.polygons_covered_by_width(10.f)); + Polygons gap_fill_covered = gap_fill.polygons_covered_by_width(10.f); + last = diff_ex(last, gap_fill_covered); + if (! one_wall_top_reclaimed.empty()) + one_wall_top_reclaimed = diff_ex(one_wall_top_reclaimed, gap_fill_covered); this->gap_fill->append(std::move(gap_fill.entities)); } @@ -1679,9 +1891,15 @@ void PerimeterGenerator::process_classic() // append infill areas to fill_surfaces //if any top_fills, grow them by ext_perimeter_spacing/2 to have the real un-anchored fill ExPolygons top_infill_exp = intersection_ex(fill_clip, offset_ex(top_fills, double(ext_perimeter_spacing / 2))); + // ORCA: only_one_wall_top - route the top fill around the walls kept despite grazing the top. + if (!one_wall_top_kept_bands.empty()) + top_infill_exp = diff_ex(top_infill_exp, one_wall_top_kept_bands); if (!top_fills.empty()) { infill_exp = union_ex(infill_exp, offset_ex(top_infill_exp, double(top_infill_peri_overlap))); } + // ORCA: only_one_wall_top - what the top fill does not cover of the dropped walls goes to infill. + if (!one_wall_top_reclaimed.empty()) + infill_exp = union_ex(infill_exp, one_wall_top_reclaimed); this->fill_surfaces->append(infill_exp, stInternal); apply_extra_perimeters(infill_exp); @@ -1700,6 +1918,8 @@ void PerimeterGenerator::process_classic() double(-inset - infill_peri_overlap)); if (!top_fills.empty()) polyWithoutOverlap = union_ex(polyWithoutOverlap, top_infill_exp); + if (!one_wall_top_reclaimed.empty()) + polyWithoutOverlap = union_ex(polyWithoutOverlap, one_wall_top_reclaimed); this->fill_no_overlap->insert(this->fill_no_overlap->end(), polyWithoutOverlap.begin(), polyWithoutOverlap.end()); } @@ -2138,6 +2358,11 @@ void PerimeterGenerator::process_arachne() process_no_bridge(all_surfaces, perimeter_spacing, ext_perimeter_width); // BBS: don't simplify too much which influence arc fitting when export gcode if arc_fitting is enabled double surface_simplify_resolution = (print_config->enable_arc_fitting && !this->has_fuzzy_skin) ? 0.2 * m_scaled_resolution : m_scaled_resolution; + // ORCA: neither one-wall option has a surface to act on without the shell behind it, see + // has_top_shell_layers() / has_bottom_shell_layers(). Gated here so every use below - including the + // topmost and first layers - sees the same answer. + const bool only_one_wall_top = this->config->only_one_wall_top && has_top_shell_layers(*this->config); + const bool only_one_wall_first_layer = this->config->only_one_wall_first_layer && has_bottom_shell_layers(*this->config); // we need to process each island separately because we might have different // extra perimeters for each one for (const Surface& surface : all_surfaces) { @@ -2150,12 +2375,12 @@ void PerimeterGenerator::process_arachne() // Set the bottommost layer to be one wall const bool is_bottom_layer = (this->layer_id == object_config->raft_layers) ? true : false; - if (is_bottom_layer && this->config->only_one_wall_first_layer) + if (is_bottom_layer && only_one_wall_first_layer) loop_number = 0; // Orca: set the topmost layer to be one wall according to the config const bool is_topmost_layer = (this->upper_slices == nullptr) ? true : false; - if (is_topmost_layer && loop_number > 0 && config->only_one_wall_top) + if (is_topmost_layer && loop_number > 0 && only_one_wall_top) loop_number = 0; auto apply_precise_outer_wall = config->precise_outer_wall && config->wall_sequence == WallSequence::InnerOuter; @@ -2175,10 +2400,10 @@ void PerimeterGenerator::process_arachne() //PS: One wall top surface for Arachne ExPolygons top_expolygons; // Calculate how many inner loops remain when TopSurfaces is selected. - const int inner_loop_number = (config->only_one_wall_top && upper_slices != nullptr) ? loop_number - 1 : -1; + const int inner_loop_number = (only_one_wall_top && upper_slices != nullptr) ? loop_number - 1 : -1; // Set one perimeter when TopSurfaces is selected. - if (config->only_one_wall_top && loop_number > 0) + if (only_one_wall_top && loop_number > 0) loop_number = 0; Arachne::WallToolPathsParams input_params_tmp = input_params; @@ -2209,7 +2434,6 @@ void PerimeterGenerator::process_arachne() upper_slices_clipped = ClipperUtils::clip_clipper_polygons_with_subject_bbox(*upper_slices, infill_contour_bbox); top_expolygons = diff_ex(infill_contour, upper_slices_clipped); - top_expolygons = fill_enclosed_top_feature_holes(top_expolygons, upper_slices_clipped, infill_contour); if (!top_expolygons.empty()) { if (lower_slices != nullptr) { @@ -2230,25 +2454,33 @@ void PerimeterGenerator::process_arachne() // due to thin lines being generated top_expolygons = offset2_ex(top_expolygons, -top_surface_min_width, top_surface_min_width + float(perimeter_width * 0.85)); - // Get the not-top ExPolygons (including bridges) from current slices and expanded real top ExPolygons (without bridges). - const ExPolygons not_top_expolygons = diff_ex(infill_contour, top_expolygons); - - // Get final top ExPolygons. + // Get final top ExPolygons (bridges were excluded above, so they stay walled). top_expolygons = intersection_ex(top_expolygons, infill_contour); - const Polygons not_top_polygons = to_polygons(offset_ex(not_top_expolygons,wall_0_inset)); - Arachne::WallToolPaths inner_wall_tool_paths(not_top_polygons, perimeter_spacing, perimeter_spacing, coord_t(inner_loop_number + 1), 0, layer_height, input_params_tmp); + // ORCA: onion the real region (inside the outer wall) so the remaining walls follow the actual + // geometry, then cut away the parts over the top surface. Re-onioning the non-top complement + // instead - the fallback when there is no top fill - walls the top/non-top interface and rings + // top-surface islands with inner walls that don't exist when the feature is disabled. + const bool clip_walls_over_top = top_fill_replaces_inner_walls(*this->config); + const Polygons inner_region = to_polygons(offset_ex(clip_walls_over_top ? infill_contour + : diff_ex(infill_contour, top_expolygons), + wall_0_inset)); + Arachne::WallToolPaths inner_wall_tool_paths(inner_region, perimeter_spacing, perimeter_spacing, coord_t(inner_loop_number + 1), 0, layer_height, input_params_tmp); std::vector inner_perimeters = inner_wall_tool_paths.getToolPaths(); - // Recalculate indexes of inner perimeters before merging them. - if (!perimeters.empty()) { - for (Arachne::VariableWidthLines &inner_perimeter : inner_perimeters) { - if (inner_perimeter.empty()) - continue; + if (clip_walls_over_top) { + Polygons kept_over_top; + clip_inner_walls_over_top(inner_perimeters, top_expolygons, perimeter_width, kept_over_top); + // Route the top fill around the walls kept despite grazing the top. + if (! kept_over_top.empty()) + top_expolygons = diff_ex(top_expolygons, kept_over_top); + } + + // Recalculate indexes of inner perimeters before merging them: they come after the single outer wall. + if (!perimeters.empty()) + for (Arachne::VariableWidthLines &inner_perimeter : inner_perimeters) for (Arachne::ExtrusionLine &el : inner_perimeter) ++el.inset_idx; - } - } perimeters.insert(perimeters.end(), inner_perimeters.begin(), inner_perimeters.end()); infill_contour = union_ex(top_expolygons, inner_wall_tool_paths.getInnerContour()); diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 0d31f6c04c..0ef46fac92 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -1364,7 +1364,6 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "infill_combination_max_layer_height" || opt_key == "bottom_shell_thickness" || opt_key == "top_shell_thickness" - || opt_key == "top_surface_expansion" || opt_key == "top_surface_expansion_margin" || opt_key == "top_surface_expansion_direction" || opt_key == "minimum_sparse_infill_area" @@ -1400,7 +1399,6 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "infill_anchor" || opt_key == "infill_anchor_max" || opt_key == "top_surface_line_width" - || opt_key == "top_surface_density" || opt_key == "bottom_surface_density" || opt_key == "center_of_surface_pattern" || opt_key == "separated_infills" @@ -1434,6 +1432,24 @@ bool PrintObject::invalidate_state_by_config_options( is_approx(new_density->value, 0.) || is_approx(new_density->value, 100.)) steps.emplace_back(posPerimeters); steps.emplace_back(posPrepareInfill); + } else if (opt_key == "top_surface_density") { + // ORCA: 0% means no top solid fill, which switches off both the top surface expansion and the wall + // removal over top surfaces. Only crossing zero matters; posPerimeters cascades to posPrepareInfill. + const auto *old_density = old_config.option(opt_key); + const auto *new_density = new_config.option(opt_key); + assert(old_density && new_density); + if (is_approx(old_density->value, 0.) || is_approx(new_density->value, 0.)) + steps.emplace_back(posPerimeters); + steps.emplace_back(posInfill); + } else if (opt_key == "top_surface_expansion") { + // ORCA: without the expansion the top fill never reaches the space freed by only_one_wall_top, so the + // walls over top surfaces are kept. Only crossing zero matters; posPerimeters cascades to posPrepareInfill. + const auto *old_expansion = old_config.option(opt_key); + const auto *new_expansion = new_config.option(opt_key); + assert(old_expansion && new_expansion); + if (old_expansion->value <= 0. || new_expansion->value <= 0.) + steps.emplace_back(posPerimeters); + steps.emplace_back(posPrepareInfill); } else if (opt_key == "internal_solid_infill_line_width") { // This value is used for calculating perimeter - infill overlap, thus perimeters need to be recalculated. steps.emplace_back(posPerimeters); @@ -1760,51 +1776,50 @@ void PrintObject::detect_surfaces_type() } } - // ORCA: Expand the top surfaces outward by top_surface_expansion in every direction. This - // enlarges the top solid infill and, in particular, grows it over the covered material left - // by features rising from the middle of a top surface (filling holes and joining tops so the - // features rest on it). The expansion stays inside the section it belongs to: each connected - // solid island has its own outer wall, so the top is grown within each island separately and - // clipped to it - growing one island's top across the gap into another island (which may have - // no top surface, leaving a partially filled layer) is never allowed. The top infill sits - // inside the perimeters, so the margin is measured from the walls: the island is inset by the - // band the walls consume (outer wall + inner walls) plus the configured margin, making that - // value the real clearance between the expanded top and the walls (avoiding a hull line). The - // original top is unioned back in, so where it already sits within that band it is kept as-is. - // Never claims a bottom surface. - const double top_expansion = layerm->region().config().top_surface_expansion.value; - if (top_expansion > 0. && ! top.empty()) { - const double d = scale_(top_expansion); - const auto jt = Clipper2Lib::JoinType::Miter; - const ExPolygons T = union_ex(to_expolygons(top)); - const int wall_loops = layerm->region().config().wall_loops.value; + // ORCA: Grow the top surfaces by top_surface_expansion, so the top solid infill also covers the + // material left by features rising from the middle of a top surface (filling the holes and + // joining the tops, so the features rest on solid infill). Each connected island is grown and + // clipped separately: growing one island's top across a gap into another - which may have no top + // surface at all, leaving a partially filled layer - is never allowed. The original top is + // unioned back in and bottom surfaces are never claimed, so this can only add area. + const PrintRegionConfig ®ion_config = layerm->region().config(); + const double top_expansion = region_config.top_surface_expansion.value; + // Nothing to expand without a top fill: a 0% top surface density leaves the top layer with + // walls only, and zero top shell layers retypes it as internal in prepare_fill_surfaces(). + if (top_expansion > 0. && region_config.top_shell_layers.value > 0 && + region_config.top_surface_density.value > 0. && ! top.empty()) { + const double d = scale_(top_expansion); + const ExPolygons T = union_ex(to_expolygons(top)); + // Walls are laid out on spacing, not width; and only_one_wall_top leaves a single wall over + // a top surface, which is exactly the situation handled here. + const int wall_loops = region_config.only_one_wall_top.value ? std::min(region_config.wall_loops.value, 1) + : region_config.wall_loops.value; const double wall_band = wall_loops <= 0 ? 0. : double(layerm->flow(frExternalPerimeter).scaled_width()) + - double(layerm->flow(frPerimeter).scaled_width()) * double(wall_loops - 1); - const double margin = scale_(layerm->region().config().top_surface_expansion_margin.value); + double(layerm->flow(frPerimeter).scaled_spacing()) * double(wall_loops - 1); + const double margin = scale_(region_config.top_surface_expansion_margin.value); // minimum real top to act on: ignore anything thinner than ~2 top-infill lines const float min_top = float(layerm->flow(frTopSolidInfill).scaled_width()); - const auto direction = layerm->region().config().top_surface_expansion_direction.value; + const auto direction = region_config.top_surface_expansion_direction.value; ExPolygons grown; for (const ExPolygon &island : union_ex(layerm_slices_surfaces)) { // The top infill only exists inside the perimeters, so seed and measure from the infill - // region (the island minus the wall band), not the raw slice. A section whose only - // exposed top lies in the wall band - i.e. a layer where the top is just the walls - // themselves - has no infill here and is skipped, instead of being flooded inward by - // the expansion. Thin slivers inside the infill region are dropped by the opening too. + // region (the island minus the wall band), not the raw slice: a section whose exposed top + // is just the walls themselves is then skipped instead of being flooded inward. Clip the + // layer's tops to the island first, to keep the boolean ops proportional to the island. const ExPolygons infill_region = wall_band > 0. ? offset_ex(island, -float(wall_band)) : ExPolygons{ island }; - const ExPolygons island_top = intersection_ex(T, infill_region); + const ExPolygons island_top = intersection_ex( + ClipperUtils::clip_clipper_polygons_with_subject_bbox(T, get_extents(island).inflated(SCALED_EPSILON)), + infill_region); if (opening_ex(island_top, min_top).empty()) continue; // no real top infill in this section - never expand into it - // grow by d, then keep only the part allowed by the configured direction: inward fills - // the holes/gaps left by features (clip the growth back to the top's own filled outline, - // which leaves the outer edge fixed), outward grows the outer edge toward the walls (drop - // the growth that fell into the original holes), and inward+outward keeps both. - ExPolygons expanded = offset_ex_2(island_top, d, jt); + // Grow, then keep only what the configured direction allows, using the top's own filled + // outline (same outer edge, holes closed) to tell the two apart. + ExPolygons expanded = offset_ex_2(island_top, d, Clipper2Lib::JoinType::Miter); if (direction != TopSurfaceExpansionDirection::InwardAndOutward) { - ExPolygons outline; // the top with its holes filled (same outer edge) + ExPolygons outline; outline.reserve(island_top.size()); for (const ExPolygon &ex : island_top) outline.emplace_back(ex.contour); diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 57f25eba24..c2643b5d0f 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -703,12 +703,13 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, in toggle_line("spiral_mode_max_xy_smoothing", has_spiral_vase && config->opt_bool("spiral_mode_smooth")); toggle_line("spiral_starting_flow_ratio", has_spiral_vase); toggle_line("spiral_finishing_flow_ratio", has_spiral_vase); - bool has_top_shell = config->opt_int("top_shell_layers") > 0 || (has_spiral_vase && config->opt_int("bottom_shell_layers") > 1); + bool has_top_shell_layers = config->opt_int("top_shell_layers") > 0 || (has_spiral_vase && config->opt_int("bottom_shell_layers") > 1); + bool has_top_shell = has_top_shell_layers && config->option("top_surface_density")->value > 0; bool has_bottom_shell = config->opt_int("bottom_shell_layers") > 0; - bool has_solid_infill = has_top_shell || has_bottom_shell; + bool has_solid_infill = has_top_shell_layers || has_bottom_shell; toggle_field("top_surface_pattern", has_top_shell); toggle_field("bottom_surface_pattern", has_bottom_shell); - toggle_field("top_surface_density", has_top_shell); + toggle_field("top_surface_density", has_top_shell_layers); toggle_field("bottom_surface_density", has_bottom_shell); toggle_field("top_layer_direction", has_top_shell); toggle_field("bottom_layer_direction", has_bottom_shell); @@ -751,7 +752,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, in for (auto el : { "sparse_infill_speed", "bridge_speed", "internal_bridge_speed"}) toggle_field(el, have_infill || has_solid_infill, variant_index); - toggle_field("top_shell_thickness", ! has_spiral_vase && has_top_shell); + toggle_field("top_shell_thickness", ! has_spiral_vase && has_top_shell_layers); toggle_field("bottom_shell_thickness", ! has_spiral_vase && has_bottom_shell); // Gap fill is newly allowed in between perimeter lines even for empty infill (see GH #1476). @@ -1008,7 +1009,11 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, in toggle_line("make_overhang_printable_angle", have_make_overhang_printable); toggle_line("make_overhang_printable_hole_size", have_make_overhang_printable); - toggle_line("min_width_top_surface", config->opt_bool("only_one_wall_top") || ((config->opt_float("min_length_factor") > 0.5f) && have_arachne)); // 0.5 is default value + // Orca: the one-wall options act on top/bottom surfaces, which exist only with a shell. An unfilled surface + // (0% surface density) is still a surface, so these are gated on the layer counts alone. + toggle_line("only_one_wall_first_layer", has_bottom_shell); + toggle_line("only_one_wall_top", has_top_shell_layers); + toggle_line("min_width_top_surface", (has_top_shell_layers && config->opt_bool("only_one_wall_top")) || ((config->opt_float("min_length_factor") > 0.5f) && have_arachne)); // 0.5 is default value for (auto el : { "hole_to_polyhole_threshold", "hole_to_polyhole_twisted", "hole_to_polyhole_max_edges" }) toggle_line(el, config->opt_bool("hole_to_polyhole")); diff --git a/tests/fff_print/CMakeLists.txt b/tests/fff_print/CMakeLists.txt index abddfebe5e..70ab639faa 100644 --- a/tests/fff_print/CMakeLists.txt +++ b/tests/fff_print/CMakeLists.txt @@ -11,6 +11,7 @@ add_executable(${_TEST_NAME}_tests test_gcodewriter.cpp test_model.cpp test_multifilament.cpp + test_perimeters.cpp test_print.cpp test_printobject.cpp test_skirt_brim.cpp diff --git a/tests/fff_print/test_perimeters.cpp b/tests/fff_print/test_perimeters.cpp new file mode 100644 index 0000000000..a98877ad2f --- /dev/null +++ b/tests/fff_print/test_perimeters.cpp @@ -0,0 +1,257 @@ +#include + +#include "libslic3r/ExtrusionEntity.hpp" +#include "libslic3r/ExtrusionEntityCollection.hpp" +#include "libslic3r/Layer.hpp" +#include "libslic3r/Print.hpp" + +#include +#include +#include + +#include "test_helpers.hpp" + +using namespace Slic3r; +using namespace Slic3r::Test; + +namespace { + +// The layer at this Z is the last one of the base, so its top surface is the ledge. +const double ledge_z = 5.0; + +// The first layer, at initial_layer_print_height. +const double first_layer_z = 0.2; + +// TestMesh::step scaled 3x in X/Y: a 60x60x5 base carrying a 54x54 column up to z=10, leaving a 3mm +// top ledge around a feature that keeps rising. That is the geometry both only_one_wall_top and the +// top surface expansion act on. The ledge has to stay wider than the wall band plus two top-infill +// lines, or the expansion discards it as a sliver and the tests below assert nothing. +TriangleMesh step_with_ledge() +{ + TriangleMesh m = Slic3r::Test::mesh(TestMesh::step); + m.scale(Vec3f(3.f, 3.f, 1.f)); + return m; +} + +// Every setting the assertions depend on, so none of them rests on a default. +DynamicPrintConfig base_config(const char *wall_generator) +{ + DynamicPrintConfig config = DynamicPrintConfig::full_print_config(); + config.set_deserialize_strict({ + { "wall_generator", wall_generator }, + { "layer_height", 0.2 }, // puts a layer boundary exactly on ledge_z + { "initial_layer_print_height", 0.2 }, + { "wall_loops", 3 }, + { "sparse_infill_density", "15%" }, + { "top_shell_layers", 3 }, + { "bottom_shell_layers", 3 }, + { "top_surface_density", "100%" }, + { "top_surface_expansion", 0.0 }, + { "only_one_wall_top", false }, + { "only_one_wall_first_layer", false }, + // Do not let the one-wall threshold discard the 3mm ledge before the feature sees it. + { "min_width_top_surface", 0.0 }, + }); + return config; +} + +double collection_length(const ExtrusionEntityCollection &coll) +{ + double len = 0.; + for (const ExtrusionEntity *entity : coll.flatten().entities) + if (! entity->is_collection()) + len += entity->length(); + return len; +} + +// Extruded length per layer. Two slices are compared through this rather than through their G-code, +// because the G-code carries a config block that differs whenever any setting differs. +struct SliceLengths { + std::vector perimeters; + std::vector fills; +}; + +SliceLengths slice_lengths(const Print &print) +{ + SliceLengths out; + for (const Layer *layer : print.objects().front()->layers()) { + double perimeters = 0., fills = 0.; + for (const LayerRegion *region : layer->regions()) { + perimeters += collection_length(region->perimeters); + fills += collection_length(region->fills); + } + out.perimeters.push_back(perimeters); + out.fills.push_back(fills); + } + return out; +} + +double perimeter_length_at(const Print &print, double print_z) +{ + for (const Layer *layer : print.objects().front()->layers()) + if (std::abs(layer->print_z - print_z) < 1e-4) { + double len = 0.; + for (const LayerRegion *region : layer->regions()) + len += collection_length(region->perimeters); + return len; + } + return 0.; +} + +// Largest per-layer difference between two series; a negative result means they are not comparable. +double max_difference(const std::vector &a, const std::vector &b) +{ + if (a.size() != b.size() || a.empty()) + return -1.; + double worst = 0.; + for (size_t i = 0; i < a.size(); ++ i) + worst = std::max(worst, std::abs(a[i] - b[i])); + return worst; +} + +} // namespace + +// The expansion only retypes area as top solid infill, so it can do nothing where there is no top +// fill to begin with: zero top shell layers retypes the top surfaces as internal, and a top surface +// density of 0% leaves the top layer with walls only. The last section is the control - the same +// expansion on the same model does change the slice once a top fill exists - without which the two +// equality checks above it would hold for an unrelated reason. +TEST_CASE("Top surface expansion only acts where there is a top fill", "[Perimeters]") +{ + const char *wall_generator = GENERATE("classic", "arachne"); + CAPTURE(wall_generator); + + auto lengths_for = [wall_generator](int top_shell_layers, const char *top_surface_density, double expansion) { + DynamicPrintConfig config = base_config(wall_generator); + config.set_deserialize_strict({ + { "top_shell_layers", top_shell_layers }, + { "top_surface_density", top_surface_density }, + { "top_surface_expansion", expansion }, + }); + Print print; + init_and_process_print({ step_with_ledge() }, print, config); + REQUIRE_FALSE(print.objects().empty()); + return slice_lengths(print); + }; + + SECTION("no top shell layers") { + const SliceLengths off = lengths_for(0, "100%", 0.0); + const SliceLengths on = lengths_for(0, "100%", 2.0); + REQUIRE(off.perimeters.size() == on.perimeters.size()); + CHECK_THAT(max_difference(off.perimeters, on.perimeters), Catch::Matchers::WithinAbs(0., 1.0)); + CHECK_THAT(max_difference(off.fills, on.fills), Catch::Matchers::WithinAbs(0., 1.0)); + } + + SECTION("zero top surface density") { + const SliceLengths off = lengths_for(3, "0%", 0.0); + const SliceLengths on = lengths_for(3, "0%", 2.0); + REQUIRE(off.perimeters.size() == on.perimeters.size()); + CHECK_THAT(max_difference(off.perimeters, on.perimeters), Catch::Matchers::WithinAbs(0., 1.0)); + CHECK_THAT(max_difference(off.fills, on.fills), Catch::Matchers::WithinAbs(0., 1.0)); + } + + SECTION("with a top fill the same expansion does change the slice") { + const SliceLengths off = lengths_for(3, "100%", 0.0); + const SliceLengths on = lengths_for(3, "100%", 2.0); + REQUIRE(off.fills.size() == on.fills.size()); + CHECK(max_difference(off.fills, on.fills) > scale_(0.5)); + } +} + +// With no top shell the top surfaces are retyped as internal, so the top surface density has nothing +// left to control: there is no top fill, and only_one_wall_top - the one route from the density to the +// perimeters - is itself switched off for want of a top surface to act on. +TEST_CASE("Top surface density does not affect a slice without a top shell", "[Perimeters]") +{ + const char *wall_generator = GENERATE("classic", "arachne"); + CAPTURE(wall_generator); + + auto lengths_for = [wall_generator](const char *top_surface_density) { + DynamicPrintConfig config = base_config(wall_generator); + config.set_deserialize_strict({ + { "top_shell_layers", 0 }, + { "only_one_wall_top", true }, + { "top_surface_density", top_surface_density }, + }); + Print print; + init_and_process_print({ step_with_ledge() }, print, config); + REQUIRE_FALSE(print.objects().empty()); + return slice_lengths(print); + }; + + const SliceLengths solid = lengths_for("100%"); + const SliceLengths none = lengths_for("0%"); + REQUIRE(solid.perimeters.size() == none.perimeters.size()); + CHECK_THAT(max_difference(solid.perimeters, none.perimeters), Catch::Matchers::WithinAbs(0., 1.0)); + CHECK_THAT(max_difference(solid.fills, none.fills), Catch::Matchers::WithinAbs(0., 1.0)); +} + +// On the ledge layer the inner walls are given up to the top fill, so that layer loses wall length. +// The handover needs a top fill that reaches the freed space: at a top surface density of 0% there is +// no top fill at all, and without top_surface_expansion the fill never grows over the walls. Either +// way the feature still runs, through the original generation, which keeps the inner walls up to the +// top boundary - putting that layer back between the plain and the one-wall slice. +TEST_CASE("Only one wall on top surfaces drops inner walls only where a top fill replaces them", "[Perimeters]") +{ + const char *wall_generator = GENERATE("classic", "arachne"); + CAPTURE(wall_generator); + + auto ledge_perimeters_for = [wall_generator](bool only_one_wall_top, const char *top_surface_density, double expansion) { + DynamicPrintConfig config = base_config(wall_generator); + config.set_deserialize_strict({ + { "only_one_wall_top", only_one_wall_top }, + { "top_surface_density", top_surface_density }, + { "top_surface_expansion", expansion }, + }); + Print print; + init_and_process_print({ step_with_ledge() }, print, config); + REQUIRE_FALSE(print.objects().empty()); + return perimeter_length_at(print, ledge_z); + }; + + const double plain = ledge_perimeters_for(false, "100%", 2.0); + const double one_wall = ledge_perimeters_for(true, "100%", 2.0); + const double one_wall_no_fill = ledge_perimeters_for(true, "0%", 2.0); + const double one_wall_no_expand = ledge_perimeters_for(true, "100%", 0.0); + + REQUIRE(plain > 0.); + CHECK(one_wall < plain); + // Both fall back to the original generation, which cuts the walls back to the top boundary but not past it. + CHECK(one_wall_no_fill > one_wall); + CHECK(one_wall_no_fill < plain); + CHECK(one_wall_no_expand > one_wall); + CHECK(one_wall_no_expand < plain); +} + +// The bottom counterpart: the first layer is thinned to a single wall only where a bottom shell fills the +// space behind it. With no bottom shell layers the bottom surfaces are retyped as internal, so that wall +// would ring sparse infill on the bed - the option is switched off instead, and the GUI hides it in that +// state so a profile that left it enabled cannot act behind a hidden checkbox. +TEST_CASE("Only one wall on the first layer needs a bottom shell", "[Perimeters]") +{ + const char *wall_generator = GENERATE("classic", "arachne"); + CAPTURE(wall_generator); + + auto first_layer_perimeters_for = [wall_generator](bool only_one_wall_first_layer, int bottom_shell_layers) { + DynamicPrintConfig config = base_config(wall_generator); + config.set_deserialize_strict({ + { "only_one_wall_first_layer", only_one_wall_first_layer }, + { "bottom_shell_layers", bottom_shell_layers }, + }); + Print print; + init_and_process_print({ step_with_ledge() }, print, config); + REQUIRE_FALSE(print.objects().empty()); + return perimeter_length_at(print, first_layer_z); + }; + + const double plain = first_layer_perimeters_for(false, 3); + const double one_wall = first_layer_perimeters_for(true, 3); + // Both at zero bottom shell layers, so everything else that setting changes cancels out between them. + const double plain_no_shell = first_layer_perimeters_for(false, 0); + const double one_wall_no_shell = first_layer_perimeters_for(true, 0); + + REQUIRE(plain > 0.); + CHECK(one_wall < plain); + // No bottom shell: the option is inert, down to the same walls an unchecked box gives. + CHECK_THAT(one_wall_no_shell, Catch::Matchers::WithinAbs(plain_no_shell, 1.0)); +} From 252df70ec47761a3cab7486ef058c45c7a88c501 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Wed, 29 Jul 2026 20:58:21 +0800 Subject: [PATCH 017/106] Move the WipeTower2 wall gap to the wipe start row for ram toolchanges --- src/libslic3r/GCode/WipeTower2.cpp | 26 +++++++++++++++++++++----- src/libslic3r/GCode/WipeTower2.hpp | 9 +++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index b846302abb..7f51d92466 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -1616,8 +1616,9 @@ WipeTower::ToolChangeResult WipeTower2::tool_change(size_t tool) float wipe_area = 0.f; float wipe_volume = 0.f; + float ramming_depth = 0.f; bool interface_layer = m_enable_tower_interface_features && m_current_layer_has_interface; - + // Finds this toolchange info if (tool != (unsigned int)(-1)) { @@ -1625,6 +1626,7 @@ WipeTower::ToolChangeResult WipeTower2::tool_change(size_t tool) if ( b.new_tool == tool ) { wipe_volume = b.wipe_volume; wipe_area = b.required_depth; + ramming_depth = b.ramming_depth; break; } } @@ -1663,6 +1665,12 @@ WipeTower::ToolChangeResult WipeTower2::tool_change(size_t tool) writer.speed_override(100); Vec2f initial_position = cleaning_box.ld + Vec2f(0.f, m_depth_traversed); + // With a boundary wipe start the wall gap sits at the first wipe row below the + // quantized ram band; enter there too so the routed entry, the gap and the wipe + // scrub all share one opening. toolchange_Unload() climbs back up to the ram band + // along the box interior. + if (!m_semm && m_use_gap_wall && ramming_depth > 0.f) + initial_position.y() += wipe_start_offset_after_ram(ramming_depth, is_first_layer()); writer.set_initial_position(initial_position, m_wipe_tower_width, m_wipe_tower_depth, m_internal_rotation); // Increase the extruder driver current to allow fast ramming. @@ -1766,6 +1774,10 @@ void WipeTower2::toolchange_Unload( if (tch.old_tool == m_current_tool) { planned_ramming_depth = tch.ramming_depth; break; } if (do_ramming) { + if (boundary_wipe_start) + // The entry sits at the wall gap on the first wipe row past the reserved + // ram band; step inward first, then move to the band clear of the wall. + writer.travel(Vec2f(ramming_start_pos.x(), writer.y())); writer.travel(ramming_start_pos); // move to starting position if (! m_is_mk4mmu3) writer.disable_linear_advance(); @@ -1970,10 +1982,9 @@ void WipeTower2::toolchange_Unload( // quantized ram band so the entry scrub always runs at the wall gap (BBL keeps // CP_TOOLCHANGE_WIPE starting at a box corner the same way). Same lattice // formula as the no-ram branch below, offset by the ram band. - const float wipe_dy = (is_first_layer() ? m_extra_flow : m_extra_spacing_wipe) * m_perimeter_width; - const float wipe_line_width = m_perimeter_width * m_extra_flow; writer.travel(Vec2f(ramming_start_pos.x(), - cleaning_box.ld.y() + m_depth_traversed + planned_ramming_depth + wipe_dy - (m_perimeter_width + wipe_line_width) / 2.f + m_perimeter_width), 2400.f); + cleaning_box.ld.y() + m_depth_traversed + + wipe_start_offset_after_ram(planned_ramming_depth, is_first_layer()) + m_perimeter_width), 2400.f); m_left_to_right = true; } else if (do_ramming) @@ -2584,13 +2595,18 @@ static WipeTower::ToolChangeResult merge_tcr(WipeTower::ToolChangeResult& first, // starts: cleaning_box.ld + (0, m_depth_traversed), with m_depth_traversed advancing by // required_depth per toolchange — reproduced here from the finalized plan so each gap // coincides with the entry travel's target (tcr.start_pos, pre-rotation frame). +// With a boundary wipe start the entry, the wipe and its scrub sit on the first wipe row +// below the quantized ram band, so the gap moves there with them (BBL cuts its gap at the +// CP_TOOLCHANGE_WIPE start row too, never at the ram band). void WipeTower2::compute_wall_skip_points() { m_wall_skip_points.assign(m_plan.size(), std::vector()); for (size_t layer_id = 0; layer_id < m_plan.size(); ++layer_id) { float depth_traversed = 0.f; for (const auto& toolchange : m_plan[layer_id].tool_changes) { - m_wall_skip_points[layer_id].emplace_back(m_perimeter_width / 2.f, m_perimeter_width / 2.f + depth_traversed); + const float ram_offset = (!m_semm && toolchange.ramming_depth > 0.f) ? + wipe_start_offset_after_ram(toolchange.ramming_depth, layer_id == m_first_layer_idx) : 0.f; + m_wall_skip_points[layer_id].emplace_back(m_perimeter_width / 2.f, m_perimeter_width / 2.f + depth_traversed + ram_offset); depth_traversed += toolchange.required_depth; } } diff --git a/src/libslic3r/GCode/WipeTower2.hpp b/src/libslic3r/GCode/WipeTower2.hpp index 46af0e426e..439515cdd4 100644 --- a/src/libslic3r/GCode/WipeTower2.hpp +++ b/src/libslic3r/GCode/WipeTower2.hpp @@ -284,6 +284,15 @@ private: bool is_first_layer() const { return size_t(m_layer_info - m_plan.begin()) == m_first_layer_idx; } + // With a boundary wipe start (multitool ram, non-SEMM, gap wall) the wipe begins on a + // fresh row below the quantized ram band. Y offset from the box start to that first + // wipe row; must stay in sync with the alignment travel in toolchange_Unload(). + float wipe_start_offset_after_ram(float ramming_depth, bool first_layer) const + { + const float wipe_dy = (first_layer ? m_extra_flow : m_extra_spacing_wipe) * m_perimeter_width; + return ramming_depth + wipe_dy - (m_perimeter_width + m_perimeter_width * m_extra_flow) / 2.f; + } + // Calculates extrusion flow needed to produce required line width for given layer height float extrusion_flow(float layer_height = -1.f) const // negative layer_height - return current m_extrusion_flow { From 7bd53b128393818ce68d4d1bc5c0327a91b42137 Mon Sep 17 00:00:00 2001 From: yw4z Date: Wed, 29 Jul 2026 16:19:10 +0300 Subject: [PATCH 018/106] Fix cannot type values to spin control if first digit of desired value is less then min value (#15002) --- src/slic3r/GUI/Field.cpp | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index bcbc381eff..1fcaef1b52 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -1334,27 +1334,7 @@ void SpinCtrl::BUILD() { if (!parsed || value < INT_MIN || value > INT_MAX) tmp_value = UNDEF_VALUE; else { - tmp_value = std::min(std::max((int)value, temp->GetMin()), temp->GetMax()); -#ifdef __WXOSX__ -#ifdef UNDEFINED__WXOSX__ // BBS - // Forcibly set the input value for SpinControl, since the value - // inserted from the keyboard or clipboard is not updated under OSX - SpinInput* spin = static_cast(window); - spin->SetValue(tmp_value); - // But in SetValue() is executed m_text_ctrl->SelectAll(), so - // discard this selection and set insertion point to the end of string - // temp->GetText()->SetInsertionPointEnd(); -#endif -#else - // update value for the control only if it was changed in respect to the Min/max values - if (tmp_value != (int)value) { - temp->SetValue(tmp_value); - // But after SetValue() cursor ison the first position - // so put it to the end of string - // int pos = std::to_string(tmp_value).length(); - // temp->SetSelection(pos, pos); - } -#endif + tmp_value = (int)value; } }), temp->GetTextCtrl()->GetId()); @@ -1375,6 +1355,10 @@ void SpinCtrl::propagate_value() on_kill_focus(); } else { auto ctrl = dynamic_cast(window); + tmp_value = std::min(std::max(tmp_value, ctrl->GetMin()), ctrl->GetMax()); + if (ctrl->GetValue() != tmp_value) + ctrl->SetValue(tmp_value); // Clamp now when the user is done typing (kill focus / Enter / spin arrows) + if (m_value.empty() ? !ctrl->GetTextCtrl()->GetLabel().IsEmpty() : ctrl->GetValue() != boost::any_cast(m_value)) From d434e35488d63d9059b38f479cda0e8db50d4980 Mon Sep 17 00:00:00 2001 From: Nathan Schulte <8540239+nmschulte@users.noreply.github.com> Date: Wed, 29 Jul 2026 08:48:01 -0500 Subject: [PATCH 019/106] fix STEP progress message percent format (#14994) --- src/libslic3r/Format/STEP.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/Format/STEP.hpp b/src/libslic3r/Format/STEP.hpp index 1a65d5956b..336fd79766 100644 --- a/src/libslic3r/Format/STEP.hpp +++ b/src/libslic3r/Format/STEP.hpp @@ -78,7 +78,7 @@ public: Standard_Boolean UserBreak() override { return should_stop.load(); } void Show(const Message_ProgressScope&, const Standard_Boolean) override { - std::cout << "Progress: " << GetPosition() << "%" << std::endl; + std::cout << "Progress: " << std::fixed << std::setprecision(2) << 100.0 * GetPosition() << "%" << std::endl; } private: std::atomic& should_stop; From 88632710d5e848c2ad6a020d4736d53fce293059 Mon Sep 17 00:00:00 2001 From: Bartok Date: Wed, 29 Jul 2026 08:53:20 -0500 Subject: [PATCH 020/106] docs: add Microsoft Store install path for Windows (#15009) Co-authored-by: Ian Bassi Signed-off-by: Bartok --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 2242d6ae33..e9a28ba4f3 100644 --- a/README.md +++ b/README.md @@ -119,6 +119,10 @@ Download the **Windows Installer exe** for your preferred version from the [rele - This file may already be available on your computer if you've installed visual studio. Check the following location: `%VCINSTALLDIR%Redist\MSVC\v142` +### Microsoft Store + +Install from the [Microsoft Store](https://apps.microsoft.com/detail/9mv6gl23xm59) when you prefer a Store-signed package (helps on Windows 11 Smart App Control). + ### Windows Package Manager ```shell From 3ab9cf53d096838c7f9dde66163e20c0d01fa670 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Wed, 29 Jul 2026 23:46:42 +0800 Subject: [PATCH 021/106] code cleanup --- src/libslic3r/GCode.cpp | 102 ++++--- src/libslic3r/GCode.hpp | 2 + src/libslic3r/GCode/WipeTower.hpp | 5 + src/libslic3r/GCode/WipeTower2.cpp | 417 +++-------------------------- src/libslic3r/GCode/WipeTower2.hpp | 39 ++- 5 files changed, 120 insertions(+), 445 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index a93899036f..53c9733a9b 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -13,6 +13,7 @@ #include "GCode/PrintExtents.hpp" #include "GCode/Thumbnails.hpp" #include "GCode/WipeTower.hpp" +#include "GCode/WipeTower2.hpp" #include "ShortestPath.hpp" #include "Print.hpp" #include "Utils.hpp" @@ -888,18 +889,22 @@ static std::vector get_path_of_change_filament(const Print& print) return res; } - // With skip points enabled the Type2 tower wall has an opening at each toolchange's - // entry (tcr.start_pos): route the approach around the tower's bounding box so the - // nozzle enters through that opening instead of dragging across the printed wall - // (append_tcr parity). Emits only the waypoints leading up to the opening — the - // caller still travels to start_wipe_pos itself. Returns an empty string when the - // option is off, the cone wall is active (it has no gap machinery), or the approach - // already starts inside the tower: such hops never cross the wall and must stay direct. - std::string WipeTowerIntegration::travel_to_tower_gap(GCode &gcodegen, const Point &route_start, const Point &start_wipe_pos) const + // Type2 tower-local point -> bed frame. The rib-wall offset is tower-local, so it + // rotates with the tower (unlike the BBL tower in append_tcr, which never rotates). + Vec2f WipeTowerIntegration::transform_wt2_pt(const Vec2f &pt) const + { + const float alpha = m_wipe_tower_rotation / 180.f * float(M_PI); + return Eigen::Rotation2Df(alpha) * (pt + m_rib_offset) + m_wipe_tower_pos; + } + + // Printable-area bounds for tower-approach routing, in object coordinates (shared by + // the BBL avoid-perimeter path in append_tcr and the Type2 skip-points router). + // Multi-nozzle: clamp the travel bounds to the region every extruder can reach + // (get_extruder_shared_printable_polygon) instead of the full bed. Gated on the + // multi-nozzle predicate so every existing single/dual printer keeps the historic + // full-printable_area routing byte-identical. + BoundingBox WipeTowerIntegration::printer_travel_bounds(GCode &gcodegen) const { - if (!gcodegen.m_config.prime_tower_skip_points.value - || gcodegen.m_config.wipe_tower_wall_type.value == WipeTowerWallType::wtwCone) - return {}; const Vec2f plate_origin_2d(m_plate_origin(0), m_plate_origin(1)); BoundingBox printer_bbx; if (is_multi_nozzle_printer(gcodegen.m_config)) { @@ -912,19 +917,30 @@ static std::vector get_path_of_change_filament(const Print& print) bed_points.push_back(wipe_tower_point_to_object_point(gcodegen, p.cast() + plate_origin_2d)); printer_bbx = BoundingBox(bed_points); } - // Transform the tower-local bbx corners exactly like the tcr points (rib - // offset, rotation, tower position); a rotated tower gets a conservative - // axis-aligned envelope. - const float alpha = m_wipe_tower_rotation / 180.f * float(M_PI); - Polygon avoid_points = scaled(m_wipe_tower_bbx).polygon(); - for (auto& p : avoid_points.points) { - Vec2f pp = Eigen::Rotation2Df(alpha) * (unscale(p).cast() + m_rib_offset) + m_wipe_tower_pos; - p = wipe_tower_point_to_object_point(gcodegen, pp + plate_origin_2d); - } + return printer_bbx; + } + + // With skip points enabled the Type2 tower wall has an opening at each toolchange's + // entry (tcr.start_pos): route the approach around the tower's bounding box so the + // nozzle enters through that opening instead of dragging across the printed wall + // (append_tcr parity). Emits only the waypoints leading up to the opening — the + // caller still travels to start_wipe_pos itself. Returns an empty string when the + // gap wall is off (option off or cone wall) or the approach already starts inside + // the tower: such hops never cross the wall and must stay direct. + std::string WipeTowerIntegration::travel_to_tower_gap(GCode &gcodegen, const Point &route_start, const Point &start_wipe_pos) const + { + if (!WipeTower2::use_gap_wall(gcodegen.m_config)) + return {}; + const Vec2f plate_origin_2d(m_plate_origin(0), m_plate_origin(1)); + // Transform the tower-local bbx corners exactly like the tcr points; a rotated + // tower gets a conservative axis-aligned envelope. + Polygon avoid_points = scaled(m_wipe_tower_bbx).polygon(); + for (auto& p : avoid_points.points) + p = wipe_tower_point_to_object_point(gcodegen, transform_wt2_pt(unscale(p).cast()) + plate_origin_2d); BoundingBox avoid_bbx(avoid_points.points); if (avoid_bbx.contains(route_start)) return {}; - Polyline travel_polyline = generate_path_to_wipe_tower(route_start, start_wipe_pos, avoid_bbx, printer_bbx); + Polyline travel_polyline = generate_path_to_wipe_tower(route_start, start_wipe_pos, avoid_bbx, printer_travel_bounds(gcodegen)); std::string gcode; // The polyline's last point is start_wipe_pos itself — emitted by the caller. for (size_t i = 0; i + 1 < travel_polyline.points.size(); ++i) @@ -1305,24 +1321,7 @@ static std::vector get_path_of_change_filament(const Print& print) Vec2f gcode_last_pos2d{gcode_last_pos[0], gcode_last_pos[1]}; Point gcode_last_pos2d_object = gcodegen.gcode_to_point(gcode_last_pos2d.cast() + plate_origin_2d.cast()); Point start_wipe_pos = wipe_tower_point_to_object_point(gcodegen, tool_change_start_pos + plate_origin_2d); - BoundingBox avoid_bbx, printer_bbx; - { - // set printer_bbx - // Multi-nozzle: clamp the avoid-perimeter travel bounds to the region every - // extruder can reach (get_extruder_shared_printable_polygon) instead of the full - // bed. Gated on the multi-nozzle predicate so H2D and every existing single/dual - // printer keep the historic full-printable_area routing byte-identical. - if (is_multi_nozzle_printer(gcodegen.m_config)) { - printer_bbx = get_extents(gcodegen.m_print->get_extruder_shared_printable_polygon()); - printer_bbx.min = wipe_tower_point_to_object_point(gcodegen, unscaled(printer_bbx.min) + plate_origin_2d); - printer_bbx.max = wipe_tower_point_to_object_point(gcodegen, unscaled(printer_bbx.max) + plate_origin_2d); - } else { - Pointfs bed_pointsf = gcodegen.m_config.printable_area.values; - Points bed_points; - for (auto p : bed_pointsf) { bed_points.push_back(wipe_tower_point_to_object_point(gcodegen, p.cast() + plate_origin_2d)); } - printer_bbx = BoundingBox(bed_points); - } - } + BoundingBox avoid_bbx, printer_bbx = printer_travel_bounds(gcodegen); { // set avoid_bbx avoid_bbx = scaled(m_wipe_tower_bbx); @@ -1466,19 +1465,13 @@ static std::vector get_path_of_change_filament(const Print& print) // We want to rotate and shift all extrusions (gcode postprocessing) and starting and ending position float alpha = m_wipe_tower_rotation / 180.f * float(M_PI); - // The rib-wall offset is tower-local, so it rotates with the tower (unlike the BBL - // tower in append_tcr, which never rotates). Priming lines are absolute bed moves. - auto transform_wt_pt = [&alpha, this](const Vec2f &pt) -> Vec2f { - Vec2f out = Eigen::Rotation2Df(alpha) * (pt + m_rib_offset); - out += m_wipe_tower_pos; - return out; - }; - + // Priming lines are absolute bed moves; everything else is tower-local + // (transform_wt2_pt). Vec2f start_pos = tcr.start_pos; Vec2f end_pos = tcr.end_pos; if (!tcr.priming) { - start_pos = transform_wt_pt(start_pos); - end_pos = transform_wt_pt(end_pos); + start_pos = transform_wt2_pt(start_pos); + end_pos = transform_wt2_pt(end_pos); } Vec2f wipe_tower_offset = tcr.priming ? Vec2f::Zero() : Vec2f(m_wipe_tower_pos + Eigen::Rotation2Df(alpha) * m_rib_offset); @@ -1511,13 +1504,13 @@ static std::vector get_path_of_change_filament(const Print& print) || is_ramming || tool_change_on_wipe_tower); + const Point start_wipe_pos = wipe_tower_point_to_object_point(gcodegen, start_pos + plate_origin_2d); const bool travel_to_tower_now = should_travel_to_tower || gcodegen.m_need_change_layer_lift_z; if (travel_to_tower_now) { // FIXME: It would be better if the wipe tower set the force_travel flag for all toolchanges, // then we could simplify the condition and make it more readable. gcode += gcodegen.retract(); gcodegen.m_avoid_crossing_perimeters.use_external_mp_once(); - const Point start_wipe_pos = wipe_tower_point_to_object_point(gcodegen, start_pos + plate_origin_2d); if (!tcr.priming && gcodegen.last_pos_defined()) gcode += travel_to_tower_gap(gcodegen, gcodegen.last_pos(), start_wipe_pos); gcode += gcodegen.travel_to(start_wipe_pos, erMixed, "Travel to a Wipe Tower"); @@ -1549,9 +1542,7 @@ static std::vector get_path_of_change_filament(const Print& print) toolchange_temp_override = interface_temp; } toolchange_gcode_str = gcodegen.set_extruder(new_extruder_id, tcr.print_z, false, toolchange_temp_override); // TODO: toolchange_z vs print_z - if (!travel_to_tower_now && !tcr.priming && needs_toolchange - && gcodegen.m_config.prime_tower_skip_points.value - && gcodegen.m_config.wipe_tower_wall_type.value != WipeTowerWallType::wtwCone) { + if (!travel_to_tower_now && !tcr.priming && WipeTower2::use_gap_wall(gcodegen.m_config)) { // The tool changed in place (multi-tool printer without ramming), so the // tower entry is the tcr's own positioning move — a straight line across // the printed wall. Route it around the tower and in through the wall @@ -1574,8 +1565,7 @@ static std::vector get_path_of_change_filament(const Print& print) if (have_start) { gcodegen.set_last_pos(route_start); gcodegen.m_avoid_crossing_perimeters.use_external_mp_once(); - const Point start_wipe_pos = wipe_tower_point_to_object_point(gcodegen, start_pos + plate_origin_2d); - std::string travel = travel_to_tower_gap(gcodegen, route_start, start_wipe_pos); + std::string travel = travel_to_tower_gap(gcodegen, route_start, start_wipe_pos); travel += gcodegen.travel_to(start_wipe_pos, erMixed, "Travel to a Wipe Tower"); check_add_eol(travel); toolchange_gcode_str += travel; @@ -1767,7 +1757,7 @@ static std::vector get_path_of_change_filament(const Print& print) // Prepare a future wipe. gcodegen.m_wipe.reset_path(); for (const Vec2f& wipe_pt : tcr.wipe_path) - gcodegen.m_wipe.path.points.emplace_back(wipe_tower_point_to_object_point(gcodegen, transform_wt_pt(wipe_pt) + plate_origin_2d)); + gcodegen.m_wipe.path.points.emplace_back(wipe_tower_point_to_object_point(gcodegen, transform_wt2_pt(wipe_pt) + plate_origin_2d)); } // Let the planner know we are traveling between objects. diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index bda9cc43c0..2d2ff5bc27 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -133,6 +133,8 @@ private: Polyline generate_path_to_wipe_tower(const Point &start_pos, const Point &end_pos, const BoundingBox &avoid_polygon, const BoundingBox &printer_bbx) const; std::string append_tcr2(GCode &gcodegen, const WipeTower::ToolChangeResult &tcr, int new_extruder_id, double z = -1.) const; std::string travel_to_tower_gap(GCode &gcodegen, const Point &route_start, const Point &start_wipe_pos) const; + Vec2f transform_wt2_pt(const Vec2f &pt) const; + BoundingBox printer_travel_bounds(GCode &gcodegen) const; // Postprocesses gcode: rotates and moves G1 extrusions and returns result std::string post_process_wipe_tower_moves(const WipeTower::ToolChangeResult& tcr, const Vec2f& translation, float angle) const; diff --git a/src/libslic3r/GCode/WipeTower.hpp b/src/libslic3r/GCode/WipeTower.hpp index 07f9a8f269..3dbbf03ffb 100644 --- a/src/libslic3r/GCode/WipeTower.hpp +++ b/src/libslic3r/GCode/WipeTower.hpp @@ -20,6 +20,11 @@ class WipeTowerWriter; class PrintConfig; enum GCodeFlavor : unsigned char; +// Cuts the tower wall polygon open at each skip point (a toolchange's entry position) +// so the entry travel can pass through instead of crossing the printed wall. Defined in +// WipeTower.cpp, shared by WipeTower and WipeTower2. +Polylines contrust_gap_for_skip_points( + const Polygon& polygon, const std::vector& skip_points, float wt_width, float gap_length, Polygon& insert_skip_polygon); class WipeTower { diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index 7f51d92466..e3e5f075c1 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -233,24 +233,6 @@ static Polygon rounding_rectangle(Polygon& polygon, double rounding = 2., double return res; } -static std::pair ray_intersetion_line(const Vec2f& a, const Vec2f& v1, const Vec2f& b, const Vec2f& c) -{ - const Vec2f v2 = c - b; - double denom = cross2(v1, v2); - if (fabs(denom) < EPSILON) - return {false, Vec2f(0, 0)}; - const Vec2f v12 = (a - b); - double nume_a = cross2(v2, v12); - double nume_b = cross2(v1, v12); - double t1 = nume_a / denom; - double t2 = nume_b / denom; - if (t1 >= 0 && t2 >= 0 && t2 <= 1.) { - // Get the intersection point. - Vec2f res = a + t1 * v1; - return std::pair(true, res); - } - return std::pair(false, Vec2f{0, 0}); -} static Polygon scale_polygon(const std::vector& points) { Polygon res; @@ -295,6 +277,7 @@ static Polygon generate_rectange(const Line& line, coord_t offset) return poly; }; +// Straight or arc-fitted wall segment used by WipeTowerWriter2::generate_path(). struct Segment { Vec2f start; @@ -305,324 +288,6 @@ struct Segment bool is_valid() const { return start.y() < end.y(); } }; -static std::vector remove_points_from_segment(const Segment& segment, const std::vector& skip_points, double range) -{ - std::vector result; - result.push_back(segment); - float x = segment.start.x(); - - for (const Vec2f& point : skip_points) { - std::vector newResult; - for (const auto& seg : result) { - if (point.y() + range <= seg.start.y() || point.y() - range >= seg.end.y()) { - newResult.push_back(seg); - } else { - if (point.y() - range > seg.start.y()) { - newResult.push_back(Segment(Vec2f(x, seg.start.y()), Vec2f(x, point.y() - range))); - } - if (point.y() + range < seg.end.y()) { - newResult.push_back(Segment(Vec2f(x, point.y() + range), Vec2f(x, seg.end.y()))); - } - } - } - - result = newResult; - } - - result.erase(std::remove_if(result.begin(), result.end(), [](const Segment& seg) { return !seg.is_valid(); }), result.end()); - return result; -} - -struct IntersectionInfo -{ - Vec2f pos; - int idx; - int pair_idx; // gap_pair idx - float dis_from_idx; - bool is_forward; -}; - -struct PointWithFlag -{ - Vec2f pos; - int pair_idx; // gap_pair idx - bool is_forward; -}; -static IntersectionInfo move_point_along_polygon( - const std::vector& points, const Vec2f& startPoint, int startIdx, float offset, bool forward, int pair_idx) -{ - float remainingDistance = offset; - IntersectionInfo res; - int mod = points.size(); - if (forward) { - int next = (startIdx + 1) % mod; - remainingDistance -= (points[next] - startPoint).norm(); - if (remainingDistance <= 0) { - res.idx = startIdx; - res.pos = startPoint + (points[next] - startPoint).normalized() * offset; - res.pair_idx = pair_idx; - res.dis_from_idx = (points[startIdx] - res.pos).norm(); - return res; - } else { - for (int i = (startIdx + 1) % mod; i != startIdx; i = (i + 1) % mod) { - float segmentLength = (points[(i + 1) % mod] - points[i]).norm(); - if (remainingDistance <= segmentLength) { - float ratio = remainingDistance / segmentLength; - res.idx = i; - res.pos = points[i] + ratio * (points[(i + 1) % mod] - points[i]); - res.dis_from_idx = remainingDistance; - res.pair_idx = pair_idx; - return res; - } - remainingDistance -= segmentLength; - } - res.idx = (startIdx - 1 + mod) % mod; - res.pos = points[startIdx]; - res.pair_idx = pair_idx; - res.dis_from_idx = (res.pos - points[res.idx]).norm(); - } - } else { - int next = (startIdx + 1) % mod; - remainingDistance -= (points[startIdx] - startPoint).norm(); - if (remainingDistance <= 0) { - res.idx = startIdx; - res.pos = startPoint - (points[next] - points[startIdx]).normalized() * offset; - res.dis_from_idx = (res.pos - points[startIdx]).norm(); - res.pair_idx = pair_idx; - return res; - } - for (int i = (startIdx - 1 + mod) % mod; i != startIdx; i = (i - 1 + mod) % mod) { - float segmentLength = (points[(i + 1) % mod] - points[i]).norm(); - if (remainingDistance <= segmentLength) { - float ratio = remainingDistance / segmentLength; - res.idx = i; - res.pos = points[(i + 1) % mod] - ratio * (points[(i + 1) % mod] - points[i]); - res.dis_from_idx = segmentLength - remainingDistance; - res.pair_idx = pair_idx; - return res; - } - remainingDistance -= segmentLength; - } - res.idx = startIdx; - res.pos = points[res.idx]; - res.pair_idx = pair_idx; - res.dis_from_idx = 0; - } - return res; -}; - -static void insert_points(std::vector& pl, int idx, Vec2f pos, int pair_idx, bool is_forward) -{ - int next = (idx + 1) % pl.size(); - Vec2f pos1 = pl[idx].pos; - Vec2f pos2 = pl[next].pos; - if ((pos - pos1).squaredNorm() < EPSILON) { - pl[idx].pair_idx = pair_idx; - pl[idx].is_forward = is_forward; - } else if ((pos - pos2).squaredNorm() < EPSILON) { - pl[next].pair_idx = pair_idx; - pl[next].is_forward = is_forward; - } else { - pl.insert(pl.begin() + idx + 1, PointWithFlag{pos, pair_idx, is_forward}); - } -} - -// For skip_point -// TODO: Optimize the skip_point algorithm itself instead of adding guards here -static Polygon add_extra_point(const Polygon& polygon, int scale_range) -{ - Polygon res; - if (polygon.size() < 2) return polygon; - - // Compute bounding box of the polygon - auto polygon_box = get_extents(polygon); - - // Anchor point: X at bbox center, Y at bbox bottom - Vec2f anchor_point(float(polygon_box.center()[0]), float(polygon_box.min[1])); - - // Find the edge whose midpoint is closest to the anchor point - size_t closest_edge_idx = 0; - float min_dist_sq = std::numeric_limits::max(); - - for (size_t i = 0; i < polygon.size(); ++i) { - const Point &a_i = polygon[i]; - const Point &b_i = polygon[(i + 1) % polygon.size()]; - - Vec2f a(float(a_i.x()), float(a_i.y())); - Vec2f b(float(b_i.x()), float(b_i.y())); - Vec2f mid = (a + b) * 0.5f; - - float dist_sq = (anchor_point - mid).squaredNorm(); - if (dist_sq < min_dist_sq) { - min_dist_sq = dist_sq; - closest_edge_idx = i; - } - } - - // Edge endpoints (integer space) - const Point &a_i = polygon[closest_edge_idx]; - const Point &b_i = polygon[(closest_edge_idx + 1) % polygon.size()]; - - // Convert to float for geometric computation - Vec2f a(float(a_i.x()), float(a_i.y())); - Vec2f b(float(b_i.x()), float(b_i.y())); - - Vec2f mid = (a + b) * 0.5f; - - // Direction vectors from midpoint towards A and B - Vec2f dir_to_a = a - mid; - Vec2f dir_to_b = b - mid; - - float len_a = dir_to_a.norm(); - float len_b = dir_to_b.norm(); - - // Guard against degenerated edges - if (len_a < EPSILON || len_b < EPSILON) return polygon; - - dir_to_a /= len_a; - dir_to_b /= len_b; - - // Clamp range to avoid overshooting the edge - float max_range = std::min(len_a, len_b) * 0.9f; - float range = std::min(float(scale_range), max_range); - - // Offset points (float space) - Vec2f offset_to_a_f = mid + dir_to_a * range; - Vec2f offset_to_b_f = mid + dir_to_b * range; - - // Safe cast back to scaled integer Point - auto to_int_point = [](const Vec2f &p) { - auto clamp = [](float v) -> coord_t { - constexpr float kMin = float(std::numeric_limits::min()); - constexpr float kMax = float(std::numeric_limits::max()); - v = std::clamp(v, kMin, kMax); - return static_cast(std::lround(v)); - }; - return Point(clamp(p.x()), clamp(p.y())); - }; - - Point mid_i = to_int_point(mid); - Point offset_to_a_i = to_int_point(offset_to_a_f); - Point offset_to_b_i = to_int_point(offset_to_b_f); - - // Rebuild polygon with inserted points - for (size_t i = 0; i < polygon.size(); ++i) { - res.points.push_back(polygon[i]); - - // Insert points right after the selected edge start vertex - if (i == closest_edge_idx) { - res.points.push_back(offset_to_a_i); - res.points.push_back(mid_i); - res.points.push_back(offset_to_b_i); - } - } - - return res; -} - -static Polylines remove_points_from_polygon( - const Polygon& polygon_ori, const std::vector& skip_points, double range, float wt_width, Polygon& insert_skip_pg) -{ - Polygon polygon = add_extra_point(polygon_ori, scale_(range)); - if (polygon.size() < 2) return Polylines{to_polyline(polygon)}; - Polylines result; - std::vector new_pl; // add intersection points for gaps, where bool indicates whether it's a gap point. - std::vector inter_info; - auto polygon_box = get_extents(polygon); - Point anchor_point = Point{polygon_box.center()[0], polygon_box.min[1]}; // for next reconnect - std::vector points; - { - points.reserve(polygon.points.size()); - int idx = polygon.closest_point_index(anchor_point); - Polyline tmp_poly = polygon.split_at_index(idx); - for (auto& p : tmp_poly) - points.push_back(unscale(p).cast()); - points.pop_back(); - } - - for (int i = 0; i < skip_points.size(); i++) { - bool is_left = abs(skip_points[i].x()) < wt_width / 2.f; - Vec2f ray = is_left ? Vec2f(-1, 0) : Vec2f(1, 0); - for (int j = 0; j < points.size(); j++) { - Vec2f& p1 = points[j]; - Vec2f& p2 = points[(j + 1) % points.size()]; - auto [is_inter, inter_pos] = ray_intersetion_line(skip_points[i], ray, p1, p2); - if (is_inter) { - IntersectionInfo forward = move_point_along_polygon(points, inter_pos, j, range, true, i); - IntersectionInfo backward = move_point_along_polygon(points, inter_pos, j, range, false, i); - backward.is_forward = false; - forward.is_forward = true; - inter_info.push_back(backward); - inter_info.push_back(forward); - break; - } - } - } - - // insert point to new_pl - for (const auto& p : points) - new_pl.push_back({p, -1}); - std::sort(inter_info.begin(), inter_info.end(), [](const IntersectionInfo& lhs, const IntersectionInfo& rhs) { - if (rhs.idx == lhs.idx) - return lhs.dis_from_idx < rhs.dis_from_idx; - return lhs.idx < rhs.idx; - }); - for (int i = inter_info.size() - 1; i >= 0; i--) { - insert_points(new_pl, inter_info[i].idx, inter_info[i].pos, inter_info[i].pair_idx, inter_info[i].is_forward); - } - - { - // set insert_pg for wipe_path - for (auto& p : new_pl) - insert_skip_pg.points.push_back(scaled(p.pos)); - } - - int beg = 0; - bool skip = true; - int i = beg; - Polyline pl; - - do { - if (skip || new_pl[i].pair_idx == -1) { - pl.points.push_back(scaled(new_pl[i].pos)); - i = (i + 1) % new_pl.size(); - skip = false; - } else { - if (!pl.points.empty()) { - pl.points.push_back(scaled(new_pl[i].pos)); - result.push_back(pl); - pl.points.clear(); - } - int left = new_pl[i].pair_idx; - int j = (i + 1) % new_pl.size(); - while (j != beg && new_pl[j].pair_idx != left) { - if (new_pl[j].pair_idx != -1 && !new_pl[j].is_forward) - left = new_pl[j].pair_idx; - j = (j + 1) % new_pl.size(); - } - i = j; - skip = true; - } - } while (i != beg); - - if (!pl.points.empty()) { - if (new_pl[i].pair_idx == -1) - pl.points.push_back(scaled(new_pl[i].pos)); - result.push_back(pl); - } - return result; -} - -static Polylines contrust_gap_for_skip_points( - const Polygon& polygon, const std::vector& skip_points, float wt_width, float gap_length, Polygon& insert_skip_polygon) -{ - if (skip_points.empty()) { - insert_skip_polygon = polygon; - return Polylines{to_polyline(polygon)}; - } - return remove_points_from_polygon(polygon, skip_points, gap_length, wt_width, insert_skip_polygon); -}; - static Polygon generate_rectange_polygon(const Vec2f& wt_box_min, const Vec2f& wt_box_max) { Polygon res; @@ -1334,6 +999,12 @@ WipeTower::ToolChangeResult WipeTower2::construct_tcr(WipeTowerWriter2& writer, +bool WipeTower2::use_gap_wall(const PrintConfig& config) +{ + // The cone wall has its own fully separate generator with no gap machinery. + return config.prime_tower_skip_points.value && config.wipe_tower_wall_type.value != wtwCone; +} + WipeTower2::WipeTower2(const PrintConfig& config, const PrintRegionConfig& default_region_config,int plate_idx, Vec3d plate_origin, const std::vector>& wiping_matrix, size_t initial_tool) : m_semm(config.single_extruder_multi_material.value), m_enable_filament_ramming(config.enable_filament_ramming.value), @@ -1361,8 +1032,7 @@ WipeTower2::WipeTower2(const PrintConfig& config, const PrintRegionConfig& defau m_rib_width(config.wipe_tower_rib_width), m_extra_rib_length(config.wipe_tower_extra_rib_length), m_wall_type((int)config.wipe_tower_wall_type), - // The cone wall has its own fully separate generator with no gap machinery. - m_use_gap_wall(config.prime_tower_skip_points.value && config.wipe_tower_wall_type.value != wtwCone), + m_use_gap_wall(use_gap_wall(config)), m_enable_tower_interface_features(config.enable_tower_interface_features.value), m_enable_tower_interface_cooldown_during_tower(config.enable_tower_interface_cooldown_during_tower.value) { @@ -1664,13 +1334,9 @@ WipeTower::ToolChangeResult WipeTower2::tool_change(size_t tool) writer.speed_override_backup(); writer.speed_override(100); - Vec2f initial_position = cleaning_box.ld + Vec2f(0.f, m_depth_traversed); - // With a boundary wipe start the wall gap sits at the first wipe row below the - // quantized ram band; enter there too so the routed entry, the gap and the wipe - // scrub all share one opening. toolchange_Unload() climbs back up to the ram band - // along the box interior. - if (!m_semm && m_use_gap_wall && ramming_depth > 0.f) - initial_position.y() += wipe_start_offset_after_ram(ramming_depth, is_first_layer()); + // On a boundary wipe start this enters at the wall gap on the first wipe row; + // toolchange_Unload() then climbs back up to the ram band along the box interior. + Vec2f initial_position = toolchange_entry_pos(m_depth_traversed, ramming_depth, is_first_layer()); writer.set_initial_position(initial_position, m_wipe_tower_width, m_wipe_tower_depth, m_internal_rotation); // Increase the extruder driver current to allow fast ramming. @@ -1682,10 +1348,8 @@ WipeTower::ToolChangeResult WipeTower2::tool_change(size_t tool) // Without a ram — or with the boundary wipe start, where the ram band is // quantized to whole rows — the box is planned as whole wipe rows; the wipe // then fills it completely so adjacent purge blocks stay contiguous. Uses the - // old tool (m_current_tool before toolchange_Change), same conditions as - // toolchange_Unload()'s do_ramming / boundary_wipe_start. - const bool do_ram_old = (m_semm && m_enable_filament_ramming) || m_filpar[m_current_tool].multitool_ramming; - const bool fill_box = !do_ram_old || (!m_semm && m_use_gap_wall); + // old tool (m_current_tool before toolchange_Change). + const bool fill_box = !tool_ramming_enabled(m_current_tool) || boundary_wipe_start_enabled(m_current_tool); auto new_tool_temp = is_first_layer() ? m_filpar[tool].first_layer_temperature : m_filpar[tool].temperature; toolchange_Unload(writer, cleaning_box, m_filpar[m_current_tool].material, (is_first_layer() ? m_filpar[m_current_tool].first_layer_temperature : m_filpar[m_current_tool].temperature), @@ -1763,11 +1427,10 @@ void WipeTower2::toolchange_Unload( float remaining = xr - xl ; // keeps track of distance to the next turnaround float e_done = 0; // measures E move done from each segment - // Orca: Do ramming when SEMM and ramming is enabled or when multi tool head when ramming is enabled on the multi tool. - const bool do_ramming = (m_semm && m_enable_filament_ramming) || m_filpar[m_current_tool].multitool_ramming; + const bool do_ramming = tool_ramming_enabled(m_current_tool); const bool cold_ramming = m_is_mk4mmu3; // Orca: see set_toolchange() — quantized ram band + wipe restart at the boundary. - const bool boundary_wipe_start = do_ramming && !m_semm && m_use_gap_wall; + const bool boundary_wipe_start = boundary_wipe_start_enabled(m_current_tool); float planned_ramming_depth = 0.f; if (boundary_wipe_start && m_layer_info != m_plan.end()) for (const auto& tch : m_layer_info->tool_changes) @@ -1994,12 +1657,9 @@ void WipeTower2::toolchange_Unload( // first wipe row so the purge row lattice continues across the block boundary // (previous box's last row top edge sits at its box top): with the planned depth // of rows * dy, the last row's top edge then lands exactly on this box's top and - // no blank band is left between adjacent purge blocks. Mirrors dy/line_width in - // toolchange_Wipe(). - const float wipe_dy = (is_first_layer() ? m_extra_flow : m_extra_spacing_wipe) * m_perimeter_width; - const float wipe_line_width = m_perimeter_width * m_extra_flow; + // no blank band is left between adjacent purge blocks. writer.set_position(Vec2f(end_of_ramming.x(), - cleaning_box.ld.y() + m_depth_traversed + wipe_dy - (m_perimeter_width + wipe_line_width) / 2.f + m_perimeter_width)); + cleaning_box.ld.y() + m_depth_traversed + wipe_start_offset_after_ram(0.f, is_first_layer()) + m_perimeter_width)); } writer.resume_preview() @@ -2090,7 +1750,7 @@ void WipeTower2::toolchange_Wipe( const float& xr = cleaning_box.rd.x(); writer.set_extrusion_flow(m_extrusion_flow * m_extra_flow); - const float line_width = m_perimeter_width * m_extra_flow; + const float line_width = wipe_line_width(); writer.change_analyzer_line_width(line_width); // Variables x_to_wipe and traversed_x are here to be able to make sure it always wipes at least @@ -2098,7 +1758,7 @@ void WipeTower2::toolchange_Wipe( // wipe until the end of the assigned area. float x_to_wipe = volume_to_length(wipe_volume, m_perimeter_width, m_layer_height) / m_extra_flow; - float dy = (is_first_layer() ? m_extra_flow : m_extra_spacing_wipe) * m_perimeter_width; // Don't use the extra spacing for the first layer, but do use the spacing resulting from increased flow. + float dy = wipe_row_spacing(is_first_layer()); // Don't use the extra spacing for the first layer, but do use the spacing resulting from increased flow. // All the calculations in all other places take the spacing into account for all the layers. // If spare layers are excluded->if 1 or less toolchange has been done, it must be sill the first layer, too.So slow down. @@ -2291,7 +1951,7 @@ WipeTower::ToolChangeResult WipeTower2::finish_layer() poly = generate_support_cone_wall(writer, wt_box, feedrate, infill_cone, spacing); } else { WipeTower::box_coordinates wt_box(Vec2f(0.f, 0.f), m_wipe_tower_width, m_layer_info->depth + m_perimeter_width); - poly = generate_support_rib_wall(writer, wt_box, feedrate, first_layer, m_wall_type == (int)wtwRib, true, m_use_gap_wall); + poly = generate_support_rib_wall(writer, wt_box, feedrate, first_layer, m_wall_type == (int)wtwRib, true); } // brim (first layer only) @@ -2419,16 +2079,14 @@ WipeTower2::WipeTowerInfo::ToolChange WipeTower2::set_toolchange(size_t old_tool float length_to_extrude = volume_to_length((m_semm ? 0.25f : m_filpar[old_tool].multitool_ramming_time) * std::accumulate(m_filpar[old_tool].ramming_speed.begin(), m_filpar[old_tool].ramming_speed.end(), 0.f), m_perimeter_width * m_filpar[old_tool].ramming_line_width_multiplicator, layer_height); - // Orca: Reserve ramming depth only when toolchange_Unload() will actually ram - // (same condition as its do_ramming), otherwise the unprinted reservation - // leaves blank bands between the purge boxes. - const bool do_ramming = (m_semm && m_enable_filament_ramming) || m_filpar[old_tool].multitool_ramming; + // Orca: Reserve ramming depth only when toolchange_Unload() will actually ram, + // otherwise the unprinted reservation leaves blank bands between the purge boxes. + const bool do_ramming = tool_ramming_enabled(old_tool); // Orca: with the gap wall on a multi-tool printer the ram band is quantized up to // the whole reserved rows and the wipe restarts at the left-edge boundary on a // fresh row below it (BBL parity: the old-tool purge is whole rows and the wipe - // always starts at the box corner, where the entry scrub runs). SEMM keeps the - // stock continue-from-ram-end behavior. Must match toolchange_Unload()/tool_change(). - const bool boundary_wipe_start = do_ramming && !m_semm && m_use_gap_wall; + // always starts at the box corner, where the entry scrub runs). + const bool boundary_wipe_start = boundary_wipe_start_enabled(old_tool); float ramming_depth = do_ramming ? ((int(length_to_extrude / width) + 1) * (m_perimeter_width * m_filpar[old_tool].ramming_line_width_multiplicator * m_filpar[old_tool].ramming_step_multiplicator) * m_extra_spacing_ramming) : 0; // first_wipe_line rides for free on the last (partially used) ramming row, which // is already covered by ramming_depth. Without ramming that row does not exist @@ -2588,30 +2246,26 @@ static WipeTower::ToolChangeResult merge_tcr(WipeTower::ToolChangeResult& first, } -// Processes vector m_plan and calls respective functions to generate G-code for the wipe tower -// Resulting ToolChangeResults are appended into vector "result" // Precompute, for every plan layer, the wall openings ("skip points") at each toolchange's -// entry, like WipeTower::get_all_wall_skip_points(). The entry is where tool_change() -// starts: cleaning_box.ld + (0, m_depth_traversed), with m_depth_traversed advancing by -// required_depth per toolchange — reproduced here from the finalized plan so each gap -// coincides with the entry travel's target (tcr.start_pos, pre-rotation frame). -// With a boundary wipe start the entry, the wipe and its scrub sit on the first wipe row -// below the quantized ram band, so the gap moves there with them (BBL cuts its gap at the -// CP_TOOLCHANGE_WIPE start row too, never at the ram band). +// entry position, like WipeTower::get_all_wall_skip_points(). toolchange_entry_pos() +// reproduces from the finalized plan where tool_change() will start, so each gap coincides +// with the entry travel's target (tcr.start_pos, pre-rotation frame). BBL parity: the gap +// sits at the CP_TOOLCHANGE_WIPE start row, never at the ram band. void WipeTower2::compute_wall_skip_points() { m_wall_skip_points.assign(m_plan.size(), std::vector()); for (size_t layer_id = 0; layer_id < m_plan.size(); ++layer_id) { float depth_traversed = 0.f; for (const auto& toolchange : m_plan[layer_id].tool_changes) { - const float ram_offset = (!m_semm && toolchange.ramming_depth > 0.f) ? - wipe_start_offset_after_ram(toolchange.ramming_depth, layer_id == m_first_layer_idx) : 0.f; - m_wall_skip_points[layer_id].emplace_back(m_perimeter_width / 2.f, m_perimeter_width / 2.f + depth_traversed + ram_offset); + m_wall_skip_points[layer_id].emplace_back( + toolchange_entry_pos(depth_traversed, toolchange.ramming_depth, layer_id == m_first_layer_idx)); depth_traversed += toolchange.required_depth; } } } +// Processes vector m_plan and calls respective functions to generate G-code for the wipe tower +// Resulting ToolChangeResults are appended into vector "result" void WipeTower2::generate(std::vector> &result) { if (m_plan.empty()) @@ -2779,8 +2433,7 @@ Polygon WipeTower2::generate_support_rib_wall(WipeTowerWriter2& double feedrate, bool first_layer, bool rib_wall, - bool extrude_perimeter, - bool skip_points) + bool extrude_perimeter) { float retract_length = m_filpar[m_current_tool].retract_length; @@ -2800,7 +2453,7 @@ Polygon WipeTower2::generate_support_rib_wall(WipeTowerWriter2& if (!extrude_perimeter) return wall_polygon; - if (skip_points) { + if (m_use_gap_wall) { // Cut the wall open at each toolchange's entry (see compute_wall_skip_points()). // The vector is empty during the save_on_last_wipe planning passes, which therefore // measure the un-gapped wall — same approximation as the BBL tower. diff --git a/src/libslic3r/GCode/WipeTower2.hpp b/src/libslic3r/GCode/WipeTower2.hpp index 439515cdd4..3efa884202 100644 --- a/src/libslic3r/GCode/WipeTower2.hpp +++ b/src/libslic3r/GCode/WipeTower2.hpp @@ -34,6 +34,10 @@ public: bool is_finish, bool is_contact = false) const; + // Whether this print cuts wall openings ("skip points") at the toolchange entries. + // Shared with the entry routing in GCode.cpp so the router and the tower agree. + static bool use_gap_wall(const PrintConfig& config); + // x -- x coordinates of wipe tower in mm ( left bottom corner ) // y -- y coordinates of wipe tower in mm ( left bottom corner ) // width -- width of wipe tower in mm ( default 60 mm - leave as it is ) @@ -284,13 +288,35 @@ private: bool is_first_layer() const { return size_t(m_layer_info - m_plan.begin()) == m_first_layer_idx; } - // With a boundary wipe start (multitool ram, non-SEMM, gap wall) the wipe begins on a - // fresh row below the quantized ram band. Y offset from the box start to that first - // wipe row; must stay in sync with the alignment travel in toolchange_Unload(). + // Purge row lattice of toolchange_Wipe(): row pitch and extrusion width. + float wipe_row_spacing(bool first_layer) const { return (first_layer ? m_extra_flow : m_extra_spacing_wipe) * m_perimeter_width; } + float wipe_line_width() const { return m_perimeter_width * m_extra_flow; } + + // Whether toolchange_Unload() rams this (old) tool out. + bool tool_ramming_enabled(size_t tool) const { return (m_semm && m_enable_filament_ramming) || m_filpar[tool].multitool_ramming; } + // Whether the wipe restarts at the box boundary on a fresh row below the quantized + // ram band after ramming this (old) tool out (multi-tool gap wall; SEMM keeps the + // stock continue-from-ram-end behavior). + bool boundary_wipe_start_enabled(size_t tool) const { return tool_ramming_enabled(tool) && !m_semm && m_use_gap_wall; } + + // With a boundary wipe start the wipe begins on a fresh row below the quantized ram + // band. Y offset from the box start to that first wipe row. float wipe_start_offset_after_ram(float ramming_depth, bool first_layer) const { - const float wipe_dy = (first_layer ? m_extra_flow : m_extra_spacing_wipe) * m_perimeter_width; - return ramming_depth + wipe_dy - (m_perimeter_width + m_perimeter_width * m_extra_flow) / 2.f; + return ramming_depth + wipe_row_spacing(first_layer) - (m_perimeter_width + wipe_line_width()) / 2.f; + } + + // Tower-local entry position of a toolchange whose box starts depth_traversed into + // the layer: the box corner, moved down to the first wipe row when the plan gives + // it a boundary wipe start (ramming_depth > 0 iff the unload rams). tool_change() + // enters here and compute_wall_skip_points() cuts the wall gap here, so the routed + // entry, the gap and the wipe scrub all share one opening. + Vec2f toolchange_entry_pos(float depth_traversed, float ramming_depth, bool first_layer) const + { + Vec2f pos(m_perimeter_width / 2.f, m_perimeter_width / 2.f + depth_traversed); + if (!m_semm && m_use_gap_wall && ramming_depth > 0.f) + pos.y() += wipe_start_offset_after_ram(ramming_depth, first_layer); + return pos; } // Calculates extrusion flow needed to produce required line width for given layer height @@ -379,8 +405,7 @@ private: double feedrate, bool first_layer, bool rib_wall, - bool extrude_perimeter, - bool skip_points); + bool extrude_perimeter); Polygon generate_support_cone_wall( WipeTowerWriter2& writer, From 2d4b431d5f3994350efe1de63ebd44c32646ba51 Mon Sep 17 00:00:00 2001 From: Ian Bassi Date: Wed, 29 Jul 2026 16:27:15 -0300 Subject: [PATCH 022/106] Improve dimmed layers (#15001) Co-authored-by: yw4z Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com> --- src/libslic3r/AppConfig.cpp | 17 ++++++++- src/libvgcode/include/Viewer.hpp | 9 +++-- src/libvgcode/src/Settings.hpp | 6 ++-- src/libvgcode/src/Viewer.cpp | 10 ++++++ src/libvgcode/src/ViewerImpl.cpp | 61 ++++++++++++++++++++------------ src/libvgcode/src/ViewerImpl.hpp | 7 +++- src/slic3r/GUI/GCodeViewer.cpp | 3 +- src/slic3r/GUI/GCodeViewer.hpp | 5 ++- src/slic3r/GUI/Preferences.cpp | 32 ++++++++++++++++- src/slic3r/GUI/Preferences.hpp | 2 ++ 10 files changed, 119 insertions(+), 33 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index dcbead0ddd..159d9bbeda 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -202,10 +202,25 @@ void AppConfig::set_defaults() if (get("seq_top_layer_only").empty()) set("seq_top_layer_only", "1"); - // ORCA: darken layers below the current one while scrubbing the preview (ported from preFlight) + // ORCA: darken the layers the preview layer slider is not scrubbed to if (get("preview_dim_previous_layers").empty()) set_bool("preview_dim_previous_layers", false); + // ORCA: brightness of those dimmed layers, in percent. 0 = black, capped at 99 because + // 100 would render them unchanged, which is what disabling the option already does + if (get("preview_dim_previous_layers_brightness").empty()) + set("preview_dim_previous_layers_brightness", "40"); + else { + int brightness = 40; + try { + brightness = std::stoi(get("preview_dim_previous_layers_brightness")); + } + catch (...) { + brightness = 40; + } + set("preview_dim_previous_layers_brightness", std::to_string(std::max(0, std::min(brightness, 99)))); + } + if (get("filaments_area_preferred_count").empty()) set("filaments_area_preferred_count", "10"); diff --git a/src/libvgcode/include/Viewer.hpp b/src/libvgcode/include/Viewer.hpp index 7c0a0c295a..5141245d96 100644 --- a/src/libvgcode/include/Viewer.hpp +++ b/src/libvgcode/include/Viewer.hpp @@ -91,12 +91,15 @@ public: // void toggle_top_layer_only_view_range(); // - // Dim previous layers (ORCA, ported from preFlight) - // Whether the layers below the current top layer are rendered darkened while - // scrubbing below the full print, so only the current layer is shown at full brightness. + // Dim previous layers (ORCA) + // Whether the layers the layer slider is not scrubbed to are rendered darkened while + // showing less than the full print, so only the inspected layer(s) are at full brightness. + // How bright those darkened layers are rendered, 1.0 = unchanged, 0.0 = black. // bool is_dim_previous_layers() const; void set_dim_previous_layers(bool value); + float get_dim_previous_layers_brightness() const; + void set_dim_previous_layers_brightness(float value); // // Returns true if the given option is visible. // diff --git a/src/libvgcode/src/Settings.hpp b/src/libvgcode/src/Settings.hpp index 89cb9771b4..b3aa371c4a 100644 --- a/src/libvgcode/src/Settings.hpp +++ b/src/libvgcode/src/Settings.hpp @@ -19,9 +19,11 @@ struct Settings EViewType view_type{ EViewType::FeatureType }; ETimeMode time_mode{ ETimeMode::Normal }; bool top_layer_only_view_range{ false }; - // ORCA: when enabled, all layers below the current top layer are rendered - // darkened (keeping their color) while scrubbing below the full print (ported from preFlight) + // ORCA: when enabled, every layer the layer slider is not scrubbed to is rendered + // darkened (keeping its color) while showing less than the full print bool dim_previous_layers{ false }; + // ORCA: how bright those darkened layers are rendered, 1.0 = unchanged, 0.0 = black + float dim_previous_layers_brightness{ 0.4f }; bool spiral_vase_mode{ false }; // // Required update flags diff --git a/src/libvgcode/src/Viewer.cpp b/src/libvgcode/src/Viewer.cpp index a36cf011ce..eb606598e9 100644 --- a/src/libvgcode/src/Viewer.cpp +++ b/src/libvgcode/src/Viewer.cpp @@ -82,6 +82,16 @@ void Viewer::set_dim_previous_layers(bool value) m_impl->set_dim_previous_layers(value); } +float Viewer::get_dim_previous_layers_brightness() const +{ + return m_impl->get_dim_previous_layers_brightness(); +} + +void Viewer::set_dim_previous_layers_brightness(float value) +{ + m_impl->set_dim_previous_layers_brightness(value); +} + bool Viewer::is_option_visible(EOptionType type) const { return m_impl->is_option_visible(type); diff --git a/src/libvgcode/src/ViewerImpl.cpp b/src/libvgcode/src/ViewerImpl.cpp index 9804e12b9e..da1a601149 100644 --- a/src/libvgcode/src/ViewerImpl.cpp +++ b/src/libvgcode/src/ViewerImpl.cpp @@ -1223,16 +1223,12 @@ static float encode_color(const Color& color) { return static_cast(i_color); } -// ORCA: how much the layers below the current top layer are darkened when -// Settings::dim_previous_layers is enabled (ported from preFlight). 0.0 = no change, 1.0 = black. -static constexpr float PREVIOUS_LAYER_DARKEN_FACTOR = 0.60f; - -// ORCA: returns the encoded color scaled towards black by 'factor', preserving its hue -static float encode_color_darkened(const Color& color, float factor) { - const float keep = 1.0f - factor; - const int r = static_cast(color[0] * keep); - const int g = static_cast(color[1] * keep); - const int b = static_cast(color[2] * keep); +// ORCA: returns the encoded color scaled towards black by 'brightness', preserving its hue. +// 1.0 = no change, 0.0 = black. +static float encode_color_dimmed(const Color& color, float brightness) { + const int r = static_cast(color[0] * brightness); + const int g = static_cast(color[1] * brightness); + const int b = static_cast(color[2] * brightness); const int i_color = r << 16 | g << 8 | b; return static_cast(i_color); } @@ -1248,15 +1244,20 @@ void ViewerImpl::update_colors_texture() const size_t top_layer_id = m_settings.top_layer_only_view_range ? m_layers.get_view_range()[1] : 0; const bool color_top_layer_only = m_view_range.get_full()[1] != m_view_range.get_visible()[1]; - // ORCA: when dim_previous_layers is enabled, darken every layer below the current top layer - // (keeping its color) whenever we are not rendering the whole print, so that only the layer - // being scrubbed to is shown at full brightness (ported from preFlight). This shares - // top_layer_id with the greying path, so it only applies while in top-layer-only mode - that - // way the moves slider still animates normally across all layers when that mode is disabled. - const bool dim_previous_layers = m_settings.dim_previous_layers && !m_layers.empty(); - const bool full_render = (m_layers.get_view_range()[0] == 0) && - (m_layers.get_view_range()[1] >= static_cast(m_layers.count()) - 1) && - (m_view_range.get_visible()[1] == m_view_range.get_full()[1]); + // ORCA: when dim_previous_layers is enabled, darken every layer (keeping its color) except the + // one(s) the layer slider is being scrubbed to, so that only those are shown at full brightness. + // A slider thumb marks a layer as inspected only once it is moved away from + // its end of the print: the upper one while it is below the last layer (or while the moves + // slider is not at the end of the layer), the lower one while it is above the first layer, so + // trimming the print from the bottom lights up the lowest visible layer and using the slider as + // a range lights up both ends. When neither thumb is moved the whole print is rendered normally. + // Gated on top-layer-only mode, which the greying path below also keys off of, so that the moves + // slider still animates normally across all layers when that mode is disabled. + const Interval& layers_range = m_layers.get_view_range(); + const bool inspecting_top_layer = layers_range[1] + 1 < m_layers.count() || color_top_layer_only; + const bool inspecting_bottom_layer = layers_range[0] > 0; + const bool dim_previous_layers = m_settings.dim_previous_layers && m_settings.top_layer_only_view_range && + !m_layers.empty() && (inspecting_top_layer || inspecting_bottom_layer); // Based on current settings and slider position, we might want to render some // vertices as dark grey (or darkened, see above). Use either that or the normal color (from the cache). @@ -1265,9 +1266,13 @@ void ViewerImpl::update_colors_texture() for (size_t i=0; i ViewerImpl::get_time_modes() const { std::vector ret; diff --git a/src/libvgcode/src/ViewerImpl.hpp b/src/libvgcode/src/ViewerImpl.hpp index 8a91d5524f..4da312fc0e 100644 --- a/src/libvgcode/src/ViewerImpl.hpp +++ b/src/libvgcode/src/ViewerImpl.hpp @@ -85,9 +85,14 @@ public: bool is_top_layer_only_view_range() const { return m_settings.top_layer_only_view_range; } void toggle_top_layer_only_view_range(); - // ORCA: darken layers below the current top layer while scrubbing (ported from preFlight) + // ORCA: darken every layer the layer slider is not scrubbed to, so that only the inspected + // one(s) - the top thumb's layer, the bottom thumb's layer, or both - stay at full + // brightness. dim_previous_layers_brightness sets how dark the rest go, 1.0 = unchanged, + // 0.0 = black bool is_dim_previous_layers() const { return m_settings.dim_previous_layers; } void set_dim_previous_layers(bool value); + float get_dim_previous_layers_brightness() const { return m_settings.dim_previous_layers_brightness; } + void set_dim_previous_layers_brightness(float value); bool is_spiral_vase_mode() const { return m_settings.spiral_vase_mode; } diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 20bcb109e1..b882117aae 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1134,8 +1134,9 @@ void GCodeViewer::load_as_gcode(const GCodeProcessorResult& gcode_result, const if (current_top_layer_only != required_top_layer_only) m_viewer.toggle_top_layer_only_view_range(); - // ORCA: darken layers below the current one while scrubbing the preview (ported from preFlight) + // ORCA: darken the layers the preview layer slider is not scrubbed to m_viewer.set_dim_previous_layers(get_app_config()->get_bool("preview_dim_previous_layers")); + m_viewer.set_dim_previous_layers_brightness(0.01f * std::stoi(get_app_config()->get("preview_dim_previous_layers_brightness"))); // avoid processing if called with the same gcode_result if (m_last_result_id == gcode_result.id && wxGetApp().is_editor()) { diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 570c688987..a19f7bb9ae 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -333,9 +333,12 @@ public: libvgcode::EViewType get_view_type() const { return m_viewer.get_view_type(); } - // ORCA: darken layers below the current top layer while scrubbing the preview (ported from preFlight) + // ORCA: darken the layers not scrubbed to while using the preview layer slider void set_dim_previous_layers(bool value) { m_viewer.set_dim_previous_layers(value); } bool is_dim_previous_layers() const { return m_viewer.is_dim_previous_layers(); } + // ORCA: brightness of those darkened layers, 1.0 = unchanged, 0.0 = black + void set_dim_previous_layers_brightness(float value) { m_viewer.set_dim_previous_layers_brightness(value); } + float get_dim_previous_layers_brightness() const { return m_viewer.get_dim_previous_layers_brightness(); } void set_layers_z_range(const std::array& layers_z_range); diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index bd5b7420ff..6bcc00848b 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -700,6 +700,12 @@ wxBoxSizer *PreferencesDialog::create_item_spinctrl(wxString title, wxString tit auto input = new SpinInput(m_parent, wxEmptyString, side_label, wxDefaultPosition, DESIGN_INPUT_SIZE, wxSP_ARROW_KEYS, min, max, stoi(app_config->get(param))); input->SetToolTip(tip); + // ORCA: this one is only meaningful while the dimming it controls is enabled + if (param == "preview_dim_previous_layers_brightness") { + m_dim_previous_layers_brightness_input = input; + input->Enable(app_config->get_bool("preview_dim_previous_layers")); + } + m_sizer->Add(input, 0, wxALIGN_CENTER_VERTICAL); if(!title2.empty()){ @@ -1050,8 +1056,10 @@ wxBoxSizer *PreferencesDialog::create_item_checkbox(wxString title, wxString too wxGetApp().mainframe->m_webview->SendCloudProvidersInfo(); } } - // ORCA: apply the preview dimming change immediately to the currently loaded preview (ported from preFlight) + // ORCA: apply the preview dimming change immediately to the currently loaded preview else if (param == "preview_dim_previous_layers") { + if (m_dim_previous_layers_brightness_input) + m_dim_previous_layers_brightness_input->Enable(app_config->get_bool(param)); if (Plater* plater = wxGetApp().plater()) { if (GLCanvas3D* canvas = plater->get_preview_canvas3D()) { canvas->get_gcode_viewer().set_dim_previous_layers(app_config->get_bool(param)); @@ -1914,6 +1922,28 @@ void PreferencesDialog::create_items() ); g_sizer->Add(item_dim_previous_layers); + auto item_dim_previous_layers_brightness = create_item_spinctrl( + _L("Dimmed layer brightness"), + "", + _L("%"), + _L("How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" + "99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option."), + "preview_dim_previous_layers_brightness", + 0, + 99, + // ORCA: apply the new brightness immediately to the currently loaded preview + [](int value) { + if (Plater* plater = wxGetApp().plater()) { + if (GLCanvas3D* canvas = plater->get_preview_canvas3D()) { + canvas->get_gcode_viewer().set_dim_previous_layers_brightness(0.01f * value); + canvas->set_as_dirty(); + canvas->request_extra_frame(); + } + } + } + ); + g_sizer->Add(item_dim_previous_layers_brightness); + g_sizer->AddSpacer(FromDIP(10)); sizer_page->Add(g_sizer, 0, wxEXPAND); diff --git a/src/slic3r/GUI/Preferences.hpp b/src/slic3r/GUI/Preferences.hpp index 95bfcb5367..94340ce619 100644 --- a/src/slic3r/GUI/Preferences.hpp +++ b/src/slic3r/GUI/Preferences.hpp @@ -13,6 +13,7 @@ #include "Widgets/ComboBox.hpp" #include "Widgets/CheckBox.hpp" #include "Widgets/TextInput.hpp" +#include "Widgets/SpinInput.hpp" #include "Widgets/TabCtrl.hpp" #include "slic3r/Utils/bambu_networking.hpp" @@ -71,6 +72,7 @@ public: ::CheckBox * m_sync_user_preset_checkbox = {nullptr}; ::CheckBox * m_bambu_cloud_checkbox = {nullptr}; ::TextInput *m_backup_interval_textinput = {nullptr}; + ::SpinInput *m_dim_previous_layers_brightness_input = {nullptr}; ::ComboBox * m_network_version_combo = {nullptr}; std::vector m_available_versions; From ddce03032205de630f7186161c4a04e6a78677a2 Mon Sep 17 00:00:00 2001 From: Nathan Schulte <8540239+nmschulte@users.noreply.github.com> Date: Wed, 29 Jul 2026 15:37:23 -0500 Subject: [PATCH 023/106] add space after "Arranging" message (#15017) --- src/slic3r/GUI/Jobs/ArrangeJob.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.cpp b/src/slic3r/GUI/Jobs/ArrangeJob.cpp index c3d05c556f..6b74b71af1 100644 --- a/src/slic3r/GUI/Jobs/ArrangeJob.cpp +++ b/src/slic3r/GUI/Jobs/ArrangeJob.cpp @@ -548,7 +548,7 @@ void ArrangeJob::process(Ctl &ctl) params.stopcondition = [&ctl]() { return ctl.was_canceled(); }; params.progressind = [this, &ctl](unsigned num_finished, std::string str = "") { - ctl.update_status(num_finished * 100 / status_range(), _u8L("Arranging") + str); + ctl.update_status(num_finished * 100 / status_range(), _u8L("Arranging ") + str); }; { From 58bad17af952def1d4fa7c43c60a8e6b003df1bb Mon Sep 17 00:00:00 2001 From: Ian Bassi Date: Wed, 29 Jul 2026 18:09:32 -0300 Subject: [PATCH 024/106] AI translation update (#15018) --- localization/i18n/OrcaSlicer.pot | 80 +++++++++++- localization/i18n/ca/OrcaSlicer_ca.po | 129 ++++++++++++++++++- localization/i18n/cs/OrcaSlicer_cs.po | 129 ++++++++++++++++++- localization/i18n/de/OrcaSlicer_de.po | 129 ++++++++++++++++++- localization/i18n/en/OrcaSlicer_en.po | 80 +++++++++++- localization/i18n/es/OrcaSlicer_es.po | 129 ++++++++++++++++++- localization/i18n/eu/OrcaSlicer_eu.po | 129 ++++++++++++++++++- localization/i18n/fr/OrcaSlicer_fr.po | 129 ++++++++++++++++++- localization/i18n/hu/OrcaSlicer_hu.po | 129 ++++++++++++++++++- localization/i18n/it/OrcaSlicer_it.po | 129 ++++++++++++++++++- localization/i18n/ja/OrcaSlicer_ja.po | 129 ++++++++++++++++++- localization/i18n/ko/OrcaSlicer_ko.po | 135 ++++++++++++++++++-- localization/i18n/lt/OrcaSlicer_lt.po | 129 ++++++++++++++++++- localization/i18n/nl/OrcaSlicer_nl.po | 129 ++++++++++++++++++- localization/i18n/pl/OrcaSlicer_pl.po | 129 ++++++++++++++++++- localization/i18n/pt_BR/OrcaSlicer_pt_BR.po | 127 +++++++++++++++++- localization/i18n/ru/OrcaSlicer_ru.po | 129 ++++++++++++++++++- localization/i18n/sv/OrcaSlicer_sv.po | 129 ++++++++++++++++++- localization/i18n/th/OrcaSlicer_th.po | 129 ++++++++++++++++++- localization/i18n/tr/OrcaSlicer_tr.po | 129 ++++++++++++++++++- localization/i18n/uk/OrcaSlicer_uk.po | 129 ++++++++++++++++++- localization/i18n/vi/OrcaSlicer_vi.po | 129 ++++++++++++++++++- localization/i18n/zh_CN/OrcaSlicer_zh_CN.po | 129 ++++++++++++++++++- localization/i18n/zh_TW/OrcaSlicer_zh_TW.po | 131 ++++++++++++++++++- 24 files changed, 2867 insertions(+), 137 deletions(-) diff --git a/localization/i18n/OrcaSlicer.pot b/localization/i18n/OrcaSlicer.pot index 208dd08218..e83112d989 100644 --- a/localization/i18n/OrcaSlicer.pot +++ b/localization/i18n/OrcaSlicer.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -3608,6 +3608,9 @@ msgstr "" msgid "Arranging" msgstr "" +msgid "Arranging " +msgstr "" + msgid "Arranging canceled." msgstr "" @@ -8661,6 +8664,17 @@ msgstr "" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "" +msgid "Dimmed layer brightness" +msgstr "" + +msgid "%" +msgstr "" + +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" + msgid "Login region" msgstr "" @@ -12357,12 +12371,26 @@ msgstr "" msgid "Intra-layer order" msgstr "" -msgid "Print order within a single layer." +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." msgstr "" msgid "As object list" msgstr "" +msgid "Best of all (shortest path)" +msgstr "" + +msgid "Snake" +msgstr "" + msgid "Slow printing down for better layer cooling" msgstr "" @@ -17218,6 +17246,15 @@ msgid "" "Please select one that should be used." msgstr "" +msgid "Auto-scale for nozzle" +msgstr "" + +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" + msgid "PA Calibration" msgstr "" @@ -17340,6 +17377,12 @@ msgstr "" msgid "End speed: " msgstr "" +msgid "Auto-adjust to max volumetric speed" +msgstr "" + +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "" + msgid "" "Please input valid values:\n" "start > 10\n" @@ -17347,6 +17390,39 @@ msgid "" "end > start + step" msgstr "" +#, possible-c-format, possible-boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" + +msgid "Continue anyway?" +msgstr "" + +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "" + +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "" + msgid "Start retraction length: " msgstr "" diff --git a/localization/i18n/ca/OrcaSlicer_ca.po b/localization/i18n/ca/OrcaSlicer_ca.po index 92e367eaf5..ab80943ca0 100644 --- a/localization/i18n/ca/OrcaSlicer_ca.po +++ b/localization/i18n/ca/OrcaSlicer_ca.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: 2025-03-15 10:55+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -3931,6 +3931,10 @@ msgstr "Organitzant..." msgid "Arranging" msgstr "Organitzant" +# AI Translated +msgid "Arranging " +msgstr "Organitzant " + msgid "Arranging canceled." msgstr "S'ha cancel·lat l'ordenació." @@ -9350,6 +9354,21 @@ msgstr "Enfosquir les capes inferiors" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "En desplaçar el control lliscant de capes a la previsualització laminada, mostra enfosquides les capes per sota de l'actual, de manera que només la capa que s'està visualitzant es vegi amb la lluminositat completa." +# AI Translated +msgid "Dimmed layer brightness" +msgstr "Brillantor de les capes enfosquides" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"Amb quina brillantor es mostren les capes enfosquides quan \"Enfosquir les capes inferiors\" està activat.\n" +"99% amb prou feines s'enfosqueix, 0% les mostra negres. Limitat al 99% perquè el 100% seria el mateix que desactivar l'opció." + msgid "Login region" msgstr "Regió d'inici de sessió" @@ -13494,12 +13513,37 @@ msgstr "Objecte" msgid "Intra-layer order" msgstr "Ordre intracapa" -msgid "Print order within a single layer." -msgstr "Ordre d'impressió dins d'una sola capa" +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"Ordre en què es visiten les instàncies dels objectes dins d'una mateixa capa, que determina quant recorregut es dedica a moure's entre elles.\n" +"\n" +"Per defecte: encadenament pel veí més proper, refinat amb 2-opt i eliminació de creuaments. Una bona opció general.\n" +"Com a llista d'objectes: les instàncies s'imprimeixen en el mateix ordre que la llista d'objectes, sense cap optimització del recorregut. Feu-lo servir quan necessiteu un ordre previsible i controlat manualment.\n" +"La millor de totes (camí més curt): s'avaluen totes les estratègies i s'utilitza la més curta. L'ordre de les instàncies dels objectes es decideix una sola vegada per a tota la impressió, mentre que l'ordre de les illes individuals es decideix per capa, de manera que capes diferents poden acabar utilitzant estratègies diferents. El laminat és una mica més lent.\n" +"Serpentí: recorregut en serpentina, fila per fila, refinat amb 2-opt. Adequat per a graelles regulars de moltes peces petites.\n" +"\n" +"Amb diversos filaments o eines a la mateixa capa, minimitzar els canvis d'eina té prioritat: els objectes s'agrupen primer per filament i aquest paràmetre només ordena les instàncies dins de cada grup de filament, de manera que la seqüència global pot no semblar el camí més curt per la safata." msgid "As object list" msgstr "Com a llista d'objectes" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "La millor de totes (camí més curt)" + +# AI Translated +msgid "Snake" +msgstr "Serpentí" + msgid "Slow printing down for better layer cooling" msgstr "Reduir la velocitat d'impressió per millorar la refrigeració de les capes" @@ -18927,6 +18971,20 @@ msgstr "" "Hi ha diverses adreces IP que responen al nom d'amfitrió( host ) %1%.\n" "Seleccioneu-ne la que s'hagi d'utilitzar." +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "Escala automàtica segons el broquet" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"Aquest model està dissenyat per a un broquet de 0,4 mm amb una alçada de capa de 0,2 mm. \n" +"Quan l'opció d'escalat està activada (recomanat), es redimensiona dinàmicament per adaptar-se al diàmetre del broquet actual i a una alçada de capa adequada, cosa que fa que la prova sigui precisa i fàcil de llegir.\n" +"Desactiveu l'escalat només si voleu imprimir el model de referència exactament tal com és." + msgid "PA Calibration" msgstr "Calibratge PA( Pressure Advance )" @@ -19063,6 +19121,14 @@ msgstr "Velocitat d'inici: " msgid "End speed: " msgstr "Velocitat final: " +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "Ajust automàtic a la velocitat volumètrica màxima" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "Si la velocitat final superés la velocitat volumètrica màxima del filament, redueix automàticament l'alçada de capa (mantenint valors estàndard i respectant els límits de la màquina) per assolir-la. Si ni tan sols l'alçada de capa mínima és suficient, redueix la velocitat final." + msgid "" "Please input valid values:\n" "start > 10\n" @@ -19074,6 +19140,57 @@ msgstr "" "pas >= 0\n" "final >inici + pas )" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"La velocitat final (%.0f mm/s) supera la velocitat volumètrica màxima del filament (%.1f mm³/s), cosa que limita el perímetre exterior a uns %.0f mm/s amb aquesta amplada de línia i alçada de capa.\n" +" Les velocitats superiors es retallaran, de manera que els blocs superiors de la torre no s'imprimiran a la velocitat sol·licitada.\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"La velocitat final (%.0f mm/s) supera la velocitat volumètrica màxima del filament (%.1f mm³/s) amb l'alçada de capa per defecte (%.2f mm).\n" +"\n" +"L'alçada de capa s'ha reduït a %.2f mm (un valor utilitzat pels perfils d'aquesta impressora) perquè la torre pugui assolir la velocitat sol·licitada." + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"Fins i tot amb l'alçada de capa més petita utilitzada pels perfils d'aquesta impressora (%.2f mm), la velocitat final (%.0f mm/s) supera la velocitat volumètrica màxima del filament (%.1f mm³/s).\n" +"\n" +"L'alçada de capa s'establirà a %.2f mm i la velocitat final es reduirà a %.0f mm/s.\n" +"\n" +"Voleu continuar?" + +# AI Translated +msgid "Continue anyway?" +msgstr "Voleu continuar igualment?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Voleu activar \"Ajust automàtic\" per corregir-ho automàticament o continuar igualment?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Voleu activar \"Escala automàtica segons el broquet\" i \"Ajust automàtic\" per corregir-ho automàticament o continuar igualment?" + msgid "Start retraction length: " msgstr "Longitud de la retracció d'inici: " @@ -21770,6 +21887,9 @@ msgstr "" "Evitar la deformació( warping )\n" "Sabíeu que quan imprimiu materials propensos a deformar-se, com ara l'ABS, augmentar adequadament la temperatura del llit pot reduir la probabilitat de deformació?" +#~ msgid "Print order within a single layer." +#~ msgstr "Ordre d'impressió dins d'una sola capa" + #~ msgid "Bottom" #~ msgstr "Inferior" @@ -21856,9 +21976,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "°C" -#~ msgid "%" -#~ msgstr "%" - #~ msgid "Continue to sync filaments" #~ msgstr "Continua sincronitzant filaments" diff --git a/localization/i18n/cs/OrcaSlicer_cs.po b/localization/i18n/cs/OrcaSlicer_cs.po index 6f991f6996..63b69765d7 100644 --- a/localization/i18n/cs/OrcaSlicer_cs.po +++ b/localization/i18n/cs/OrcaSlicer_cs.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: \n" "Last-Translator: Jakub Hencl\n" "Language-Team: \n" @@ -3888,6 +3888,10 @@ msgstr "Uspořádání..." msgid "Arranging" msgstr "Uspořádání" +# AI Translated +msgid "Arranging " +msgstr "Rozkládání " + msgid "Arranging canceled." msgstr "Uspořádání zrušeno." @@ -9305,6 +9309,21 @@ msgstr "Ztmavit nižší vrstvy" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "Při posouvání posuvníku vrstev v náhledu po slicování vykresluje vrstvy pod aktuální ztmavené, takže v plném jasu je zobrazena pouze prohlížená vrstva." +# AI Translated +msgid "Dimmed layer brightness" +msgstr "Jas ztmavených vrstev" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"Jak jasně se vykreslují ztmavené vrstvy, když je zapnuta volba „Ztmavit nižší vrstvy“.\n" +"99 % znamená sotva znatelné ztmavení, 0 % je vykreslí černě. Maximum je 99 %, protože 100 % by odpovídalo vypnutí této volby." + msgid "Login region" msgstr "Oblast přihlášení" @@ -13475,12 +13494,37 @@ msgstr "Podle objektu" msgid "Intra-layer order" msgstr "Pořadí v rámci vrstvy" -msgid "Print order within a single layer." -msgstr "Pořadí tisku v rámci jedné vrstvy." +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"Pořadí, v jakém se v rámci jedné vrstvy navštěvují instance objektů; určuje, kolik přejezdů se stráví přesuny mezi nimi.\n" +"\n" +"Výchozí: řetězení metodou nejbližšího souseda, doladěné algoritmem 2-opt a odstraněním křížení. Dobrá volba pro obecné použití.\n" +"Jako seznam objektů: instance se tisknou ve stejném pořadí jako v seznamu objektů, bez jakékoli optimalizace dráhy. Použijte, když potřebujete předvídatelné, ručně řízené pořadí.\n" +"Nejlepší ze všech (nejkratší dráha): vyhodnotí se všechny strategie a použije se ta nejkratší. Pořadí instancí objektů se určí jednou pro celý tisk, zatímco pořadí jednotlivých ostrůvků se určuje pro každou vrstvu zvlášť, takže různé vrstvy mohou nakonec používat různé strategie. Slicování je mírně pomalejší.\n" +"Hadovitě: klikaté procházení řádek po řádku, doladěné algoritmem 2-opt. Vhodné pro pravidelné mřížky mnoha malých dílů.\n" +"\n" +"Pokud je v téže vrstvě více filamentů nebo nástrojů, má přednost minimalizace výměn nástroje: objekty se nejprve seskupí podle filamentu a toto nastavení pak řadí pouze instance uvnitř každé skupiny, takže celková posloupnost nemusí vypadat jako nejkratší dráha po desce." msgid "As object list" msgstr "Jako seznam objektů" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "Nejlepší ze všech (nejkratší dráha)" + +# AI Translated +msgid "Snake" +msgstr "Hadovitě" + msgid "Slow printing down for better layer cooling" msgstr "Zpomalit tisk pro lepší chlazení vrstvy" @@ -18850,6 +18894,20 @@ msgstr "" "Ke jménu hostitele %1% je přiřazeno několik IP adres.\n" "Vyberte prosím jednu, která má být použita." +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "Automatické měřítko podle trysky" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"Tento model je navržen pro trysku 0,4 mm a výšku vrstvy 0,2 mm. \n" +"Je-li volba změny měřítka zapnuta (doporučeno), model se dynamicky přizpůsobí průměru vaší současné trysky a odpovídající výšce vrstvy, takže je test přesný a dobře čitelný.\n" +"Měřítko vypněte pouze tehdy, chcete-li vytisknout referenční model přesně tak, jak je." + msgid "PA Calibration" msgstr "PA kalibrace" @@ -18988,6 +19046,14 @@ msgstr "Počáteční rychlost: " msgid "End speed: " msgstr "Konec rychlosti: " +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "Automaticky přizpůsobit maximální objemové rychlosti" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "Pokud by koncová rychlost překročila maximální objemovou rychlost filamentu, automaticky snížit výšku vrstvy (se zachováním standardních hodnot a v rámci limitů stroje), aby jí bylo možné dosáhnout. Pokud nestačí ani minimální výška vrstvy, sníží se místo toho koncová rychlost." + msgid "" "Please input valid values:\n" "start > 10\n" @@ -18999,6 +19065,57 @@ msgstr "" "krok >= 0\n" "konec > start + krok" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"Koncová rychlost (%.0f mm/s) překračuje maximální objemovou rychlost filamentu (%.1f mm³/s), která při této šířce čáry a výšce vrstvy omezuje vnější stěnu na přibližně %.0f mm/s.\n" +" Vyšší rychlosti budou oříznuty, takže horní bloky věže se nevytisknou požadovanou rychlostí.\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"Koncová rychlost (%.0f mm/s) překračuje maximální objemovou rychlost filamentu (%.1f mm³/s) při výchozí výšce vrstvy (%.2f mm).\n" +"\n" +"Výška vrstvy byla snížena na %.2f mm (hodnota používaná profily této tiskárny), aby věž mohla dosáhnout požadované rychlosti." + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"I při nejmenší výšce vrstvy používané profily této tiskárny (%.2f mm) koncová rychlost (%.0f mm/s) překračuje maximální objemovou rychlost filamentu (%.1f mm³/s).\n" +"\n" +"Výška vrstvy bude nastavena na %.2f mm a koncová rychlost snížena na %.0f mm/s.\n" +"\n" +"Pokračovat?" + +# AI Translated +msgid "Continue anyway?" +msgstr "Přesto pokračovat?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Zapnout „Automaticky přizpůsobit“ pro automatickou nápravu, nebo přesto pokračovat?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Zapnout „Automatické měřítko podle trysky“ a „Automaticky přizpůsobit“ pro automatickou nápravu, nebo přesto pokračovat?" + msgid "Start retraction length: " msgstr "Počáteční délka retrakce: " @@ -21756,6 +21873,9 @@ msgstr "" "Zamezte kroucení\n" "Víte, že při tisku materiálů náchylných ke kroucení, jako je ABS, může vhodné zvýšení teploty vyhřívané desky snížit pravděpodobnost kroucení?" +#~ msgid "Print order within a single layer." +#~ msgstr "Pořadí tisku v rámci jedné vrstvy." + #~ msgid "Bottom" #~ msgstr "Dole" @@ -21824,9 +21944,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "°C" -#~ msgid "%" -#~ msgstr "%" - #~ msgid "Align infill direction to model" #~ msgstr "Zarovnat směr výplně podle modelu" diff --git a/localization/i18n/de/OrcaSlicer_de.po b/localization/i18n/de/OrcaSlicer_de.po index bf304e2e54..b9389f5399 100644 --- a/localization/i18n/de/OrcaSlicer_de.po +++ b/localization/i18n/de/OrcaSlicer_de.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: \n" "Last-Translator: Heiko Liebscher \n" "Language-Team: \n" @@ -3804,6 +3804,10 @@ msgstr "Anordnen..." msgid "Arranging" msgstr "Anordnen" +# AI Translated +msgid "Arranging " +msgstr "Anordnen " + msgid "Arranging canceled." msgstr "Anordnen abgebrochen." @@ -9152,6 +9156,21 @@ msgstr "Untere Schichten abdunkeln" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "Beim Bewegen des Schichtreglers in der geslicten Vorschau werden die Schichten unterhalb der aktuellen abgedunkelt dargestellt, sodass nur die betrachtete Schicht in voller Helligkeit angezeigt wird." +# AI Translated +msgid "Dimmed layer brightness" +msgstr "Helligkeit abgedunkelter Schichten" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"Wie hell die abgedunkelten Schichten dargestellt werden, wenn \"Untere Schichten abdunkeln\" aktiviert ist.\n" +"99% ist kaum abgedunkelt, 0% stellt sie schwarz dar. Auf 99% begrenzt, da 100% dem Deaktivieren der Option entsprechen würde." + msgid "Login region" msgstr "Anmeldungsregion" @@ -13180,12 +13199,37 @@ msgstr "Nach Objekt" msgid "Intra-layer order" msgstr "Intra-Schicht-Reihenfolge" -msgid "Print order within a single layer." -msgstr "Druckreihenfolge innerhalb einer einzelnen Schicht" +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"Reihenfolge, in der die Objektinstanzen innerhalb einer einzelnen Schicht angefahren werden. Sie bestimmt, wie viel Eilgang für die Bewegung zwischen ihnen aufgewendet wird.\n" +"\n" +"Standard: Verkettung nach dem nächsten Nachbarn, verfeinert mit 2-opt und Entfernen von Überkreuzungen. Eine gute allgemeine Wahl.\n" +"Als Objektliste: Die Instanzen werden in derselben Reihenfolge wie in der Objektliste gedruckt, ohne jede Pfadoptimierung. Verwenden Sie diese Option, wenn Sie eine vorhersehbare, manuell gesteuerte Reihenfolge benötigen.\n" +"Bestes Ergebnis (kürzester Weg): Alle Strategien werden ausgewertet und die kürzeste wird verwendet. Die Reihenfolge der Objektinstanzen wird einmal für den gesamten Druck festgelegt, während die Reihenfolge der einzelnen Inseln pro Schicht bestimmt wird, sodass verschiedene Schichten unterschiedliche Strategien verwenden können. Etwas langsameres Slicing.\n" +"Schlangenlinie: Zeilenweiser Mäanderverlauf, verfeinert mit 2-opt. Gut geeignet für regelmäßige Raster aus vielen kleinen Teilen.\n" +"\n" +"Bei mehreren Filamenten oder Werkzeugen in derselben Schicht hat das Minimieren der Werkzeugwechsel Vorrang: Objekte werden zuerst nach Filament gruppiert und diese Einstellung ordnet nur die Instanzen innerhalb jeder Filamentgruppe. Die Gesamtabfolge sieht daher möglicherweise nicht wie der kürzeste Weg über die Platte aus." msgid "As object list" msgstr "Als Objektliste" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "Bestes Ergebnis (kürzester Weg)" + +# AI Translated +msgid "Snake" +msgstr "Schlangenlinie" + msgid "Slow printing down for better layer cooling" msgstr "Verlangsamen Sie den Druck für eine bessere Schichtkühlung" @@ -18487,6 +18531,20 @@ msgstr "" "Es gibt mehrere IP-Adressen, die zu Hostname %1% auflösen.\n" "Bitte wählen Sie eine aus, die verwendet werden soll." +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "Automatisch an Düse skalieren" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"Dieses Modell ist für eine 0,4 mm Düse mit einer Schichthöhe von 0,2 mm ausgelegt. \n" +"Wenn die Skalierungsoption aktiviert ist (empfohlen), wird das Modell dynamisch an Ihren aktuellen Düsendurchmesser und eine passende Schichthöhe angepasst, sodass der Test sowohl genau als auch gut ablesbar ist.\n" +"Deaktivieren Sie die Skalierung nur, wenn Sie das Referenzmodell exakt so drucken möchten, wie es ist." + msgid "PA Calibration" msgstr "PA Kalibrierung" @@ -18623,6 +18681,14 @@ msgstr "Startgeschwindigkeit" msgid "End speed: " msgstr "Endgeschwindigkeit" +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "Automatisch an maximale Volumengeschwindigkeit anpassen" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "Wenn die Endgeschwindigkeit die maximale Volumengeschwindigkeit des Filaments überschreiten würde, wird die Schichthöhe automatisch verringert (unter Beibehaltung üblicher Werte und innerhalb der Grenzen der Maschine), um sie zu erreichen. Reicht selbst die minimale Schichthöhe nicht aus, wird stattdessen die Endgeschwindigkeit gesenkt." + msgid "" "Please input valid values:\n" "start > 10\n" @@ -18634,6 +18700,57 @@ msgstr "" "Schritt >= 0\n" "Ende > Start + Schritt" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"Die Endgeschwindigkeit (%.0f mm/s) überschreitet die maximale Volumengeschwindigkeit des Filaments (%.1f mm³/s), wodurch die Außenwand bei dieser Linienbreite und Schichthöhe auf etwa %.0f mm/s begrenzt wird.\n" +" Höhere Geschwindigkeiten werden begrenzt, sodass die oberen Blöcke des Turms nicht mit der gewünschten Geschwindigkeit gedruckt werden.\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"Die Endgeschwindigkeit (%.0f mm/s) überschreitet die maximale Volumengeschwindigkeit des Filaments (%.1f mm³/s) bei der Standard-Schichthöhe (%.2f mm).\n" +"\n" +"Die Schichthöhe wurde auf %.2f mm verringert (ein Wert, der in den Profilen dieses Druckers verwendet wird), damit der Turm die gewünschte Geschwindigkeit erreichen kann." + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"Selbst bei der kleinsten Schichthöhe, die in den Profilen dieses Druckers verwendet wird (%.2f mm), überschreitet die Endgeschwindigkeit (%.0f mm/s) die maximale Volumengeschwindigkeit des Filaments (%.1f mm³/s).\n" +"\n" +"Die Schichthöhe wird auf %.2f mm gesetzt und die Endgeschwindigkeit auf %.0f mm/s verringert.\n" +"\n" +"Fortfahren?" + +# AI Translated +msgid "Continue anyway?" +msgstr "Trotzdem fortfahren?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "\"Automatisch anpassen\" aktivieren, um dies automatisch zu beheben, oder trotzdem fortfahren?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "\"Automatisch an Düse skalieren\" und \"Automatisch anpassen\" aktivieren, um dies automatisch zu beheben, oder trotzdem fortfahren?" + msgid "Start retraction length: " msgstr "Start Rückzugslänge" @@ -21169,6 +21286,9 @@ msgstr "" "Verwerfungen vermeiden\n" "Wussten Sie, dass beim Drucken von Materialien, die zu Verwerfungen neigen, wie z.B. ABS, durch eine entsprechende Erhöhung der Heizbetttemperatur die Wahrscheinlichkeit von Verwerfungen verringert werden kann?" +#~ msgid "Print order within a single layer." +#~ msgstr "Druckreihenfolge innerhalb einer einzelnen Schicht" + #~ msgid "Bottom" #~ msgstr "Unten" @@ -21261,9 +21381,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "°C" -#~ msgid "%" -#~ msgstr "%" - #~ msgid "Renders cast shadows on the plate in realistic view." #~ msgstr "Zeigt geworfene Schatten auf der Platte in der realistischen Ansicht an." diff --git a/localization/i18n/en/OrcaSlicer_en.po b/localization/i18n/en/OrcaSlicer_en.po index 95d357b79b..eb25f226ee 100644 --- a/localization/i18n/en/OrcaSlicer_en.po +++ b/localization/i18n/en/OrcaSlicer_en.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: 2026-06-17 15:44-0300\n" "Last-Translator: Alexandre Folle de Menezes\n" "Language-Team: \n" @@ -3604,6 +3604,9 @@ msgstr "" msgid "Arranging" msgstr "" +msgid "Arranging " +msgstr "" + msgid "Arranging canceled." msgstr "" @@ -8657,6 +8660,17 @@ msgstr "" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "" +msgid "Dimmed layer brightness" +msgstr "" + +msgid "%" +msgstr "" + +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" + msgid "Login region" msgstr "" @@ -12353,12 +12367,26 @@ msgstr "" msgid "Intra-layer order" msgstr "" -msgid "Print order within a single layer." +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." msgstr "" msgid "As object list" msgstr "" +msgid "Best of all (shortest path)" +msgstr "" + +msgid "Snake" +msgstr "" + msgid "Slow printing down for better layer cooling" msgstr "" @@ -17214,6 +17242,15 @@ msgid "" "Please select one that should be used." msgstr "" +msgid "Auto-scale for nozzle" +msgstr "" + +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" + msgid "PA Calibration" msgstr "" @@ -17336,6 +17373,12 @@ msgstr "" msgid "End speed: " msgstr "" +msgid "Auto-adjust to max volumetric speed" +msgstr "" + +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "" + msgid "" "Please input valid values:\n" "start > 10\n" @@ -17343,6 +17386,39 @@ msgid "" "end > start + step" msgstr "" +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" + +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" + +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" + +msgid "Continue anyway?" +msgstr "" + +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "" + +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "" + msgid "Start retraction length: " msgstr "" diff --git a/localization/i18n/es/OrcaSlicer_es.po b/localization/i18n/es/OrcaSlicer_es.po index 8bf5a56421..c1709fe45f 100644 --- a/localization/i18n/es/OrcaSlicer_es.po +++ b/localization/i18n/es/OrcaSlicer_es.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: \n" "Last-Translator: Ian A. Bassi <>\n" "Language-Team: \n" @@ -3686,6 +3686,10 @@ msgstr "Organizando..." msgid "Arranging" msgstr "Organizando" +# AI Translated +msgid "Arranging " +msgstr "Organizando " + msgid "Arranging canceled." msgstr "Organización cancelada." @@ -8931,6 +8935,21 @@ msgstr "Atenuar las capas inferiores" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "Al desplazar el control deslizante de capas en la vista previa laminada, oscurece las capas inferiores a la actual para que solo la capa visualizada se muestre a pleno brillo." +# AI Translated +msgid "Dimmed layer brightness" +msgstr "Brillo de las capas atenuadas" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"Con qué brillo se muestran las capas atenuadas cuando \"Atenuar las capas inferiores\" está activado.\n" +"99% apenas se oscurece y 0% las muestra en negro. Está limitado al 99% porque el 100% equivaldría a desactivar la opción." + msgid "Login region" msgstr "Región de inicio de sesión" @@ -12881,12 +12900,37 @@ msgstr "Por objeto" msgid "Intra-layer order" msgstr "Orden dentro de la capa" -msgid "Print order within a single layer." -msgstr "Orden de impresión dentro de cada capa." +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"Orden en el que se recorren las instancias de objeto dentro de una misma capa, lo que determina cuánto desplazamiento se emplea para moverse entre ellas.\n" +"\n" +"Por defecto: encadenado por vecino más cercano, refinado con 2-opt y eliminación de cruces. Una buena opción general.\n" +"Como lista de objetos: las instancias se imprimen en el mismo orden que la lista de objetos, sin ninguna optimización de trayectoria. Úselo cuando necesite un orden predecible y controlado manualmente.\n" +"La mejor de todas (trayectoria más corta): se evalúan todas las estrategias y se utiliza la más corta. El orden de las instancias de objeto se decide una sola vez para toda la impresión, mientras que el orden de las islas individuales se decide capa por capa, por lo que distintas capas pueden acabar usando estrategias diferentes. El laminado es algo más lento.\n" +"Serpentina: recorrido serpenteante fila por fila, refinado con 2-opt. Muy adecuado para rejillas regulares de muchas piezas pequeñas.\n" +"\n" +"Con varios filamentos o herramientas en la misma capa, minimizar los cambios de herramienta tiene prioridad: los objetos se agrupan primero por filamento y este ajuste solo ordena las instancias dentro de cada grupo de filamento, por lo que la secuencia global puede no parecer la trayectoria más corta a lo largo de la cama." msgid "As object list" msgstr "Como lista de objetos" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "La mejor de todas (trayectoria más corta)" + +# AI Translated +msgid "Snake" +msgstr "Serpentina" + msgid "Slow printing down for better layer cooling" msgstr "Reducir la velocidad de impresión para mejorar la refrigeración de las capas" @@ -18122,6 +18166,20 @@ msgstr "" "Hay varias direcciones IP resueltas del nombre del host %1%.\n" "Por favor, seleccione la que debe usarse." +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "Escalar automáticamente para la boquilla" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"Este modelo está diseñado para una boquilla de 0,4 mm con una altura de la capa de 0,2 mm. \n" +"Cuando la opción de escalado está activada (recomendado), el modelo se redimensiona dinámicamente para adaptarse al diámetro de boquilla actual y a una altura de capa adecuada, lo que hace que la prueba sea precisa y fácil de leer.\n" +"Desactive el escalado solo si desea imprimir el modelo de referencia exactamente tal cual." + msgid "PA Calibration" msgstr "Calibración PA" @@ -18258,6 +18316,14 @@ msgstr "Velocidad inicial: " msgid "End speed: " msgstr "Velocidad final: " +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "Ajustar automáticamente a la velocidad volumétrica máxima" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "Si la velocidad final superara la velocidad volumétrica máxima del filamento, se reduce automáticamente la altura de la capa (manteniendo valores estándar y dentro de los límites de la máquina) para alcanzarla. Si ni siquiera la altura de capa mínima es suficiente, se reduce la velocidad final." + msgid "" "Please input valid values:\n" "start > 10\n" @@ -18269,6 +18335,57 @@ msgstr "" "incremento >=0\n" "final > inicio + paso" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"La velocidad final (%.0f mm/s) supera la velocidad volumétrica máxima del filamento (%.1f mm³/s), lo que limita el perímetro externo a unos %.0f mm/s con este ancho de línea y esta altura de capa.\n" +" Las velocidades superiores se recortarán, por lo que los bloques superiores de la torre no se imprimirán a la velocidad solicitada.\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"La velocidad final (%.0f mm/s) supera la velocidad volumétrica máxima del filamento (%.1f mm³/s) con la altura de capa predeterminada (%.2f mm).\n" +"\n" +"La altura de la capa se ha reducido a %.2f mm (un valor usado por los perfiles de esta impresora) para que la torre pueda alcanzar la velocidad solicitada." + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"Incluso con la altura de capa más pequeña usada por los perfiles de esta impresora (%.2f mm), la velocidad final (%.0f mm/s) supera la velocidad volumétrica máxima del filamento (%.1f mm³/s).\n" +"\n" +"La altura de la capa se establecerá en %.2f mm y la velocidad final se reducirá a %.0f mm/s.\n" +"\n" +"¿Continuar?" + +# AI Translated +msgid "Continue anyway?" +msgstr "¿Continuar de todos modos?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "¿Activar \"Ajuste automático\" para corregir esto automáticamente o continuar de todos modos?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "¿Activar \"Escalar automáticamente para la boquilla\" y \"Ajuste automático\" para corregir esto automáticamente o continuar de todos modos?" + msgid "Start retraction length: " msgstr "Longitud de retracción inicial: " @@ -20744,6 +20861,9 @@ msgstr "" "Evita la deformación\n" "¿Sabías que al imprimir materiales propensos a la deformación como el ABS, aumentar adecuadamente la temperatura de la cama térmica puede reducir la probabilidad de deformaciones?" +#~ msgid "Print order within a single layer." +#~ msgstr "Orden de impresión dentro de cada capa." + #~ msgid "Bottom" #~ msgstr "Inferior" @@ -20837,9 +20957,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "°C" -#~ msgid "%" -#~ msgstr "%" - #~ msgid "Anisotropic surfaces" #~ msgstr "Superficies anisótropas" diff --git a/localization/i18n/eu/OrcaSlicer_eu.po b/localization/i18n/eu/OrcaSlicer_eu.po index ccad5d6d47..db9235b8c1 100644 --- a/localization/i18n/eu/OrcaSlicer_eu.po +++ b/localization/i18n/eu/OrcaSlicer_eu.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: 2026-07-20 13:33+0200\n" "Last-Translator: Manu Goiogana \n" "Language-Team: \n" @@ -3724,6 +3724,10 @@ msgstr "Antolatzen..." msgid "Arranging" msgstr "Antolaketa" +# AI Translated +msgid "Arranging " +msgstr "Antolatzen " + msgid "Arranging canceled." msgstr "Antolaketa bertan behera utzi da." @@ -8999,6 +9003,21 @@ msgstr "Ilundu beheko geruzak" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "Xerratutako aurrebistan geruza-graduatzailea mugitzean, unekoaren azpiko geruzak ilunduta erakusten ditu, ikusten ari den geruza soilik distira osoz ager dadin." +# AI Translated +msgid "Dimmed layer brightness" +msgstr "Ilundutako geruzen distira" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"\"Ilundu beheko geruzak\" gaituta dagoenean ilundutako geruzak zein distiratsu marrazten diren.\n" +"%99 balioak ozta-ozta iluntzen ditu, %0 balioak beltz bihurtzen ditu. Gehienez %99 onartzen da, %100 balioak aukera desgaitzearen gauza bera egingo bailuke." + msgid "Login region" msgstr "Saio-hasierako eskualdea" @@ -12992,12 +13011,37 @@ msgstr "Objektuka" msgid "Intra-layer order" msgstr "Geruza barruko ordena" -msgid "Print order within a single layer." -msgstr "Geruza bakarreko inprimatze-ordena." +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"Geruza bakar baten barruan objektu-instantziak zein ordenatan bisitatzen diren; horrek zehazten du zenbat desplazamendu behar den haien artean mugitzeko.\n" +"\n" +"Lehenetsia: auzokide hurbilenaren araberako kateaketa, 2-opt bidez eta gurutzaketak kenduz findua. Aukera orokor ona.\n" +"Objektu-zerrenda bezala: instantziak objektu-zerrendaren ordena berean inprimatzen dira, ibilbidea batere optimizatu gabe. Erabili ordena aurreikusgarri eta eskuz kontrolatu bat behar duzunean.\n" +"Guztien onena (ibilbide laburrena): estrategia guztiak ebaluatzen dira eta laburrena erabiltzen da. Objektu-instantzien ordena behin erabakitzen da inprimaketa osorako, eta uharte bakoitzaren ordena geruzaz geruza erabakitzen da; beraz, geruza desberdinek estrategia desberdinak erabil ditzakete. Xerratzea apur bat motelagoa da.\n" +"Sigi-saga: errenkadaz errenkadako sigi-saga ibilbidea, 2-opt bidez findua. Oso egokia pieza txiki askoren sareta erregularretarako.\n" +"\n" +"Geruza berean filamentu edo tresna bat baino gehiago daudenean, tresna-aldaketak gutxitzeak du lehentasuna: objektuak filamentuaren arabera multzokatzen dira lehenik, eta ezarpen honek filamentu-multzo bakoitzaren barruko instantziak baino ez ditu ordenatzen; beraz, baliteke sekuentzia orokorrak plaka osoko ibilbide laburrenaren itxurarik ez izatea." msgid "As object list" msgstr "Objektu-zerrenda bezala" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "Guztien onena (ibilbide laburrena)" + +# AI Translated +msgid "Snake" +msgstr "Sigi-saga" + msgid "Slow printing down for better layer cooling" msgstr "Moteldu inprimaketa geruza hobeto hozteko" @@ -18269,6 +18313,20 @@ msgstr "" "Hainbat IP helbide ebazten dira %1% ostalari-izenerako.\n" "Hautatu erabili beharrekoa." +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "Eskalatze automatikoa pitarako" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"Modelo hau 0,4 mm-ko pita eta 0,2 mm-ko geruza-altuera kontuan hartuta diseinatu da. \n" +"Eskalatze-aukera gaituta dagoenean (gomendatua), tamaina dinamikoki egokitzen zaie zure uneko pita-diametroari eta geruza-altuera egoki bati, testa zehatza eta irakurterraza izan dadin.\n" +"Itzali eskalatzea erreferentzia-modeloa dagoen-dagoenean inprimatu nahi baduzu bakarrik." + msgid "PA Calibration" msgstr "PA kalibrazioa" @@ -18406,6 +18464,14 @@ msgstr "Hasierako abiadura: " msgid "End speed: " msgstr "Amaierako abiadura: " +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "Doikuntza automatikoa abiadura bolumetriko maximora" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "Amaierako abiadurak filamentuaren abiadura bolumetriko maximoa gaindituko balu, geruza-altuera automatikoki jaisten da (balio estandarrak mantenduz eta makinaren mugen barruan) hura lortzeko. Gutxieneko geruza-altuerarekin ere nahikoa ez bada, amaierako abiadura jaisten da haren ordez." + msgid "" "Please input valid values:\n" "start > 10\n" @@ -18417,6 +18483,57 @@ msgstr "" "urratsa >= 0\n" "amaiera > hasiera + urratsa" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"Amaierako abiadurak (%.0f mm/s) filamentuaren abiadura bolumetriko maximoa (%.1f mm³/s) gainditzen du, eta horrek kanpoko horma gutxi gorabehera %.0f mm/s-ra mugatzen du lerro-zabalera eta geruza-altuera honekin.\n" +" Horren gaineko abiadurak mugatu egingo dira, beraz dorrearen goiko blokeak ez dira eskatutako abiaduran inprimatuko.\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"Amaierako abiadurak (%.0f mm/s) filamentuaren abiadura bolumetriko maximoa (%.1f mm³/s) gainditzen du geruza-altuera lehenetsian (%.2f mm).\n" +"\n" +"Geruza-altuera %.2f mm-ra jaitsi da (inprimagailu honen aurrezarpenek erabiltzen duten balio bat), dorreak eskatutako abiadura lor dezan." + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"Inprimagailu honen aurrezarpenek erabiltzen duten geruza-altuera txikienarekin ere (%.2f mm), amaierako abiadurak (%.0f mm/s) filamentuaren abiadura bolumetriko maximoa (%.1f mm³/s) gainditzen du.\n" +"\n" +"Geruza-altuera %.2f mm-ra ezarriko da eta amaierako abiadura %.0f mm/s-ra jaitsiko da.\n" +"\n" +"Jarraitu?" + +# AI Translated +msgid "Continue anyway?" +msgstr "Hala ere jarraitu?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Gaitu \"Doikuntza automatikoa\" hau automatikoki konpontzeko, edo hala ere jarraitu?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Gaitu \"Eskalatze automatikoa pitarako\" eta \"Doikuntza automatikoa\" hau automatikoki konpontzeko, edo hala ere jarraitu?" + msgid "Start retraction length: " msgstr "Hasierako atzera-egite luzera: " @@ -20899,6 +21016,9 @@ msgstr "" "Saihestu okertzea\n" "Ba al zenekien ABS bezalako okertzeko joera duten materialak inprimatzean ohe beroaren tenperatura egoki igotzeak okertzeko probabilitatea murriztu dezakeela?" +#~ msgid "Print order within a single layer." +#~ msgstr "Geruza bakarreko inprimatze-ordena." + #~ msgid "Bottom" #~ msgstr "Behekoa" @@ -21028,9 +21148,6 @@ msgstr "" #~ msgid "°" #~ msgstr "°" -#~ msgid "%" -#~ msgstr "%" - #~ msgid "uniform scale" #~ msgstr "eskala uniformea" diff --git a/localization/i18n/fr/OrcaSlicer_fr.po b/localization/i18n/fr/OrcaSlicer_fr.po index 6357703b45..2d0fb14b5c 100644 --- a/localization/i18n/fr/OrcaSlicer_fr.po +++ b/localization/i18n/fr/OrcaSlicer_fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Guislain Cyril, Thomas Lété\n" @@ -3760,6 +3760,10 @@ msgstr "Agencement…" msgid "Arranging" msgstr "Agencement" +# AI Translated +msgid "Arranging " +msgstr "Agencement " + msgid "Arranging canceled." msgstr "Agencement annulé." @@ -9068,6 +9072,21 @@ msgstr "Assombrir les couches inférieures" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "Lors du défilement du curseur de couche dans l'aperçu découpé, affiche les couches situées sous la couche actuelle assombries, de sorte que seule la couche visualisée soit affichée en pleine luminosité." +# AI Translated +msgid "Dimmed layer brightness" +msgstr "Luminosité des couches assombries" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"Luminosité de rendu des couches assombries lorsque « Assombrir les couches inférieures » est activé.\n" +"99% correspond à un assombrissement à peine perceptible, 0% les affiche en noir. Limité à 99% car 100% reviendrait à désactiver l’option." + msgid "Login region" msgstr "Région d'origine" @@ -13087,12 +13106,37 @@ msgstr "Par objet" msgid "Intra-layer order" msgstr "Ordre intra-couche" -msgid "Print order within a single layer." -msgstr "Ordre d’impression au sein d’une même couche" +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"Ordre dans lequel les instances d’objets sont parcourues au sein d’une même couche, ce qui détermine la quantité de déplacements effectués entre elles.\n" +"\n" +"Par défaut : chaînage par plus proche voisin, affiné par 2-opt et suppression des croisements. Un bon choix général.\n" +"En tant que liste d’objets : les instances sont imprimées dans le même ordre que la liste d’objets, sans aucune optimisation de trajet. À utiliser lorsque vous avez besoin d’un ordre prévisible et contrôlé manuellement.\n" +"Meilleur de tous (trajet le plus court) : toutes les stratégies sont évaluées et la plus courte est retenue. L’ordre des instances d’objets est déterminé une seule fois pour toute l’impression, tandis que l’ordre des îlots individuels est déterminé couche par couche ; différentes couches peuvent donc utiliser des stratégies différentes. Découpage légèrement plus lent.\n" +"Serpentin : parcours en serpentin, rangée par rangée, affiné par 2-opt. Bien adapté aux grilles régulières de nombreuses petites pièces.\n" +"\n" +"Avec plusieurs filaments ou outils dans la même couche, la réduction des changements d’outil est prioritaire : les objets sont d’abord regroupés par filament et ce réglage n’ordonne que les instances au sein de chaque groupe de filament ; la séquence globale peut donc ne pas ressembler au trajet le plus court sur la plaque." msgid "As object list" msgstr "En tant que liste d’objets" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "Meilleur de tous (trajet le plus court)" + +# AI Translated +msgid "Snake" +msgstr "Serpentin" + msgid "Slow printing down for better layer cooling" msgstr "Impression lente pour un meilleur refroidissement des couches" @@ -18381,6 +18425,20 @@ msgstr "" "Il existe plusieurs adresses IP résolues par le nom d’hôte %1%.\n" "Veuillez en sélectionner une qui doit être utilisée." +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "Mise à l’échelle automatique selon la buse" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"Ce modèle est conçu pour une buse de 0,4 mm avec une hauteur de couche de 0,2 mm. \n" +"Lorsque l’option de mise à l’échelle est activée (recommandé), il est redimensionné dynamiquement pour correspondre au diamètre de buse actuel et à une hauteur de couche appropriée, ce qui rend le test à la fois précis et facile à lire.\n" +"Ne désactivez la mise à l’échelle que si vous souhaitez imprimer le modèle de référence exactement tel quel." + msgid "PA Calibration" msgstr "Calibration Pressure Advance" @@ -18517,6 +18575,14 @@ msgstr "Vitesse de début: " msgid "End speed: " msgstr "Vitesse de fin: " +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "Ajustement automatique à la vitesse volumétrique maximale" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "Si la vitesse finale devait dépasser la vitesse volumétrique maximale du filament, la hauteur de couche est automatiquement réduite (en conservant des valeurs standard et en restant dans les limites de la machine) pour l’atteindre. Si même la hauteur de couche minimale ne suffit pas, c’est la vitesse finale qui est réduite." + msgid "" "Please input valid values:\n" "start > 10\n" @@ -18528,6 +18594,57 @@ msgstr "" "intervalles >= 0\n" "Fin > Début + Intervalle" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"La vitesse finale (%.0f mm/s) dépasse la vitesse volumétrique maximale du filament (%.1f mm³/s), ce qui limite la paroi extérieure à environ %.0f mm/s pour cette largeur de ligne et cette hauteur de couche.\n" +" Les vitesses supérieures seront bridées : les blocs supérieurs de la tour ne seront donc pas imprimés à la vitesse demandée.\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"La vitesse finale (%.0f mm/s) dépasse la vitesse volumétrique maximale du filament (%.1f mm³/s) avec la hauteur de couche par défaut (%.2f mm).\n" +"\n" +"La hauteur de couche a été réduite à %.2f mm (une valeur utilisée par les profils de cette imprimante) afin que la tour puisse atteindre la vitesse demandée." + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"Même avec la plus petite hauteur de couche utilisée par les profils de cette imprimante (%.2f mm), la vitesse finale (%.0f mm/s) dépasse la vitesse volumétrique maximale du filament (%.1f mm³/s).\n" +"\n" +"La hauteur de couche sera réglée sur %.2f mm et la vitesse finale abaissée à %.0f mm/s.\n" +"\n" +"Continuer ?" + +# AI Translated +msgid "Continue anyway?" +msgstr "Continuer quand même ?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Activer « Ajustement automatique » pour corriger cela automatiquement, ou continuer quand même ?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Activer « Mise à l’échelle automatique selon la buse » et « Ajustement automatique » pour corriger cela automatiquement, ou continuer quand même ?" + msgid "Start retraction length: " msgstr "Longueur de rétraction de début: " @@ -21059,6 +21176,9 @@ msgstr "" "Éviter la déformation\n" "Saviez-vous que lors de l’impression de matériaux susceptibles de se déformer, tels que l’ABS, une augmentation appropriée de la température du plateau chauffant peut réduire la probabilité de déformation?" +#~ msgid "Print order within a single layer." +#~ msgstr "Ordre d’impression au sein d’une même couche" + #~ msgid "Bottom" #~ msgstr "Dessous" @@ -21149,9 +21269,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "°C" -#~ msgid "%" -#~ msgstr "%" - #~ msgid "Renders cast shadows on the plate in realistic view." #~ msgstr "Affiche les ombres portées sur la plaque dans la vue réaliste." diff --git a/localization/i18n/hu/OrcaSlicer_hu.po b/localization/i18n/hu/OrcaSlicer_hu.po index 0491f17882..7cac58ce43 100644 --- a/localization/i18n/hu/OrcaSlicer_hu.po +++ b/localization/i18n/hu/OrcaSlicer_hu.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -3848,6 +3848,10 @@ msgstr "Elrendezés..." msgid "Arranging" msgstr "Elrendezés" +# AI Translated +msgid "Arranging " +msgstr "Elrendezés " + msgid "Arranging canceled." msgstr "Elrendezése törölve." @@ -9210,6 +9214,21 @@ msgstr "Alsó rétegek elhalványítása" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "A rétegcsúszka mozgatásakor a szeletelt előnézetben az aktuális réteg alatti rétegeket sötétítve jeleníti meg, így csak az éppen megtekintett réteg látszik teljes fényerővel." +# AI Translated +msgid "Dimmed layer brightness" +msgstr "Elhalványított rétegek fényereje" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"Milyen fényesen jelenjenek meg az elhalványított rétegek, ha az \"Alsó rétegek elhalványítása\" be van kapcsolva.\n" +"A 99% alig sötétít, a 0% feketére vált. A felső határ 99%, mert a 100% ugyanaz lenne, mint az opció kikapcsolása." + msgid "Login region" msgstr "Régió" @@ -13305,12 +13324,37 @@ msgstr "Tárgyanként" msgid "Intra-layer order" msgstr "Rétegen belüli sorrend" -msgid "Print order within a single layer." -msgstr "Nyomtatási sorrend egyetlen rétegen belül." +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"Az a sorrend, amelyben az objektumpéldányokat egyetlen rétegen belül bejárja a nyomtató, ami meghatározza, mennyi mozgás megy el a köztük való áthaladásra.\n" +"\n" +"Alapértelmezett: legközelebbi szomszéd szerinti láncolás, 2-opt eljárással és a keresztezések megszüntetésével finomítva. Jó általános választás.\n" +"Objektumlista szerint: a példányok az objektumlista sorrendjében nyomtatódnak, bármilyen útvonal-optimalizálás nélkül. Akkor használd, ha kiszámítható, kézzel vezérelt sorrendre van szükséged.\n" +"Legjobb az összes közül (legrövidebb útvonal): minden stratégia kiértékelésre kerül, és a legrövidebb kerül felhasználásra. Az objektumpéldányok sorrendje egyszer dől el az egész nyomtatásra, míg az egyes szigetek sorrendje rétegenként, így a különböző rétegek eltérő stratégiát is használhatnak. Kissé lassabb szeletelés.\n" +"Kígyóvonal: kanyargós, soronkénti bejárás, 2-opt eljárással finomítva. Jól illik sok kis alkatrész szabályos rácsához.\n" +"\n" +"Ha egy rétegen belül több filament vagy szerszám szerepel, a szerszámcserék minimalizálása élvez elsőbbséget: az objektumok először filament szerint csoportosulnak, és ez a beállítás csak az egyes filamentcsoportokon belüli példánysorrendet szabja meg, így a teljes sorrend nem feltétlenül a tálcán átvezető legrövidebb útvonalnak tűnik." msgid "As object list" msgstr "Objektumlista szerint" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "Legjobb az összes közül (legrövidebb útvonal)" + +# AI Translated +msgid "Snake" +msgstr "Kígyóvonal" + msgid "Slow printing down for better layer cooling" msgstr "Nyomtatás lelassítása a jobb hűtés érdekében" @@ -18655,6 +18699,20 @@ msgstr "" "A(z) %1% gazdagépnévhez több IP-cím is tartozik.\n" "Válaszd ki, melyik legyen használva." +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "Automatikus méretezés a fúvókához" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"Ez a modell 0,4 mm-es fúvókához és 0,2 mm-es rétegmagassághoz készült. \n" +"Ha a méretezési opció be van kapcsolva (ajánlott), a modell dinamikusan átméreteződik az aktuális fúvókaátmérőhöz és egy megfelelő rétegmagassághoz, így a teszt pontos és jól leolvasható lesz.\n" +"Csak akkor kapcsold ki a méretezést, ha a referenciamodellt pontosan az eredeti formájában szeretnéd kinyomtatni." + msgid "PA Calibration" msgstr "PA kalibrálás" @@ -18791,6 +18849,14 @@ msgstr "Kezdősebesség: " msgid "End speed: " msgstr "Befejező sebesség: " +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "Automatikus igazítás a max. volumetrikus sebességhez" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "Ha a végsebesség meghaladná a filament maximális volumetrikus sebességét, automatikusan csökkenti a rétegmagasságot (szabványos értékeket megtartva és a gép korlátain belül maradva), hogy elérje azt. Ha még a legkisebb rétegmagasság sem elegendő, akkor inkább a végsebességet csökkenti." + msgid "" "Please input valid values:\n" "start > 10\n" @@ -18802,6 +18868,57 @@ msgstr "" "lépés >= 0\n" "vég > kezdő + lépés" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"A végsebesség (%.0f mm/s) meghaladja a filament maximális volumetrikus sebességét (%.1f mm³/s), ami a külső falat ennél a vonalszélességnél és rétegmagasságnál körülbelül %.0f mm/s értékre korlátozza.\n" +" Az ennél nagyobb sebességek le lesznek vágva, így a torony felső blokkjai nem a kért sebességgel nyomtatódnak.\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"A végsebesség (%.0f mm/s) meghaladja a filament maximális volumetrikus sebességét (%.1f mm³/s) az alapértelmezett rétegmagasságnál (%.2f mm).\n" +"\n" +"A rétegmagasság %.2f mm értékre csökkent (ezt az értéket a nyomtató beállításai is használják), hogy a torony elérhesse a kért sebességet." + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"Még a nyomtató beállításai által használt legkisebb rétegmagasságnál (%.2f mm) is meghaladja a végsebesség (%.0f mm/s) a filament maximális volumetrikus sebességét (%.1f mm³/s).\n" +"\n" +"A rétegmagasság %.2f mm értékre lesz állítva, a végsebesség pedig %.0f mm/s értékre csökken.\n" +"\n" +"Folytatod?" + +# AI Translated +msgid "Continue anyway?" +msgstr "Mindenképp folytatod?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Engedélyezd az \"Automatikus igazítás\" opciót ennek automatikus javításához, vagy mindenképp folytatod?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Engedélyezd az \"Automatikus méretezés a fúvókához\" és az \"Automatikus igazítás\" opciót ennek automatikus javításához, vagy mindenképp folytatod?" + msgid "Start retraction length: " msgstr "Kezdő visszahúzás hossza: " @@ -21485,6 +21602,9 @@ msgstr "" "Kunkorodás elkerülése\n" "Tudtad, hogy a kunkorodásra hajlamos anyagok (például ABS) nyomtatásakor a tárgyasztal hőmérsékletének növelése csökkentheti a kunkorodás valószínűségét?" +#~ msgid "Print order within a single layer." +#~ msgstr "Nyomtatási sorrend egyetlen rétegen belül." + #~ msgid "Bottom" #~ msgstr "Alul" @@ -21568,9 +21688,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "°C" -#~ msgid "%" -#~ msgstr "%" - #~ msgid "Continue to sync filaments" #~ msgstr "Filamentek szinkronizálásának folytatása" diff --git a/localization/i18n/it/OrcaSlicer_it.po b/localization/i18n/it/OrcaSlicer_it.po index 44a3221846..7be197c578 100644 --- a/localization/i18n/it/OrcaSlicer_it.po +++ b/localization/i18n/it/OrcaSlicer_it.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -3850,6 +3850,10 @@ msgstr "Disposizione..." msgid "Arranging" msgstr "Disposizione" +# AI Translated +msgid "Arranging " +msgstr "Disposizione " + msgid "Arranging canceled." msgstr "Disposizione annullata." @@ -9229,6 +9233,21 @@ msgstr "Attenua gli strati inferiori" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "Quando si scorre il cursore degli strati nell'anteprima elaborata, gli strati al di sotto di quello corrente vengono visualizzati scuriti, in modo che solo lo strato in visualizzazione sia mostrato alla massima luminosità." +# AI Translated +msgid "Dimmed layer brightness" +msgstr "Luminosità degli strati attenuati" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"Quanto luminosi appaiono gli strati attenuati quando \"Attenua gli strati inferiori\" è attivo.\n" +"99% è appena scurito, 0% li rende neri. Limitato al 99% perché 100% equivarrebbe a disattivare l'opzione." + msgid "Login region" msgstr "Regione di accesso" @@ -13326,12 +13345,37 @@ msgstr "Per oggetto" msgid "Intra-layer order" msgstr "Ordine intra-strato" -msgid "Print order within a single layer." -msgstr "Ordine di stampa all'interno di un singolo strato." +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"Ordine in cui le istanze degli oggetti vengono percorse all'interno di un singolo strato; determina quanti spostamenti servono per passare dall'una all'altra.\n" +"\n" +"Predefinito: concatenamento con il vicino più prossimo, affinato con 2-opt e rimozione degli incroci. Una buona scelta generale.\n" +"Come elenco di oggetti: le istanze vengono stampate nello stesso ordine dell'elenco degli oggetti, senza alcuna ottimizzazione del percorso. Da usare quando serve un ordine prevedibile e controllato manualmente.\n" +"Il migliore di tutti (percorso più breve): tutte le strategie vengono valutate e viene usata la più breve. L'ordine delle istanze degli oggetti viene deciso una sola volta per l'intera stampa, mentre l'ordine delle singole isole viene deciso strato per strato, quindi strati diversi possono usare strategie diverse. Slicing leggermente più lento.\n" +"Serpentina: percorso a serpentina, riga per riga, affinato con 2-opt. Adatto a griglie regolari di molti pezzi piccoli.\n" +"\n" +"Con più filamenti o strumenti nello stesso strato, ridurre i cambi strumento ha la priorità: gli oggetti vengono prima raggruppati per filamento e questa impostazione ordina solo le istanze all'interno di ciascun gruppo di filamento, quindi la sequenza complessiva potrebbe non sembrare il percorso più breve sul piatto." msgid "As object list" msgstr "Come elenco di oggetti" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "Il migliore di tutti (percorso più breve)" + +# AI Translated +msgid "Snake" +msgstr "Serpentina" + msgid "Slow printing down for better layer cooling" msgstr "Rallenta stampa per miglior raffreddamento degli strati" @@ -18679,6 +18723,20 @@ msgstr "" "Esistono diversi indirizzi IP che risolvono il nome host %1%.\n" "Selezionare quello da utilizzare." +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "Scala automaticamente in base all'ugello" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"Questo modello è progettato per un ugello da 0,4 mm con un'altezza strato di 0,2 mm. \n" +"Quando l'opzione di ridimensionamento è attiva (consigliata), il modello viene ridimensionato dinamicamente in base al diametro dell'ugello attuale e a un'altezza strato adeguata, rendendo il test preciso e facile da leggere.\n" +"Disattiva il ridimensionamento solo se desideri stampare il modello di riferimento esattamente com'è." + msgid "PA Calibration" msgstr "Calibrazione AP" @@ -18815,6 +18873,14 @@ msgstr "Velocità iniziale: " msgid "End speed: " msgstr "Velocità finale: " +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "Adatta automaticamente alla velocità volumetrica massima" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "Se la velocità finale superasse la velocità volumetrica massima del filamento, l'altezza strato viene ridotta automaticamente (mantenendo valori standard e restando entro i limiti della macchina) per raggiungerla. Se anche l'altezza strato minima non è sufficiente, viene ridotta invece la velocità finale." + msgid "" "Please input valid values:\n" "start > 10\n" @@ -18826,6 +18892,57 @@ msgstr "" "incremento >= 0\n" "fine > inizio + incremento" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"La velocità finale (%.0f mm/s) supera la velocità volumetrica massima del filamento (%.1f mm³/s), il che limita la parete esterna a circa %.0f mm/s con questa larghezza linea e questa altezza strato.\n" +" Le velocità superiori verranno limitate, quindi i blocchi superiori della torre non verranno stampati alla velocità richiesta.\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"La velocità finale (%.0f mm/s) supera la velocità volumetrica massima del filamento (%.1f mm³/s) con l'altezza strato predefinita (%.2f mm).\n" +"\n" +"L'altezza strato è stata ridotta a %.2f mm (un valore usato dai profili di questa stampante) affinché la torre possa raggiungere la velocità richiesta." + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"Anche con l'altezza strato più piccola usata dai profili di questa stampante (%.2f mm), la velocità finale (%.0f mm/s) supera la velocità volumetrica massima del filamento (%.1f mm³/s).\n" +"\n" +"L'altezza strato verrà impostata su %.2f mm e la velocità finale ridotta a %.0f mm/s.\n" +"\n" +"Continuare?" + +# AI Translated +msgid "Continue anyway?" +msgstr "Continuare comunque?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Attivare \"Adatta automaticamente\" per correggere automaticamente il problema oppure continuare comunque?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Attivare \"Scala automaticamente in base all'ugello\" e \"Adatta automaticamente\" per correggere automaticamente il problema oppure continuare comunque?" + msgid "Start retraction length: " msgstr "Lunghezza di retrazione iniziale: " @@ -21514,6 +21631,9 @@ msgstr "" "Evita le deformazioni\n" "Sapevi che quando si stampano materiali soggetti a deformazioni come l'ABS, aumentare in modo appropriato la temperatura del piano riscaldato può ridurre la probabilità di deformazione?" +#~ msgid "Print order within a single layer." +#~ msgstr "Ordine di stampa all'interno di un singolo strato." + #~ msgid "Bottom" #~ msgstr "Inferiore" @@ -21600,9 +21720,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "°C" -#~ msgid "%" -#~ msgstr "%" - #~ msgid "Continue to sync filaments" #~ msgstr "Continua la sincronizzazione dei filamenti" diff --git a/localization/i18n/ja/OrcaSlicer_ja.po b/localization/i18n/ja/OrcaSlicer_ja.po index 8ee2ec34c0..1c78f50b54 100644 --- a/localization/i18n/ja/OrcaSlicer_ja.po +++ b/localization/i18n/ja/OrcaSlicer_ja.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -3860,6 +3860,10 @@ msgstr "レイアウト中" msgid "Arranging" msgstr "レイアウト中" +# AI Translated +msgid "Arranging " +msgstr "レイアウト中 " + msgid "Arranging canceled." msgstr "レイアウトを取り消しました" @@ -9249,6 +9253,21 @@ msgstr "下の積層を暗くする" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "スライスプレビューで積層スライダーを操作する際、現在の層より下の積層を暗く描画し、表示中の積層のみを明るく表示します。" +# AI Translated +msgid "Dimmed layer brightness" +msgstr "暗くした積層の明るさ" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"「下の積層を暗くする」を有効にしたときに、暗くした積層をどの程度の明るさで表示するかを指定します。\n" +"99%ではほとんど暗くならず、0%では真っ黒になります。100%はオプションを無効にした場合と同じになるため、上限は99%です。" + msgid "Login region" msgstr "地域" @@ -13416,12 +13435,37 @@ msgstr "オブジェクト順" msgid "Intra-layer order" msgstr "レイヤー内の順序" -msgid "Print order within a single layer." -msgstr "単一レイヤー内の印刷順序。" +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"1つの積層内でオブジェクトインスタンスを巡回する順序です。インスタンス間の移動距離に影響します。\n" +"\n" +"デフォルト:最近傍法でつなぎ、2-optと交差の除去で改善します。一般的な用途に適した選択です。\n" +"オブジェクトリスト順:パスの最適化を行わず、オブジェクトリストと同じ順序でインスタンスを造形します。手動で管理できる予測しやすい順序が必要な場合に使用します。\n" +"すべてを比較(最短経路):すべての方式を評価し、最も短いものを使用します。オブジェクトインスタンスの順序は造形全体で1回だけ決定され、個々のアイランドの順序は積層ごとに決定されるため、積層によって異なる方式が使われる場合があります。スライスがやや遅くなります。\n" +"蛇行:行ごとに折り返しながら蛇行して巡回し、2-optで改善します。小さなパーツが規則的に並んだ配置に適しています。\n" +"\n" +"同じ積層内で複数のフィラメントやツールを使用する場合は、ツール交換の削減が優先されます。オブジェクトはまずフィラメントごとにグループ化され、この設定は各フィラメントグループ内のインスタンスの順序のみを決めるため、全体の順序はプレート全体での最短経路には見えないことがあります。" msgid "As object list" msgstr "オブジェクトリスト順" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "すべてを比較(最短経路)" + +# AI Translated +msgid "Snake" +msgstr "蛇行" + msgid "Slow printing down for better layer cooling" msgstr "冷却の為減速" @@ -19167,6 +19211,20 @@ msgstr "" "ホスト名%1%には、いくつかのIPアドレスがあります。\n" "使用するIPアドレスを1つ選んでください。" +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "ノズルに合わせて自動スケール" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"このモデルは、0.4 mmノズルと0.2 mmの積層ピッチを基準に設計されています。 \n" +"スケールオプションを有効にすると(推奨)、現在のノズル径と適切な積層ピッチに合わせてサイズが動的に調整され、テストの精度と読み取りやすさが向上します。\n" +"参照モデルをそのままの状態で造形したい場合のみ、スケールを無効にしてください。" + msgid "PA Calibration" msgstr "PAキャリブレーション" @@ -19306,6 +19364,14 @@ msgstr "開始速度: " msgid "End speed: " msgstr "終了速度: " +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "最大体積速度に合わせて自動調整" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "終了速度がフィラメントの最大体積速度を超える場合、その速度に到達できるよう積層ピッチを自動的に下げます(標準的な値を使用し、プリンタの制限内に収めます)。最小の積層ピッチでも足りない場合は、代わりに終了速度を下げます。" + # AI Translated msgid "" "Please input valid values:\n" @@ -19318,6 +19384,57 @@ msgstr "" "ステップ >= 0\n" "終了 > 開始 + ステップ" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"終了速度(%.0f mm/s)がフィラメントの最大体積速度(%.1f mm³/s)を超えています。この押出線幅と積層ピッチでは、外壁は約 %.0f mm/s に制限されます。\n" +" これを超える速度は制限されるため、タワーの上部ブロックは指定した速度で造形されません。\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"終了速度(%.0f mm/s)がフィラメントの最大体積速度(%.1f mm³/s)を超えています(デフォルトの積層ピッチ %.2f mm の場合)。\n" +"\n" +"タワーが指定した速度に到達できるよう、積層ピッチを %.2f mm(このプリンタのプロファイルで使用されている値)に下げました。" + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"このプリンタのプロファイルで使用されている最小の積層ピッチ(%.2f mm)でも、終了速度(%.0f mm/s)がフィラメントの最大体積速度(%.1f mm³/s)を超えています。\n" +"\n" +"積層ピッチを %.2f mm に設定し、終了速度を %.0f mm/s に下げます。\n" +"\n" +"続行しますか?" + +# AI Translated +msgid "Continue anyway?" +msgstr "このまま続行しますか?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "「自動調整」を有効にすると自動的に修正されます。このまま続行しますか?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "「ノズルに合わせて自動スケール」と「自動調整」を有効にすると自動的に修正されます。このまま続行しますか?" + msgid "Start retraction length: " msgstr "開始リトラクション長さ: " @@ -22077,6 +22194,9 @@ msgstr "" "反りを避ける\n" "ABSのような反りやすい素材を印刷する場合、ヒートベッドの温度を適切に上げることで、反りが発生する確率を下げることができることをご存知ですか?" +#~ msgid "Print order within a single layer." +#~ msgstr "単一レイヤー内の印刷順序。" + #~ msgid "Bottom" #~ msgstr "底面" @@ -22157,9 +22277,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "°C" -#~ msgid "%" -#~ msgstr "%" - #~ msgid "Continue to sync filaments" #~ msgstr "フィラメントの同期を続行" diff --git a/localization/i18n/ko/OrcaSlicer_ko.po b/localization/i18n/ko/OrcaSlicer_ko.po index de6c3df39c..debb3fb818 100644 --- a/localization/i18n/ko/OrcaSlicer_ko.po +++ b/localization/i18n/ko/OrcaSlicer_ko.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: 2025-06-02 17:12+0900\n" "Last-Translator: crwusiz \n" "Language-Team: \n" @@ -3864,6 +3864,10 @@ msgstr "정렬 중..." msgid "Arranging" msgstr "정렬 중" +# AI Translated +msgid "Arranging " +msgstr "정렬 중 " + msgid "Arranging canceled." msgstr "정렬 취소됨." @@ -9324,6 +9328,21 @@ msgstr "아래 레이어 어둡게 표시" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "슬라이스된 미리보기에서 레이어 슬라이더를 움직일 때 현재 레이어보다 아래에 있는 레이어를 어둡게 렌더링하여, 보고 있는 레이어만 완전한 밝기로 표시합니다." +# AI Translated +msgid "Dimmed layer brightness" +msgstr "어둡게 표시된 레이어의 밝기" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"\"아래 레이어 어둡게 표시\"를 활성화했을 때 어둡게 표시되는 레이어의 밝기입니다.\n" +"99%는 거의 어두워지지 않고, 0%는 완전히 검게 표시됩니다. 100%는 이 옵션을 비활성화한 것과 같으므로 최대 99%로 제한됩니다." + msgid "Login region" msgstr "로그인 지역" @@ -13539,12 +13558,37 @@ msgstr "객체별" msgid "Intra-layer order" msgstr "레이어 내 순서" -msgid "Print order within a single layer." -msgstr "단일 레이어 내의 출력 순서" +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"단일 레이어 내에서 객체 인스턴스를 방문하는 순서로, 인스턴스 사이를 오가는 이동량을 결정합니다.\n" +"\n" +"기본값: 최근접 이웃 방식으로 경로를 연결하고 2-opt와 교차 제거로 개선합니다. 일반적으로 무난한 선택입니다.\n" +"객체 목록으로: 경로 최적화 없이 객체 목록과 동일한 순서로 인스턴스를 출력합니다. 예측 가능하고 수동으로 제어되는 순서가 필요할 때 사용하십시오.\n" +"전체 비교(최단 경로): 모든 전략을 평가하여 가장 짧은 것을 사용합니다. 객체 인스턴스 순서는 출력 전체에 대해 한 번만 결정되고 개별 아일랜드의 순서는 레이어마다 결정되므로, 레이어에 따라 서로 다른 전략이 사용될 수 있습니다. 슬라이싱이 약간 느려집니다.\n" +"사행형: 행 단위로 앞뒤를 오가며 사행하듯 순회하고 2-opt로 개선합니다. 작은 부품이 규칙적인 격자로 배치된 경우에 적합합니다.\n" +"\n" +"같은 레이어에서 여러 필라멘트나 툴을 사용하는 경우에는 툴 교체 최소화가 우선합니다. 객체를 먼저 필라멘트별로 그룹화하며 이 설정은 각 필라멘트 그룹 내의 인스턴스 순서만 결정하므로, 전체 순서가 플레이트 전체의 최단 경로처럼 보이지 않을 수 있습니다." msgid "As object list" msgstr "객체 목록으로" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "전체 비교(최단 경로)" + +# AI Translated +msgid "Snake" +msgstr "사행형" + msgid "Slow printing down for better layer cooling" msgstr "레이어 냉각 향상을 위한 감속" @@ -14248,7 +14292,7 @@ msgstr "플러시 체적 속도" # AI Translated msgid "Volumetric speed when flushing filament. 0 indicates the max volumetric speed." -msgstr "필라멘트를 플러시할 때의 체적 속도입니다. 0은 최대 체적 속도를 의미합니다." +msgstr "필라멘트를 플러시할 때의 압출 속도입니다. 0은 최대 압출 속도를 의미합니다." msgid "This setting is the volume of filament that can be melted and extruded per second. Printing speed is limited by max volumetric speed, in case of too high and unreasonable speed setting. This value cannot be zero." msgstr "이 설정은 초당 얼마나 많은 양의 필라멘트를 녹이고 압출할 수 있는지를 나타냅니다. 너무 높고 부적절한 속도 설정의 경우 출력 속도는 최대 압출 속도에 의해 제한됩니다. 0이 될 수 없습니다" @@ -18715,7 +18759,7 @@ msgstr "" "이제 다양한 필라멘트에 대한 자동 교정 기능이 추가되었습니다. 완전히 자동으로 수행되며 결과는 나중에 사용할 수 있도록 프린터에 저장됩니다. 다음과 같은 제한된 경우에만 교정을 수행하면 됩니다:\n" "1. 다른 브랜드/모델의 새 필라멘트를 사용하거나 필라멘트가 눅눅해진 경우\n" "2. 노즐이 마모되었거나 새 노즐로 교체한 경우\n" -"3. 필라멘트 설정에서 최대 체적 속도나 출력 온도를 변경한 경우." +"3. 필라멘트 설정에서 최대 압출 속도나 출력 온도를 변경한 경우." msgid "About this calibration" msgstr "교정 정보" @@ -19033,6 +19077,20 @@ msgstr "" "호스트 이름 %1%으로 확인되는 IP 주소가 여러 개 있습니다.\n" "사용 할 IP를 선택해 주세요." +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "노즐에 맞춰 자동 크기 조정" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"이 모델은 0.4 mm 노즐과 0.2 mm 레이어 높이를 기준으로 설계되었습니다. \n" +"크기 조정 옵션을 활성화하면(권장) 현재 노즐 직경과 적절한 레이어 높이에 맞춰 크기가 동적으로 조정되어 테스트가 정확하고 읽기 쉬워집니다.\n" +"참조 모델을 있는 그대로 출력하려는 경우에만 크기 조정을 끄십시오." + msgid "PA Calibration" msgstr "PA 교정" @@ -19171,6 +19229,14 @@ msgstr "시작 속도: " msgid "End speed: " msgstr "종료 속도: " +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "최대 압출 속도에 맞춰 자동 조정" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "종료 속도가 필라멘트의 최대 압출 속도를 초과하는 경우, 해당 속도에 도달할 수 있도록 레이어 높이를 자동으로 낮춥니다(표준 값을 유지하고 장비의 한계 내에서 조정). 최소 레이어 높이로도 부족하면 대신 종료 속도를 낮춥니다." + msgid "" "Please input valid values:\n" "start > 10\n" @@ -19182,6 +19248,57 @@ msgstr "" "단계 >= 0\n" "끝 > 시작 + 단계)" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"종료 속도(%.0f mm/s)가 필라멘트의 최대 압출 속도(%.1f mm³/s)를 초과합니다. 현재 선 너비와 레이어 높이에서는 외벽이 약 %.0f mm/s로 제한됩니다.\n" +" 이보다 빠른 속도는 제한되므로 타워의 상단 블록은 요청한 속도로 출력되지 않습니다.\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"종료 속도(%.0f mm/s)가 필라멘트의 최대 압출 속도(%.1f mm³/s)를 초과합니다(기본 레이어 높이 %.2f mm 기준).\n" +"\n" +"타워가 요청한 속도에 도달할 수 있도록 레이어 높이를 %.2f mm(이 프린터의 프로파일에서 사용하는 값)로 낮췄습니다." + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"이 프린터의 프로파일에서 사용하는 가장 작은 레이어 높이(%.2f mm)에서도 종료 속도(%.0f mm/s)가 필라멘트의 최대 압출 속도(%.1f mm³/s)를 초과합니다.\n" +"\n" +"레이어 높이를 %.2f mm로 설정하고 종료 속도를 %.0f mm/s로 낮춥니다.\n" +"\n" +"계속하시겠습니까?" + +# AI Translated +msgid "Continue anyway?" +msgstr "그래도 계속하시겠습니까?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "\"자동 조정\"을 활성화하면 자동으로 해결됩니다. 그래도 계속하시겠습니까?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "\"노즐에 맞춰 자동 크기 조정\"과 \"자동 조정\"을 활성화하면 자동으로 해결됩니다. 그래도 계속하시겠습니까?" + msgid "Start retraction length: " msgstr "후퇴 시작 길이: " @@ -21289,7 +21406,7 @@ msgstr "채워넣기 전혀 없음" # AI Translated msgid "Volumetric speed" -msgstr "체적 속도" +msgstr "압출 속도" msgid "Step file import parameters" msgstr "스텝 파일 가져오기 매개변수" @@ -21940,6 +22057,9 @@ msgstr "" "뒤틀림 방지\n" "ABS와 같이 뒤틀림이 발생하기 쉬운 소재를 출력할 때, 히트베드 온도를 적절하게 높이면 뒤틀림 가능성을 줄일 수 있다는 사실을 알고 계셨나요?" +#~ msgid "Print order within a single layer." +#~ msgstr "단일 레이어 내의 출력 순서" + #~ msgid "Bottom" #~ msgstr "아래" @@ -22008,9 +22128,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "°C" -#~ msgid "%" -#~ msgstr "%" - #~ msgid "Continue to sync filaments" #~ msgstr "필라멘트 동기화 계속하기" diff --git a/localization/i18n/lt/OrcaSlicer_lt.po b/localization/i18n/lt/OrcaSlicer_lt.po index 986a9dc0d7..23d2aae6f1 100644 --- a/localization/i18n/lt/OrcaSlicer_lt.po +++ b/localization/i18n/lt/OrcaSlicer_lt.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: 2026-07-02 14:13+0300\n" "Last-Translator: Gintaras Kučinskas \n" "Language-Team: \n" @@ -3840,6 +3840,10 @@ msgstr "Išdėstoma..." msgid "Arranging" msgstr "Išdėstymas" +# AI Translated +msgid "Arranging " +msgstr "Išdėstoma " + msgid "Arranging canceled." msgstr "Išdėstymas atšauktas." @@ -9186,6 +9190,21 @@ msgstr "Pritemdyti apatinius sluoksnius" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "Slenkant sluoksnių slankiklį pjaustytoje peržiūroje, atvaizduoti žemiau esančius sluoksnius pritemdytus, kad visu ryškumu būtų rodomas tik peržiūrimas sluoksnis." +# AI Translated +msgid "Dimmed layer brightness" +msgstr "Pritemdytų sluoksnių ryškumas" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"Kaip ryškiai atvaizduojami pritemdyti sluoksniai, kai įjungta parinktis „Pritemdyti apatinius sluoksnius“.\n" +"99 % – pritemdymas vos pastebimas, 0 % – sluoksniai atvaizduojami juodai. Riba yra 99 %, nes 100 % prilygtų parinkties išjungimui." + msgid "Login region" msgstr "Prisijungimo regionas" @@ -13222,12 +13241,37 @@ msgstr "Objektas po objekto" msgid "Intra-layer order" msgstr "Eiliškumas sluoksnio viduje" -msgid "Print order within a single layer." -msgstr "Elementų spausdinimo eiliškumas vieno sluoksnio ribose." +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"Tvarka, kuria objektų kopijos aplankomos viename sluoksnyje; ji lemia, kiek tuščiosios eigos sugaištama pereinant tarp jų.\n" +"\n" +"Numatytasis: grandinės sudarymas artimiausio kaimyno metodu, patobulintas 2-opt algoritmu ir sankirtų šalinimu. Geras bendras pasirinkimas.\n" +"Kaip objektų sąrašas: kopijos spausdinamos tokia pačia tvarka kaip objektų sąraše, be jokio kelio optimizavimo. Naudokite, kai reikia nuspėjamos, rankiniu būdu valdomos tvarkos.\n" +"Geriausias iš visų (trumpiausias kelias): įvertinamos visos strategijos ir naudojama trumpiausia. Objektų kopijų tvarka nustatoma vieną kartą visam spausdinimui, o atskirų salelių tvarka – kiekvienam sluoksniui atskirai, todėl skirtinguose sluoksniuose gali būti naudojamos skirtingos strategijos. Sluoksniuojama šiek tiek lėčiau.\n" +"Gyvatėle: vingiuotas ėjimas eilutė po eilutės, patobulintas 2-opt algoritmu. Gerai tinka taisyklingiems daugelio mažų detalių tinkleliams.\n" +"\n" +"Kai tame pačiame sluoksnyje naudojamos kelios gijos ar keli įrankiai, pirmenybė teikiama įrankio keitimų mažinimui: objektai pirmiausia grupuojami pagal giją, o ši nuostata rikiuoja tik kopijas kiekvienoje grupėje, todėl bendra seka gali neatrodyti kaip trumpiausias kelias per plokštę." msgid "As object list" msgstr "Kaip objektų sąrašas" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "Geriausias iš visų (trumpiausias kelias)" + +# AI Translated +msgid "Snake" +msgstr "Gyvatėle" + msgid "Slow printing down for better layer cooling" msgstr "Sulėtinti spausdinimą geresniam sluoksnių aušinimui" @@ -18537,6 +18581,20 @@ msgstr "" "Yra keli IP adresai, susieti su mazgo pavadinimu %1%.\n" "Pasirinkite tą, kurį norite naudoti." +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "Automatinis mastelis pagal purkštuką" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"Šis modelis suprojektuotas 0,4 mm purkštukui ir 0,2 mm sluoksnio aukščiui. \n" +"Kai mastelio keitimo parinktis įjungta (rekomenduojama), modelio dydis dinamiškai pritaikomas prie jūsų dabartinio purkštuko skersmens ir tinkamo sluoksnio aukščio, todėl testas yra ir tikslus, ir lengvai įskaitomas.\n" +"Mastelio keitimą išjunkite tik tuo atveju, jei norite spausdinti etaloninį modelį tiksliai tokį, koks jis yra." + msgid "PA Calibration" msgstr "PA kalibravimas (Pressure Advance)" @@ -18673,6 +18731,14 @@ msgstr "Pradinis greitis: " msgid "End speed: " msgstr "Galinis greitis: " +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "Automatiškai pritaikyti prie maksimalaus tūrinio greičio" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "Jei galutinis greitis viršytų maksimalų gijos tūrinį greitį, automatiškai sumažinti sluoksnio aukštį (išlaikant standartines reikšmes ir neperžengiant įrenginio apribojimų), kad jį pasiektų. Jei net mažiausio sluoksnio aukščio nepakanka, vietoj to sumažinamas galutinis greitis." + msgid "" "Please input valid values:\n" "start > 10\n" @@ -18684,6 +18750,57 @@ msgstr "" "žingsnis >= 0\n" "galinis > pradinis + žingsnis" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"Galutinis greitis (%.0f mm/s) viršija maksimalų gijos tūrinį greitį (%.1f mm³/s), kuris esant tokiam linijos pločiui ir sluoksnio aukščiui riboja išorinę sienelę iki maždaug %.0f mm/s.\n" +" Didesni greičiai bus apriboti, todėl viršutiniai bokšto blokai nebus spausdinami pageidaujamu greičiu.\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"Galutinis greitis (%.0f mm/s) viršija maksimalų gijos tūrinį greitį (%.1f mm³/s) esant numatytajam sluoksnio aukščiui (%.2f mm).\n" +"\n" +"Sluoksnio aukštis sumažintas iki %.2f mm (reikšmė, naudojama šio spausdintuvo profiliuose), kad bokštas galėtų pasiekti pageidaujamą greitį." + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"Net ir esant mažiausiam sluoksnio aukščiui, naudojamam šio spausdintuvo profiliuose (%.2f mm), galutinis greitis (%.0f mm/s) viršija maksimalų gijos tūrinį greitį (%.1f mm³/s).\n" +"\n" +"Sluoksnio aukštis bus nustatytas į %.2f mm, o galutinis greitis sumažintas iki %.0f mm/s.\n" +"\n" +"Tęsti?" + +# AI Translated +msgid "Continue anyway?" +msgstr "Vis tiek tęsti?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Įjungti „Automatiškai pritaikyti“, kad tai būtų ištaisyta automatiškai, ar vis tiek tęsti?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Įjungti „Automatinis mastelis pagal purkštuką“ ir „Automatiškai pritaikyti“, kad tai būtų ištaisyta automatiškai, ar vis tiek tęsti?" + msgid "Start retraction length: " msgstr "Pradinis įtraukimo ilgis: " @@ -21219,6 +21336,9 @@ msgstr "" "Venkite deformacijų (warping)\n" "Ar žinojote, kad spausdinant medžiagas, kurios yra linkusios trauktis ir riestis (pvz., ABS), tinkamas kaitinamojo pagrindo temperatūros padidinimas gali sumažinti deformacijų (warping) tikimybę?" +#~ msgid "Print order within a single layer." +#~ msgstr "Elementų spausdinimo eiliškumas vieno sluoksnio ribose." + #~ msgid "Bottom" #~ msgstr "Apačia" @@ -21306,9 +21426,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "°C" -#~ msgid "%" -#~ msgstr "%" - #~ msgid "Renders cast shadows on the plate in realistic view." #~ msgstr "Realistiniame vaizde atvaizduoja krentančius šešėlius ant spausdinimo pagrindo." diff --git a/localization/i18n/nl/OrcaSlicer_nl.po b/localization/i18n/nl/OrcaSlicer_nl.po index 7ee63c8a30..a7ef340804 100644 --- a/localization/i18n/nl/OrcaSlicer_nl.po +++ b/localization/i18n/nl/OrcaSlicer_nl.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -4172,6 +4172,10 @@ msgstr "Rangschikken..." msgid "Arranging" msgstr "Rangschikken" +# AI Translated +msgid "Arranging " +msgstr "Rangschikken " + msgid "Arranging canceled." msgstr "Rangschikken geannuleerd." @@ -10076,6 +10080,21 @@ msgstr "Onderliggende lagen dimmen" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "Bij het verschuiven van de laagschuifregelaar in de slicevoorvertoning worden de lagen onder de huidige laag verduisterd weergegeven, zodat alleen de bekeken laag op volle helderheid wordt getoond." +# AI Translated +msgid "Dimmed layer brightness" +msgstr "Helderheid van gedimde lagen" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"Hoe helder de gedimde lagen worden weergegeven wanneer \"Onderliggende lagen dimmen\" is ingeschakeld.\n" +"99% is nauwelijks donkerder, 0% maakt ze zwart. Beperkt tot 99%, omdat 100% hetzelfde zou zijn als de optie uitschakelen." + msgid "Login region" msgstr "Inlogregio" @@ -14544,13 +14563,37 @@ msgid "Intra-layer order" msgstr "Volgorde binnen een laag" # AI Translated -msgid "Print order within a single layer." -msgstr "Printvolgorde binnen één laag." +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"De volgorde waarin objectinstanties binnen één laag worden bezocht, wat bepaalt hoeveel verplaatsing er nodig is om ertussen te bewegen.\n" +"\n" +"Standaard: aaneenschakeling via de dichtstbijzijnde buur, verfijnd met 2-opt en het verwijderen van kruisingen. Een goede algemene keuze.\n" +"Zoals de objectlijst: instanties worden afgedrukt in dezelfde volgorde als de objectlijst, zonder enige padoptimalisatie. Gebruik dit wanneer je een voorspelbare, handmatig bepaalde volgorde nodig hebt.\n" +"Beste van allemaal (kortste pad): elke strategie wordt beoordeeld en de kortste wordt gebruikt. De volgorde van de objectinstanties wordt eenmalig voor de hele print bepaald, terwijl de volgorde van de afzonderlijke eilanden per laag wordt bepaald, waardoor verschillende lagen uiteindelijk verschillende strategieën kunnen gebruiken. Het slicen duurt iets langer.\n" +"Slingerend: slingerend traject, rij voor rij, verfijnd met 2-opt. Zeer geschikt voor regelmatige rasters van veel kleine onderdelen.\n" +"\n" +"Bij meerdere filamenten of gereedschappen in dezelfde laag heeft het beperken van het aantal gereedschapswissels voorrang: objecten worden eerst per filament gegroepeerd en deze instelling bepaalt alleen de volgorde van de instanties binnen elke filamentgroep, waardoor de totale volgorde er niet uitziet als het kortste pad over het printbed." # AI Translated msgid "As object list" msgstr "Zoals de objectlijst" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "Beste van allemaal (kortste pad)" + +# AI Translated +msgid "Snake" +msgstr "Slingerend" + msgid "Slow printing down for better layer cooling" msgstr "Printsnelheid omlaag brengen zodat de laag beter kan koelen" @@ -20593,6 +20636,20 @@ msgstr "" "Er zijn meerdere IP-adressen die verwijzen naar hostname %1%.\n" "Selecteer er een die gebruikt moet worden." +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "Automatisch schalen naar mondstuk" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"Dit model is ontworpen voor een mondstuk van 0,4 mm met een laaghoogte van 0,2 mm. \n" +"Wanneer de schaaloptie is ingeschakeld (aanbevolen), wordt het model dynamisch aangepast aan je huidige mondstukdiameter en een passende laaghoogte, waardoor de test zowel nauwkeurig als goed afleesbaar is.\n" +"Schakel het schalen alleen uit als je het referentiemodel precies zo wilt printen als het is." + msgid "PA Calibration" msgstr "PA-kalibratie" @@ -20736,6 +20793,14 @@ msgstr "Startsnelheid:" msgid "End speed: " msgstr "Eindsnelheid:" +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "Automatisch aanpassen aan max. volumetrische snelheid" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "Als de eindsnelheid de maximale volumetrische snelheid van het filament zou overschrijden, wordt de laaghoogte automatisch verlaagd (met behoud van standaardwaarden en binnen de limieten van de machine) om die snelheid te halen. Als zelfs de minimale laaghoogte niet volstaat, wordt in plaats daarvan de eindsnelheid verlaagd." + # AI Translated msgid "" "Please input valid values:\n" @@ -20748,6 +20813,57 @@ msgstr "" "stap >= 0\n" "einde > start + stap" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"De eindsnelheid (%.0f mm/s) overschrijdt de maximale volumetrische snelheid van het filament (%.1f mm³/s), waardoor de buitenste wand bij deze lijndikte en laaghoogte beperkt wordt tot ongeveer %.0f mm/s.\n" +" Hogere snelheden worden begrensd, waardoor de bovenste blokken van de toren niet op de gevraagde snelheid worden geprint.\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"De eindsnelheid (%.0f mm/s) overschrijdt de maximale volumetrische snelheid van het filament (%.1f mm³/s) bij de standaard laaghoogte (%.2f mm).\n" +"\n" +"De laaghoogte is verlaagd naar %.2f mm (een waarde die door de profielen van deze printer wordt gebruikt), zodat de toren de gevraagde snelheid kan halen." + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"Zelfs bij de kleinste laaghoogte die door de profielen van deze printer wordt gebruikt (%.2f mm) overschrijdt de eindsnelheid (%.0f mm/s) de maximale volumetrische snelheid van het filament (%.1f mm³/s).\n" +"\n" +"De laaghoogte wordt ingesteld op %.2f mm en de eindsnelheid verlaagd naar %.0f mm/s.\n" +"\n" +"Doorgaan?" + +# AI Translated +msgid "Continue anyway?" +msgstr "Toch doorgaan?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "\"Automatisch aanpassen\" inschakelen om dit automatisch op te lossen, of toch doorgaan?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "\"Automatisch schalen naar mondstuk\" en \"Automatisch aanpassen\" inschakelen om dit automatisch op te lossen, of toch doorgaan?" + msgid "Start retraction length: " msgstr "Begin terugtreklengte:" @@ -23665,6 +23781,10 @@ msgstr "" "Kromtrekken voorkomen\n" "Wist je dat bij het printen van materialen die gevoelig zijn voor kromtrekken, zoals ABS, een juiste verhoging van de temperatuur van het warmtebed de kans op kromtrekken kan verkleinen?" +# AI Translated +#~ msgid "Print order within a single layer." +#~ msgstr "Printvolgorde binnen één laag." + #~ msgid "Bottom" #~ msgstr "Onderkant" @@ -23707,9 +23827,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "°C" -#~ msgid "%" -#~ msgstr "%" - #~ msgctxt "Sync_Nozzle_AMS" #~ msgid "Cancel" #~ msgstr "Annuleren" diff --git a/localization/i18n/pl/OrcaSlicer_pl.po b/localization/i18n/pl/OrcaSlicer_pl.po index ab64679801..8599e750e4 100644 --- a/localization/i18n/pl/OrcaSlicer_pl.po +++ b/localization/i18n/pl/OrcaSlicer_pl.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: OrcaSlicer 2.3.0-rc\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: \n" "Last-Translator: Krzysztof Morga <>\n" "Language-Team: \n" @@ -3926,6 +3926,10 @@ msgstr "Układanie..." msgid "Arranging" msgstr "Układanie" +# AI Translated +msgid "Arranging " +msgstr "Rozmieszczanie " + msgid "Arranging canceled." msgstr "Układanie anulowane." @@ -9479,6 +9483,21 @@ msgstr "Przyciemnij niższe warstwy" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "Podczas przewijania suwaka warstw w podglądzie po cięciu renderuj warstwy poniżej bieżącej w przyciemnieniu, tak aby tylko oglądana warstwa była w pełnej jasności." +# AI Translated +msgid "Dimmed layer brightness" +msgstr "Jasność przyciemnionych warstw" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"Jak jasno renderowane są przyciemnione warstwy, gdy włączona jest opcja „Przyciemnij niższe warstwy”.\n" +"99% oznacza ledwo zauważalne przyciemnienie, 0% renderuje je na czarno. Wartość jest ograniczona do 99%, ponieważ 100% oznaczałoby to samo co wyłączenie opcji." + msgid "Login region" msgstr "Region logowania" @@ -13709,12 +13728,37 @@ msgstr "Wg obiektu" msgid "Intra-layer order" msgstr "Kolejność warstw" -msgid "Print order within a single layer." -msgstr "Kolejność druku obiektów w obrębie jednej warstwy. Domyślnie lub według listy obiektów" +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"Kolejność, w jakiej instancje obiektów są odwiedzane w obrębie jednej warstwy; decyduje o tym, ile przemieszczeń zajmuje przechodzenie między nimi.\n" +"\n" +"Domyślny: łączenie metodą najbliższego sąsiada, dopracowane algorytmem 2-opt i usuwaniem przecięć. Dobry wybór ogólny.\n" +"Wg listy obiektów: instancje są drukowane w tej samej kolejności co na liście obiektów, bez optymalizacji ścieżki. Użyj, gdy potrzebujesz przewidywalnej, ręcznie ustalonej kolejności.\n" +"Najlepsza ze wszystkich (najkrótsza ścieżka): oceniane są wszystkie strategie i wybierana jest najkrótsza. Kolejność instancji obiektów ustalana jest raz dla całego wydruku, natomiast kolejność poszczególnych wysp jest ustalana dla każdej warstwy, więc różne warstwy mogą ostatecznie korzystać z różnych strategii. Cięcie trwa nieco dłużej.\n" +"Wężykiem: serpentynowe przechodzenie rząd po rzędzie, dopracowane algorytmem 2-opt. Dobrze sprawdza się przy regularnych siatkach wielu małych elementów.\n" +"\n" +"Gdy w tej samej warstwie używanych jest wiele filamentów lub narzędzi, priorytetem jest minimalizacja zmian narzędzia: obiekty są najpierw grupowane według filamentu, a to ustawienie porządkuje jedynie instancje w obrębie każdej grupy, więc ogólna sekwencja może nie wyglądać jak najkrótsza ścieżka po płycie." msgid "As object list" msgstr "Wg listy obiektów" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "Najlepsza ze wszystkich (najkrótsza ścieżka)" + +# AI Translated +msgid "Snake" +msgstr "Wężykiem" + msgid "Slow printing down for better layer cooling" msgstr "Zwolnienie druku dla lepszego chłodzenia warstw" @@ -19211,6 +19255,20 @@ msgstr "" "Jest kilka adresów IP przypisanych do nazwy hosta %1%.\n" "Proszę wybrać jeden, który ma być używany." +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "Automatyczne skalowanie do dyszy" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"Ten model zaprojektowano dla dyszy 0,4 mm i wysokości warstwy 0,2 mm. \n" +"Gdy opcja skalowania jest włączona (zalecane), model dynamicznie dopasowuje rozmiar do średnicy Twojej obecnej dyszy i odpowiedniej wysokości warstwy, dzięki czemu test jest dokładny i łatwy do odczytania.\n" +"Wyłącz skalowanie tylko wtedy, gdy chcesz wydrukować model referencyjny dokładnie w oryginalnej postaci." + msgid "PA Calibration" msgstr "Kalibracja PA" @@ -19349,6 +19407,14 @@ msgstr "Rozpocznij z prędkością: " msgid "End speed: " msgstr "Zakończ z prędkością: " +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "Automatyczne dopasowanie do maksymalnej prędkości przepływu" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "Jeśli prędkość końcowa przekroczyłaby maksymalną prędkość przepływu filamentu, automatycznie obniż wysokość warstwy (zachowując standardowe wartości i pozostając w limitach maszyny), aby ją osiągnąć. Jeśli nawet minimalna wysokość warstwy nie wystarczy, obniżona zostanie prędkość końcowa." + msgid "" "Please input valid values:\n" "start > 10\n" @@ -19360,6 +19426,57 @@ msgstr "" "krok >= 0\n" "koniec > start + krok)" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"Prędkość końcowa (%.0f mm/s) przekracza maksymalną prędkość przepływu filamentu (%.1f mm³/s), która przy tej szerokości linii i wysokości warstwy ogranicza zewnętrzną ścianę do około %.0f mm/s.\n" +" Wyższe prędkości zostaną ograniczone, więc górne bloki wieży nie zostaną wydrukowane z żądaną prędkością.\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"Prędkość końcowa (%.0f mm/s) przekracza maksymalną prędkość przepływu filamentu (%.1f mm³/s) przy domyślnej wysokości warstwy (%.2f mm).\n" +"\n" +"Wysokość warstwy została zmniejszona do %.2f mm (wartość stosowana w profilach tej drukarki), aby wieża mogła osiągnąć żądaną prędkość." + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"Nawet przy najmniejszej wysokości warstwy stosowanej w profilach tej drukarki (%.2f mm) prędkość końcowa (%.0f mm/s) przekracza maksymalną prędkość przepływu filamentu (%.1f mm³/s).\n" +"\n" +"Wysokość warstwy zostanie ustawiona na %.2f mm, a prędkość końcowa obniżona do %.0f mm/s.\n" +"\n" +"Kontynuować?" + +# AI Translated +msgid "Continue anyway?" +msgstr "Kontynuować mimo to?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Włączyć „Automatyczne dopasowanie”, aby naprawić to automatycznie, czy kontynuować mimo to?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Włączyć „Automatyczne skalowanie do dyszy” i „Automatyczne dopasowanie”, aby naprawić to automatycznie, czy kontynuować mimo to?" + msgid "Start retraction length: " msgstr "Długość retrakcji na początku: " @@ -22117,6 +22234,9 @@ msgstr "" "Unikaj odkształceń\n" "Czy wiesz, że podczas drukowania filamentami podatnymi na odkształcenia, takimi jak ABS, odpowiednie zwiększenie temperatury podgrzewanej płyty może zmniejszyć prawdopodobieństwo odkształceń?" +#~ msgid "Print order within a single layer." +#~ msgstr "Kolejność druku obiektów w obrębie jednej warstwy. Domyślnie lub według listy obiektów" + #~ msgid "Bottom" #~ msgstr "Dół" @@ -22191,9 +22311,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "°C" -#~ msgid "%" -#~ msgstr "%" - #~ msgid "Continue to sync filaments" #~ msgstr "Kontynuuj aby zsynchronizować filamenty" diff --git a/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po b/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po index cfe7549122..58eabd99ef 100644 --- a/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po +++ b/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: 2026-07-26 11:14-0300\n" "Last-Translator: Alexandre Folle de Menezes\n" "Language-Team: Portuguese, Brazilian\n" @@ -3700,6 +3700,10 @@ msgstr "Organizando…" msgid "Arranging" msgstr "Organizando" +# AI Translated +msgid "Arranging " +msgstr "Organizando " + msgid "Arranging canceled." msgstr "Organização cancelada." @@ -8975,6 +8979,22 @@ msgstr "Escurecer camadas inferiores" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "Ao mover o controle deslizante de camadas na pré-visualização fatiada, renderiza as camadas abaixo da atual escurecidas, de modo que apenas a camada visualizada seja exibida com brilho total." +# AI Translated +msgid "Dimmed layer brightness" +msgstr "Brilho das camadas escurecidas" + +# AI Translated +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"Com que brilho as camadas escurecidas são exibidas quando \"Escurecer camadas inferiores\" está ativado.\n" +"99% quase não escurece, 0% as deixa pretas. Limitado a 99% porque 100% seria o mesmo que desativar a opção." + msgid "Login region" msgstr "Região de login" @@ -12983,12 +13003,37 @@ msgstr "Por objeto" msgid "Intra-layer order" msgstr "Ordem intra-camada" -msgid "Print order within a single layer." -msgstr "Ordem de impressão dentro de uma única camada." +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"Ordem em que as instâncias dos objetos são visitadas dentro de uma mesma camada, o que determina quanto deslocamento é gasto no trajeto entre elas.\n" +"\n" +"Padrão: encadeamento por vizinho mais próximo, refinado com 2-opt e remoção de cruzamentos. Uma boa escolha geral.\n" +"Como lista de objetos: as instâncias são impressas na mesma ordem da lista de objetos, sem nenhuma otimização de trajeto. Use quando precisar de uma ordem previsível e controlada manualmente.\n" +"Melhor de todas (caminho mais curto): todas as estratégias são avaliadas e a mais curta é usada. A ordem das instâncias dos objetos é definida uma única vez para toda a impressão, enquanto a ordem das ilhas individuais é definida por camada, de modo que camadas diferentes podem acabar usando estratégias diferentes. O fatiamento fica um pouco mais lento.\n" +"Serpentina: percurso em serpentina, linha por linha, refinado com 2-opt. Adequado a grades regulares de muitas peças pequenas.\n" +"\n" +"Com vários filamentos ou ferramentas na mesma camada, minimizar as trocas de ferramenta tem prioridade: os objetos são agrupados primeiro por filamento e esta configuração ordena apenas as instâncias dentro de cada grupo de filamento, portanto a sequência geral pode não parecer o caminho mais curto pela placa." msgid "As object list" msgstr "Como lista de objetos" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "Melhor de todas (caminho mais curto)" + +# AI Translated +msgid "Snake" +msgstr "Serpentina" + msgid "Slow printing down for better layer cooling" msgstr "Diminuir a velocidade de impressão para melhor resfriamento de camada" @@ -18278,6 +18323,20 @@ msgstr "" "Há vários endereços IP resolvendo para o nome do host %1%.\n" "Por favor, selecione um que deve ser usado." +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "Escala automática para o bico" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"Este modelo foi projetado para um bico de 0,4 mm com altura de camada de 0,2 mm. \n" +"Quando a opção de escala está ativada (recomendado), ele é redimensionado dinamicamente para corresponder ao diâmetro do bico atual e a uma altura de camada apropriada, tornando o teste preciso e fácil de ler.\n" +"Desative a escala apenas se quiser imprimir o modelo de referência exatamente como está." + msgid "PA Calibration" msgstr "Calibração de PA" @@ -18414,6 +18473,14 @@ msgstr "Velocidade Inicial: " msgid "End speed: " msgstr "Velocidade Final: " +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "Ajuste automático à velocidade volumétrica máxima" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "Se a velocidade final ultrapassar a velocidade volumétrica máxima do filamento, reduz automaticamente a altura de camada (mantendo valores padrão e respeitando os limites da máquina) para alcançá-la. Se nem mesmo a altura de camada mínima for suficiente, reduz a velocidade final." + msgid "" "Please input valid values:\n" "start > 10\n" @@ -18425,6 +18492,57 @@ msgstr "" "passo >= 0\n" "fim > início + passo" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"A velocidade final (%.0f mm/s) ultrapassa a velocidade volumétrica máxima do filamento (%.1f mm³/s), o que limita a parede externa a cerca de %.0f mm/s com esta largura de linha e altura de camada.\n" +" Velocidades acima disso serão limitadas, portanto os blocos superiores da torre não serão impressos na velocidade solicitada.\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"A velocidade final (%.0f mm/s) ultrapassa a velocidade volumétrica máxima do filamento (%.1f mm³/s) na altura de camada padrão (%.2f mm).\n" +"\n" +"A altura de camada foi reduzida para %.2f mm (um valor usado pelos perfis desta impressora) para que a torre possa atingir a velocidade solicitada." + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"Mesmo na menor altura de camada usada pelos perfis desta impressora (%.2f mm), a velocidade final (%.0f mm/s) ultrapassa a velocidade volumétrica máxima do filamento (%.1f mm³/s).\n" +"\n" +"A altura de camada será definida como %.2f mm e a velocidade final reduzida para %.0f mm/s.\n" +"\n" +"Continuar?" + +# AI Translated +msgid "Continue anyway?" +msgstr "Continuar mesmo assim?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Ativar \"Ajuste automático\" para corrigir isso automaticamente ou continuar mesmo assim?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Ativar \"Escala automática para o bico\" e \"Ajuste automático\" para corrigir isso automaticamente ou continuar mesmo assim?" + msgid "Start retraction length: " msgstr "Distância de Retração Inicial: " @@ -20948,6 +21066,9 @@ msgstr "" "Evitar empenamento\n" "Você sabia que ao imprimir materiais propensos ao empenamento como ABS, aumentar adequadamente a temperatura da mesa aquecida pode reduzir a probabilidade de empenamento?" +#~ msgid "Print order within a single layer." +#~ msgstr "Ordem de impressão dentro de uma única camada." + #~ msgid "Bottom" #~ msgstr "Inferior" diff --git a/localization/i18n/ru/OrcaSlicer_ru.po b/localization/i18n/ru/OrcaSlicer_ru.po index fa629fd222..a0a48560ff 100644 --- a/localization/i18n/ru/OrcaSlicer_ru.po +++ b/localization/i18n/ru/OrcaSlicer_ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: OrcaSlicer V2.5.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: 2026-02-25 13:38+0300\n" "Last-Translator: Felix14_v2\n" "Language-Team: Felix14_v2 (ДС/ТГ: @felix14_v2, почта: aleks111001@list.ru), Andylg \n" @@ -3888,6 +3888,10 @@ msgstr "Расстановка..." msgid "Arranging" msgstr "Расстановка" +# AI Translated +msgid "Arranging " +msgstr "Расстановка " + msgid "Arranging canceled." msgstr "Расстановка отменена." @@ -9387,6 +9391,21 @@ msgstr "Затемнять нижние слои" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "При перемещении ползунка слоёв в предпросмотре нарезки слои ниже текущего отображаются затемнёнными, так что на полной яркости показан только просматриваемый слой." +# AI Translated +msgid "Dimmed layer brightness" +msgstr "Яркость затемнённых слоёв" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"Насколько ярко отображаются затемнённые слои, когда включена опция «Затемнять нижние слои».\n" +"99% — затемнение почти незаметно, 0% — слои становятся чёрными. Максимум ограничен 99%, так как 100% равносильно отключению опции." + msgid "Login region" msgstr "Регион входа" @@ -13531,12 +13550,37 @@ msgstr "По очереди" msgid "Intra-layer order" msgstr "Очерёдность моделей" -msgid "Print order within a single layer." -msgstr "Последовательность печати моделей в пределах одного слоя." +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"Порядок обхода экземпляров моделей в пределах одного слоя; определяет, сколько перемещений тратится на переходы между ними.\n" +"\n" +"По умолчанию: построение цепочки методом ближайшего соседа с последующим улучшением алгоритмом 2-opt и устранением пересечений. Хороший универсальный вариант.\n" +"По списку: экземпляры печатаются в том же порядке, что и в списке моделей, без какой-либо оптимизации пути. Используйте, когда нужен предсказуемый, задаваемый вручную порядок.\n" +"Лучший из всех (кратчайший путь): оцениваются все стратегии и применяется та, что даёт кратчайший путь. Порядок экземпляров моделей определяется один раз для всей печати, а порядок отдельных островков — для каждого слоя, поэтому на разных слоях могут использоваться разные стратегии. Нарезка идёт немного медленнее.\n" +"Змейкой: змеевидный обход ряд за рядом с улучшением алгоритмом 2-opt. Хорошо подходит для регулярных сеток из множества мелких деталей.\n" +"\n" +"Если в одном слое используется несколько материалов или инструментов, приоритет отдаётся минимизации смен инструмента: модели сначала группируются по материалу, и эта настройка упорядочивает только экземпляры внутри каждой группы, поэтому общая последовательность может не выглядеть как кратчайший путь по столу." msgid "As object list" msgstr "По списку" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "Лучший из всех (кратчайший путь)" + +# AI Translated +msgid "Snake" +msgstr "Змейкой" + msgid "Slow printing down for better layer cooling" msgstr "Замедлять печать для охлаждения слоёв" @@ -19413,6 +19457,20 @@ msgstr "" "По имени хоста %1% обнаружено несколько IP-адресов.\n" "Выберите адрес для использования." +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "Автомасштабирование под сопло" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"Эта модель рассчитана на сопло 0,4 мм и высоту слоя 0,2 мм. \n" +"Если включено масштабирование (рекомендуется), размер модели динамически подстраивается под диаметр вашего текущего сопла и подходящую высоту слоя, благодаря чему тест получается и точным, и легко читаемым.\n" +"Отключайте масштабирование, только если хотите напечатать эталонную модель ровно в исходном виде." + # В заголовке окна куча места msgid "PA Calibration" msgstr "Калибровка Pressure Advance" @@ -19549,6 +19607,14 @@ msgstr "Начальная скорость: " msgid "End speed: " msgstr "Конечная скорость: " +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "Автоподстройка под предел объёмного расхода" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "Если конечная скорость превысит предел объёмного расхода материала, автоматически уменьшать высоту слоя (сохраняя стандартные значения и оставаясь в пределах ограничений принтера), чтобы её достичь. Если даже минимальной высоты слоя недостаточно, вместо этого снижается конечная скорость." + msgid "" "Please input valid values:\n" "start > 10\n" @@ -19560,6 +19626,57 @@ msgstr "" "Шаг ≥ 0\n" "Конечное > начальное + шаг" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"Конечная скорость (%.0f мм/с) превышает предел объёмного расхода материала (%.1f мм³/с), который при такой ширине линии и высоте слоя ограничивает скорость внешних периметров примерно до %.0f мм/с.\n" +" Более высокие скорости будут ограничены, поэтому верхние блоки башни не напечатаются с заданной скоростью.\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"Конечная скорость (%.0f мм/с) превышает предел объёмного расхода материала (%.1f мм³/с) при высоте слоя по умолчанию (%.2f мм).\n" +"\n" +"Высота слоя уменьшена до %.2f мм (значение, используемое профилями этого принтера), чтобы башня могла достичь заданной скорости." + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"Даже при наименьшей высоте слоя, используемой профилями этого принтера (%.2f мм), конечная скорость (%.0f мм/с) превышает предел объёмного расхода материала (%.1f мм³/с).\n" +"\n" +"Высота слоя будет установлена в %.2f мм, а конечная скорость снижена до %.0f мм/с.\n" +"\n" +"Продолжить?" + +# AI Translated +msgid "Continue anyway?" +msgstr "Всё равно продолжить?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Включить «Автоподстройку» для автоматического исправления или всё равно продолжить?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Включить «Автомасштабирование под сопло» и «Автоподстройку» для автоматического исправления или всё равно продолжить?" + msgid "Start retraction length: " msgstr "Начальная длина отката: " @@ -22153,6 +22270,9 @@ msgstr "" "Предотвращение коробления материала\n" "Знаете ли вы, что при печати материалами, склонными к короблению, таких как ABS, повышение температуры подогреваемого стола может снизить эту вероятность?" +#~ msgid "Print order within a single layer." +#~ msgstr "Последовательность печати моделей в пределах одного слоя." + #~ msgid "Bottom" #~ msgstr "Снизу" @@ -22226,9 +22346,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "°C" -#~ msgid "%" -#~ msgstr "%" - #~ msgid "Renders cast shadows on the plate in realistic view." #~ msgstr "Отрисовывать тени в режиме продвинутой графики." diff --git a/localization/i18n/sv/OrcaSlicer_sv.po b/localization/i18n/sv/OrcaSlicer_sv.po index 4f5d27ad9c..6d28e4e66f 100644 --- a/localization/i18n/sv/OrcaSlicer_sv.po +++ b/localization/i18n/sv/OrcaSlicer_sv.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -4245,6 +4245,10 @@ msgstr "Placerar..." msgid "Arranging" msgstr "Placerar" +# AI Translated +msgid "Arranging " +msgstr "Placerar " + msgid "Arranging canceled." msgstr "Placering avbruten." @@ -10187,6 +10191,21 @@ msgstr "Dämpa underliggande lager" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "När du drar i lagerreglaget i den beredda förhandsgranskningen renderas lagren under det aktuella mörkare, så att endast det lager du tittar på visas med full ljusstyrka." +# AI Translated +msgid "Dimmed layer brightness" +msgstr "Ljusstyrka för dämpade lager" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"Hur ljust de dämpade lagren återges när \"Dämpa underliggande lager\" är aktiverat.\n" +"99% är knappt mörkare, 0% gör dem helt svarta. Begränsat till 99% eftersom 100% skulle vara detsamma som att stänga av alternativet." + msgid "Login region" msgstr "Logga in region" @@ -14716,13 +14735,37 @@ msgid "Intra-layer order" msgstr "Ordning inom lager" # AI Translated -msgid "Print order within a single layer." -msgstr "Utskriftsordning inom ett enskilt lager." +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"Ordningen som objektinstanserna besöks i inom ett och samma lager, vilket avgör hur mycket förflyttning som går åt mellan dem.\n" +"\n" +"Standard: kedjning efter närmaste granne, förfinad med 2-opt och borttagning av korsningar. Ett bra generellt val.\n" +"Som objektlistan: instanserna skrivs ut i samma ordning som i objektlistan, utan någon vägoptimering. Använd det när du behöver en förutsägbar ordning som du styr manuellt.\n" +"Bäst av alla (kortaste vägen): varje strategi utvärderas och den kortaste används. Ordningen för objektinstanserna bestäms en gång för hela utskriften, medan ordningen för enskilda öar bestäms per lager, så olika lager kan sluta med att använda olika strategier. Beredningen blir något långsammare.\n" +"Slingrande: slingrande färdväg rad för rad, förfinad med 2-opt. Passar bra för regelbundna rutnät med många små detaljer.\n" +"\n" +"Med flera filament eller verktyg i samma lager prioriteras att minimera antalet verktygsbyten: objekten grupperas först efter filament och den här inställningen ordnar bara instanserna inom varje filamentgrupp, så den totala sekvensen kanske inte ser ut som den kortaste vägen över plattan." # AI Translated msgid "As object list" msgstr "Som objektlistan" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "Bäst av alla (kortaste vägen)" + +# AI Translated +msgid "Snake" +msgstr "Slingrande" + msgid "Slow printing down for better layer cooling" msgstr "Sakta ner utskrift för bättre kylning av lager" @@ -20823,6 +20866,20 @@ msgstr "" "Det finns flera IP-adresser som pekar på värdnamnet %1%.\n" "Välj vilken som ska användas." +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "Autoskala efter nozzel" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"Den här modellen är utformad för en nozzel på 0,4 mm med en lagerhöjd på 0,2 mm. \n" +"När skalningsalternativet är aktiverat (rekommenderas) ändras storleken dynamiskt så att den matchar din aktuella nozzeldiameter och en lämplig lagerhöjd, vilket gör testet både noggrant och lättläst.\n" +"Stäng bara av skalningen om du vill skriva ut referensmodellen exakt som den är." + msgid "PA Calibration" msgstr "PA kalibrering" @@ -20969,6 +21026,14 @@ msgstr "Start hastighet: " msgid "End speed: " msgstr "Sluthastighet: " +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "Autojustera till max volymetrisk hastighet" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "Om sluthastigheten skulle överskrida filamentets maximala volymetriska hastighet sänks lagerhöjden automatiskt (med bibehållna standardvärden och inom maskinens gränser) för att nå den. Om inte ens den minsta lagerhöjden räcker sänks sluthastigheten i stället." + # AI Translated msgid "" "Please input valid values:\n" @@ -20981,6 +21046,57 @@ msgstr "" "steg >= 0\n" "slut > start + steg" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"Sluthastigheten (%.0f mm/s) överskrider filamentets maximala volymetriska hastighet (%.1f mm³/s), vilket begränsar den yttre väggen till omkring %.0f mm/s vid den här linjebredden och lagerhöjden.\n" +" Högre hastigheter kapas, så tornets övre block skrivs inte ut med den begärda hastigheten.\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"Sluthastigheten (%.0f mm/s) överskrider filamentets maximala volymetriska hastighet (%.1f mm³/s) vid standardlagerhöjden (%.2f mm).\n" +"\n" +"Lagerhöjden har sänkts till %.2f mm (ett värde som används av den här skrivarens profiler) så att tornet kan nå den begärda hastigheten." + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"Även vid den minsta lagerhöjd som används av den här skrivarens profiler (%.2f mm) överskrider sluthastigheten (%.0f mm/s) filamentets maximala volymetriska hastighet (%.1f mm³/s).\n" +"\n" +"Lagerhöjden ställs in på %.2f mm och sluthastigheten sänks till %.0f mm/s.\n" +"\n" +"Vill du fortsätta?" + +# AI Translated +msgid "Continue anyway?" +msgstr "Vill du fortsätta ändå?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Vill du aktivera \"Autojustera\" för att åtgärda detta automatiskt, eller fortsätta ändå?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Vill du aktivera \"Autoskala efter nozzel\" och \"Autojustera\" för att åtgärda detta automatiskt, eller fortsätta ändå?" + msgid "Start retraction length: " msgstr "Starta retraktion längd: " @@ -23955,6 +24071,10 @@ msgstr "" "Undvik vridning\n" "Visste du att när du skriver ut material som är benägna att vrida, såsom ABS, kan en lämplig ökning av värmebäddens temperatur minska sannolikheten för vridning?" +# AI Translated +#~ msgid "Print order within a single layer." +#~ msgstr "Utskriftsordning inom ett enskilt lager." + #~ msgid "Bottom" #~ msgstr "Botten" @@ -24000,9 +24120,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "° C" -#~ msgid "%" -#~ msgstr "%" - #~ msgctxt "Sync_Nozzle_AMS" #~ msgid "Cancel" #~ msgstr "Avbryt" diff --git a/localization/i18n/th/OrcaSlicer_th.po b/localization/i18n/th/OrcaSlicer_th.po index 45352f61a6..84b41505a9 100644 --- a/localization/i18n/th/OrcaSlicer_th.po +++ b/localization/i18n/th/OrcaSlicer_th.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: 2026-06-19 13:40+0700\n" "Last-Translator: Icezaza\n" "Language-Team: Thai\n" @@ -3834,6 +3834,10 @@ msgstr "กำลังจัด..." msgid "Arranging" msgstr "การจัด" +# AI Translated +msgid "Arranging " +msgstr "กำลังจัด " + msgid "Arranging canceled." msgstr "ยกเลิกการจัดเตรียมแล้ว" @@ -9156,6 +9160,21 @@ msgstr "หรี่เลเยอร์ด้านล่าง" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "เมื่อเลื่อนแถบเลเยอร์ในตัวอย่างที่สไลซ์แล้ว จะแสดงเลเยอร์ที่อยู่ต่ำกว่าเลเยอร์ปัจจุบันแบบมืดลง เพื่อให้เห็นเฉพาะเลเยอร์ที่กำลังดูอยู่ด้วยความสว่างเต็มที่" +# AI Translated +msgid "Dimmed layer brightness" +msgstr "ความสว่างของเลเยอร์ที่หรี่" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"ความสว่างในการแสดงผลของเลเยอร์ที่ถูกหรี่ เมื่อเปิดใช้งาน \"หรี่เลเยอร์ด้านล่าง\"\n" +"99% คือหรี่ลงเพียงเล็กน้อย ส่วน 0% จะแสดงเป็นสีดำ ค่าสูงสุดถูกจำกัดไว้ที่ 99% เพราะ 100% จะให้ผลเหมือนกับการปิดตัวเลือกนี้" + msgid "Login region" msgstr "เข้าสู่ระบบภูมิภาค" @@ -13190,12 +13209,37 @@ msgstr "ตามวัตถุ" msgid "Intra-layer order" msgstr "คำสั่งภายในชั้น" -msgid "Print order within a single layer." -msgstr "สั่งพิมพ์ภายในชั้นเดียว" +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"ลำดับการเข้าถึงอินสแตนซ์ของวัตถุภายในเลเยอร์เดียวกัน ซึ่งกำหนดว่าต้องเดินหัวเปล่าระหว่างกันมากเพียงใด\n" +"\n" +"ค่าเริ่มต้น: การเชื่อมต่อแบบเพื่อนบ้านที่ใกล้ที่สุด ปรับปรุงด้วย 2-opt และการกำจัดเส้นทางที่ตัดกัน เป็นตัวเลือกทั่วไปที่ดี\n" +"เป็นรายการวัตถุ: พิมพ์อินสแตนซ์ตามลำดับเดียวกับรายการวัตถุ โดยไม่มีการปรับปรุงเส้นทางใด ๆ ใช้เมื่อคุณต้องการลำดับที่คาดเดาได้และควบคุมเองได้\n" +"ดีที่สุดจากทั้งหมด (เส้นทางสั้นที่สุด): จะประเมินทุกกลยุทธ์แล้วเลือกใช้กลยุทธ์ที่สั้นที่สุด ลำดับอินสแตนซ์ของวัตถุจะถูกกำหนดครั้งเดียวสำหรับทั้งงานพิมพ์ ส่วนลำดับของแต่ละเกาะจะถูกกำหนดแยกในแต่ละเลเยอร์ ดังนั้นเลเยอร์ต่าง ๆ อาจใช้กลยุทธ์ที่ต่างกัน สไลซ์ช้าลงเล็กน้อย\n" +"แบบงูเลื้อย: การไล่ทีละแถวแบบงูเลื้อย ปรับปรุงด้วย 2-opt เหมาะกับกริดที่เป็นระเบียบของชิ้นงานเล็ก ๆ จำนวนมาก\n" +"\n" +"เมื่อมีเส้นพลาสติกหรือหัวพิมพ์หลายชนิดในเลเยอร์เดียวกัน การลดจำนวนการเปลี่ยนหัวพิมพ์จะมีความสำคัญก่อน โดยวัตถุจะถูกจัดกลุ่มตามเส้นพลาสติกก่อน และการตั้งค่านี้จะจัดลำดับเฉพาะอินสแตนซ์ภายในแต่ละกลุ่มเส้นพลาสติกเท่านั้น ลำดับโดยรวมจึงอาจดูไม่เหมือนเส้นทางที่สั้นที่สุดบนฐานพิมพ์" msgid "As object list" msgstr "เป็นรายการวัตถุ" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "ดีที่สุดจากทั้งหมด (เส้นทางสั้นที่สุด)" + +# AI Translated +msgid "Snake" +msgstr "แบบงูเลื้อย" + msgid "Slow printing down for better layer cooling" msgstr "ชะลอการพิมพ์ลงเพื่อการระบายความร้อนที่ดีขึ้น" @@ -18524,6 +18568,20 @@ msgstr "" "มีที่อยู่ IP หลายแห่งที่ใช้ชื่อโฮสต์ %1%\n" "โปรดเลือกอันที่ควรใช้" +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "ปรับขนาดอัตโนมัติตามหัวฉีด" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"โมเดลนี้ออกแบบมาสำหรับหัวฉีดขนาด 0.4 mm และความสูงเลเยอร์ 0.2 mm \n" +"เมื่อเปิดใช้งานตัวเลือกการปรับขนาด (แนะนำ) โมเดลจะปรับขนาดแบบไดนามิกให้ตรงกับเส้นผ่านศูนย์กลางหัวฉีดปัจจุบันและความสูงเลเยอร์ที่เหมาะสม ทำให้การทดสอบทั้งแม่นยำและอ่านค่าได้ง่าย\n" +"ปิดการปรับขนาดเฉพาะเมื่อคุณต้องการพิมพ์โมเดลอ้างอิงตามขนาดเดิมทุกประการ" + msgid "PA Calibration" msgstr "ปรับเทียบ PA" @@ -18660,6 +18718,14 @@ msgstr "ความเร็วเริ่มต้น:" msgid "End speed: " msgstr "ความเร็วสิ้นสุด:" +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "ปรับอัตโนมัติตามความเร็วปริมาตรสูงสุด" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "หากความเร็วปลายทางจะเกินความเร็วปริมาตรสูงสุดของเส้นพลาสติก ระบบจะลดความสูงเลเยอร์โดยอัตโนมัติ (โดยคงค่ามาตรฐานไว้และอยู่ภายในขีดจำกัดของเครื่อง) เพื่อให้ถึงค่าดังกล่าว หากแม้แต่ความสูงเลเยอร์ต่ำสุดยังไม่เพียงพอ ระบบจะลดความเร็วปลายทางแทน" + msgid "" "Please input valid values:\n" "start > 10\n" @@ -18671,6 +18737,57 @@ msgstr "" "ขั้นตอน >= 0\n" "สิ้นสุด> เริ่มต้น + ขั้นตอน" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"ความเร็วปลายทาง (%.0f mm/s) เกินความเร็วปริมาตรสูงสุดของเส้นพลาสติก (%.1f mm³/s) ซึ่งจำกัดผนังด้านนอกไว้ที่ประมาณ %.0f mm/s ที่ความกว้างเส้นและความสูงเลเยอร์นี้\n" +" ความเร็วที่สูงกว่านี้จะถูกจำกัดไว้ ดังนั้นบล็อกด้านบนของทาวเวอร์จะไม่พิมพ์ด้วยความเร็วที่ร้องขอ\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"ความเร็วปลายทาง (%.0f mm/s) เกินความเร็วปริมาตรสูงสุดของเส้นพลาสติก (%.1f mm³/s) ที่ความสูงเลเยอร์เริ่มต้น (%.2f mm)\n" +"\n" +"ความสูงเลเยอร์ถูกลดลงเป็น %.2f mm (ค่าที่ใช้ในพรีเซ็ตของเครื่องพิมพ์นี้) เพื่อให้ทาวเวอร์ถึงความเร็วที่ร้องขอได้" + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"แม้แต่ที่ความสูงเลเยอร์ต่ำสุดที่ใช้ในพรีเซ็ตของเครื่องพิมพ์นี้ (%.2f mm) ความเร็วปลายทาง (%.0f mm/s) ก็ยังเกินความเร็วปริมาตรสูงสุดของเส้นพลาสติก (%.1f mm³/s)\n" +"\n" +"ความสูงเลเยอร์จะถูกตั้งเป็น %.2f mm และความเร็วปลายทางจะถูกลดลงเป็น %.0f mm/s\n" +"\n" +"ดำเนินการต่อหรือไม่?" + +# AI Translated +msgid "Continue anyway?" +msgstr "ดำเนินการต่ออยู่ดีหรือไม่?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "เปิดใช้งาน \"ปรับอัตโนมัติ\" เพื่อแก้ไขปัญหานี้โดยอัตโนมัติ หรือดำเนินการต่ออยู่ดี?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "เปิดใช้งาน \"ปรับขนาดอัตโนมัติตามหัวฉีด\" และ \"ปรับอัตโนมัติ\" เพื่อแก้ไขปัญหานี้โดยอัตโนมัติ หรือดำเนินการต่ออยู่ดี?" + msgid "Start retraction length: " msgstr "เริ่มต้นความยาวการดึงกลับ:" @@ -21244,6 +21361,9 @@ msgstr "" "หลีกเลี่ยงการบิดเบี้ยว\n" "คุณรู้หรือไม่ว่าเมื่อพิมพ์วัสดุที่มีแนวโน้มที่จะเกิดการบิดเบี้ยว เช่น ABS การเพิ่มอุณหภูมิฐานพิมพ์อย่างเหมาะสมสามารถลดความน่าจะเป็นของการบิดเบี้ยวได้" +#~ msgid "Print order within a single layer." +#~ msgstr "สั่งพิมพ์ภายในชั้นเดียว" + #~ msgid "Bottom" #~ msgstr "ล่าง" @@ -21331,9 +21451,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "°C" -#~ msgid "%" -#~ msgstr "%" - #~ msgid "Renders cast shadows on the plate in realistic view." #~ msgstr "แสดงเงาแบบทอดบนเพลตในมุมมองแบบสมจริง" diff --git a/localization/i18n/tr/OrcaSlicer_tr.po b/localization/i18n/tr/OrcaSlicer_tr.po index 697fa76b56..7ef4d33cfd 100644 --- a/localization/i18n/tr/OrcaSlicer_tr.po +++ b/localization/i18n/tr/OrcaSlicer_tr.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: 2026-04-08 23:59+0300\n" "Last-Translator: GlauTech\n" "Language-Team: \n" @@ -3913,6 +3913,10 @@ msgstr "Hizalanıyor..." msgid "Arranging" msgstr "Hizalanıyor" +# AI Translated +msgid "Arranging " +msgstr "Hizalanıyor " + msgid "Arranging canceled." msgstr "Hizalama iptal edildi." @@ -9321,6 +9325,21 @@ msgstr "Alt katmanları karart" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "Dilimlenmiş önizlemede katman kaydırıcısı gezdirilirken, geçerli katmanın altındaki katmanları koyulaştırarak yalnızca görüntülenen katmanın tam parlaklıkta gösterilmesini sağlar." +# AI Translated +msgid "Dimmed layer brightness" +msgstr "Karartılmış katman parlaklığı" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"\"Alt katmanları karart\" etkinleştirildiğinde karartılmış katmanların ne kadar parlak görüntüleneceği.\n" +"%99 neredeyse hiç karartmaz, %0 ise tamamen siyah gösterir. Üst sınır %99 olarak belirlenmiştir, çünkü %100 seçeneği devre dışı bırakmakla aynı olurdu." + msgid "Login region" msgstr "Giriş bölgesi" @@ -13468,12 +13487,37 @@ msgstr "Nesneye göre" msgid "Intra-layer order" msgstr "Katman içi sıra" -msgid "Print order within a single layer." -msgstr "Tek bir katmanda yazdırma sırası." +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"Tek bir katman içinde nesne örneklerinin hangi sırayla ziyaret edileceği; bu da aralarında ne kadar seyahat harcanacağını belirler.\n" +"\n" +"Varsayılan: en yakın komşu zincirlemesi, 2-opt ve kesişim giderme ile iyileştirilir. İyi bir genel seçim.\n" +"Nesne listesi olarak: örnekler, herhangi bir yol optimizasyonu olmadan nesne listesindeki sırayla yazdırılır. Öngörülebilir, elle denetlenen bir sıraya ihtiyacınız olduğunda kullanın.\n" +"Hepsinin en iyisi (en kısa yol): her strateji değerlendirilir ve en kısa olanı kullanılır. Nesne örneklerinin sırası tüm baskı için bir kez belirlenir, tek tek adaların sırası ise her katman için ayrı belirlenir; bu nedenle farklı katmanlar farklı stratejiler kullanabilir. Dilimleme biraz daha yavaştır.\n" +"Yılankavi: satır satır ilerleyen yılankavi geçiş, 2-opt ile iyileştirilir. Çok sayıda küçük parçadan oluşan düzenli ızgaralar için çok uygundur.\n" +"\n" +"Aynı katmanda birden fazla filament veya araç varsa, araç değişimlerini en aza indirmek önceliklidir: nesneler önce filamente göre gruplanır ve bu ayar yalnızca her filament grubu içindeki örnekleri sıralar; bu nedenle genel sıra, tabla genelindeki en kısa yol gibi görünmeyebilir." msgid "As object list" msgstr "Nesne listesi olarak" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "Hepsinin en iyisi (en kısa yol)" + +# AI Translated +msgid "Snake" +msgstr "Yılankavi" + msgid "Slow printing down for better layer cooling" msgstr "Daha iyi katman soğutması için baskıyı yavaşlat" @@ -18899,6 +18943,20 @@ msgstr "" "%1% ana bilgisayar adına çözümlenen birkaç IP adresi var.\n" "Hangisinin kullanılacağını seçin." +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "Nozul için otomatik ölçekleme" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"Bu model, 0,4 mm nozul ve 0,2 mm katman yüksekliği esas alınarak tasarlanmıştır. \n" +"Ölçekleme seçeneği etkinleştirildiğinde (önerilir), model mevcut nozul çapınıza ve uygun bir katman yüksekliğine uyacak şekilde dinamik olarak yeniden boyutlandırılır; böylece test hem doğru hem de kolay okunur olur.\n" +"Ölçeklemeyi yalnızca referans modeli olduğu gibi yazdırmak istiyorsanız kapatın." + msgid "PA Calibration" msgstr "PA Kalibrasyonu" @@ -19036,6 +19094,14 @@ msgstr "Başlangıç hızı: " msgid "End speed: " msgstr "Bitiş hızı: " +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "Maksimum hacimsel hıza otomatik ayarlama" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "Bitiş hızı filamentin maksimum hacimsel hızını aşacak olursa, bu hıza ulaşabilmek için katman yüksekliği otomatik olarak düşürülür (standart değerler korunarak ve makinenin sınırları içinde kalınarak). Minimum katman yüksekliği bile yeterli değilse, bunun yerine bitiş hızı düşürülür." + msgid "" "Please input valid values:\n" "start > 10\n" @@ -19047,6 +19113,57 @@ msgstr "" "adım >= 0\n" "bitiş > başlangıç + adım)" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"Bitiş hızı (%.0f mm/s), filamentin maksimum hacimsel hızını (%.1f mm³/s) aşıyor; bu da dış duvarı bu çizgi genişliği ve katman yüksekliğinde yaklaşık %.0f mm/s ile sınırlıyor.\n" +" Bunun üzerindeki hızlar sınırlanacağından, kulenin üst blokları istenen hızda yazdırılmayacak.\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"Bitiş hızı (%.0f mm/s), filamentin maksimum hacimsel hızını (%.1f mm³/s) varsayılan katman yüksekliğinde (%.2f mm) aşıyor.\n" +"\n" +"Kulenin istenen hıza ulaşabilmesi için katman yüksekliği %.2f mm değerine düşürüldü (bu yazıcının ön ayarlarında kullanılan bir değer)." + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"Bu yazıcının ön ayarlarında kullanılan en küçük katman yüksekliğinde bile (%.2f mm), bitiş hızı (%.0f mm/s) filamentin maksimum hacimsel hızını (%.1f mm³/s) aşıyor.\n" +"\n" +"Katman yüksekliği %.2f mm olarak ayarlanacak ve bitiş hızı %.0f mm/s değerine düşürülecek.\n" +"\n" +"Devam edilsin mi?" + +# AI Translated +msgid "Continue anyway?" +msgstr "Yine de devam edilsin mi?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Bunu otomatik olarak düzeltmek için \"Otomatik ayarlama\" seçeneğini etkinleştirin ya da yine de devam edilsin mi?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Bunu otomatik olarak düzeltmek için \"Nozul için otomatik ölçekleme\" ve \"Otomatik ayarlama\" seçeneklerini etkinleştirin ya da yine de devam edilsin mi?" + msgid "Start retraction length: " msgstr "Geri çekme uzunluğu başlangıcı: " @@ -21742,6 +21859,9 @@ msgstr "" "Eğilmeyi önleyin\n" "ABS gibi bükülmeye yatkın malzemelere baskı yaparken, ısıtma yatağı sıcaklığının uygun şekilde arttırılmasının bükülme olasılığını azaltabileceğini biliyor muydunuz?" +#~ msgid "Print order within a single layer." +#~ msgstr "Tek bir katmanda yazdırma sırası." + #~ msgid "Bottom" #~ msgstr "Alt" @@ -21822,9 +21942,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "°C" -#~ msgid "%" -#~ msgstr "%" - #~ msgid "Continue to sync filaments" #~ msgstr "Filamentleri senkronize etmeye devam edin" diff --git a/localization/i18n/uk/OrcaSlicer_uk.po b/localization/i18n/uk/OrcaSlicer_uk.po index 7b838b73b4..464cd4042a 100644 --- a/localization/i18n/uk/OrcaSlicer_uk.po +++ b/localization/i18n/uk/OrcaSlicer_uk.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: orcaslicerua\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: 2026-07-17 16:25+0300\n" "Last-Translator: Andrij Mizyk \n" "Language-Team: Ukrainian\n" @@ -3796,6 +3796,10 @@ msgstr "Організація..." msgid "Arranging" msgstr "Організація" +# AI Translated +msgid "Arranging " +msgstr "Впорядкування " + msgid "Arranging canceled." msgstr "Організацію скасовано." @@ -9297,6 +9301,21 @@ msgstr "Затемнювати нижні шари" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "Під час прокручування повзунка шарів у попередньому перегляді нарізки відображати шари нижче поточного затемненими, щоб лише переглядуваний шар показувався з повною яскравістю." +# AI Translated +msgid "Dimmed layer brightness" +msgstr "Яскравість затемнених шарів" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"Наскільки яскраво відображаються затемнені шари, коли увімкнено параметр «Затемнювати нижні шари».\n" +"99% — затемнення майже непомітне, 0% — шари стають чорними. Максимум обмежено 99%, оскільки 100% дорівнювало б вимкненню параметра." + msgid "Login region" msgstr "Регіон входу" @@ -13531,12 +13550,37 @@ msgstr "По обʼєктах" msgid "Intra-layer order" msgstr "Внутрішній порядок шарів" -msgid "Print order within a single layer." -msgstr "Друк замовлення в один шар" +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"Порядок, у якому обходяться екземпляри обʼєктів у межах одного шару; він визначає, скільки переміщень витрачається на переходи між ними.\n" +"\n" +"Типово: побудова ланцюга методом найближчого сусіда з подальшим удосконаленням алгоритмом 2-opt та усуненням перетинів. Хороший універсальний вибір.\n" +"За порядком у списку: екземпляри друкуються в тому самому порядку, що й у списку обʼєктів, без жодної оптимізації шляху. Використовуйте, коли потрібен передбачуваний порядок, заданий вручну.\n" +"Найкращий з усіх (найкоротший шлях): оцінюються всі стратегії й застосовується та, що дає найкоротший шлях. Порядок екземплярів обʼєктів визначається один раз для всього друку, а порядок окремих острівців — для кожного шару окремо, тож різні шари можуть використовувати різні стратегії. Нарізка триває трохи довше.\n" +"Змійкою: змієподібний обхід ряд за рядом з удосконаленням алгоритмом 2-opt. Добре підходить для регулярних сіток із багатьох дрібних деталей.\n" +"\n" +"Якщо в одному шарі використовується кілька філаментів або інструментів, пріоритет має мінімізація змін інструмента: обʼєкти спочатку групуються за філаментом, і цей параметр упорядковує лише екземпляри в межах кожної групи, тож загальна послідовність може не виглядати як найкоротший шлях по пластині." msgid "As object list" msgstr "За порядком у списку" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "Найкращий з усіх (найкоротший шлях)" + +# AI Translated +msgid "Snake" +msgstr "Змійкою" + msgid "Slow printing down for better layer cooling" msgstr "Сповільнювати друк для кращого охолодження шару" @@ -19089,6 +19133,20 @@ msgstr "" "Є кілька IP-адрес, які перетворюються на ім’я хоста %1%.\n" "Будь ласка, виберіть той, який слід використовувати." +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "Автомасштабування під сопло" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"Ця модель розрахована на сопло 0,4 мм і висоту шару 0,2 мм. \n" +"Коли увімкнено масштабування (рекомендовано), розмір моделі динамічно підлаштовується під діаметр вашого поточного сопла та відповідну висоту шару, завдяки чому тест є точним і легко читається.\n" +"Вимикайте масштабування, лише якщо хочете надрукувати еталонну модель точно в первісному вигляді." + msgid "PA Calibration" msgstr "Калібрування ВТ (РА)" @@ -19230,6 +19288,14 @@ msgstr "Початкова швидкість: " msgid "End speed: " msgstr "Кінцева швидкість: " +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "Автопідлаштування під максимальну обʼємну швидкість" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "Якщо кінцева швидкість перевищить максимальну обʼємну швидкість філаменту, автоматично зменшувати висоту шару (зберігаючи стандартні значення та не виходячи за обмеження машини), щоб її досягти. Якщо навіть мінімальної висоти шару не досить, натомість буде знижено кінцеву швидкість." + msgid "" "Please input valid values:\n" "start > 10\n" @@ -19241,6 +19307,57 @@ msgstr "" "крок >= 0\n" "кінець > початок + крок)" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"Кінцева швидкість (%.0f мм/с) перевищує максимальну обʼємну швидкість філаменту (%.1f мм³/с), яка за такої ширини лінії та висоти шару обмежує зовнішню стінку приблизно до %.0f мм/с.\n" +" Вищі швидкості будуть обмежені, тож верхні блоки вежі не надрукуються із заданою швидкістю.\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"Кінцева швидкість (%.0f мм/с) перевищує максимальну обʼємну швидкість філаменту (%.1f мм³/с) за типової висоти шару (%.2f мм).\n" +"\n" +"Висоту шару зменшено до %.2f мм (значення, яке використовують профілі цього принтера), щоб вежа могла досягти заданої швидкості." + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"Навіть за найменшої висоти шару, яку використовують профілі цього принтера (%.2f мм), кінцева швидкість (%.0f мм/с) перевищує максимальну обʼємну швидкість філаменту (%.1f мм³/с).\n" +"\n" +"Висоту шару буде встановлено на %.2f мм, а кінцеву швидкість знижено до %.0f мм/с.\n" +"\n" +"Продовжити?" + +# AI Translated +msgid "Continue anyway?" +msgstr "Усе одно продовжити?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Увімкнути «Автопідлаштування», щоб виправити це автоматично, чи все одно продовжити?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Увімкнути «Автомасштабування під сопло» та «Автопідлаштування», щоб виправити це автоматично, чи все одно продовжити?" + msgid "Start retraction length: " msgstr "Початкова довжина ретракту: " @@ -21862,6 +21979,9 @@ msgstr "" "Уникнення деформації\n" "Чи знаєте ви, що при друку матеріалами, схильними до деформації, такими як ABS, відповідне підвищення температури столу може зменшити ймовірність деформації?" +#~ msgid "Print order within a single layer." +#~ msgstr "Друк замовлення в один шар" + #~ msgid "Bottom" #~ msgstr "Низ" @@ -21940,9 +22060,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "℃" -#~ msgid "%" -#~ msgstr "%" - #~ msgctxt "Sync_Nozzle_AMS" #~ msgid "Cancel" #~ msgstr "Скасувати" diff --git a/localization/i18n/vi/OrcaSlicer_vi.po b/localization/i18n/vi/OrcaSlicer_vi.po index cda4617b7b..2133579d50 100644 --- a/localization/i18n/vi/OrcaSlicer_vi.po +++ b/localization/i18n/vi/OrcaSlicer_vi.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: 2025-10-02 17:43+0700\n" "Last-Translator: \n" "Language-Team: hainguyen.ts13@gmail.com\n" @@ -4031,6 +4031,10 @@ msgstr "Đang sắp xếp..." msgid "Arranging" msgstr "Đang sắp xếp" +# AI Translated +msgid "Arranging " +msgstr "Đang sắp xếp " + msgid "Arranging canceled." msgstr "Hủy sắp xếp." @@ -9779,6 +9783,21 @@ msgstr "Làm mờ các lớp bên dưới" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "Khi kéo thanh trượt lớp trong bản xem trước đã slice, kết xuất các lớp bên dưới lớp hiện tại ở dạng tối đi để chỉ lớp đang xem hiển thị với độ sáng đầy đủ." +# AI Translated +msgid "Dimmed layer brightness" +msgstr "Độ sáng của lớp bị làm mờ" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"Mức độ sáng khi hiển thị các lớp bị làm mờ nếu bật \"Làm mờ các lớp bên dưới\".\n" +"99% gần như không tối đi, 0% khiến chúng đen hoàn toàn. Giới hạn ở 99% vì 100% sẽ giống hệt như tắt tùy chọn này." + # AI Translated msgid "Login region" msgstr "Khu vực đăng nhập" @@ -14093,12 +14112,37 @@ msgstr "Theo đối tượng" msgid "Intra-layer order" msgstr "Thứ tự trong lớp" -msgid "Print order within a single layer." -msgstr "Thứ tự in trong một lớp đơn." +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"Thứ tự các instance của đối tượng được đi qua trong cùng một lớp, quyết định lượng di chuyển tiêu tốn khi đi giữa chúng.\n" +"\n" +"Mặc định: nối chuỗi theo láng giềng gần nhất, tinh chỉnh bằng 2-opt và loại bỏ các đoạn cắt nhau. Lựa chọn chung tốt.\n" +"Như danh sách đối tượng: các instance được in theo đúng thứ tự trong danh sách đối tượng, không tối ưu hóa đường đi. Dùng khi bạn cần một thứ tự dễ đoán và tự kiểm soát.\n" +"Tốt nhất trong tất cả (đường đi ngắn nhất): mọi chiến lược đều được đánh giá và chiến lược ngắn nhất được sử dụng. Thứ tự các instance của đối tượng được quyết định một lần cho toàn bộ bản in, còn thứ tự của từng đảo được quyết định theo từng lớp, nên các lớp khác nhau có thể dùng chiến lược khác nhau. Slice hơi chậm hơn một chút.\n" +"Ngoằn ngoèo: duyệt lần lượt từng hàng theo kiểu ngoằn ngoèo, tinh chỉnh bằng 2-opt. Rất phù hợp với các lưới đều gồm nhiều chi tiết nhỏ.\n" +"\n" +"Khi có nhiều filament hoặc đầu công cụ trong cùng một lớp, việc giảm thiểu số lần đổi đầu công cụ được ưu tiên: các đối tượng được nhóm theo filament trước, và thiết lập này chỉ sắp xếp các instance trong từng nhóm filament, nên trình tự tổng thể có thể không giống đường đi ngắn nhất trên bàn in." msgid "As object list" msgstr "Như danh sách đối tượng" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "Tốt nhất trong tất cả (đường đi ngắn nhất)" + +# AI Translated +msgid "Snake" +msgstr "Ngoằn ngoèo" + msgid "Slow printing down for better layer cooling" msgstr "Giảm tốc độ in để làm mát lớp tốt hơn" @@ -19626,6 +19670,20 @@ msgstr "" "Có nhiều địa chỉ IP phân giải thành tên máy chủ %1%.\n" "Vui lòng chọn một địa chỉ nên được sử dụng." +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "Tự động chia tỷ lệ theo đầu phun" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"Mô hình này được thiết kế cho đầu phun 0.4 mm với chiều cao lớp 0.2 mm. \n" +"Khi bật tùy chọn chia tỷ lệ (khuyến nghị), mô hình sẽ tự động thay đổi kích thước cho khớp với đường kính đầu phun hiện tại và một chiều cao lớp phù hợp, giúp bài kiểm tra vừa chính xác vừa dễ đọc.\n" +"Chỉ tắt chia tỷ lệ nếu bạn muốn in mô hình tham chiếu đúng nguyên trạng." + msgid "PA Calibration" msgstr "Hiệu chỉnh PA" @@ -19764,6 +19822,14 @@ msgstr "Tốc độ bắt đầu: " msgid "End speed: " msgstr "Tốc độ kết thúc: " +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "Tự động điều chỉnh theo tốc độ thể tích tối đa" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "Nếu tốc độ kết thúc vượt quá tốc độ thể tích tối đa của filament, tự động giảm chiều cao lớp (giữ các giá trị tiêu chuẩn và nằm trong giới hạn của máy) để đạt được tốc độ đó. Nếu ngay cả chiều cao lớp nhỏ nhất vẫn chưa đủ, thì giảm tốc độ kết thúc thay vào đó." + msgid "" "Please input valid values:\n" "start > 10\n" @@ -19775,6 +19841,57 @@ msgstr "" "bước >= 0\n" "kết thúc > bắt đầu + bước" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"Tốc độ kết thúc (%.0f mm/s) vượt quá tốc độ thể tích tối đa của filament (%.1f mm³/s), khiến thành ngoài bị giới hạn ở khoảng %.0f mm/s với độ rộng đường và chiều cao lớp hiện tại.\n" +" Các tốc độ cao hơn mức này sẽ bị cắt bớt, nên những khối phía trên của tháp sẽ không in ở tốc độ yêu cầu.\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"Tốc độ kết thúc (%.0f mm/s) vượt quá tốc độ thể tích tối đa của filament (%.1f mm³/s) ở chiều cao lớp mặc định (%.2f mm).\n" +"\n" +"Chiều cao lớp đã được giảm xuống %.2f mm (một giá trị được dùng trong các cài đặt sẵn của máy in này) để tháp có thể đạt tốc độ yêu cầu." + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"Ngay cả ở chiều cao lớp nhỏ nhất được dùng trong các cài đặt sẵn của máy in này (%.2f mm), tốc độ kết thúc (%.0f mm/s) vẫn vượt quá tốc độ thể tích tối đa của filament (%.1f mm³/s).\n" +"\n" +"Chiều cao lớp sẽ được đặt thành %.2f mm và tốc độ kết thúc giảm xuống %.0f mm/s.\n" +"\n" +"Tiếp tục?" + +# AI Translated +msgid "Continue anyway?" +msgstr "Vẫn tiếp tục?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Bật \"Tự động điều chỉnh\" để khắc phục việc này tự động, hoặc vẫn tiếp tục?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "Bật \"Tự động chia tỷ lệ theo đầu phun\" và \"Tự động điều chỉnh\" để khắc phục việc này tự động, hoặc vẫn tiếp tục?" + msgid "Start retraction length: " msgstr "Độ dài rút bắt đầu: " @@ -22585,6 +22702,9 @@ msgstr "" "Tránh cong vênh\n" "Bạn có biết rằng khi in vật liệu dễ cong vênh như ABS, tăng nhiệt độ bàn nóng một cách thích hợp có thể giảm xác suất cong vênh không?" +#~ msgid "Print order within a single layer." +#~ msgstr "Thứ tự in trong một lớp đơn." + #~ msgid "Bottom" #~ msgstr "Dưới" @@ -22627,9 +22747,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "°C" -#~ msgid "%" -#~ msgstr "%" - #~ msgctxt "Sync_Nozzle_AMS" #~ msgid "Cancel" #~ msgstr "Hủy" diff --git a/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po b/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po index 56ab729edb..f7ca502c9e 100644 --- a/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po +++ b/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Slic3rPE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: 2026-06-11 12:37-0300\n" "Last-Translator: Handle \n" "Language-Team: \n" @@ -3694,6 +3694,10 @@ msgstr "自动摆放中..." msgid "Arranging" msgstr "自动摆放" +# AI Translated +msgid "Arranging " +msgstr "自动摆放 " + msgid "Arranging canceled." msgstr "已取消自动摆放。" @@ -8978,6 +8982,21 @@ msgstr "调暗下方图层" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "在切片预览中拖动图层滑块时,将当前图层下方的图层渲染为变暗状态,以便只有正在查看的图层以完整亮度显示。" +# AI Translated +msgid "Dimmed layer brightness" +msgstr "调暗图层的亮度" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"启用“调暗下方图层”时,被调暗的图层以多高的亮度显示。\n" +"99% 表示几乎不变暗,0% 表示显示为纯黑。上限为 99%,因为 100% 与关闭该选项的效果相同。" + msgid "Login region" msgstr "登录区域" @@ -12949,12 +12968,37 @@ msgstr "逐件" msgid "Intra-layer order" msgstr "层内打印顺序" -msgid "Print order within a single layer." -msgstr "同一层内的打印顺序" +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"在同一层内访问各对象实例的顺序,它决定了在实例之间移动所花费的空驶量。\n" +"\n" +"默认:以最近邻方式串联,并通过 2-opt 和交叉消除进行优化。通常是较好的选择。\n" +"按对象列表中的顺序:不做任何路径优化,按对象列表中的顺序打印各实例。需要可预测、手动控制的顺序时使用。\n" +"全部比较(最短路径):评估所有策略并采用最短的一种。对象实例的顺序在整个打印任务中只确定一次,而各个岛的排序则逐层确定,因此不同层可能采用不同的策略。切片速度略慢。\n" +"蛇形:逐行往复的蛇形遍历,并通过 2-opt 进行优化。非常适合由大量小零件组成的规则阵列。\n" +"\n" +"当同一层中使用多种耗材丝或工具时,优先减少换料次数:对象会先按耗材丝分组,本设置仅决定每个耗材丝分组内实例的顺序,因此整体顺序看起来可能不是整个热床上的最短路径。" msgid "As object list" msgstr "按对象列表中的顺序" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "全部比较(最短路径)" + +# AI Translated +msgid "Snake" +msgstr "蛇形" + msgid "Slow printing down for better layer cooling" msgstr "降低打印速度 以得到更好的冷却" @@ -18278,6 +18322,20 @@ msgstr "" "主机名 %1% 指向了多个IP地址\n" "请在其中选择一个正在使用的地址。" +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "根据喷嘴自动缩放" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"该模型是按 0.4 mm 喷嘴和 0.2 mm 层高设计的。 \n" +"启用缩放选项后(推荐),模型会根据当前喷嘴直径和合适的层高动态调整尺寸,使测试既准确又易于读取。\n" +"只有当您希望完全按原样打印参考模型时,才关闭缩放。" + msgid "PA Calibration" msgstr "压力提前/PA校准" @@ -18412,6 +18470,14 @@ msgstr "起始速度" msgid "End speed: " msgstr "结束速度" +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "自动调整以适应最大体积流量" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "如果结束速度会超过耗材丝的最大体积流量,则自动降低层高(保持标准数值并处于机器限制范围内)以达到该速度。如果连最小层高也不够,则改为降低结束速度。" + msgid "" "Please input valid values:\n" "start > 10\n" @@ -18423,6 +18489,57 @@ msgstr "" "步进长度 >= 0\n" "结束 > 开始 + 步进长度)" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"结束速度(%.0f mm/s)超过了耗材丝的最大体积流量(%.1f mm³/s),在当前线宽和层高下,外墙被限制在约 %.0f mm/s。\n" +" 超过该值的速度会被钳制,因此塔的上部区块不会以请求的速度打印。\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"结束速度(%.0f mm/s)超过了耗材丝的最大体积流量(%.1f mm³/s)(默认层高 %.2f mm 时)。\n" +"\n" +"层高已降至 %.2f mm(该打印机配置中使用的数值),以便塔能够达到请求的速度。" + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"即使采用该打印机配置中使用的最小层高(%.2f mm),结束速度(%.0f mm/s)仍超过耗材丝的最大体积流量(%.1f mm³/s)。\n" +"\n" +"层高将设为 %.2f mm,结束速度将降至 %.0f mm/s。\n" +"\n" +"是否继续?" + +# AI Translated +msgid "Continue anyway?" +msgstr "仍要继续吗?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "启用“自动调整”可自动解决该问题,或者仍要继续?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "启用“根据喷嘴自动缩放”和“自动调整”可自动解决该问题,或者仍要继续?" + msgid "Start retraction length: " msgstr "起始回抽长度" @@ -20994,6 +21111,9 @@ msgstr "" "避免翘曲\n" "您知道吗?打印ABS这类易翘曲材料时,适当提高热床温度可以降低翘曲的概率。" +#~ msgid "Print order within a single layer." +#~ msgstr "同一层内的打印顺序" + #~ msgid "Bottom" #~ msgstr "底部" @@ -21086,9 +21206,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "°C" -#~ msgid "%" -#~ msgstr "%" - #~ msgid "Renders cast shadows on the plate in realistic view." #~ msgstr "在写实渲染中渲染投射到打印板上的阴影。" diff --git a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po index 8885759c88..912396eea8 100644 --- a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po +++ b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-26 21:59-0300\n" +"POT-Creation-Date: 2026-07-29 17:40-0300\n" "PO-Revision-Date: 2025-11-28 13:48-0600\n" "Last-Translator: tntchn <15895303+tntchn@users.noreply.github.com>\n" "Language-Team: \n" @@ -3795,6 +3795,10 @@ msgstr "自動擺放中..." msgid "Arranging" msgstr "自動擺放" +# AI Translated +msgid "Arranging " +msgstr "自動擺放 " + msgid "Arranging canceled." msgstr "已取消自動擺放。" @@ -4675,7 +4679,7 @@ msgid "" "Too small max volumetric speed.\n" "Value was reset to 0.5" msgstr "" -"最大體積速度設定過小\n" +"最大體積流量設定過小\n" "重設為 0.5" #, c-format, boost-format @@ -9151,6 +9155,21 @@ msgstr "使下方層變暗" msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." msgstr "在切片預覽中拖曳層滑桿時,將目前層以下的各層算繪為變暗,如此只有正在檢視的層以全亮度顯示。" +# AI Translated +msgid "Dimmed layer brightness" +msgstr "變暗層的亮度" + +msgid "%" +msgstr "%" + +# AI Translated +msgid "" +"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" +"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." +msgstr "" +"啟用「使下方層變暗」時,變暗的層以多高的亮度顯示。\n" +"99% 幾乎不會變暗,0% 會顯示為全黑。上限為 99%,因為 100% 與停用此選項的效果相同。" + msgid "Login region" msgstr "登入區域" @@ -13162,12 +13181,37 @@ msgstr "逐件" msgid "Intra-layer order" msgstr "單層順序" -msgid "Print order within a single layer." -msgstr "每一層的列印順序" +# AI Translated +msgid "" +"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" +"\n" +"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n" +"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n" +"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n" +"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n" +"\n" +"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." +msgstr "" +"在同一層內走訪各物件實例的順序,這會決定在實例之間移動所花費的空駛量。\n" +"\n" +"預設:以最近鄰方式串接,並以 2-opt 與交叉消除進行改善。通常是不錯的選擇。\n" +"按照物件清單排序:不做任何路徑最佳化,依照物件清單的順序列印各實例。需要可預測、手動控制的順序時使用。\n" +"全部比較(最短路徑):評估所有策略並採用最短的一種。物件實例的順序在整個列印工作中只決定一次,而個別島嶼的排序則逐層決定,因此不同層可能採用不同的策略。切片速度略慢。\n" +"蛇形:逐行往復的蛇形走訪,並以 2-opt 進行改善。非常適合由大量小零件組成的規則陣列。\n" +"\n" +"當同一層中使用多種線材或工具時,會優先減少換料次數:物件會先依線材分組,此設定僅決定每個線材群組內實例的順序,因此整體順序看起來可能不是整個列印板上的最短路徑。" msgid "As object list" msgstr "按照物件清單排序" +# AI Translated +msgid "Best of all (shortest path)" +msgstr "全部比較(最短路徑)" + +# AI Translated +msgid "Snake" +msgstr "蛇形" + msgid "Slow printing down for better layer cooling" msgstr "降低列印速度 以得到更好的冷卻" @@ -18461,6 +18505,20 @@ msgstr "" "有多個 IP 位址解析到主機名稱 %1%。\n" "請選擇一個要使用的 IP 位址。" +# AI Translated +msgid "Auto-scale for nozzle" +msgstr "依噴嘴自動縮放" + +# AI Translated +msgid "" +"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" +"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" +"Turn scaling off only if you wish to print the reference model exactly as-is." +msgstr "" +"此模型是以 0.4 mm 噴嘴與 0.2 mm 層高為基準設計的。 \n" +"啟用縮放選項後(建議),模型會依目前的噴嘴直徑與合適的層高動態調整尺寸,使測試既準確又容易判讀。\n" +"只有在您想完全按原樣列印參考模型時,才關閉縮放。" + msgid "PA Calibration" msgstr "PA 校正" @@ -18597,6 +18655,14 @@ msgstr "起始速度:" msgid "End speed: " msgstr "結束速度:" +# AI Translated +msgid "Auto-adjust to max volumetric speed" +msgstr "自動調整以符合最大體積流量" + +# AI Translated +msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." +msgstr "如果結束速度會超過線材的最大體積流量,則自動降低層高(維持標準數值並處於機器限制範圍內)以達到該速度。如果連最小層高也不夠,則改為降低結束速度。" + msgid "" "Please input valid values:\n" "start > 10\n" @@ -18608,6 +18674,57 @@ msgstr "" "步距 >= 0\n" "結束 > 開始 + 步距)" +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" +" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n" +"\n" +"%s" +msgstr "" +"結束速度(%.0f mm/s)超過線材的最大體積流量(%.1f mm³/s),在目前的線寬與層高下,外牆被限制在約 %.0f mm/s。\n" +" 超過該值的速度會被箝制,因此塔的上部區塊不會以要求的速度列印。\n" +"\n" +"%s" + +# AI Translated +#, c-format, boost-format +msgid "" +"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" +"\n" +"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." +msgstr "" +"結束速度(%.0f mm/s)超過線材的最大體積流量(%.1f mm³/s)(預設層高 %.2f mm 時)。\n" +"\n" +"層高已降至 %.2f mm(此印表機的設定檔中使用的數值),以便塔能夠達到要求的速度。" + +# AI Translated +#, c-format, boost-format +msgid "" +"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" +"\n" +"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n" +"\n" +"Continue?" +msgstr "" +"即使採用此印表機的設定檔中使用的最小層高(%.2f mm),結束速度(%.0f mm/s)仍超過線材的最大體積流量(%.1f mm³/s)。\n" +"\n" +"層高將設為 %.2f mm,結束速度將降至 %.0f mm/s。\n" +"\n" +"是否繼續?" + +# AI Translated +msgid "Continue anyway?" +msgstr "仍要繼續嗎?" + +# AI Translated +msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "啟用「自動調整」可自動解決此問題,或者仍要繼續?" + +# AI Translated +msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" +msgstr "啟用「依噴嘴自動縮放」和「自動調整」可自動解決此問題,或者仍要繼續?" + msgid "Start retraction length: " msgstr "起始回抽長度:" @@ -21206,6 +21323,9 @@ msgstr "" "避免翹曲\n" "您知道嗎?當列印容易翹曲的材料(如 ABS)時,適當提高熱床溫度可以降低翹曲的機率。" +#~ msgid "Print order within a single layer." +#~ msgstr "每一層的列印順序" + #~ msgid "Bottom" #~ msgstr "底部" @@ -21298,9 +21418,6 @@ msgstr "" #~ msgid "°C" #~ msgstr "°C" -#~ msgid "%" -#~ msgstr "%" - #~ msgid "Renders cast shadows on the plate in realistic view." #~ msgstr "在擬真檢視中於列印板上算繪投射陰影。" From 303be94262a3240ecc436dfde92344a91acbf952 Mon Sep 17 00:00:00 2001 From: Kris Austin Date: Thu, 30 Jul 2026 08:02:44 -0500 Subject: [PATCH 025/106] feat(msix): add execution alias and web link associations to the Store package (#14799) --- scripts/msix/AppxManifest.xml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/scripts/msix/AppxManifest.xml b/scripts/msix/AppxManifest.xml index 62b2216c5a..fd4c89edb0 100644 --- a/scripts/msix/AppxManifest.xml +++ b/scripts/msix/AppxManifest.xml @@ -2,11 +2,13 @@ + IgnorableNamespaces="uap uap3 rescap rescap3 desktop desktop6 virtualization"> + + + + + + + + + + + + + + From 54dc5a2f1df7a968509f7948fe073afde090e79f Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Thu, 30 Jul 2026 21:08:04 +0300 Subject: [PATCH 026/106] Hungarian localization overhaul (#15024) --- localization/i18n/hu/OrcaSlicer_hu.po | 1055 +++++++++++++------------ 1 file changed, 530 insertions(+), 525 deletions(-) diff --git a/localization/i18n/hu/OrcaSlicer_hu.po b/localization/i18n/hu/OrcaSlicer_hu.po index 7cac58ce43..bd4a9915c8 100644 --- a/localization/i18n/hu/OrcaSlicer_hu.po +++ b/localization/i18n/hu/OrcaSlicer_hu.po @@ -300,13 +300,13 @@ msgid "Tungsten Carbide" msgstr "Volfrám-karbid" msgid "The toolhead and hotend rack may move. Please keep your hands away from the chamber." -msgstr "Előfordulhat, hogy a szerszámfej és a hotendtartó megmozdul. Kérjük, ne nyúlj a kamrába." +msgstr "Előfordulhat, hogy a szerszámfej és a fejegységtartó megmozdul. Kérlek, ne nyúlj a kamrába." msgid "Warning" msgstr "Figyelmeztetés" msgid "Hotend information may be inaccurate. Would you like to re-read the hotend? (Hotend information may change during power-off)." -msgstr "A hotendinformációk pontatlanok lehetnek. Szeretnéd újra beolvasni a hotendet? (A hotendinformáció kikapcsolt állapotban megváltozhat)." +msgstr "A fejegység adatai pontatlanok lehetnek. Szeretnéd újra beolvasni a fejegységet? (A fejegység adatai kikapcsolt állapotban megváltozhatnak.)" msgid "I confirm all" msgstr "Összes megerősítése" @@ -315,10 +315,10 @@ msgid "Re-read all" msgstr "Összes újraolvasása" msgid "Reading the hotends, please wait." -msgstr "A hotendek beolvasása folyamatban van, kérjük várj." +msgstr "A fejegységek beolvasása folyamatban van, kérlek, várj." msgid "During the hotend upgrade, the toolhead will move. Don't reach into the chamber." -msgstr "A hotend felismerése során a szerszámfej mozogni fog. Ne nyúlj be a kamrába." +msgstr "A fejegység felismerése közben a szerszámfej mozogni fog. Ne nyúlj be a kamrába." # AI Translated msgid "Update" @@ -370,10 +370,10 @@ msgid "Error" msgstr "Hiba" msgid "Induction Hotend Rack" -msgstr "Indukciós hotendtartó" +msgstr "Indukciós fejegységtartó" msgid "Hotends Info" -msgstr "Hotendek adatai" +msgstr "Fejegységek adatai" msgid "Read All" msgstr "Összes beolvasása" @@ -382,7 +382,7 @@ msgid "Reading " msgstr "Beolvasás " msgid "Please wait" -msgstr "Kérjük, várj" +msgstr "Kérlek, várj" # AI Translated msgid "Reading" @@ -395,10 +395,10 @@ msgid "Raised" msgstr "Felemelve" msgid "The hotend is in an abnormal state and currently unavailable. Please go to 'Device -> Upgrade' to upgrade firmware." -msgstr "A hotend állapota rendellenes, és jelenleg nem elérhető. Kérjük, lépj az „Eszköz -> Frissítés“ oldalra a firmware frissítéséhez." +msgstr "A fejegység állapota rendellenes és jelenleg nem elérhető. Kérlek, lépj az „Eszköz -> Frissítés“ oldalra a firmware frissítéséhez." msgid "Abnormal Hotend" -msgstr "Rendellenes hotend" +msgstr "Rendellenes fejegység" msgid "Cancel" msgstr "Mégse" @@ -413,7 +413,7 @@ msgid "Refreshing" msgstr "Frissítés" msgid "Hotend status abnormal, unavailable at present. Please upgrade the firmware and try again." -msgstr "A hotend állapota nem megfelelő, jelenleg nem kérdezhető le. Frissítsd a firmware-t, és próbáld újra." +msgstr "A fejegység állapota rendellenes, ezért jelenleg nem használható. Frissítsd a firmware-t, majd próbáld újra." # AI Translated msgid "SN" @@ -427,10 +427,10 @@ msgid "Used Time: %s" msgstr "Felhasznált idő: %s" msgid "Dynamic nozzles are allocated on the current plate. Picking hotend is not supported." -msgstr "A dinamikus fúvókák a jelenlegi tálcához vannak kiosztva. A hotend kiválasztása nem támogatott." +msgstr "A dinamikus fúvókák a jelenlegi tálcához vannak kiosztva. A fejegység kiválasztása nem támogatott." msgid "Hotend Rack" -msgstr "Hotendtartó" +msgstr "Fejegységtartó" msgid "ToolHead" msgstr "Szerszámfej" @@ -542,7 +542,7 @@ msgid "Paint-on supports editing" msgstr "Festett támaszok szerkesztése" msgid "Gizmo-Place on Face" -msgstr "Gizmo-Felület Tárgyasztalra Illesztése" +msgstr "Gizmo – felület asztalra illesztése" msgid "Lay on Face" msgstr "Felületre fektetés" @@ -633,22 +633,22 @@ msgid "Color painting editing" msgstr "Színfestés szerkesztése" msgid "Paint-on fuzzy skin" -msgstr "Festett bolyhos felület" +msgstr "Festett barázdált felület" msgid "Add fuzzy skin" -msgstr "Bolyhos felület hozzáadása" +msgstr "Barázdált felület hozzáadása" msgid "Remove fuzzy skin" -msgstr "Bolyhos felület eltávolítása" +msgstr "Barázdált felület eltávolítása" msgid "Reset selection" msgstr "Kijelölés visszaállítása" msgid "Warning: Fuzzy skin is disabled, painted fuzzy skin will not take effect!" -msgstr "Figyelmeztetés: a bolyhos felület ki van kapcsolva, ezért a festett bolyhos felület nem lesz érvényes!" +msgstr "Figyelmeztetés: a barázdált felület ki van kapcsolva, ezért a festett barázdált felület nem lesz érvényes!" msgid "Enable painted fuzzy skin for this object" -msgstr "Festett bolyhos felület engedélyezése ennél az objektumnál" +msgstr "Festett barázdált felület engedélyezése ennél az objektumnál" # AI Translated msgid "Entering Paint-on fuzzy skin" @@ -678,7 +678,7 @@ msgid "Gizmo-Rotate" msgstr "Gizmo-Forgatás" msgid "Optimize orientation" -msgstr "Orientáció optimalizálása" +msgstr "Tájolás optimalizálása" msgctxt "Verb" msgid "Scale" @@ -738,7 +738,7 @@ msgid "Group operations" msgstr "Csoportos műveletek" msgid "Set orientation" -msgstr "Orientáció beállítása" +msgstr "Tájolás beállítása" msgid "Set scale" msgstr "Méretarány beállítása" @@ -799,7 +799,7 @@ msgid "Auto" msgstr "Automatikus" msgid "Manual" -msgstr "Manuális" +msgstr "Kézi" msgid "Plug" msgstr "Dugó" @@ -1092,7 +1092,7 @@ msgstr "Csökkentési arány" #, boost-format msgid "Processing model '%1%' with more than 1M triangles could be slow. It is highly recommended to simplify the model." -msgstr "A több mint 1M háromszöget tartalmazó '%1%' modell feldolgozása lehet, hogy lassú lesz. Erősen ajánlott a modell leegyszerűsítése." +msgstr "A(z) '%1%' modell több mint 1 millió háromszöget tartalmaz, ezért a feldolgozása lassú lehet. Erősen ajánlott egyszerűsíteni a modellt." msgid "Simplify model" msgstr "Modell egyszerűsítése" @@ -1700,8 +1700,8 @@ msgid "" "Do NOT save local path to 3MF file.\n" "Also disables 'reload from disk' option." msgstr "" -"NE mentse a helyi elérési utat a 3MF fájlba.\n" -"Ezzel az \"újratöltés lemezről\" opció is letiltásra kerül." +"Nem menti a helyi elérési utat a 3MF-fájlba.\n" +"Az „Újratöltés lemezről” lehetőséget is kikapcsolja." #. TRN: An menu option to convert the SVG into an unmodifiable model part. msgid "Bake" @@ -1835,7 +1835,7 @@ msgid "Measure" msgstr "Mérés" msgid "Please confirm explosion ratio = 1, and please select at least one object." -msgstr "Erősítsd meg, hogy az explosion ratio = 1, és válassz ki legalább egy objektumot." +msgstr "Állítsd 1-re a széthúzás mértékét, majd válassz ki legalább egy objektumot." msgid "Edit to scale" msgstr "Méretre szerkesztés" @@ -1941,7 +1941,7 @@ msgid "Assemble" msgstr "Összeállítás" msgid "Please confirm explosion ratio = 1 and select at least two volumes." -msgstr "Erősítsd meg, hogy a terjedési arány = 1, és válassz ki legalább két térfogatot." +msgstr "Állítsd 1-re a széthúzás mértékét, majd válassz ki legalább két térfogatot." msgid "Please select at least two volumes." msgstr "Válassz ki legalább két térfogatot." @@ -2101,9 +2101,9 @@ msgid "" msgstr "" "A 2.4.0-s verziótól kezdve az OrcaSlicer a felhasználói profilokat a Bambu Cloud helyett az Orca Cloudon keresztül szinkronizálja.\n" "\n" -"Meglévő profiljai átviteléhez jelentkezzen be az Orca Cloudba, és azok automatikusan átkerülnek. Ha többet szeretne megtudni arról, hogyan tárolja és szinkronizálja az OrcaSlicer a profiljait, vagy ha kézzel szeretné átvinni a beállításait, tekintse meg a wikinket.\n" +"A meglévő profiljaid átviteléhez jelentkezz be az Orca Cloudba, és a rendszer automatikusan átviszi őket. Ha többet szeretnél megtudni arról, hogyan tárolja és szinkronizálja az OrcaSlicer a profiljaidat, vagy hogyan viheted át kézzel a beállításaidat, nézd meg a wikinket.\n" "\n" -"Ha nem használta a Bambu Cloudot a profilok szinkronizálásához, ez a változás nem érinti Önt, és nyugodtan figyelmen kívül hagyhatja ezt az üzenetet." +"Ha nem használtad a Bambu Cloudot a profilok szinkronizálásához, ez a változás nem érint, és nyugodtan figyelmen kívül hagyhatod ezt az üzenetet." # AI Translated msgid "Profile syncing change" @@ -2150,7 +2150,7 @@ msgid "" msgstr "" "A Microsoft WebView2 Runtime telepítése nem sikerült.\n" "Egyes funkciók, köztük a beállítási varázsló, üresen jelenhetnek meg a telepítéséig.\n" -"Kérlek, telepítsd kézzel innen: https://developer.microsoft.com/microsoft-edge/webview2/ , majd indítsd újra az Orca Slicert." +"Kérlek, telepítsd kézzel innen: https://developer.microsoft.com/microsoft-edge/webview2/, majd indítsd újra az Orca Slicert." #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -2172,7 +2172,7 @@ msgid "Click to download new version in default browser: %s" msgstr "Kattints az új verzió letöltéséhez az alapértelmezett böngészőben: %s" msgid "OrcaSlicer needs an update" -msgstr "A Orca Slicert frissíteni kell" +msgstr "Az OrcaSlicert frissíteni kell" msgid "This is the newest version." msgstr "Ez a legújabb verzió." @@ -2271,7 +2271,7 @@ msgid "Open Project" msgstr "Projekt megnyitása" msgid "The version of Orca Slicer is too low and needs to be updated to the latest version before it can be used normally." -msgstr "A Orca Slicer ezen verziója túl régi és a legfrissebb verzióra kell frissíteni, mielőtt rendesen használható lenne" +msgstr "Az Orca Slicer ezen verziója túl régi. A megfelelő működéshez frissítsd a legújabb verzióra." # AI Translated msgid "Cloud sync conflict:" @@ -2391,7 +2391,7 @@ msgstr "Adatvédelmi szabályzat frissítése" #, c-format, boost-format msgid "your Orca Cloud profile (user ID: \"%s\")" -msgstr "a Orca Cloud-profilod (felhasználói azonosító: \"%s\")" +msgstr "az Orca Cloud-profilod (felhasználói azonosító: \"%s\")" msgid "your default profile" msgstr "az alapértelmezett profilod" @@ -2406,9 +2406,9 @@ msgid "" "Do you want to migrate them to your OrcaCloud profile?\n" "This will copy your presets so they are available under your new account." msgstr "" -"Meglévő felhasználói beállítások találhatók a %s-ban.\n" -"Szeretnéd áttelepíteni őket OrcaCloud-profilba?\n" -"Ezzel átmásolja az beállítás értékeket, így azok elérhetők lesznek az új fiókjában." +"Meglévő felhasználói beállításokat találtunk itt: %s.\n" +"Szeretnéd áttelepíteni őket az Orca Cloud-profilodba?\n" +"Ezzel átmásolod a beállításaidat, így azok az új fiókodban is elérhetők lesznek." # AI Translated msgid "Migrate User Presets" @@ -2423,7 +2423,7 @@ msgstr "" "%s" msgid "The number of user presets cached in the cloud has exceeded the upper limit, newly created user presets can only be used locally." -msgstr "A felhőben tárolt felhasználói beállítások száma elérte a limitet, az újonnan létrehozott felhasználói beállítások csak helyben lesznek tárolva." +msgstr "A felhőben tárolt felhasználói beállítások száma elérte a felső korlátot. Az újonnan létrehozott felhasználói beállítások csak helyileg használhatók." msgid "Sync user presets" msgstr "Felhasználói beállítások szinkronizálása" @@ -2547,7 +2547,7 @@ msgid "Rename" msgstr "Átnevezés" msgid "Orca Slicer GUI initialization failed" -msgstr "Nem sikerült a Orca Slicer GUI inicializálása" +msgstr "Nem sikerült inicializálni az Orca Slicer grafikus felületét" #, boost-format msgid "Fatal error, exception: %1%" @@ -2761,7 +2761,7 @@ msgid "Fill bed with copies" msgstr "Asztal kitöltése másolatokkal" msgid "Fill the remaining area of bed with copies of the selected object" -msgstr "A tárgyasztal fennmaradó területének kitöltése a kijelölt objektum másolataival" +msgstr "Az asztal fennmaradó területének kitöltése a kijelölt objektum másolataival" msgid "Printable" msgstr "Nyomtatható" @@ -2770,7 +2770,7 @@ msgid "Auto Drop" msgstr "Automatikus leejtés" msgid "Automatically drops the selected object to the build plate." -msgstr "A kiválasztott objektumot automatikusan az építőlemezre ejti" +msgstr "A kiválasztott objektumot automatikusan az asztalra ejti" msgid "Fix Model" msgstr "Model javítása" @@ -2806,7 +2806,7 @@ msgid "Replace all selected parts with 3D files from folder" msgstr "Az összes kijelölt alkatrész cseréje mappából származó 3D fájlokra" msgid "Change filament" -msgstr "Filament csere" +msgstr "Filamentcsere" msgid "Set filament for selected items" msgstr "Filament beállítása a kiválasztott tárgyakhoz" @@ -2937,7 +2937,7 @@ msgid "Split the selected object" msgstr "Szétválasztja a kijelölt objektumot" msgid "Auto orientation" -msgstr "Automatikus orientáció" +msgstr "Automatikus tájolás" msgid "Auto orient the object to improve print quality" msgstr "Az objektum automatikus tájolása a nyomtatási minőség javítása érdekében." @@ -3015,7 +3015,7 @@ msgid "Fill bed with instances" msgstr "Asztal kitöltése példányokkal" msgid "Fill the remaining area of bed with instances of the selected object" -msgstr "A tárgyasztal fennmaradó területének kitöltése a kijelölt objektum példányaival" +msgstr "Az asztal fennmaradó területének kitöltése a kijelölt objektum példányaival" msgid "Clone" msgstr "Klónozás" @@ -3048,13 +3048,13 @@ msgid "Edit print parameters for a single object" msgstr "Nyomtatási paraméterek szerkesztése egy objektumhoz" msgid "Change Filament" -msgstr "Filament csere" +msgstr "Filamentcsere" msgid "Set Filament for selected items" msgstr "Filament beállítása a kiválasztott tárgyakhoz" msgid "Automatically snaps the selected object to the build plate." -msgstr "A kiválasztott objektumot automatikusan az építőlemezre illeszti" +msgstr "A kiválasztott objektumot automatikusan az asztalra illeszti" msgid "Unlock" msgstr "Feloldás" @@ -3097,7 +3097,7 @@ msgid "Click the icon to repair model object" msgstr "Kattints az ikonra a modellobjektum javításához" msgid "Right click the icon to drop the object settings" -msgstr "Kattints jobb gombbal az ikonra az objektum beállításainak elvetéséhez" +msgstr "Kattints jobb gombbal az ikonra az objektumbeállítások elvetéséhez" msgid "Click the icon to reset all settings of the object" msgstr "Kattints az ikonra az objektum összes beállításának visszaállításához" @@ -3115,7 +3115,7 @@ msgid "Click the icon to edit color painting for the object" msgstr "Kattints az ikonra az objektum színfestésének szerkesztéséhez" msgid "Click the icon to shift this object to the bed" -msgstr "Kattints az ikonra az objektum tárgyasztalra helyezéséhez" +msgstr "Kattints az ikonra az objektum asztalra helyezéséhez" # AI Translated msgid "Rename Object" @@ -3176,7 +3176,7 @@ msgid "Error!" msgstr "Hiba!" msgid "Failed to get the model data in the current file." -msgstr "Nem sikerült beolvasni a modelladatokat az aktuális fájlba." +msgstr "Nem sikerült beolvasni a modelladatokat az aktuális fájlból." # AI Translated msgid "Add primitive" @@ -3192,7 +3192,7 @@ msgid "Switch to per-object setting mode to edit process settings of selected ob msgstr "Válts át objektumonkénti beállítás módba a kiválasztott objektumok folyamatbeállításainak szerkesztéséhez." msgid "Remove paint-on fuzzy skin" -msgstr "Festett bolyhos felület eltávolítása" +msgstr "Festett barázdált felület eltávolítása" # AI Translated msgid "Delete Settings" @@ -3548,7 +3548,7 @@ msgid "Unload" msgstr "Kitöltés" msgid "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically load or unload filament." -msgstr "Válassz ki egy AMS-helyet, majd nyomd meg a \"Betöltés\" vagy a \"Kitöltés\" gombot az filament automatikus betöltéséhez vagy eltávolításához." +msgstr "Válassz ki egy AMS-helyet, majd nyomd meg a \"Betöltés\" vagy a \"Kihúzás\" gombot a filament automatikus betöltéséhez vagy kihúzásához." msgid "Filament type is unknown which is required to perform this action. Please set target filament's informations." msgstr "A művelethez szükséges filament típusa ismeretlen. Állítsd be a célfilament adatait." @@ -3672,7 +3672,7 @@ msgid "Grab new filament" msgstr "Új filament megragadása" msgid "Purge old filament" -msgstr "Régi filament kiürítése" +msgstr "Régi filament öblítése" msgid "Confirm extruded" msgstr "Extrudálás megerősítése" @@ -3771,7 +3771,7 @@ msgid "Set nozzle count" msgstr "Fúvókaszám beállítása" msgid "Please set nozzle count" -msgstr "Kérjük, állítsd be a fúvókaszámot" +msgstr "Kérlek, állítsd be a fúvókaszámot" msgid "Error: Can not set both nozzle count to zero." msgstr "Hiba: Nem lehet mindkét fúvóka számát nullára állítani." @@ -3813,10 +3813,10 @@ msgid "Unknown nozzle detected. Refresh to update (unrefreshed nozzles will be s msgstr "Ismeretlen fúvóka érzékelve. Frissítsd az adatokat (a nem frissített fúvókákat nem használjuk a szeleteléskor)." msgid "Please confirm whether the required nozzle diameter and flow rate match the currently displayed values." -msgstr "Kérjük, ellenőrizd, hogy a szükséges fúvókaátmérő és áramlási sebesség megegyezik-e a kijelzőn lévővel." +msgstr "Kérlek, ellenőrizd, hogy a szükséges fúvókaátmérő és áramlási sebesség megegyezik-e a kijelzőn látható értékekkel." msgid "Your printer has different nozzles installed. Please select a nozzle for this print." -msgstr "A nyomtatóban különböző fúvókák vannak. Kérjük, válassz egy fúvókát a nyomtatáshoz." +msgstr "A nyomtatóban különböző fúvókák vannak. Kérlek, válassz egy fúvókát a nyomtatáshoz." msgid "Ignore" msgstr "Mellőzés" @@ -3856,7 +3856,7 @@ msgid "Arranging canceled." msgstr "Elrendezése törölve." msgid "Arranging complete, but some items were not able to be arranged. Reduce spacing and try again." -msgstr "Az elrendezés megtörtént, de maradtak összeragadt tárgyak. Csökkentsd a térközt, és próbáld meg újra." +msgstr "Az elrendezés elkészült, de néhány tárgyat nem sikerült elhelyezni. Csökkentsd a térközt, majd próbáld újra." msgid "Arranging done." msgstr "Elrendezés kész." @@ -3877,20 +3877,20 @@ msgid "" "Cannot auto-orient these objects." msgstr "" "Az összes kijelölt objektum egy zárolt tálcán van,\n" -"nem lehet automatikus orientációt használni rajtuk." +"nem lehet automatikus tájolást használni rajtuk." msgid "" "This plate is locked.\n" "Cannot auto-orient on this plate." msgstr "" "Ez a tálca zárolva van.\n" -"Nem lehetséges az automatikus orientáció ezen a tálcán." +"Ezen a tálcán nem használható az automatikus tájolás." msgid "Orienting..." -msgstr "Orientáció folyamatban..." +msgstr "Tájolás folyamatban..." msgid "Orienting" -msgstr "Orientáció" +msgstr "Tájolás" msgid "Orienting canceled." msgstr "Tájolás megszakítva." @@ -3941,19 +3941,19 @@ msgid "The print file exceeds the maximum allowable size (1GB). Please simplify msgstr "A nyomtatási fájl mérete meghaladja a megengedett maximumot (1 GB). Egyszerűsítsd a modellt, majd szeletelj újra." msgid "Failed to send the print job. Please try again." -msgstr "Nem sikerült elküldeni a nyomtatási feladatot. Kérlek próbáld újra." +msgstr "Nem sikerült elküldeni a nyomtatási feladatot. Kérlek, próbáld újra." msgid "Failed to upload file to ftp. Please try again." msgstr "Nem sikerült feltölteni a fájlt FTP-re. Próbáld újra." msgid "Check the current status of the Bambu Lab server by clicking on the link above." -msgstr "A Bambu szerver aktuális állapotát a fenti hivatkozásra kattintva ellenőrizheted." +msgstr "A Bambu Lab szerver aktuális állapotát a fenti hivatkozásra kattintva ellenőrizheted." msgid "The size of the print file is too large. Please adjust the file size and try again." -msgstr "A nyomtatási fájl mérete túl nagy. Állítsd be a fájlméretet, és próbáld újra." +msgstr "A nyomtatási fájl mérete túl nagy. Állítsd be a fájlméretet, majd próbáld újra." msgid "Print file not found; please slice it again and send it for printing." -msgstr "A nyomtatási fájl nem található, szeleteld újra, és küldd nyomtatásra." +msgstr "A nyomtatási fájl nem található, szeleteld újra, majd küldd nyomtatásra." msgid "Failed to upload print file via FTP. Please check the network status and try again." msgstr "Nem sikerült feltölteni a nyomtatási fájlt FTP-re. Ellenőrizd a hálózati állapotot, majd próbáld újra." @@ -3992,7 +3992,7 @@ msgid "A Storage needs to be inserted before printing via LAN." msgstr "LAN-on keresztüli nyomtatás előtt be kell helyezni egy tárolót." msgid "Sending print job over LAN, but the Storage in the printer is abnormal and print-issues may be caused by this." -msgstr "A nyomtatási feladat LAN-on keresztül küldésre kerül, de a nyomtatóban lévő tároló rendellenes, ami nyomtatási problémákat okozhat." +msgstr "A nyomtatási feladat LAN-on keresztüli küldése folyamatban van, de a nyomtató tárolója rendellenes, ami nyomtatási problémákat okozhat." msgid "The Storage in the printer is abnormal. Please replace it with a normal Storage before sending print job to printer." msgstr "A nyomtatóban lévő tároló rendellenes. Cseréld normál tárolóra, mielőtt nyomtatási feladatot küldesz a nyomtatóra." @@ -4017,7 +4017,7 @@ msgid "Storage needs to be inserted before sending to printer." msgstr "A nyomtatóra küldés előtt be kell helyezni egy tárolót." msgid "Sending G-code file over LAN, but the Storage in the printer is abnormal and print-issues may be caused by this." -msgstr "A G-kód fájl LAN-on keresztül küldésre kerül, de a nyomtatóban lévő tároló rendellenes, ami nyomtatási problémákat okozhat." +msgstr "A G-kód fájl LAN-on keresztüli küldése folyamatban van, de a nyomtató tárolója rendellenes, ami nyomtatási problémákat okozhat." msgid "The Storage in the printer is abnormal. Please replace it with a normal Storage before sending to printer." msgstr "A nyomtatóban lévő tároló rendellenes. Cseréld normál tárolóra, mielőtt a nyomtatóra küldesz." @@ -4090,7 +4090,7 @@ msgid "The imported SLA archive did not contain any presets. The current SLA pre msgstr "Az importált SLA archívum nem tartalmazott beállításokat. Tartalékként az aktuális SLA beállítások kerültek használatra." msgid "You cannot load an SLA project with a multi-part object on the bed" -msgstr "Nem tölthető be SLA projekt, ha a tárgyasztalon több részből álló objektum van" +msgstr "Nem tölthető be SLA-projekt, ha az asztalon több részből álló objektum van" msgid "Please check your object list before preset changing." msgstr "A beállítás módosítása előtt ellenőrizd az objektumlistát." @@ -4126,13 +4126,13 @@ msgid "License" msgstr "Licenc" msgid "Orca Slicer is licensed under " -msgstr "A Orca Slicer a következő licencet használja " +msgstr "Az Orca Slicer a következő licencet használja " msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public License, 3-as verzió" msgid "Orca Slicer is based on PrusaSlicer and BambuStudio" -msgstr "Az Orca Slicer a PrusaSlicerre és a BambuStudióra épül" +msgstr "Az Orca Slicer a PrusaSlicerre és a BambuStudio-ra épül" msgid "Libraries" msgstr "Könyvtárak" @@ -4179,7 +4179,7 @@ msgid "The input value should be greater than %1% and less than %2%" msgstr "A megadott értéknek nagyobbnak kell lennie, mint %1% és kisebbnek, mint %2%" msgid "Factors of Flow Dynamics Calibration" -msgstr "Anyagáramlás kalibrálásának faktorai" +msgstr "Áramlásdinamika-kalibrálás tényezői" msgid "Wiki Guide" msgstr "Wiki útmutató" @@ -4194,7 +4194,7 @@ msgid "Factor N" msgstr "N-tényező" msgid "Setting AMS slot information while printing is not supported" -msgstr "Nyomtatás közben nem változtathatóak meg a AMS férőhelyek adatai" +msgstr "Nyomtatás közben nem módosíthatók az AMS-férőhelyek adatai" msgid "Setting Virtual slot information while printing is not supported" msgstr "Nyomtatás közben a virtuális férőhely adatai nem módosíthatók" @@ -4233,7 +4233,7 @@ msgid "Dynamic flow calibration" msgstr "Dinamikus anyagáramlás kalibráció" msgid "The nozzle temp and max volumetric speed will affect the calibration results. Please fill in the same values as the actual printing. They can be auto-filled by selecting a filament preset." -msgstr "A fúvóka hőmérséklete és a maximális anyagáramlás sebessége befolyásolja a kalibrációs eredményeket. Kérlek, add meg a nyomtatás használt tényleges értékeket. Ezek automatikusan is kitöltheted a megfelelő filamentbeállítás kiválasztásával." +msgstr "A fúvóka hőmérséklete és a maximális volumetrikus sebesség befolyásolja a kalibrálás eredményét. Add meg a tényleges nyomtatás során használt értékeket. Ezeket a megfelelő filamentbeállítás kiválasztásával automatikusan is kitöltheted." msgid "Nozzle Diameter" msgstr "Fúvóka átmérője" @@ -4267,14 +4267,14 @@ msgid "Next" msgstr "Következő" msgid "Calibration completed. Please find the most uniform extrusion line on your hot bed like the picture below, and fill the value on its left side into the factor K input box." -msgstr "A kalibrálás befejeződött. Kérlek, válaszd ki az alábbi képen láthatóhoz legjobban hasonlító, legegyenletesebb extrudálási vonalat, és írd be a bal oldalán lévő értéket a K-tényező beviteli mezőjébe." +msgstr "A kalibrálás befejeződött. Kérlek, válaszd ki az alábbi képen láthatóhoz legjobban hasonlító, legegyenletesebb extrudálási vonalat, majd írd be a bal oldalán lévő értéket a K-tényező beviteli mezőjébe." msgid "Save" msgstr "Mentés" msgctxt "Navigation" msgid "Back" -msgstr "Hátul" +msgstr "Vissza" msgid "Example" msgstr "Példa" @@ -4302,7 +4302,7 @@ msgid "" "And you can click it to modify" msgstr "" "Felső fél: Eredeti\n" -"Alsó fél: Hozzárendelés nélkül az eredeti projekt filamentje lesz használva.\n" +"Alsó fél: hozzárendelés nélkül az eredeti projekt filamentjét használja.\n" "Kattintással módosíthatod" msgid "" @@ -4385,7 +4385,7 @@ msgid "Please change the desiccant when it is too wet. The indicator may not rep msgstr "Cseréld a nedvszívót, ha túl nedves. A jelző nem mindig pontos az alábbi esetekben: ha a fedél nyitva van, vagy ha a nedvszívó csomag cserélve lett. A nedvesség elnyelése órákat vesz igénybe, és az alacsony hőmérséklet tovább lassítja a folyamatot." msgid "Configure which AMS slot should be used for a filament used in the print job." -msgstr "Add meg, hogy melyik AMS-férőhely legyen legyen hozzárendelve a nyomtatásnál használt filamenthez." +msgstr "Add meg, hogy melyik AMS-férőhely legyen hozzárendelve a nyomtatásnál használt filamenthez." msgid "Filament used in this print job" msgstr "A nyomtatási feladatban használt filament" @@ -4431,7 +4431,7 @@ msgid "The printer does not currently support auto refill." msgstr "A nyomtató jelenleg nem támogatja az automatikus újratöltést." msgid "AMS filament backup is not enabled; please enable it in the AMS settings." -msgstr "Az AMS filament tartalék funkció nincs engedélyezve, kapcsold be az AMS beállításokban." +msgstr "A tartalék filament használata nincs engedélyezve; kapcsold be az AMS beállításaiban." msgid "" "When the current filament runs out, the printer will use identical filament to continue printing.\n" @@ -4455,31 +4455,31 @@ msgid "Insertion update" msgstr "Frissítés" msgid "The AMS will automatically read the filament information when inserting a new Bambu Lab filament spool. This takes about 20 seconds." -msgstr "Az AMS automatikusan kiolvassa a filament információkat egy új Bambu Lab filament tekercs behelyezésekor. Ez körülbelül 20 másodpercet vesz igénybe." +msgstr "Új Bambu Lab filamenttekercs behelyezésekor az AMS automatikusan kiolvassa a filament adatait. Ez körülbelül 20 másodpercet vesz igénybe." msgid "Note: if a new filament is inserted during printing, the AMS will not automatically read any information until printing is completed." -msgstr "Megjegyzés: ha nyomtatás során új filament kerül behelyezésre, az AMS nem fogja automatikusan kiolvasni az információkat a nyomtatás végéig." +msgstr "Megjegyzés: ha nyomtatás közben új filamentet helyezel be, az AMS csak a nyomtatás befejezése után olvassa ki automatikusan az adatait." msgid "When inserting a new filament, the AMS will not automatically read its information, leaving it blank for you to enter manually." -msgstr "Új filament behelyezésekor az AMS nem fogja automatikusan kiolvasni az információkat, hanem üresen hagyja azokat, így kézzel kell megadnod." +msgstr "Új filament behelyezésekor az AMS nem olvassa ki automatikusan az adatait, hanem üresen hagyja őket, hogy kézzel adhasd meg." msgid "Update on startup" msgstr "Frissítés bekapcsoláskor" msgid "The AMS will automatically read the information of inserted filament on start-up. It will take about 1 minute. The reading process will rotate the filament spools." -msgstr "Az AMS indításkor automatikusan kiolvassa a behelyezett filament adatait. Ez körülbelül 1 percet vesz igénybe. A leolvasási folyamat során a filamenttekercsek feltekercselésre kerülnek." +msgstr "Az AMS indításkor automatikusan kiolvassa a behelyezett filament adatait. Ez körülbelül 1 percet vesz igénybe. A leolvasás közben a filamenttekercsek forognak." msgid "The AMS will not automatically read information from inserted filament during startup and will continue to use the information recorded before the last shutdown." -msgstr "Az AMS indításkor nem olvassa ki automatikusan az információkat a behelyezett filamentről, és továbbra is a legutóbbi leállítás előtt rögzített információkat használja." +msgstr "Az AMS indításkor nem olvassa ki automatikusan a behelyezett filament adatait, hanem továbbra is a legutóbbi leállítás előtt rögzített adatokat használja." msgid "Update remaining capacity" -msgstr "Fennmaradó kapacitás frissítése" +msgstr "Hátralévő filamentmennyiség frissítése" msgid "AMS will attempt to estimate the remaining capacity of the Bambu Lab filaments." -msgstr "Az AMS megpróbálja megbecsülni a Bambu Lab filamentek fennmaradó kapacitását." +msgstr "Az AMS megpróbálja megbecsülni a Bambu Lab filamenttekercseken hátralévő mennyiséget." msgid "AMS filament backup" -msgstr "AMS filament tartalék" +msgstr "Automatikus váltás tartalék tekercsre" msgid "AMS will continue to another spool with matching filament properties automatically when current filament runs out." msgstr "Az AMS automatikusan egy másik, azonos tulajdonságú filamentre vált, ha az aktuális filament kifogy." @@ -4488,7 +4488,7 @@ msgid "Air Printing Detection" msgstr "Levegőbe nyomtatás észlelése" msgid "Detects clogging and filament grinding, halting printing immediately to conserve time and filament." -msgstr "Észleli az eltömődést és a filament darálását, és az idő és filament takarékossága érdekében azonnal leállítja a nyomtatást." +msgstr "Észleli az eltömődést és a filament ledarálását, majd azonnal leállítja a nyomtatást, így időt és filamentet takarít meg." msgid "AMS Type" msgstr "AMS típus" @@ -4518,10 +4518,10 @@ msgid "Calibration" msgstr "Kalibrálás" msgid "Failed to download the plug-in. Please check your firewall settings and VPN software and retry." -msgstr "Nem sikerült letölteni a bővítményt. Kérlek, ellenőrizd a tűzfal beállításait és a VPN-szoftvert, majd próbálja meg újra." +msgstr "Nem sikerült letölteni a bővítményt. Kérlek, ellenőrizd a tűzfal beállításait és a VPN-szoftvert, majd próbáld újra." msgid "Failed to install the plug-in. The plug-in file may be in use. Please restart OrcaSlicer and try again. Also check whether it is blocked or has been deleted by anti-virus software." -msgstr "Nem sikerült telepíteni a bővítményt. Lehet, hogy a bővítményfájl használatban van. Indítsd újra az OrcaSlicert, majd próbáld újra. Ellenőrizd azt is, hogy vírusirtó szoftver nem blokkolta vagy törölte-e." +msgstr "Nem sikerült telepíteni a bővítményt. Lehet, hogy a bővítményfájl használatban van. Indítsd újra az OrcaSlicert, majd próbáld újra. Ellenőrizd azt is, hogy nem blokkolta-e vagy törölte-e egy vírusirtó program." msgid "Click here to see more info" msgstr "Kattints ide további információkért" @@ -4533,16 +4533,16 @@ msgid "Restart Required" msgstr "Újraindítás szükséges" msgid "Please home all axes (click " -msgstr "Kérlek, végezd el a tengelyek alaphelyzetbe állítását (kattints" +msgstr "Kérlek, állítsd alaphelyzetbe az összes tengelyt (kattints " msgid ") to locate the toolhead's position. This prevents device moving beyond the printable boundary and causing equipment wear." -msgstr "). Ez megakadályozza, hogy a nyomtató megpróbálja a nyomtatható területen túlra mozgatni a fejet, ezzel az eszköz esetleges meghibásodását kockáztatva." +msgstr "). Így a nyomtató nem mozgatja a fejet a nyomtatható területen túlra, ami az eszköz kopását okozhatná." msgid "Go Home" msgstr "Alaphelyzet" msgid "An error occurred. The system may have run out of memory, or a bug may have occurred." -msgstr "Hiba történt. Lehet, hogy a rendszer memóriája nem elég, vagy a program hibás" +msgstr "Hiba történt. Lehet, hogy elfogyott a rendszer memóriája, vagy programhiba történt." #, boost-format msgid "A fatal error occurred: \"%1%\"" @@ -4592,16 +4592,16 @@ msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?\n" "Error message: %1%" msgstr "" -"Az ideiglenes G-kód másolása a kimeneti G-kódba nem sikerült. Lehet, hogy az SD kártya írásvédett?\n" +"Nem sikerült az ideiglenes G-kódot a kimeneti G-kódba másolni. Lehet, hogy az SD-kártya írásvédett?\n" "Hibaüzenet: %1%" #, boost-format msgid "Copying of the temporary G-code to the output G-code failed. There might be problem with target device, please try exporting again or using different device. The corrupted output G-code is at %1%.tmp." -msgstr "Az ideiglenes G-kód másolása a kimeneti G-kódba nem sikerült. Probléma lehet a céleszközzel. Kérlek, próbálkozzon újra az exportálással, vagy használjon másik eszközt. A sérült kimeneti G-kód %1%.tmp." +msgstr "Nem sikerült az ideiglenes G-kódot a kimeneti G-kódba másolni. Probléma lehet a céleszközzel. Kérlek, exportáld újra, vagy használj másik eszközt. A sérült kimeneti G-kód helye: %1%.tmp." #, boost-format msgid "Renaming of the G-code after copying to the selected destination folder has failed. Current path is %1%.tmp. Please try exporting again." -msgstr "A G-kód átnevezése a kiválasztott célmappába másolás után nem sikerült. A jelenlegi elérési út %1%.tmp. Kérlek, próbálja meg újra az exportálást." +msgstr "A G-kód átnevezése a kiválasztott célmappába másolás után nem sikerült. A jelenlegi elérési út %1%.tmp. Kérlek, próbáld újra az exportálást." #, boost-format msgid "Copying of the temporary G-code has finished but the original code at %1% couldn't be opened during copy check. The output G-code is at %2%.tmp." @@ -4645,7 +4645,7 @@ msgid "Distance of the 0,0 G-code coordinate from the front left corner of the r msgstr "A 0,0 G-kód koordinátájának távolsága a téglalap bal első sarkától." msgid "Diameter of the print bed. It is assumed that origin (0,0) is located in the center." -msgstr "A tárgyasztal átmérője. Feltételezzük, hogy az origó (0,0) középen van." +msgstr "Az asztal átmérője. Feltételezzük, hogy az origó (0,0) középen van." msgid "Rectangular" msgstr "Téglalap" @@ -4847,7 +4847,7 @@ msgstr "" "Visszaállítás a felületi réteg mélységének 50%-ára." msgid "Both [Extrusion] and [Combined] modes of Fuzzy Skin require the Arachne Wall Generator to be enabled." -msgstr "A bolyhos felület [Extrudálás] és [Kombinált] módja is megköveteli az Arachne falgenerátor engedélyezését." +msgstr "A barázdált felület [Extrudálás] és [Kombinált] módja is megköveteli az Arachne falgenerátor engedélyezését." msgid "" "Change these settings automatically?\n" @@ -4856,13 +4856,13 @@ msgid "" msgstr "" "Automatikusan módosítsuk ezeket a beállításokat?\n" "Igen - Engedélyezd az Arachne falgenerátort\n" -"Nem - Tiltsd le az Arachne falgenerátort, és állítsd a bolyhos felületet [Eltolás] módra" +"Nem - Tiltsd le az Arachne falgenerátort, majd állítsd a barázdált felületet [Eltolás] módra" msgid "Spiral mode only works when wall loops is 1, support is disabled, clumping detection by probing is disabled, top shell layers is 0, sparse infill density is 0 and timelapse type is traditional." -msgstr "A spirál mód csak akkor működik, ha a falhurkok száma 1, a támasz le van tiltva, a szondázásos csomósodásészlelés le van tiltva, a felső héjrétegek száma 0, a ritkás kitöltés sűrűsége 0, és az időzített felvétel típusa hagyományos." +msgstr "A spirál mód csak akkor működik, ha a falhurkok száma 1, a támasz és a szondázásos csomósodásészlelés ki van kapcsolva, a felső héjrétegek száma 0, a kitöltés sűrűsége 0, a Timelapse típusa pedig hagyományos." msgid " But machines with I3 structure will not generate timelapse videos." -msgstr " Az I3-szerkezetű gépek azonban nem fognak időfelvétel videókat készíteni." +msgstr " Az I3-szerkezetű gépek azonban nem készítenek Timelapse-videókat." msgid "" "Change these settings automatically?\n" @@ -4870,8 +4870,8 @@ msgid "" "No - Cancel enabling spiral mode" msgstr "" "Automatikusan megváltoztatod ezeket a beállításokat?\n" -"Igen - Módosítsa ezeket a beállításokat, és automatikusan engedélyezze a spirál mód használatát\n" -"Nem - Ne használja a spirál módot ez alkalommal" +"Igen - Módosítsd ezeket a beállításokat, és automatikusan kapcsold be a spirál módot\n" +"Nem - Most ne kapcsold be a spirál módot" msgid "Printing" msgstr "Nyomtatás" @@ -4907,7 +4907,7 @@ msgid "Inspecting first layer" msgstr "Első réteg vizsgálata" msgid "Identifying build plate type" -msgstr "Tárgyasztal azonosítása" +msgstr "Asztaltípus azonosítása" msgid "Calibrating Micro Lidar" msgstr "Micro Lidar kalibrálása" @@ -5063,16 +5063,16 @@ msgid "Update failed." msgstr "A frissítés sikertelen." msgid "Timelapse is not supported on this printer." -msgstr "Az időzített felvétel ezen a nyomtatón nem támogatott." +msgstr "Ez a nyomtató nem támogatja a Timelapse-felvételt." msgid "Timelapse is not supported while the storage does not exist." -msgstr "Az időzített felvétel nem támogatott, ha nincs tároló." +msgstr "A Timelapse-felvétel tároló nélkül nem támogatott." msgid "Timelapse is not supported while the storage is unavailable." -msgstr "Az időzített felvétel nem támogatott, ha a tároló nem érhető el." +msgstr "A Timelapse-felvétel nem támogatott, ha a tároló nem érhető el." msgid "Timelapse is not supported while the storage is readonly." -msgstr "Az időzített felvétel nem támogatott, ha a tároló csak olvasható." +msgstr "A Timelapse-felvétel nem támogatott, ha a tároló csak olvasható." msgid "To ensure your safety, certain processing tasks (such as laser) can only be resumed on printer." msgstr "A biztonság érdekében bizonyos műveletek (például lézeres feladatok) csak a nyomtatón folytathatók." @@ -5262,7 +5262,7 @@ msgid "SLA Materials settings" msgstr "SLA anyagbeállítások" msgid "Printer settings" -msgstr "Nyomtató beállítások" +msgstr "Nyomtatóbeállítások" msgid "parameter name" msgstr "paraméter neve" @@ -5451,7 +5451,7 @@ msgid "Bridge" msgstr "Áthidalás" msgid "Gap infill" -msgstr "Réskitöltés" +msgstr "Hézagok kitöltése" msgid "Skirt" msgstr "Szoknya" @@ -5475,19 +5475,19 @@ msgid "Mixed" msgstr "Vegyes" msgid "Height: " -msgstr "Magasság:" +msgstr "Magasság: " msgid "Width: " -msgstr "Szélesség:" +msgstr "Szélesség: " msgid "Flow: " -msgstr "Anyagáramlás:" +msgstr "Anyagáramlás: " msgid "Fan: " -msgstr "Ventilátor-fordulatszám:" +msgstr "Ventilátor-fordulatszám: " msgid "Temperature: " -msgstr "Hőmérséklet:" +msgstr "Hőmérséklet: " msgid "Layer Time: " msgstr "Rétegidő: " @@ -5526,7 +5526,7 @@ msgid "Time" msgstr "Idő" msgid "Speed: " -msgstr "Sebesség:" +msgstr "Sebesség: " msgid "Actual speed profile" msgstr "Tényleges sebességprofil" @@ -5637,7 +5637,7 @@ msgid "Fan speed (%)" msgstr "Ventilátor fordulatszám (%)" msgid "Temperature (℃)" -msgstr "Hőmérséklet (°C)" +msgstr "Hőmérséklet (℃)" msgid "Volumetric flow rate (mm³/s)" msgstr "Térfogatáramlás (mm³/s)" @@ -5793,7 +5793,7 @@ msgid "Move object" msgstr "Objektum mozgatása" msgid "Auto orientation options" -msgstr "Automatikus orientáció beállításai" +msgstr "Automatikus tájolás beállításai" msgid "Enable rotation" msgstr "Forgatás engedélyezése" @@ -5802,7 +5802,7 @@ msgid "Optimize support interface area" msgstr "Támasz érintkező felületének optimalizálása" msgid "Orient" -msgstr "Orientáció" +msgstr "Tájolás" msgid "Arrange options" msgstr "Elrendezési lehetőségek" @@ -5858,10 +5858,10 @@ msgid "Add plate" msgstr "Tálca hozzáadása" msgid "Auto orient all/selected objects" -msgstr "Összes/kiválasztott objektum automatikus orientációja" +msgstr "Az összes/kiválasztott objektum automatikus tájolása" msgid "Auto orient all objects on current plate" -msgstr "Aktuális tálca összes objektumának automatikus orientációja" +msgstr "A jelenlegi tálca összes objektumának automatikus tájolása" msgid "Arrange all objects" msgstr "Összes objektum elrendezése" @@ -5948,7 +5948,7 @@ msgid "Paint Toolbar" msgstr "Festés eszköztár" msgid "Explosion Ratio" -msgstr "Robbantási arány" +msgstr "Széthúzás mértéke" msgid "Section View" msgstr "Keresztmetszet nézet" @@ -6082,7 +6082,7 @@ msgid "Go Live" msgstr "Streamelés indítása" msgid "Liveview Retry" -msgstr "Élő nézet újra próbálása" +msgstr "Élőkép automatikus újrapróbálása" msgid "Resolution" msgstr "Felbontás" @@ -6160,7 +6160,7 @@ msgid "No" msgstr "Nem" msgid "will be closed before creating a new model. Do you want to continue?" -msgstr "bezárásra kerül új modell létrehozása előtt. Folytatod?" +msgstr "bezárul az új modell létrehozása előtt. Folytatod?" msgid "Slice plate" msgstr "Tálca szeletelése" @@ -6635,28 +6635,28 @@ msgid "Synchronization" msgstr "Szinkronizálás" msgid "The device cannot handle more conversations. Please retry later." -msgstr "Az eszköz nem tud több kapcsolatot kezelni. Kérlek, próbálkozz később." +msgstr "Az eszköz nem tud több kapcsolatot kezelni. Kérlek, próbáld újra később." msgid "Player is malfunctioning. Please reinstall the system player." -msgstr "A lejátszó hibásan működik. Kérlek, telepítsd újra." +msgstr "A rendszer médialejátszója nem működik megfelelően. Kérlek, telepítsd újra." msgid "The player is not loaded; please click the \"play\" button to retry." -msgstr "A lejátszó nem töltődött be; kérlek, kattints a \"lejátszás\" gombra az újra próbálkozáshoz." +msgstr "A lejátszó nem töltődött be. Kérlek, kattints a \"Lejátszás\" gombra az újbóli próbálkozáshoz." msgid "The player is not loaded because the GStreamer GTK video sink is missing or failed to initialize." msgstr "A lejátszó nem töltődik be, mert hiányzik a GStreamer GTK videonyelő, vagy nem sikerült inicializálni." msgid "Please confirm if the printer is connected." -msgstr "Kérlek, ellenőrizd, hogy a nyomtató csatlakoztatva van." +msgstr "Kérlek, ellenőrizd, hogy a nyomtató csatlakoztatva van-e." msgid "The printer is currently busy downloading. Please try again after it finishes." msgstr "A nyomtató a letöltéssel van elfoglalva. Kérlek, várd meg, amíg a letöltés befejeződik." msgid "Printer camera is malfunctioning." -msgstr "A nyomtató kamerája hibásan működik." +msgstr "A nyomtató kamerája nem működik megfelelően." msgid "A problem occurred. Please update the printer firmware and try again." -msgstr "Probléma merült fel. Kérlek, frissítsd a nyomtató firmware-ét, és próbáld meg újra." +msgstr "Probléma merült fel. Kérlek, frissítsd a nyomtató firmware-ét, majd próbáld újra." msgid "LAN Only Liveview is off. Please turn on the liveview on printer screen." msgstr "A csak LAN élőkép ki van kapcsolva. Kapcsold be az élőképet a nyomtató kijelzőjén." @@ -6668,10 +6668,10 @@ msgid "Initializing..." msgstr "Inicializálás…" msgid "Connection Failed. Please check the network and try again" -msgstr "Csatlakozás sikertelen. Kérlek, ellenőrizd a hálózatot, és próbáld újra" +msgstr "Csatlakozás sikertelen. Kérlek, ellenőrizd a hálózatot, majd próbáld újra" msgid "Please check the network and try again. You can restart or update the printer if the issue persists." -msgstr "Kérlek, ellenőrizd a hálózatot, és próbáld újra. Ha a probléma továbbra is fennáll, indítsd újra vagy frissítsd a nyomtatót." +msgstr "Kérlek, ellenőrizd a hálózatot, majd próbáld újra. Ha a probléma továbbra is fennáll, indítsd újra vagy frissítsd a nyomtatót." msgid "The printer has been logged out and cannot connect." msgstr "A nyomtató ki van jelentkezve, és nem tud csatlakozni." @@ -6698,7 +6698,7 @@ msgid "" "Do you want to stop this virtual camera?" msgstr "" "Már fut egy másik virtuális kamera.\n" -"A Orca Slicer csak egy virtuális kamerát támogat.\n" +"Az Orca Slicer csak egy virtuális kamerát támogat.\n" "Leállítod ezt a virtuális kamerát?" #, c-format, boost-format @@ -6739,7 +6739,7 @@ msgid "Timelapse" msgstr "Timelapse" msgid "Switch to timelapse files." -msgstr "Váltás timelapse fájlokra." +msgstr "Váltás Timelapse-fájlokra." # AI Translated msgid "Video" @@ -6813,11 +6813,11 @@ msgid "Failed to parse model information." msgstr "Nem sikerült feldolgozni a modellinformációkat" msgid "The .gcode.3mf file contains no G-code data. Please slice it with Orca Slicer and export a new .gcode.3mf file." -msgstr "A .gcode.3mf fájl nem tartalmaz G-kód adatot. Szeleteld újra Orca Slicerrel és exportálj egy új .gcode.3mf fájlt." +msgstr "A .gcode.3mf fájl nem tartalmaz G-kód-adatot. Szeleteld újra Orca Slicerrel, majd exportálj egy új .gcode.3mf fájlt." #, c-format, boost-format msgid "File '%s' was lost! Please download it again." -msgstr "A (z) '%s' fájl elveszett! Kérlek, töltsd le újra." +msgstr "A(z) '%s' fájl elveszett! Kérlek, töltsd le újra." #, c-format, boost-format msgid "" @@ -6856,7 +6856,7 @@ msgid "File does not exist." msgstr "A fájl nem létezik." msgid "File checksum error. Please retry." -msgstr "Fájl checksum hiba. Kérlek, próbáld újra." +msgstr "A fájl ellenőrzőösszege hibás. Kérlek, próbáld újra." msgid "Not supported on the current printer version." msgstr "A nyomtató jelenlegi szoftvere nem támogatja." @@ -7074,7 +7074,7 @@ msgid "Safety Options" msgstr "Biztonsági beállítások" msgid "Hotends" -msgstr "Hotendek" +msgstr "Fejegységek" msgid "Lamp" msgstr "Világítás" @@ -7146,7 +7146,7 @@ msgid "Layer: %d/%d" msgstr "Réteg: %d/%d" msgid "Please heat the nozzle to above 170℃ before loading or unloading filament." -msgstr "Kérlek, melegítsd a fúvókát 170 fok fölé a filament betöltése vagy kihúzása előtt." +msgstr "Kérlek, melegítsd a fúvókát 170℃ fölé a filament betöltése vagy kihúzása előtt." msgid "Chamber temperature cannot be changed in cooling mode while printing." msgstr "Nyomtatás közben hűtési módban a kamrahőmérséklet nem módosítható." @@ -7212,7 +7212,7 @@ msgid "Submit" msgstr "Elküldés" msgid "Please click on the star first." -msgstr "Kérlek, először kattints a csillagokra." +msgstr "Kérlek, először kattints a csillagra." msgid "Get oss config failed." msgstr "OSS-konfiguráció letöltése sikertelen." @@ -7458,8 +7458,8 @@ msgstr[1] "%1$d objektum vágott objektum részeként lett betöltve." #, c-format, boost-format msgid "%1$d object was loaded with fuzzy skin painting." msgid_plural "%1$d objects were loaded with fuzzy skin painting." -msgstr[0] "%1$d objektum bolyhos felület festéssel lett betöltve." -msgstr[1] "%1$d objektum bolyhos felület festéssel lett betöltve." +msgstr[0] "%1$d objektum barázdáltfelület-festéssel lett betöltve." +msgstr[1] "%1$d objektum barázdáltfelület-festéssel lett betöltve." msgid "ERROR" msgstr "HIBA" @@ -7586,7 +7586,7 @@ msgid "Enable detection of build plate position" msgstr "Nyomtatótálca helyzetének érzékelése" msgid "The localization tag of the build plate will be detected, and printing will be paused if the tag is not in predefined range." -msgstr "A nyomtató megkeresi a nyomtatótálca lokalizációs címkéjét, és szünetelteti a nyomtatást, ha az nem egy előre meghatározott tartományban van." +msgstr "A rendszer ellenőrzi a nyomtatótálca helyzetjelölő címkéjét, és szünetelteti a nyomtatást, ha a címke az előre meghatározott tartományon kívül esik." msgid "Build Plate Detection" msgstr "Tálcaészlelés" @@ -7775,7 +7775,7 @@ msgid "Compare presets" msgstr "Beállítások összehasonlítása" msgid "View all object's settings" -msgstr "Összes objektum beállításainak megtekintése" +msgstr "Az összes objektum beállításainak megtekintése" msgid "Material settings" msgstr "Anyagbeállítások" @@ -7881,7 +7881,7 @@ msgstr "Filamentváltó észlelve. Az összes AMS filament mostantól mindkét e # AI Translated msgid "A filament switcher is detected but not calibrated and thus currently unavailable. Please calibrate it on the printer and synchronize before use." -msgstr "A rendszer filamentváltót észlelt, de az nincs kalibrálva, ezért jelenleg nem használható. Kérlek, kalibráld a nyomtatón, és szinkronizáld a használat előtt." +msgstr "A rendszer filamentváltót észlelt, de az nincs kalibrálva, ezért jelenleg nem használható. Kérlek, kalibráld a nyomtatón, majd használat előtt szinkronizáld." msgid "Tips" msgstr "Tippek" @@ -7944,7 +7944,7 @@ msgstr "Pelletek" #, c-format, boost-format msgid "After completing your operation, %s project will be closed and create a new project." -msgstr "A művelet befejezése után a(z) %s projekt bezárul, és egy új projekt jön létre." +msgstr "A művelet befejezésekor a(z) %s projekt bezárul, majd új projekt jön létre." msgid "There are no compatible filaments, and sync is not performed." msgstr "Nincs kompatibilis filament és nem történt szinkronizálás." @@ -7960,10 +7960,10 @@ msgstr "" "Frissítsd az Orca Slicert, vagy indítsd újra, hogy ellenőrizhesd a rendszerbeállítások frissítését." msgid "Only filament color information has been synchronized from printer." -msgstr "Csak a filament színinformációi lettek szinkronizálva a nyomtatóról." +msgstr "A nyomtatóról csak a filament színadatai szinkronizálódtak." msgid "Filament type and color information have been synchronized, but slot information is not included." -msgstr "A filament típus- és színinformációk szinkronizálva lettek, de a férőhelyinformáció nincs benne." +msgstr "A filament típus- és színadatai szinkronizálódtak, a férőhely adatai azonban nem." #, boost-format msgid "Do you want to save changes to \"%1%\"?" @@ -7990,10 +7990,10 @@ msgid "The nozzle hardness required by the filament is higher than the default n msgstr "Ez a filament nagyobb keménységű fúvókát igényel. Kérlek, cseréld ki a fúvókát vagy válassz másik filamentet, különben előfordulhat, hogy a fúvóka idő előtt elhasználódik vagy megsérül." msgid "Enabling traditional timelapse photography may cause surface imperfections. It is recommended to change to smooth mode." -msgstr "A hagyományos időfelvétel engedélyezése felületi hibákat okozhat. Javasoljuk, hogy válts a sima módra." +msgstr "A hagyományos Timelapse bekapcsolása felületi hibákat okozhat. Javasoljuk, hogy válts sima módra." msgid "Smooth mode for timelapse is enabled, but the prime tower is off, which may cause print defects. Please enable the prime tower, re-slice and print again." -msgstr "A időfelvétel sima módja engedélyezett, de a törlőtorony ki van kapcsolva, ami nyomtatási hibákat okozhat. Kapcsold be a törlőtornyot, szeletelj újra, majd nyomtass ismét." +msgstr "A sima Timelapse mód be van kapcsolva, a törlőtorony azonban nincs, ami nyomtatási hibákat okozhat. Kapcsold be a törlőtornyot, szeletelj újra, majd nyomtass ismét." msgid "Expand sidebar" msgstr "Az oldalsáv kibontása" @@ -8028,7 +8028,7 @@ msgid "The 3MF file was generated by BambuStudio, loading geometry data only." msgstr "A 3MF fájlt a BambuStudio hozta létre, csak a geometriai adatok töltődnek be." msgid "This project was created with an OrcaSlicer 2.3.1-alpha and uses infill rotation template settings that may not work properly with your current infill pattern. This could result in weak support or print quality issues." -msgstr "Ez a projekt OrcaSlicer 2.3.1-alpha verzióval készült, és olyan kitöltésforgatási sablonbeállításokat használ, amelyek lehet, hogy nem működnek megfelelően a jelenlegi kitöltési mintával. Ez gyenge támaszt vagy nyomtatási minőségi problémákat okozhat." +msgstr "Ez a projekt az OrcaSlicer 2.3.1-alpha verziójával készült, és olyan kitöltésforgatási sablonbeállításokat használ, amelyek a jelenlegi kitöltési mintával nem feltétlenül működnek megfelelően. Ez gyenge alátámasztást vagy nyomtatási hibákat okozhat." msgid "Would you like OrcaSlicer to automatically fix this by clearing the rotation template settings?" msgstr "Szeretnéd, hogy az OrcaSlicer ezt automatikusan javítsa a forgatási sablonbeállítások törlésével?" @@ -8138,7 +8138,7 @@ msgid "Connected printer is %s. It must match the project preset for printing.\n msgstr "A csatlakoztatott nyomtató: %s. Ennek egyeznie kell a projekt nyomtatásához használt beállítással.\n" msgid "Do you want to sync the printer information and automatically switch the preset?" -msgstr "Szeretnéd szinkronizálni a nyomtató adatait, és automatikusan átváltani a beállítást?" +msgstr "Szeretnéd szinkronizálni a nyomtató adatait és automatikusan átváltani a beállítást?" msgid "The file does not contain any geometry data." msgstr "A fájl nem tartalmaz geometriai adatokat." @@ -8229,7 +8229,7 @@ msgid "Select a new file" msgstr "Válassz egy új fájlt" msgid "File for the replacement wasn't selected" -msgstr "A cserefájl nem lett kiválasztva" +msgstr "Nincs kiválasztva cserefájl" # AI Translated msgid "Replace with 3D file" @@ -8302,7 +8302,7 @@ msgid "Slicing Plate %d" msgstr "%d tálca szeletelése" msgid "Please resolve the slicing errors and publish again." -msgstr "Kérlek, orvosold a szeletelési hibákat, és próbáld meg újra." +msgstr "Kérlek, javítsd ki a szeletelési hibákat, majd tedd közzé újra." msgid "Network plug-in switched successfully." msgstr "A hálózati bővítmény sikeresen átváltva." @@ -8364,7 +8364,7 @@ msgid "Download failed; unknown file format." msgstr "Letöltés sikertelen, ismeretlen fájlformátum." msgid "Downloading project..." -msgstr "projekt letöltése ..." +msgstr "Projekt letöltése..." msgid "Download failed; File size exception." msgstr "Letöltés sikertelen, fájlméret kivétel." @@ -8374,7 +8374,7 @@ msgid "Project downloaded %d%%" msgstr "Projekt letöltve %d%%" msgid "Importing to Orca Slicer failed. Please download the file and manually import it." -msgstr "Az Orca Slicerbe importálás sikertelen. Töltsd le a fájlt és manuálisan importáljad." +msgstr "Az Orca Slicerbe importálás sikertelen. Töltsd le a fájlt, majd importáld kézzel." # AI Translated msgid "INFO:" @@ -8465,7 +8465,7 @@ msgstr "Szeletelt fájl mentése mint:" #, c-format, boost-format msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." -msgstr "A(z) %s fájl elküldésre került a nyomtatóra, és megtekinthető a nyomtatón." +msgstr "A(z) %s fájlt elküldtük a nyomtató tárhelyére. A fájl a nyomtatón tekinthető meg." msgid "The nozzle type is not set. Please set the nozzle and try again." msgstr "A fúvókatípus nincs beállítva. Állítsd be a fúvókát, majd próbáld újra." @@ -8796,7 +8796,7 @@ msgid "Units" msgstr "Mértékegység" msgid "Home" -msgstr "Haza" +msgstr "Kezdőlap" msgid "Default page" msgstr "Alapértelmezett oldal" @@ -9311,7 +9311,7 @@ msgid "Select the network plug-in version to use" msgstr "A használandó hálózati bővítmény verzió kiválasztása" msgid "Associate files to OrcaSlicer" -msgstr "Fájlok társítása a OrcaSlicerhoz" +msgstr "Fájlok társítása az OrcaSlicerhez" # AI Translated msgid "File associations for the Microsoft Store version are managed by Windows Settings." @@ -9322,10 +9322,10 @@ msgid "Open Windows Default Apps Settings" msgstr "A Windows alapértelmezett alkalmazások beállításainak megnyitása" msgid "Associate 3MF files to OrcaSlicer" -msgstr ".3mf fájlok társítása a OrcaSlicerhoz" +msgstr ".3mf fájlok társítása az OrcaSlicerhez" msgid "If enabled, this sets OrcaSlicer as the default application to open 3MF files." -msgstr "Ha engedélyezve van, a OrcaSlicer-t állítja be alapértelmezett alkalmazásként a 3MF file fájlok megnyitásához" +msgstr "Bekapcsolva az OrcaSlicert állítja be alapértelmezett alkalmazásként a 3MF-fájlok megnyitásához" msgid "Associate DRC files to OrcaSlicer" msgstr "DRC fájlok társítása OrcaSlicerhez" @@ -9334,16 +9334,16 @@ msgid "If enabled, sets OrcaSlicer as default application to open DRC files." msgstr "Ha engedélyezve van, az OrcaSlicer lesz az alapértelmezett alkalmazás DRC fájlok megnyitásához." msgid "Associate STL files to OrcaSlicer" -msgstr ".stl fájlok társítása a OrcaSlicerhoz" +msgstr ".stl fájlok társítása az OrcaSlicerhez" msgid "If enabled, this sets OrcaSlicer as the default application to open STL files." -msgstr "Ha engedélyezve van, a OrcaSlicer-t állítja be alapértelmezett alkalmazásként az .stl fájlok megnyitásához" +msgstr "Bekapcsolva az OrcaSlicert állítja be alapértelmezett alkalmazásként az .stl fájlok megnyitásához" msgid "Associate STEP files to OrcaSlicer" -msgstr ".step/.stp fájlok társítása a OrcaSlicerhoz" +msgstr ".step/.stp fájlok társítása az OrcaSlicerhez" msgid "If enabled, this sets OrcaSlicer as the default application to open STEP files." -msgstr "Ha engedélyezve van, a OrcaSlicer-t állítja be alapértelmezett alkalmazásként a .step fájlok megnyitásához" +msgstr "Bekapcsolva az OrcaSlicert állítja be alapértelmezett alkalmazásként a .step fájlok megnyitásához" msgid "Associate web links to OrcaSlicer" msgstr "Webhivatkozások társítása OrcaSlicerhez" @@ -9602,7 +9602,7 @@ msgid "Jump to model publish web page" msgstr "Ugrás a modell közzététele weboldalra" msgid "Note: The preparation may take several minutes. Please be patient." -msgstr "Megjegyzés: Az előkészítés több percig is eltarthat. Kérlek várj." +msgstr "Megjegyzés: Az előkészítés több percig is eltarthat. Kérlek, várj." msgid "Publish" msgstr "Közzététel" @@ -9713,7 +9713,7 @@ msgid "Not satisfied with the grouping of filaments? Regroup and slice ->" msgstr "Nem elégedett a filamentek csoportosításával? Csoportosítsd újra és szeleteld ->" msgid "Manually change external spool during printing for multi-color printing" -msgstr "Többszínű nyomtatáshoz manuálisan cseréld a külső tekercset nyomtatás közben" +msgstr "Többszínű nyomtatáskor kézzel kell cserélni a külső tekercset" msgid "Multi-color with external" msgstr "Többszínű nyomtatás külső tekercssel" @@ -9727,7 +9727,7 @@ msgstr "A nyomtatási minőség biztosítása érdekében a szárítási hőmér # AI Translated msgid "Select timelapse storage location" -msgstr "Válaszd ki a timelapse tárolási helyét" +msgstr "Válaszd ki a Timelapse tárolási helyét" msgid "Auto Bed Leveling" msgstr "Automatikus asztalszintezés" @@ -9837,10 +9837,10 @@ msgstr "A kiválasztott nyomtató (%s) nem kompatibilis a nyomtatási fájl konf # AI Translated msgid "When spiral vase mode is enabled, machines with I3 structure will not generate timelapse videos." -msgstr "Ha a spirál (váza) mód be van kapcsolva, az I3 felépítésű gépek nem készítenek timelapse videót." +msgstr "Ha a spirál (váza) mód be van kapcsolva, az I3 felépítésű gépek nem készítenek Timelapse-videót." msgid "The current printer does not support timelapse in Traditional Mode when printing By-Object." -msgstr "Az aktuális nyomtató nem támogatja az időfelvételt hagyományos módban, ha a nyomtatás objektumonként történik." +msgstr "A jelenlegi nyomtató tárgyankénti nyomtatásnál nem támogatja a hagyományos Timelapse módot." # AI Translated msgid "I have checked the installed nozzle and want to print anyway." @@ -9882,7 +9882,7 @@ msgstr "Belső" # AI Translated #, c-format, boost-format msgid "%s space less than 20MB. Timelapse may not save properly. You can turn it off or" -msgstr "A(z) %s szabad területe kevesebb mint 20 MB. Előfordulhat, hogy a timelapse nem mentődik el megfelelően. Kikapcsolhatod, vagy" +msgstr "A(z) %s eszközön kevesebb mint 20 MB szabad hely van. Előfordulhat, hogy a Timelapse nem menthető megfelelően. Kikapcsolhatod, vagy" # AI Translated msgid "Clean up files" @@ -9890,15 +9890,15 @@ msgstr "Fájlok törlése" # AI Translated msgid "Low internal storage. This timelapse will overwrite the oldest video files." -msgstr "Kevés a belső tárhely. Ez a timelapse felülírja a legrégebbi videofájlokat." +msgstr "Kevés a belső tárhely. Ez a Timelapse felülírja a legrégebbi videofájlokat." # AI Translated msgid "Low external storage. This timelapse will overwrite the oldest video files." -msgstr "Kevés a külső tárhely. Ez a timelapse felülírja a legrégebbi videofájlokat." +msgstr "Kevés a külső tárhely. Ez a Timelapse felülírja a legrégebbi videofájlokat." # AI Translated msgid "Insufficient external storage for time-lapse photography. Connect to computer to delete files, or use a larger memory card." -msgstr "Nincs elég külső tárhely a timelapse felvételhez. Csatlakoztasd számítógéphez a fájlok törléséhez, vagy használj nagyobb memóriakártyát." +msgstr "Nincs elég külső tárhely a Timelapse-felvételhez. A fájlok törléséhez csatlakoztasd a számítógéphez, vagy használj nagyobb memóriakártyát." # AI Translated msgid "Storage Space Not Enough" @@ -9940,11 +9940,11 @@ msgstr "Jelenleg nincs elég elérhető fejegység." # AI Translated msgid "Please complete the hotend rack setup and try again." -msgstr "Kérlek, fejezd be a fejegységtartó beállítását, és próbáld újra." +msgstr "Kérlek, fejezd be a fejegységtartó beállítását, majd próbáld újra." # AI Translated msgid "Please refresh the nozzle information and try again." -msgstr "Kérlek, frissítsd a fúvókaadatokat, és próbáld újra." +msgstr "Kérlek, frissítsd a fúvókaadatokat, majd próbáld újra." # AI Translated msgid "Please re-slice to avoid filament waste." @@ -9969,7 +9969,7 @@ msgstr "A szerszámfej és a fejegységtartó tele van. Kérlek, távolíts el l #, c-format, boost-format msgid "The nozzle flow setting of %s(%s) doesn't match with the slicing file(%s). Please make sure the nozzle installed matches with settings in printer, then set the corresponding printer preset while slicing." -msgstr "A(z) %s(%s) fúvókaáramlási beállítása nem egyezik a szeletelési fájl értékével (%s). Győződj meg róla, hogy a beszerelt fúvóka megegyezik a nyomtató beállításaival, majd szeleteléskor állítsd be a megfelelő nyomtató-előbeállítást." +msgstr "A(z) %s(%s) fúvókaáramlási beállítása nem egyezik a szeletelési fájl értékével (%s). Győződj meg róla, hogy a beszerelt fúvóka megfelel a nyomtatóbeállításoknak, majd szeleteléskor válaszd ki a megfelelő nyomtatóbeállítást." msgid "Tips: If you changed your nozzle of your printer lately, please go to 'Device -> Printer parts' to change your nozzle setting." msgstr "Tipp: Ha nemrég cseréltél fúvókát a nyomtatón, lépj az 'Eszköz -> Nyomtató alkatrészei' menübe, és módosítsd a fúvóka beállítását." @@ -9991,7 +9991,7 @@ msgstr "A jelenlegi anyag keménysége (%s) meghaladja a(z) %s (%s) keménység # AI Translated msgid "Your current firmware version cannot start this print job. Please update to the latest version and try again." -msgstr "A jelenlegi firmware-verzió nem tudja elindítani ezt a nyomtatási feladatot. Kérlek, frissíts a legújabb verzióra, és próbáld újra." +msgstr "Ezzel a firmware-verzióval nem indítható el a nyomtatási feladat. Frissíts a legújabb verzióra, majd próbáld újra." # AI Translated #, c-format, boost-format @@ -10000,7 +10000,7 @@ msgstr "A jelenlegi anyag (%s) keménysége meghaladja a következő keménység # AI Translated msgid "Some filaments may switch between extruders during printing. Manual K-value calibration cannot be applied throughout the entire print, which may affect print quality. Enabling Flow Dynamics Calibration is recommended." -msgstr "Egyes filamentek nyomtatás közben extrudert válthatnak. A kézi K-érték kalibrálás nem alkalmazható a teljes nyomtatás során, ami befolyásolhatja a nyomtatási minőséget. Javasolt a dinamikus anyagáramlás-kalibrálás bekapcsolása." +msgstr "Egyes filamentek nyomtatás közben extrudert válthatnak. A kézi K-érték kalibrálás nem alkalmazható a teljes nyomtatás során, ami ronthatja a nyomtatási minőséget. Javasolt az áramlásdinamika-kalibrálás bekapcsolása." # AI Translated msgid "There is stringing-prone filament in this file. For best print quality, we recommend switching nozzle clumping detection to Auto mode." @@ -10020,14 +10020,14 @@ msgstr "[ %s ] magas hőmérsékletű környezetben történő nyomtatást igén #, c-format, boost-format msgid "The filament on %s may soften. Please unload." -msgstr "A(z) %s filament meglágyulhat. Kérlek, töltsd ki." +msgstr "A(z) %s filament meglágyulhat. Kérlek, vedd ki a filamentet." #, c-format, boost-format msgid "The filament on %s is unknown and may soften. Please set filament." msgstr "A(z) %s filament ismeretlen és meglágyulhat. Állítsd be a filamentet." msgid "Unable to automatically match to suitable filament. Please click to manually match." -msgstr "Nem sikerült automatikusan megfelelő filamentet párosítani. Kattints a manuális párosításhoz." +msgstr "Nem sikerült automatikusan megfelelő filamentet párosítani. Kattints rá a kézi párosításhoz." msgid "Install toolhead enhanced cooling fan to prevent filament softening." msgstr "Szerelj fel nyomtatófejhez való megerősített hűtőventilátort a filament meglágyulásának megelőzéséhez." @@ -10081,7 +10081,7 @@ msgid "Please do not mix-use the Ext with AMS." msgstr "Kérlek, ne használd vegyesen az Ext-et az AMS-sel." msgid "Invalid nozzle information, please refresh or manually set nozzle information." -msgstr "Érvénytelen fúvóka-információ, frissítsd vagy állítsd be manuálisan a fúvókaadatokat." +msgstr "Érvénytelenek a fúvóka adatai. Frissítsd őket, vagy add meg az adatokat kézzel." msgid "Storage needs to be inserted before printing via LAN." msgstr "LAN-on történő nyomtatás előtt be kell helyezni a tárolót." @@ -10099,13 +10099,13 @@ msgid "Cannot send a print job for an empty plate." msgstr "Nem küldhetsz nyomtatási feladatot egy üres tálcával." msgid "Storage needs to be inserted to record timelapse." -msgstr "Időfelvétel rögzítéséhez be kell helyezni a tárolót." +msgstr "Timelapse-felvételhez be kell helyezni a tárolót." msgid "You have selected both external and AMS filaments for an extruder. You will need to manually switch the external filament during printing." -msgstr "Egy extruderhez külső és AMS filamentet is kiválasztottál. Nyomtatás közben manuálisan kell váltanod a külső filamentet." +msgstr "Egy extruderhez külső és AMS-filamentet is kiválasztottál. Nyomtatás közben kézzel kell cserélned a külső filamentet." msgid "TPU 90A/TPU 85A is too soft and does not support automatic Flow Dynamics calibration." -msgstr "A TPU 90A/TPU 85A túl puha, nem támogatja az automatikus Flow Dynamics kalibrálást." +msgstr "A TPU 90A/TPU 85A túl puha, ezért nem támogatja az automatikus áramlásdinamika-kalibrálást." msgid "Set dynamic flow calibration to 'OFF' to enable custom dynamic flow value." msgstr "Állítsd a dinamikus áramlás kalibrálást 'KI'-re az egyéni dinamikus áramlásérték engedélyezéséhez." @@ -10145,7 +10145,7 @@ msgid "External Storage" msgstr "Külső tároló" msgid "Upload file timeout, please check if the firmware version supports it." -msgstr "Fájlfeltöltés időtúllépés, ellenőrizd, hogy a firmware verzió támogatja-e." +msgstr "A fájl feltöltése időtúllépés miatt megszakadt. Ellenőrizd, hogy a firmware-verzió támogatja-e a feltöltést." msgid "Connection timed out, please check your network." msgstr "Kapcsolat időtúllépés, ellenőrizd a hálózatot." @@ -10173,7 +10173,7 @@ msgid "Sending..." msgstr "Küldés..." msgid "File upload timed out. Please check if the firmware version supports this operation or verify if the printer is functioning properly." -msgstr "Fájlfeltöltés időtúllépés. Ellenőrizd, hogy a firmware verzió támogatja-e ezt a műveletet, és hogy a nyomtató megfelelően működik-e." +msgstr "A fájl feltöltése időtúllépés miatt megszakadt. Ellenőrizd, hogy a firmware-verzió támogatja-e ezt a műveletet, és hogy a nyomtató megfelelően működik-e." # AI Translated msgid "Sending failed, please try again!" @@ -10250,7 +10250,7 @@ msgid "Terms and Conditions" msgstr "Felhasználási feltételek" msgid "Thank you for purchasing a Bambu Lab device. Before using your Bambu Lab device, please read the terms and conditions. By clicking to agree to use your Bambu Lab device, you agree to abide by the Privacy Policy and Terms of Use (collectively, the \"Terms\"). If you do not comply with or agree to the Bambu Lab Privacy Policy, please do not use Bambu Lab equipment and services." -msgstr "Köszönjük, hogy Bambu Lab eszközt vásároltál. A Bambu Lab eszköz használata előtt kérlek, olvasd el a felhasználási feltételeket. Azzal, hogy rákattintasz az elfogadásra, hozzájárulsz ahhoz, hogy a Bambu Lab eszközt a adatvédelmi irányelvek és a Felhasználási feltételek (együttesen: \"Feltételek\") szerint használd. Ha nem fogadod el vagy nem tartod be a Bambu Lab adatvédelmi irányelvek rendelkezéseit, kérlek, ne használd a Bambu Lab eszközöket és szolgáltatásokat." +msgstr "Köszönjük, hogy Bambu Lab eszközt vásároltál. A Bambu Lab eszköz használata előtt kérlek, olvasd el a felhasználási feltételeket. Azzal, hogy rákattintasz az elfogadásra, hozzájárulsz ahhoz, hogy a Bambu Lab eszközt az adatvédelmi irányelvek és a Felhasználási feltételek (együttesen: \"Feltételek\") szerint használd. Ha nem fogadod el vagy nem tartod be a Bambu Lab adatvédelmi irányelvek rendelkezéseit, kérlek, ne használd a Bambu Lab eszközöket és szolgáltatásokat." msgid "and" msgstr "és" @@ -10259,14 +10259,14 @@ msgid "Privacy Policy" msgstr "Adatvédelmi szabályzat" msgid "We ask for your help to improve everyone's printer" -msgstr "Kérlek a segítségedet, hogy mindenki nyomtatója jobb legyen" +msgstr "Segíts, hogy mindenki nyomtatója jobb legyen" msgid "Statement about User Experience Improvement Program" msgstr "Nyilatkozat a Felhasználói Élmény Fejlesztési Programról" #, c-format, boost-format msgid "In the 3D Printing community, we learn from each other's successes and failures to adjust our own slicing parameters and settings. %s follows the same principle and uses machine learning to improve its performance from the successes and failures of the vast number of prints by our users. We are training %s to be smarter by feeding them the real-world data. If you are willing, this service will access information from your error logs and usage logs, which may include information described in Privacy Policy. We will not collect any Personal Data by which an individual can be identified directly or indirectly, including without limitation names, addresses, payment information, or phone numbers. By enabling this service, you agree to these terms and the statement about Privacy Policy." -msgstr "A 3D nyomtatási közösségben egymás sikereiből és hibáiból tanulunk, hogy saját szeletelési paramétereinket és beállításainkat finomhangoljuk. %s ugyanezt az elvet követi, és gépi tanulást használ arra, hogy a felhasználóink nagyszámú nyomtatásának sikereiből és hibáiból javítsa a teljesítményét. Valós adatokkal tesszük okosabbá %s működését. Ha hozzájárulsz, ez a szolgáltatás hozzáfér az error logokhoz és a használati naplókhoz, amelyek az adatvédelmi irányelvek által leírt információkat is tartalmazhatják. Nem gyűjtünk olyan személyes adatokat, amelyek alapján egy személy közvetlenül vagy közvetve azonosítható, ideértve korlátozás nélkül a neveket, címeket, fizetési információkat vagy telefonszámokat. A szolgáltatás engedélyezésével elfogadod ezeket a feltételeket és a adatvédelmi irányelvekre vonatkozó nyilatkozatot." +msgstr "A 3D nyomtatási közösségben egymás sikereiből és hibáiból tanulunk, hogy saját szeletelési paramétereinket és beállításainkat finomhangoljuk. %s ugyanezt az elvet követi és gépi tanulást használ arra, hogy a felhasználóink nagyszámú nyomtatásának sikereiből és hibáiból javítsa a teljesítményét. Valós adatokkal tesszük okosabbá %s működését. Ha hozzájárulsz, ez a szolgáltatás hozzáfér a hibanaplókhoz és a használati naplókhoz, amelyek az adatvédelmi irányelvek által leírt információkat is tartalmazhatják. Nem gyűjtünk olyan személyes adatokat, amelyek alapján egy személy közvetlenül vagy közvetve azonosítható, ideértve korlátozás nélkül a neveket, címeket, fizetési információkat vagy telefonszámokat. A szolgáltatás engedélyezésével elfogadod ezeket a feltételeket és az adatvédelmi irányelvekre vonatkozó nyilatkozatot." msgid "Statement on User Experience Improvement Plan" msgstr "Nyilatkozat a Felhasználói Élmény Fejlesztési Tervről" @@ -10315,7 +10315,7 @@ msgid "Prime tower is required for nozzle changing. There may be flaws on the mo msgstr "A fúvókacsere miatt szükség van a törlőtoronyra. Nélküle előfordulhatnak hibák a nyomtatott tárgyon. Biztos, hogy kikapcsolod a törlőtornyot?" msgid "A prime tower is required for smooth timelapse mode. There may be flaws on the model without a prime tower. Are you sure you want to disable the prime tower?" -msgstr "A sima időfelvétel miatt szükség van a törlőtoronyra. Nélküle előfordulhatnak hibák a nyomtatott tárgyon. Biztos, hogy kikapcsolod a törlőtornyot?" +msgstr "A sima Timelapse módhoz törlőtorony szükséges. Nélküle hibák jelenhetnek meg a nyomtatott tárgyon. Biztosan kikapcsolod a törlőtornyot?" msgid "A prime tower is required for clumping detection. There may be flaws on the model without prime tower. Are you sure you want to disable prime tower?" msgstr "A csomósodás-észleléshez szükség van a törlőtoronyra. Nélküle előfordulhatnak hibák a nyomtatott tárgyon. Biztos, hogy kikapcsolod a törlőtornyot?" @@ -10330,7 +10330,7 @@ msgid "Enabling both precise Z height and the prime tower may cause slicing erro msgstr "A pontos Z magasság és a törlőtorony egyidejű engedélyezése szeletelési hibákat okozhat. Továbbra is engedélyezi a pontos Z magasságot?" msgid "A prime tower is required for smooth timelapse mode. There may be flaws on the model without prime tower. Do you want to enable the prime tower?" -msgstr "A sima időfelvétel miatt szükség van a törlőtoronyra. Nélküle előfordulhatnak hibák a nyomtatott tárgyon. Engedélyezed a törlőtornyot?" +msgstr "A sima Timelapse módhoz törlőtorony szükséges. Nélküle hibák jelenhetnek meg a nyomtatott tárgyon. Bekapcsolod a törlőtornyot?" msgid "Still print by object?" msgstr "Továbbra is tárgyanként szeretnél nyomtatni?" @@ -10355,8 +10355,8 @@ msgid "" "No - Do not change these settings for me." msgstr "" "Automatikusan megváltoztatod ezeket a beállításokat?\n" -"Igen - Módosítsa ezeket a beállításokat\n" -"Nem - Ne változtassa meg a beállításokat" +"Igen - Módosítsd ezeket a beállításokat\n" +"Nem - Ne módosítsd a beállításokat" msgid "" "When using soluble material for the support interface, we recommend the following settings:\n" @@ -10374,7 +10374,7 @@ msgid "Are you sure you want to enable this option?" msgstr "Biztos, hogy engedélyezed ezt az opciót?" msgid "Infill patterns are typically designed to handle rotation automatically to ensure proper printing and achieve their intended effects (e.g., Gyroid, Cubic). Rotating the current sparse infill pattern may lead to insufficient support. Please proceed with caution and thoroughly check for any potential printing issues. Are you sure you want to enable this option?" -msgstr "A kitöltési minták általában úgy vannak kialakítva, hogy a forgatást automatikusan kezeljék a megfelelő nyomtatás és a kívánt hatás elérése érdekében (pl. Gyroid, Cubic). Az aktuális ritka kitöltési minta forgatása elégtelen alátámasztáshoz vezethet. Kérlek, körültekintően járj el, és alaposan ellenőrizd a lehetséges nyomtatási problémákat. Biztos, hogy engedélyezed ezt az opciót?" +msgstr "A kitöltési minták általában maguk kezelik a forgatást a megfelelő nyomtatás és a kívánt hatás elérése érdekében (pl. Gyroid, Cubic). A jelenlegi kitöltési minta elforgatása elégtelen alátámasztáshoz vezethet. Kérlek, járj el körültekintően, és alaposan ellenőrizd a lehetséges nyomtatási problémákat. Biztos, hogy engedélyezed ezt a beállítást?" msgid "" "Layer height is too small.\n" @@ -10401,7 +10401,9 @@ msgstr "Kísérleti funkció: Filamentcsere közben nagyobb távolságon törté msgid "" "When recording timelapse without toolhead, it is recommended to add a \"Timelapse Wipe Tower\" \n" "by right-click the empty position of build plate and choose \"Add Primitive\"->\"Timelapse Wipe Tower\"." -msgstr "Ha a nyomtatófej nélküli időfelvétel engedélyezve van, javasoljuk, hogy helyezz el a tálcán egy \"Időfelvétel törlőtornyot\". Ehhez kattints jobb gombbal a tálca egy üres részére, majd válaszd a \"Primitív hozzáadása\" -> \"Időfelvétel törlőtorony\" lehetőséget." +msgstr "" +"Ha nyomtatófej nélküli Timelapse-felvételt készítesz, érdemes hozzáadni egy „Timelapse törlőtornyot”.\n" +"Kattints jobb gombbal az asztal egy üres részére, majd válaszd a „Primitív hozzáadása” -> „Timelapse törlőtorony” lehetőséget." msgid "A copy of the current system preset will be created, which will be detached from the system preset." msgstr "Létrejön az aktuális rendszer-előbeállítás másolata, amely leválik a rendszer-előbeállításról." @@ -10410,7 +10412,7 @@ msgid "The current custom preset will be detached from the parent system preset. msgstr "Az aktuális egyéni-előbeállítás leválik a szülő rendszer-előbeállításáról." msgid "Modifications to the current profile will be saved." -msgstr "Az aktuális profil módosításai mentésre kerülnek." +msgstr "Menti az aktuális profil módosításait." msgid "" "This action is not revertible.\n" @@ -10504,7 +10506,7 @@ msgid "Overhang speed" msgstr "Sebesség túlnyúlásnál" msgid "This is the speed for various overhang degrees. Overhang degrees are expressed as a percentage of line width. 0 speed means no slowing down for the overhang degree range and wall speed is used" -msgstr "Nyomtatási sebesség a különböző mértékű túlnyúlásoknál. A túlnyúlás mértéke a vonalszélesség százalékában van kifejezve. A 0 sebesség azt jelenti, hogy nem történik lassítás, és a fal nyomtatási sebessége kerül alkalmazásra." +msgstr "Nyomtatási sebesség a különböző mértékű túlnyúlásoknál. A túlnyúlás mértéke a vonalszélesség százalékában van kifejezve. A 0 sebesség azt jelenti, hogy nincs lassítás, és a rendszer a fal nyomtatási sebességét használja." msgid "Set speed for external and internal bridges" msgstr "Sebesség beállítása a külső és belső hidakhoz" @@ -10595,7 +10597,7 @@ msgid "Recommended nozzle temperature range of this filament. 0 means not set" msgstr "Az ajánlott fúvóka hőmérséklet-tartomány ehhez a filamenthez. A 0 azt jelenti, hogy nincs beállítva" msgid "Flow ratio and Pressure Advance" -msgstr "Anyagáramlási arány és nyomáskiegyenlítés" +msgstr "Anyagáramlás és nyomáselőtolás" msgid "Print chamber temperature" msgstr "Nyomtatókamra hőmérséklete" @@ -10622,34 +10624,34 @@ msgid "Nozzle temperature when printing" msgstr "Fúvóka hőmérséklete nyomtatáskor" msgid "Bed temperature when the Cool Plate SuperTack is installed. A value of 0 means the filament does not support printing on the Cool Plate SuperTack." -msgstr "Asztalhőmérséklet a Cool Plate SuperTack használatakor. A 0 érték azt jelenti, hogy a filament nem támogatja a Cool Plate SuperTack-re történő nyomtatást." +msgstr "Asztalhőmérséklet a SuperTack hűvös tálca használatakor. A 0 azt jelenti, hogy a filament nem nyomtatható erre a tálcára." # AI Translated msgid "Cool Plate" msgstr "Hűvös tálca" msgid "This is the bed temperature when the Cool Plate is installed. A value of 0 means the filament does not support printing on the Cool Plate." -msgstr "Asztalhőmérséklet a hideg tálca használatával. A 0 érték azt jelenti, hogy a filament nem támogatja a Cool Plate-re történő nyomtatást" +msgstr "Asztalhőmérséklet a hűvös tálca használatakor. A 0 azt jelenti, hogy a filament nem nyomtatható erre a tálcára." # AI Translated msgid "Textured Cool Plate" msgstr "Texturált hűvös tálca" msgid "This is the bed temperature when the Textured Cool Plate is installed. A value of 0 means the filament does not support printing on the Textured Cool Plate." -msgstr "Asztalhőmérséklet a Textured Cool Plate használatakor. A 0 érték azt jelenti, hogy a filament nem támogatja a Textured Cool Plate-re történő nyomtatást." +msgstr "Asztalhőmérséklet a texturált hűvös tálca használatakor. A 0 azt jelenti, hogy a filament nem nyomtatható erre a tálcára." msgid "This is the bed temperature when the engineering plate is installed. A value of 0 means the filament does not support printing on the Engineering Plate." -msgstr "Asztalhőmérséklet a mérnöki tálca használatával. A 0 érték azt jelenti, hogy a filament nem támogatja az Engineering Plate-re történő nyomtatást" +msgstr "Asztalhőmérséklet a műszaki tálca használatakor. A 0 azt jelenti, hogy a filament nem nyomtatható erre a tálcára." msgid "Smooth PEI Plate / High Temp Plate" msgstr "Sima PEI tálca / magas hőmérsékletű tálca" msgid "This is the bed temperature when the Smooth PEI Plate/High Temperature Plate is installed. A value of 0 means the filament does not support printing on the Smooth PEI Plate/High Temp Plate." -msgstr "Az asztal hőmérséklete Smooth PEI / High Temperature tálca használatakor. A 0 érték azt jelenti, hogy a filament nem támogatja Smooth PEI / High Temperature tálcára történő nyomtatást" +msgstr "Asztalhőmérséklet a sima PEI / magas hőmérsékletű tálca használatakor. A 0 azt jelenti, hogy a filament nem nyomtatható ezekre a tálcákra." # AI Translated msgid "This is the bed temperature when the Textured PEI Plate is installed. A value of 0 means the filament does not support printing on the Textured PEI Plate." -msgstr "Asztalhőmérséklet a texturált PEI tálca használatával. A 0 érték azt jelenti, hogy a filament nem támogatja a Textured PEI Plate-re történő nyomtatást" +msgstr "Asztalhőmérséklet a texturált PEI tálca használatakor. A 0 azt jelenti, hogy a filament nem nyomtatható erre a tálcára." msgid "Volumetric speed limitation" msgstr "Volumetrikus sebességhatár" @@ -10763,13 +10765,13 @@ msgid "Layer change G-code" msgstr "Rétegváltás G-kód" msgid "Timelapse G-code" -msgstr "Időfelvétel G-kód" +msgstr "Timelapse G-kód" msgid "Clumping Detection G-code" msgstr "Csomósodásészlelés G-kód" msgid "Change filament G-code" -msgstr "Filament csere G-kód" +msgstr "Filamentcsere G-kód" msgid "Pause G-code" msgstr "Szünet G-kód" @@ -10877,8 +10879,8 @@ msgstr "A más beállítások által örökölt beállítások nem törölhetők msgid "The following presets inherit this preset." msgid_plural "The following preset inherits this preset." -msgstr[0] "A következő profilok öröklik ezt a profilt." -msgstr[1] "A következő profil örökli ezt a profilt." +msgstr[0] "A következő profil örökli ezt a profilt." +msgstr[1] "A következő profilok öröklik ezt a profilt." #. TRN Remove/Delete #, boost-format @@ -11027,9 +11029,9 @@ msgid "" "will be transferred to\n" "\"%2%\"." msgstr "" -"Minden „Új érték” beállítás módosítva\n" +"A(z)\n" "\"%1%\"\n" -"címre kerülnek át\n" +"beállításban módosított összes „Új érték” átkerül ide:\n" "\"%2%\"." #, boost-format @@ -11038,15 +11040,15 @@ msgid "" "\"%1%\"\n" "and \"%2%\" will open without any changes." msgstr "" -"Minden „Új érték” beállítás mentésre kerül\n" +"Az összes „Új érték” mentési helye:\n" "\"%1%\"\n" -"és a \"%2%\" változtatás nélkül nyílik meg." +"A(z) \"%2%\" módosítás nélkül nyílik meg." msgid "Click the right mouse button to display the full text." msgstr "Kattints a jobb egérgombbal a teljes szöveg megjelenítéséhez." msgid "No changes will be saved." -msgstr "A módosítások nem kerülnek mentésre" +msgstr "Nem menti a módosításokat." msgid "All changes will be discarded." msgstr "Minden változtatás el lesz vetve." @@ -11292,8 +11294,8 @@ msgid "" "The color has been selected, you can choose OK \n" " to continue or manually adjust it." msgstr "" -"A szín ki lett választva, az OK gombbal folytathatod,\n" -" vagy akár manuálisan is módosíthatod." +"A szín ki van választva. Az OK gombbal folytathatod, \n" +" vagy kézzel is módosíthatod." msgid "—> " msgstr "—> " @@ -11404,10 +11406,10 @@ msgid "The selected printer (%s) is incompatible with the chosen printer profile msgstr "A kiválasztott nyomtató (%s) nem kompatibilis a szeletelőben kiválasztott nyomtatóprofillal (%s)." msgid "Timelapse is not supported because Print sequence is set to \"By object\"." -msgstr "Az időfelvétel nem támogatott ebben a módban, mert a nyomtatási sorrend \"Tárgyanként\" értékre van állítva." +msgstr "A Timelapse ebben a módban nem támogatott, mert a nyomtatási sorrend \"Tárgyanként\" értékre van állítva." msgid "You selected external and AMS filament at the same time in an extruder, you will need manually change external filament." -msgstr "Ugyanabban az extruderben egyszerre választottál külső és AMS filamentet, ezért a külső filamentet manuálisan kell majd cserélned." +msgstr "Ugyanabban az extruderben egyszerre választottál külső és AMS-filamentet, ezért nyomtatás közben kézzel kell cserélned a külső filamentet." msgid "Successfully synchronized nozzle information." msgstr "A fúvókainformációk szinkronizálása sikerült." @@ -11488,7 +11490,7 @@ msgid "Native Wayland liveview requires the GStreamer GTK video sink. Please ins msgstr "A natív Wayland élőképhez a GStreamer GTK videonyelő szükséges. Telepítsd a gtksink beépülő modult a GStreamerhez, majd indítsd újra az OrcaSlicert." msgid "Failed to initialize the native Wayland GStreamer video sink. Please check your GStreamer GTK plugin installation." -msgstr "Nem sikerült inicializálni a natív Wayland GStreamer videonyelőt.Ellenőrizd a GStreamer GTK bővítmény telepítését." +msgstr "Nem sikerült inicializálni a natív Wayland GStreamer videonyelőt. Ellenőrizd a GStreamer GTK bővítmény telepítését." msgid "Windows Media Player is required for this task! Do you want to enable 'Windows Media Player' for your operation system?" msgstr "Ehhez a művelethez Windows Media Player szükséges. Szeretnéd engedélyezni a \"Windows Media Player\"-t az operációs rendszerben?" @@ -11497,16 +11499,16 @@ msgid "BambuSource has not correctly been registered for media playing! Press Ye msgstr "A BambuSource nincs megfelelően regisztrálva médialejátszáshoz. Kattints az Igen gombra az újbóli regisztráláshoz. Kétszer kapsz majd megerősítési kérést." msgid "Missing BambuSource component registered for media playing! Please re-install OrcaSlicer or seek community help." -msgstr "Hiányzó BambuSource komponens a média lejátszáshoz! Kérjük, telepítse újra az OrcaSlicert, vagy kérjen segítséget a közösségtől." +msgstr "A médialejátszáshoz szükséges BambuSource-összetevő hiányzik. Kérlek, telepítsd újra az OrcaSlicert, vagy kérj segítséget a közösségtől." msgid "Using a BambuSource from a different install, video play may not work correctly! Press Yes to fix it." -msgstr "Másik telepítésből származó BambuSource használata esetén a videólejátszás nem biztos, hogy megfelelően működik. Kattints az Igen gombra a javításhoz." +msgstr "Ha egy másik telepítésből származó BambuSource van használatban, előfordulhat, hogy a videólejátszás nem működik megfelelően. Kattints az Igen gombra a javításhoz." msgid "Your system is missing H.264 codecs for GStreamer, which are required to play video. (Try installing the gstreamer1.0-plugins-bad or gstreamer1.0-libav packages, then restart Orca Slicer?)" msgstr "A rendszerből hiányoznak a GStreamer H.264 kodekjei, amelyek szükségesek a videolejátszáshoz. (Próbáld telepíteni a gstreamer1.0-plugins-bad vagy a gstreamer1.0-libav csomagokat, majd indítsd újra az Orca Slicert.)" msgid "Cloud agent is not available. Please restart OrcaSlicer and try again." -msgstr "A cloud ügynök nem érhető el. Indítsd újra az OrcaSlicert és próbáljd újra." +msgstr "A felhőszolgáltatás nem érhető el. Indítsd újra az OrcaSlicert, majd próbáld újra." msgid "Bambu Network plug-in not detected." msgstr "A Bambu Network plug-in nem található." @@ -11668,7 +11670,7 @@ msgid "Gizmo scale" msgstr "Gizmo átméretezés" msgid "Gizmo place face on bed" -msgstr "Gizmo felület tárgyasztalra illesztése" +msgstr "Gizmo felület asztalra illesztése" msgid "Gizmo cut" msgstr "Gizmo vágás" @@ -11677,7 +11679,7 @@ msgid "Gizmo mesh boolean" msgstr "Gizmo modellháló logikai műveletek" msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Gizmo FDM bolyhos felület festése" +msgstr "Gizmo FDM barázdált felület festése" msgid "Gizmo SLA support points" msgstr "Gizmo SLA támaszpontok" @@ -11695,7 +11697,7 @@ msgid "Gizmo assemble" msgstr "Gizmo összeállítás" msgid "Gizmo brim ears" -msgstr "Gizmo karimás fülek" +msgstr "Gizmo peremfülek" msgid "Zoom in" msgstr "Zoom közelítés" @@ -11746,13 +11748,13 @@ msgid "Delete objects, parts, modifiers" msgstr "Objektumok, tárgyak, módosítók törlése" msgid "Select the object/part and press space to change the name" -msgstr "Válaszd ki az objektumot/tárgyat, és nyomd meg a szóközt a név megváltoztatásához" +msgstr "Válaszd ki az objektumot vagy alkatrészt, majd nyomd meg a szóközt a név megváltoztatásához" msgid "Mouse click" msgstr "Egérkattintás" msgid "Select the object/part and mouse click to change the name" -msgstr "Válaszd ki az objektumot/tárgyat, és kattints az egérrel a név megváltoztatásához" +msgstr "Válaszd ki az objektumot vagy alkatrészt, majd kattints a nevére az átnevezéshez" msgid "Objects List" msgstr "Tárgyak listája" @@ -11817,7 +11819,7 @@ msgid "A new Network plug-in (%s) is available. Do you want to install it?" msgstr "Új hálózati bővítmény (%s) érhető el. Szeretnéd telepíteni?" msgid "New version of Orca Slicer" -msgstr "A Orca Slicer új verziója" +msgstr "Az Orca Slicer új verziója" # AI Translated msgid "Check on Microsoft Store" @@ -11854,7 +11856,7 @@ msgid "2. If the IP and Access Code below are different from the actual values o msgstr "2. Ha az alábbi IP-cím és hozzáférési kód eltér a nyomtatón látható valós értékektől, javítsd ki őket." msgid "3. Please obtain the device SN from the printer side; it is usually found in the device information on the printer screen." -msgstr "3. Kérjük, szerezd be az eszköz sorozatszámát a nyomtatóról; ez általában a nyomtató kijelzőjén, az eszközinformációk között található." +msgstr "3. Kérlek, keresd meg az eszköz sorozatszámát a nyomtatón; ez általában a nyomtató kijelzőjén, az eszközinformációk között található." msgid "IP" msgstr "IP" @@ -11897,7 +11899,7 @@ msgid "The printer has already been bound." msgstr "A nyomtató már hozzá lett rendelve." msgid "The printer mode is incorrect, please switch to LAN Only." -msgstr "A nyomtató módja hibás, kérjük, állítsd LAN Only módra." +msgstr "A nyomtató módja hibás, kérlek, állítsd LAN Only módra." msgid "Connecting to printer... The dialog will close later" msgstr "Kapcsolódás a nyomtatóhoz... A párbeszédablak később bezárul" @@ -11962,7 +11964,7 @@ msgid "Update successful" msgstr "Sikeres frissítés" msgid "Hotends on Rack" -msgstr "Hotendek a tartón" +msgstr "Fejegységek a tartón" msgid "Are you sure you want to update? This will take about 10 minutes. Do not turn off the power while the printer is updating." msgstr "Biztos, hogy frissíteni akarsz? Ez körülbelül 10 percet vesz igénybe. Ne kapcsold ki a nyomtatót, amíg a frissítés tart." @@ -11972,7 +11974,7 @@ msgstr "Fontos frissítést találtunk, amelyet a nyomtatás előtt telepíteni # AI Translated msgid "The firmware version is abnormal. Repairing and updating are required before printing. Do you want to update now? You can also update later on the printer or update next time you start Orca Slicer." -msgstr "A firmware verziója rendellenes. A nyomtatás előtt javításra és frissítésre van szükség. Szeretnél frissíteni most? A frissítés később a nyomtatón, vagy az Orca Slicer következő indításakor is elvégezhető." +msgstr "A firmware-verzió hibás. Nyomtatás előtt javítani és frissíteni kell. Szeretnéd most frissíteni? Ezt később a nyomtatón vagy az Orca Slicer következő indításakor is megteheted." msgid "Extension Board" msgstr "Bővítőpanel" @@ -12030,7 +12032,7 @@ msgid "No object can be printed. It may be too small." msgstr "Objektum nem nyomtatható ki. Lehet, hogy túl kicsi." msgid "Your print is very close to the priming regions. Make sure there is no collision." -msgstr "A nyomtatás nagyon közel van az alapozó régiókhoz. Győződjön meg róla, hogy nincs ütközés." +msgstr "A nyomat nagyon közel van az előkészítő extrudálás területéhez. Ellenőrizd, hogy nem ütköznek-e." msgid "" "Failed to generate G-code for invalid custom G-code.\n" @@ -12057,7 +12059,7 @@ msgid "" "Check your firmware version and update your G-code flavor to ´Marlin 2´." msgstr "" "A rezgéskompenzációt a Marlin < 2.1.2 nem támogatja.\n" -"Ellenőrizd a firmware verzióját és állítsd a G-kód változatot „Marlin 2”-re" +"Ellenőrizd a firmware-verziót, majd állítsd a G-kód változatát „Marlin 2”-re" msgid "Input shaping is only supported by Klipper, RepRapFirmware and Marlin 2." msgstr "A rezgéskompenzációt csak a Klipper, a RepRapFirmware és a Marlin 2 támogatja" @@ -12211,7 +12213,7 @@ msgid "No extrusions under current settings." msgstr "A jelenlegi beállításokkal nincsenek extrudálások." msgid "Smooth mode of timelapse is not supported when \"by object\" sequence is enabled." -msgstr "A sima időfelvétel funkció nem használható, ha a nyomtatás \"Tárgyanként\" sorrendre van állítva." +msgstr "A sima Timelapse nem használható, ha a nyomtatási sorrend \"Tárgyanként\"." msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "A csomósodásészlelés nem támogatott, ha a nyomtatási sorrend \"Tárgyanként\" értékre van állítva." @@ -12241,7 +12243,7 @@ msgid "While the object %1% itself fits the build volume, its last layer exceeds msgstr "Bár a(z) %1% objektum önmagában belefér a nyomtatási térfogatba, az utolsó rétege túllépi a maximális nyomtatási magasságot." msgid "You might want to reduce the size of your model or change current print settings and retry." -msgstr "Lehet, hogy csökkentened kell a modell méretét, vagy módosítanod kell a jelenlegi nyomtatási beállításokat, majd újra próbálkoznod." +msgstr "Próbáld meg csökkenteni a modell méretét vagy módosítani a jelenlegi nyomtatási beállításokat, majd próbáld újra." msgid "Variable layer height is not supported with Organic supports." msgstr "A változó rétegmagasság nem működik az organikus támaszokkal." @@ -12256,7 +12258,7 @@ msgid "Ooze prevention is only supported with the wipe tower when 'single_extrud msgstr "A szivárgás megelőzése csak akkor támogatott a törlőtoronnyal, ha a 'single_extruder_multi_material' ki van kapcsolva." msgid "The prime tower is currently only supported for the Marlin, RepRap/Sprinter, RepRapFirmware and Repetier G-code flavors." -msgstr "A törlőtorony jelenleg csak a Marlin, RepRap/Sprinter, RepRapFirmware és Repetier G-kód változatokkal használható." +msgstr "A törlőtorony jelenleg csak a Marlin, RepRap/Sprinter, RepRapFirmware és Repetier G-kód-változatokkal használható." msgid "A prime tower is not supported in “By object” print." msgstr "A törlőtorony nem támogatott \"Tárgyanként\" nyomtatás esetén." @@ -12301,7 +12303,7 @@ msgid "For Organic supports, two walls are supported only with the Hollow/Defaul msgstr "Organikus támaszok esetén a két fal csak Üreges/Alapértelmezett alapmintázattal támogatott." msgid "The Lightning base pattern is not supported by this support type; Rectilinear will be used instead." -msgstr "A Lightning alapmintázat ennél a támasztípusnál nem támogatott; helyette egyenes vonalú mintázat lesz használva." +msgstr "Ez a támasztípus nem támogatja a Villám alapmintázatot; helyette egyenes vonalú mintázatot használ." msgid "Organic support tree tip diameter must not be smaller than support material extrusion width." msgstr "Az organikus támaszfa csúcsátmérője nem lehet kisebb, mint a támaszanyag extrudálási szélessége." @@ -12313,7 +12315,7 @@ msgid "Organic support branch diameter must not be smaller than support tree tip msgstr "Az organikus támaszfa ágának átmérője nem lehet kisebb, mint a támaszfa csúcsának átmérője." msgid "The Hollow base pattern is not supported by this support type; Rectilinear will be used instead." -msgstr "Az üreges alap mintát ez a támasztéktípus nem támogatja; helyette az egyenes vonalú lesz használva." +msgstr "Ez a támasztípus nem támogatja az üreges alapmintázatot; helyette egyenes vonalú mintázatot használ." msgid "Support enforcers are used but support is not enabled. Please enable support." msgstr "Támasz kényszerítőket használtál, de a támaszok nincsenek engedélyezve. Kérlek, engedélyezd a támaszokat." @@ -12388,7 +12390,7 @@ msgstr "" "A nagyobb sebesség eléréséhez módosíthatod a machine_max_acceleration_travel értéket a nyomtató konfigurációjában." msgid "The precise wall option will be ignored for outer-inner or inner-outer-inner wall sequences." -msgstr "A pontos fal opció figyelmen kívül lesz hagyva külső-belső vagy belső-külső-belső fali sorrend esetén." +msgstr "A szeletelő figyelmen kívül hagyja a pontos fal beállítást Külső/Belső vagy Belső/Külső/Belső falsorrendnél." # AI Translated msgid "The Adaptive Pressure Advance model for one or more extruders may contain invalid values." @@ -12460,16 +12462,16 @@ msgid "Unprintable area in XY plane. For example, X1 Series printers use the fro msgstr "A nyomtatásra nem használható terület az XY síkban. Az X1 nyomtatók például a bal első sarkot használják a filament elvágására filamentcserét követően. A terület sokszögként van meghatározva a következő formátumban: XxY, XxY, ..." msgid "Bed custom texture" -msgstr "Egyedi tárgyasztal textúra" +msgstr "Egyedi asztaltextúra" msgid "Bed custom model" -msgstr "Egyedi tárgyasztal modell" +msgstr "Egyedi asztalmodell" msgid "Elephant foot compensation" msgstr "Elefántláb kompenzáció" msgid "This shrinks the first layer on the build plate to compensate for elephant foot effect." -msgstr "Zsugorítja a kezdőréteget a tárgyasztalon, hogy kompenzálja az elefántláb-hatást" +msgstr "Zsugorítja a kezdőréteget az asztalon, hogy kompenzálja az elefántláb-hatást" msgid "Elephant foot compensation layers" msgstr "Elefántláb-kompenzáció rétegei" @@ -12485,8 +12487,8 @@ msgid "" "The initial value for the second layer is set.\n" "Subsequent layers become linearly denser by the height specified in elefant_foot_compensation_layers." msgstr "" -"A belső szilárd töltés sűrűsége az elefánt lábrétegeinek kompenzálásához.\n" -"A második réteg kezdeti értéke van állítva.\n" +"A belső tömör kitöltés sűrűsége az elefántláb rétegeinek kompenzálásához.\n" +"A kezdeti értéket a második réteg használja.\n" "A következő rétegek lineárisan sűrűbbé válnak az elefant_foot_compensation_layers paraméterben megadott magassággal." msgid "This is the height for each layer. Smaller layer heights give greater accuracy but longer printing time." @@ -12506,13 +12508,13 @@ msgid "Maximum printable height of this extruder which is limited by mechanism o msgstr "Ennek az extrudernek a maximális nyomtatható magassága, amelyet a nyomtató mechanikája korlátoz." msgid "Preferred orientation" -msgstr "Előnyben részesített orientáció" +msgstr "Előnyben részesített tájolás" msgid "Automatically orient STL files on the Z axis upon initial import." msgstr "Az STL fájlok automatikus Z tengely szerinti tájolása első importáláskor." msgid "Printer preset names" -msgstr "Nyomtató beállítások neve" +msgstr "Nyomtatóbeállítások nevei" msgid "Use 3rd-party print host" msgstr "Külső nyomtatási gazdagép használata" @@ -12538,7 +12540,7 @@ msgid "Hostname, IP or URL" msgstr "Gazdagépnév, IP vagy URL" msgid "Orca Slicer can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance. Print host behind HAProxy with basic auth enabled can be accessed by putting the user name and password into the URL in the following format: https://username:password@your-octopi-address/" -msgstr "A Orca Slicer képes G-kód fájlokat feltölteni a nyomtatóra. Ennek a mezőnek tartalmaznia kell a nyomtató hostnevét, IP-címét vagy URL-címét. A HAProxy mögött lévő nyomtató alapszintű hitelesítéssel érhető el, ha a felhasználónevet és a jelszót a következő formátumban beleírod az URL-be: https://username:password@your-octopi-address/" +msgstr "Az Orca Slicer képes G-kód fájlokat feltölteni a nyomtatóra. Ennek a mezőnek a nyomtató gazdagépnevét, IP-címét vagy URL-címét kell tartalmaznia. A HAProxy mögött lévő nyomtató alapszintű hitelesítéssel érhető el, ha a felhasználónevet és a jelszót a következő formátumban írod az URL-be: https://username:password@your-octopi-address/" msgid "Device UI" msgstr "Eszköz UI" @@ -12550,7 +12552,7 @@ msgid "API Key / Password" msgstr "API kulcs / jelszó" msgid "Orca Slicer can upload G-code files to a printer host. This field should contain the API Key or the password required for authentication." -msgstr "A Orca Slicer képes G-kód fájlokat feltölteni a nyomtatóra. Ennek a mezőnek tartalmaznia kell a hitelesítéshez szükséges API-kulcsot vagy jelszót." +msgstr "Az Orca Slicer képes G-kód fájlokat feltölteni a nyomtatóra. Ennek a mezőnek a hitelesítéshez szükséges API-kulcsot vagy jelszót kell tartalmaznia." # AI Translated msgid "Serial Number" @@ -12567,7 +12569,7 @@ msgid "HTTPS CA File" msgstr "HTTPS CA fájl" msgid "Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. If left blank, the default OS CA certificate repository is used." -msgstr "A HTTP-alapú OctoPrint kapcsolatokhoz megadható egy egyedi CA-tanúsítvány, crt/pem formátumban. Ha üresen hagyod, az alapértelmezett OS CA tanúsítvány lesz használva." +msgstr "A HTTPS-alapú OctoPrint-kapcsolatokhoz egyedi CA-tanúsítványfájlt adhatsz meg crt/pem formátumban. Ha üresen hagyod, az operációs rendszer alapértelmezett CA-tanúsítványát használja." msgid "User" msgstr "Felhasználó" @@ -12617,22 +12619,22 @@ msgid "Other layers" msgstr "Többi réteg" msgid "Bed temperature for layers except the initial one. A value of 0 means the filament does not support printing on the Cool Plate SuperTack." -msgstr "A kezdőrétegen kívüli rétegek tárgyasztalhőmérséklete. A 0 érték azt jelenti, hogy a filament nem támogatja a nyomtatást a SuperTac hűvös tálcán." +msgstr "A kezdőréteg utáni asztalhőmérséklet. A 0 azt jelenti, hogy a filament nem nyomtatható a SuperTack hűvös tálcára." msgid "This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the Cool Plate." -msgstr "Az asztal hőmérséklete a kezdőréteg kivételével. A 0 érték azt jelenti, hogy a filament nem támogatja a Cool Plate-re történő nyomtatást" +msgstr "A kezdőréteg utáni asztalhőmérséklet. A 0 azt jelenti, hogy a filament nem nyomtatható a hűvös tálcára." msgid "This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the Textured Cool Plate." -msgstr "A kezdőrétegen kívüli rétegek tárgyasztalhőmérséklete. A 0 érték azt jelenti, hogy a filament nem támogatja a nyomtatást a texturált hűvös tálcán." +msgstr "A kezdőréteg utáni asztalhőmérséklet. A 0 azt jelenti, hogy a filament nem nyomtatható a texturált hűvös tálcára." msgid "This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the Engineering Plate." -msgstr "Az asztal hőmérséklete a kezdeti réteg kivételével. A 0 érték azt jelenti, hogy a szál nem támogatja az Engineering Plate-re történő nyomtatást" +msgstr "A kezdőréteg utáni asztalhőmérséklet. A 0 azt jelenti, hogy a filament nem nyomtatható a műszaki tálcára." msgid "This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the High Temp Plate." -msgstr "Az asztal hőmérséklete a kezdeti réteg kivételével. A 0 érték azt jelenti, hogy a szál nem támogatja a High Temp Plate-re történő nyomtatást" +msgstr "A kezdőréteg utáni asztalhőmérséklet. A 0 azt jelenti, hogy a filament nem nyomtatható a magas hőmérsékletű tálcára." msgid "This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the Textured PEI Plate." -msgstr "Asztalhőmérséklet az első réteg után. A 0 érték azt jelenti, hogy a filament nem támogatja texturált PEI tálcára történő nyomtatást." +msgstr "A kezdőréteg utáni asztalhőmérséklet. A 0 azt jelenti, hogy a filament nem nyomtatható a texturált PEI tálcára." msgid "First layer" msgstr "Kezdőréteg" @@ -12641,19 +12643,19 @@ msgid "First layer bed temperature" msgstr "Első réteg asztalhőmérséklete" msgid "This is the bed temperature of the first layer. A value of 0 means the filament does not support printing on the Cool Plate SuperTack." -msgstr "A kezdőréteg tárgyasztalhőmérséklete. A 0 érték azt jelenti, hogy a filament nem támogatja a nyomtatást a SuperTac hűvös tálcán." +msgstr "A kezdőréteg asztalhőmérséklete. A 0 azt jelenti, hogy a filament nem nyomtatható a SuperTack hűvös tálcára." msgid "This is the bed temperature of the first layer. A value of 0 means the filament does not support printing on the Cool Plate." -msgstr "A kezdőréteg asztalhőmérséklete. A 0 érték azt jelenti, hogy a filament nem támogatja a Cool Plate-re történő nyomtatást" +msgstr "A kezdőréteg asztalhőmérséklete. A 0 azt jelenti, hogy a filament nem nyomtatható a hűvös tálcára." msgid "This is the bed temperature of the first layer. A value of 0 means the filament does not support printing on the Textured Cool Plate." -msgstr "A kezdőréteg tárgyasztalhőmérséklete. A 0 érték azt jelenti, hogy a filament nem támogatja a nyomtatást a texturált hűvös tálcán." +msgstr "A kezdőréteg asztalhőmérséklete. A 0 azt jelenti, hogy a filament nem nyomtatható a texturált hűvös tálcára." msgid "This is the bed temperature of the first layer. A value of 0 means the filament does not support printing on the Engineering Plate." -msgstr "A kezdőréteg asztalhőmérséklete. A 0 érték azt jelenti, hogy a filament nem támogatja a Engineering Plate-re történő nyomtatást" +msgstr "A kezdőréteg asztalhőmérséklete. A 0 azt jelenti, hogy a filament nem nyomtatható a műszaki tálcára." msgid "This is the bed temperature of the first layer. A value of 0 means the filament does not support printing on the High Temp Plate." -msgstr "A kezdőréteg asztalhőmérséklete. A 0 érték azt jelenti, hogy a filament nem támogatja a High Temp Plate-re történő nyomtatást" +msgstr "A kezdőréteg asztalhőmérséklete. A 0 azt jelenti, hogy a filament nem nyomtatható a magas hőmérsékletű tálcára." # AI Translated msgid "This is the bed temperature of the first layer. A value of 0 means the filament does not support printing on the Textured PEI Plate." @@ -12666,7 +12668,7 @@ msgid "Default bed type" msgstr "Alapértelmezett asztaltípus" msgid "Default bed type for the printer (supports both numeric and string format)." -msgstr "A nyomtató alapértelmezett tárgyasztaltípusa (szám- és szöveges formátumot is támogat)." +msgstr "A nyomtató alapértelmezett asztaltípusa (szám- és szöveges formátumot is támogat)." msgid "First layer print sequence" msgstr "Az első réteg nyomtatási sorrendje" @@ -12696,7 +12698,7 @@ msgid "The number of bottom solid layers is increased when slicing if the thickn msgstr "Az alsó szilárd rétegek száma szeleteléskor megnő, ha az alsó héjrétegek vastagsága kisebb ennél az értéknél. Ezzel elkerülhető, hogy túl vékony legyen a héj, ha a rétegmagasság kicsi. A 0 azt jelenti, hogy ez a beállítás ki van kapcsolva, és az alsó héj vastagságát egyszerűen az alsó héjrétegek száma határozza meg." msgid "Apply gap fill" -msgstr "Réskitöltés alkalmazása" +msgstr "Hézagkitöltés alkalmazása" msgid "" "Enables gap fill for the selected solid surfaces. The minimum gap length that will be filled can be controlled from the filter out tiny gaps option below.\n" @@ -12712,18 +12714,18 @@ msgid "" "\n" "However this is not advised, as gap fill between perimeters is contributing to the model's strength. For models where excessive gap fill is generated between perimeters, a better option would be to switch to the arachne wall generator and use this option to control whether the cosmetic top and bottom surface gap fill is generated." msgstr "" -"Engedélyezi a réskitöltést a kijelölt tömör felületeken. A kitöltendő minimális rés hosszát az alábbi apró rések szűrése beállítással lehet szabályozni.\n" +"Engedélyezi a hézagkitöltést a kijelölt tömör felületeken. A kitöltendő hézagok minimális hosszát az alábbi apró hézagok szűrése beállítással lehet szabályozni.\n" "\n" "Lehetőségek:\n" -"1. Mindenhol: A réskitöltést a felső, alsó és belső tömör felületeken is alkalmazza a maximális szilárdság érdekében\n" -"2. Felső és alsó felületek: Csak a felső és alsó felületeken alkalmazza a réskitöltést, egyensúlyt teremtve a nyomtatási sebesség, a tömör kitöltés esetleges túlextrudálásának csökkentése, valamint a felső és alsó felületek tűlyukmentessége között\n" -"3. Sehol: Letiltja a réskitöltést minden tömör kitöltési területen\n" +"1. Mindenhol: A hézagkitöltést a felső, alsó és belső tömör felületeken is alkalmazza a maximális szilárdság érdekében\n" +"2. Felső és alsó felületek: Csak a felső és alsó felületeken alkalmazza a hézagkitöltést, egyensúlyt teremtve a nyomtatási sebesség, a tömör kitöltés esetleges túlextrudálásának csökkentése, valamint a felső és alsó felületek tűlyukmentessége között\n" +"3. Sehol: Letiltja a hézagkitöltést minden tömör kitöltési területen\n" "\n" -"Vedd figyelembe, hogy klasszikus falgenerátor használatakor a falak között is keletkezhet réskitöltés, ha közéjük nem fér el egy teljes szélességű vonal. Ezt a falak közötti réskitöltést ez a beállítás nem szabályozza.\n" +"Vedd figyelembe, hogy klasszikus falgenerátor használatakor a falak között is keletkezhet hézagkitöltés, ha közéjük nem fér el egy teljes szélességű vonal. Ezt a falak közötti hézagkitöltést ez a beállítás nem szabályozza.\n" "\n" -"Ha minden réskitöltést, beleértve a klasszikus falgenerátor által létrehozottat is, el szeretnél távolítani, állítsd az apró rések szűrése értékét egy nagy számra, például 999999-re.\n" +"Ha minden hézagkitöltést, beleértve a klasszikus falgenerátor által létrehozottat is, el szeretnél távolítani, állítsd az apró hézagok szűrése értékét egy nagy számra, például 999999-re.\n" "\n" -"Ez azonban nem ajánlott, mert a falak közötti réskitöltés hozzájárul a modell szilárdságához. Olyan modelleknél, ahol túl sok réskitöltés keletkezik a falak között, jobb megoldás lehet az Arachne falgenerátorra váltani, és ezzel a beállítással szabályozni, hogy létrejöjjön-e a felső és alsó felületek esztétikai réskitöltése." +"Ez azonban nem ajánlott, mert a falak közötti hézagkitöltés hozzájárul a modell szilárdságához. Olyan modelleknél, ahol túl sok hézagkitöltés keletkezik a falak között, jobb megoldás lehet az Arachne falgenerátorra váltani, és ezzel a beállítással szabályozni, hogy létrejöjjön-e a felső és alsó felületek esztétikai hézagkitöltése." msgid "Everywhere" msgstr "Mindenhol" @@ -12873,7 +12875,7 @@ msgstr "" "Ez a beállítás különösen jól működik a második belső híd a kitöltés felett lehetőséggel együtt, tovább javítva az áthidalást, mielőtt a tömör kitöltés extrudálásra kerül." msgid "Bridge flow ratio" -msgstr "Áthidalás áramlási sebessége" +msgstr "Áthidalás anyagáramlása" # AI Translated msgid "" @@ -12904,7 +12906,7 @@ msgstr "" "Ha 0-ra van állítva, a vonalszélesség megegyezik a belső tömör kitöltés szélességével." msgid "Internal bridge flow ratio" -msgstr "Belső híd áramlási aránya" +msgstr "Belső híd anyagáramlása" # AI Translated msgid "" @@ -12930,10 +12932,10 @@ msgid "" msgstr "" "Ez a tényező befolyásolja a felső tömör kitöltéshez felhasznált anyag mennyiségét. Kissé csökkentheted az értéket, hogy simább felületi megjelenést kapj.\n" "\n" -"A ténylegesen használt felső felületi áramlás ennek az értéknek, a filament áramlási arányának, valamint ha be van állítva, az objektum áramlási arányának a szorzatából adódik." +"A felső felület tényleges anyagáramlása ennek az értéknek, a filament anyagáramlásának, valamint – ha be van állítva – az objektum anyagáramlásának a szorzata." msgid "Bottom surface flow ratio" -msgstr "Alsó felület áramlási aránya" +msgstr "Alsó felület anyagáramlása" msgid "" "This factor affects the amount of material for bottom solid infill.\n" @@ -12942,16 +12944,16 @@ msgid "" msgstr "" "Ez a tényező befolyásolja az alsó tömör kitöltéshez felhasznált anyag mennyiségét.\n" "\n" -"A ténylegesen használt alsó tömör kitöltési áramlás ennek az értéknek, a filament áramlási arányának, valamint ha be van állítva, az objektum áramlási arányának a szorzatából adódik." +"Az alsó tömör kitöltés tényleges anyagáramlása ennek az értéknek, a filament anyagáramlásának, valamint – ha be van állítva – az objektum anyagáramlásának a szorzata." msgid "Set other flow ratios" -msgstr "Egyéb áramlási arányok beállítása" +msgstr "Egyéb anyagáramlások beállítása" msgid "Change flow ratios for other extrusion path types." -msgstr "Anyagáramlási arányok módosítása más extrudálási úttípusokhoz." +msgstr "Anyagáramlások módosítása más extrudálási úttípusokhoz." msgid "First layer flow ratio" -msgstr "Első réteg áramlási aránya" +msgstr "Első réteg anyagáramlása" msgid "" "This factor affects the amount of material on the first layer for the extrusion path roles listed in this section.\n" @@ -12960,10 +12962,10 @@ msgid "" msgstr "" "Ez a tényező az ebben a szakaszban felsorolt extrudálási útszerepek első rétegén felhasznált anyagmennyiséget befolyásolja.\n" "\n" -"Az első rétegen az egyes útszerepek tényleges áramlási aránya (a peremeket és szoknyákat nem érinti) ezzel az értékkel lesz megszorozva." +"Az első rétegen az egyes úttípusok tényleges anyagáramlását ezzel az értékkel szorozza meg (a peremeket és szoknyákat nem érinti)." msgid "Outer wall flow ratio" -msgstr "Külső fal áramlási aránya" +msgstr "Külső fal anyagáramlása" msgid "" "This factor affects the amount of material for outer walls.\n" @@ -12972,10 +12974,10 @@ msgid "" msgstr "" "Ez a tényező a külső falakhoz felhasznált anyagmennyiséget befolyásolja.\n" "\n" -"A tényleges külső fali áramlás úgy számolódik, hogy ezt az értéket megszorozza a filament áramlási arányával, valamint ha be van állítva, az objektum áramlási arányával." +"A külső fal tényleges anyagáramlása ennek az értéknek, a filament anyagáramlásának, valamint – ha be van állítva – az objektum anyagáramlásának a szorzata." msgid "Inner wall flow ratio" -msgstr "Belső fal áramlási aránya" +msgstr "Belső fal anyagáramlása" msgid "" "This factor affects the amount of material for inner walls.\n" @@ -12984,10 +12986,10 @@ msgid "" msgstr "" "Ez a tényező a belső falakhoz felhasznált anyagmennyiséget befolyásolja.\n" "\n" -"A tényleges belső fali áramlás úgy számolódik, hogy ezt az értéket megszorozza a filament áramlási arányával, valamint ha be van állítva, az objektum áramlási arányával." +"A belső fal tényleges anyagáramlása ennek az értéknek, a filament anyagáramlásának, valamint – ha be van állítva – az objektum anyagáramlásának a szorzata." msgid "Overhang flow ratio" -msgstr "Túlnyúlás áramlási aránya" +msgstr "Túlnyúlás anyagáramlása" msgid "" "This factor affects the amount of material for overhangs.\n" @@ -12996,22 +12998,22 @@ msgid "" msgstr "" "Ez a tényező a túlnyúlásokhoz felhasznált anyagmennyiséget befolyásolja.\n" "\n" -"A tényleges túlnyúlási áramlás úgy számolódik, hogy ezt az értéket megszorozza a filament áramlási arányával, valamint ha be van állítva, az objektum áramlási arányával." +"A túlnyúlás tényleges anyagáramlása ennek az értéknek, a filament anyagáramlásának, valamint – ha be van állítva – az objektum anyagáramlásának a szorzata." msgid "Sparse infill flow ratio" -msgstr "Ritka kitöltés áramlási aránya" +msgstr "Kitöltés anyagáramlása" msgid "" "This factor affects the amount of material for sparse infill.\n" "\n" "The actual sparse infill flow used is calculated by multiplying this value by the filament flow ratio, and if set, the object's flow ratio." msgstr "" -"Ez a tényező a ritka kitöltéshez felhasznált anyagmennyiséget befolyásolja.\n" +"Ez a tényező a kitöltéshez felhasznált anyagmennyiséget befolyásolja.\n" "\n" -"A tényleges ritka kitöltési áramlás úgy számolódik, hogy ezt az értéket megszorozza a filament áramlási arányával, valamint ha be van állítva, az objektum áramlási arányával." +"A tényleges kitöltési anyagáramlást úgy számítja ki, hogy ezt az értéket megszorozza a filament anyagáramlásával, valamint ha be van állítva, az objektum anyagáramlásával." msgid "Internal solid infill flow ratio" -msgstr "Belső tömör kitöltés áramlási aránya" +msgstr "Belső tömör kitöltés anyagáramlása" msgid "" "This factor affects the amount of material for internal solid infill.\n" @@ -13020,10 +13022,10 @@ msgid "" msgstr "" "Ez a tényező a belső tömör kitöltéshez felhasznált anyagmennyiséget befolyásolja.\n" "\n" -"A tényleges belső tömör kitöltési áramlás úgy számolódik, hogy ezt az értéket megszorozza a filament áramlási arányával, valamint ha be van állítva, az objektum áramlási arányával." +"A belső tömör kitöltés tényleges anyagáramlása ennek az értéknek, a filament anyagáramlásának, valamint – ha be van állítva – az objektum anyagáramlásának a szorzata." msgid "Gap fill flow ratio" -msgstr "Réskitöltés áramlási aránya" +msgstr "Hézagkitöltés anyagáramlása" msgid "" "This factor affects the amount of material for filling the gaps.\n" @@ -13032,10 +13034,10 @@ msgid "" msgstr "" "Ez a tényező a rések kitöltéséhez felhasznált anyagmennyiséget befolyásolja.\n" "\n" -"A tényleges réskitöltési áramlás úgy számolódik, hogy ezt az értéket megszorozza a filament áramlási arányával, valamint ha be van állítva, az objektum áramlási arányával." +"A tényleges hézagkitöltési anyagáramlást úgy számítja ki, hogy ezt az értéket megszorozza a filament anyagáramlásával, valamint ha be van állítva, az objektum anyagáramlásával." msgid "Support flow ratio" -msgstr "Támasz áramlási aránya" +msgstr "Támasz anyagáramlása" msgid "" "This factor affects the amount of material for support.\n" @@ -13044,10 +13046,10 @@ msgid "" msgstr "" "Ez a tényező a támaszhoz felhasznált anyagmennyiséget befolyásolja.\n" "\n" -"A tényleges támaszáramlás úgy számolódik, hogy ezt az értéket megszorozza a filament áramlási arányával, valamint ha be van állítva, az objektum áramlási arányával." +"A támasz tényleges anyagáramlása ennek az értéknek, a filament anyagáramlásának, valamint – ha be van állítva – az objektum anyagáramlásának a szorzata." msgid "Support interface flow ratio" -msgstr "Támasz érintkező felület áramlási aránya" +msgstr "Támasz érintkező felületének anyagáramlása" msgid "" "This factor affects the amount of material for the support interface.\n" @@ -13056,13 +13058,13 @@ msgid "" msgstr "" "Ez a tényező a támasz érintkező felületéhez felhasznált anyagmennyiséget befolyásolja.\n" "\n" -"A tényleges támasz érintkező felületi áramlás úgy számolódik, hogy ezt az értéket megszorozza a filament áramlási arányával, valamint ha be van állítva, az objektum áramlási arányával." +"A támasz érintkező felületének tényleges anyagáramlása ennek az értéknek, a filament anyagáramlásának, valamint – ha be van állítva – az objektum anyagáramlásának a szorzata." msgid "Precise wall" msgstr "Pontos fal" msgid "Improve shell precision by adjusting outer wall spacing. This also improves layer consistency. NOTE: This option will be ignored for outer-inner or inner-outer-inner wall sequences." -msgstr "Javítja a héj pontosságát a külső fal távolságának finomhangolásával. Ez a rétegek egyenletességét is javítja. MEGJEGYZÉS: Ez az opció figyelmen kívül lesz hagyva külső-belső vagy belső-külső-belső fali sorrend esetén." +msgstr "A külső fal térközének finomhangolásával javítja a héj pontosságát és a rétegek egyenletességét. MEGJEGYZÉS: a szeletelő figyelmen kívül hagyja ezt a beállítást Külső/Belső vagy Belső/Külső/Belső falsorrendnél." msgid "Only one wall on top surfaces" msgstr "Csak egy fal a felső felületeken" @@ -13237,7 +13239,7 @@ msgid "This creates a gap between the innermost brim line and the object and can msgstr "A legbelső peremvonal és a tárgy közötti rés, ami megkönnyítheti a perem eltávolítását" msgid "Brim flow ratio" -msgstr "Perem áramlási arány" +msgstr "Perem anyagáramlása" msgid "" "This factor affects the amount of material for brims.\n" @@ -13246,11 +13248,11 @@ msgid "" "\n" "Note: The resulting value will not be affected by the first-layer flow ratio." msgstr "" -"Ez a tényező befolyásolja a karimák anyagának mennyiségét.\n" +"Ez a tényező befolyásolja a peremek anyagmennyiségét.\n" "\n" -"A ténylegesen használt peremáramlást úgy számítjuk ki, hogy ezt az értéket megszorozzuk a filament áramlási arányával, és ha be van állítva, akkor az objektum áramlási arányával.\n" +"A perem tényleges anyagáramlása ennek az értéknek, a filament anyagáramlásának, valamint – ha be van állítva – az objektum anyagáramlásának a szorzata.\n" "\n" -"Megjegyzés: A kapott értéket nem befolyásolja az első réteg áramlási aránya." +"Megjegyzés: A kapott értéket nem befolyásolja az első réteg anyagáramlása." msgid "Brim follows compensated outline" msgstr "A Perem a kompenzált körvonalat követi" @@ -13261,8 +13263,8 @@ msgid "" "\n" "If your current setup already works well, enabling it may be unnecessary and can cause the brim to fuse with upper layers." msgstr "" -"Ha engedélyezve van, a perem igazodik az első réteg kerületi geometriájához az elefánttalp-kompenzáció alkalmazása után.\n" -"Ez az opció arra az esetre szolgál, amikor az elefánttalp-kompenzáció jelentősen megváltoztatja az első réteg alapterületét.\n" +"Ha engedélyezve van, a perem igazodik az első réteg kerületi geometriájához az elefántláb-kompenzáció alkalmazása után.\n" +"Ez az opció akkor hasznos, ha az elefántláb-kompenzáció jelentősen megváltoztatja az első réteg alapterületét.\n" "\n" "Ha a jelenlegi beállítás már jól működik, előfordulhat, hogy az engedélyezése felesleges és a perem összeolvadását okozhatja a felső rétegekkel." @@ -13273,7 +13275,7 @@ msgid "Combine multiple brims into one when they are close to each other. This c msgstr "Karimák egybevonása, ha azok közel vannak egymáshoz. Ez javíthatja a perem tapadását." msgid "Brim ears" -msgstr "Karimás fülek" +msgstr "Peremfülek" msgid "Only draw brim over the sharp edges of the model." msgstr "Csak a modell éles szélei fölé rajzoljon peremet." @@ -13424,7 +13426,7 @@ msgid "No cooling for the first" msgstr "Nincs hűtés az első" msgid "Turn off all cooling fans for the first few layers. This can be used to improve build plate adhesion." -msgstr "Kikapcsolja a hűtést a megadott első pár rétegnél. A hűtés kikapcsolása segítheti a jobb tárgyasztalhoz való tapadást" +msgstr "Kikapcsolja a hűtést a megadott első néhány rétegnél. A hűtés kikapcsolása javíthatja az asztalhoz való tapadást" msgid "Don't support bridges" msgstr "Ne támassza alá az áthidalásokat" @@ -13483,7 +13485,7 @@ msgstr "" "Lehetőségek:\n" "1. Letiltva - nem hoz létre második hídréteget. Ez az alapértelmezett és kompatibilitási okokból így van beállítva\n" "2. Csak külső híd - csak a kifelé néző hidaknál hoz létre második hídréteget. A beállított kerületszámnál rövidebb vagy keskenyebb kis hidak kimaradnak, mert nem profitálnának a második hídrétegből. Ha létrejön, a második hídréteg az első hídréteggel párhuzamosan kerül extrudálásra a híd megerősítése érdekében\n" -"3. Csak belső híd - csak a ritka kitöltés feletti belső hidaknál hoz létre második hídréteget. Vedd figyelembe, hogy a belső hidak beleszámítanak a modell felső héjrétegeinek számába. A második belső hídréteg lehetőség szerint az elsőre merőlegesen kerül extrudálásra. Ha ugyanazon a szigeten több eltérő hídszögű régió van, akkor a sziget utolsó régiója lesz a szögreferencia\n" +"3. Csak belső híd - csak a kitöltés feletti belső hidaknál hoz létre második hídréteget. Vedd figyelembe, hogy a belső hidak beleszámítanak a modell felső héjrétegeinek számába. A második belső hídréteget lehetőség szerint az elsőre merőlegesen extrudálja. Ha ugyanazon a szigeten több eltérő hídszögű régió van, akkor a sziget utolsó régiója lesz a szögreferencia\n" "4. Alkalmazás mindenre - második hídréteget hoz létre mind a belső, mind a kifelé néző hidakhoz\n" msgid "External bridge only" @@ -13508,8 +13510,8 @@ msgid "" "3. No filtering - creates internal bridges on every potential internal overhang. This option is useful for heavily slanted top surface models; however, in most cases, it creates too many unnecessary bridges." msgstr "" "Ez az opció segíthet csökkenteni a felső felületek párnásodását erősen lejtős vagy ívelt modelleknél.\n" -"Alapértelmezés szerint a kis belső hidak kiszűrésre kerülnek, és a belső tömör kitöltés közvetlenül a ritka kitöltés fölé nyomtatódik. Ez a legtöbb esetben jól működik, felgyorsítja a nyomtatást anélkül, hogy túl nagy kompromisszumot kellene kötni a felső felület minőségében.\n" -"Erősen lejtős vagy ívelt modelleknél azonban, különösen túl alacsony ritka kitöltési sűrűség esetén, ez a támasz nélküli tömör kitöltés felkunkorodását okozhatja, ami párnásodáshoz vezet.\n" +"Alapértelmezés szerint a szeletelő kiszűri a kis belső hidakat, és a belső tömör kitöltést közvetlenül a kitöltés fölé nyomtatja. Ez a legtöbb esetben jól működik, és úgy gyorsítja fel a nyomtatást, hogy közben alig rontja a felső felület minőségét.\n" +"Erősen lejtős vagy ívelt modelleknél azonban, különösen túl alacsony kitöltési sűrűség esetén, ez a támasz nélküli tömör kitöltés felkunkorodását okozhatja, ami párnásodáshoz vezet.\n" "A korlátozott szűrés vagy a szűrés kikapcsolása belső hídréteget nyomtat a kissé alátámasztatlan belső tömör kitöltés fölé. Az alábbi opciók a szűrés érzékenységét szabályozzák, azaz azt, hogy hol jöjjenek létre belső hidak:\n" "1. Szűrés - engedélyezi ezt az opciót. Ez az alapértelmezett működés, és a legtöbb esetben jól működik\n" "2. Korlátozott szűrés - erősen lejtős felületeken hoz létre belső hidakat, miközben elkerüli a felesleges hidakat. Ez a legtöbb nehéz modellnél jól működik\n" @@ -13670,7 +13672,7 @@ msgid "" "WARNING: Lowering this value may negatively affect bed adhesion." msgstr "" "Az alsó felületi réteg sűrűsége. Esztétikai vagy funkcionális célokra szolgál, nem pedig olyan problémák javítására, mint a túlextrudálás.\n" -"FIGYELMEZTETÉS: Ennek az értéknek a csökkentése kedvezőtlenül befolyásolhatja a tárgyasztalhoz való tapadást." +"FIGYELMEZTETÉS: Ennek az értéknek a csökkentése ronthatja az asztalhoz való tapadást." # AI Translated msgid "Top surface fill order" @@ -13869,7 +13871,7 @@ msgid "" msgstr "" "Az anyag térfogata megváltozhat az olvadt és a kristályos állapot közötti átmenet során. Ez a beállítás arányosan megváltoztatja ennek a filamentnek az összes extrudálási áramlását a G-kódban. Az ajánlott értéktartomány 0,95 és 1,05 között van. Ennek az értéknek a finomhangolásával szép sík felület érhető el enyhe túl- vagy alulextrudálás esetén.\n" "\n" -"Az objektum végső áramlási aránya ennek az értéknek és a filament áramlási arányának a szorzata." +"Az objektum végső anyagáramlása ennek az értéknek és a filament anyagáramlásának a szorzata." msgid "Enable pressure advance" msgstr "Nyomáselőtolás engedélyezése" @@ -13967,7 +13969,7 @@ msgid "Keep fan always on" msgstr "Ventilátor mindig bekapcsolva" msgid "Enabling this setting means that part cooling fan will never stop entirely and will instead run at least at minimum speed to reduce the frequency of starting and stopping." -msgstr "Ezen beállítás engedélyezése esetén a tárgyhűtő ventilátor soha nem áll le, és legalább a minimális fordulatszámon fog járni, hogy csökkentse az indítás és leállítás gyakoriságát" +msgstr "Ezen beállítás engedélyezése esetén a tárgyhűtő ventilátor soha nem áll le és legalább a minimális fordulatszámon fog járni, hogy csökkentse az indítás és leállítás gyakoriságát" msgid "Don't slow down outer walls" msgstr "Lassítás nélküli külső falak" @@ -14028,7 +14030,7 @@ msgstr "Automatikus egyeztetéshez" # AI Translated msgid "Nozzle Manual" -msgstr "Fúvóka kézikönyv" +msgstr "Kézi fúvókakiosztás" msgid "Flush temperature" msgstr "Öblítési hőmérséklet" @@ -14071,7 +14073,7 @@ msgid "Bed temperature type" msgstr "Asztalhőmérséklet típusa" msgid "This option determines how the bed temperature is set during slicing: based on the temperature of the first filament or the highest temperature of the printed filaments." -msgstr "Ez az opció határozza meg, hogyan kerüljön beállításra az asztalhőmérséklet a szeletelés során: az első filament hőmérséklete vagy a nyomtatott filamentek közül a legmagasabb hőmérséklet alapján." +msgstr "Ez az opció határozza meg, hogyan állítsa be az asztalhőmérsékletet szeleteléskor: az első filament hőmérséklete vagy a nyomtatott filamentek legmagasabb hőmérséklete alapján." msgid "By First filament" msgstr "Az első filament alapján" @@ -14162,16 +14164,16 @@ msgid "Speed used for unloading the tip of the filament immediately after rammin msgstr "A filament kiürítésének sebessége közvetlenül a tömörítés után." msgid "Delay after unloading" -msgstr "Várakozás a kiürítés után" +msgstr "Várakozás a filament kihúzása után" msgid "Time to wait after the filament is unloaded. May help to get reliable tool changes with flexible materials that may need more time to shrink to original dimensions." -msgstr "A várakozási idő az filament kiürítése után. Segíthet megbízható szerszámcserét elérni rugalmas anyagok esetén, amelyeknek több időre lehet szükségük ahhoz, hogy az eredeti méretükre zsugorodjanak." +msgstr "Várakozási idő a filament kihúzása után. Rugalmas anyagoknál megbízhatóbbá teheti a szerszámcserét, mert ezeknek több időre lehet szükségük, hogy visszanyerjék eredeti méretüket." msgid "Number of cooling moves" msgstr "Hűtési lépések száma" msgid "Filament is cooled by being moved back and forth in the cooling tubes. Specify desired number of these moves." -msgstr "A filament hűtése úgy történik, hogy oda-vissza mozgatják a hűtőcsőben. Adja meg a kívánt lépések számát." +msgstr "A filament azáltal hűl le, hogy a hűtőcsövekben oda-vissza mozog. Add meg ezeknek a mozgásoknak a kívánt számát." msgid "Stamping loading speed" msgstr "Bélyegző betöltési sebesség" @@ -14192,7 +14194,7 @@ msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "A hűtési lépések fokozatosan felgyorsulnak ettől a sebességtől kezdve." msgid "Minimal purge on wipe tower" -msgstr "Minimális kiürítés a törlőtoronyban" +msgstr "Minimális öblítés a törlőtoronyban" msgid "After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and the filament pressure is likely not yet stable. Before purging the print head into an infill or a sacrificial object, Orca Slicer will always prime this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably." msgstr "Szerszámváltás után az újonnan betöltött filament pontos helyzete a fúvókában nem feltétlenül ismert, és a filament nyomása valószínűleg még nem stabil. Mielőtt a nyomtatófej egy kitöltésbe vagy áldozati objektumba ürítene, az Orca Slicer ezt az anyagmennyiséget mindig először a törlőtoronyba extrudálja, hogy a későbbi kitöltési vagy áldozati objektum extrudálások megbízhatóan történjenek." @@ -14201,7 +14203,7 @@ msgid "Wipe tower cooling" msgstr "Törlőtorony hűtése" msgid "Temperature drop before entering filament tower" -msgstr "Hőmérsékletcsökkenés az filamenttoronyba lépés előtt" +msgstr "Hőmérsékletcsökkenés a filamenttoronyba lépés előtt" msgid "Interface layer pre-extrusion distance" msgstr "Érintkezőréteg előextrudálási távolsága" @@ -14225,7 +14227,7 @@ msgid "mm²" msgstr "mm²" msgid "Interface layer purge length" -msgstr "Érintkezőréteg kiürítési hossza" +msgstr "Érintkezőréteg öblítési hossza" msgid "Purge length for prime tower interface layer (where different materials meet)." msgstr "Kiürítési hossz a törlőtorony érintkezőrétegéhez (ahol a különböző anyagok találkoznak)." @@ -14246,7 +14248,7 @@ msgid "Ramming parameters" msgstr "Tömörítési paraméterek" msgid "This string is edited by RammingDialog and contains ramming specific parameters." -msgstr "Ez a karakterlánc a TömörítésPárbeszéd ablakban szerkeszthető, és a tömörítéssel kapcsolatos paramétereket tartalmaz." +msgstr "Ez a karakterlánc a tömörítési párbeszédablakban szerkeszthető, és a tömörítés paramétereit tartalmazza." msgid "Enable ramming for multi-tool setups" msgstr "Tömörítés engedélyezése több szerszámos beállításokhoz" @@ -14270,7 +14272,7 @@ msgid "Density" msgstr "Sűrűség" msgid "Filament density, for statistical purposes only." -msgstr "Filament sűrűsége. Csak statisztikákhoz kerül felhasználásra" +msgstr "A filament sűrűsége, kizárólag statisztikai célokra." msgid "g/cm³" msgstr "g/cm³" @@ -14294,7 +14296,7 @@ msgid "Support material" msgstr "Támaszanyag" msgid "Support material is commonly used to print supports and support interfaces." -msgstr "A támaszanyag a támaszok és a támasz érintkező felületeinek nyomtatásához van használva." +msgstr "A támaszanyagot általában a támaszok és azok érintkező felületeinek nyomtatására használják." msgid "Filament printable" msgstr "Filament nyomtatható" @@ -14320,7 +14322,7 @@ msgid "Price" msgstr "Költség" msgid "Filament price, for statistical purposes only." -msgstr "Filament költsége. Csak statisztikákhoz kerül felhasználásra" +msgstr "A filament ára, kizárólag statisztikai célokra." msgid "money/kg" msgstr "pénz/kg" @@ -14335,10 +14337,10 @@ msgid "(Undefined)" msgstr "(Nincs meghatározva)" msgid "Sparse infill direction" -msgstr "Ritka kitöltés iránya" +msgstr "Kitöltés iránya" msgid "This is the angle for sparse infill pattern, which controls the start or main direction of lines." -msgstr "A ritkás kitöltési minta szöge, amely a vonal kezdő- vagy fő irányát szabályozza" +msgstr "A kitöltési minta szöge, amely a vonal kezdő- vagy fő irányát szabályozza" msgid "Solid infill direction" msgstr "Tömör kitöltés iránya" @@ -14375,7 +14377,7 @@ msgstr "Kitöltés sűrűsége" #, no-c-format, no-boost-format msgid "Density of internal sparse infill, 100% turns all sparse infill into solid infill and internal solid infill pattern will be used." -msgstr "A belső ritka kitöltés sűrűsége. A 100% minden ritka kitöltést tömör kitöltéssé alakít, és a belső tömör kitöltési minta kerül használatra." +msgstr "A belső kitöltés sűrűsége. 100%-os értéknél minden kitöltés tömör kitöltéssé alakul, a szeletelő pedig a belső tömör kitöltési mintát használja." # AI Translated msgid "Align directions to model" @@ -14407,13 +14409,13 @@ msgstr "Z-kihajlási torzítás optimalizálása (kísérleti)" # AI Translated #, no-c-format, no-boost-format msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid." -msgstr "Alacsony feltöltési sűrűség mellett megfeszíti a gyroid hullámot a Z (függőleges) tengely mentén, hogy lerövidítse a tényleges függőleges oszlophosszt és javítsa a Z-tengely összenyomódási kihajlási ellenállását. A filamenthasználat megmarad. Nincs hatása ~30% vagy annál nagyobb ritka kitöltési sűrűségnél. Csak akkor érvényes, ha a Ritka kitöltési minta Gyroid-ra van állítva." +msgstr "Alacsony kitöltési sűrűségnél megfeszíti a Gyroid hullámot a Z (függőleges) tengely mentén, hogy lerövidítse a tényleges függőleges oszlophosszt, és javítsa a Z irányú kihajlással szembeni ellenállást. A filamentfelhasználás nem változik. Körülbelül 30%-os vagy nagyobb kitöltési sűrűségnél nincs hatása. Csak akkor érvényes, ha a kitöltési minta Gyroid." msgid "Sparse infill pattern" msgstr "Kitöltési mintázat" msgid "This is the line pattern for internal sparse infill." -msgstr "Ez a belső ritkás kitöltés mintája." +msgstr "A belső kitöltés mintázata." msgid "Zig Zag" msgstr "Cikkcakk" @@ -14483,13 +14485,13 @@ msgid "Acceleration of inner walls." msgstr "A belső falak gyorsulása." msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration." -msgstr "Gyorsulás a ritkás kitöltéseknél. Ha az érték százalékban van megadva (pl. 100%), akkor az alapértelmezett gyorsulás alapján kerül kiszámításra." +msgstr "A kitöltés gyorsulása. Ha százalékban adod meg (pl. 100%), a szeletelő az alapértelmezett gyorsulásból számítja ki." msgid "Acceleration of internal solid infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration." msgstr "A belső tömör kitöltés gyorsulása. Ha az érték százalékban van megadva (pl. 100%), az alapértelmezett gyorsulás alapján lesz kiszámítva." msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion." -msgstr "A kezdőréteg gyorsulása. Alacsonyabb érték használata javíthatja a tárgyasztalhoz való tapadást" +msgstr "A kezdőréteg gyorsulása. Alacsonyabb érték használata javíthatja az asztalhoz való tapadást" msgid "Enable accel_to_decel" msgstr "accel_to_decel engedélyezése" @@ -14502,7 +14504,7 @@ msgstr "accel_to_decel" #, c-format, boost-format msgid "Klipper's max_accel_to_decel will be adjusted to this %% of acceleration." -msgstr "A Klipper max_accel_to_decel értéke a gyorsulás erre a százalékra lesz állítva." +msgstr "A Klipper max_accel_to_decel értékét a gyorsulás ezen %%-ára állítja." msgid "Default jerk." msgstr "Alapértelmezett jerk." @@ -14677,25 +14679,25 @@ msgid "All walls" msgstr "Összes fal" msgid "Fuzzy skin thickness" -msgstr "A bolyhos felület vastagsága" +msgstr "A barázdált felület vastagsága" msgid "The width of jittering: it’s recommended to keep this lower than the outer wall line width." msgstr "A rezgés szélessége: ezt ajánlott kisebbre állítani, mint a külső fal szélessége." msgid "Fuzzy skin point distance" -msgstr "A bolyhos felület ponttávolsága" +msgstr "A barázdált felület ponttávolsága" msgid "The average distance between the random points introduced on each line segment." msgstr "Az egyes vonalszakaszokon használt véletlen pontok közötti átlagos távolság" msgid "Apply fuzzy skin to first layer" -msgstr "Bolyhos felület alkalmazása az első rétegre" +msgstr "Barázdált felület alkalmazása az első rétegre" msgid "Whether to apply fuzzy skin on the first layer." -msgstr "Alkalmazzon-e bolyhos felületet az első rétegen." +msgstr "Meghatározza, hogy legyen-e barázdált felület az első rétegen." msgid "Fuzzy skin generator mode" -msgstr "A bolyhos felület generálási módja" +msgstr "A barázdált felület generálási módja" #, c-format, boost-format msgid "" @@ -14706,12 +14708,12 @@ msgid "" "\n" "Attention! The [Extrusion] and [Combined] modes works only the fuzzy_skin_thickness parameter not more than the thickness of printed loop. At the same time, the width of the extrusion for a particular layer should also not be below a certain level. It is usually equal 15-25%% of a layer height. Therefore, the maximum fuzzy skin thickness with a perimeter width of 0.4 mm and a layer height of 0.2 mm will be 0.4-(0.2*0.25)=±0.35mm! If you enter a higher parameter than this, the error Flow::spacing() will displayed, and the model will not be sliced. You can choose this number until this error is repeated." msgstr "" -"Bolyhos felület generálási mód. Csak az Arachne-nal működik!\n" +"A barázdált felület generálási módja. Csak az Arachne használatával működik!\n" "Eltolás: Klasszikus mód, amikor a mintázat úgy jön létre, hogy a fúvóka oldalirányban eltér az eredeti útvonaltól.\n" "Extrudálás: Olyan mód, amikor a mintázatot az extrudált műanyag mennyisége alakítja ki. Ez egy gyors és egyenes algoritmus, felesleges fúvókarázás nélkül, amely sima mintázatot ad. Ugyanakkor inkább a teljes felületen lazább falak kialakítására hasznos.\n" "Kombinált: Egyesített mód [Eltolás] + [Extrudálás]. A falak megjelenése hasonló az [Eltolás] módhoz, de nem hagy pórusokat a kerületek között.\n" "\n" -"Figyelem! Az [Extrudálás] és a [Kombinált] mód csak akkor működik, ha a fuzzy_skin_thickness paraméter nem nagyobb a nyomtatott hurok vastagságánál. Emellett egy adott réteg extrudálási szélessége sem lehet egy bizonyos szint alá csökkentve. Ez általában a rétegmagasság 15-25%%-a. Ezért 0,4 mm kerületszélesség és 0,2 mm rétegmagasság mellett a maximális bolyhos felület vastagság 0,4-(0,2*0,25)=±0,35 mm lesz. Ha ennél nagyobb értéket adsz meg, a Flow::spacing() hiba jelenik meg, és a modell nem lesz szeletelhető. Ezt az értéket addig választhatod, amíg ez a hiba meg nem ismétlődik." +"Figyelem! Az [Extrudálás] és a [Kombinált] mód csak akkor működik, ha a fuzzy_skin_thickness paraméter nem nagyobb a nyomtatott hurok vastagságánál. Emellett egy adott réteg extrudálási szélessége sem lehet egy bizonyos szint alá csökkentve. Ez általában a rétegmagasság 15-25%%-a. Ezért 0,4 mm kerületszélesség és 0,2 mm rétegmagasság mellett a barázdált felület maximális vastagsága 0,4-(0,2*0,25)=±0,35 mm lesz. Ha ennél nagyobb értéket adsz meg, a Flow::spacing() hiba jelenik meg, és a modell nem lesz szeletelhető. Ezt az értéket addig választhatod, amíg ez a hiba meg nem ismétlődik." msgid "Displacement" msgstr "Eltolás" @@ -14723,7 +14725,7 @@ msgid "Combined" msgstr "Kombinált" msgid "Fuzzy skin noise type" -msgstr "A bolyhos felület zajtípusa" +msgstr "A barázdált felület zajtípusa" msgid "" "Noise type to use for fuzzy skin generation:\n" @@ -14734,7 +14736,7 @@ msgid "" "Voronoi: Divides the surface into voronoi cells, and displaces each one by a random amount. Creates a patchwork texture.\n" "Ripple: Uniform ripple pattern that ripples left and right of the original path. Repeating pattern, woven appearance." msgstr "" -"A bolyhos felület generálására használható zajtípus:\n" +"A barázdált felület generálására használható zajtípus:\n" "Klasszikus: Klasszikus egységes véletlenszerű zaj.\n" "Perlin: Perlin zaj, amely egyenletesebb textúrát ad.\n" "Billow: Hasonló a perlin zajhoz, de csomósabb.\n" @@ -14761,19 +14763,19 @@ msgid "Ripple" msgstr "Fodrozódás" msgid "Fuzzy skin feature size" -msgstr "A bolyhos felület mintázatmérete" +msgstr "A barázdált felület mintázatmérete" msgid "The base size of the coherent noise features, in mm. Higher values will result in larger features." msgstr "Az összefüggő zajmintázat jellemzőinek alapmérete mm-ben. A nagyobb értékek nagyobb mintázatelemeket eredményeznek." msgid "Fuzzy Skin Noise Octaves" -msgstr "A bolyhos felület zajának oktávjai" +msgstr "A barázdált felület zajának oktávjai" msgid "The number of octaves of coherent noise to use. Higher values increase the detail of the noise, but also increase computation time." msgstr "A használt összefüggő zaj oktávjainak száma. A nagyobb értékek részletesebb zajt eredményeznek, de növelik a számítási időt is." msgid "Fuzzy skin noise persistence" -msgstr "A bolyhos felület zajának perzisztenciája" +msgstr "A barázdált felület zajának perzisztenciája" msgid "The decay rate for higher octaves of the coherent noise. Lower values will result in smoother noise." msgstr "Az összefüggő zaj magasabb oktávjainak lecsengési aránya. Az alacsonyabb értékek simább zajt eredményeznek." @@ -14782,7 +14784,7 @@ msgid "Number of ripples per layer" msgstr "A fodrozódások száma rétegenként" msgid "Controls how many full cycles of ripples will be added per layer." -msgstr "Azt szabályozza, hogy hány teljes ciklus hullámzás kerüljön hozzáadásra rétegenként." +msgstr "A rétegenként hozzáadott teljes hullámciklusok számát szabályozza." msgid "Ripple offset" msgstr "Fodrozódás eltolás" @@ -14823,10 +14825,10 @@ msgid "Layers and Perimeters" msgstr "Rétegek és peremek" msgid "Don't print gap fill with a length is smaller than the threshold specified (in mm). This setting applies to top, bottom and solid infill and, if using the classic perimeter generator, to wall gap fill." -msgstr "Ne nyomtasson olyan réskitöltést, amelynek hossza kisebb a megadott küszöbértéknél (mm-ben). Ez a beállítás a felső, alsó és tömör kitöltésre vonatkozik, valamint klasszikus kerületgenerátor használata esetén a falréskitöltésre is." +msgstr "Nem nyomtat a megadott küszöbértéknél rövidebb hézagkitöltést. Ez a beállítás a felső, alsó és tömör kitöltésre, valamint klasszikus falgenerátornál a falak közötti hézagkitöltésre vonatkozik." msgid "This is the speed for gap infill. Gaps usually have irregular line width and should be printed more slowly." -msgstr "A hézagkitöltés nyomtatási sebessége. A rés általában szabálytalan vonalszélességű, és lassabban kell nyomtatni" +msgstr "A hézagkitöltés nyomtatási sebessége. A hézagok vonalszélessége általában szabálytalan, ezért lassabban kell nyomtatni őket" msgid "Precise Z height" msgstr "Pontos Z-magasság" @@ -14913,7 +14915,7 @@ msgid "Best object position" msgstr "Legjobb tárgypozíció" msgid "Best auto arranging position in range [0,1] w.r.t. bed shape." -msgstr "A legjobb automatikus elrendezés tartománya [0,1] a tárgyasztal alakja szerint." +msgstr "A legjobb automatikus elrendezés tartománya [0,1] az asztal alakja szerint." msgid "Enable this option if machine has auxiliary part cooling fan. G-code command: M106 P2 S(0-255)." msgstr "Engedélyezd ezt az opciót, ha a gép rendelkezik kiegészítő tárgyhűtő ventilátorral. G-kód parancs: M106 P2 S(0-255)." @@ -14960,7 +14962,7 @@ msgstr "" "A kikapcsoláshoz állítsd 0-ra." msgid "Minimum non-zero part cooling fan speed" -msgstr "Minimális nem nulla rész-hűtőventilátor fordulatszáma" +msgstr "A tárgyhűtő ventilátor minimális nem nulla fordulatszáma" msgid "" "Some part-cooling fans cannot start spinning when commanded below a certain PWM duty cycle. When set above 0, any non-zero part-cooling fan command will be raised to at least this percentage so the fan reliably starts. A fan command of 0 (fan off) is always honoured exactly. This clamp is applied after every other fan calculation (first-layer ramp, layer-time interpolation, overhang/bridge/support-interface/ironing overrides), so scaling still operates within the range [this value, 100%].\n" @@ -15007,7 +15009,7 @@ msgid "Enable this if printer support cooling filter" msgstr "Engedélyezd a beállítást, ha a nyomtató támogatja a hűtőszűrőt" msgid "G-code flavor" -msgstr "G-kód változat" +msgstr "G-kód-változat" msgid "What kind of G-code the printer is compatible with." msgstr "Milyen G-kóddal kompatibilis a nyomtató." @@ -15049,7 +15051,7 @@ msgid "Infill combination" msgstr "Kitöltés összevonása" msgid "Automatically combine sparse infill of several layers to print together in order to reduce time. Walls are still printed with original layer height." -msgstr "Több réteg ritkás kitöltésének automatikus kombinálása a nyomtatási idő csökkentése érdekében. A fal továbbra is az eredeti rétegmagassággal kerül kinyomtatásra." +msgstr "Több réteg kitöltésének automatikus összevonása a nyomtatási idő csökkentéséhez. A falat továbbra is az eredeti rétegmagassággal nyomtatja." msgid "Infill shift step" msgstr "Kitöltés eltolási lépése" @@ -15058,10 +15060,10 @@ msgid "This parameter adds a slight displacement to each layer of infill to crea msgstr "Ez a paraméter enyhe eltolást ad a kitöltéshez minden rétegen, hogy keresztmintás textúra jöjjön létre." msgid "Sparse infill rotation template" -msgstr "Ritka kitöltés forgatási sablonja" +msgstr "Kitöltés forgatási sablonja" msgid "Rotate the sparse infill direction per layer using a template of angles. Enter comma-separated degrees (e.g., '0,30,60,90'). Angles are applied in order by layer and repeat when the list ends. Advanced syntax is supported: '+5' rotates +5° every layer; '+5#5' rotates +5° every 5 layers. See the Wiki for details. When a template is set, the standard infill direction setting is ignored. Note: some infill patterns (e.g., Gyroid) control rotation themselves; use with care." -msgstr "A ritka kitöltés irányát rétegenként forgatja egy szögsablon alapján. Adj meg vesszővel elválasztott fokértékeket (pl. '0,30,60,90'). A szögek rétegenként sorban lesznek alkalmazva, majd a lista végén ismétlődnek. Támogatott a haladó szintaxis is: a '+5' minden rétegen +5°-kal forgat; a '+5#5' minden 5 rétegenként +5°-kal forgat. A részletekért lásd a Wikit. Ha sablon van megadva, a normál kitöltési irány beállítás figyelmen kívül marad. Megjegyzés: egyes kitöltési minták (pl. Gyroid) saját maguk kezelik a forgatást; körültekintően használd." +msgstr "A kitöltés irányát rétegenként forgatja egy szögsablon alapján. Adj meg vesszővel elválasztott fokértékeket (pl. '0,30,60,90'). A szögeket rétegenként, sorban alkalmazza, majd a lista végén elölről kezdi. A haladó szintaxis is használható: a '+5' minden rétegen +5°-kal forgat; a '+5#5' minden 5 rétegenként +5°-kal forgat. A részletekért lásd a Wikit. Ha megadsz egy sablont, a normál kitöltési irány beállítását figyelmen kívül hagyja. Megjegyzés: egyes kitöltési minták (pl. Gyroid) maguk kezelik a forgatást; körültekintően használd." msgid "Solid infill rotation template" msgstr "Tömör kitöltés forgatási sablonja" @@ -15073,13 +15075,13 @@ msgid "Skeleton infill density" msgstr "Vázkitöltés sűrűsége" msgid "The remaining part of the model contour after removing a certain depth from the surface is called the skeleton. This parameter is used to adjust the density of this section. When two regions have the same sparse infill settings but different skeleton densities, their skeleton areas will develop overlapping sections. Default is as same as infill density." -msgstr "A modell körvonalának a felületről egy bizonyos mélység eltávolítása után megmaradó részét vázként értelmezzük. Ez a paraméter ennek a résznek a sűrűségét szabályozza. Ha két régió ugyanazzal a ritka kitöltési beállítással, de eltérő vázsűrűséggel rendelkezik, a vázterületeik átfedésbe kerülnek. Alapértelmezés szerint megegyezik a kitöltési sűrűséggel." +msgstr "A modell körvonalának a felületről egy bizonyos mélység eltávolítása után megmaradó részét váznak nevezzük. Ez a paraméter ennek a résznek a sűrűségét szabályozza. Ha két régió kitöltési beállítása azonos, de a vázsűrűségük eltér, a vázterületeik átfedik egymást. Alapértelmezés szerint megegyezik a kitöltési sűrűséggel." msgid "Skin infill density" msgstr "Felületi kitöltés sűrűsége" msgid "The portion of the model's outer surface within a certain depth range is called the skin. This parameter is used to adjust the density of this section. When two regions have the same sparse infill settings but different skin densities, this area will not be split into two separate regions. Default is as same as infill density." -msgstr "A modell külső felületének egy adott mélységtartományba eső részét felületi rétegnek nevezzük. Ez a paraméter ennek a szakasznak a sűrűségét szabályozza. Ha két régió ugyanazzal a ritka kitöltési beállítással, de eltérő felületi réteg-sűrűséggel rendelkezik, ez a terület nem lesz két külön régióra bontva. Alapértelmezés szerint megegyezik a kitöltési sűrűséggel." +msgstr "A modell külső felületének egy adott mélységtartományba eső részét felületi rétegnek nevezzük. Ez a paraméter ennek a résznek a sűrűségét szabályozza. Ha két régió kitöltési beállítása azonos, de a felületi rétegük sűrűsége eltér, ez a terület nem válik két külön régióra. Alapértelmezés szerint megegyezik a kitöltési sűrűséggel." msgid "Skin infill depth" msgstr "Felületi kitöltés mélysége" @@ -15123,9 +15125,9 @@ msgid "" "\n" "Use either absolute mm values (eg. 0.32mm for a 0.4mm nozzle) or % values (eg 80%). This value must not be larger than the nozzle diameter." msgstr "" -"A kombinált ritka kitöltés maximális rétegmagassága.\n" +"A kombinált kitöltés maximális rétegmagassága.\n" "\n" -"Állítsd 0-ra vagy 100%-ra a fúvókaátmérő használatához (a nyomtatási idő maximális csökkentéséhez), vagy kb. 80%-ra a ritka kitöltés szilárdságának maximalizálásához.\n" +"Állítsd 0-ra vagy 100%-ra a fúvókaátmérő használatához (a nyomtatási idő lehető legnagyobb csökkentéséhez), vagy kb. 80%-ra a kitöltés szilárdságának maximalizálásához.\n" "\n" "Az a rétegszám, amelyen a kitöltés összevonásra kerül, úgy számolódik, hogy ezt az értéket elosztja a rétegmagassággal, majd lefelé kerekíti a legközelebbi egészre.\n" "\n" @@ -15193,7 +15195,7 @@ msgid "Maximum straightening angle used to simplify Lightning branches." msgstr "A Villám ágak egyszerűsítéséhez használt maximális kiegyenesítési szög." msgid "Sparse infill anchor length" -msgstr "Ritka kitöltés horgonyhossza" +msgstr "Kitöltés horgonyhossza" msgid "" "Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n" @@ -15230,24 +15232,24 @@ msgstr "" "Az \"Alapértelmezett\" az aktív objektum/tárgy filamentjét használja." msgid "Line width of internal sparse infill. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "A belső ritka kitöltés vonalszélessége. Ha százalékban van megadva, a fúvókaátmérő alapján lesz kiszámítva." +msgstr "A belső kitöltés vonalszélessége. Ha százalékban adod meg, a szeletelő a fúvókaátmérőből számítja ki." msgid "Infill/wall overlap" msgstr "Kitöltés/fal átfedés" #, no-c-format, no-boost-format msgid "This allows the infill area to be enlarged slightly to overlap with walls for better bonding. The percentage value is relative to line width of sparse infill. Set this value to ~10-15% to minimize potential over extrusion and accumulation of material resulting in rough top surfaces." -msgstr "A kitöltési terület kissé megnagyobbodik, hogy átfedésbe kerüljön a fallal a jobb kötés érdekében. A százalékos érték a ritka kitöltés vonalszélességéhez viszonyított. Állítsd ezt az értéket kb. 10-15%-ra a lehetséges túlextrudálás és az anyagfelhalmozódás minimalizálásához, amely érdes felső felületeket eredményezhet." +msgstr "A jobb kötés érdekében kissé megnöveli a kitöltési területet, hogy az átfedje a falat. A százalékos érték a kitöltés vonalszélességéhez viszonyított. Körülbelül 10-15%-os értékkel csökkenthető a túlextrudálás és az érdes felső felületet okozó anyagfelhalmozódás." msgid "Top/Bottom solid infill/wall overlap" msgstr "Felső/alsó tömör kitöltés és fal átfedése" #, no-c-format, no-boost-format msgid "Top solid infill area is enlarged slightly to overlap with wall for better bonding and to minimize the appearance of pinholes where the top infill meets the walls. A value of 25-30% is a good starting point, minimizing the appearance of pinholes. The percentage value is relative to line width of sparse infill." -msgstr "A felső tömör kitöltési terület kissé megnagyobbodik, hogy átfedésbe kerüljön a fallal a jobb kötés érdekében, és csökkentse a tűlyukszerű hibák megjelenését ott, ahol a felső kitöltés a falakkal találkozik. Jó kiindulási érték a 25-30%, amely segít minimalizálni a tűlyukak megjelenését. A százalékos érték a ritka kitöltés vonalszélességéhez viszonyított." +msgstr "A jobb kötés és a felső kitöltés falhoz csatlakozásánál megjelenő apró lyukak csökkentése érdekében kissé megnöveli a felső tömör kitöltés területét, hogy az átfedje a falat. Jó kiindulási érték a 25-30%. A százalékos érték a kitöltés vonalszélességéhez viszonyított." msgid "This is the speed for internal sparse infill." -msgstr "A belső ritkás kitöltés sebessége" +msgstr "A belső kitöltés sebessége" msgid "Inherits profile" msgstr "Örököli a profilt" @@ -15259,7 +15261,7 @@ msgid "Interface shells" msgstr "Érintkezőréteg-héjak" msgid "Force the generation of solid shells between adjacent materials/volumes. Useful for multi-extruder prints with translucent materials or manual soluble support material." -msgstr "Kikényszeríti a tömör héjak létrehozását a szomszédos anyagok/térfogatok között. Hasznos többextruderes nyomatoknál áttetsző anyagokkal vagy manuálisan oldható támaszanyag használatakor." +msgstr "Kikényszeríti a tömör héjak létrehozását a szomszédos anyagok vagy térfogatok között. Hasznos többextruderes nyomatoknál áttetsző anyagok, illetve kézzel létrehozott, oldható támaszok használatakor." msgid "Maximum width of a segmented region" msgstr "Szegmentált régió maximális szélessége" @@ -15362,7 +15364,7 @@ msgid "Ironing expansion" msgstr "Vasaló bővítés" msgid "Expand or contract the ironing area." -msgstr "A vasalási terület bővítése/szűkítése ." +msgstr "A vasalási terület bővítése vagy szűkítése." msgid "Z contouring enabled" msgstr "Z kontúrozás engedélyezve" @@ -15425,10 +15427,10 @@ msgstr "" "Ez az opció figyelmen kívül marad, ha a G-kód változat Klipperre van állítva." msgid "This G-code will be used as a code for the pause print. Users can insert pause G-code in the G-code viewer." -msgstr "Ez a G-kód lesz használva a nyomtatás szüneteltetéséhez. A felhasználók a szünet G-kódot a G-kódnézőben illeszthetik be." +msgstr "Ezt a G-kódot használja a nyomtatás szüneteltetéséhez. A szüneteltetési G-kódot a G-kódnézőben lehet beilleszteni." msgid "This G-code will be used as a custom code." -msgstr "Ezt a G-kód egyedi kódként lesz használva." +msgstr "Ezt a G-kódot egyedi kódként használja." msgid "Small area flow compensation (beta)" msgstr "Kis területű áramláskompenzáció (béta)" @@ -15467,7 +15469,7 @@ msgid "Maximum E speed" msgstr "Maximális E sebesség" msgid "Maximum acceleration X" -msgstr "Maximális sebesség X" +msgstr "Maximális gyorsulás X" msgid "Maximum acceleration Y" msgstr "Maximális gyorsulás Y" @@ -15623,8 +15625,8 @@ msgid "" "Disable turns off input shaping in the firmware." msgstr "" "Válaszd ki a rezgéskompenzáció algoritmust.\n" -"A Default a firmware alapértelmezett beállításait használja.\n" -"A letiltása kikapcsolja a rezgéskompenzációt a firmware-ben." +"Az Alapértelmezett a firmware alapértelmezett beállításait használja.\n" +"A Letiltás kikapcsolja a rezgéskompenzációt a firmware-ben." msgid "MZV" msgstr "MZV" @@ -15791,8 +15793,8 @@ msgid "" "Auxiliary fan speed will be ramped up linearly from layer \"For the first\" to maximum at layer \"Full fan speed at layer\".\n" "\"Full fan speed at layer\" will be ignored if lower than \"For the first\", in which case the fan will run at maximum allowed speed at layer \"For the first\" + 1." msgstr "" -"A segédventilátor sebessége lineárisan megemelkedik az \"Az első\" rétegtől a maximálisig a \"Teljes ventilátorsebesség\" rétegnél.\n" -"A rendszer figyelmen kívül hagyja a „teljes ventilátor fordulatszámot” ha alacsonyabb, mint „Az első”, ebben az esetben a ventilátor a maximális megengedett sebességgel fog működni „Az első” + 1 rétegben." +"A segédventilátor sebessége az „Az első” rétegtől lineárisan emelkedik, és a „Teljes ventilátor fordulatszám ennél a rétegnél” rétegnél éri el a maximumot.\n" +"Ha a „Teljes ventilátor fordulatszám ennél a rétegnél” értéke kisebb az „Az első” értékénél, a rendszer figyelmen kívül hagyja, és a ventilátor az „Az első” + 1. rétegen a megengedett maximális sebességgel működik." msgid "Special auxiliary cooling fan speed, effective only for the first x layers." msgstr "Speciális kiegészítő hűtőventilátor sebessége, csak az első x rétegeknél hatásos." @@ -15819,7 +15821,7 @@ msgid "Host Type" msgstr "Host típusa" msgid "Orca Slicer can upload G-code files to a printer host. This field must contain the kind of the host." -msgstr "A Orca Slicer képes G-kód fájlokat feltölteni a nyomtatóra. Ennek a mezőnek tartalmaznia kell a gazdagép típusát." +msgstr "Az Orca Slicer képes G-kód fájlokat feltölteni a nyomtatóra. Ennek a mezőnek a gazdagép típusát kell tartalmaznia." msgid "Nozzle volume" msgstr "Fúvóka térfogata" @@ -15855,7 +15857,7 @@ msgid "Extra loading distance" msgstr "Extra betöltési hossz" msgid "When set to zero, the distance the filament is moved from parking position during load is exactly the same as it was moved back during unload. When positive, it is loaded further, if negative, the loading move is shorter than unloading." -msgstr "Ha nullára van állítva, akkor a filamentet a betöltés során a parkolóhelyzetből pontosan ugyanannyira kerül előtolásra, mint amennyire a kiürítéskor vissza lett húzva. Ha pozitív, akkor tovább töltődik, ha negatív, akkor a betöltési mozgás rövidebb, mint a kiürítési." +msgstr "Nulla értéknél a filament betöltéskor pontosan akkora utat tesz meg a parkolóhelyzettől, amekkorát kiürítéskor visszahúzott. Pozitív értéknél tovább tölti be, negatív értéknél pedig a betöltési mozgás rövidebb a kiürítésinél." msgid "Start end points" msgstr "Kezdő- és végpontok" @@ -15960,7 +15962,7 @@ msgid "Change extrusion role G-code (process)" msgstr "Extrudálási szerepkör G-kód módosítása (folyamat)" msgid "This G-code is inserted when the extrusion role is changed. It runs after the machine and filament extrusion role G-code." -msgstr "Ez a G-kód akkor kerül beillesztésre, amikor az extrudálási szerep megváltozik. A gép és a filament extrudálási szerepkör G-kódja után fut." +msgstr "Az Orca Slicer az extrudálási szerep megváltozásakor illeszti be ezt a G-kódot. A gép és a filament extrudálási szerepéhez tartozó G-kód után fut le." # AI Translated msgid "Plugins Used" @@ -15993,7 +15995,7 @@ msgid "Raft contact Z distance" msgstr "Tutaj érintkezési Z-távolság" msgid "Z gap between raft and object. If Support Top Z Distance is 0, this value is ignored and the object is printed in direct contact with the raft (no gap)." -msgstr "Z rés a tutaj és a tárgy között. Ha a támasz felső Z-távolsága 0, ez az érték figyelmen kívül lesz hagyva és a tárgy közvetlenül a tutajon kerül nyomtatásra (rés nélkül)." +msgstr "Z-rés a tutaj és a tárgy között. Ha a támasz felső Z-távolsága 0, a szeletelő figyelmen kívül hagyja ezt az értéket, és a tárgyat közvetlenül a tutajra nyomtatja (rés nélkül)." msgid "Raft expansion" msgstr "Tutaj kibővítése" @@ -16011,7 +16013,7 @@ msgid "First layer expansion" msgstr "Első réteg kiterjesztése" msgid "This expands the first raft or support layer to improve bed adhesion." -msgstr "Az első tutaj- vagy támaszréteg kiterjesztése a tárgyasztalhoz való tapadás javítása érdekében." +msgstr "Az első tutaj- vagy támaszréteg kiterjesztése az asztalhoz való tapadás javítása érdekében." msgid "Raft layers" msgstr "Tutajrétegek" @@ -16063,7 +16065,7 @@ msgid "Long retraction when cut (beta)" msgstr "Hosszú visszahúzás vágáskor (béta)" msgid "Experimental feature: Retracting and cutting off the filament at a longer distance during changes to minimize purge. While this reduces flush significantly, it may also raise the risk of nozzle clogs or other printing problems." -msgstr "Kísérleti funkció: Filamentváltás közben nagyobb távolságról történő visszahúzás és vágás a kiürítés minimalizálása érdekében. Bár ez jelentősen csökkenti az öblítést, növelheti a fúvóka eltömődésének vagy más nyomtatási problémáknak a kockázatát." +msgstr "Kísérleti funkció: Filamentváltás közben nagyobb távolságról történő visszahúzás és vágás az öblítés minimalizálása érdekében. Bár ez jelentősen csökkenti az öblítést, növelheti a fúvóka eltömődésének vagy más nyomtatási problémáknak a kockázatát." msgid "Retraction distance when cut" msgstr "Visszahúzási távolság vágáskor" @@ -16227,7 +16229,7 @@ msgid "Back" msgstr "Hátul" msgid "Random" -msgstr "Véletlenszerû" +msgstr "Véletlenszerű" msgid "Staggered inner seams" msgstr "Eltolt belső varratok" @@ -16255,7 +16257,7 @@ msgid "Conditional scarf joint" msgstr "Feltételes átlapolt illesztés" msgid "Apply scarf joints only to smooth perimeters where traditional seams do not conceal the seams at sharp corners effectively." -msgstr "Átlapolt illesztést csak sima kerületeknél alkalmazzon, ahol a hagyományos varratok nem rejtik el hatékonyan a varratot az éles sarkoknál." +msgstr "Csak olyan sima kerületeken alkalmaz átlapolt illesztést, ahol nincsenek éles sarkok, amelyek hatékonyan elrejtenék a hagyományos varratot." msgid "Conditional angle threshold" msgstr "Feltételes szögküszöb" @@ -16272,7 +16274,7 @@ msgstr "Feltételes túlnyúlási küszöb" #, no-c-format, no-boost-format msgid "This option determines the overhang threshold for the application of scarf joint seams. If the unsupported portion of the perimeter is less than this threshold, scarf joint seams will be applied. The default threshold is set at 40% of the external wall's width. Due to performance considerations, the degree of overhang is estimated." -msgstr "Ez az opció meghatározza az átlapolt varratok alkalmazásának túlnyúlási küszöbét. Ha a kerület alá nem támasztott része kisebb ennél a küszöbnél, átlapolt varrat kerül alkalmazásra. Az alapértelmezett küszöb a külső fal szélességének 40%-a. Teljesítménybeli okokból a túlnyúlás mértéke becsült érték." +msgstr "Ez a beállítás határozza meg az átlapolt varratok túlnyúlási küszöbét. Ha a kerület alá nem támasztott része kisebb ennél a küszöbnél, a szeletelő átlapolt varratot alkalmaz. Az alapértelmezett küszöb a külső fal szélességének 40%-a. Teljesítménybeli okokból a túlnyúlás mértéke csak becsült érték." msgid "Scarf joint speed" msgstr "Átlapolt varrat sebessége" @@ -16281,7 +16283,7 @@ msgid "This option sets the printing speed for scarf joints. It is recommended t msgstr "Ez az opció beállítja az átlapolt varratok nyomtatási sebességét. Ajánlott az átlapolt varratokat alacsony sebességgel nyomtatni (100 mm/s alatt). Az is javasolt, hogy kapcsold be az \"Extrudálási sebesség simítását\", ha az itt megadott sebesség jelentősen eltér a külső vagy belső fal sebességétől. Ha az itt megadott sebesség nagyobb, mint a külső vagy belső fal sebessége, a nyomtató a kettő közül a lassabbat fogja használni. Ha százalékban van megadva (pl. 80%), a sebesség a megfelelő külső vagy belső fali sebesség alapján lesz kiszámítva. Az alapértelmezett érték 100%." msgid "Scarf joint flow ratio" -msgstr "Átlapolt varrat áramlási aránya" +msgstr "Átlapolt varrat anyagáramlása" msgid "This factor affects the amount of material for scarf joints." msgstr "Ez a tényező az átlapolt varratokhoz felhasznált anyag mennyiségét befolyásolja." @@ -16383,7 +16385,7 @@ msgid "" "Enabled = skirt is as tall as the highest printed object. Otherwise 'Skirt height' is used.\n" "Note: With the draft shield active, the skirt will be printed at skirt distance from the object. Therefore, if brims are active it may intersect with them. To avoid this, increase the skirt distance value.\n" msgstr "" -"A huzatvédő hasznos lehet az ABS vagy ASA nyomatok kunkorodásának és a tárgyasztalról való leválásának megelőzésére, amelyet légmozgás okozhat. Általában csak nyitott vázas, azaz burkolat nélküli nyomtatóknál van rá szükség.\n" +"A huzatvédő segíthet megelőzni, hogy a légmozgás miatt az ABS- vagy ASA-nyomatok felkunkorodjanak és leváljanak az asztalról. Általában csak nyitott vázas, azaz burkolat nélküli nyomtatóknál van rá szükség.\n" "\n" "Engedélyezve = a szoknya olyan magas lesz, mint a legmagasabb nyomtatott objektum. Ellenkező esetben a \"Szoknya magassága\" érték kerül használatra.\n" "Megjegyzés: Aktív huzatvédő mellett a szoknya az objektumtól mért szoknyatávolságban lesz nyomtatva. Ezért ha perem is aktív, metszheti azt. Ennek elkerüléséhez növeld a szoknyatávolság értékét.\n" @@ -16428,13 +16430,13 @@ msgstr "" "A hurkok végső száma nincs figyelembe véve az objektumok elrendezésekor vagy távolságának ellenőrzésekor. Ilyen esetben növeld a hurkok számát." msgid "The printing speed in exported G-code will be slowed down when the estimated layer time is shorter than this value in order to get better cooling for these layers." -msgstr "A nyomtatási sebesség az exportált G-kódban csökkentésre kerül, ha a becsült rétegidő kisebb, mint ez az érték, hogy a rétegek jobb hűtése biztosított legyen." +msgstr "Ha a becsült rétegidő kisebb ennél az értéknél, az exportált G-kód csökkenti a nyomtatási sebességet a rétegek jobb hűtése érdekében." msgid "Minimum sparse infill threshold" -msgstr "Ritkás kitöltés küszöbértéke" +msgstr "Kitöltés küszöbértéke" msgid "Sparse infill areas which are smaller than this threshold value are replaced by internal solid infill." -msgstr "Az ennél a küszöbértéknél kisebb ritka kitöltési területek belső tömör kitöltéssel helyettesítődnek." +msgstr "Az ennél a küszöbértéknél kisebb kitöltési területeket belső tömör kitöltéssel helyettesíti." # AI Translated msgid "" @@ -16464,7 +16466,7 @@ msgid "Line width of internal solid infill. If expressed as a %, it will be comp msgstr "A belső tömör kitöltés vonalszélessége. Ha százalékban van megadva, a fúvókaátmérő alapján lesz kiszámítva." msgid "This is the speed for internal solid infill, not including the top or bottom surface." -msgstr "A belső szilárd kitöltés sebessége, de az az érték nem vonatkozik a felső és alsó felületre" +msgstr "A belső tömör kitöltés sebessége; nem vonatkozik a felső és alsó felületre" msgid "This enables spiraling, which smooths out the Z moves of the outer contour and turns a solid model into a single walled print with solid bottom layers. The final generated model has no seam." msgstr "A spirál mód kisimítja a külső kontúr Z mozgásait. A tömör modellt egyfalú nyomatokká alakítja, tömör alsó rétegekkel. A végső modellen nincsenek varratok" @@ -16483,21 +16485,21 @@ msgid "Maximum distance to move points in XY to try to achieve a smooth spiral. msgstr "A pontok XY irányban történő maximális elmozdítása a sima spirál elérése érdekében. Ha százalékban van megadva, a fúvókaátmérő alapján lesz kiszámítva." msgid "Spiral starting flow ratio" -msgstr "Spirál kezdő áramlási aránya" +msgstr "Spirál kezdő anyagáramlása" #, no-c-format, no-boost-format msgid "Sets the starting flow ratio while transitioning from the last bottom layer to the spiral. Normally the spiral transition scales the flow ratio from 0% to 100% during the first loop which can in some cases lead to under extrusion at the start of the spiral." -msgstr "Beállítja a kezdő áramlási arányt az utolsó alsó rétegről a spirálra való átmenet során. Normál esetben a spirálra váltás az első hurok alatt 0%-ról 100%-ra skálázza az áramlási arányt, ami egyes esetekben alulextrudálást okozhat a spirál elején." +msgstr "Beállítja az anyagáramlás kezdőértékét az utolsó alsó rétegről a spirálra való átmenet során. Normál esetben a spirálra váltás az első hurok alatt 0%-ról 100%-ra növeli az anyagáramlást, ami egyes esetekben alulextrudálást okozhat a spirál elején." msgid "Spiral finishing flow ratio" -msgstr "Spirál befejező áramlási aránya" +msgstr "Spirál befejező anyagáramlása" #, no-c-format, no-boost-format msgid "Sets the finishing flow ratio while ending the spiral. Normally the spiral transition scales the flow ratio from 100% to 0% during the last loop which can in some cases lead to under extrusion at the end of the spiral." -msgstr "Beállítja a befejező áramlási arányt a spirál lezárásakor. Normál esetben a spirál lezárása az utolsó hurok alatt 100%-ról 0%-ra skálázza az áramlási arányt, ami egyes esetekben alulextrudálást okozhat a spirál végén." +msgstr "Beállítja az anyagáramlás befejező értékét a spirál lezárásakor. Normál esetben a spirál lezárása az utolsó hurok alatt 100%-ról 0%-ra csökkenti az anyagáramlást, ami egyes esetekben alulextrudálást okozhat a spirál végén." msgid "If smooth or traditional mode is selected, a timelapse video will be generated for each print. After each layer is printed, a snapshot is taken with the chamber camera. All of these snapshots are composed into a timelapse video when printing completes. If smooth mode is selected, the toolhead will move to the excess chute after each layer is printed and then take a snapshot. Since the melt filament may leak from the nozzle during the process of taking a snapshot, a prime tower is required for smooth mode to wipe the nozzle." -msgstr "Ha a sima vagy a hagyományos mód van kiválasztva, minden nyomtatásnál készül egy időfelvétel-videó. Az egyes rétegek kinyomtatása után a beépített kamera egy képet készít. A nyomtatás befejeződése után aztán ezeket a képeket a szoftver egy videóvá fűzi össze. Ha a sima mód van kiválasztva, a réteg nyomtatása után a nyomtatófej a kidobónyíláshoz mozog, majd a kamera egy képet készít. Mivel a kép készítése során szivároghat valamennyi olvadt filament a fúvókából, egy törlőtoronyra van szükség a fúvóka megtisztításához." +msgstr "Sima vagy hagyományos módban minden nyomtatásról Timelapse-videó készül. Az egyes rétegek után a beépített kamera fényképet készít, majd a nyomtatás végén a szoftver videóvá fűzi össze a képeket. Sima módban a szerszámfej minden réteg után a kidobónyíláshoz mozog, mielőtt a kamera elkészíti a képet. Mivel eközben olvadt filament szivároghat a fúvókából, a fúvóka megtisztításához törlőtorony szükséges." msgid "Traditional" msgstr "Hagyományos" @@ -16511,14 +16513,14 @@ msgstr "Timelapse a legtávolabbi pontban" # AI Translated msgid "When enabled, the timelapse snapshot is taken at the farthest point from camera instead of traveling to the wipe tower or excess chute. Only effective in traditional timelapse mode on non-I3 printers." -msgstr "Bekapcsolva a timelapse felvétel a kamerától legtávolabbi pontban készül, ahelyett hogy a nyomtatófej a törlőtoronyhoz vagy a hulladékcsatornához mozogna. Csak a hagyományos timelapse módban, nem I3 felépítésű nyomtatókon működik." +msgstr "Bekapcsolva a Timelapse-felvétel a kamerától legtávolabbi pontban készül, ahelyett hogy a szerszámfej a törlőtoronyhoz vagy a hulladékcsatornához mozogna. Csak hagyományos Timelapse módban és nem I3 felépítésű nyomtatókon működik." msgid "Temperature variation" msgstr "Hőmérséklet változás" #. TRN PrintSettings : "Ooze prevention" > "Temperature variation" msgid "Temperature difference to be applied when an extruder is not active. The value is not used when 'idle_temperature' in filament settings is set to non-zero value." -msgstr "Az az alkalmazandó hőmérséklet-különbség, amikor egy extruder nem aktív. Ez az érték nem kerül felhasználásra, ha a filament beállításokban az 'idle_temperature' nem nulla értékre van állítva." +msgstr "A nem aktív extrudernél alkalmazott hőmérséklet-különbség. A rendszer figyelmen kívül hagyja ezt az értéket, ha a filamentbeállításokban az 'idle_temperature' értéke nem nulla." msgid "∆℃" msgstr "∆℃" @@ -16554,16 +16556,16 @@ msgid "Use single nozzle to print multi filament." msgstr "Egyetlen fúvóka használata többféle filament nyomtatásához." msgid "Manual Filament Change" -msgstr "Manuális filamentcsere" +msgstr "Kézi filamentcsere" msgid "Enable this option to omit the custom Change filament G-code only at the beginning of the print. The tool change command (e.g., T0) will be skipped throughout the entire print. This is useful for manual multi-material printing, where we use M600/PAUSE to trigger the manual filament change action." -msgstr "Engedélyezd ezt az opciót, hogy az egyedi Filamentcsere G-kód csak a nyomtatás elején maradjon ki. A szerszámváltási parancs (pl. T0) a teljes nyomtatás során ki lesz hagyva. Ez manuális többanyagú nyomtatásnál hasznos, ahol az M600/PAUSE parancsot használjuk a manuális filamentcsere elindítására." +msgstr "Engedélyezd ezt a beállítást, ha csak a nyomtatás elején szeretnéd kihagyni az egyéni Filamentcsere G-kódot. A szerszámváltási parancsok (pl. T0) a teljes nyomtatás során kimaradnak. Ez kézi többanyagos nyomtatásnál hasznos, ahol az M600/PAUSE paranccsal indítható el a kézi filamentcsere." msgid "Wipe tower type" msgstr "Törlőtorony típusa" msgid "Choose the wipe tower implementation for multi-material prints. Type 1 is recommended for Bambu and Qidi printers with a filament cutter. Type 2 offers better compatibility with multi-tool and MMU printers and provide overall better compatibility." -msgstr "Válassza ki a törlőtorony megvalósítását a többanyagos nyomtatáshoz. Az 1. típus ajánlott a Bambu és Qidi nyomtatókhoz szálvágóval. A 2. típus jobb kompatibilitást kínál a többszerszámos és MMU nyomtatókkal, és összességében jobb kompatibilitást biztosít." +msgstr "Válaszd ki a törlőtorony megvalósítását a többanyagos nyomtatáshoz. Az 1. típus ajánlott a szálvágóval felszerelt Bambu és Qidi nyomtatókhoz. A 2. típus jobb kompatibilitást kínál a többszerszámos és MMU nyomtatókkal." msgid "Type 1" msgstr "1. típus" @@ -16572,10 +16574,10 @@ msgid "Type 2" msgstr "2. típus" msgid "Purge in prime tower" -msgstr "Kiürítés a törlőtoronyban" +msgstr "Öblítés a törlőtoronyban" msgid "Purge remaining filament into prime tower." -msgstr "A megmaradt filament kiürítése a törlőtoronyba." +msgstr "A megmaradt filament öblítése a törlőtoronyba." msgid "Enable filament ramming" msgstr "Filament tömörítés engedélyezése" @@ -16584,19 +16586,19 @@ msgid "Tool change on wipe tower" msgstr "Szerszámcsere a törlőtoronyban" msgid "Force the toolhead to travel to the wipe tower before issuing the tool change command (Tx). Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. By default Orca skips the travel on multi-toolhead machines because the firmware handles the head swap, which can result in the Tx command being issued above the printed part. Enable this option if you want the tool change to always be issued above the wipe tower instead." -msgstr "A szerszámcsere parancs (Tx) kiadása előtt kényszerítse a szerszámfejet a törlőtoronyhoz. Csak a 2-es típusú törlőtornyot használó többextruderes (több szerszámfejes) nyomtatóknál releváns. Alapértelmezés szerint az Orca kihagyja az utazást a több szerszámfejes gépeken, mert a firmware kezeli a fejcserét, ami azt eredményezheti, hogy a Tx parancs a nyomtatott rész felett kerül kiadásra. Engedélyezd ezt az opciót, ha azt szeretnéd, hogy a szerszámcsere mindig a törlőtorony felett történjen." +msgstr "A szerszámcsere parancs (Tx) kiadása előtt a törlőtoronyhoz mozgatja a szerszámfejet. Csak a 2-es típusú törlőtornyot használó többextruderes (több szerszámfejes) nyomtatóknál van jelentősége. Az Orca alapértelmezés szerint kihagyja ezt a mozgást a több szerszámfejes gépeknél, mert a fejcserét a firmware kezeli. Emiatt azonban előfordulhat, hogy a Tx parancsot a nyomtatott tárgy felett adja ki. Kapcsold be ezt a beállítást, ha azt szeretnéd, hogy a szerszámcsere mindig a törlőtorony felett történjen." msgid "No sparse layers (beta)" msgstr "Nincsenek ritka rétegek (béta)" msgid "If enabled, the wipe tower will not be printed on layers with no tool changes. On layers with a tool change, extruder will travel downward to print the wipe tower. User is responsible for ensuring there is no collision with the print." -msgstr "Ha engedélyezve van, akkor törlőtorony nem kerül kinyomtatásra szerszámváltás nélküli rétegeken. A szerszámcserével rendelkező rétegeken az extruder az aktuális magasság alá süllyed a törlőtorony nyomtatásához. A felhasználó felelős azért, hogy ez ne okozzon ütközést a nyomtatás során." +msgstr "Ha engedélyezed, nem készül törlőtorony azokon a rétegeken, ahol nincs szerszámváltás. A szerszámváltást tartalmazó rétegeknél az extruder az aktuális magasság alá süllyed a törlőtorony nyomtatásához. Ügyelj arra, hogy ez ne okozzon ütközést a nyomtatás során." msgid "Prime all printing extruders" msgstr "Az összes nyomtató extruder előkészítése" msgid "If enabled, all printing extruders will be primed at the front edge of the print bed at the start of the print." -msgstr "Ha engedélyezve van, akkor a nyomtatás kezdetén az összes nyomtató extruder előkészítésre kerül a tárgyasztal elülső szélénél." +msgstr "Bekapcsolva a nyomtatás kezdetén minden extrudert előkészít az asztal elülső szélénél." # AI Translated msgid "Toolchange ordering" @@ -16620,7 +16622,7 @@ msgid "Slice gap closing radius" msgstr "Szeletelési hézag lezárási sugara" msgid "Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low." -msgstr "A háromszögháló szeletelés során a szeletelési hézag lezárási sugaránál 2x kisebb résekk feltöltésre kerülnek. A hézagok lezárása csökkentheti a nyomtatási felbontást, ezért ajánlott ezt az értéket alacsonyan tartani." +msgstr "A háromszögháló szeletelésekor kitölti a hézagzárási sugár kétszeresénél kisebb repedéseket. A hézagok lezárása csökkentheti a nyomtatási felbontást, ezért érdemes ezt az értéket viszonylag alacsonyan tartani." msgid "Slicing Mode" msgstr "Szeletelési mód" @@ -16644,7 +16646,7 @@ msgid "Z offset" msgstr "Z ofszet" msgid "This value will be added (or subtracted) from all the Z coordinates in the output G-code. It is used to compensate for bad Z endstop position: for example, if your endstop zero actually leaves the nozzle 0.3mm far from the print bed, set this to -0.3 (or fix your endstop)." -msgstr "Ez az érték hozzáadódik (vagy kivonásra kerül) az összes Z koordinátához a kimeneti G-kódban. A Z tengely végállás pozíciójának kompenzálására szolgál: például ha a végállás nullája valójában 0,3 mm-re hagyja a fúvókát a tárgyasztal felett, akkor állítsa ezt az értéke -0,3-ra (vagy javítsa meg a végállást)." +msgstr "Ez az érték a kimeneti G-kód minden Z-koordinátáját ennyivel növeli vagy csökkenti. A hibás Z-végálláshelyzet kompenzálására szolgál: például ha a végállás nullpontján a fúvóka valójában 0,3 mm-re marad az asztaltól, állítsd ezt az értéket -0,3-ra (vagy javítsd ki a végállást)." msgid "Enable support" msgstr "Támasz engedélyezése" @@ -16653,19 +16655,19 @@ msgid "This enables support generation." msgstr "Engedélyezi a támasz generálását." msgid "Normal (auto) and Tree (auto) are used to generate support automatically. If Normal (manual) or Tree (manual) is selected, only support enforcers are generated." -msgstr "A normál (auto) és a fa (auto) a támaszok automatikus generálásához van használva. Ha a normál (kézi) vagy a fa (kézi) van kiválasztva, akkor csak a kényszerített támaszok kerülnek generálásra." +msgstr "A Normál (automatikus) és a Fa (automatikus) beállítás automatikusan hozza létre a támaszokat. A Normál (kézi) és a Fa (kézi) beállítás csak a kijelölt támaszkényszerítőknél hoz létre támaszt." msgid "Normal (auto)" -msgstr "normál (auto)" +msgstr "Normál (automatikus)" msgid "Tree (auto)" -msgstr "fa (auto)" +msgstr "Fa (automatikus)" msgid "Normal (manual)" -msgstr "normál (manuális)" +msgstr "Normál (kézi)" msgid "Tree (manual)" -msgstr "fa (manuális)" +msgstr "Fa (kézi)" msgid "Support/object XY distance" msgstr "Támasz/tárgy XY távolság" @@ -16686,16 +16688,16 @@ msgid "Use this setting to rotate the support pattern on the horizontal plane." msgstr "Ezzel a beállítással elforgathatod a támasz mintázatát a vízszintes síkon." msgid "On build plate only" -msgstr "Csak a tárgyasztaltól" +msgstr "Csak az asztalról" msgid "This setting only generates supports that begin on the build plate." -msgstr "Nem generál támaszt a modell felületén, csak a tárgyasztalon" +msgstr "Nem hoz létre támaszt a modell felületén, csak az asztalon" msgid "Support critical regions only" msgstr "Csak a kritikus területek alátámasztása" msgid "Only create support for critical regions including sharp tail, cantilever, etc." -msgstr "Csak olyan kritikus területekhez generál támasztékot, mint például egy farok vagy egyéb kiálló részek." +msgstr "Csak olyan kritikus területekhez hoz létre támaszt, mint például egy farok vagy más kiálló részek." msgid "Ignore small overhangs" msgstr "Kis túlnyúlások mellőzése" @@ -16713,7 +16715,7 @@ msgid "Bottom Z distance" msgstr "Alsó Z távolság" msgid "Z gap between the object and the support bottom. If Support Top Z Distance is 0 and the bottom has interface layers, this value is ignored and the support is printed in direct contact with the object (no gap)." -msgstr "Z rés a tárgy és a támasz alja között. Ha a támasz felső Z-távolsága 0 és az alján vannak interfész rétegek, ez az érték figyelmen kívül lesz hagyva, és a támasz közvetlenül a tárgyhoz lesz nyomtatva (rés nélkül)." +msgstr "Z-rés a tárgy és a támasz alja között. Ha a támasz felső Z-távolsága 0, és alul érintkezőrétegek vannak, a szeletelő figyelmen kívül hagyja ezt az értéket, és a támaszt közvetlenül a tárgyra nyomtatja (rés nélkül)." msgid "Support/raft base" msgstr "Támasz/tutaj alap" @@ -16742,7 +16744,7 @@ msgid "This covers the top contact layer of the supports with loops. It is disab msgstr "Lefedi a támasz felső érintkező rétegét körökkel. Alapértelmezés szerint letiltva." msgid "Support/raft interface" -msgstr "Támasz/tutaj interfész" +msgstr "Támasz/tutaj érintkező felülete" # AI Translated msgid "" @@ -16872,8 +16874,8 @@ msgid "" "Support will be generated for overhangs whose slope angle is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support.\n" "Note: If set to 0, normal supports use the Threshold overlap instead, while tree supports fall back to a default value of 30." msgstr "" -"Az olyan túlnyúlásoknál, amelynek dőlésszöge ez alatt az érték alatt van, támasz fog generálódni.Minél kisebb ez az érték, annál meredekebb a túlnyúlás, amely alátámasztás nélkül nyomtatható.\n" -"Megjegyzés: Ha 0-ra van állítva, a normál támaszok a Küszöbátfedést használják, míg a fa típusú támaszok az alapértelmezett 30-as értékre térnek vissza." +"Azokhoz a túlnyúlásokhoz készül támasz, amelyek dőlésszöge a küszöbérték alatt van. Minél kisebb ez az érték, annál meredekebb túlnyúlás nyomtatható támasz nélkül.\n" +"Megjegyzés: 0 értéknél a normál támaszok helyette az átfedési küszöbértéket használják, a fatámaszok pedig visszaállnak az alapértelmezett 30-as értékre." msgid "Threshold overlap" msgstr "Átfedési küszöbérték" @@ -16908,16 +16910,16 @@ msgid "Adjusts the density of the support structure used to generate the tips of msgstr "Az ágak csúcsainak létrehozásához használt támaszszerkezet sűrűségét állítja be. A nagyobb érték jobb túlnyúlásokat eredményez, viszont a támaszokat nehezebb eltávolítani, ezért ha sűrű érintkező felületre van szükség, inkább a felső támaszérintkező felületek engedélyezése javasolt a magas ágsűrűségérték helyett." msgid "Auto brim width" -msgstr "Automatikus karimaszélesség" +msgstr "Automatikus peremszélesség" msgid "Enabling this option means the width of the brim for tree support will be automatically calculated." -msgstr "Ennek az opciónak az engedélyezése azt jelenti, hogy a fa támasz karimájának szélessége automatikusan lesz kiszámítva." +msgstr "Bekapcsolva automatikusan kiszámítja a fatámasz peremének szélességét." msgid "Tree support brim width" -msgstr "Fa támasz karimaszélessége" +msgstr "Fatámasz peremszélessége" msgid "Distance from tree branch to the outermost brim line." -msgstr "A távolság a fa támasz ágától a legkülső karimavonalig." +msgstr "A fatámasz ágának és a legkülső peremvonalnak a távolsága." msgid "Tip Diameter" msgstr "Csúcsátmérő" @@ -17022,19 +17024,19 @@ msgid "Detect thin walls" msgstr "Vékony falak felismerése" msgid "This detects thin walls which can’t contain two lines and uses a single line to print. It may not print as well because it’s not a closed loop." -msgstr "Felismeri a vékony falakat, amellyeket nem lehet két vonalnyi szélességgel nyomtatni, és egyetlen vonalt használ. Lehet nem jó a nyomat minősége, mert nem zárt hurok." +msgstr "Felismeri azokat a vékony falakat, amelyekben nem fér el két vonal, és egyetlen vonallal nyomtatja ki őket. A nyomtatási minőség gyengébb lehet, mert ez a vonal nem alkot zárt hurkot." msgid "This G-code is inserted when filament is changed, including T commands to trigger tool change." -msgstr "Ez a G-kód kerül beillesztésre, amikor a filament csere történik, beleértve a szerszámváltást indító T parancsokat is." +msgstr "Az Orca Slicer filamentcserekor illeszti be ezt a G-kódot, beleértve a szerszámváltást indító T parancsokat is." msgid "This G-code is inserted when the extrusion role is changed." -msgstr "Ez a G-kód akkor kerül beillesztésre, amikor az extrudálási szerep megváltozik." +msgstr "Az Orca Slicer az extrudálási szerep megváltozásakor illeszti be ezt a G-kódot." msgid "Change extrusion role G-code (filament)" msgstr "Az extrudálási szerep G-kódjának módosítása (szál)" msgid "This G-code is inserted when the extrusion role is changed for the active filament." -msgstr "Ez a G-kód akkor kerül beillesztésre, amikor az aktív filament extrudálási szerepe megváltozik." +msgstr "Az Orca Slicer akkor illeszti be ezt a G-kódot, amikor megváltozik az aktív filament extrudálási szerepe." msgid "Line width for top surfaces. If expressed as a %, it will be computed over the nozzle diameter." msgstr "A felső felületek vonalszélessége. Ha %-ban van megadva, a rendszer a fúvóka átmérője alapján számítja ki." @@ -17105,7 +17107,7 @@ msgid "Wipe while retracting" msgstr "Törlés visszahúzás közben" msgid "This moves the nozzle along the last extrusion path when retracting to clean any leaked material on the nozzle. This can minimize blobs when printing a new part after traveling." -msgstr "Ez visszahúzáskor a fúvókát az utolsó extrudálási útvonal mentén mozgatja, hogy a fúvókából szivárgott anyagot eltávolítsa. Ez minimálisra csökkentheti a pöttyöket, amikor a nyomtatófej a mozgást követően egy egy új alkatrész nyomtatásába kezd." +msgstr "Ez visszahúzáskor a fúvókát az utolsó extrudálási útvonal mentén mozgatja, hogy eltávolítsa a kiszivárgott anyagot. Így kevesebb anyagcsomó keletkezhet, amikor a szerszámfej a mozgás után új tárgy nyomtatásába kezd." msgid "Wipe distance" msgstr "Törlési távolság" @@ -17182,7 +17184,7 @@ msgid "Wipe tower rotation angle with respect to X axis." msgstr "Törlőtorony forgatási szöge az x-tengelyhez képest." msgid "Brim width of prime tower, negative number means auto calculated width based on the height of prime tower." -msgstr "A törlőtorony karimájának szélessége. Negatív szám esetén a szélesség automatikusan, a törlőtorony magassága alapján kerül kiszámításra." +msgstr "A törlőtorony peremének szélessége. Negatív értéknél a szeletelő automatikusan, a törlőtorony magassága alapján számítja ki a szélességet." msgid "Stabilization cone apex angle" msgstr "Stabilizáló kúp csúcsszöge" @@ -17204,7 +17206,7 @@ msgid "" "\n" "For the wipe tower external perimeters the internal perimeter speed is used regardless of this setting." msgstr "" -"A maximális nyomtatási sebesség öblítéskor a törlőtoronyban, valamint a törlőtorony ritka rétegeinek nyomtatásakor. Öblítés közben, ha a ritka kitöltés sebessége vagy a filament maximális térfogati sebességéből számolt sebesség alacsonyabb, akkor a kisebbik érték lesz használva.\n" +"A maximális nyomtatási sebesség öblítéskor a törlőtoronyban, valamint a törlőtorony ritka rétegeinek nyomtatásakor. Öblítés közben, ha a kitöltés sebessége vagy a filament maximális térfogati sebességéből számolt sebesség alacsonyabb, a kisebbik értéket használja.\n" "\n" "A ritka rétegek nyomtatásakor, ha a belső kerület sebessége vagy a filament maximális térfogati sebességéből számolt sebesség alacsonyabb, akkor a kisebbik érték lesz használva.\n" "\n" @@ -17238,7 +17240,7 @@ msgid "Extra rib length" msgstr "Extra bordahossz" msgid "Positive values can increase the size of the rib wall, while negative values can reduce the size. However, the size of the rib wall can not be smaller than that determined by the cleaning volume." -msgstr "A pozitív értékek növelhetik a bordafal méretét, míg a negatív értékek csökkenthetik azt. A bordafal mérete azonban nem lehet kisebb annál, mint amit a kiürítési mennyiség meghatároz." +msgstr "A pozitív értékek növelhetik, a negatív értékek pedig csökkenthetik a bordafal méretét. A bordafal azonban nem lehet kisebb az öblítési térfogat által meghatározott méretnél." msgid "Rib width" msgstr "Bordaszélesség" @@ -17253,13 +17255,13 @@ msgid "The wall of prime tower will fillet." msgstr "A törlőtorony fala lekerekített lesz." msgid "The extruder to use when printing perimeter of the wipe tower. Set to 0 to use the one that is available (non-soluble would be preferred)." -msgstr "Az a extruder, amelyet a törlőtorony kerületének nyomtatásához kell használni. Állítsd 0-ra, ha az éppen elérhető extrudert szeretnéd használni (előnyösítve a nem oldhatót)." +msgstr "A törlőtorony kerületének nyomtatásához használt extruder. Állítsd 0-ra az éppen elérhető extruder használatához; lehetőség szerint nem oldható filamentet választ." msgid "Purging volumes - load/unload volumes" msgstr "Kiürítési mennyiségek - betöltési/kirakodási mennyiségek" msgid "This vector saves required volumes to change from/to each tool used on the wipe tower. These values are used to simplify creation of the full purging volumes below." -msgstr "Ez a vektor eltárolja a törlőtornyon használt egyes szerszámokra/szerszámokról való váltáshoz szükséges mennyiségeket. Ezek az értékek az alábbi teljes kiürítési mennyiségek létrehozásának egyszerűsítésére szolgálnak." +msgstr "Ez a vektor tárolja a törlőtornyon használt egyes szerszámokra és szerszámokról való váltáshoz szükséges térfogatokat. Ezek az értékek egyszerűsítik az alábbi teljes öblítési térfogatok létrehozását." msgid "Skip points" msgstr "Pontok kihagyása" @@ -17286,31 +17288,31 @@ msgid "Infill gap." msgstr "Kitöltési hézag." msgid "Purging after filament change will be done inside objects' infills. This may lower the amount of waste and decrease the print time. If the walls are printed with transparent filament, the mixed color infill will be visible. It will not take effect unless the prime tower is enabled." -msgstr "A filamentcsere utáni kiürítés az objektumok kitöltésén belül történik. Ez csökkentheti a hulladék mennyiségét és a nyomtatási időt. Ha a falakat átlátszó filamenttel nyomtatod, a vegyes színű kitöltés látható lesz. Ez az opció csak akkor működik, ha a törlőtorony engedélyezve van." +msgstr "A filamentcsere utáni öblítés az objektumok kitöltésén belül történik. Ez csökkentheti a hulladék mennyiségét és a nyomtatási időt. Ha a falakat átlátszó filamenttel nyomtatod, a vegyes színű kitöltés látható lesz. Ez az opció csak akkor működik, ha a törlőtorony engedélyezve van." msgid "Purging after filament change will be done inside objects' support. This may lower the amount of waste and decrease the print time. It will not take effect unless a prime tower is enabled." -msgstr "A filamentcsere utáni kiürítés az objektumok támaszain belül történik. Ez csökkentheti a hulladék mennyiségét és a nyomtatási időt. Ez az opció csak akkor működik, ha a törlőtorony engedélyezve van." +msgstr "A filamentcsere utáni öblítés az objektumok támaszain belül történik. Ez csökkentheti a hulladék mennyiségét és a nyomtatási időt. Ez az opció csak akkor működik, ha a törlőtorony engedélyezve van." msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." -msgstr "Ez az objektum lesz használva a fúvóka kiürítésére filamentcsere után, a nyomtatási idő csökkentése és némi filament megtakarításának érdekében. Az objektum színei ennek eredményeképpen keveredni fognak. Ez az opció csak akkor működik, ha a törlőtorony engedélyezve van." +msgstr "Ezt az objektumot használja a fúvóka öblítésére filamentcsere után, így filamentet és nyomtatási időt takarít meg. Emiatt az objektum színei keverednek. Ez a beállítás csak bekapcsolt törlőtoronnyal működik." msgid "Maximal bridging distance" msgstr "Maximális áthidalási távolság" msgid "Maximal distance between supports on sparse infill sections." -msgstr "A támaszok közötti maximális távolság a ritkás kitöltésű részeken." +msgstr "A támaszok közötti maximális távolság a kitöltési területeken." msgid "Wipe tower purge lines spacing" -msgstr "A törlőtorony kiürítési vonalainak távolsága" +msgstr "A törlőtorony öblítési vonalainak távolsága" msgid "Spacing of purge lines on the wipe tower." -msgstr "A törlőtoronyon lévő kiürítési vonalak távolsága." +msgstr "A törlőtorony öblítési vonalainak távolsága." msgid "Extra flow for purging" -msgstr "Többletáramlás a kiürítéshez" +msgstr "Többletáramlás az öblítéshez" msgid "Extra flow used for the purging lines on the wipe tower. This makes the purging lines thicker or narrower than they normally would be. The spacing is adjusted automatically." -msgstr "A törlőtorony kiürítési vonalaihoz használt többletáramlás. Ez a kiürítési vonalakat a szokásosnál vastagabbá vagy vékonyabbá teszi. A távolság automatikusan igazodik." +msgstr "A törlőtorony öblítési vonalaihoz használt többletáramlás. Ettől az öblítési vonalak a szokásosnál vastagabbak vagy vékonyabbak lesznek. A távolság automatikusan igazodik." msgid "Idle temperature" msgstr "Üresjárati hőmérséklet" @@ -17391,7 +17393,7 @@ msgid "Relative extrusion is recommended when using \"label_objects\" option. So msgstr "A relatív extrudálás használata ajánlott a \"label_objects\" opcióval. Bizonyos extruderek jobban működnek, ha ez az opció nincs bejelölve (abszolút extrudálási mód). A törlőtorony csak a relatív móddal kompatibilis. A legtöbb nyomtatón ajánlott. Alapértelmezés szerint be van jelölve." msgid "The classic wall generator produces walls with constant extrusion width and for very thin areas, gap-fill is used. The Arachne engine produces walls with variable extrusion width." -msgstr "A klasszikus falgenerátor állandó szélességű falakat generál, és a nagyon vékony területeknél hézagkitöltést használ. Az Arachne engine változó szélességű falakat generál." +msgstr "A klasszikus falgenerátor állandó szélességű falakat hoz létre, és a nagyon vékony területeknél hézagkitöltést használ. Az Arachne falgenerátor változó szélességű falakat hoz létre." msgid "Arachne" msgstr "Arachne" @@ -17412,7 +17414,7 @@ msgid "Wall transitioning threshold angle" msgstr "Falátmenet szögének küszöbértéke" msgid "When to create transitions between even and odd numbers of walls. A wedge shape with an angle greater than this setting will not have transitions and no walls will be printed in the center to fill the remaining space. Reducing this setting reduces the number and length of these center walls, but may leave gaps or overextrude." -msgstr "Mikor legyen átmenetet a páros és páratlan számú falak között. Az ennél nagyobb szögű ék formánál nem lesz átmenet és nem kerül közé anyag, hogy kitöltse a fennmaradó helyet. Ennek az értéknek a csökkentése csökkenti a középső falak számát és hosszát, de hézagokat hagyhat vagy túlextrudálhat" +msgstr "Meghatározza, hogy mikor jöjjön létre átmenet a páros és páratlan számú falak között. Az ennél nagyobb szögű, ék alakú részeknél nem jön létre átmenet, és a fennmaradó hely kitöltéséhez nem nyomtat falat középre. Az érték csökkentésével csökken e középső falak száma és hossza, de hézagok vagy túlextrudálás alakulhat ki." msgid "Wall distribution count" msgstr "Falak elosztása" @@ -17463,16 +17465,16 @@ msgid "Width of the wall that will replace thin features (according to the Minim msgstr "A fal szélessége, amely lecseréli a modell vékony részeit (a Minimális méretben megadott érték szerint). Ha a minimális falszélesség vékonyabb, mint a nyomtatandó elem vastagsága, akkor a fal olyan vastag lesz, mint maga a nyomtatott elem. A fúvóka átmérőjének százalékában van kifejezve" msgid "Hotend change time" -msgstr "Hotendváltás ideje" +msgstr "Fejegységváltás ideje" msgid "Time to change hotend." -msgstr "A hotendváltás ideje." +msgstr "A fejegységváltás ideje." msgid "Hotend change" -msgstr "Hotendváltás" +msgstr "Fejegységváltás" msgid "When changing the hotend, it is recommended to extrude a certain length of filament from the original nozzle. This helps minimize nozzle oozing." -msgstr "A hotend cseréjekor ajánlott egy bizonyos hosszúságú filamentet extrudálni az eredeti fúvókából. Ez segít minimalizálni a fúvóka szivárgását." +msgstr "A fejegység cseréjekor ajánlott egy bizonyos hosszúságú filamentet extrudálni az eredeti fúvókából. Ez segít csökkenteni a fúvóka szivárgását." msgid "Extruder change" msgstr "Extruderváltás" @@ -17490,13 +17492,13 @@ msgid "To prevent oozing, the nozzle temperature will be cooled during ramming. msgstr "A szivárgás megakadályozása érdekében a fúvóka a betolás során lehűl. Megjegyzés: csak a hűtési parancs és a ventilátor bekapcsolása kerül elküldésre, a célhőmérséklet elérése nem garantált. A 0 letiltást jelent." msgid "The maximum volumetric speed for ramming before a hotend change, where -1 means using the maximum volumetric speed." -msgstr "A hotendváltás előtti betolás maximális áramlási sebessége, ahol -1 a maximális sebesség használatát jelenti." +msgstr "A fejegységváltás előtti betolás maximális anyagáramlása; a -1 a maximális sebesség használatát jelenti." msgid "length when change hotend" -msgstr "hossz hotendcsere esetén" +msgstr "hossz fejegységcsere esetén" msgid "When this retraction value is modified, it will be used as the amount of filament retracted inside the hotend before changing hotends." -msgstr "Ha ezt a visszahúzási értéket módosítod, akkor ezt az értéket használja a nyomtató a filament hotend belsejéből történő visszahúzásakor, mielőtt hotendet cserélne." +msgstr "Ha módosítod, a nyomtató ezt az értéket használja, amikor fejegységcsere előtt visszahúzza a filamentet a fejegység belsejéből." # AI Translated msgid "Support fast purge mode" @@ -17508,14 +17510,14 @@ msgstr "Támogatja-e ez a nyomtató a gyors öblítési módot optimalizált hő # AI Translated msgid "Filament change" -msgstr "Filament csere" +msgstr "Filamentcsere" # AI Translated msgid "The volume of material required to prime the extruder on the tower, excluding a hotend change." msgstr "Az extruder toronyban való előkészítéséhez szükséges anyagmennyiség, a fejegységcserét nem beleértve." msgid "The volume of material required to prime the extruder for a hotend change on the tower." -msgstr "Az extruder átöblítéséhez szükséges anyagmennyiség a hotend cseréjekor." +msgstr "Az extruder átöblítéséhez szükséges anyagmennyiség fejegységcsere esetén." msgid "Preheat temperature delta" msgstr "Előmelegítési hőmérséklet delta" @@ -17660,7 +17662,7 @@ msgid "Lift the object above the bed when it is partially below. Disabled by def msgstr "A tárgy az ágy fölé emelve, ha az részben alatta van. Alapértelmezés szerint le van tiltva." msgid "Arrange the supplied models in a plate and merge them in a single model in order to perform actions once." -msgstr "A megadott modellek elredezése és egyetlen modellé való összevonása a tárgyasztalon, hogy egyszerre lehessen végrehajtani a műveleteket." +msgstr "A megadott modellek elrendezése és egyetlen modellé egyesítése az asztalon, hogy a műveletek egyszerre legyenek végrehajthatók." msgid "Convert Unit" msgstr "Mértékegység átváltása" @@ -17732,7 +17734,7 @@ msgid "Downward machines check" msgstr "Visszafelé kompatibilis gépek ellenőrzése" msgid "If enabled, check whether current machine downward compatible with the machines in the list." -msgstr "Ha engedélyezve van, ellenőrve van, hogy az aktuális gép visszafelé kompatibilis-e a listában szereplő gépekkel." +msgstr "Bekapcsolva ellenőrzi, hogy a jelenlegi gép visszafelé kompatibilis-e a listában szereplő gépekkel." msgid "Downward machines settings" msgstr "Visszafelé kompatibilis gépbeállítások" @@ -17773,10 +17775,10 @@ msgid "Redirects debug logging to file.\n" msgstr "A hibakeresési naplózást fájlba irányítja.\n" msgid "Enable timelapse for print" -msgstr "Időfelvétel engedélyezése a nyomtatáshoz" +msgstr "Timelapse engedélyezése a nyomtatáshoz" msgid "If enabled, this slicing will be considered using timelapse." -msgstr "Ha engedélyezve van, ez a szeletelés időfelvétel használatával számol." +msgstr "Bekapcsolva a szeletelés Timelapse használatával számol." msgid "Load custom G-code" msgstr "Egyéni G-kód betöltése" @@ -18050,13 +18052,13 @@ msgid "Size of the first layer bounding box" msgstr "Az első réteg befoglaló dobozának mérete" msgid "Bottom-left corner of print bed bounding box" -msgstr "A tárgyasztal befoglaló dobozának bal alsó sarka" +msgstr "Az asztal befoglaló téglalapjának bal alsó sarka" msgid "Top-right corner of print bed bounding box" -msgstr "A tárgyasztal befoglaló dobozának jobb felső sarka" +msgstr "Az asztal befoglaló téglalapjának jobb felső sarka" msgid "Size of the print bed bounding box" -msgstr "A tárgyasztal befoglaló dobozának mérete" +msgstr "Az asztal befoglaló téglalapjának mérete" msgid "Timestamp" msgstr "Időbélyeg" @@ -18110,13 +18112,13 @@ msgid "Layer Z" msgstr "Réteg Z" msgid "Height of the current layer above the print bed, measured to the top of the layer." -msgstr "Az aktuális réteg magassága a tárgyasztal felett, a réteg tetejéig mérve." +msgstr "Az aktuális réteg magassága az asztal felett, a réteg tetejéig mérve." msgid "Maximal layer Z" msgstr "Maximális réteg Z" msgid "Height of the last layer above the print bed." -msgstr "Az utolsó réteg magassága a tárgyasztal felett." +msgstr "Az utolsó réteg magassága az asztal felett." msgid "Filament extruder ID" msgstr "Filament extruderazonosító" @@ -18178,8 +18180,8 @@ msgid "" "An object has enabled XY Size compensation which will not be used because it is also fuzzy skin painted.\n" "XY Size compensation cannot be combined with fuzzy skin painting." msgstr "" -"Egy objektumnál engedélyezve van az XY méretkompenzáció, de ez nem lesz használva, mert bolyhos felülettel is festett.\n" -"Az XY méretkompenzáció nem kombinálható a bolyhos felület festésével." +"Egy objektumnál engedélyezve van az XY-méretkompenzáció, de a barázdált felület festése miatt nem használható.\n" +"Az XY-méretkompenzáció nem kombinálható a barázdált felület festésével." msgid "Object name" msgstr "Objektum neve" @@ -18400,7 +18402,7 @@ msgstr "" "\n" "Általában nincs szükség erre a kalibrálásra. Ha egyetlen színű/anyagú nyomtatást indítasz, és a nyomtatásindító menüben be van jelölve az \"áramlásdinamika kalibrálás\" opció, a nyomtató a régi módon fog működni, vagyis a nyomtatás előtt kalibrálja a filamentet; ha többszínű/többanyagú nyomtatást indítasz, a nyomtató minden filamentváltásnál a filament alapértelmezett kompenzációs paraméterét használja, ami a legtöbb esetben jó eredményt ad.\n" "\n" -"Kérlek, vedd figyelembe, hogy vannak olyan esetek, amelyek megbízhatatlanná tehetik a kalibrálási eredményeket, például az elégtelen tapadás a tárgyasztalon. A tapadás javítható a tárgyasztal lemosásával vagy ragasztó felvitelével. Erről további információt a wikiben találsz.\n" +"Vedd figyelembe, hogy bizonyos körülmények megbízhatatlanná tehetik a kalibrálási eredményeket, például az elégtelen tapadás az asztalon. A tapadást az asztal lemosásával vagy ragasztó felvitelével javíthatod. Erről további információt a wikiben találsz.\n" "\n" "Tesztjeinkben a kalibrálási eredmények körülbelül 10 százalékos ingadozást mutattak, ezért előfordulhat, hogy az eredmény nem lesz pontosan ugyanaz minden egyes kalibrálásnál. A kiváltó ok feltárásán még dolgozunk, hogy a jövőbeni frissítésekkel javíthassunk rajta." @@ -18512,7 +18514,7 @@ msgid "Please find the best object on your plate" msgstr "Keresd meg a legjobb tárgyat a tálcán" msgid "Fill in the value above the block with smoothest top surface" -msgstr "Töltsd ki az értéket a legsimább felső felületű blokkból" +msgstr "Írd be a legsimább felső felületű blokk fölötti értéket" msgid "Skip Calibration2" msgstr "Kalibrálás 2 kihagyása" @@ -18540,7 +18542,7 @@ msgid "Title" msgstr "Cím" msgid "A test model will be printed. Please clear the build plate and place it back to the hot bed before calibration." -msgstr "Egy tesztmodell kerül kinyomtatásra. Kérlek, tisztítsd meg a tálcát, és helyezd vissza az asztalra a kalibrálás előtt." +msgstr "A rendszer egy tesztmodellt nyomtat. A kalibrálás előtt tisztítsd meg a tálcát, majd helyezd vissza a fűtött asztalra." msgid "Printing Parameters" msgstr "Nyomtatási paraméterek" @@ -18611,7 +18613,7 @@ msgid "Step value" msgstr "Lépésérték" msgid "The nozzle diameter has been synchronized from the printer Settings" -msgstr "A fúvóka átmérője a nyomtató beállításaiból került szinkronizálásra" +msgstr "A fúvóka átmérőjét a nyomtató beállításai alapján szinkronizáltuk" msgid "From Volumetric Speed" msgstr "Ettől a volumetrikus sebességtől" @@ -18635,11 +18637,11 @@ msgid "Success to get history result" msgstr "Előzmények sikeresen lekérdezve" msgid "Refreshing the previous Flow Dynamics Calibration records" -msgstr "Az előző anyagáramlás-dinamikai kalibrációs rekordok frissítése" +msgstr "A korábbi áramlásdinamika-kalibrálási eredmények frissítése" #, c-format, boost-format msgid "Note: The hotend number on the %s is tied to the holder. When the hotend is moved to a new holder, its number will update automatically." -msgstr "Megjegyzés: A hotend száma a tartóhoz van rendelve ezen: %s. Amikor a hotendet áthelyezed egy új tartóra, a száma automatikusan frissül." +msgstr "Megjegyzés: a fejegység száma ezen a helyen van a tartóhoz rendelve: %s. Amikor a fejegységet áthelyezed egy másik tartóra, a száma automatikusan frissül." msgid "Action" msgstr "Művelet" @@ -18735,7 +18737,7 @@ msgid "Start PA: " msgstr "Kezdő PA: " msgid "End PA: " -msgstr "Befejező PA:" +msgstr "Befejező PA: " msgid "PA step: " msgstr "PA lépcső: " @@ -18763,8 +18765,8 @@ msgid "" msgstr "" "Kérlek, adj meg érvényes értékeket:\n" "Kezdő PA: >= 0.0\n" -"Befejező PA: > Start PA\n" -"PA lépcső: >= 0.001)" +"Befejező PA: > Kezdő PA\n" +"PA lépcső: >= 0.001" msgid "" "Acceleration values must be greater than speed values.\n" @@ -18923,7 +18925,7 @@ msgid "Start retraction length: " msgstr "Kezdő visszahúzás hossza: " msgid "End retraction length: " -msgstr "Befejező visszahúzási hossz:" +msgstr "Befejező visszahúzási hossz: " msgid "Input shaping Frequency test" msgstr "Rezgéskompenzáció frekvencia teszt" @@ -18938,7 +18940,7 @@ msgid "Fast Tower" msgstr "Gyors torony" msgid "Please ensure the selected type is compatible with your firmware version." -msgstr "Kérjük, győződj meg róla, hogy a kiválasztott típus kompatibilis a firmware verziójával." +msgstr "Kérlek, győződj meg róla, hogy a kiválasztott típus kompatibilis a firmware-verzióval." msgid "" "Marlin version => 2.1.2\n" @@ -18954,7 +18956,7 @@ msgid "" "RepRap firmware version => 3.4.0\n" "Check your firmware documentation for supported shaper types." msgstr "" -"RepRap firmware verzió => 3.4.0\n" +"RepRap firmware-verzió => 3.4.0\n" "Ellenőrizd a firmware dokumentációját a támogatott rezgéskompenzátor-típusokhoz." msgid "Frequency (Start / End): " @@ -19128,7 +19130,7 @@ msgid "Leveling before print" msgstr "Szintezés nyomtatás előtt" msgid "Time-lapse" -msgstr "Időzített felvétel" +msgstr "Timelapse" # AI Translated msgid "Enable IFS" @@ -19209,16 +19211,16 @@ msgid "Error uploading to print host" msgstr "Hiba a nyomtatási gazdagépre történő feltöltéskor" msgid "The selected bed type does not match the file. Please confirm before starting the print." -msgstr "A kiválasztott tárgyasztaltípus nem egyezik a fájlban megadottal. A nyomtatás indítása előtt erősítsd meg." +msgstr "A kiválasztott asztaltípus nem egyezik a fájlban megadottal. A nyomtatás indítása előtt erősítsd meg." msgid "Heated Bed Leveling" -msgstr "Fűtött tárgyasztal szintezése" +msgstr "Fűtött asztal szintezése" msgid "Textured Build Plate (Side A)" -msgstr "Texturált tárgyasztal (A oldal)" +msgstr "Texturált asztal (A oldal)" msgid "Smooth Build Plate (Side B)" -msgstr "Sima tárgyasztal (B oldal)" +msgstr "Sima asztal (B oldal)" # AI Translated #, c-format, boost-format @@ -19318,7 +19320,7 @@ msgid "Create Based on Current Filament" msgstr "Létrehozás a jelenlegi filament alapján" msgid "Copy Current Filament Preset " -msgstr "Jelenlegi filamentbeállítás másolása" +msgstr "Jelenlegi filamentbeállítás másolása " msgid "Basic Information" msgstr "Alapinformációk" @@ -19368,7 +19370,7 @@ msgid "\"Bambu\" or \"Generic\" cannot be used as a Vendor for custom filaments. msgstr "A \"Bambu\" vagy \"Generic\" nem használható gyártóként egyedi filamentek esetében." msgid "Filament type is not selected, please reselect type." -msgstr "A filament típusa nem lett kiválasztva, kérlek, válaszd ki a típust." +msgstr "Nincs kiválasztva filamenttípus. Kérlek, válassz egyet." # AI Translated msgid "Filament serial missing; please input serial." @@ -19459,20 +19461,20 @@ msgid "Printable Space" msgstr "Nyomtatási terület" msgid "Hot Bed STL" -msgstr "Tárgyasztal STL" +msgstr "Asztal STL-fájlja" msgid "Hot Bed SVG" -msgstr "Tárgyasztal SVG" +msgstr "Asztal SVG-fájlja" msgid "Max Print Height" msgstr "Maximális nyomtatási magasság" #, c-format, boost-format msgid "The file exceeds %d MB, please import again." -msgstr "A fájl mérete meghaladja a(z) %d MB-ot, kérlek ismételd meg az importálást." +msgstr "A fájl mérete meghaladja a(z) %d MB-ot. Kérlek, importáld újra." msgid "Exception in obtaining file size, please import again." -msgstr "Kivétel történt a fájlméret megállapításakor, kérlek ismételd meg az importálást." +msgstr "Nem sikerült megállapítani a fájl méretét. Kérlek, importáld újra." msgid "Preset path was not found; please reselect vendor." msgstr "Útvonal nem található. Kérlek, válaszd ki újra a gyártót." @@ -19498,7 +19500,7 @@ msgid "Process Preset Template" msgstr "Folyamatbeállítás sablon" msgid "You have not yet chosen which printer preset to create based on. Please choose the vendor and model of the printer" -msgstr "Még nem választottad ki, hogy melyik nyomtató beállításai alapján készüljön az új. Kérlek, válaszd ki a nyomtató gyártóját és modelljét" +msgstr "Még nem választottad ki, hogy melyik nyomtatóbeállítás alapján készüljön az új. Kérlek, válaszd ki a nyomtató gyártóját és modelljét" msgid "You have entered a disallowed character in the printable area section on the first page. Please use only numbers." msgstr "Tiltott karakter került be az első oldalon a nyomtatási terület részbe. Kérlek, csak számokat használj." @@ -19587,7 +19589,7 @@ msgid "Printer Created" msgstr "Nyomtató létrehozva" msgid "Please go to printer settings to edit your presets" -msgstr "Kérlek, a beállítások szerkesztéséhez lépj be a nyomtató beállításaiba." +msgstr "Kérlek, a beállítások szerkesztéséhez nyisd meg a nyomtatóbeállításokat." msgid "Filament Created" msgstr "Filament létrehozva" @@ -19598,7 +19600,7 @@ msgid "" "Please note that nozzle temperature, hot bed temperature, and maximum volumetric speed each have a significant impact on printing quality. Please set them carefully." msgstr "" "Ha szükséges, lépj be a filamentbeállításokhoz az értékek szerkesztéséhez.\n" -"Figyelem: a fúvóka hőmérséklete, a tárgyasztal hőmérséklete és a maximális volumetrikus sebesség jelentős hatással van a nyomtatási minőségre. Kérlek, körültekintően állítsd be őket." +"Figyelem: a fúvóka és az asztal hőmérséklete, valamint a maximális volumetrikus sebesség jelentős hatással van a nyomtatási minőségre. Kérlek, körültekintően állítsd be őket." msgid "" "\n" @@ -19692,12 +19694,16 @@ msgstr "Csak azok a nyomtatónevek jelennek meg, amelyekhez tartoznak felhaszná msgid "" "Only the filament names with user filament presets will be displayed, \n" "and all user filament presets in each filament name you select will be exported as a zip." -msgstr "Csak azok a nyomtatónevek jelennek meg, amelyekhez tartoznak felhasználói beállítások. A kiválasztott beállítások ZIP fájlként kerülnek exportálásra." +msgstr "" +"Csak azok a filamentnevek jelennek meg, amelyekhez tartoznak felhasználói filamentbeállítások,\n" +"és a kiválasztott filamentnevekhez tartozó összes felhasználói filamentbeállítás ZIP-fájlként lesz exportálva." msgid "" "Only printer names with changed process presets will be displayed, \n" "and all user process presets in each printer name you select will be exported as a zip." -msgstr "Csak azok a nyomtatónevek jelennek meg, amelyeknél változtak a folyamatbeállítások. A kiválasztott beállítások ZIP fájlként kerülnek exportálásra." +msgstr "" +"Csak azok a nyomtatónevek jelennek meg, amelyekhez módosított folyamatbeállítások tartoznak,\n" +"és a kiválasztott nyomtatónevekhez tartozó összes felhasználói folyamatbeállítás ZIP-fájlként lesz exportálva." msgid "Please select at least one printer or filament." msgstr "Kérlek, válassz ki legalább egy nyomtatót vagy filamentet." @@ -19722,8 +19728,8 @@ msgstr "A más beállítások által örökölt beállítások nem törölhetők msgid "The following presets inherits this preset." msgid_plural "The following preset inherits this preset." -msgstr[0] "A következő profilok öröklik ezt a profilt." -msgstr[1] "A következő profil örökli ezt a profilt." +msgstr[0] "A következő profil örökli ezt a profilt." +msgstr[1] "A következő profilok öröklik ezt a profilt." msgid "Delete Preset" msgstr "Beállítás törlése" @@ -19842,7 +19848,7 @@ msgid "Print Host upload" msgstr "Feltöltés a nyomtatóra" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." -msgstr "Válaszd ki a nyomtatókommunikációhoz használt hálózati ügynök implementációját. Az elérhető ügynökök indításkor kerülnek regisztrálásra." +msgstr "Válaszd ki a nyomtatóval való kommunikációhoz használt hálózati ügynököt. Az elérhető ügynököket indításkor regisztrálja a rendszer." # AI Translated msgid "Select a Flashforge printer" @@ -19875,7 +19881,7 @@ msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self msgstr "A HTTPS CA-fájl nem kötelező. Csak akkor szükséges, ha a HTTPS-t saját aláírású tanúsítvánnyal használod." msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -msgstr "Tanúsítványfájlok (*.crt, *.pem) |*.crt; *.pem|Minden fájl|* . *" +msgstr "Tanúsítványfájlok (*.crt, *.pem)|*.crt;*.pem|Minden fájl|*.*" msgid "Open CA certificate file" msgstr "CA tanúsítványfájl megnyitása" @@ -19911,12 +19917,12 @@ msgstr "K-sorozatú nyomtatók keresése a LAN-on... ez néhány másodpercet ve # AI Translated msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again." -msgstr "Nem található K-sorozatú nyomtató. Győződj meg róla, hogy a nyomtató ugyanazon a hálózaton van, és nem blokkolja a Wi-Fi kliensizoláció, majd kattints újra a Keresés gombra." +msgstr "Nem található K-sorozatú nyomtató. Győződj meg róla, hogy a nyomtató ugyanazon a hálózaton van és nem blokkolja a Wi-Fi kliensizoláció, majd kattints újra a Keresés gombra." # AI Translated #, c-format msgid "Found %zu Creality printer(s). Select one and click Use Selected." -msgstr "%zu Creality nyomtató található. Válassz ki egyet, és kattints a Kijelölt használata gombra." +msgstr "%zu Creality nyomtató található. Válassz ki egyet, majd kattints a Kijelölt használata gombra." # AI Translated msgid "Active" @@ -20020,7 +20026,7 @@ msgstr "Kérlek, győződj meg róla, hogy az OrcaSlicer egyetlen példánya sem # AI Translated msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again." -msgstr "A rendszermappa nem törölhető, mert néhány fájlt egy másik alkalmazás használ. Kérlek, zárd be az ezeket a fájlokat használó alkalmazásokat, és próbáld újra." +msgstr "A rendszermappa nem törölhető, mert néhány fájlt egy másik alkalmazás használ. Zárd be az ezeket a fájlokat használó alkalmazásokat, majd próbáld újra." # AI Translated msgid "Failed to delete system folder..." @@ -20255,7 +20261,7 @@ msgid "It has a small layer height. This results in almost negligible layer line msgstr "Kis rétegmagassággal rendelkezik. Ennek eredményeként a rétegvonalak szinte elhanyagolhatók, a nyomtatási minőség pedig magas. A legtöbb nyomtatási esethez megfelelő." msgid "Compared with the default profile of a 0.2 mm nozzle, it has lower speeds and acceleration, and the sparse infill pattern is Gyroid. This results in much higher print quality but a much longer print time." -msgstr "A 0.2 mm-es fúvóka alapértelmezett profiljához képest alacsonyabb sebességekkel és gyorsulással dolgozik, a ritkás kitöltés mintázata pedig Gyroid. Ez jóval magasabb nyomtatási minőséget, de sokkal hosszabb nyomtatási időt eredményez." +msgstr "A 0,2 mm-es fúvóka alapértelmezett profiljához képest alacsonyabb sebességeket és gyorsulást használ, a kitöltési mintázat pedig Gyroid. Ez jóval jobb nyomtatási minőséget, de sokkal hosszabb nyomtatási időt eredményez." msgid "Compared with the default profile of a 0.2 mm nozzle, it has a slightly bigger layer height. This results in almost negligible layer lines and slightly shorter print time." msgstr "A 0.2 mm-es fúvóka alapértelmezett profiljához képest kissé nagyobb rétegmagassággal rendelkezik. Ennek eredményeként a rétegvonalak szinte elhanyagolhatók, a nyomtatási idő pedig kissé rövidebb." @@ -20267,19 +20273,19 @@ msgid "Compared with the default profile of a 0.2 mm nozzle, it has a smaller la msgstr "A 0.2 mm-es fúvóka alapértelmezett profiljához képest kisebb rétegmagassággal rendelkezik. Ennek eredményeként a rétegvonalak szinte láthatatlanok, a nyomtatási minőség magasabb, de a nyomtatási idő hosszabb." msgid "Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer lines, lower speeds and acceleration, and the sparse infill pattern is Gyroid. This results in almost invisible layer lines and much higher print quality but much longer print time." -msgstr "A 0.2 mm-es fúvóka alapértelmezett profiljához képest kisebb rétegvonalakkal, alacsonyabb sebességekkel és gyorsulással dolgozik, a ritkás kitöltés mintázata pedig Gyroid. Ez szinte láthatatlan rétegvonalakat és sokkal magasabb nyomtatási minőséget, de jóval hosszabb nyomtatási időt eredményez." +msgstr "A 0,2 mm-es fúvóka alapértelmezett profiljához képest vékonyabb rétegvonalakat, alacsonyabb sebességeket és gyorsulást használ, a kitöltési mintázat pedig Gyroid. Ez szinte láthatatlan rétegvonalakat és sokkal jobb nyomtatási minőséget, de jóval hosszabb nyomtatási időt eredményez." msgid "Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer height. This results in minimal layer lines and higher print quality but longer print time." msgstr "A 0.2 mm-es fúvóka alapértelmezett profiljához képest kisebb rétegmagassággal rendelkezik. Ennek eredményeként minimálisak a rétegvonalak, a nyomtatási minőség magasabb, de a nyomtatási idő hosszabb." msgid "Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer lines, lower speeds and acceleration, and the sparse infill pattern is Gyroid. This results in minimal layer lines and much higher print quality but much longer print time." -msgstr "A 0.2 mm-es fúvóka alapértelmezett profiljához képest kisebb rétegvonalakkal, alacsonyabb sebességekkel és gyorsulással dolgozik, a ritkás kitöltés mintázata pedig Gyroid. Ez minimális rétegvonalakat és sokkal magasabb nyomtatási minőséget, de jóval hosszabb nyomtatási időt eredményez." +msgstr "A 0,2 mm-es fúvóka alapértelmezett profiljához képest vékonyabb rétegvonalakat, alacsonyabb sebességeket és gyorsulást használ, a kitöltési mintázat pedig Gyroid. Ez alig látható rétegvonalakat és sokkal jobb nyomtatási minőséget, de jóval hosszabb nyomtatási időt eredményez." msgid "It has a normal layer height. This results in average layer lines and print quality. It is suitable for most printing cases." msgstr "Normál rétegmagassággal rendelkezik. Ennek eredményeként átlagos rétegvonalak és nyomtatási minőség érhető el. A legtöbb nyomtatási esethez megfelelő." msgid "Compared with the default profile of a 0.4 mm nozzle, it has more wall loops and a higher sparse infill density. This results in higher print strength but more filament consumption and longer print time." -msgstr "A 0.4 mm-es fúvóka alapértelmezett profiljához képest több falhurokkal és nagyobb ritkás kitöltési sűrűséggel rendelkezik. Ez nagyobb nyomatszilárdságot, de több filamentfelhasználást és hosszabb nyomtatási időt eredményez." +msgstr "A 0,4 mm-es fúvóka alapértelmezett profiljához képest több falhurkot és nagyobb kitöltési sűrűséget használ. Ez nagyobb nyomatszilárdságot, de több filamentfelhasználást és hosszabb nyomtatási időt eredményez." msgid "Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer height. This results in more apparent layer lines and lower print quality, but slightly shorter print time." msgstr "A 0.4 mm-es fúvóka alapértelmezett profiljához képest nagyobb rétegmagassággal rendelkezik. Ennek eredményeként a rétegvonalak jobban láthatók, a nyomtatási minőség alacsonyabb, de a nyomtatási idő kissé rövidebb." @@ -20291,13 +20297,13 @@ msgid "Compared with the default profile of a 0.4 mm nozzle, it has a smaller la msgstr "A 0.4 mm-es fúvóka alapértelmezett profiljához képest kisebb rétegmagassággal rendelkezik. Ennek eredményeként a rétegvonalak kevésbé láthatók, a nyomtatási minőség magasabb, de a nyomtatási idő hosszabb." msgid "Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height, lower speeds and acceleration, and the sparse infill pattern is Gyroid. This results in less apparent layer lines and much higher print quality but much longer print time." -msgstr "A 0.4 mm-es fúvóka alapértelmezett profiljához képest kisebb rétegmagassággal, alacsonyabb sebességekkel és gyorsulással dolgozik, a ritkás kitöltés mintázata pedig Gyroid. Ez kevésbé látható rétegvonalakat és sokkal magasabb nyomtatási minőséget, de jóval hosszabb nyomtatási időt eredményez." +msgstr "A 0,4 mm-es fúvóka alapértelmezett profiljához képest kisebb rétegmagasságot, alacsonyabb sebességeket és gyorsulást használ, a kitöltési mintázat pedig Gyroid. Ez kevésbé látható rétegvonalakat és sokkal jobb nyomtatási minőséget, de jóval hosszabb nyomtatási időt eredményez." msgid "Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height. This results in almost negligible layer lines and higher print quality but longer print time." msgstr "A 0.4 mm-es fúvóka alapértelmezett profiljához képest kisebb rétegmagassággal rendelkezik. Ennek eredményeként a rétegvonalak szinte elhanyagolhatók, a nyomtatási minőség magasabb, de a nyomtatási idő hosszabb." msgid "Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height, lower speeds and acceleration, and the sparse infill pattern is Gyroid. This results in almost negligible layer lines and much higher print quality but much longer print time." -msgstr "A 0.4 mm-es fúvóka alapértelmezett profiljához képest kisebb rétegmagassággal, alacsonyabb sebességekkel és gyorsulással dolgozik, a ritkás kitöltés mintázata pedig Gyroid. Ez szinte elhanyagolható rétegvonalakat és sokkal magasabb nyomtatási minőséget, de jóval hosszabb nyomtatási időt eredményez." +msgstr "A 0,4 mm-es fúvóka alapértelmezett profiljához képest kisebb rétegmagasságot, alacsonyabb sebességeket és gyorsulást használ, a kitöltési mintázat pedig Gyroid. Ez alig látható rétegvonalakat és sokkal jobb nyomtatási minőséget, de jóval hosszabb nyomtatási időt eredményez." msgid "Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height. This results in almost negligible layer lines and longer print time." msgstr "A 0.4 mm-es fúvóka alapértelmezett profiljához képest kisebb rétegmagassággal rendelkezik. Ennek eredményeként a rétegvonalak szinte elhanyagolhatók, de a nyomtatási idő hosszabb." @@ -20306,7 +20312,7 @@ msgid "It has a big layer height. This results in apparent layer lines and ordin msgstr "Nagy rétegmagassággal rendelkezik. Ennek eredményeként jól látható rétegvonalak, átlagos nyomtatási minőség és átlagos nyomtatási idő várható." msgid "Compared with the default profile of a 0.6 mm nozzle, it has more wall loops and a higher sparse infill density. This results in higher print strength but more filament consumption and longer print time." -msgstr "A 0.6 mm-es fúvóka alapértelmezett profiljához képest több falhurokkal és nagyobb ritkás kitöltési sűrűséggel rendelkezik. Ez nagyobb nyomatszilárdságot, de több filamentfelhasználást és hosszabb nyomtatási időt eredményez." +msgstr "A 0,6 mm-es fúvóka alapértelmezett profiljához képest több falhurkot és nagyobb kitöltési sűrűséget használ. Ez nagyobb nyomatszilárdságot, de több filamentfelhasználást és hosszabb nyomtatási időt eredményez." msgid "Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer height. This results in more apparent layer lines and lower print quality, but shorter print time in some cases." msgstr "A 0.6 mm-es fúvóka alapértelmezett profiljához képest nagyobb rétegmagassággal rendelkezik. Ennek eredményeként a rétegvonalak jobban láthatók, a nyomtatási minőség alacsonyabb, de bizonyos esetekben a nyomtatási idő rövidebb." @@ -20336,7 +20342,7 @@ msgid "Compared with the default profile of a 0.8 mm nozzle, it has a smaller la msgstr "A 0.8 mm-es fúvóka alapértelmezett profiljához képest kisebb rétegmagassággal rendelkezik. Ennek eredményeként a rétegvonalak kevésbé, de továbbra is jól láthatók, a nyomtatási minőség kissé magasabb, de bizonyos esetekben a nyomtatási idő hosszabb." msgid "This is neither a commonly used filament, nor one of Bambu filaments, and it varies a lot from brand to brand. So, it's highly recommended to ask its vendor for suitable profile before printing and adjust some parameters according to its performances." -msgstr "Ez sem nem egy gyakran használt filament, sem nem tartozik a Bambu filamentek közé, ráadásul márkánként jelentősen eltérhet. Ezért nyomtatás előtt erősen ajánlott a gyártótól megfelelő profilt kérni, és a paramétereket a filament viselkedése alapján finomhangolni." +msgstr "Ez a filament nem gyakran használt, és nem is Bambu-filament, ráadásul márkánként jelentősen eltérhet. Ezért nyomtatás előtt erősen ajánlott a gyártótól megfelelő profilt kérni, majd a paramétereket a filament viselkedése alapján finomhangolni." msgid "When printing this filament, there's a risk of warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials." msgstr "Ennek a filamentnek a nyomtatásakor fennáll a kunkorodás és az alacsony rétegtapadási szilárdság kockázata. A jobb eredmény érdekében nézd meg ezt a wikit: Nyomtatási tippek magas hőmérsékletű / műszaki anyagokhoz." @@ -20565,10 +20571,10 @@ msgid "Generates filament grouping for the left and right nozzles based on the m msgstr "A bal és jobb fúvókához olyan filamentcsoportosítást hoz létre, amely a leginkább filamenttakarékos elveket követi a hulladék minimalizálása érdekében." msgid "Generates filament grouping for the left and right nozzles based on the printer's actual filament status, reducing the need for manual filament adjustment." -msgstr "A bal és jobb fúvókához a nyomtató tényleges filamentállapota alapján hoz létre filamentcsoportosítást, csökkentve a manuális filamentbeállítás szükségességét." +msgstr "A nyomtatóban ténylegesen betöltött filamentek alapján csoportosítja a filamenteket a bal és jobb fúvókához, így kevesebb kézi beállításra van szükség." msgid "Manually assign filament to the left or right nozzle" -msgstr "Filament manuális hozzárendelése a bal vagy jobb fúvókához" +msgstr "Filament kézi hozzárendelése a bal vagy jobb fúvókához" msgid "Global settings" msgstr "Globális beállítások" @@ -20699,7 +20705,7 @@ msgstr "A feltöltés sikertelen" # AI Translated msgid "The file has been transferred, but some unknown errors occurred. Please check the device page for the file and try to start printing again." -msgstr "A fájl átvitele megtörtént, de ismeretlen hibák léptek fel. Kérlek, ellenőrizd a fájlt az eszköz oldalán, és próbáld újra elindítani a nyomtatást." +msgstr "A fájl átvitele befejeződött, de ismeretlen hiba történt. Ellenőrizd a fájlt az Eszköz oldalon, majd próbáld újra elindítani a nyomtatást." # AI Translated msgid "Failed to open file for upload." @@ -20727,23 +20733,23 @@ msgstr "A hibakód nem található" # AI Translated msgid "The printer is busy, please check the device page for the file and try to start printing again." -msgstr "A nyomtató foglalt, kérlek, ellenőrizd a fájlt az eszköz oldalán, és próbáld újra elindítani a nyomtatást." +msgstr "A nyomtató foglalt. Ellenőrizd a fájlt az Eszköz oldalon, majd próbáld újra elindítani a nyomtatást." # AI Translated msgid "The file is lost, please check and try again." -msgstr "A fájl elveszett, kérlek, ellenőrizd, és próbáld újra." +msgstr "A fájl nem található. Ellenőrizd, majd próbáld újra." # AI Translated msgid "The file is corrupted, please check and try again." -msgstr "A fájl sérült, kérlek, ellenőrizd, és próbáld újra." +msgstr "A fájl sérült. Ellenőrizd, majd próbáld újra." # AI Translated msgid "Transmission abnormality, please check and try again." -msgstr "Átviteli rendellenesség, kérlek, ellenőrizd, és próbáld újra." +msgstr "Átviteli hiba történt. Ellenőrizd, majd próbáld újra." # AI Translated msgid "The file does not match the printer, please check and try again." -msgstr "A fájl nem felel meg a nyomtatónak, kérlek, ellenőrizd, és próbáld újra." +msgstr "A fájl nem kompatibilis a nyomtatóval. Ellenőrizd, majd próbáld újra." # AI Translated msgid "Start print timeout" @@ -20767,7 +20773,7 @@ msgstr "A kapcsolat időtúllépés miatt megszakadt. Kérlek, ellenőrizd, hogy # AI Translated msgid "The Hostname/IP/URL could not be parsed, please check it and try again." -msgstr "A gépnév/IP/URL nem értelmezhető, kérlek, ellenőrizd, és próbáld újra." +msgstr "A gépnév/IP-cím/URL nem értelmezhető. Ellenőrizd, majd próbáld újra." # AI Translated msgid "File/data transfer interrupted. Please check the printer and network, then try it again." @@ -20807,27 +20813,27 @@ msgid "Add or Select" msgstr "Hozzáadás vagy kiválasztás" msgid "Warning: The brim type is not set to \"painted\", the brim ears will not take effect!" -msgstr "Figyelmeztetés: A karimatípus nincs \"festett\" értékre állítva, ezért a karimafülek nem fognak érvényesülni!" +msgstr "Figyelmeztetés: a perem típusa nincs \"festett\" értékre állítva, ezért a peremfülek nem fognak érvényesülni!" msgid "Set the brim type of this object to \"painted\"" -msgstr "Ennek az objektumnak a karimatípusát állítsd \"festett\" értékre" +msgstr "Állítsd ennek az objektumnak a peremtípusát \"festett\" értékre" msgid "invalid brim ears" msgstr "érvénytelen peremfülek" msgid "Brim Ears" -msgstr "Karimás Fülek" +msgstr "Peremfülek" msgid "Please select single object." msgstr "Válassz ki egyetlen objektumot." # AI Translated msgid "Entering Brim Ears" -msgstr "Belépés a karimás fülek módba" +msgstr "Belépés a peremfülek módba" # AI Translated msgid "Leaving Brim Ears" -msgstr "Kilépés a karimás fülek módból" +msgstr "Kilépés a peremfülek módból" msgid "Zoom Out" msgstr "Kicsinyítés" @@ -20978,7 +20984,7 @@ msgid "Number of triangular facets" msgstr "Háromszögfelületek száma" msgid "Calculating, please wait..." -msgstr "Számítás folyamatban, kérlek várj..." +msgstr "Számítás folyamatban, kérlek, várj..." # AI Translated msgid "Save these settings as default" @@ -21199,7 +21205,7 @@ msgstr "Filament az AMS kimenetében" # AI Translated msgid " The high drying temperature may cause AMS blockage, please unload first." -msgstr " A magas szárítási hőmérséklet eltömítheti az AMS-t, kérlek, előbb töltsd ki a filamentet." +msgstr " A magas szárítási hőmérséklet eltömítheti az AMS-t, ezért kérlek, előbb vedd ki a filamentet." # AI Translated msgid "Initiating AMS drying" @@ -21227,7 +21233,7 @@ msgstr " Kérlek, csatlakoztasd a tápellátást, majd használd a szárítási # AI Translated msgid " The high drying temperature may cause AMS blockage. Please unload the filament manually before proceeding." -msgstr " A magas szárítási hőmérséklet eltömítheti az AMS-t. Kérlek, a folytatás előtt töltsd ki kézzel a filamentet." +msgstr " A magas szárítási hőmérséklet eltömítheti az AMS-t. Kérlek, a folytatás előtt kézzel vedd ki a filamentet." # AI Translated msgid "System is busy" @@ -21286,19 +21292,19 @@ msgid "Starting: Checking air vent" msgstr "Indítás: levegőkifúvás ellenőrzése" msgid "The filament may not be compatible with the current machine settings. Generic filament presets will be used." -msgstr "Előfordulhat, hogy a filament nem kompatibilis az aktuális gépbeállításokkal. Általános filamentbeállítások lesznek használva." +msgstr "Előfordulhat, hogy a filament nem kompatibilis a jelenlegi gépbeállításokkal. Általános filamentbeállításokat használ." msgid "The filament model is unknown. Still using the previous filament preset." msgstr "A filament modellje ismeretlen. A korábbi filamentbeállítás marad használatban." msgid "The filament model is unknown. Generic filament presets will be used." -msgstr "A filament modellje ismeretlen. Általános filamentbeállítások lesznek használva." +msgstr "A filament modellje ismeretlen. Általános filamentbeállításokat használ." msgid "The filament may not be compatible with the current machine settings. A random filament preset will be used." -msgstr "Előfordulhat, hogy a filament nem kompatibilis az aktuális gépbeállításokkal. Egy véletlenszerű filamentbeállítás lesz használva." +msgstr "Előfordulhat, hogy a filament nem kompatibilis a jelenlegi gépbeállításokkal. Egy véletlenszerű filamentbeállítást használ." msgid "The filament model is unknown. A random filament preset will be used." -msgstr "A filament modellje ismeretlen. Egy véletlenszerű filamentbeállítás lesz használva." +msgstr "A filament modellje ismeretlen. Egy véletlenszerű filamentbeállítást használ." #: resources/data/hints.ini: [hint:Precise wall] msgid "" @@ -21401,8 +21407,8 @@ msgid "" "Timelapse\n" "Did you know that you can generate a timelapse video during each print?" msgstr "" -"Időfelvétel\n" -"Tudtad, hogy minden nyomtatáshoz időfelvétel-videót készíthetsz?" +"Timelapse\n" +"Tudtad, hogy minden nyomtatásról Timelapse-videót készíthetsz?" #: resources/data/hints.ini: [hint:Auto-Arrange] msgid "" @@ -21417,8 +21423,8 @@ msgid "" "Auto-Orient\n" "Did you know that you can rotate objects to an optimal orientation for printing with a simple click?" msgstr "" -"Automatikus orientáció\n" -"Tudtad, hogy az objektumokat egy kattintással elforgathatod a nyomtatáshoz optimális orientációba?" +"Automatikus tájolás\n" +"Tudtad, hogy az objektumokat egyetlen kattintással a nyomtatáshoz optimális helyzetbe forgathatod?" #: resources/data/hints.ini: [hint:Lay on Face] msgid "" @@ -21426,8 +21432,7 @@ msgid "" "Did you know that you can quickly orient a model so that one of its faces sits on the print bed? Select the \"Place on face\" function or press the F key." msgstr "" "Felületre fektetés\n" -"Tudtad, hogy a modellt egyszerűen elforgathatod úgy, hogy az egyik oldala az asztalra kerüljön? Válaszd a \"Felületre fektetés\" opciót, vagy csak nyomd meg az F gombot.\n" -" " +"Tudtad, hogy a modellt egyszerűen elforgathatod úgy, hogy az egyik oldala az asztalra kerüljön? Válaszd a \"Felületre fektetés\" opciót, vagy csak nyomd meg az F gombot." #: resources/data/hints.ini: [hint:Object List] msgid "" @@ -21600,7 +21605,7 @@ msgid "" "Did you know that when printing materials that are prone to warping such as ABS, appropriately increasing the heatbed temperature can reduce the probability of warping?" msgstr "" "Kunkorodás elkerülése\n" -"Tudtad, hogy a kunkorodásra hajlamos anyagok (például ABS) nyomtatásakor a tárgyasztal hőmérsékletének növelése csökkentheti a kunkorodás valószínűségét?" +"Tudtad, hogy a kunkorodásra hajlamos anyagok (például ABS) nyomtatásakor az asztal hőmérsékletének növelése csökkentheti a kunkorodás valószínűségét?" #~ msgid "Print order within a single layer." #~ msgstr "Nyomtatási sorrend egyetlen rétegen belül." From e01ac1f0a6ebbb2a18a5fd385babedab80e5f464 Mon Sep 17 00:00:00 2001 From: Ian Chua Date: Fri, 31 Jul 2026 14:15:22 +0800 Subject: [PATCH 027/106] fix: keep orphaned cloud plugins runnable (#14859) * fix: keep orphaned cloud plugins runnable * fix: tests --- resources/web/dialog/PluginsDialog/index.js | 19 ++++++--- resources/web/dialog/PluginsDialog/styles.css | 14 +++++++ src/slic3r/GUI/PluginSource.hpp | 2 + src/slic3r/GUI/PluginsDialog.cpp | 23 +++++++---- src/slic3r/plugin/PluginDescriptor.hpp | 3 ++ src/slic3r/plugin/PluginManager.cpp | 35 ++++++++++------ .../test_plugin_cloud_metadata.cpp | 40 +++++++++++++++++++ 7 files changed, 111 insertions(+), 25 deletions(-) diff --git a/resources/web/dialog/PluginsDialog/index.js b/resources/web/dialog/PluginsDialog/index.js index ea081a23aa..ad1242e4f9 100644 --- a/resources/web/dialog/PluginsDialog/index.js +++ b/resources/web/dialog/PluginsDialog/index.js @@ -602,15 +602,17 @@ function SourceLabel(source) { return "Mine"; case "subscribed": return "Subscribed"; + case "orphaned": + return "Orphaned"; default: return "Local"; } } -// Shared Local/Subscribed/Mine pill, used both after the row name and in the info panel. +// Shared source pill, used both after the row name and in the info panel. function SourceBadge(source) { const normalized = String(source || "").toLowerCase(); - const variant = (normalized === "mine" || normalized === "subscribed") ? normalized : "local"; + const variant = (normalized === "mine" || normalized === "subscribed" || normalized === "orphaned") ? normalized : "local"; const badge = document.createElement("span"); badge.className = `plugin-source-badge source-${variant}`; badge.textContent = SourceLabel(source); @@ -654,7 +656,7 @@ function LabelCell(plugin, isExpanded = false, capabilityCount = 0, nameRanges = const labelCell = document.createElement("span"); labelCell.className = "label-cell"; - const hasCloudLink = plugin.source === "mine" || plugin.source === "subscribed"; + const hasCloudLink = plugin.source === "mine" || plugin.source === "subscribed" || plugin.source === "orphaned"; const pluginLabelText = plugin.label || plugin.name || plugin.plugin_id || ""; const canExpand = capabilityCount > 0; @@ -705,7 +707,7 @@ function LabelCell(plugin, isExpanded = false, capabilityCount = 0, nameRanges = function SourceCell(plugin) { const cell = document.createElement("span"); const normalized = String(plugin.source || "").toLowerCase(); - const variant = (normalized === "mine" || normalized === "subscribed") ? normalized : "local"; + const variant = (normalized === "mine" || normalized === "subscribed" || normalized === "orphaned") ? normalized : "local"; cell.className = `source-cell source-${variant}`; const sourceLabel = document.createElement("span"); @@ -1233,7 +1235,7 @@ function RenderDescription(plugin) { return; } - const isCloud = plugin && (plugin.source === "mine" || plugin.source === "subscribed"); + const isCloud = plugin && (plugin.source === "mine" || plugin.source === "subscribed" || plugin.source === "orphaned"); if (isCloud && String(plugin?.sharing_token || "")) { node.appendChild(document.createTextNode("View on OrcaCloud ")); const link = document.createElement("a"); @@ -1370,6 +1372,13 @@ function RenderDetailSummary(container, plugin) { message.textContent = errorText || StatusDescription(plugin); container.appendChild(message); + if (plugin.orphaned === true) { + const warning = document.createElement("div"); + warning.className = "detail-description detail-warning-text"; + warning.textContent = "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."; + container.appendChild(warning); + } + const updateStatus = GetUpdateStatus(plugin); if (updateStatus === "update_available") { const note = document.createElement("div"); diff --git a/resources/web/dialog/PluginsDialog/styles.css b/resources/web/dialog/PluginsDialog/styles.css index b1c3caa055..3d8c18be9e 100644 --- a/resources/web/dialog/PluginsDialog/styles.css +++ b/resources/web/dialog/PluginsDialog/styles.css @@ -251,6 +251,11 @@ body.pane-resizing { font-weight: 600; } +.source-cell.source-orphaned { + color: var(--plugin-status-warn); + font-weight: 600; +} + .source-cell.source-local { color: var(--plugin-source-neutral-text); } @@ -648,6 +653,10 @@ body.pane-resizing { color: var(--plugin-status-danger); } +.detail-warning-text { + color: var(--plugin-status-warn); +} + .detail-status-chip { display: inline-flex; align-items: center; @@ -915,6 +924,11 @@ body.pane-resizing { color: var(--plugin-source-subscribed-text); } +.plugin-source-badge.source-orphaned { + background: var(--plugin-status-warn-bg); + color: var(--plugin-status-warn); +} + .plugin-cloud-link { color: var(--plugin-link-text); cursor: pointer; diff --git a/src/slic3r/GUI/PluginSource.hpp b/src/slic3r/GUI/PluginSource.hpp index ee1464c8df..8742153c9e 100644 --- a/src/slic3r/GUI/PluginSource.hpp +++ b/src/slic3r/GUI/PluginSource.hpp @@ -11,6 +11,7 @@ namespace Slic3r // IMPORTANT: ordinal order is the Plugins dialog Source sort priority. Mine, Subscribed, + Orphaned, Local }; @@ -20,6 +21,7 @@ namespace Slic3r { case PluginSource::Mine: return "mine"; case PluginSource::Subscribed: return "subscribed"; + case PluginSource::Orphaned: return "orphaned"; case PluginSource::Local: return "local"; } diff --git a/src/slic3r/GUI/PluginsDialog.cpp b/src/slic3r/GUI/PluginsDialog.cpp index 23cf7a2648..c05d1839bc 100644 --- a/src/slic3r/GUI/PluginsDialog.cpp +++ b/src/slic3r/GUI/PluginsDialog.cpp @@ -103,6 +103,7 @@ struct PluginDialogItem bool loading = false; bool is_cloud_plugin = false; + bool orphaned = false; bool has_local_package = false; bool unauthorized = false; bool has_script_capability = false; @@ -246,6 +247,7 @@ nlohmann::json build_plugin_payload_item(const PluginDialogItem& dialog_item) payload_item["sharing_token"] = dialog_item.sharing_token; payload_item["thumbnail_url"] = dialog_item.thumbnail_url; payload_item["installed"] = dialog_item.has_local_package; + payload_item["orphaned"] = dialog_item.orphaned; payload_item["installed_version"] = dialog_item.installed_version; payload_item["latest_version"] = dialog_item.latest_version; return payload_item; @@ -268,7 +270,8 @@ PluginSource derive_plugin_source(const PluginDescriptor& descriptor) const bool is_cloud = descriptor.is_cloud_plugin(); const bool is_mine = is_cloud && has_cloud_meta && descriptor.cloud->is_mine; - // Source is ownership/locality only; issue states never replace this badge. + if (is_cloud && has_cloud_meta && descriptor.cloud->orphaned) + return PluginSource::Orphaned; if (is_mine) return PluginSource::Mine; if (is_cloud) @@ -281,11 +284,12 @@ PluginAvailableActions evaluate_action_policy(const PluginDialogItem& item) PluginAvailableActions available_actions; const bool is_loading = item.status == PluginStatus::Loading; const bool is_cloud = item.is_cloud_plugin; + const bool is_orphaned = item.orphaned; const bool is_mine = item.source == PluginSource::Mine; const bool has_local = item.has_local_package; const bool authorized_for_install = !item.unauthorized; - available_actions.toggle_installs_cloud_plugin = is_cloud && !has_local && authorized_for_install; + available_actions.toggle_installs_cloud_plugin = is_cloud && !is_orphaned && !has_local && authorized_for_install; available_actions.can_toggle = !is_loading && (has_local || available_actions.toggle_installs_cloud_plugin); auto add_action = [&available_actions](const char* id, const char* label, bool enabled = true, bool danger = false) { @@ -294,7 +298,7 @@ PluginAvailableActions evaluate_action_policy(const PluginDialogItem& item) // Owned cloud plugins fall through to the local delete: it removes the installed package only. // Deleting a plugin from the cloud is a plugin hub operation and is never offered here. - if (is_cloud && !is_mine) { + if (is_cloud && !is_orphaned && !is_mine) { add_action("unsubscribe_plugin", "Unsubscribe", true, true); } else if (has_local) { add_action("delete_plugin", "Delete", true, true); @@ -302,11 +306,13 @@ PluginAvailableActions evaluate_action_policy(const PluginDialogItem& item) add_action("open_folder", "Show in folder", has_local); - if (is_cloud) { - add_action("reinstall_plugin", "Reinstall"); - } else { - add_action("reload_plugin", "Reload"); - add_action("clear_cache_reload_plugin", "Delete cache and reload"); + if (!is_orphaned) { + if (is_cloud) { + add_action("reinstall_plugin", "Reinstall"); + } else { + add_action("reload_plugin", "Reload"); + add_action("clear_cache_reload_plugin", "Delete cache and reload"); + } } return available_actions; @@ -360,6 +366,7 @@ PluginDialogItem build_plugin_dialog_item(const PluginDescriptor& descriptor) item.error_text = descriptor.normalized_error(); item.has_error = descriptor.has_error(); item.is_cloud_plugin = descriptor.is_cloud_plugin(); + item.orphaned = descriptor.cloud.has_value() && descriptor.cloud->orphaned; item.has_local_package = descriptor.has_local_package(); item.unauthorized = descriptor.is_unauthorized(); item.is_loaded = manager.is_plugin_loaded(descriptor.plugin_key); diff --git a/src/slic3r/plugin/PluginDescriptor.hpp b/src/slic3r/plugin/PluginDescriptor.hpp index b7792e2e31..b0d2d214c3 100644 --- a/src/slic3r/plugin/PluginDescriptor.hpp +++ b/src/slic3r/plugin/PluginDescriptor.hpp @@ -20,6 +20,7 @@ struct CloudPluginState bool update_available = false; // Cloud version > the local package version. bool unauthorized = false; // Cloud plugin is valid locally, but cannot receive cloud updates. bool is_mine = false; // Plugin was created (and uploaded) by the current user. + bool orphaned = false; // Cloud identity remains locally, but the plugin is no longer subscribed/available. }; enum class PluginUpdateStatus @@ -106,6 +107,8 @@ struct PluginDescriptor { if (!cloud.has_value()) return PluginUpdateStatus::Normal; + if (cloud->orphaned) + return PluginUpdateStatus::Normal; if (cloud->unauthorized) return PluginUpdateStatus::Unauthorized; if (cloud->update_available) diff --git a/src/slic3r/plugin/PluginManager.cpp b/src/slic3r/plugin/PluginManager.cpp index 37d5651a52..021543105a 100644 --- a/src/slic3r/plugin/PluginManager.cpp +++ b/src/slic3r/plugin/PluginManager.cpp @@ -1422,7 +1422,8 @@ void PluginManager::fetch_plugins_from_cloud(std::vector* out_not_f std::vector cloud_list{}; std::vector not_found{}, unauthorized{}; - if (!m_cloud_service.fetch_manifests_into_descriptors(cloud_list, not_found, unauthorized)) { + const bool cloud_fetch_succeeded = m_cloud_service.fetch_manifests_into_descriptors(cloud_list, not_found, unauthorized); + if (!cloud_fetch_succeeded) { if (wxTheApp != nullptr) { GUI::wxGetApp().CallAfter([] { if (GUI::wxGetApp().is_closing()) @@ -1437,9 +1438,10 @@ void PluginManager::fetch_plugins_from_cloud(std::vector* out_not_f } } - update_cloud_metadata(cloud_list); + if (cloud_fetch_succeeded) + update_cloud_metadata(cloud_list); - { + if (cloud_fetch_succeeded) { std::lock_guard lock(m_mutex); // Clear the previous cloud verdicts before re-applying the fresh ones. @@ -1448,19 +1450,28 @@ void PluginManager::fetch_plugins_from_cloud(std::vector* out_not_f if (!entry.is_cloud_plugin()) continue; entry.set_unauthorized(false); + if (entry.cloud.has_value()) + entry.cloud->orphaned = false; if (entry.normalized_error() == CLOUD_PLUGIN_NOT_FOUND_ERROR) entry.clear_error(); } - for (const std::string& uuid : not_found) { - for (Plugin& plugin : m_plugins) { - PluginDescriptor& entry = plugin.descriptor; - if (!entry.is_cloud_plugin() || entry.cloud_uuid() != uuid) - continue; - if (!entry.has_local_package()) - entry.set_error(CLOUD_PLUGIN_NOT_FOUND_ERROR); - break; - } + // A successful subscriptions response may report missing UUIDs explicitly, or it may + // simply omit an unsubscribed plugin from `data`. Both cases leave a locally retained + // cloud package orphaned. Owned plugins are returned by the separate mine endpoint and + // must not be orphaned merely because they are not subscribed. + for (Plugin& plugin : m_plugins) { + PluginDescriptor& entry = plugin.descriptor; + if (!entry.is_cloud_plugin() || entry.cloud->is_mine) + continue; + + const bool explicitly_not_found = std::find(not_found.begin(), not_found.end(), entry.cloud_uuid()) != not_found.end(); + const bool returned_by_cloud = std::any_of(cloud_list.begin(), cloud_list.end(), [&entry](const PluginDescriptor& cloud_entry) { + return cloud_entry.cloud_uuid() == entry.cloud_uuid(); + }); + entry.cloud->orphaned = explicitly_not_found || !returned_by_cloud; + if (entry.cloud->orphaned) + entry.cloud->update_available = false; } for (const std::string& uuid : unauthorized) { diff --git a/tests/slic3rutils/test_plugin_cloud_metadata.cpp b/tests/slic3rutils/test_plugin_cloud_metadata.cpp index ec8b61dea9..c34b596ee0 100644 --- a/tests/slic3rutils/test_plugin_cloud_metadata.cpp +++ b/tests/slic3rutils/test_plugin_cloud_metadata.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include @@ -48,6 +49,18 @@ const char* const CLOUD_PLUGIN_SOURCE = R"PY(# /// script # version = "1.0" # /// print('ok') + +import orca +class stubscript(orca.script.ScriptPluginCapabilityBase): + def get_name(self): + return "stubscript" + def execute(self): + return orca.ExecutionResult.success("Stub orca script.") + +@orca.plugin +class stubpackage(orca.base): + def register_capabilities(self): + orca.register_capability(stubscript) )PY"; } // namespace @@ -152,4 +165,31 @@ TEST_CASE("cloud metadata refresh preserves a plugin's stored config", "[PluginC reloaded.load(); REQUIRE(reloaded.has_config(id)); CHECK(reloaded.get_config(id)->config == configured); + + // A local package can remain after the cloud subscription disappears. The cloud identity is + // retained for diagnosis, but the orphaned state must suppress update availability until the + // plugin is returned by a later cloud refresh. + PluginDescriptor orphaned_record = cloud_record; + orphaned_record.cloud->orphaned = true; + orphaned_record.cloud->update_available = true; + manager.update_cloud_metadata({orphaned_record}); + + const PluginDescriptor orphaned = find_by_uuid(); + REQUIRE(orphaned.cloud.has_value()); + CHECK(orphaned.cloud->orphaned); + CHECK_FALSE(orphaned.has_error()); + CHECK(orphaned.get_update_status() == PluginUpdateStatus::Normal); + + // Orphaned is informational only: the local package must remain loadable and usable. + std::string load_error; + manager.load_plugin(uuid, /*skip_deps=*/true); + REQUIRE(manager.wait_for_plugin_load(uuid, std::chrono::seconds(120), load_error)); + INFO("load error: " << load_error); + CHECK(load_error.empty()); + CHECK(manager.is_plugin_loaded(uuid)); + CHECK(manager.unload_plugin(uuid)); + + // Seeing the plugin in a subsequent cloud response clears the orphaned marker. + manager.update_cloud_metadata({cloud_record}); + CHECK_FALSE(find_by_uuid().cloud->orphaned); } From 101f43b2d8f88432c0c69ec65b06cd195731ff0e Mon Sep 17 00:00:00 2001 From: Ian Chua Date: Fri, 31 Jul 2026 14:15:51 +0800 Subject: [PATCH 028/106] fix: resolve plugins that are missing locally (physical file deleted) (#14861) * fix: resolve plugins that are missing locally (physical file deleted) * fix: don't treat file not found as an error --- src/slic3r/GUI/PluginsDialog.cpp | 30 +++++++++++++++++- src/slic3r/GUI/PluginsDialog.hpp | 1 + src/slic3r/plugin/PluginFsUtils.cpp | 3 +- src/slic3r/plugin/PluginManager.cpp | 48 +++++++++++++++++++++++++---- src/slic3r/plugin/PluginManager.hpp | 6 ++++ 5 files changed, 79 insertions(+), 9 deletions(-) diff --git a/src/slic3r/GUI/PluginsDialog.cpp b/src/slic3r/GUI/PluginsDialog.cpp index c05d1839bc..a39fcbc535 100644 --- a/src/slic3r/GUI/PluginsDialog.cpp +++ b/src/slic3r/GUI/PluginsDialog.cpp @@ -599,7 +599,35 @@ bool PluginsDialog::get_descriptor(const std::string& plugin_key, PluginDescript void PluginsDialog::refresh_plugin_metadata_async(const wxString& title, const wxString& message, bool fetch_cloud) { - run_with_dialog([fetch_cloud]() { refresh_plugin_metadata_blocking(fetch_cloud); }, [this]() { send_plugins(); }, title, message); + run_with_dialog([fetch_cloud]() { refresh_plugin_metadata_blocking(fetch_cloud); }, [this]() { + prompt_for_missing_plugins(); + send_plugins(); + }, title, message); +} + +void PluginsDialog::prompt_for_missing_plugins() +{ + PluginManager& manager = PluginManager::instance(); + const std::vector missing = manager.get_missing_plugin_descriptors(); + if (missing.empty()) + return; + + wxString names; + std::vector keys; + keys.reserve(missing.size()); + for (const PluginDescriptor& plugin : missing) { + keys.push_back(plugin.plugin_key); + names += "\n- "; + names += plugin_display_name(plugin.plugin_key); + } + + const int result = wxMessageBox( + wxString::Format(_L("The following installed plugins were not found on disk:\n%s\n\nRemove them from OrcaSlicer?"), names), + _L("Missing Plugins"), wxYES_NO | wxNO_DEFAULT | wxICON_WARNING, this); + restore_z_order(); + + if (result == wxYES) + manager.remove_missing_plugins(keys); } void PluginsDialog::refresh_plugins() diff --git a/src/slic3r/GUI/PluginsDialog.hpp b/src/slic3r/GUI/PluginsDialog.hpp index a0e7bd8022..e663de79e4 100644 --- a/src/slic3r/GUI/PluginsDialog.hpp +++ b/src/slic3r/GUI/PluginsDialog.hpp @@ -68,6 +68,7 @@ private: bool get_descriptor(const std::string& plugin_key, Slic3r::PluginDescriptor& descriptor) const; void refresh_plugin_metadata_async(const wxString& title, const wxString& message, bool fetch_cloud); + void prompt_for_missing_plugins(); void refresh_plugins(); void toggle_plugin(const std::string& plugin_key, bool enabled); void toggle_plugin_capability(const std::string& plugin_key, PluginCapabilityType type, const std::string& capability_name, bool enabled); diff --git a/src/slic3r/plugin/PluginFsUtils.cpp b/src/slic3r/plugin/PluginFsUtils.cpp index 445dd00b9b..8f93f7aaef 100644 --- a/src/slic3r/plugin/PluginFsUtils.cpp +++ b/src/slic3r/plugin/PluginFsUtils.cpp @@ -120,8 +120,7 @@ bool delete_plugin_root(const boost::filesystem::path& resolved_root, const std: } if (removed_count == 0) { - error = "Plugin folder was not found: " + resolved_root.string(); - return false; + return true; } BOOST_LOG_TRIVIAL(info) << "Deleted plugin: " << plugin_id << " from " << resolved_root.string(); diff --git a/src/slic3r/plugin/PluginManager.cpp b/src/slic3r/plugin/PluginManager.cpp index 021543105a..3587c0a824 100644 --- a/src/slic3r/plugin/PluginManager.cpp +++ b/src/slic3r/plugin/PluginManager.cpp @@ -310,6 +310,7 @@ void PluginManager::merge_discovered_plugins(std::vector disco } seen.push_back(descriptor.plugin_key); + m_missing_plugin_keys.erase(descriptor.plugin_key); Plugin* existing = find_plugin_locked(descriptor.plugin_key); if (existing == nullptr) { @@ -330,12 +331,47 @@ void PluginManager::merge_discovered_plugins(std::vector disco return; } - // Unloading may call Python and lifecycle subscribers may re-enter the manager, so never do it - // while holding m_mutex. unload_and_erase_if() retries until no matching entry is loaded at the - // moment of erase, in case another caller starts a load between the initial snapshot and the - // teardown. - unload_and_erase_if( - [&seen](const Plugin& plugin) { return std::find(seen.begin(), seen.end(), plugin.descriptor.plugin_key) == seen.end(); }); + // A package can be temporarily absent while an external side-loader replaces it. Keep the + // descriptor and its persisted enable state until the user explicitly removes the missing + // entry, or a later scan rediscovers it. In particular, do not unload here: the unload callback + // would turn a transient filesystem gap into enabled=false in the sidecar. + { + std::lock_guard lock(m_mutex); + for (const Plugin& plugin : m_plugins) { + if (plugin.descriptor.has_local_package() && + std::find(seen.begin(), seen.end(), plugin.descriptor.plugin_key) == seen.end()) + m_missing_plugin_keys.insert(plugin.descriptor.plugin_key); + } + } +} + +std::vector PluginManager::get_missing_plugin_descriptors() const +{ + std::lock_guard lock(m_mutex); + + std::vector result; + result.reserve(m_missing_plugin_keys.size()); + for (const Plugin& plugin : m_plugins) + if (m_missing_plugin_keys.count(plugin.descriptor.plugin_key) != 0) + result.push_back(plugin.descriptor); + return result; +} + +void PluginManager::remove_missing_plugins(const std::vector& plugin_keys) +{ + const std::unordered_set requested(plugin_keys.begin(), plugin_keys.end()); + + // The predicate is evaluated only while m_mutex is held by unload_and_erase_if(). Checking the + // current missing set here prevents a package that reappeared between the dialog and removal + // from being erased. + unload_and_erase_if([this, &requested](const Plugin& plugin) { + return requested.count(plugin.descriptor.plugin_key) != 0 && + m_missing_plugin_keys.count(plugin.descriptor.plugin_key) != 0; + }); + + std::lock_guard lock(m_mutex); + for (const std::string& plugin_key : requested) + m_missing_plugin_keys.erase(plugin_key); } void PluginManager::unload_and_erase_if(const std::function& should_remove, diff --git a/src/slic3r/plugin/PluginManager.hpp b/src/slic3r/plugin/PluginManager.hpp index 72fb9512b0..ddb0bf9dce 100644 --- a/src/slic3r/plugin/PluginManager.hpp +++ b/src/slic3r/plugin/PluginManager.hpp @@ -132,6 +132,11 @@ public: bool try_get_plugin_descriptor(const std::string& plugin_key, PluginDescriptor& out) const; // Same, but only for packages that are loadable (i.e. not an invalid package). bool try_get_valid_plugin_descriptor(const std::string& plugin_key, PluginDescriptor& out) const; + // Packages that were present in the previous discovery pass but were not found on disk in the + // latest rescan. They are retained until the user explicitly removes them or a later scan finds + // them again. + std::vector get_missing_plugin_descriptors() const; + void remove_missing_plugins(const std::vector& plugin_keys); // Packages whose .install_state.json marks them for auto-load. std::vector get_enabled_plugin_keys() const; // The package owning a loaded capability, for the by-name dispatch path. @@ -262,6 +267,7 @@ private: // Every discovered plugin, loaded or not. module == nullptr => not loaded. std::vector m_plugins; + std::unordered_set m_missing_plugin_keys; std::unordered_set m_load_in_progress; // Keys whose in-flight load has been cancelled. Cancellation does NOT remove the key from From 4824a171f1bcebe644eafe70a45fc50a5c9e6347 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Fri, 31 Jul 2026 15:34:04 +0800 Subject: [PATCH 029/106] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- tests/libslic3r/test_toolordering_nozzle_group.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/libslic3r/test_toolordering_nozzle_group.cpp b/tests/libslic3r/test_toolordering_nozzle_group.cpp index 5eee164eb0..dc54aae80a 100644 --- a/tests/libslic3r/test_toolordering_nozzle_group.cpp +++ b/tests/libslic3r/test_toolordering_nozzle_group.cpp @@ -509,8 +509,8 @@ TEST_CASE("A degenerate process variant map on a custom multi-extruder printer s // otherwise the failed per-extruder lookups collapse the per-extruder retract overrides // during slicing and the post-slice re-apply invalidates every fresh result, forever. DynamicPrintConfig config = DynamicPrintConfig::full_print_config(); - config.option("nozzle_diameter", true)->values = {0.4, 0.4, 0.4, 0.4, 0.4}; config.set_num_extruders(5); + config.option("nozzle_diameter", true)->values = {0.4, 0.4, 0.4, 0.4, 0.4}; // per-extruder machine values that a first-slot collapse would destroy config.option("retract_before_wipe", true)->values = {100., 70., 70., 70., 100.}; config.option("z_hop_types", true)->values = {zhtSlope, zhtNormal, zhtNormal, zhtNormal, zhtSlope}; From c8aacea17690c2a86a13731c616b65675481e0bb Mon Sep 17 00:00:00 2001 From: SoftFever Date: Fri, 31 Jul 2026 16:58:26 +0800 Subject: [PATCH 030/106] fix typo --- src/libslic3r/GCode/WipeTower.cpp | 4 ++-- src/libslic3r/GCode/WipeTower.hpp | 2 +- src/libslic3r/GCode/WipeTower2.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index 3fbc0cccaa..3d7353eadf 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -593,7 +593,7 @@ Polylines remove_points_from_polygon(const Polygon &polygon_ori, const std::vect return result; } -Polylines contrust_gap_for_skip_points(const Polygon &polygon, const std::vector & skip_points ,float wt_width,float gap_length,Polygon& insert_skip_polygon) +Polylines construct_gap_for_skip_points(const Polygon &polygon, const std::vector & skip_points ,float wt_width,float gap_length,Polygon& insert_skip_polygon) { if (skip_points.empty()) { insert_skip_polygon = polygon; @@ -5101,7 +5101,7 @@ Polygon WipeTower::generate_support_wall_new(WipeTowerWriter &writer, const box_ if (!extrude_perimeter) return wall_polygon; if (skip_points) { - result_wall = contrust_gap_for_skip_points(wall_polygon, m_wall_skip_points[m_cur_layer_id], m_wipe_tower_width, 2.5 * m_perimeter_width, insert_skip_polygon); + result_wall = construct_gap_for_skip_points(wall_polygon, m_wall_skip_points[m_cur_layer_id], m_wipe_tower_width, 2.5 * m_perimeter_width, insert_skip_polygon); } else { result_wall.push_back(to_polyline(wall_polygon)); diff --git a/src/libslic3r/GCode/WipeTower.hpp b/src/libslic3r/GCode/WipeTower.hpp index 3dbbf03ffb..66e8acf1c4 100644 --- a/src/libslic3r/GCode/WipeTower.hpp +++ b/src/libslic3r/GCode/WipeTower.hpp @@ -23,7 +23,7 @@ enum GCodeFlavor : unsigned char; // Cuts the tower wall polygon open at each skip point (a toolchange's entry position) // so the entry travel can pass through instead of crossing the printed wall. Defined in // WipeTower.cpp, shared by WipeTower and WipeTower2. -Polylines contrust_gap_for_skip_points( +Polylines construct_gap_for_skip_points( const Polygon& polygon, const std::vector& skip_points, float wt_width, float gap_length, Polygon& insert_skip_polygon); class WipeTower diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index e3e5f075c1..51ab155dd9 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -2461,7 +2461,7 @@ Polygon WipeTower2::generate_support_rib_wall(WipeTowerWriter2& const size_t layer_id = size_t(m_layer_info - m_plan.begin()); const std::vector& layer_skip_points = layer_id < m_wall_skip_points.size() ? m_wall_skip_points[layer_id] : no_skip_points; - result_wall = contrust_gap_for_skip_points(wall_polygon, layer_skip_points, m_wipe_tower_width, 2.5 * m_perimeter_width, + result_wall = construct_gap_for_skip_points(wall_polygon, layer_skip_points, m_wipe_tower_width, 2.5 * m_perimeter_width, insert_skip_polygon); } else { result_wall.push_back(to_polyline(wall_polygon)); From 603a8f9c8fd26273bdb4e9ee7a0deab168571105 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Fri, 31 Jul 2026 18:16:06 +0800 Subject: [PATCH 031/106] Fix stringing between the model and the wipe tower The tower travel took retract()'s default vertical Z hop instead of the configured one, so the nozzle rose in place over the part and oozed rather than departing with the travel. Pass the filament's z_hop_types through, mapping Auto to a spiral lift as append_tcr does. --- src/libslic3r/GCode.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 9c8959a05c..f5db2e8349 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1510,7 +1510,19 @@ static std::vector get_path_of_change_filament(const Print& print) if (travel_to_tower_now) { // FIXME: It would be better if the wipe tower set the force_travel flag for all toolchanges, // then we could simplify the condition and make it more readable. - gcode += gcodegen.retract(); + + // Orca: pass the configured lift type, as append_tcr does above. lazy_lift() keeps + // the first type it is given, so the NormalLift default would pin this hop to a + // standing move. Slope and spiral both need a known head position. + LiftType lift_type = LiftType::NormalLift; + if (gcodegen.writer().filament() != nullptr && gcodegen.writer().is_current_position_clear()) { + ZHopType z_hop_type = ZHopType(gcodegen.config().z_hop_types.get_at( + gcodegen.get_filament_config_index((int) gcodegen.writer().filament()->id()))); + if (z_hop_type == ZHopType::zhtAuto) + z_hop_type = ZHopType::zhtSpiral; + lift_type = gcodegen.to_lift_type(z_hop_type); + } + gcode += gcodegen.retract(false, false, lift_type); gcodegen.m_avoid_crossing_perimeters.use_external_mp_once(); if (!tcr.priming && gcodegen.last_pos_defined()) gcode += travel_to_tower_gap(gcodegen, gcodegen.last_pos(), start_wipe_pos); From 2e08b19d6bc2efb24f7e167c29dd2995b088fdbc Mon Sep 17 00:00:00 2001 From: Rodrigo Faselli <162915171+RF47@users.noreply.github.com> Date: Fri, 31 Jul 2026 20:51:48 -0300 Subject: [PATCH 032/106] Outline MSAA (#14835) Co-authored-by: Ian Bassi --- resources/shaders/140/gouraud.fs | 97 +++++++++++++++++++++++--------- resources/shaders/140/phong.fs | 79 ++++++++++++++++++++------ src/slic3r/GUI/3DScene.cpp | 78 ++++++++++++++++++++----- 3 files changed, 198 insertions(+), 56 deletions(-) diff --git a/resources/shaders/140/gouraud.fs b/resources/shaders/140/gouraud.fs index 728b7f942c..e099984b46 100644 --- a/resources/shaders/140/gouraud.fs +++ b/resources/shaders/140/gouraud.fs @@ -1,4 +1,7 @@ #version 140 +// Multisample depth texture for the anti-aliased outline (see 3DScene.cpp render_with_outline). +// Optional on the GLSL 140 path: if unavailable, fallback to a non-multisample depth texture. +#extension GL_ARB_texture_multisample : enable const vec3 ZERO = vec3(0.0, 0.0, 0.0); //BBS: add grey and orange @@ -36,7 +39,14 @@ uniform SlopeDetection slope; //BBS: add outline_color uniform bool is_outline; +// The outline is a per-fragment discard mask, which the framebuffer MSAA cannot smooth, so the +// silhouette is resolved per sample from a multisample copy of the outlined model's depth buffer. +#ifdef GL_ARB_texture_multisample +uniform sampler2DMS depth_tex; +uniform int msaa_samples; // samples in depth_tex, 1 when MSAA is off +#else uniform sampler2D depth_tex; +#endif uniform vec2 screen_size; #ifdef ENABLE_ENVIRONMENT_MAP @@ -99,45 +109,87 @@ float GetTolerance(float d, float k) return -k*(d+A)*(d+A)/B; } -float DetectSilho(vec2 fragCoord, vec2 dir) +// Depth of sample s at integer pixel coord. +#ifdef GL_ARB_texture_multisample +float FetchDepth(ivec2 coord, int s) +{ + // texelFetch has no wrap mode, so clamp to the edge texel (sampler2D used CLAMP_TO_EDGE). + ivec2 sz = textureSize(depth_tex); + return abs(texelFetch(depth_tex, clamp(coord, ivec2(0), sz - 1), s).r); +} +#else +float FetchDepth(ivec2 coord, int s) +{ + return abs(texture(depth_tex, (vec2(coord) + 0.5) / screen_size).r); +} +#endif + +float DetectSilho(ivec2 coord, ivec2 dir, int s) { // ------------------------------------------- - // x0 ___ x1----o - // :\ : + // x0 ___ x1----o + // :\ : // r0 : \ : r1 - // : \ : + // : \ : // o---x2 ___ x3 // // r0 and r1 are the differences between actual // and expected (as if x0..3 where on the same // plane) depth values. // ------------------------------------------- - - float x0 = abs(texture(depth_tex, (fragCoord + dir*-2.0) / screen_size).r); - float x1 = abs(texture(depth_tex, (fragCoord + dir*-1.0) / screen_size).r); - float x2 = abs(texture(depth_tex, (fragCoord + dir* 0.0) / screen_size).r); - float x3 = abs(texture(depth_tex, (fragCoord + dir* 1.0) / screen_size).r); - + float x0 = FetchDepth(coord + dir*-2, s); + float x1 = FetchDepth(coord + dir*-1, s); + float x2 = FetchDepth(coord, s); + float x3 = FetchDepth(coord + dir* 1, s); + float d0 = (x1-x0); float d1 = (x2-x3); - + float r0 = x1 + d0 - x2; float r1 = x2 + d1 - x1; - - float tol = GetTolerance(x2, 0.04); - - return smoothstep(0.0, tol*tol, max( - r0*r1, 0.0)); + float tol = GetTolerance(x2, 0.04); + + return smoothstep(0.0, tol*tol, max( - r0*r1, 0.0)); } -float DetectSilho(vec2 fragCoord) +float DetectSilho(ivec2 coord, int s) { return max( - DetectSilho(fragCoord, vec2(1,0)), // Horizontal - DetectSilho(fragCoord, vec2(0,1)) // Vertical + DetectSilho(coord, ivec2(1,0), s), // Horizontal + DetectSilho(coord, ivec2(0,1), s) // Vertical ); } +// Full response of one sample. Reduce the max() per sample and average only afterwards: +// max(mean) <= mean(max), and averaging first hollows out diagonal and curved lines. +float DetectSilhoSample(ivec2 coord, int s) +{ + float v = DetectSilho(coord, s); + // Makes silhouettes thicker. + for (int i = 1; i <= INFLATE; ++i) + { + v = max(v, DetectSilho(coord + ivec2(i, 0), s)); + v = max(v, DetectSilho(coord + ivec2(0, i), s)); + } + return v; +} + +// Average the per-sample coverage into the sub-pixel anti-aliasing of the line. +float DetectSilho(vec2 fragCoord) +{ + ivec2 coord = ivec2(fragCoord); +#ifdef GL_ARB_texture_multisample + int n = max(msaa_samples, 1); +#else + const int n = 1; +#endif + float acc = 0.0; + for (int s = 0; s < n; ++s) + acc += DetectSilhoSample(coord, s); + return acc / float(n); +} + // Returns a lighting multiplier in [1 - shadow_intensity, 1]: < 1 where the fragment is // occluded from the light in the shadow map. 3x3 PCF softens the edges. float shadow_shade() @@ -224,14 +276,7 @@ void main() //BBS: add outline_color if (is_outline) { color = vec4((vec3(intensity.y) + color.rgb * intensity.x) * shade, color.a); - vec2 fragCoord = gl_FragCoord.xy; - float s = DetectSilho(fragCoord); - // Makes silhouettes thicker. - for(int i=1;i<=INFLATE; i++) - { - s = max(s, DetectSilho(fragCoord.xy + vec2(i, 0))); - s = max(s, DetectSilho(fragCoord.xy + vec2(0, i))); - } + float s = DetectSilho(gl_FragCoord.xy); if (s < 0.01) discard; out_color = vec4(mix(color.rgb, getBackfaceColor(color.rgb), s), color.a); diff --git a/resources/shaders/140/phong.fs b/resources/shaders/140/phong.fs index bbde72592c..f847763658 100644 --- a/resources/shaders/140/phong.fs +++ b/resources/shaders/140/phong.fs @@ -1,4 +1,7 @@ #version 140 +// Multisample depth texture for the anti-aliased outline (see 3DScene.cpp render_with_outline). +// Optional on the GLSL 140 path: if unavailable, fallback to a non-multisample depth texture. +#extension GL_ARB_texture_multisample : enable const vec3 ZERO = vec3(0.0, 0.0, 0.0); const vec3 LightRed = vec3(0.78, 0.0, 0.0); @@ -51,7 +54,14 @@ uniform SlopeDetection slope; //BBS: add outline_color uniform bool is_outline; +// The outline is a per-fragment discard mask, which the framebuffer MSAA cannot smooth, so the +// silhouette is resolved per sample from a multisample copy of the outlined model's depth buffer. +#ifdef GL_ARB_texture_multisample +uniform sampler2DMS depth_tex; +uniform int msaa_samples; // samples in depth_tex, 1 when MSAA is off +#else uniform sampler2D depth_tex; +#endif uniform vec2 screen_size; #ifdef ENABLE_ENVIRONMENT_MAP @@ -100,12 +110,27 @@ float GetTolerance(float d, float k) return -k*(d+A)*(d+A)/B; } -float DetectSilho(vec2 fragCoord, vec2 dir) +// Depth of sample s at integer pixel coord. +#ifdef GL_ARB_texture_multisample +float FetchDepth(ivec2 coord, int s) { - float x0 = abs(texture(depth_tex, (fragCoord + dir*-2.0) / screen_size).r); - float x1 = abs(texture(depth_tex, (fragCoord + dir*-1.0) / screen_size).r); - float x2 = abs(texture(depth_tex, (fragCoord + dir* 0.0) / screen_size).r); - float x3 = abs(texture(depth_tex, (fragCoord + dir* 1.0) / screen_size).r); + // texelFetch has no wrap mode, so clamp to the edge texel (sampler2D used CLAMP_TO_EDGE). + ivec2 sz = textureSize(depth_tex); + return abs(texelFetch(depth_tex, clamp(coord, ivec2(0), sz - 1), s).r); +} +#else +float FetchDepth(ivec2 coord, int s) +{ + return abs(texture(depth_tex, (vec2(coord) + 0.5) / screen_size).r); +} +#endif + +float DetectSilho(ivec2 coord, ivec2 dir, int s) +{ + float x0 = FetchDepth(coord + dir*-2, s); + float x1 = FetchDepth(coord + dir*-1, s); + float x2 = FetchDepth(coord, s); + float x3 = FetchDepth(coord + dir* 1, s); float d0 = (x1-x0); float d1 = (x2-x3); @@ -116,17 +141,45 @@ float DetectSilho(vec2 fragCoord, vec2 dir) float tol = GetTolerance(x2, 0.04); return smoothstep(0.0, tol*tol, max( - r0*r1, 0.0)); - } -float DetectSilho(vec2 fragCoord) +float DetectSilho(ivec2 coord, int s) { return max( - DetectSilho(fragCoord, vec2(1,0)), - DetectSilho(fragCoord, vec2(0,1)) + DetectSilho(coord, ivec2(1,0), s), + DetectSilho(coord, ivec2(0,1), s) ); } +// Full response of one sample. Reduce the max() per sample and average only afterwards: +// max(mean) <= mean(max), and averaging first hollows out diagonal and curved lines. +float DetectSilhoSample(ivec2 coord, int s) +{ + float v = DetectSilho(coord, s); + // Makes silhouettes thicker. + for (int i = 1; i <= INFLATE; ++i) + { + v = max(v, DetectSilho(coord + ivec2(i, 0), s)); + v = max(v, DetectSilho(coord + ivec2(0, i), s)); + } + return v; +} + +// Average the per-sample coverage into the sub-pixel anti-aliasing of the line. +float DetectSilho(vec2 fragCoord) +{ + ivec2 coord = ivec2(fragCoord); +#ifdef GL_ARB_texture_multisample + int n = max(msaa_samples, 1); +#else + const int n = 1; +#endif + float acc = 0.0; + for (int s = 0; s < n; ++s) + acc += DetectSilhoSample(coord, s); + return acc / float(n); +} + float compute_ssao_factor(vec3 normal, vec3 view_dir, vec3 eye_pos) { vec3 normal_dx = dFdx(normal); @@ -270,13 +323,7 @@ void main() if (is_outline) { vec3 shaded_rgb = (vec3(specular) + window_reflection + color.rgb * diffuse) * PHONG_BRIGHTNESS * shade; vec4 shaded_color = vec4(clamp(shaded_rgb, vec3(0.0), vec3(1.0)), color.a); - vec2 fragCoord = gl_FragCoord.xy; - float s = DetectSilho(fragCoord); - for(int i=1;i<=INFLATE; i++) - { - s = max(s, DetectSilho(fragCoord.xy + vec2(i, 0))); - s = max(s, DetectSilho(fragCoord.xy + vec2(0, i))); - } + float s = DetectSilho(gl_FragCoord.xy); if (s < 0.01) discard; out_color = vec4(mix(shaded_color.rgb, getBackfaceColor(shaded_color.rgb), s), shaded_color.a); diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index b52a520200..bf5d1f2421 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -70,6 +70,9 @@ float FullTransparentModdifiedToFixAlpha = 0.3f; // value like 0.18f could not because in C++ (int)(0.18f * 255) == 45 however in OpenGL it renders this as 46 // which breaks the `SelectMachineDialog::record_edge_pixels_data()` function! float FULL_BLACK_THRESHOLD = 0.2f; +// Keep depth_tex away from texture unit 0 to avoid sampler-type aliasing with +// shadow/environment samplers when realistic view is disabled. +static constexpr int OUTLINE_DEPTH_TEX_UNIT = 5; Slic3r::ColorRGBA adjust_color_for_rendering(const Slic3r::ColorRGBA &colors) { @@ -518,6 +521,37 @@ void GLVolume::render_with_outline(const GUI::Size& cnv_size) glsafe(::glStencilMask(0xFF)); glsafe(::glDisable(GL_STENCIL_TEST)); // render the outline using depth buffer and discard the pixels that are not on the outline + // The silhouette is resolved per sample in the shader (see DetectSilho in gouraud.fs/phong.fs). + // That needs the GL 3.2 entry points and a shader that declares depth_tex as sampler2DMS, which + // only the 140 ones do and only under GL_ARB_texture_multisample - so ask the compiled program + // rather than the GL version, or a sampler2D ends up bound to a multisample texture. + // Only the Arb branch below allocates a multisample texture, so keep the target consistent with it. + const bool use_msaa_outline = framebuffers_type == GUI::OpenGLManager::EFramebufferType::Arb && + GUI::wxGetApp().is_gl_version_greater_or_equal_to(3, 2) && + shader->get_uniform_location("msaa_samples") >= 0; + const GLenum depth_tex_target = use_msaa_outline ? GL_TEXTURE_2D_MULTISAMPLE : GL_TEXTURE_2D; + // Keep the depth texture off image unit 0. The object shaders leave shadow_map (and + // environment_tex) at the default sampler value 0 whenever the shadow pass is skipped - which is + // the case with realistic view off - and GL forbids two sampler types referring to the same image + // unit. A sampler2DMS on unit 0 then makes every draw fail with INVALID_OPERATION on drivers that + // enforce it (Mesa), i.e. the model disappears entirely. Unit 5 is unused (shadow_map takes 4). + const int depth_tex_unit = OUTLINE_DEPTH_TEX_UNIT; + int aa_samples = 1; + if (use_msaa_outline) { + if (const AppConfig* app_config = GUI::wxGetApp().app_config; app_config != nullptr) { + const std::string value = app_config->get(SETTING_OPENGL_AA_SAMPLES); + if (value == "2" || value == "4" || value == "8" || value == "16") + aa_samples = ::atoi(value.c_str()); + } + // Never request more samples than the driver supports for depth textures (a 1-sample texture + // is used when MSAA is disabled, keeping a single code path for the sampler2DMS shader). + GLint max_samples = 1; + glsafe(::glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &max_samples)); + if (aa_samples > max_samples) + aa_samples = max_samples < 1 ? 1 : max_samples; + if (aa_samples < 1) + aa_samples = 1; + } // 1st. render pass, render the model into a separate render target that has only depth buffer GLuint depth_fbo = 0; GLuint depth_tex = 0; @@ -525,21 +559,26 @@ void GLVolume::render_with_outline(const GUI::Size& cnv_size) glsafe(::glGenFramebuffers(1, &depth_fbo)); glsafe(::glBindFramebuffer(GL_FRAMEBUFFER, depth_fbo)); - glActiveTexture(GL_TEXTURE0); + glsafe(::glActiveTexture(GL_TEXTURE0 + depth_tex_unit)); glsafe(::glGenTextures(1, &depth_tex)); - glsafe(::glBindTexture(GL_TEXTURE_2D, depth_tex)); - glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); - glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); - glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); - glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); - glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, cnv_size.get_width(), cnv_size.get_height(), 0, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr)); + glsafe(::glBindTexture(depth_tex_target, depth_tex)); + if (use_msaa_outline) { + // Multisample textures do not take filter/wrap parameters. + glsafe(::glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, aa_samples, GL_DEPTH_COMPONENT32F, cnv_size.get_width(), cnv_size.get_height(), GL_TRUE)); + } else { + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); + glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, cnv_size.get_width(), cnv_size.get_height(), 0, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr)); + } - glsafe(::glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_tex, 0)); + glsafe(::glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depth_tex_target, depth_tex, 0)); } else { glsafe(::glGenFramebuffersEXT(1, &depth_fbo)); glsafe(::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, depth_fbo)); - glActiveTexture(GL_TEXTURE0); + glsafe(::glActiveTexture(GL_TEXTURE0 + depth_tex_unit)); glsafe(::glGenTextures(1, &depth_tex)); glsafe(::glBindTexture(GL_TEXTURE_2D, depth_tex)); glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); @@ -550,12 +589,15 @@ void GLVolume::render_with_outline(const GUI::Size& cnv_size) glsafe(::glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, depth_tex, 0)); } + // Unbind before drawing: the texture is this framebuffer's depth attachment, so leaving it bound + // to a sampled unit would be a feedback loop. + glsafe(::glBindTexture(depth_tex_target, 0)); + glsafe(::glActiveTexture(GL_TEXTURE0)); glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); if (tverts_range == std::make_pair(0, -1)) model.render(shader); else model.render(this->tverts_range, shader); - glsafe(::glBindTexture(GL_TEXTURE_2D, 0)); // 2nd. render pass, just a normal render with the depth buffer passed as a texture if (framebuffers_type == GUI::OpenGLManager::EFramebufferType::Arb) { @@ -565,13 +607,17 @@ void GLVolume::render_with_outline(const GUI::Size& cnv_size) } shader->set_uniform("is_outline", true); shader->set_uniform("screen_size", Vec2f{cnv_size.get_width(), cnv_size.get_height()}); - glActiveTexture(GL_TEXTURE0); - glsafe(::glBindTexture(GL_TEXTURE_2D, depth_tex)); - shader->set_uniform("depth_tex", 0); + shader->set_uniform("msaa_samples", aa_samples); + glsafe(::glActiveTexture(GL_TEXTURE0 + depth_tex_unit)); + glsafe(::glBindTexture(depth_tex_target, depth_tex)); + glsafe(::glActiveTexture(GL_TEXTURE0)); + shader->set_uniform("depth_tex", depth_tex_unit); simple_render(shader, model_objects, colors); // Some clean up to do - glsafe(::glBindTexture(GL_TEXTURE_2D, 0)); + glsafe(::glActiveTexture(GL_TEXTURE0 + depth_tex_unit)); + glsafe(::glBindTexture(depth_tex_target, 0)); + glsafe(::glActiveTexture(GL_TEXTURE0)); shader->set_uniform("is_outline", false); if (framebuffers_type == GUI::OpenGLManager::EFramebufferType::Arb) { glsafe(::glBindFramebuffer(GL_FRAMEBUFFER, 0)); @@ -1075,6 +1121,10 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, const float support_normal_z = get_selection_support_normal_z(); + // Prime depth_tex on every frame so non-outline draws do not keep the + // default sampler unit 0, which can conflict with other sampler types. + shader->set_uniform("depth_tex", OUTLINE_DEPTH_TEX_UNIT); + for (GLVolumeWithIdAndZ& volume : to_render) { #if ENABLE_MODIFIERS_ALWAYS_TRANSPARENT if (type == ERenderType::Transparent) { From 477208a9694a2ba3198538eab3b33f0bda98d90a Mon Sep 17 00:00:00 2001 From: yw4z Date: Sat, 1 Aug 2026 06:28:07 +0300 Subject: [PATCH 033/106] Remove borders and paddings from native controls on Linux (#14873) * init * update * Update SpinInput.cpp * possible fix for em_unit * button alignment * match titlebar height * revert em_value for macOS and Windows * Update GUI_Utils.hpp * Merge branch 'main' into linux-black-borders-2 * Revert "button alignment" This reverts commit 3fc7461071cd8b2bd1b701151c3d11af579b5129. * Revert "match titlebar height" This reverts commit c4aa1d9f1e08925716f37e78795c1708e93cb194. * revert dpi changes * match platform tags * remove radio box borders * Fix code indent --- src/slic3r/GUI/GUI_Utils.cpp | 54 ++++++++++++++++++++++++- src/slic3r/GUI/GUI_Utils.hpp | 5 ++- src/slic3r/GUI/PresetComboBoxes.cpp | 3 ++ src/slic3r/GUI/Widgets/CheckBox.cpp | 4 +- src/slic3r/GUI/Widgets/RadioBox.cpp | 5 +++ src/slic3r/GUI/Widgets/SpinInput.cpp | 9 +++++ src/slic3r/GUI/Widgets/SwitchButton.cpp | 4 +- src/slic3r/GUI/Widgets/TextInput.cpp | 9 +++++ src/slic3r/GUI/wxExtensions.cpp | 4 ++ 9 files changed, 90 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/GUI_Utils.cpp b/src/slic3r/GUI/GUI_Utils.cpp index 697eefea0b..cb8ba45c6b 100644 --- a/src/slic3r/GUI/GUI_Utils.cpp +++ b/src/slic3r/GUI/GUI_Utils.cpp @@ -548,7 +548,7 @@ void RemoveButtonBorder(wxWindow* win) GtkCssProvider* provider = gtk_css_provider_new(); const char* css = - "button {" + "button, button:hover, button:active, button:focus {" " border: none;" " outline: none;" " box-shadow: none;" @@ -589,6 +589,58 @@ void RemoveButtonBorder(wxWindow* win) ); #endif } + +void RemoveInputBorder(wxWindow* win) +{ + GtkWidget* widget = win->GetHandle(); + if (!widget) return; + +#if GTK_CHECK_VERSION(3, 0, 0) + // GTK3+: use CSS provider + GtkCssProvider* provider = gtk_css_provider_new(); + + // Target 'entry' and its inner subnodes (like text selection areas) + const char* css = + "entry, entry text, entry undershoot {" + " border: none;" + " outline: none;" + " box-shadow: none;" + " padding: 0px;" + " margin: 0px;" + " min-height: 0px;" + " min-width: 0px;" + " background: none;" + "}"; + +#if GTK_CHECK_VERSION(4, 0, 0) + // GTK4 + gtk_css_provider_load_from_data(provider, css, -1); +#else + // GTK3 + gtk_css_provider_load_from_data(provider, css, -1, nullptr); +#endif + + GtkStyleContext* ctx = gtk_widget_get_style_context(widget); + gtk_style_context_add_provider( + ctx, + GTK_STYLE_PROVIDER(provider), + GTK_STYLE_PROVIDER_PRIORITY_USER + ); + g_object_unref(provider); + +#else + // GTK2: Target the x/y thickness of the entry widget + gtk_rc_parse_string( + "style \"no-padding-entry\" {" + " xthickness = 0" + " ythickness = 0" + " GtkEntry::inner-border = { 0, 0, 0, 0 }" + " GtkEntry::focus-line-width = 0" + "}" + "class \"GtkEntry\" style \"no-padding-entry\"" + ); +#endif +} #endif // __WXGTK__ #ifdef __linux__ diff --git a/src/slic3r/GUI/GUI_Utils.hpp b/src/slic3r/GUI/GUI_Utils.hpp index 427ba9f0ad..890e8b9e1c 100644 --- a/src/slic3r/GUI/GUI_Utils.hpp +++ b/src/slic3r/GUI/GUI_Utils.hpp @@ -472,8 +472,9 @@ void dataview_remove_insets(wxDataViewCtrl* dv); void staticbox_remove_margin(wxStaticBox* sb); #endif -#ifdef __WXGTK3__ -void RemoveButtonBorder(wxWindow* win); +#ifdef __WXGTK__ +void RemoveButtonBorder(wxWindow* win); // for wxButton/wxBitmapToggleButton based controls (SwitchButton, CheckBox) +void RemoveInputBorder(wxWindow* win); // for TextCtrl based controls (TextInput, ComboBox, SpinInput..) #endif #if defined(__WXOSX__) || defined(__linux__) diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index 8fdca030c6..c979fc3212 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -865,6 +865,9 @@ PlaterPresetComboBox::PlaterPresetComboBox(wxWindow *parent, Preset::Type preset clr_picker = new wxBitmapButton(parent, wxID_ANY, {}, wxDefaultPosition, wxSize(FromDIP(20), FromDIP(20)), wxBU_EXACTFIT | wxBU_AUTODRAW | wxBORDER_NONE); clr_picker->SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE)); clr_picker->SetToolTip(_L("Click to select filament color")); +#ifdef __WXGTK__ + RemoveButtonBorder(clr_picker); +#endif clr_picker->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { // Check if it's an official filament auto fila_type = Preset::remove_suffix_modified(GetValue().ToUTF8().data()); diff --git a/src/slic3r/GUI/Widgets/CheckBox.cpp b/src/slic3r/GUI/Widgets/CheckBox.cpp index 54e98887e7..91cbb8c4e1 100644 --- a/src/slic3r/GUI/Widgets/CheckBox.cpp +++ b/src/slic3r/GUI/Widgets/CheckBox.cpp @@ -2,7 +2,7 @@ #include "../wxExtensions.hpp" -#ifdef __WXGTK3__ +#ifdef __WXGTK__ #include "../GUI_Utils.hpp" #endif @@ -29,7 +29,7 @@ CheckBox::CheckBox(wxWindow *parent, int id) Bind(wxEVT_LEAVE_WINDOW, &CheckBox::updateBitmap, this); #endif -#ifdef __WXGTK3__ +#ifdef __WXGTK__ Slic3r::GUI::RemoveButtonBorder(this); #endif diff --git a/src/slic3r/GUI/Widgets/RadioBox.cpp b/src/slic3r/GUI/Widgets/RadioBox.cpp index a8a1d8a1ef..7f20b8724c 100644 --- a/src/slic3r/GUI/Widgets/RadioBox.cpp +++ b/src/slic3r/GUI/Widgets/RadioBox.cpp @@ -2,6 +2,10 @@ #include "../wxExtensions.hpp" +#ifdef __WXGTK__ +#include "../GUI_Utils.hpp" +#endif + namespace Slic3r { namespace GUI { RadioBox::RadioBox(wxWindow *parent) @@ -15,6 +19,7 @@ RadioBox::RadioBox(wxWindow *parent) // Bind(wxEVT_TOGGLEBUTTON, [this](auto& e) { update(); e.Skip(); }); update(); #ifdef __WXGTK__ + Slic3r::GUI::RemoveButtonBorder(this); wxSize bestSize = GetBestSize(); bestSize.IncTo(m_on.GetBmpSize()); SetSize(bestSize); diff --git a/src/slic3r/GUI/Widgets/SpinInput.cpp b/src/slic3r/GUI/Widgets/SpinInput.cpp index ccd7a80447..fba5a45233 100644 --- a/src/slic3r/GUI/Widgets/SpinInput.cpp +++ b/src/slic3r/GUI/Widgets/SpinInput.cpp @@ -5,6 +5,10 @@ #include +#ifdef __WXGTK__ +#include "../GUI_Utils.hpp" +#endif + BEGIN_EVENT_TABLE(SpinInput, StaticBox) EVT_KEY_DOWN(SpinInput::keyPressed) @@ -58,6 +62,11 @@ void SpinInput::Create(wxWindow *parent, state_handler.attach({&label_color, &text_color}); state_handler.update_binds(); text_ctrl = new TextCtrl(this, wxID_ANY, text, {20, 4}, wxDefaultSize, style | wxBORDER_NONE | wxTE_PROCESS_ENTER, wxTextValidator(wxFILTER_DIGITS)); + +#ifdef __WXGTK__ + Slic3r::GUI::RemoveInputBorder(text_ctrl); +#endif + text_ctrl->SetFont(Label::Body_14); text_ctrl->SetBackgroundColour(background_color.colorForStates(state_handler.states())); text_ctrl->SetForegroundColour(text_color.colorForStates(state_handler.states())); diff --git a/src/slic3r/GUI/Widgets/SwitchButton.cpp b/src/slic3r/GUI/Widgets/SwitchButton.cpp index 9e780c0f02..c391ddd017 100644 --- a/src/slic3r/GUI/Widgets/SwitchButton.cpp +++ b/src/slic3r/GUI/Widgets/SwitchButton.cpp @@ -12,7 +12,7 @@ #include "libslic3r/MacUtils.hpp" #endif -#ifdef __WXGTK3__ +#ifdef __WXGTK__ #include "../GUI_Utils.hpp" #endif @@ -37,7 +37,7 @@ SwitchButton::SwitchButton(wxWindow* parent, wxWindowID id) Bind(wxEVT_TOGGLEBUTTON, [this](auto& e) { update(); e.Skip(); }); SetFont(Label::Body_12); -#ifdef __WXGTK3__ +#ifdef __WXGTK__ Slic3r::GUI::RemoveButtonBorder(this); #endif diff --git a/src/slic3r/GUI/Widgets/TextInput.cpp b/src/slic3r/GUI/Widgets/TextInput.cpp index 362e4c99b3..49605e048d 100644 --- a/src/slic3r/GUI/Widgets/TextInput.cpp +++ b/src/slic3r/GUI/Widgets/TextInput.cpp @@ -6,6 +6,10 @@ #include #include +#ifdef __WXGTK__ +#include "../GUI_Utils.hpp" +#endif + BEGIN_EVENT_TABLE(TextInput, StaticBox) EVT_PAINT(TextInput::paintEvent) @@ -60,6 +64,11 @@ void TextInput::Create(wxWindow * parent, state_handler.attach({&label_color, & text_color}); state_handler.update_binds(); text_ctrl = new TextCtrl(this, wxID_ANY, text, {4, 4}, wxDefaultSize, style | wxBORDER_NONE | wxTE_PROCESS_ENTER); + +#ifdef __WXGTK__ + Slic3r::GUI::RemoveInputBorder(text_ctrl); +#endif + text_ctrl->SetFont(Label::Body_14); text_ctrl->SetInitialSize(text_ctrl->GetBestSize()); text_ctrl->SetBackgroundColour(background_color.colorForStates(state_handler.states())); diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index e40046c37d..2ca8f3cfbd 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -1022,6 +1022,10 @@ ScalableButton::ScalableButton( wxWindow * parent, m_width = size.x * 10 / em; m_height= size.y * 10 / em; } + +#ifdef __WXGTK__ + Slic3r::GUI::RemoveButtonBorder(this); +#endif } From 80e64f80a613967b411c03caeafdcf13d4e7e3c5 Mon Sep 17 00:00:00 2001 From: Kenneth Raplee <101818165+kenrap@users.noreply.github.com> Date: Sat, 1 Aug 2026 03:49:28 +0000 Subject: [PATCH 034/106] Fix 32-bit build in LayerResult::make_nop_layer_result (#15036) LayerResult's second field is typed size_t, so std::numeric_limits::max should also use size_t and not something related to coordinates for the layer_id. --- src/libslic3r/GCode.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index acd5acb0a2..47abf6be85 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -184,7 +184,7 @@ struct LayerResult { // It is used for the pressure equalizer because it needs to buffer one layer back. bool nop_layer_result { false }; - static LayerResult make_nop_layer_result() { return {"", std::numeric_limits::max(), false, false, true}; } + static LayerResult make_nop_layer_result() { return {"", std::numeric_limits::max(), false, false, true}; } }; class GCode { From 95b781745dfffd458b703f6a743ba93416d5d354 Mon Sep 17 00:00:00 2001 From: "Dipl.-Ing. Raoul Rubien, BSc" Date: Sat, 1 Aug 2026 12:07:15 +0200 Subject: [PATCH 035/106] Fixes 4 Compiler Warnings (#10727) * fixes: may be used uninitialized [-Wmaybe-uninitialized] * fixes: arc_len_next may be used uninitialized [-Wmaybe-uninitialized] * review result: reverts {} initializer with = to keep code style consistent --- src/libslic3r/BoundingBox.hpp | 2 +- src/libslic3r/Fill/FillBase.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/BoundingBox.hpp b/src/libslic3r/BoundingBox.hpp index 42f5220975..8aac3f1cb9 100644 --- a/src/libslic3r/BoundingBox.hpp +++ b/src/libslic3r/BoundingBox.hpp @@ -25,7 +25,7 @@ public: min(p1), max(p1), defined(false) { merge(p2); merge(p3); } template> - BoundingBoxBase(It from, It to) + BoundingBoxBase(It from, It to) : BoundingBoxBase() { construct(*this, from, to); } BoundingBoxBase(const PointsType &points) diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index 2606529099..45157ec42d 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -1857,12 +1857,12 @@ static inline void base_support_extend_infill_lines(Polylines &infill, BoundaryI const bool first = graph.first(cp); int extend_next_idx = -1; int extend_prev_idx = -1; - coord_t dist_y_prev; - coord_t dist_y_next; - double arc_len_prev; - double arc_len_next; + coord_t dist_y_prev = 0; + coord_t dist_y_next = 0; + double arc_len_prev = 0; + double arc_len_next = 0; - if (! graph.next_vertical(cp)){ + if (! graph.next_vertical(cp)) { size_t i = cp.point_idx; size_t j = next_idx_modulo(i, contour); while (j != cp.next_on_contour->point_idx) { From abb2ab8d3fb70a943b96f395d382dfdd03d2d43a Mon Sep 17 00:00:00 2001 From: GlauTech <33813227+GlauTechCo@users.noreply.github.com> Date: Sat, 1 Aug 2026 23:26:26 +0300 Subject: [PATCH 036/106] Update OrcaSlicer_tr.po (#15060) --- localization/i18n/tr/OrcaSlicer_tr.po | 624 +++++++++++++------------- 1 file changed, 311 insertions(+), 313 deletions(-) diff --git a/localization/i18n/tr/OrcaSlicer_tr.po b/localization/i18n/tr/OrcaSlicer_tr.po index 7ef4d33cfd..fd1ad673af 100644 --- a/localization/i18n/tr/OrcaSlicer_tr.po +++ b/localization/i18n/tr/OrcaSlicer_tr.po @@ -4,7 +4,7 @@ msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-07-29 17:40-0300\n" -"PO-Revision-Date: 2026-04-08 23:59+0300\n" +"PO-Revision-Date: 2026-08-01 20:32+0300\n" "Last-Translator: GlauTech\n" "Language-Team: \n" "Language: tr\n" @@ -12,7 +12,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n==1) ? 0 : 1;\n" -"X-Generator: Po Translator App\n" +"X-Generator: Poedit 3.9\n" # AI Translated msgid "Main Extruder" @@ -84,10 +84,10 @@ msgid "Left Nozzle" msgstr "Sol Nozul" msgid "Left nozzle" -msgstr "Sol meme" +msgstr "Sol nozul" msgid "left nozzle" -msgstr "sol meme" +msgstr "sol nozul" msgid "Right Nozzle" msgstr "Sağ Nozul" @@ -96,7 +96,7 @@ msgid "Right nozzle" msgstr "Sağ nozul" msgid "right nozzle" -msgstr "sağ meme" +msgstr "sağ nozul" # AI Translated msgid "Main Hotend" @@ -818,7 +818,7 @@ msgid "Size" msgstr "Boyut" msgid "Uniform scale" -msgstr "düzgün ölçek" +msgstr "Orantılı ölçekleme" msgid "Planar" msgstr "Düzlemsel" @@ -1159,7 +1159,7 @@ msgid "Show wireframe" msgstr "Wireframe göster" msgid "Unable to apply when processing preview" -msgstr "İşlem önizlemesi sırasında uygulanamaz." +msgstr "Önizleme işlenirken uygulanamaz" msgid "Operation already cancelling. Please wait a few seconds." msgstr "İşlem zaten iptal ediliyor. Lütfen birkaç saniye bekleyin." @@ -1727,7 +1727,7 @@ msgid "Change file" msgstr "Dosyayı değiştir" msgid "Change to another SVG file." -msgstr "Başka bir .svg dosyasına geçin" +msgstr "Farklı bir SVG dosyası seç." msgid "Forget the file path" msgstr "Dosya yolunu unut" @@ -1754,7 +1754,7 @@ msgid "Save SVG file" msgstr "SVG dosyasını kaydet" msgid "Save as SVG file." -msgstr "'.svg' dosyası olarak kaydet" +msgstr "SVG dosyası olarak kaydet." msgid "Size in emboss direction." msgstr "Kabartma yönünde boyut." @@ -2430,7 +2430,7 @@ msgstr "Gizlilik Politikası Güncellemesi" # AI Translated #, c-format, boost-format msgid "your Orca Cloud profile (user ID: \"%s\")" -msgstr "Orca Cloud profiliniz (kullanıcı kimliği: \"%s\")" +msgstr "orca Cloud profiliniz (Kullanıcı ID: \"%s\")" # AI Translated msgid "your default profile" @@ -2991,22 +2991,22 @@ msgid "Auto orientation" msgstr "Otomatik yönlendirme" msgid "Auto orient the object to improve print quality" -msgstr "Baskı kalitesini artırmak için nesneyi otomatik olarak yönlendirin." +msgstr "Baskı kalitesini artırmak için nesneyi otomatik yönlendir" msgid "Edit" msgstr "Düzenle" msgid "Merge with" -msgstr "Şununla birleştir:" +msgstr "Şununla birleştir" msgid "Delete this filament" -msgstr "Bu filamanı sil" +msgstr "Bu filamenti sil" msgid "Select All" msgstr "Hepsini seç" msgid "Select all objects on the current plate" -msgstr "geçerli plakadaki tüm nesneleri seç" +msgstr "Mevcut plakadaki tüm nesneleri seç" msgid "Select All Plates" msgstr "Tüm Plakaları Seç" @@ -3018,7 +3018,7 @@ msgid "Delete All" msgstr "Hepsini sil" msgid "Delete all objects on the current plate" -msgstr "geçerli plakadaki tüm nesneleri sil" +msgstr "Mevcut tabladaki tüm nesneleri sil" msgid "Arrange" msgstr "Hizala" @@ -3410,7 +3410,7 @@ msgid "Invalid numeric." msgstr "Geçersiz sayı." msgid "One cell can only be copied to one or more cells in the same column." -msgstr "bir hücre aynı sütundaki yalnızca bir veya daha fazla hücreye kopyalanabilir" +msgstr "Bir hücre yalnızca aynı sütundaki bir veya daha fazla hücreye kopyalanabilir." msgid "Copying multiple cells is not supported." msgstr "Birden fazla hücre kopyalama desteklenmiyor." @@ -3478,13 +3478,13 @@ msgid "More" msgstr "Daha" msgid "Open Preferences" -msgstr "Tercihler'i açın." +msgstr "Tercihleri Aç" msgid "Open next tip" -msgstr "Sonraki ipucunu açın." +msgstr "Sonraki ipucunu aç" msgid "Open documentation in web browser" -msgstr "Belgeleri web tarayıcısında açın." +msgstr "Dokümantasyonu web tarayıcısında aç" msgid "Color" msgstr "Renk" @@ -3517,7 +3517,7 @@ msgid "Jump to layer" msgstr "Katmana Atla" msgid "Please enter the layer number." -msgstr "Lütfen katman numarasını girin" +msgstr "Lütfen katman numarasını girin." msgid "Add Pause" msgstr "Duraklatma Ekle" @@ -3605,7 +3605,7 @@ msgid "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatica msgstr "Bir AMS yuvası seçin ve filamentleri otomatik olarak yüklemek veya boşaltmak için “Yükle” veya “Boşalt” düğmesine basın." msgid "Filament type is unknown which is required to perform this action. Please set target filament's informations." -msgstr "Bu eylemi gerçekleştirmek için gereken filaman türü bilinmiyor. Lütfen hedef filamanın bilgilerini ayarlayın." +msgstr "Bu eylemi gerçekleştirmek için gereken filament türü bilinmiyor. Lütfen hedef filamentin bilgilerini ayarlayın." # AI Translated msgid "AMS has not been initialized. Please initialize it before use." @@ -3759,10 +3759,10 @@ msgid "Switch track at Filament Track Switch" msgstr "Filament Track Switch'te hattı değiştir" msgid "The maximum temperature cannot exceed " -msgstr "Maksimum sıcaklık aşılamaz" +msgstr "Maksimum sıcaklık şu değeri aşamaz: " msgid "The minmum temperature should not be less than " -msgstr "Minimum sıcaklık," +msgstr "Minimum sıcaklık şu değerden az olamaz: " # AI Translated msgid "Type to filter..." @@ -4284,7 +4284,7 @@ msgid "" "The nozzle flow is not set. Please set the nozzle flow rate before editing the filament.\n" "'Device -> Print parts'" msgstr "" -"Meme akışı ayarlanmamış. Lütfen filamenti düzenlemeden önce nozül akış hızını ayarlayın.\n" +"Nozul akışı ayarlanmamış. Lütfen filamenti düzenlemeden önce nozul akış hızını ayarlayın.\n" "'Cihaz -> Parçaları yazdır'" msgid "AMS" @@ -4370,7 +4370,7 @@ msgid "" "And you can click it to modify" msgstr "" "Üst yarı alanı: Orijinal\n" -"Alt yarı alan: Eşleme kaldırıldığında orijinal projedeki filaman kullanılacaktır.\n" +"Alt yarı alan: Eşleme kaldırıldığında orijinal projedeki filament kullanılacaktır.\n" "Ve değiştirmek için tıklayabilirsiniz" msgid "" @@ -4471,7 +4471,7 @@ msgstr "AMS'yi Etkinleştirme" # AI Translated msgid "Print using filament on external spool." -msgstr "Harici makaradaki filamenti kullanarak yazdırma" +msgstr "Harici makaradaki filamenti kullanarak yazdır." msgid "Print with filament in AMS" msgstr "AMS içerisindeki filamentlerle yazdırma" @@ -4508,7 +4508,7 @@ msgid "" "When the current filament runs out, the printer will use identical filament to continue printing.\n" "*Identical filament: same brand, type and color." msgstr "" -"Mevcut filaman bittiğinde yazıcı, yazdırmaya devam etmek için aynı filamanı kullanacaktır.\n" +"Mevcut filament bittiğinde yazıcı, yazdırmaya devam etmek için aynı filamenti kullanacaktır.\n" "*Aynı filament: aynı marka, tip ve renkte." msgid "DRY" @@ -4527,14 +4527,14 @@ msgid "The AMS will automatically read the filament information when inserting a msgstr "AMS, yeni bir Bambu Lab filamenti takıldığında filament bilgilerini otomatik olarak okuyacaktır. Bu yaklaşık 20 saniye sürer." msgid "Note: if a new filament is inserted during printing, the AMS will not automatically read any information until printing is completed." -msgstr "Not: Yazdırma sırasında yeni bir filaman takılırsa AMS, yazdırma tamamlanana kadar herhangi bir bilgiyi otomatik olarak okumayacaktır." +msgstr "Not: Yazdırma sırasında yeni bir filament takılırsa AMS, yazdırma tamamlanana kadar herhangi bir bilgiyi otomatik olarak okumayacaktır." msgid "When inserting a new filament, the AMS will not automatically read its information, leaving it blank for you to enter manually." msgstr "Yeni bir filament yerleştirirken AMS, bilgileri otomatik olarak okumaz ve manuel olarak girmeniz için boş bırakır." # AI Translated msgid "Update on startup" -msgstr "Başlangıçta güncelle" +msgstr "Açılışta güncelle" msgid "The AMS will automatically read the information of inserted filament on start-up. It will take about 1 minute. The reading process will rotate the filament spools." msgstr "AMS, başlangıçta takılan filamentin bilgilerini otomatik olarak okuyacaktır. Yaklaşık 1 dakika sürecektir. Okuma işlemi filament makaralarını saracaktır." @@ -4570,7 +4570,7 @@ msgid "The printer is busy and cannot switch AMS type." msgstr "Yazıcı meşgul ve AMS türünü değiştiremiyor." msgid "Please unload all filament before switching." -msgstr "Lütfen değiştirmeden önce tüm filamanı boşaltın." +msgstr "Lütfen değiştirmeden önce tüm filamenti boşaltın." msgid "AMS type switching needs firmware update, taking about 30s. Switch now?" msgstr "AMS tipi anahtarlama, yaklaşık 30 saniye süren ürün yazılımı güncellemesi gerektirir. Şimdi değiştirilsin mi?" @@ -4594,7 +4594,7 @@ msgid "Failed to install the plug-in. The plug-in file may be in use. Please res msgstr "Eklenti yüklenemedi. Eklenti dosyası kullanımda olabilir. Lütfen OrcaSlicer'ı yeniden başlatın ve tekrar deneyin. Ayrıca anti-virüs yazılımı tarafından engellenip engellenmediğini veya silinip silinmediğini de kontrol edin." msgid "Click here to see more info" -msgstr "daha fazla bilgi görmek için burayı tıklayın" +msgstr "Daha fazla bilgi görmek için buraya tıklayın" msgid "The network plug-in was installed but could not be loaded. Please restart the application." msgstr "Ağ eklentisi kuruldu ancak yüklenemedi. Lütfen uygulamayı yeniden başlatın." @@ -4612,7 +4612,7 @@ msgid "Go Home" msgstr "Anasayfaya Git" msgid "An error occurred. The system may have run out of memory, or a bug may have occurred." -msgstr "Bir hata oluştu. Belki sistemin hafızası yeterli değildir veya programın bir hatasıdır" +msgstr "Bir hata oluştu. Sistem belleği tükenmiş veya bir yazılım hatası meydana gelmiş olabilir." #, boost-format msgid "A fatal error occurred: \"%1%\"" @@ -4622,7 +4622,7 @@ msgid "Please save your project and restart the application." msgstr "Lütfen projeyi kaydedin ve programı yeniden başlatın." msgid "Processing G-Code from previous file…" -msgstr "Önceki dosyadan G Kodu işleniyor..." +msgstr "Önceki dosyadan G-Kodu işleniyor…" msgid "Slicing complete" msgstr "Dilimleme tamamlandı" @@ -4686,7 +4686,7 @@ msgid "G-code file exported to %1%" msgstr "G kodu dosyası %1%’e aktarıldı" msgid "Unknown error with G-code export" -msgstr "G kodunu dışa aktarırken bilinmeyen hata." +msgstr "G-code dışa aktarımında bilinmeyen hata" #, boost-format msgid "" @@ -4699,7 +4699,7 @@ msgstr "" "Kaynak dosya %2%." msgid "Copying of the temporary G-code to the output G-code failed." -msgstr "Geçici G kodunun çıkış G koduna kopyalanması başarısız oldu" +msgstr "Geçici G-kodu dosyasının çıktı G-kodu dosyasına kopyalanması başarısız oldu." #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" @@ -4801,7 +4801,7 @@ msgid "" "Value was reset to 0.5" msgstr "" "Maksimum hacimsel hız çok küçük.\n" -"0,5'e sıfırla." +"Değer 0.5 olarak sıfırlandı" #, c-format, boost-format msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d" @@ -4816,24 +4816,24 @@ msgid "" "Layer height too small\n" "It has been reset to 0.2" msgstr "" -"Katman yüksekliği çok küçük.\n" -"0,2'ye sıfırla." +"Katman yüksekliği çok küçük\n" +"Değer 0.2 olarak yeniden ayarlandı" msgid "" "Ironing spacing too small\n" "It has been reset to 0.1" msgstr "" -"Çok küçük ütüleme aralığı.\n" -"0,1'e sıfırla." +"Ütüleme satır aralığı çok küçük\n" +"Değer 0.1 olarak yeniden ayarlandı" msgid "" "Zero initial layer height is invalid.\n" "\n" "The first layer height will be reset to 0.2." msgstr "" -"Sıfır başlangıç katman yüksekliği geçersiz.\n" +"İlk katman yüksekliği sıfır olamaz.\n" "\n" -"İlk katman yüksekliği 0.2 olarak sıfırlanacak." +"İlk katman yüksekliği 0.2 olarak sıfırlandı." # AI Translated msgid "" @@ -4909,8 +4909,8 @@ msgid "" "seam_slope_start_height need to be smaller than layer_height.\n" "Reset to 0." msgstr "" -"Dikiş eğimi başlangıç yüksekliğinin katman yüksekliğinden daha küçük olması gerekir.\n" -"0 a sıfırla." +"seam_slope_start_height, layer_height değerinden küçük olmalıdır.\n" +"Değeri 0 yapın." #, no-c-format, no-boost-format msgid "" @@ -4969,7 +4969,7 @@ msgid "Paused (filament ran out)" msgstr "Duraklatıldı (filament bitti)" msgid "Heating nozzle" -msgstr "Isıtma memesi" +msgstr "Isıtma nozulü" msgid "Calibrating dynamic flow" msgstr "Dinamik akışı kalibre etme" @@ -5065,7 +5065,7 @@ msgid "Measure motion accuracy" msgstr "Hareket doğruluğunu ölçün" msgid "Nozzle offset calibration" -msgstr "Meme ofset kalibrasyonu" +msgstr "Nozul ofset kalibrasyonu" msgid "High temperature auto bed leveling" msgstr "Yüksek sıcaklıkta otomatik yatak tesviyesi" @@ -5122,7 +5122,7 @@ msgid "Measuring Surface" msgstr "Ölçüm Yüzeyi" msgid "Calibrating the detection position of nozzle clumping" -msgstr "Meme topaklanmasının algılama konumunu kalibre etme" +msgstr "Nozul topaklanmasının algılama konumunu kalibre etme" msgid "Update successful." msgstr "Güncelleme başarılı." @@ -5153,17 +5153,17 @@ msgstr "Güvenliğinizi sağlamak için belirli işleme görevleri (lazer gibi) #, c-format, boost-format msgid "The chamber temperature is too high, which may cause the filament to soften. Please wait until the chamber temperature drops below %d℃. You may open the front door or enable fans to cool down." -msgstr "Oda sıcaklığı çok yüksek, bu da filamanın yumuşamasına neden olabilir. Lütfen hazne sıcaklığı %d°C'nin altına düşene kadar bekleyin. Ön kapıyı açabilir veya fanların soğumasını sağlayabilirsiniz." +msgstr "Oda sıcaklığı çok yüksek, bu da filamentin yumuşamasına neden olabilir. Lütfen hazne sıcaklığı %d°C'nin altına düşene kadar bekleyin. Ön kapıyı açabilir veya fanların soğumasını sağlayabilirsiniz." #, c-format, boost-format msgid "AMS temperature is too high, which may cause the filament to soften. Please wait until the AMS temperature drops below %d℃." -msgstr "AMS sıcaklığı çok yüksek, bu da filamanın yumuşamasına neden olabilir. Lütfen AMS sıcaklığı %d°C'nin altına düşene kadar bekleyin." +msgstr "AMS sıcaklığı çok yüksek, bu da filamentin yumuşamasına neden olabilir. Lütfen AMS sıcaklığı %d°C'nin altına düşene kadar bekleyin." msgid "The current chamber temperature or the target chamber temperature exceeds 45℃. In order to avoid extruder clogging, low temperature filament(PLA/PETG/TPU) is not allowed to be loaded." msgstr "Mevcut hazne sıcaklığı veya hedef hazne sıcaklığı 45°C'yi aşıyor. Ekstruderin tıkanmasını önlemek için düşük sıcaklık filamentinin (PLA/PETG/TPU) yüklenmesine izin verilmez." msgid "Low temperature filament(PLA/PETG/TPU) is loaded in the extruder. In order to avoid extruder clogging, it is not allowed to set the chamber temperature." -msgstr "Ekstrudere düşük sıcaklık filamanı (PLA/PETG/TPU) yüklenir. Ekstruderin tıkanmasını önlemek için hazne sıcaklığının ayarlanmasına izin verilmez." +msgstr "Ekstrudere düşük sıcaklık filamenti (PLA/PETG/TPU) yüklenir. Ekstruderin tıkanmasını önlemek için hazne sıcaklığının ayarlanmasına izin verilmez." msgid "When you set the chamber temperature below 40℃, the chamber temperature control will not be activated, and the target chamber temperature will automatically be set to 0℃." msgstr "Hazne sıcaklığını 40°C'nin altına ayarladığınızda, hazne sıcaklık kontrolü etkinleştirilmeyecektir. Ve hedef hazne sıcaklığı otomatik olarak 0°C'ye ayarlanacaktır." @@ -5477,7 +5477,7 @@ msgid "Noop" msgstr "Hayır" msgid "Retract" -msgstr "Geri çekme" +msgstr "Geri Çekme" msgid "Unretract" msgstr "İleri İtme" @@ -5568,10 +5568,10 @@ msgid "Layer Time: " msgstr "Katman Süresi: " msgid "Tool: " -msgstr "Alet:" +msgstr "Kafa: " msgid "Color: " -msgstr "Renk:" +msgstr "Renk: " # AI Translated msgid "Acceleration: " @@ -5581,7 +5581,7 @@ msgid "Jerk: " msgstr "Jerk: " msgid "PA: " -msgstr "PA:" +msgstr "PA: " msgid "mm/s" msgstr "mm/s" @@ -5780,7 +5780,7 @@ msgid "" "Please ensure the filaments used by this object are not arranged to other nozzles." msgstr "" "Yalnızca sol/sağ püskürtme ucu alanına bir nesne yerleştirilmiş veya sol püskürtme ucunun yazdırılabilir yüksekliğini aşıyor.\n" -"Lütfen bu nesne tarafından kullanılan filamanların diğer püskürtme uçlarına göre düzenlenmediğinden emin olun." +"Lütfen bu nesne tarafından kullanılan filamentlerin diğer püskürtme uçlarına göre düzenlenmediğinden emin olun." msgid "" "An object is laid over the boundary of plate or exceeds the height limit.\n" @@ -5852,7 +5852,7 @@ msgid "The position or size of the model %s exceeds the %s's printable range." msgstr "%s modelinin konumu veya boyutu %s'nin yazdırılabilir aralığını aşıyor." msgid " Please check and adjust the part's position or size to fit the printable range:\n" -msgstr "Lütfen parçanın konumunu veya boyutunu kontrol edip yazdırılabilir aralığa uyacak şekilde ayarlayın:\n" +msgstr " Lütfen parçanın konumunu veya boyutunu basılabilir alana sığacak şekilde kontrol edip ayarlayın:\n" #, boost-format msgid "Left nozzle: X:%1%-%2%, Y:%3%-%4%, Z:%5%-%6%\n" @@ -5958,7 +5958,7 @@ msgid "Select Plate" msgstr "Plaka Seç" msgid "Slicing" -msgstr "Dilimleniyor" +msgstr "Dilimleme" msgid "Slice all" msgstr "Hepsini dilimle" @@ -6072,19 +6072,19 @@ msgstr "Araç %d" #, c-format, boost-format msgid "Filament %s is placed in the %s, but the generated G-code path exceeds the printable range of the %s." -msgstr "%s filamanı %s içine yerleştirildi, ancak oluşturulan G kodu yolu %s'nin yazdırılabilir aralığını aşıyor." +msgstr "%s filamenti %s içine yerleştirildi, ancak oluşturulan G kodu yolu %s'nin yazdırılabilir aralığını aşıyor." #, c-format, boost-format msgid "Filaments %s are placed in the %s, but the generated G-code path exceeds the printable range of the %s." -msgstr "%s filamanları %s içine yerleştirildi, ancak oluşturulan G kodu yolu %s'nin yazdırılabilir aralığını aşıyor." +msgstr "%s filamentleri %s içine yerleştirildi, ancak oluşturulan G kodu yolu %s'nin yazdırılabilir aralığını aşıyor." #, c-format, boost-format msgid "Filament %s is placed in the %s, but the generated G-code path exceeds the printable height of the %s." -msgstr "%s filamanı %s'e yerleştirildi, ancak oluşturulan G kodu yolu %s'nin yazdırılabilir yüksekliğini aşıyor." +msgstr "%s filamenti %s'e yerleştirildi, ancak oluşturulan G kodu yolu %s'nin yazdırılabilir yüksekliğini aşıyor." #, c-format, boost-format msgid "Filaments %s are placed in the %s, but the generated G-code path exceeds the printable height of the %s." -msgstr "%s filamanları %s'e yerleştirildi, ancak oluşturulan G kodu yolu %s'nin yazdırılabilir yüksekliğini aşıyor." +msgstr "%s filamentleri %s'e yerleştirildi, ancak oluşturulan G kodu yolu %s'nin yazdırılabilir yüksekliğini aşıyor." msgid "Open wiki for more information." msgstr "Daha fazla bilgi için wiki'yi açın." @@ -6200,7 +6200,7 @@ msgstr "" "şekilde gösterildiği gibi yazıcıda:" msgid "Invalid input" -msgstr "Geçersiz Giriş." +msgstr "Geçersiz değer" msgid "New Window" msgstr "Yeni Pencere" @@ -6581,7 +6581,7 @@ msgid "Flow Rate Calibration" msgstr "Akış Hızı Kalibrasyonu" msgid "Retraction" -msgstr "Geri Çekme" +msgstr "Geri çekme" msgid "Cornering" msgstr "Köşe dönüşü" @@ -7193,7 +7193,7 @@ msgid "When printing is paused, filament loading and unloading are only supporte msgstr "Yazdırma duraklatıldığında filament yükleme ve boşaltma yalnızca harici yuvalar için desteklenir." msgid "Current extruder is busy changing filament." -msgstr "Mevcut ekstruder filamanı değiştirmekle meşgul." +msgstr "Mevcut ekstruder filamenti değiştirmekle meşgul." # AI Translated msgid "\"Load\" or \"Unload\" is not supported for external spool while using Filament Track Switch." @@ -7336,7 +7336,7 @@ msgid "Upload failed\n" msgstr "Yükleme başarısız\n" msgid "Obtaining instance_id failed\n" -msgstr "instance_id alınamadı\n" +msgstr "Örnek kimliği (instance_id) alınamadı\n" msgid "" "Your comment result cannot be uploaded due to the following reasons:\n" @@ -7505,13 +7505,13 @@ msgid "Undo integration failed." msgstr "Entegrasyon geri alınamadı." msgid "Exporting" -msgstr "Dışa Aktarılıyor." +msgstr "Dışa aktarılıyor" msgid "An update is available!" -msgstr "Yazılımın Yeni sürümü var." +msgstr "Yeni bir güncelleme mevcut!" msgid "Go to download page" -msgstr "İndirme sayfasına gidin." +msgstr "İndirme sayfasına git" msgid "Open Folder." msgstr "Klasörü Aç." @@ -7726,10 +7726,10 @@ msgid "Nozzle Clumping Detection" msgstr "Nozul Topaklanma Algılaması" msgid "Check if the nozzle is clumping by filaments or other foreign objects." -msgstr "Memenin filamanlar veya diğer yabancı nesneler tarafından topaklanıp topaklanmadığını kontrol edin." +msgstr "Nozulun filamentler veya diğer yabancı nesneler tarafından topaklanıp topaklanmadığını kontrol edin." msgid "Detects air printing caused by nozzle clogging or filament grinding." -msgstr "Nozul tıkanması veya filaman taşlamasından kaynaklanan hava baskısını algılar." +msgstr "Nozul tıkanması veya filament taşlamasından kaynaklanan hava baskısını algılar." msgid "First Layer Inspection" msgstr "Birinci Katman Denetimi" @@ -7901,14 +7901,14 @@ msgid "Mixing %1% with %2% in printing is not recommended.\n" msgstr "Yazdırmada %1% ile %2%'nin karıştırılması önerilmez.\n" msgid " nozzle" -msgstr "meme" +msgstr " nozul" #, boost-format msgid "It is not recommended to print the following filament(s) with %1%: %2%\n" msgstr "Aşağıdaki filament(ler)in %1%: %2% ile yazdırılması önerilmez.\n" msgid "It is not recommended to use the following nozzle and filament combinations:\n" -msgstr "Aşağıdaki nozul ve filaman kombinasyonlarının kullanılması tavsiye edilmez:\n" +msgstr "Aşağıdaki nozul ve filament kombinasyonlarının kullanılması tavsiye edilmez:\n" #, boost-format msgid "%1% with %2%\n" @@ -7982,7 +7982,7 @@ msgstr "" "Senkronizasyona devam edeceğinizden emin misiniz?" msgid "There are unset nozzle types. Please set the nozzle types of all extruders before synchronizing." -msgstr "Ayarlanmamış nozul tipleri vardır. Lütfen senkronizasyondan önce tüm ekstrüderlerin nozül tiplerini ayarlayın." +msgstr "Ayarlanmamış nozul tipleri vardır. Lütfen senkronizasyondan önce tüm ekstrüderlerin nozul tiplerini ayarlayın." msgid "Sync extruder infomation" msgstr "Ekstruder bilgilerini senkronize et" @@ -8045,7 +8045,7 @@ msgstr "" "Sistem ön ayarlarında bir güncelleme olup olmadığını kontrol etmek için lütfen Orca Slicer'ı güncelleyin veya Orca Slicer'ı yeniden başlatın." msgid "Only filament color information has been synchronized from printer." -msgstr "Yazıcıdan yalnızca filaman renk bilgisi senkronize edildi." +msgstr "Yazıcıdan yalnızca filament renk bilgisi senkronize edildi." msgid "Filament type and color information have been synchronized, but slot information is not included." msgstr "Filament türü ve renk bilgisi senkronize edilmiştir ancak slot bilgisi dahil edilmemiştir." @@ -8249,7 +8249,7 @@ msgid "Export AMF file:" msgstr "AMF dosyasını dışa aktar:" msgid "Save file as" -msgstr "Farklı kaydet:" +msgstr "Dosyayı farklı kaydet" msgid "Export OBJ file:" msgstr "OBJ dosyasını dışa aktar:" @@ -8420,7 +8420,7 @@ msgid "" "Would you like to sync now?" msgstr "" "Püskürtme ucu türü ve AMS miktarı bilgileri bağlı yazıcıdan senkronize edilmedi.\n" -"Senkronizasyondan sonra yazılım, dilimleme sırasında baskı süresini ve filaman kullanımını optimize edebilir.\n" +"Senkronizasyondan sonra yazılım, dilimleme sırasında baskı süresini ve filament kullanımını optimize edebilir.\n" "Şimdi senkronize etmek ister misiniz?" msgid "Sync now" @@ -8455,7 +8455,7 @@ msgid "Download failed; unknown file format." msgstr "İndirme başarısız oldu, dosya türü bilinmiyor." msgid "Downloading project..." -msgstr "proje indiriliyor..." +msgstr "Proje indiriliyor..." msgid "Download failed; File size exception." msgstr "İndirme başarısız oldu, Dosya boyutu sorunlu." @@ -8483,10 +8483,10 @@ msgid "The selected file" msgstr "Seçili dosya" msgid "Does not contain valid G-code." -msgstr "geçerli gcode içermiyor." +msgstr "Geçerli bir G-kodu içermiyor." msgid "An Error has occurred while loading the G-code file." -msgstr "G kodu dosyası yüklenirken hata oluşuyor" +msgstr "G-code dosyası yüklenirken bir hata oluştu." #. TRN %1% is archive path #, boost-format @@ -8524,7 +8524,7 @@ msgid "G-code files and models cannot be loaded together!" msgstr "G kodu dosyaları modellerle birlikte yüklenemez!" msgid "Unable to add models in preview mode" -msgstr "Önizleme modundayken model eklenemiyor!" +msgstr "Önizleme modundayken model ekleyemezsiniz" msgid "All objects will be removed, continue?" msgstr "Tüm nesneler kaldırılacak, devam edilsin mi?" @@ -8558,7 +8558,7 @@ msgid "The file %s has been sent to the printer's storage space and can be viewe msgstr "%s dosyası yazıcının depolama alanına gönderildi ve yazıcıda görüntülenebiliyor." msgid "The nozzle type is not set. Please set the nozzle and try again." -msgstr "Nozül tipi ayarlanmamış. Lütfen memeyi ayarlayın ve tekrar deneyin." +msgstr "Nozul tipi ayarlanmamış. Lütfen nozulu ayarlayın ve tekrar deneyin." msgid "The nozzle type is not set. Please check." msgstr "Nozül tipi ayarlanmamış. Lütfen kontrol edin." @@ -8813,7 +8813,7 @@ msgid "" msgstr "" "Önemli ölçüde farklı sıcaklıklara sahip filamentlerin kullanılması aşağıdakilere neden olabilir:\n" "• Ekstruder tıkanması\n" -"• Meme hasarı\n" +"• Nozul hasarı\n" "• Katman yapışma sorunları\n" "\n" "Bu özelliği etkinleştirmeye devam etmek istiyor musunuz?" @@ -8863,7 +8863,7 @@ msgid "Associate" msgstr "Ortak" msgid "with OrcaSlicer so that Orca can open models from" -msgstr "Orca’nın modelleri açabilmesi için OrcaSlicer ile" +msgstr "orca'nın modelleri şuradan açabilmesi için OrcaSlicer ile (ilişkilendir / eşleştir)" msgid "Current Association: " msgstr "Mevcut Bağlantı: " @@ -8899,7 +8899,7 @@ msgid "Enable dark Mode" msgstr "Karanlık modu etkinleştir" msgid "Allow only one OrcaSlicer instance" -msgstr "Yalnızca bir OrcaSlicer örneğine izin ver" +msgstr "Yalnızca bir orca slicer örneğine izin ver" msgid "On OSX there is always only one instance of app running by default. However it is allowed to run multiple instances of same app from the command line. In such case this settings will allow only one instance." msgstr "OSX’te her zaman varsayılan olarak çalışan tek bir uygulama örneği vardır. Ancak aynı uygulamanın birden fazla örneğinin komut satırından çalıştırılmasına izin verilir. Böyle bir durumda bu ayarlar yalnızca bir örneğe izin verecektir." @@ -9038,7 +9038,7 @@ msgid "If enabled, saved projects store the absolute path to imported source fil msgstr "Etkinleştirildiğinde kaydedilen projeler, içe aktarılan kaynak dosyaların (STEP/STL/...) mutlak yolunu saklar; böylece kaynak dosya projeden farklı bir klasörde tutulsa bile \"Diskten yeniden yükle\" çalışmayı sürdürür. Devre dışı bırakıldığında yalnızca dosya adı saklanır; bu da projeleri taşınabilir tutar ve mutlak yolların gömülmesini önler." msgid "Preset" -msgstr "Ön ayar" +msgstr "Ön Ayar" msgid "Remember printer configuration" msgstr "Yazıcı yapılandırmasını hatırla" @@ -9065,7 +9065,7 @@ msgid "filaments" msgstr "filamentler" msgid "Optimizes filament area maximum height by chosen filament count." -msgstr "Seçilen filaman sayısına göre filaman alanı maksimum yüksekliğini optimize eder." +msgstr "Seçilen filament sayısına göre filament alanı maksimum yüksekliğini optimize eder." # AI Translated msgid "Show shared profiles notification" @@ -9079,7 +9079,7 @@ msgid "Features" msgstr "Özellikler" msgid "Multi device management" -msgstr "Çoklu Cihaz Yönetimi" +msgstr "Çoklu cihaz yönetimi" msgid "With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices." msgstr "Bu seçenek etkinleştirildiğinde, aynı anda birden fazla cihaza bir görev gönderebilir ve birden fazla cihazı yönetebilirsiniz." @@ -9159,7 +9159,7 @@ msgstr "Kaydır" # AI Translated msgid "Left Mouse Drag" -msgstr "Sol Fare Sürükleme" +msgstr "Sol fare sürükleme" # AI Translated msgid "Set the action that dragging the left mouse button should perform." @@ -9167,7 +9167,7 @@ msgstr "Sol fare düğmesiyle sürüklemenin gerçekleştireceği eylemi ayarlay # AI Translated msgid "Middle Mouse Drag" -msgstr "Orta Fare Sürükleme" +msgstr "Orta fare sürükleme" # AI Translated msgid "Set the action that dragging the middle mouse button should perform." @@ -9175,14 +9175,14 @@ msgstr "Orta fare düğmesiyle sürüklemenin gerçekleştireceği eylemi ayarla # AI Translated msgid "Right Mouse Drag" -msgstr "Sağ Fare Sürükleme" +msgstr "Sağ fare sürükleme" # AI Translated msgid "Set the action that dragging the right mouse button should perform." msgstr "Sağ fare düğmesiyle sürüklemenin gerçekleştireceği eylemi ayarlayın." msgid "Clear my choice on..." -msgstr "Seçimimi temizle..." +msgstr "Seçimimi Temizle" msgid "Unsaved projects" msgstr "Kaydedilmemiş projeler" @@ -9245,7 +9245,7 @@ msgid "Renders cast shadows on the plate, other objects, and each object onto it msgstr "Gerçekçi görünümde plakaya, diğer nesnelere ve her nesnenin kendi üzerine düşen gölgeleri işler." msgid "Anti-aliasing" -msgstr "Anti-aliasing" +msgstr "Anti-Aliasing" # AI Translated msgid "MSAA Multiplier" @@ -9382,7 +9382,7 @@ msgid "Allow logging into Bambu Cloud alongside Orca Cloud. When enabled, a Bamb msgstr "Orca Cloud'un yanı sıra Bambu Cloud'a giriş yapılmasına izin verir. Etkinleştirildiğinde ana sayfada bir Bambu giriş bölümü görünür." msgid "Update & sync" -msgstr "Güncelle ve senkronize et" +msgstr "Güncelle ve Senkronize Et" msgid "Check for stable updates only" msgstr "Yalnızca kararlı güncellemeleri kontrol edin" @@ -9394,7 +9394,7 @@ msgid "Filament sync mode" msgstr "Filament senkronizasyon modu" msgid "Choose whether sync updates both filament preset and color, or only color." -msgstr "Senkronizasyonun hem filaman ön ayarını hem de rengini mi, yoksa yalnızca rengi mi güncelleyeceğini seçin." +msgstr "Senkronizasyonun hem filament ön ayarını hem de rengini mi, yoksa yalnızca rengi mi güncelleyeceğini seçin." msgid "Filament & Color" msgstr "Filament ve Renk" @@ -9403,7 +9403,7 @@ msgid "Color only" msgstr "Yalnızca renk" msgid "Update built-in presets automatically." -msgstr "Yerleşik Ön Ayarları otomatik olarak güncelleyin." +msgstr "Yerleşik ön ayarları otomatik olarak güncelleyin." msgid "Use encrypted file for token storage" msgstr "Belirteç depolaması için şifrelenmiş dosyayı kullan" @@ -9413,7 +9413,7 @@ msgstr "Kimlik doğrulama belirteçlerini sistem anahtarlığı yerine şifrelen # AI Translated msgid "Bambu network plug-in" -msgstr "Bambu ağ eklentisi" +msgstr "Bambu Ağ Eklentisi" # AI Translated msgid "Enable Bambu network plug-in" @@ -9440,7 +9440,7 @@ msgid "Associate 3MF files to OrcaSlicer" msgstr ".3mf dosyalarını OrcaSlicer ile ilişkilendirin" msgid "If enabled, this sets OrcaSlicer as the default application to open 3MF files." -msgstr "Etkinleştirilirse, OrcaSlicer'ı .3mf dosyalarını açacak varsayılan uygulama olarak ayarlar" +msgstr "Etkinleştirilirse, 3MF dosyalarını açmak için OrcaSlicer'ı varsayılan uygulama olarak ayarlar." msgid "Associate DRC files to OrcaSlicer" msgstr "DRC dosyalarını OrcaSlicer ile ilişkilendirin" @@ -9452,13 +9452,13 @@ msgid "Associate STL files to OrcaSlicer" msgstr ".stl dosyalarını OrcaSlicer ile ilişkilendirin" msgid "If enabled, this sets OrcaSlicer as the default application to open STL files." -msgstr "Etkinleştirilirse OrcaSlicer'ı .stl dosyalarını açmak için varsayılan uygulama olarak ayarlar" +msgstr "Etkinleştirilirse, STL dosyalarını açmak için OrcaSlicer'ı varsayılan uygulama olarak ayarlar." msgid "Associate STEP files to OrcaSlicer" msgstr ".step/.stp dosyalarını OrcaSlicer ile ilişkilendirin" msgid "If enabled, this sets OrcaSlicer as the default application to open STEP files." -msgstr "Etkinleştirilirse, OrcaSlicer'ı .step dosyalarını açmak için varsayılan uygulama olarak ayarlar" +msgstr "Etkinleştirilirse, STEP dosyalarını açmak için OrcaSlicer'ı varsayılan uygulama olarak ayarlar." msgid "Associate web links to OrcaSlicer" msgstr "Web bağlantılarını OrcaSlicer ile ilişkilendirin" @@ -9561,10 +9561,10 @@ msgid "Product host" msgstr "Ürün ana bilgisayarı" msgid "Debug save button" -msgstr "hata ayıklama kaydet düğmesi" +msgstr "Hata ayıklama kaydetme butonu" msgid "Save debug settings" -msgstr "hata ayıklama ayarlarını kaydet" +msgstr "Hata ayıklama ayarlarını kaydet" msgid "Debug settings have been saved successfully!" msgstr "DEBUG ayarları başarıyla kaydedildi!" @@ -9612,7 +9612,7 @@ msgid "Change extruder color" msgstr "Ekstruder rengini değiştir" msgid "Unspecified" -msgstr "belirtilmemiş" +msgstr "Tanımlanmamış" msgid "Project-inside presets" msgstr "Proje içi ön ayarlar" @@ -9799,22 +9799,22 @@ msgstr "Görev iptal edildi" # AI Translated msgid "Bambu Cool Plate" -msgstr "Bambu Soğuk Plaka" +msgstr "Bambu Cool Plate" msgid "PLA Plate" msgstr "PLA Plaka" msgid "Bambu Engineering Plate" -msgstr "Bambu Mühendislik Plakası" +msgstr "Bambu Engineering Plate" msgid "Bambu Smooth PEI Plate" -msgstr "Bambu Pürüzsüz PEI Plaka" - -msgid "High temperature Plate" msgstr "Bambu Smooth PEI Plate" +msgid "High temperature Plate" +msgstr "High temperature Plate" + msgid "Bambu Textured PEI Plate" -msgstr "Bambu Dokulu PEI Plaka" +msgstr "Bambu Textured PEI Plate" msgid "Bambu Cool Plate SuperTack" msgstr "Bambu Cool Plate SuperTack" @@ -9832,7 +9832,7 @@ msgid "Multi-color with external" msgstr "Çok renkli harici" msgid "Your filament grouping method in the sliced file is not optimal." -msgstr "Dilimlenmiş dosyadaki filaman gruplama yönteminiz optimal değil." +msgstr "Dilimlenmiş dosyadaki filament gruplama yönteminiz optimal değil." # AI Translated msgid "To ensure print quality, the drying temperature will be lowered during printing." @@ -9881,7 +9881,7 @@ msgid "Nozzles and filaments of the same type share the same PA profile." msgstr "Aynı tipteki nozullar ve filamentler aynı PA profilini paylaşır." msgid "Send complete" -msgstr "gönderme tamamlandı" +msgstr "Gönderme tamamlandı" msgid "Error code" msgstr "Hata kodu" @@ -9962,10 +9962,10 @@ msgid "Errors" msgstr "Hatalar" msgid "More than one filament types have been mapped to the same external spool, which may cause printing issues. The printer won't pause during printing." -msgstr "Aynı harici makaraya birden fazla filaman türü eşlenmiştir; bu durum, yazdırma sorunlarına neden olabilir. Yazıcı yazdırma sırasında duraklamaz." +msgstr "Aynı harici makaraya birden fazla filament türü eşlenmiştir; bu durum, yazdırma sorunlarına neden olabilir. Yazıcı yazdırma sırasında duraklamaz." msgid "The filament type setting of external spool is different from the filament in the slicing file." -msgstr "Harici makaranın filaman türü ayarı, dilimleme dosyasındaki filamandan farklıdır." +msgstr "Harici makaranın filament türü ayarı, dilimleme dosyasındaki filamentden farklıdır." msgid "The printer type selected when generating G-code is not consistent with the currently selected printer. It is recommended that you use the same printer type for slicing." msgstr "G Kodu oluşturulurken seçilen yazıcı türü mevcut seçili yazıcıyla tutarlı değil. Dilimleme için aynı yazıcı tipini kullanmanız tavsiye edilir." @@ -10039,7 +10039,7 @@ msgid "Cost %dg filament and %d changes more than optimal grouping." msgstr "Maliyet %dg filament ve %d, optimum gruplandırmadan daha fazla değişir." msgid "nozzle" -msgstr "meme" +msgstr "nozul" # AI Translated #, c-format, boost-format @@ -10092,7 +10092,7 @@ msgstr "Geçerli yazıcının %s çapı(%.1fmm) dilimleme dosyasıyla (%.1fmm) e #, c-format, boost-format msgid "The current nozzle diameter (%.1fmm) doesn't match with the slicing file (%.1fmm). Please make sure the nozzle installed matches with settings in printer, then set the corresponding printer preset when slicing." -msgstr "Mevcut nozül çapı (%.1fmm) dilimleme dosyasıyla (%.1fmm) eşleşmiyor. Lütfen takılan püskürtme ucunun yazıcıdaki ayarlarla eşleştiğinden emin olun, ardından dilimleme sırasında ilgili yazıcı ön ayarını yapın." +msgstr "Mevcut nozul çapı (%.1fmm) dilimleme dosyasıyla (%.1fmm) eşleşmiyor. Lütfen takılan püskürtme ucunun yazıcıdaki ayarlarla eşleştiğinden emin olun, ardından dilimleme sırasında ilgili yazıcı ön ayarını yapın." msgid "both extruders" msgstr "her iki ekstruder" @@ -10132,33 +10132,33 @@ msgstr "[ %s ] yüksek sıcaklıktaki bir ortamda yazdırmayı gerektirir." #, c-format, boost-format msgid "The filament on %s may soften. Please unload." -msgstr "%s üzerindeki filaman yumuşayabilir. Lütfen boşaltın." +msgstr "%s üzerindeki filament yumuşayabilir. Lütfen boşaltın." #, c-format, boost-format msgid "The filament on %s is unknown and may soften. Please set filament." -msgstr "%s üzerindeki filaman bilinmiyor ve yumuşayabilir. Lütfen filamenti ayarlayın." +msgstr "%s üzerindeki filament bilinmiyor ve yumuşayabilir. Lütfen filamenti ayarlayın." msgid "Unable to automatically match to suitable filament. Please click to manually match." -msgstr "Uygun filamanla otomatik olarak eşleştirilemiyor. Manuel olarak eşleştirmek için lütfen tıklayın." +msgstr "Uygun filamentle otomatik olarak eşleştirilemiyor. Manuel olarak eşleştirmek için lütfen tıklayın." msgid "Install toolhead enhanced cooling fan to prevent filament softening." msgstr "Filament yumuşamasını önlemek için takım başlığı geliştirilmiş soğutma fanını takın." # AI Translated msgid "Smooth Cool Plate" -msgstr "Pürüzsüz Soğuk Plaka" +msgstr "Smooth Cool Plate" # AI Translated msgid "Engineering Plate" -msgstr "Mühendislik Plakası" +msgstr "Engineering Plate" # AI Translated msgid "Smooth High Temp Plate" -msgstr "Pürüzsüz Yüksek Sıcaklık Plakası" +msgstr "Smooth High Temp Plate" # AI Translated msgid "Textured PEI Plate" -msgstr "Dokulu PEI Plaka" +msgstr "Textured PEI Plate" msgid "Cool Plate (SuperTack)" msgstr "Cool Plate (SuperTack)" @@ -10167,25 +10167,25 @@ msgid "Click here if you can't connect to the printer" msgstr "Yazıcıya bağlanamıyorsanız burayı tıklayın" msgid "No login account, only printers in LAN mode are displayed." -msgstr "Oturum açma hesabı yok, yalnızca LAN modundaki yazıcılar görüntüleniyor" +msgstr "Oturum açılmadı; yalnızca LAN modundaki yazıcılar görüntüleniyor." msgid "Connecting to server..." -msgstr "Sunucuya baglanıyor" +msgstr "Sunucuya bağlanılıyor..." msgid "Synchronizing device information..." -msgstr "Cihaz bilgileri senkronize ediliyor" +msgstr "Cihaz bilgileri senkronize ediliyor..." msgid "Synchronizing device information timed out." -msgstr "Cihaz bilgilerinin senkronize edilmesi zaman aşımı" +msgstr "Cihaz bilgileri senkronizasyonu zaman aşımına uğradı." msgid "Cannot send a print job when the printer is not at FDM mode." msgstr "Yazıcı FDM modunda değilken yazdırma işi gönderilemiyor." msgid "Cannot send a print job while the printer is updating firmware." -msgstr "Yazıcı ürün yazılımını güncellerken yazdırma işi gönderilemiyor" +msgstr "Yazıcı yazılımı güncellenirken yeni bir baskı başlatılamaz." msgid "The printer is executing instructions. Please restart printing after it ends." -msgstr "Yazıcı talimatları yürütüyor. Lütfen bittikten sonra yazdırmayı yeniden başlatın" +msgstr "Yazıcı komutları yürütüyor. Lütfen işlem bittikten sonra baskıyı tekrar başlatın." msgid "AMS is setting up. Please try again later." msgstr "AMS kuruluyor. Lütfen daha sonra tekrar deneyin." @@ -10212,7 +10212,7 @@ msgid "Cannot send the print job to a printer whose firmware must be updated." msgstr "Yazdırma işi, ürün yazılımının güncellenmesi gereken bir yazıcıya gönderilemiyor." msgid "Cannot send a print job for an empty plate." -msgstr "Boş kalıp için yazdırma işi gönderilemiyor" +msgstr "Boş bir tabla için baskı işi gönderilemez." msgid "Storage needs to be inserted to record timelapse." msgstr "Hızlandırılmış çekimi kaydetmek için depolama biriminin eklenmesi gerekir." @@ -10227,7 +10227,7 @@ msgid "Set dynamic flow calibration to 'OFF' to enable custom dynamic flow value msgstr "Özel dinamik akış değerini etkinleştirmek için dinamik akış kalibrasyonunu 'KAPALI' olarak ayarlayın." msgid "This printer does not support printing all plates." -msgstr "Bu yazıcı tüm kalıpların yazdırılmasını desteklemiyor" +msgstr "Bu yazıcı tüm plakaların bastırılmasını desteklemiyor." # AI Translated #, c-format, boost-format @@ -10296,7 +10296,7 @@ msgid "Sending failed, please try again!" msgstr "Gönderme başarısız oldu, lütfen yeniden deneyin!" msgid "Slice complete" -msgstr "Dilimleme tamam." +msgstr "Dilimleme tamamlandı" msgid "View all Daily tips" msgstr "Tüm Günlük ipuçlarını görüntüleyin" @@ -10475,8 +10475,8 @@ msgid "" "No - Do not change these settings for me." msgstr "" "Bu ayarlar otomatik olarak değiştirilsin mi?\n" -"Evet - Bu ayarları otomatik olarak değiştir\n" -"Hayır - Bu ayarları benim için değiştirme" +"Evet - Ayarları otomatik olarak uygula.\n" +"Hayır - Ayarları değiştirme." msgid "" "When using soluble material for the support interface, we recommend the following settings:\n" @@ -10513,10 +10513,10 @@ msgid "Adjust" msgstr "Ayarla" msgid "Experimental feature: Retracting and cutting off the filament at a greater distance during filament changes to minimize flush. Although it can notably reduce flush, it may also elevate the risk of nozzle clogs or other printing complications." -msgstr "Deneysel özellik: Filament değişiklikleri sırasında, floşu en aza indirmek için filamanı daha büyük bir mesafeden geri çekmek ve kesmek. Flush’u önemli ölçüde azaltabilmesine rağmen, aynı zamanda nozül tıkanmaları veya diğer yazdırma komplikasyonları riskini de artırabilir." +msgstr "Deneysel özellik: Filament değişiklikleri sırasında, floşu en aza indirmek için filamenti daha büyük bir mesafeden geri çekmek ve kesmek. Flush’u önemli ölçüde azaltabilmesine rağmen, aynı zamanda nozul tıkanmaları veya diğer yazdırma komplikasyonları riskini de artırabilir." msgid "Experimental feature: Retracting and cutting off the filament at a greater distance during filament changes to minimize flush. Although it can notably reduce flush, it may also elevate the risk of nozzle clogs or other printing complications. Please use with the latest printer firmware." -msgstr "Deneysel özellik: Filament değişiklikleri sırasında, filamanın en aza indirilmesi için filamanın daha büyük bir mesafeden geri çekilmesi ve kesilmesi. Akmayı önemli ölçüde azaltabilmesine rağmen, aynı zamanda püskürtme uçları tıkanması veya diğer yazdırma komplikasyonları riskini de artırabilir. Lütfen en son yazıcı ürün yazılımını kullanın." +msgstr "Deneysel özellik: Filament değişiklikleri sırasında, filamentin en aza indirilmesi için filamentin daha büyük bir mesafeden geri çekilmesi ve kesilmesi. Akmayı önemli ölçüde azaltabilmesine rağmen, aynı zamanda püskürtme uçları tıkanması veya diğer yazdırma komplikasyonları riskini de artırabilir. Lütfen en son yazıcı ürün yazılımını kullanın." msgid "" "When recording timelapse without toolhead, it is recommended to add a \"Timelapse Wipe Tower\" \n" @@ -10600,7 +10600,7 @@ msgstr "Hassasiyet" # AI Translated msgid "Z contouring" -msgstr "Z konturlama" +msgstr "Z Konturlama" msgid "Wall generator" msgstr "Duvar Türü" @@ -10619,7 +10619,7 @@ msgstr "Alt / Üst Katmanlar" # AI Translated msgid "First layer speed" -msgstr "İlk katman hızı" +msgstr "İlk Katman Hızı" msgid "Other layers speed" msgstr "Diğer Katmanlar" @@ -10653,7 +10653,7 @@ msgid "Support ironing" msgstr "Destek Ütüleme" msgid "Tree supports" -msgstr "Ağaç destekler" +msgstr "Ağaç Destekler" msgid "Multimaterial" msgstr "Çoklu Malzeme" @@ -10750,14 +10750,14 @@ msgid "Bed temperature when the Cool Plate SuperTack is installed. A value of 0 msgstr "Cool Plate SuperTack takılıyken yatak sıcaklığı. 0 değeri, filamentin Cool Plate SuperTack üzerine baskıyı desteklemediği anlamına gelir." msgid "Cool Plate" -msgstr "Soğuk plaka" +msgstr "Cool Plate" msgid "This is the bed temperature when the Cool Plate is installed. A value of 0 means the filament does not support printing on the Cool Plate." msgstr "Cool Plate takıldığında yatak sıcaklığı. 0 değeri, filamentin Cool Plate üzerine yazdırmayı desteklemediği anlamına gelir." # AI Translated msgid "Textured Cool Plate" -msgstr "Dokulu Soğuk Plaka" +msgstr "Textured Cool Plate" # AI Translated msgid "This is the bed temperature when the Textured Cool Plate is installed. A value of 0 means the filament does not support printing on the Textured Cool Plate." @@ -10768,7 +10768,7 @@ msgstr "Engineering Plate takıldığında yatak sıcaklığı. Değer 0, filame # AI Translated msgid "Smooth PEI Plate / High Temp Plate" -msgstr "Pürüzsüz PEI Plaka / Yüksek Sıcaklık Plakası" +msgstr "Smooth PEI Plate / High Temp Plate" msgid "This is the bed temperature when the Smooth PEI Plate/High Temperature Plate is installed. A value of 0 means the filament does not support printing on the Smooth PEI Plate/High Temp Plate." msgstr "Smooth PEI Plate / High Temp Plate takılığın da yatak sıcaklığı. 0 Değeri, filamentin Smooth PEI Plate / High Temp Plate üzerine baskı yapmayı desteklemediği anlamına gelir." @@ -10790,13 +10790,13 @@ msgstr "Minimum fan hızı" # AI Translated msgid "The part cooling fan will run at the minimum fan speed when the estimated layer time is longer than the threshold value. When the layer time is shorter than the threshold, the fan speed will be interpolated between the minimum and maximum fan speed according to layer printing time." -msgstr "Tahmini katman süresi eşik değerinden uzun olduğunda parça soğutma fanı minimum fan hızında çalışır. Katman süresi eşikten kısa olduğunda fan hızı, katman yazdırma süresine göre minimum ve maksimum fan hızı arasında enterpole edilir" +msgstr "Tahmini katman süresi eşik değerden uzun olduğunda parça soğutma fanı minimum fan hızında çalışır. Katman süresi eşik değerden kısa olduğunda fan hızı, katman baskı süresine göre minimum ve maksimum hızlar arasında kademeli olarak ayarlanır." msgid "Max fan speed threshold" msgstr "Maksimum fan hızı" msgid "The part cooling fan will run at maximum speed when the estimated layer time is shorter than the threshold value." -msgstr "Tahmini katman süresi ayar değerinden kısa olduğunda parça soğutma fanı hızı maksimum olacaktır" +msgstr "Tahmini katman süresi eşik değerden kısa olduğunda parça soğutma fanı maksimum hızda çalışır." msgid "Auxiliary part cooling fan" msgstr "Yardımcı parça soğutma fanı" @@ -11017,8 +11017,8 @@ msgstr "%1% Ön Ayar" msgid "The following preset will be deleted too:" msgid_plural "The following presets will be deleted too:" -msgstr[0] "Aşağıdaki ön ayar da silinecektir." -msgstr[1] "Aşağıdaki ön ayarlar da silinecektir." +msgstr[0] "Aşağıdaki önayar da silinecektir:" +msgstr[1] "Aşağıdaki önayarlar da silinecektir:" msgid "" "Are you sure to delete the selected preset?\n" @@ -11122,7 +11122,7 @@ msgid "Process Settings" msgstr "İşlem Ayarları" msgid "unsaved changes" -msgstr "Kaydedilmemiş Değişiklikler" +msgstr "kaydedilmemiş değişiklikler" msgid "Transfer or discard changes" msgstr "Değişiklikleri Çıkart veya Sakla" @@ -11187,7 +11187,7 @@ msgid "Click the right mouse button to display the full text." msgstr "Tam metni görüntülemek için farenin sağ tuşuna tıklayın." msgid "No changes will be saved." -msgstr "Tüm değişiklikler kaydedilmeyecek" +msgstr "Hiçbir değişiklik kaydedilmeyecek." msgid "All changes will be discarded." msgstr "Tüm değişiklikler iptal edilecek." @@ -11403,7 +11403,7 @@ msgid "view" msgstr "görüş" msgid "Current filament colors" -msgstr "Mevcut filaman renkleri" +msgstr "Mevcut filament renkleri" msgid "Matching" msgstr "Eşleştirme" @@ -11433,8 +11433,8 @@ msgid "" "The color has been selected, you can choose OK \n" " to continue or manually adjust it." msgstr "" -"Renk seçildi, Tamam'ı seçebilirsiniz \n" -" Devam etmek veya manuel olarak ayarlamak için" +"Renk seçildi; devam etmek için Tamam'ı seçebilir\n" +"veya elle ayarlayabilirsiniz." msgid "—> " msgstr "—> " @@ -11443,7 +11443,7 @@ msgid "" "Synchronizing AMS filaments will discard your modified but unsaved filament presets.\n" "Are you sure you want to continue?" msgstr "" -"AMS filamanlarının senkronize edilmesi, değiştirilmiş ancak kaydedilmemiş filaman ön ayarlarınızı siler.\n" +"AMS filamentlerinin senkronize edilmesi, değiştirilmiş ancak kaydedilmemiş filament ön ayarlarınızı siler.\n" "Devam etmek istediğinizden emin misiniz?" msgctxt "Sync_AMS" @@ -11470,10 +11470,10 @@ msgid "Overwriting" msgstr "Üzerine yazma" msgid "Reset all filament mapping" -msgstr "Tüm filaman eşlemesini sıfırla" +msgstr "Tüm filament eşlemesini sıfırla" msgid "(Recommended filament)" -msgstr "(Önerilen filaman)" +msgstr "(Önerilen filament)" msgid "Advanced Options" msgstr "Gelişmiş Seçenekler" @@ -11499,7 +11499,7 @@ msgid "Tip" msgstr "Uç" msgid "Only synchronize filament type and color, not including AMS slot information." -msgstr "AMS yuvası bilgileri hariç, yalnızca filaman tipini ve rengini senkronize edin." +msgstr "AMS yuvası bilgileri hariç, yalnızca filament tipini ve rengini senkronize edin." msgid "Replace the project filaments list sequentially based on printer filaments. And unused printer filaments will be automatically added to the end of the list." msgstr "Proje filamentleri listesini yazıcı filamentlerine göre sırayla değiştirin. Kullanılmayan yazıcı filamentleri ise otomatik olarak listenin sonuna eklenecektir." @@ -11514,7 +11514,7 @@ msgid "After being synced, this action cannot be undone." msgstr "Senkronize edildikten sonra bu işlem geri alınamaz." msgid "After being synced, the project's filament presets and colors will be replaced with the mapped filament types and colors. This action cannot be undone." -msgstr "Senkronize edildikten sonra projenin filaman ön ayarları ve renkleri, eşlenen filaman türleri ve renkleri ile değiştirilecektir. Bu eylem geri alınamaz." +msgstr "Senkronize edildikten sonra projenin filament ön ayarları ve renkleri, eşlenen filament türleri ve renkleri ile değiştirilecektir. Bu eylem geri alınamaz." msgid "Are you sure to synchronize the filaments?" msgstr "Filamentleri senkronize ettiğinizden emin misiniz?" @@ -11529,7 +11529,7 @@ msgid "Add unused filaments to filaments list." msgstr "Kullanılmayan filamentleri filament listesine ekleyin." msgid "Only synchronize filament type and color, not including slot information." -msgstr "Yuva bilgisi hariç, yalnızca filaman tipini ve rengini senkronize edin." +msgstr "Yuva bilgisi hariç, yalnızca filament tipini ve rengini senkronize edin." msgid "Ext spool" msgstr "Harici makara" @@ -11564,7 +11564,7 @@ msgid "Successfully synchronized filament color from printer." msgstr "Filament rengi yazıcıdan başarıyla senkronize edildi." msgid "Successfully synchronized color and type of filament from printer." -msgstr "Yazıcıdan filamanın rengi ve türü başarıyla senkronize edildi." +msgstr "Yazıcıdan filamentin rengi ve türü başarıyla senkronize edildi." msgctxt "FinishSyncAms" msgid "OK" @@ -11587,7 +11587,7 @@ msgid "For constant flow rate, hold %1% while dragging." msgstr "Sabit akış hızı için sürüklerken %1% basılı tutun." msgid "ms" -msgstr "Bayan" +msgstr "ms" msgid "Total ramming" msgstr "Toplam çarpma" @@ -11599,7 +11599,7 @@ msgid "Ramming line" msgstr "Çarpma hattı" msgid "Orca would re-calculate your flushing volumes everytime the filaments color changed or filaments changed. You could disable the auto-calculate in Orca Slicer > Preferences" -msgstr "Orca, filamentlerin rengi her değiştiğinde veya filamentler değiştiğinde yıkama hacimlerinizi yeniden hesaplar. Otomatik hesaplamayı Orca Dilimleyici > Tercihler'de devre dışı bırakabilirsiniz." +msgstr "Orca, filament rengi veya filament değiştirildiğinde tahliye miktarlarını her defasında yeniden hesaplar. Otomatik hesaplamayı Orca Slicer > Tercihler altından devre dışı bırakabilirsiniz" msgid "Flushing volume (mm³) for each filament pair." msgstr "Her filament çifti için yıkama hacmi (mm³)." @@ -11622,7 +11622,7 @@ msgid "Flushing volumes for filament change" msgstr "Filament değişimi için temizleme hacmi" msgid "Please choose the filament colour" -msgstr "Lütfen filaman rengini seçin" +msgstr "Lütfen filament rengini seçin" # AI Translated msgid "Native Wayland liveview requires the GStreamer GTK video sink. Please install the gtksink plugin for GStreamer, then restart OrcaSlicer." @@ -11669,7 +11669,7 @@ msgid "parse json failed" msgstr "json ayrıştırma başarısız oldu" msgid "[Action Required] " -msgstr "[İşlem Gerekli]" +msgstr "[İşlem Gerekli] " msgid "[Action Required]" msgstr "[İşlem Gerekli]" @@ -11777,7 +11777,7 @@ msgid "Movement step set to 1mm" msgstr "Hareket adımı 1 mm'ye ayarlandı" msgid "Keyboard 1-9: set filament for object/part" -msgstr "klavye 1-9: nesne/parça için filamenti ayarlayın" +msgstr "Klavye 1-9: nesneye/parçaya filament ata" msgid "Camera view - Default" msgstr "Kamera görünümü - Varsayılan" @@ -12134,7 +12134,7 @@ msgid "Repair finished" msgstr "Onarım tamamlandı" msgid "Repair failed" -msgstr "Onarım başarısız oldu." +msgstr "Onarım başarısız oldu" msgid "Repair canceled" msgstr "Onarım iptal edildi" @@ -12156,7 +12156,7 @@ msgid "Open G-code file:" msgstr "G kodu dosyasını açın:" msgid "One object has an empty first layer and can't be printed. Please Cut the bottom or enable supports." -msgstr "Bir nesnenin başlangıç katmanı boş ve yazdırılamıyor. Lütfen alt kısmı kesin veya destekleri etkinleştirin." +msgstr "Bir nesnenin ilk katmanı boş ve yazdırılamıyor. Lütfen alt kısmı kesin veya destekleri etkinleştirin." #, boost-format msgid "The object has empty layers between %1% and %2% and can’t be printed." @@ -12167,7 +12167,7 @@ msgid "Object: %1%" msgstr "Nesne: %1%" msgid "Parts of the object at these heights may be too thin or the object may have a faulty mesh." -msgstr "Belki nesnenin bu yükseklikteki bazı kısımları çok incedir veya nesnenin ağı hatalı olabilir" +msgstr "Nesnenin bu yüksekliklerdeki kısımları çok ince olabilir veya nesne bozuk bir ağ yapısına (mesh) sahip olabilir." # AI Translated msgid "Process change extrusion role G-code" @@ -12178,7 +12178,7 @@ msgid "Filament change extrusion role G-code" msgstr "Filament ekstrüzyon rolü değişim G-code'u" msgid "No object can be printed. It may be too small." -msgstr "Hiçbir nesne yazdırılamaz. Belki çok küçük" +msgstr "Hiçbir nesne basılamıyor. Nesne çok küçük olabilir." msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "Baskınız hazırlama bölgelerine çok yakın. Çarpışma olmadığından emin olun." @@ -12217,10 +12217,10 @@ msgid "Input shaping is only supported by Klipper, RepRapFirmware and Marlin 2." msgstr "Input shaping yalnızca Klipper, RepRapFirmware ve Marlin 2 tarafından desteklenir." msgid "Grouping error: " -msgstr "Gruplama hatası:" +msgstr "Gruplama hatası: " msgid " can not be placed in the " -msgstr "içine yerleştirilemez" +msgstr " içine yerleştirilemez " # AI Translated msgid "Group error in manual mode. Please check nozzle count or regroup." @@ -12236,7 +12236,7 @@ msgid "too many files" msgstr "çok fazla dosya" msgid "File too large" -msgstr "dosya çok büyük" +msgstr "Dosya çok büyük" msgid "unsupported method" msgstr "desteklenmeyen yöntem" @@ -12306,7 +12306,7 @@ msgid "invalid filename" msgstr "geçersiz dosya adı" msgid "Buffer too small" -msgstr "arabellek çok küçük" +msgstr "Arabellek çok küçük" msgid "internal error" msgstr "dahili hata" @@ -12315,7 +12315,7 @@ msgid "file not found" msgstr "dosya bulunamadı" msgid "Archive too large" -msgstr "arşiv çok büyük" +msgstr "Arşiv çok büyük" msgid "validation failed" msgstr "doğrulama başarısız" @@ -12339,7 +12339,7 @@ msgid " is too close to exclusion area, there may be collisions when printing." msgstr " Hariç tutma alanına çok yakın olduğundan yazdırma sırasında çarpışmalar meydana gelebilir." msgid " is too close to clumping detection area, there may be collisions when printing." -msgstr "topaklanma algılama alanına çok yakın olduğundan yazdırma sırasında çarpışmalar meydana gelebilir." +msgstr " topaklanma algılama alanına çok yakın, baskı sırasında çarpışmalar meydana gelebilir." msgid "Prime Tower" msgstr "Başbakan Kulesi" @@ -12351,7 +12351,7 @@ msgid " is too close to an exclusion area, and collisions will be caused.\n" msgstr " dışlama alanına çok yakın ve çarpışmalara neden olacak.\n" msgid " is too close to clumping detection area, and collisions will be caused.\n" -msgstr "topaklanma tespit alanına çok yakınsa çarpışmalara neden olur.\n" +msgstr " topaklanma algılama alanına çok yakın, çarpışmalar meydana gelecektir.\n" # AI Translated msgid "Selected nozzle temperatures are incompatible. Each filament's nozzle temperature must fall within the recommended nozzle temperature range of the other filaments. Otherwise, nozzle clogging or printer damage may occur." @@ -12405,7 +12405,7 @@ msgid "Variable layer height is not supported with Organic supports." msgstr "Değişken katman yüksekliği Organik desteklerle desteklenmez." msgid "Different nozzle diameters and different filament diameters may not work well when the prime tower is enabled. It's very experimental, so please proceed with caution." -msgstr "Farklı püskürtme ucu çapları ve farklı filaman çapları, ana kule etkinleştirildiğinde iyi çalışmayabilir. Oldukça deneysel olduğundan lütfen dikkatli ilerleyin." +msgstr "Farklı püskürtme ucu çapları ve farklı filament çapları, ana kule etkinleştirildiğinde iyi çalışmayabilir. Oldukça deneysel olduğundan lütfen dikkatli ilerleyin." msgid "The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1)." msgstr "Temizleme Kulesi şu anda yalnızca ilgili ekstruder adreslemesiyle desteklenmektedir (use_relative_e_distances=1)." @@ -12794,7 +12794,7 @@ msgid "This is the bed temperature for layers except for the first one. A value msgstr "İlk katman dışındaki katmanlar için yatak sıcaklığı. 0 Değeri, filamentin Dokulu PEI Plaka üzerine yazdırmayı desteklemediği anlamına gelir." msgid "First layer" -msgstr "Başlangıç katmanı" +msgstr "İlk katman" msgid "First layer bed temperature" msgstr "İlk katman yatak sıcaklığı" @@ -12818,7 +12818,7 @@ msgid "This is the bed temperature of the first layer. A value of 0 means the fi msgstr "İlk katmanın yatak sıcaklığı. 0 Değeri, filamentin Dokulu PEI Plaka üzerine yazdırmayı desteklemediği anlamına gelir." msgid "Plate types supported by the printer" -msgstr "Yazıcının desteklediği yatak türleri." +msgstr "Yazıcı tarafından desteklenen plaka tipleri" msgid "Default bed type" msgstr "Varsayılan yatak türü" @@ -13130,7 +13130,7 @@ msgid "" msgstr "" "Bu faktör dış duvarlar için malzeme miktarını etkiler.\n" "\n" -"Kullanılan gerçek dış duvar akışı, bu değerin filaman akış oranıyla ve ayarlandıysa nesnenin akış oranıyla çarpılmasıyla hesaplanır." +"Kullanılan gerçek dış duvar akışı, bu değerin filament akış oranıyla ve ayarlandıysa nesnenin akış oranıyla çarpılmasıyla hesaplanır." msgid "Inner wall flow ratio" msgstr "İç duvar akış oranı" @@ -13142,7 +13142,7 @@ msgid "" msgstr "" "Bu faktör iç duvarlar için malzeme miktarını etkiler.\n" "\n" -"Kullanılan gerçek iç duvar akışı, bu değerin filaman akış oranıyla ve ayarlandıysa nesnenin akış oranıyla çarpılmasıyla hesaplanır." +"Kullanılan gerçek iç duvar akışı, bu değerin filament akış oranıyla ve ayarlandıysa nesnenin akış oranıyla çarpılmasıyla hesaplanır." msgid "Overhang flow ratio" msgstr "Çıkıntı akış oranı" @@ -13154,7 +13154,7 @@ msgid "" msgstr "" "Bu faktör çıkıntılar için malzeme miktarını etkiler.\n" "\n" -"Kullanılan gerçek sarkma akışı, bu değerin filaman akış oranıyla ve ayarlandıysa nesnenin akış oranıyla çarpılmasıyla hesaplanır." +"Kullanılan gerçek sarkma akışı, bu değerin filament akış oranıyla ve ayarlandıysa nesnenin akış oranıyla çarpılmasıyla hesaplanır." msgid "Sparse infill flow ratio" msgstr "Seyrek dolgu akış oranı" @@ -13166,7 +13166,7 @@ msgid "" msgstr "" "Bu faktör seyrek dolgu için malzeme miktarını etkiler.\n" "\n" -"Kullanılan gerçek seyrek dolgu akışı, bu değerin filaman akış oranıyla ve ayarlandıysa nesnenin akış oranıyla çarpılmasıyla hesaplanır." +"Kullanılan gerçek seyrek dolgu akışı, bu değerin filament akış oranıyla ve ayarlandıysa nesnenin akış oranıyla çarpılmasıyla hesaplanır." msgid "Internal solid infill flow ratio" msgstr "Dahili katı dolgu akış oranı" @@ -13178,7 +13178,7 @@ msgid "" msgstr "" "Bu faktör, iç katı dolgu için malzeme miktarını etkiler.\n" "\n" -"Kullanılan gerçek dahili katı dolgu akışı, bu değerin filaman akış oranıyla ve ayarlandıysa nesnenin akış oranıyla çarpılmasıyla hesaplanır." +"Kullanılan gerçek dahili katı dolgu akışı, bu değerin filament akış oranıyla ve ayarlandıysa nesnenin akış oranıyla çarpılmasıyla hesaplanır." msgid "Gap fill flow ratio" msgstr "Boşluk doldurma akış oranı" @@ -13190,7 +13190,7 @@ msgid "" msgstr "" "Bu faktör boşlukları dolduracak malzeme miktarını etkiler.\n" "\n" -"Kullanılan gerçek boşluk doldurma akışı, bu değerin filaman akış oranıyla ve ayarlandıysa nesnenin akış oranıyla çarpılmasıyla hesaplanır." +"Kullanılan gerçek boşluk doldurma akışı, bu değerin filament akış oranıyla ve ayarlandıysa nesnenin akış oranıyla çarpılmasıyla hesaplanır." msgid "Support flow ratio" msgstr "Destek akış oranı" @@ -13202,7 +13202,7 @@ msgid "" msgstr "" "Bu faktör destek için malzeme miktarını etkiler.\n" "\n" -"Kullanılan gerçek destek akışı, bu değerin filaman akış oranıyla ve ayarlandıysa nesnenin akış oranıyla çarpılmasıyla hesaplanır." +"Kullanılan gerçek destek akışı, bu değerin filament akış oranıyla ve ayarlandıysa nesnenin akış oranıyla çarpılmasıyla hesaplanır." msgid "Support interface flow ratio" msgstr "Destek arayüzü akış oranı" @@ -13214,7 +13214,7 @@ msgid "" msgstr "" "Bu faktör, destek arayüzü için malzeme miktarını etkiler.\n" "\n" -"Kullanılan gerçek destek arayüzü akışı, bu değerin filaman akış oranıyla ve ayarlandıysa nesnenin akış oranıyla çarpılmasıyla hesaplanır." +"Kullanılan gerçek destek arayüzü akışı, bu değerin filament akış oranıyla ve ayarlandıysa nesnenin akış oranıyla çarpılmasıyla hesaplanır." msgid "Precise wall" msgstr "Hassas duvar" @@ -13236,7 +13236,7 @@ msgid "" "If a top surface has to be printed and it's partially covered by another layer, it won't be considered at a top layer where its width is below this value. This can be useful to not let the 'one perimeter on top' trigger on surface that should be covered only by perimeters. This value can be a mm or a % of the perimeter extrusion width.\n" "Warning: If enabled, artifacts can be created if you have some thin features on the next layer, like letters. Set this setting to 0 to remove these artifacts." msgstr "" -"Eğer bir üst yüzey basılacaksa ve kısmen başka bir katman tarafından kaplıysa layer genişliği bu değerin altında olan bir üst katman olarak değerlendirilmeyecek. Yalnızca çevrelerle kaplanması gereken yüzeyde 'bir çevre üstte' tetiklemesine izin vermemek yararlı olabilir. Bu değer mm veya a % çevre ekstrüzyon genişliğinin bir yüzdesi olabilir.\n" +"Eğer bir üst yüzey basılacaksa ve kısmen başka bir katman tarafından kaplıysa katman genişliği bu değerin altında olan bir üst katman olarak değerlendirilmeyecek. Yalnızca çevrelerle kaplanması gereken yüzeyde 'bir çevre üstte' tetiklemesine izin vermemek yararlı olabilir. Bu değer mm veya a % çevre ekstrüzyon genişliğinin bir yüzdesi olabilir.\n" "Uyarı: Etkinleştirilirse bir sonraki katmanda harfler gibi bazı ince özelliklerin olması durumunda yapay yapılar oluşturulabilir. Bu yapıları kaldırmak için bu ayarı 0 olarak ayarlayın." msgid "Only one wall on first layer" @@ -13712,7 +13712,7 @@ msgid "Add end G-code when finishing the printing of this filament." msgstr "Bu filament ile baskı bittiğinde çalışacak G kod." msgid "Ensure vertical shell thickness" -msgstr "Dikey kabuk kalınlığını onayla" +msgstr "Dikey kabuk kalınlığını koru" msgid "" "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)\n" @@ -14185,10 +14185,10 @@ msgid "Minimum HRC of nozzle required to print the filament. A value of 0 means msgstr "Filamenti yazdırmak için gereken minimum HRC nozul. Sıfır, nozulun HRC'sinin kontrol edilmediği anlamına gelir." msgid "Filament map to extruder" -msgstr "Ekstrudere filaman haritası" +msgstr "Ekstrudere filament haritası" msgid "Filament map to extruder." -msgstr "Ekstrudere filaman haritası." +msgstr "Ekstrudere filament haritası." msgid "Auto For Flush" msgstr "Yıkama İçin Otomatik" @@ -14204,7 +14204,7 @@ msgid "Flush temperature" msgstr "Yıkama sıcaklığı" msgid "Temperature when flushing filament. 0 indicates the upper bound of the recommended nozzle temperature range." -msgstr "Filament yıkanırken sıcaklık. 0, önerilen meme sıcaklık aralığının üst sınırını gösterir." +msgstr "Filament yıkanırken sıcaklık. 0, önerilen nozul sıcaklık aralığının üst sınırını gösterir." # AI Translated msgid "Flush temperature used in fast purge mode." @@ -14326,7 +14326,7 @@ msgid "Speed used for unloading the filament on the wipe tower (does not affect msgstr "Filamenti silme kulesinde boşaltmak için kullanılan hız (sıkıştırmadan hemen sonra boşaltmanın ilk kısmını etkilemez)." msgid "Unloading speed at the start" -msgstr "Başlangıçta boşaltma hızı" +msgstr "Başlangıçtaki boşaltma hızı" msgid "Speed used for unloading the tip of the filament immediately after ramming." msgstr "Sıkıştırmadan hemen sonra filamentin ucunu boşaltmak için kullanılan hız." @@ -14353,7 +14353,7 @@ msgid "Stamping distance measured from the center of the cooling tube" msgstr "Soğutma tüpünün merkezinden ölçülen damgalama mesafesi" msgid "If set to non-zero value, filament is moved toward the nozzle between the individual cooling moves (\"stamping\"). This option configures how long this movement should be before the filament is retracted again." -msgstr "Sıfırdan farklı bir değere ayarlanırsa filaman bireysel soğutma hareketleri arasında (“damgalama”) nüzule doğru hareket ettirilir. Bu seçenek, filamanın tekrar geri çekilmesinden önce bu hareketin ne kadar sürmesi gerektiğini yapılandırır." +msgstr "Sıfırdan farklı bir değere ayarlanırsa filament bireysel soğutma hareketleri arasında (“damgalama”) nüzule doğru hareket ettirilir. Bu seçenek, filamentin tekrar geri çekilmesinden önce bu hareketin ne kadar sürmesi gerektiğini yapılandırır." msgid "Speed of the first cooling move" msgstr "İlk soğutma hareketi hızı" @@ -14448,7 +14448,7 @@ msgid "g/cm³" msgstr "g/cm³" msgid "Filament material type" -msgstr "Filament malzeme türü." +msgstr "Filament malzeme türü" msgid "Soluble material" msgstr "Çözünür malzeme" @@ -14460,7 +14460,7 @@ msgid "Filament ramming length" msgstr "Filament sıkıştırma uzunluğu" msgid "When changing the extruder, it is recommended to extrude a certain length of filament from the original extruder. This helps minimize nozzle oozing." -msgstr "Ekstrüderi değiştirirken, orijinal ekstrüderden belirli bir uzunlukta filamanın çıkarılması tavsiye edilir. Bu, meme sızıntısını en aza indirmeye yardımcı olur." +msgstr "Ekstrüderi değiştirirken, orijinal ekstrüderden belirli bir uzunlukta filamentin çıkarılması tavsiye edilir. Bu, nozul sızıntısını en aza indirmeye yardımcı olur." msgid "Support material" msgstr "Destek malzemesi" @@ -14586,7 +14586,7 @@ msgid "Sparse infill pattern" msgstr "Dolgu deseni" msgid "This is the line pattern for internal sparse infill." -msgstr "İç dolgu deseni." +msgstr "Bu, iç seyrek dolgu için çizgi desenidir." msgid "Zig Zag" msgstr "Zig zag" @@ -14663,7 +14663,7 @@ msgid "Acceleration of internal solid infill. If the value is expressed as a per msgstr "İç katı dolgunun hızlandırılması. Değer yüzde olarak ifade edilirse (örn. %100), varsayılan ivmeye göre hesaplanacaktır." msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion." -msgstr "Başlangıç katmanının hızlandırılması. Daha düşük bir değerin kullanılması baskı plakası yapışkanlığını iyileştirebilir." +msgstr "İlk katman için baskı ivmelenmesidir. Sınırlı bir ivmelenme kullanmak, baskı tablasına yapışmayı artırabilir." msgid "Enable accel_to_decel" msgstr "Accel_to_decel'i etkinleştir" @@ -14714,7 +14714,7 @@ msgid "Line width of the first layer. If expressed as a %, it will be computed o msgstr "İlk katmanın çizgi genişliği. % olarak ifade edilirse Nozul çapı üzerinden hesaplanacaktır." msgid "First layer height" -msgstr "Başlangıç katman yüksekliği" +msgstr "İlk katman yüksekliği" msgid "Height of the first layer. Making the first layer height thicker can improve build plate adhesion." msgstr "İlk katmanın yüksekliği. İlk katman yüksekliğini biraz kalın yapmak, baskı plakasının yapışmasını iyileştirebilir." @@ -14723,7 +14723,7 @@ msgid "This is the speed for the first layer except for solid infill sections." msgstr "Katı dolgu kısmı dışındaki ilk katmanın hızı." msgid "First layer infill" -msgstr "Başlangıç katman dolgusu" +msgstr "İlk katman dolgusu" msgid "This is the speed for solid infill parts of the first layer." msgstr "İlk katmanın katı dolgu kısmının hızı." @@ -14745,7 +14745,7 @@ msgid "First layer nozzle temperature" msgstr "İlk katman nozul sıcaklığı" msgid "Nozzle temperature for printing the first layer with this filament" -msgstr "Bu filamenti kullanırken ilk katmanı yazdırmak için nozul sıcaklığı." +msgstr "Bu filament ile ilk katmanı basmak için nozul sıcaklığı" msgid "Full fan speed at layer" msgstr "Maksimum fan hızı" @@ -14813,25 +14813,25 @@ msgid "Ironing flow" msgstr "Ütüleme akışı" msgid "Filament-specific override for ironing flow. This allows you to customize the ironing flow for each filament type. Too high value results in overextrusion on the surface." -msgstr "Ütüleme akışı için filamana özgü geçersiz kılma. Bu, her filaman türü için ütüleme akışını özelleştirmenize olanak tanır. Çok yüksek değer yüzeyde aşırı ekstrüzyona neden olur." +msgstr "Ütüleme akışı için filamente özgü geçersiz kılma. Bu, her filament türü için ütüleme akışını özelleştirmenize olanak tanır. Çok yüksek değer yüzeyde aşırı ekstrüzyona neden olur." msgid "Ironing line spacing" msgstr "Ütüleme çizgi aralığı" msgid "Filament-specific override for ironing line spacing. This allows you to customize the spacing between ironing lines for each filament type." -msgstr "Ütüleme hattı aralığı için filamente özel geçersiz kılma. Bu, her filaman türü için ütüleme çizgileri arasındaki boşluğu özelleştirmenize olanak tanır." +msgstr "Ütüleme hattı aralığı için filamente özel geçersiz kılma. Bu, her filament türü için ütüleme çizgileri arasındaki boşluğu özelleştirmenize olanak tanır." msgid "Ironing inset" msgstr "Ütüleme boşluğu" msgid "Filament-specific override for ironing inset. This allows you to customize the distance to keep from the edges when ironing for each filament type." -msgstr "İç parçayı ütülemek için filamente özel geçersiz kılma. Bu, her filaman türü için ütüleme sırasında kenarlardan korunacak mesafeyi özelleştirmenize olanak tanır." +msgstr "İç parçayı ütülemek için filamente özel geçersiz kılma. Bu, her filament türü için ütüleme sırasında kenarlardan korunacak mesafeyi özelleştirmenize olanak tanır." msgid "Ironing speed" msgstr "Ütüleme hızı" msgid "Filament-specific override for ironing speed. This allows you to customize the print speed of ironing lines for each filament type." -msgstr "Ütüleme hızı için filamana özgü geçersiz kılma. Bu, her filaman türü için ütüleme hatlarının baskı hızını özelleştirmenize olanak tanır." +msgstr "Ütüleme hızı için filamente özgü geçersiz kılma. Bu, her filament türü için ütüleme hatlarının baskı hızını özelleştirmenize olanak tanır." msgid "This setting makes the toolhead randomly jitter while printing walls so that the surface has a rough textured look. This setting controls the fuzzy position." msgstr "Duvara baskı yaparken rastgele titreme, böylece yüzeyin pürüzlü bir görünüme sahip olması. Bu ayar pütürlü konumu kontrol eder." @@ -14884,8 +14884,8 @@ msgid "" "Attention! The [Extrusion] and [Combined] modes works only the fuzzy_skin_thickness parameter not more than the thickness of printed loop. At the same time, the width of the extrusion for a particular layer should also not be below a certain level. It is usually equal 15-25%% of a layer height. Therefore, the maximum fuzzy skin thickness with a perimeter width of 0.4 mm and a layer height of 0.2 mm will be 0.4-(0.2*0.25)=±0.35mm! If you enter a higher parameter than this, the error Flow::spacing() will displayed, and the model will not be sliced. You can choose this number until this error is repeated." msgstr "" "Pütürlü yüzey oluşturma modu. Sadece Arachne ile çalışır!\n" -"Yer Değiştirme: Desen, nozülün orijinal yoldan yana kaydırılmasıyla oluşturulduğu klasik mod.\n" -"Ekstrüzyon: Desenin ekstrüde edilen plastik miktarına göre oluşturulduğu mod. Bu, nozül sarsıntısı olmadan pürüzsüz bir desen veren hızlı ve düz bir algoritmadır. Ancak, tüm dizilimde gevşek duvarlar oluşturmak için daha kullanışlıdır.\n" +"Yer Değiştirme: Desen, nozulun orijinal yoldan yana kaydırılmasıyla oluşturulduğu klasik mod.\n" +"Ekstrüzyon: Desenin ekstrüde edilen plastik miktarına göre oluşturulduğu mod. Bu, nozul sarsıntısı olmadan pürüzsüz bir desen veren hızlı ve düz bir algoritmadır. Ancak, tüm dizilimde gevşek duvarlar oluşturmak için daha kullanışlıdır.\n" "Birleşik: Eklem modu [Yer Değiştirme] + [Ekstrüzyon]. Duvarların görünümü [Yer Değiştirme] Moduna benzer, ancak çevreler arasında gözenek bırakmaz.\n" "\n" "Dikkat! [Ekstrüzyon] ve [Birleşik] modları yalnızca fuzzy_skin_thickness parametresini çalıştırır, yazdırılan ilmeğin kalınlığından daha fazla olmamalıdır. Aynı zamanda, belirli bir katman için ekstrüzyon genişliği de belirli bir seviyenin altında olmamalıdır. Genellikle katman yüksekliğinin %%15-25'ine eşittir. Bu nedenle, 0,4 mm çevre genişliği ve 0,2 mm katman yüksekliğine sahip maksimum pütürlü yüzey kalınlığı 0,4-(0,2*0,25)=±0,35 mm olacaktır! Bundan daha yüksek bir parametre girerseniz, Flow::spacing() hatası görüntülenir ve model dilimlenmez. Bu hata tekrarlanana kadar bu sayıyı seçebilirsiniz." @@ -15251,7 +15251,7 @@ msgid "Sparse infill rotation template" msgstr "Seyrek dolgu döndürme şablonu" msgid "Rotate the sparse infill direction per layer using a template of angles. Enter comma-separated degrees (e.g., '0,30,60,90'). Angles are applied in order by layer and repeat when the list ends. Advanced syntax is supported: '+5' rotates +5° every layer; '+5#5' rotates +5° every 5 layers. See the Wiki for details. When a template is set, the standard infill direction setting is ignored. Note: some infill patterns (e.g., Gyroid) control rotation themselves; use with care." -msgstr "Seyrek dolgu yönünü katman katman açı şablonuna göre döndürün. Virgülle ayrılmış açıları girin (örn. '0,30,60,90'). Açılar katman sırasına göre uygulanır ve liste sona erdiğinde tekrarlanır. Gelişmiş sözdizimi desteklenir: '+5' her katmanda +5° döndürür; '+5#5' her 5 katmanda +5° döndürür. Detaylar için Viki’ye bakın. Bir şablon ayarlandığında, standart dolgu yönü ayarı yok sayılır. NOT: bazı dolgu desenleri (örn. Gyroid) kendi döndürmesini kontrol eder; dikkatli kullanın" +msgstr "Açı şablonu kullanarak seyrek dolgu yönünü katman bazında döndürün. Virgülle ayrılmış açılar girin (ör. '0,30,60,90'). Açılar katman sırasına göre uygulanır ve liste bittiğinde tekrarlanır. Gelişmiş sözdizimi desteklenir: '+5' her katmanda +5° döndürür; '+5#5' her 5 katmanda bir +5° döndürür. Detaylar için Wiki'ye bakın. Bir şablon ayarlandığında, standart dolgu yönü ayarı göz ardı edilir. Not: Bazı dolgu desenleri (ör. Gyroid) dönmeyi kendisi kontrol eder; dikkatli kullanın." msgid "Solid infill rotation template" msgstr "Katı dolgu döndürme şablonu" @@ -15263,7 +15263,7 @@ msgid "Skeleton infill density" msgstr "İskelet dolgu yoğunluğu" msgid "The remaining part of the model contour after removing a certain depth from the surface is called the skeleton. This parameter is used to adjust the density of this section. When two regions have the same sparse infill settings but different skeleton densities, their skeleton areas will develop overlapping sections. Default is as same as infill density." -msgstr "üzeyden belirli bir derinlik çıkarıldıktan sonra model konturunda kalan kısma 'iskelet' denir. Bu parametre, bu bölümün yoğunluğunu ayarlamak için kullanılır. İki bölge aynı seyrek dolgu ayarlarına sahip fakat farklı iskelet yoğunluklarına sahipse, iskelet alanları üst üste binen bölümler oluşturabilir. Varsayılan değer, dolgu yoğunluğu ile aynıdır." +msgstr "Yüzeyden belirli bir derinlik çıkarıldıktan sonra model hatlarının geriye kalan kısmına iskelet adı verilir. Bu parametre, söz konusu alanın yoğunluğunu ayarlamak için kullanılır. İki bölge aynı seyrek dolgu ayarlarına ancak farklı iskelet yoğunluklarına sahip olduğunda, iskelet alanlarında çakışan kesitler oluşur. Varsayılan değer dolgu yoğunluğu ile aynıdır." msgid "Skin infill density" msgstr "Yüzey dolgu yoğunluğu" @@ -15494,7 +15494,7 @@ msgid "The distance from the boundary between filaments to generate interlocking msgstr "Hücrelerde ölçülen, birbirine kenetlenen yapıyı oluşturmak için filamentler arasındaki sınırdan mesafe. Çok az hücre yapışmanın zayıf olmasına neden olur." msgid "Interlocking boundary avoidance" -msgstr "Birbirine kenetlenen sınırdan kaçınma" +msgstr "Kenetleme sınır mesafesi koruması" msgid "The distance from the outside of a model where interlocking structures will not be generated, measured in cells." msgstr "Birbirine kenetlenen yapıların oluşturulmayacağı bir modelin dışına olan mesafe, hücrelerde ölçülür." @@ -15530,7 +15530,7 @@ msgid "This is the distance between the lines used for ironing." msgstr "Ütü çizgileri arasındaki mesafe." msgid "The distance to keep from the edges. A value of 0 sets this to half of the nozzle diameter." -msgstr "Kenarlardan korunacak mesafe. 0 değeri bunu nozül çapının yarısına ayarlar." +msgstr "Kenarlardan korunacak mesafe. 0 değeri bunu nozul çapının yarısına ayarlar." msgid "This is the print speed for ironing lines." msgstr "Ütüleme çizgilerinin baskı hızı." @@ -15608,7 +15608,7 @@ msgid "Silent Mode" msgstr "Sessiz mod" msgid "Whether the machine supports silent mode in which machine uses lower acceleration to print more quietly" -msgstr "Makinenin yazdırmak için daha düşük hızlanma kullandığı sessiz modu destekleyip desteklemediği." +msgstr "Daha sessiz baskı için ivmelenmeyi düşüren sessiz mod desteği" msgid "Emit limits to G-code" msgstr "G-kod sınırları" @@ -15881,7 +15881,7 @@ msgstr "" "RRF: X ve Y değerleri eşittir." msgid "Hz" -msgstr "Hz." +msgstr "Hz" msgid "Y" msgstr "Y" @@ -16038,7 +16038,7 @@ msgid "Nozzle volume" msgstr "Nozul hacmi" msgid "Volume of nozzle between the filament cutter and the end of the nozzle" -msgstr "Kesici ile nozulun ucu arasındaki nozul hacmi." +msgstr "Filament kesici ile nozul ucu arasındaki nozul hacmi" msgid "Cooling tube position" msgstr "Soğutma borusu konumu" @@ -16217,7 +16217,7 @@ msgid "This expands all raft layers in XY plane." msgstr "XY düzlemindeki tüm rafa katmanlarını genişlet." msgid "First layer density" -msgstr "Başlangıç katman yoğunluğu" +msgstr "İlk katman yoğunluğu" msgid "This is the density of the first raft or support layer." msgstr "İlk sal veya destek katmanının yoğunluğu." @@ -16404,7 +16404,7 @@ msgid "Deretraction speed" msgstr "İleri itme hızı" msgid "Speed for reloading filament into the nozzle. Zero means same speed of retraction." -msgstr "Filamentin nozüle yeniden yüklenme hızı. Sıfır, geri çekilme hızının aynı olduğu anlamına gelir." +msgstr "Filamentin nozule yeniden yüklenme hızı. Sıfır, geri çekilme hızının aynı olduğu anlamına gelir." # AI Translated msgid "Deretraction speed (extruder change)" @@ -16467,16 +16467,16 @@ msgstr "" "Bu miktar milimetre cinsinden veya mevcut ekstruder çapının yüzdesi olarak belirtilebilir. Bu parametrenin varsayılan değeri %10'dur." msgid "Scarf joint seam (beta)" -msgstr "Eğik birleşim dikişi (beta)" +msgstr "Atkı dikişi birleşimi (beta)" msgid "Use scarf joint to minimize seam visibility and increase seam strength." -msgstr "Dikiş görünürlüğünü en aza indirmek ve dikiş mukavemetini arttırmak için eğik birleşimini kullanın." +msgstr "Dikiş izini en aza indirmek ve dikiş mukavemetini artırmak için atkı dikişi kullanın." msgid "Conditional scarf joint" -msgstr "Koşullu eğik birleşimi" +msgstr "Koşullu atkı dikişi" msgid "Apply scarf joints only to smooth perimeters where traditional seams do not conceal the seams at sharp corners effectively." -msgstr "Eğik bağlantılarını yalnızca geleneksel dikişlerin keskin köşelerdeki dikişleri etkili bir şekilde gizleyemediği düzgün kenarlara uygulayın." +msgstr "Atkı dikişini yalnızca, geleneksel dikişlerin keskin köşelerde gizlenemediği düz çevre hatlarına uygular." msgid "Conditional angle threshold" msgstr "Koşullu açı eşiği" @@ -16485,61 +16485,61 @@ msgid "" "This option sets the threshold angle for applying a conditional scarf joint seam.\n" "If the maximum angle within the perimeter loop exceeds this value (indicating the absence of sharp corners), a scarf joint seam will be used. The default value is 155°." msgstr "" -"Bu seçenek, koşullu bir eğik eklem dikişi uygulamak için eşik açısını ayarlar.\n" -"Çevre halkası içindeki maksimum açı bu değeri aşarsa (keskin köşelerin bulunmadığını gösterir), bir eğik birleştirme dikişi kullanılacaktır. Varsayılan değer 155°'dir." +"Bu seçenek, koşullu atkı dikişinin uygulanacağı eşik açısını belirler.\n" +"Çevre döngüsü içindeki maksimum açı bu değeri aşarsa (keskin köşelerin olmadığını gösterir), atkı dikişi kullanılır. Varsayılan değer 155°'dir." msgid "Conditional overhang threshold" msgstr "Koşullu çıkıntı eşiği" #, no-c-format, no-boost-format msgid "This option determines the overhang threshold for the application of scarf joint seams. If the unsupported portion of the perimeter is less than this threshold, scarf joint seams will be applied. The default threshold is set at 40% of the external wall's width. Due to performance considerations, the degree of overhang is estimated." -msgstr "Bu seçenek, eğik bağlantı dikişlerinin uygulanması için sarkma eşiğini belirler. Çevrenin desteklenmeyen kısmı bu eşikten az ise eğik birleştirme dikişleri uygulanacaktır. Varsayılan eşik, dış duvar genişliğinin %40'ına ayarlanmıştır. Performans değerlendirmeleri nedeniyle çıkıntının derecesi tahmin edilir." +msgstr "Bu seçenek, atkı dikişlerinin uygulanacağı çıkıntı eşiğini belirler. Çevrenin desteklenmeyen kısmı bu eşikten azsa, atkı dikişi uygulanır. Varsayılan eşik değeri, dış duvar genişliğinin %40'ı olarak ayarlanmıştır. Performans değerlendirmeleri nedeniyle çıkıntı derecesi tahmini olarak hesaplanır." msgid "Scarf joint speed" -msgstr "Eğik birleşim hızı" +msgstr "Atkı dikişi hızı" msgid "This option sets the printing speed for scarf joints. It is recommended to print scarf joints at a slow speed (less than 100 mm/s). It's also advisable to enable 'Extrusion rate smoothing' if the set speed varies significantly from the speed of the outer or inner walls. If the speed specified here is higher than the speed of the outer or inner walls, the printer will default to the slower of the two speeds. When specified as a percentage (e.g., 80%), the speed is calculated based on the respective outer or inner wall speed. The default value is set to 100%." -msgstr "Bu seçenek, eğik bağlantılarının yazdırma hızını ayarlar. Eğik bağlantılarının yavaş bir hızda (100 mm/s'den az) yazdırılması tavsiye edilir. Ayarlanan hızın dış veya iç duvarların hızından önemli ölçüde farklı olması durumunda 'Ekstrüzyon hızı yumuşatma' seçeneğinin etkinleştirilmesi de tavsiye edilir. Burada belirtilen hız, dış veya iç duvarların hızından daha yüksekse, yazıcı varsayılan olarak iki hızdan daha yavaş olanı seçecektir. Yüzde olarak belirtildiğinde (örn. %80), hız, ilgili dış veya iç duvar hızına göre hesaplanır. Varsayılan değer %100 olarak ayarlanmıştır." +msgstr "Bu seçenek, atkı birleşimlerinin baskı hızını belirler. Atkı birleşimlerinin düşük hızlarda (100 mm/s altında) basılması önerilir. Belirlenen hız, dış veya iç duvar hızından belirgin şekilde farklıysa 'Akış hızı yumuşatma' özelliğinin etkinleştirilmesi tavsiye edilir. Buradaki hız dış veya iç duvar hızından daha yüksekse, yazıcı varsayılan olarak bu iki hızdan yavaş olanı kullanır. Yüzde olarak belirtildiğinde (ör. %80), hız ilgili dış veya iç duvar hızına göre hesaplanır. Varsayılan değer %100 olarak ayarlanmıştır." msgid "Scarf joint flow ratio" -msgstr "Eğik birleşimi akış oranı" +msgstr "Atkı dikişi akış oranı" msgid "This factor affects the amount of material for scarf joints." -msgstr "Bu faktör eğik birleşimlerinde kullanılacak materyal miktarını değiştirir." +msgstr "Bu faktör, atkı dikişleri için kullanılacak malzeme miktarını etkiler." msgid "Scarf start height" -msgstr "Eğik başlangıç yüksekliği" +msgstr "Atkı başlangıç yüksekliği" msgid "" "Start height of the scarf.\n" "This amount can be specified in millimeters or as a percentage of the current layer height. The default value for this parameter is 0." msgstr "" -"Eğik başlangıç yüksekliği.\n" -"Bu miktar milimetre cinsinden veya geçerli katman yüksekliğinin yüzdesi olarak belirtilebilir. Bu parametrenin varsayılan değeri 0'dır." +"Atkı başlangıç yüksekliği.\n" +"Bu değer milimetre cinsinden veya mevcut katman yüksekliğinin yüzdesi olarak belirtilebilir. Varsayılan değer 0'dır." msgid "Scarf around entire wall" -msgstr "Tüm duvarın etrafına atkıla" +msgstr "Tüm duvara atkı uygula" msgid "The scarf extends to the entire length of the wall." -msgstr "Eğik duvarın tüm uzunluğu boyunca uzanır." +msgstr "Atkı birleşimi, duvarın tüm uzunluğu boyunca uzanacak şekilde genişletilir." msgid "Scarf length" -msgstr "Eğik uzunluğu" +msgstr "Atkı dikişi uzunluğu" msgid "Length of the scarf. Setting this parameter to zero effectively disables the scarf." -msgstr "Atkının uzunluğu. Bu parametrenin 0 a ayarlanması atkıyı dolaylı yoldan devre dışı bırakır." +msgstr "Atkı birleşiminin uzunluğudur. Bu parametrenin 0 (sıfır) olarak ayarlanması atkı dikişini devre dışı bırakır." msgid "Scarf steps" -msgstr "Eğik kademesi" +msgstr "Atkı adımları" msgid "Minimum number of segments of each scarf." -msgstr "Her atkının minimum segment sayısı." +msgstr "Her bir atkının minimum segment sayısı." msgid "Scarf joint for inner walls" -msgstr "İç duvarlar için eğik birleşimi" +msgstr "İç duvarlar için atkı dikişi" msgid "Use scarf joint for inner walls as well." -msgstr "İç duvarlar için de eğik birleşimini kullanın." +msgstr "İç duvarlarda da atkı dikişi kullan." msgid "Role base wipe speed" msgstr "Otomatik temizleme hızı" @@ -16587,7 +16587,7 @@ msgid "Skirt height" msgstr "Etek yüksekliği" msgid "Number of skirt layers: usually only one" -msgstr "Etek katman sayısı. Genellikle tek katman." +msgstr "Etek katman sayısı: Genelde tek katman" msgid "Single loop after first layer" msgstr "İlk katmandan sonra tek duvar" @@ -16642,7 +16642,7 @@ msgid "" "Using a non-zero value is useful if the printer is set up to print without a prime line.\n" "Final number of loops is not taking into account while arranging or validating objects distance. Increase loop number in such case." msgstr "" -"Etek yazdırılırken mm cinsinden minimum filaman ekstrüzyon uzunluğu. Sıfır, bu özelliğin devre dışı olduğu anlamına gelir.\n" +"Etek yazdırılırken mm cinsinden minimum filament ekstrüzyon uzunluğu. Sıfır, bu özelliğin devre dışı olduğu anlamına gelir.\n" "\n" "Yazıcı ana hat olmadan yazdırmak üzere ayarlanmışsa sıfır dışında bir değer kullanmak yararlı olur.\n" "Nihai döngü sayısı, nesnelerin mesafesini düzenlerken veya doğrularken dikkate alınmaz. Böyle bir durumda döngü sayısını artırın." @@ -16700,7 +16700,7 @@ msgstr "Maksimum XY yumuşatma" #, no-c-format, no-boost-format msgid "Maximum distance to move points in XY to try to achieve a smooth spiral. If expressed as a %, it will be computed over nozzle diameter." -msgstr "Düzgün bir spiral elde etmek için XY'deki noktaları hareket ettirmek için maksimum mesafe % olarak ifade edilirse nozül çapı üzerinden hesaplanacaktır." +msgstr "Düzgün bir spiral elde etmek için XY'deki noktaları hareket ettirmek için maksimum mesafe % olarak ifade edilirse nozul çapı üzerinden hesaplanacaktır." msgid "Spiral starting flow ratio" msgstr "Spiral başlangıç akış oranı" @@ -16756,7 +16756,7 @@ msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. msgstr "Birden fazla ön ısıtma komutu ekleyin (örn. M104.1). Yalnızca Prusa XL için kullanışlıdır. Diğer yazıcılar için lütfen 1’e ayarlayın." msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." -msgstr "G kodu, çıktı dosyasının en üstünde, diğer içeriklerden önce yazılır. Yazıcı ürün yazılımının dosyanın ilk satırlarından okuduğu meta verileri (ör. tahmini yazdırma süresi, filaman kullanımı) eklemek için kullanışlıdır. {print_time_sec} ve {used_filament_length} gibi yer tutucuları destekler." +msgstr "G kodu, çıktı dosyasının en üstünde, diğer içeriklerden önce yazılır. Yazıcı ürün yazılımının dosyanın ilk satırlarından okuduğu meta verileri (ör. tahmini yazdırma süresi, filament kullanımı) eklemek için kullanışlıdır. {print_time_sec} ve {used_filament_length} gibi yer tutucuları destekler." msgid "Start G-code" msgstr "Başlangıç G Kodu" @@ -16765,7 +16765,7 @@ msgid "G-code added when starting a print." msgstr "Baskı başladığında çalışacak G Kodu." msgid "G-code added when the printer starts using this filament" -msgstr "Bu filament ile baskı başladığında çalıştırılacak G-Kod." +msgstr "Bu filament kullanılırken yazıcı başladığında eklenen G-kodu" msgid "Single Extruder Multi Material" msgstr "Tek ekstruder çoklu malzeme" @@ -17110,7 +17110,7 @@ msgid "This setting determines the maximum overhang angle that the branches of t msgstr "Bu ayar, ağaç desteğinin dallarının oluşmasına izin verilen maksimum çıkıntı açısını belirler. Açı artırılırsa, dallar daha yatay olarak basılabilir ve daha uzağa ulaşır." msgid "Preferred Branch Angle" -msgstr "Tercih Edilen Dal Açısı" +msgstr "Tercih edilen dal açısı" #. TRN PrintSettings: "Organic supports" > "Preferred Branch Angle" msgid "The preferred angle of the branches, when they do not have to avoid the model. Use a lower angle to make them more vertical and more stable. Use a higher angle for branches to merge faster." @@ -17123,7 +17123,7 @@ msgid "This setting determines the distance between neighboring tree support nod msgstr "Bu ayar, komşu ağaç destek düğümleri arasındaki mesafeyi belirler." msgid "Branch Density" -msgstr "Dal Yoğunluğu" +msgstr "Dal yoğunluğu" #. TRN PrintSettings: "Organic supports" > "Branch Density" msgid "Adjusts the density of the support structure used to generate the tips of the branches. A higher value results in better overhangs but the supports are harder to remove, thus it is recommended to enable top support interfaces instead of a high branch density value if dense interfaces are needed." @@ -17142,7 +17142,7 @@ msgid "Distance from tree branch to the outermost brim line." msgstr "Ağaç dalından en dış kenar çizgisine kadar olan mesafe." msgid "Tip Diameter" -msgstr "Uç Çapı" +msgstr "Uç çapı" #. TRN PrintSettings: "Organic supports" > "Tip Diameter" msgid "Branch tip diameter for organic supports." @@ -17156,7 +17156,7 @@ msgstr "Bu ayar, destek düğümlerinin başlangıç çapını belirler." #. TRN PrintSettings: #lmFIXME msgid "Branch Diameter Angle" -msgstr "Dal Çapı Açısı" +msgstr "Dal çapı açısı" #. TRN PrintSettings: "Organic supports" > "Branch Diameter Angle" msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the organic support." @@ -17184,13 +17184,13 @@ msgid "Support Ironing Pattern" msgstr "Destek ütüleme deseni" msgid "Support Ironing flow" -msgstr "Destek ütüleme akışı" +msgstr "Destek ütüleme akış oranı" msgid "The amount of material to extrude during ironing. Relative to flow of normal support interface layer height. Too high value results in overextrusion on the surface." msgstr "Ütüleme sırasında ekstrüde edilecek malzeme miktarı. Normal destek arayüzü katman yüksekliğinin akışına göre. Çok yüksek bir değer, yüzeyde aşırı ekstrüzyona neden olur." msgid "Support Ironing line spacing" -msgstr "Destek ütüleme satır aralığı" +msgstr "Destek ütüleme çizgi aralığı" msgid "Activate temperature control" msgstr "Sıcaklık kontrolünü etkinleştirin" @@ -17238,7 +17238,7 @@ msgid "Chamber minimal temperature" msgstr "Minimum bölme sıcaklığı" msgid "Nozzle temperature after the first layer" -msgstr "İlk katmandan sonraki katmanlar için nozul sıcaklığı." +msgstr "İlk katmandan sonraki nozul sıcaklığı" msgid "Detect thin walls" msgstr "İnce duvarı algıla" @@ -17344,7 +17344,7 @@ msgid "" msgstr "" "Geri çekilirken nozulun son yol boyunca ne kadar süre hareket edeceğini açıklayın.\n" "\n" -"Silme işleminin ne kadar sürdüğüne, ekstruder/filament geri çekme ayarlarının ne kadar hızlı ve uzun olduğuna bağlı olarak, kalan filamanı geri çekmek için bir geri çekme hareketine ihtiyaç duyulabilir.\n" +"Silme işleminin ne kadar sürdüğüne, ekstruder/filament geri çekme ayarlarının ne kadar hızlı ve uzun olduğuna bağlı olarak, kalan filamenti geri çekmek için bir geri çekme hareketine ihtiyaç duyulabilir.\n" "\n" "Aşağıdaki silme ayarından önce geri çekme miktarına bir değer ayarlamak, silme işleminden önce aşırı geri çekme işlemini gerçekleştirecektir, aksi takdirde silme işleminden sonra gerçekleştirilecektir." @@ -17355,7 +17355,7 @@ msgid "Internal ribs" msgstr "İç kaburgalar" msgid "Enable internal ribs to increase the stability of the prime tower." -msgstr "Ana kulenin stabilitesini artırmak için iç kaburgaları etkinleştirin." +msgstr "Hazırlık kulesinin (prime tower) stabilitesini ve mukavemetini artırmak için kulenin içerisine dikey kaburga (takviye) duvarları ekler." msgid "Purging volumes" msgstr "Hacimlerin temizlenmesi" @@ -17428,11 +17428,11 @@ msgid "" "\n" "For the wipe tower external perimeters the internal perimeter speed is used regardless of this setting." msgstr "" -"Silme kulesinde temizleme yaparken ve silme kulesi seyrek katmanlarını yazdırırken maksimum yazdırma hızı. Temizleme sırasında seyrek dolum hızı veya filamanın maksimum hacimsel hızından hesaplanan hız daha düşükse, bunun yerine en düşük olanı kullanılacaktır.\n" +"Silme kulesinde temizleme yaparken ve silme kulesi seyrek katmanlarını yazdırırken maksimum yazdırma hızı. Temizleme sırasında seyrek dolum hızı veya filamentin maksimum hacimsel hızından hesaplanan hız daha düşükse, bunun yerine en düşük olanı kullanılacaktır.\n" "\n" -"Seyrek katmanları yazdırırken iç çevre hızı veya filamanın maksimum hacimsel hızından hesaplanan hız daha düşükse bunun yerine en düşük olanı kullanılacaktır.\n" +"Seyrek katmanları yazdırırken iç çevre hızı veya filamentin maksimum hacimsel hızından hesaplanan hız daha düşükse bunun yerine en düşük olanı kullanılacaktır.\n" "\n" -"Bu hızın arttırılması kulenin stabilitesini etkileyebileceği gibi, nozülün silme kulesi üzerinde oluşmuş olabilecek damlacıklarla çarpışma kuvvetini de arttırabilir.\n" +"Bu hızın arttırılması kulenin stabilitesini etkileyebileceği gibi, nozulun silme kulesi üzerinde oluşmuş olabilecek damlacıklarla çarpışma kuvvetini de arttırabilir.\n" "\n" "Bu parametreyi varsayılan 90 mm/sn’nin üzerine çıkarmadan önce, yazıcınızın artan hızlarda güvenilir şekilde köprü kurabildiğinden ve takım değişimi iyi kontrol edildiğinde sızıntı yaptığından emin olun.\n" "\n" @@ -17459,16 +17459,16 @@ msgid "Rib" msgstr "Kaburga" msgid "Extra rib length" -msgstr "Ekstra rib uzunluğu" +msgstr "Ek kaburga uzunluğu" msgid "Positive values can increase the size of the rib wall, while negative values can reduce the size. However, the size of the rib wall can not be smaller than that determined by the cleaning volume." -msgstr "Pozitif değerler rib duvarının boyutunu artırabilirken, negatif değerler boyutunu azaltabilir. Ancak rib duvarının boyutu temizleme hacmi tarafından belirlenen boyuttan daha küçük olamaz." +msgstr "Ek kaburga (takviye) duvarının boyutunu ayarlar. Pozitif değerler kaburga duvarını büyütürken, negatif değerler küçültür. Ancak kaburga boyutu, temizleme hacmi (cleaning volume) ile belirlenen minimum sınırın altına inemez." msgid "Rib width" -msgstr "Rib genişliği" +msgstr "Kaburga genişliği" msgid "Rib width is always less than half the prime tower side length." -msgstr "Diş genişliği her zaman ana kule yan uzunluğunun yarısından azdır." +msgstr "Kaburga genişliği, her zaman hazırlık kulesinin (prime tower) kenar uzunluğunun yarısından az olmalıdır." msgid "Fillet wall" msgstr "Kavisli duvar" @@ -17522,7 +17522,7 @@ msgid "Maximal bridging distance" msgstr "Maksimum köprüleme mesafesi" msgid "Maximal distance between supports on sparse infill sections." -msgstr "Bu nesne, filamentten tasarruf etmek ve baskı süresini azaltmak için bir filament değişiminden sonra nozulu temizlemek için kullanılacaktır. Sonuç olarak nesnelerin renkleri karıştırılacaktır. Prime tower etkinleştirilmediği sürece etkili olmayacaktır." +msgstr "Seyrek dolgu bölümlerindeki destekler arası maksimum mesafe." msgid "Wipe tower purge lines spacing" msgstr "Silme kulesi temizleme hatları aralığı" @@ -17764,7 +17764,7 @@ msgid "Temperature delta applied during pre-heating before tool change." msgstr "Takım değişiminden önce ön ısıtma sırasında uygulanan sıcaklık farkı." msgid "Detect narrow internal solid infills" -msgstr "Dar iç katı dolguyu tespit et" +msgstr "Dar iç dolguları tespit et" msgid "This option will auto-detect narrow internal solid infill areas. If enabled, the concentric pattern will be used for the area to speed up printing. Otherwise, the rectilinear pattern will be used by default." msgstr "Bu seçenek dar dahili katı dolgu alanını otomatik olarak algılayacaktır. Etkinleştirilirse, yazdırmayı hızlandırmak amacıyla alanda eşmerkezli desen kullanılacaktır. Aksi takdirde varsayılan olarak doğrusal desen kullanılır." @@ -17795,7 +17795,7 @@ msgid "Export slicing data" msgstr "Dilimleme verilerini dışa aktar" msgid "Export slicing data to a folder" -msgstr "Dilimleme verilerini bir klasöre aktarın." +msgstr "Dilimleme verilerini bir klasöre dışa aktar" msgid "Load slicing data" msgstr "Dilimleme verilerini yükle" @@ -17843,13 +17843,13 @@ msgid "mtcpp" msgstr "mtcpp" msgid "max triangle count per plate for slicing" -msgstr "dilimleme için plaka başına maksimum üçgen sayısı." +msgstr "dilimleme için tabla başına maksimum üçgen sayısı" msgid "mstpp" msgstr "mstpp" msgid "max slicing time per plate in seconds" -msgstr "saniye cinsinden plaka başına maksimum dilimleme süresi." +msgstr "tabla başına saniye cinsinden maksimum dilimleme süresi" msgid "No check" msgstr "Kontrol yok" @@ -17960,7 +17960,7 @@ msgid "Load uptodate process/machine settings when using uptodate" msgstr "Güncel olan bir baskı süreci (process) veya makine (printer) profili seçildiğinde, ona ait en güncel ayarları otomatik olarak yükle" msgid "load up-to-date process/machine settings from the specified file when using up-to-date" -msgstr "Güncellemeyi kullanırken belirtilen dosyadan güncel işlem/yazıcı ayarlarını yükle." +msgstr "güncel durumdayken belirtilen dosyadan güncel proses/makine ayarlarını yükle" msgid "Load uptodate filament settings when using uptodate" msgstr "Güncel olan bir filament profili kullanırken, onun en güncel ayarlarını yükle" @@ -18068,13 +18068,13 @@ msgid "MakerLab version to generate this 3MF." msgstr "Bu 3mf’yi oluşturmak için MakerLab sürümü." msgid "Metadata name list" -msgstr "meta veri adı listesi" +msgstr "Meta veri adı listesi" msgid "Metadata name list added into 3MF." msgstr "3mf’ye meta veri adı listesi eklendi." msgid "Metadata value list" -msgstr "meta veri değer listesi" +msgstr "Meta veri değeri listesi" msgid "Metadata value list added into 3MF." msgstr "3mf’ye meta veri değeri listesi eklendi." @@ -18131,7 +18131,7 @@ msgid "Initial extruder" msgstr "İlk ekstruder" msgid "Zero-based index of the first extruder used in the print. Same as initial_tool." -msgstr "Baskıda kullanılan ilk ekstruderin sıfır bazlı indeksi. başlangıç_aracı ile aynı." +msgstr "Baskıda kullanılan ilk ekstruderin sıfır bazlı indeksi. initial_tool ile aynı." msgid "Initial tool" msgstr "Başlangıç aracı" @@ -18179,13 +18179,13 @@ msgid "Weight per extruder" msgstr "Ekstruder başına ağırlık" msgid "Weight per extruder extruded during the entire print. Calculated from filament_density value in Filament Settings." -msgstr "Baskının tamamı boyunca ekstrüzyon yapılan ekstruder başına ağırlık. Filament Ayarlarındaki filaman yoğunluğu değerinden hesaplanır." +msgstr "Baskının tamamı boyunca ekstrüzyon yapılan ekstruder başına ağırlık. Filament Ayarlarındaki filament yoğunluğu değerinden hesaplanır." msgid "Total weight" msgstr "Toplam ağırlık" msgid "Total weight of the print. Calculated from filament_density value in Filament Settings." -msgstr "Baskının toplam ağırlığı. Filament Ayarlarındaki filaman yoğunluğu değerinden hesaplanır." +msgstr "Baskının toplam ağırlığı. Filament Ayarlarındaki filament yoğunluğu değerinden hesaplanır." msgid "Total layer count" msgstr "Toplam katman sayısı" @@ -18221,7 +18221,7 @@ msgid "Wipe tower volume" msgstr "Kule hacmini sil" msgid "Total filament volume extruded on the wipe tower." -msgstr "Silme kulesinde ekstrüzyona tabi tutulan toplam filaman hacmi." +msgstr "Silme kulesinde ekstrüzyona tabi tutulan toplam filament hacmi." msgid "Used filament" msgstr "Kullanılan" @@ -18239,7 +18239,7 @@ msgid "Filament length (meters)" msgstr "Filament uzunluğu (metre)" msgid "Total filament length used in meters. Replaced with actual value during post-processing." -msgstr "Metre cinsinden kullanılan toplam filaman uzunluğu. Son işlem sırasında gerçek değerle değiştirilir." +msgstr "Metre cinsinden kullanılan toplam filament uzunluğu. Son işlem sırasında gerçek değerle değiştirilir." msgid "Number of objects" msgstr "Nesne sayısı" @@ -18434,7 +18434,7 @@ msgid "Meshing of a model file failed or no valid shape." msgstr "Bir model dosyasının meshlenmesi başarısız oldu veya geçerli bir şekil yok." msgid "The supplied file couldn't be read because it's empty." -msgstr "Sağlanan dosya boş olduğundan okunamadı" +msgstr "Seçilen dosya boş olduğundan okunamıyor." msgid "Unknown file format: input file must have .stl, .obj, or .amf(.xml) extension." msgstr "Bilinmeyen dosya formatı. Giriş dosyası .stl, .obj, .amf(.xml) uzantılı olmalıdır." @@ -18581,7 +18581,7 @@ msgid "" "Within the same extruder, the name(%s) must be unique when the filament type, nozzle diameter, and nozzle flow are the same.\n" "Are you sure you want to override the historical result?" msgstr "" -"Aynı ekstruder içinde filament tipi, nozül çapı ve nozül akışı aynı olduğunda adın(%s) benzersiz olması gerekir.\n" +"Aynı ekstruder içinde filament tipi, nozul çapı ve nozul akışı aynı olduğunda adın(%s) benzersiz olması gerekir.\n" "Geçmiş sonucu geçersiz kılmak istediğinizden emin misiniz?" #, c-format, boost-format @@ -18807,7 +18807,7 @@ msgid "Nozzle Flow" msgstr "Nozul Akışı" msgid "Filament position" -msgstr "filament konumu" +msgstr "Filament konumu" msgid "Filament For Calibration" msgstr "Kalibrasyon İçin Filament" @@ -18842,7 +18842,7 @@ msgid "Sync AMS and nozzle information" msgstr "AMS ve püskürtme ucu bilgilerini senkronize edin" msgid "Calibration only supports cases where the left and right nozzle diameters are identical." -msgstr "Kalibrasyon yalnızca sol ve sağ meme çaplarının aynı olduğu durumları destekler." +msgstr "Kalibrasyon yalnızca sol ve sağ nozul çaplarının aynı olduğu durumları destekler." msgid "From k Value" msgstr "K değerinden" @@ -18897,7 +18897,7 @@ msgstr "Akış Dinamiği Kalibrasyonunu Düzenle" #, c-format, boost-format msgid "Within the same extruder, the name '%s' must be unique when the filament type, nozzle diameter, and nozzle flow are identical. Please choose a different name." -msgstr "Aynı ekstruder içinde, filaman tipi, nozül çapı ve nozül akışı aynı olduğunda '%s' adı benzersiz olmalıdır. Lütfen farklı bir ad seçin." +msgstr "Aynı ekstruder içinde, filament tipi, bozul çapı ve nozul akışı aynı olduğunda '%s' adı benzersiz olmalıdır. Lütfen farklı bir ad seçin." msgid "New Flow Dynamic Calibration" msgstr "Yeni Akış Dinamik Kalibrasyonu" @@ -18909,7 +18909,7 @@ msgid "The extruder must be selected." msgstr "Ekstruder seçilmelidir." msgid "The nozzle must be selected." -msgstr "Meme seçilmelidir." +msgstr "Nozul seçilmelidir." msgid "Network lookup" msgstr "Ağ araması" @@ -19204,7 +19204,7 @@ msgstr "" "Desteklenen şekillendirici türleri için ürün yazılımı belgelerinize bakın." msgid "Frequency (Start / End): " -msgstr "Frekans (Başlangıç ​​/ Bitiş):" +msgstr "Frekans (Başlangıç / Bitiş): " msgid "Start / End" msgstr "Başlangıç / Bitiş" @@ -19243,7 +19243,7 @@ msgid "Check firmware compatibility." msgstr "Firmware uyumluluğunu kontrol edin." msgid "Frequency: " -msgstr "Sıklık:" +msgstr "Frekans: " # AI Translated msgid "Damp" @@ -19272,10 +19272,10 @@ msgid "SCV-V2" msgstr "SCV-V2" msgid "Start: " -msgstr "Başlangıç:" +msgstr "Başlat: " msgid "End: " -msgstr "Son:" +msgstr "Son: " msgid "Cornering settings" msgstr "Viraj alma ayarları" @@ -19517,7 +19517,7 @@ msgid "Subtract with" msgstr "Şununla çıkar" msgid "selected" -msgstr "Seçili" +msgstr "seçildi" msgid "Part 1" msgstr "Bölüm 1" @@ -19705,7 +19705,7 @@ msgid "Input Custom Nozzle Diameter" msgstr "Özel Nozul Çapını Girin" msgid "Can't find my nozzle diameter" -msgstr "Meme çapımı bulamıyorum" +msgstr "Nozul çapımı bulamıyorum" msgid "Printable Space" msgstr "Yazdırılabilir Alan" @@ -19761,7 +19761,7 @@ msgid "" "\tCancel: Do not create a preset; return to the creation interface." msgstr "" "Oluşturduğunuz yazıcı ön ayarının zaten aynı ada sahip bir ön ayarı var. Üzerine yazmak istiyor musunuz?\n" -"\tEvet: Aynı adı taşıyan yazıcı ön ayarının üzerine yazın; aynı ön ayar adı taşıyan filaman ve proses ön ayarları yeniden oluşturulacak ve aynı ön ayar \n" +"\tEvet: Aynı adı taşıyan yazıcı ön ayarının üzerine yazın; aynı ön ayar adı taşıyan filament ve proses ön ayarları yeniden oluşturulacak ve aynı ön ayar \n" "adı olmayan filament ve işlem ön ayarları rezerve edilecektir.\n" "\tİptal: Ön ayar oluşturmayın, oluşturma arayüzüne dönün." @@ -19799,7 +19799,7 @@ msgid "You have not yet selected the printer to replace the nozzle for; please c msgstr "Hala nozulu değiştirmek için yazıcı seçmediniz, lütfen bir seçim yapın." msgid "The entered nozzle diameter is invalid, please re-enter:\n" -msgstr "Girilen meme çapı geçersiz, lütfen tekrar girin:\n" +msgstr "Girilen nozul çapı geçersiz, lütfen tekrar girin:\n" msgid "" "The system preset does not allow creation. \n" @@ -19889,10 +19889,10 @@ msgid "add bundle structure file fail" msgstr "paket yapısı dosyası ekle başarısız" msgid "finalize fail" -msgstr "Tamamlama başarısız" +msgstr "tamamlama başarısız oldu" msgid "open zip written fail" -msgstr "ZIP dosyasını açma başarısız" +msgstr "zip dosyası açılamadı" msgid "Export successful" msgstr "Dışa aktarma başarılı" @@ -19993,7 +19993,7 @@ msgid "" "All the filament presets belong to this filament would be deleted.\n" "If you are using this filament on your printer, please reset the filament information for that slot." msgstr "" -"Bu filamente ait tüm filaman ön ayarları silinecektir.\n" +"Bu filamente ait tüm filament ön ayarları silinecektir.\n" "Yazıcınızda bu filamenti kullanıyorsanız lütfen o yuvanın filament bilgisini sıfırlayın." msgid "Delete filament" @@ -20058,14 +20058,14 @@ msgstr "Yazıcı ekstrüderlerinin sayısı ve kalibrasyon için seçilen yazıc #, c-format, boost-format msgid "The nozzle diameter of %s extruder is 0.2mm which does not support automatic Flow Dynamics calibration." -msgstr "%s ekstruderin meme çapı 0,2 mm'dir ve bu, otomatik Akış Dinamiği kalibrasyonunu desteklemez." +msgstr "%s ekstruderin nozul çapı 0,2 mm'dir ve bu, otomatik Akış Dinamiği kalibrasyonunu desteklemez." #, c-format, boost-format msgid "" "The currently selected nozzle diameter of %s extruder does not match the actual nozzle diameter.\n" "Please click the Sync button above and restart the calibration." msgstr "" -"%s ekstruderin şu anda seçili olan meme çapı, gerçek meme çapıyla eşleşmiyor.\n" +"%s ekstruderin şu anda seçili olan nozul çapı, gerçek nozul çapıyla eşleşmiyor.\n" "Lütfen yukarıdaki Senkronizasyon düğmesine tıklayın ve kalibrasyonu yeniden başlatın." msgid "" @@ -20507,7 +20507,7 @@ msgid "It has a small layer height. This results in almost negligible layer line msgstr "Küçük bir katman yüksekliğine sahiptir ve neredeyse ihmal edilebilir katman çizgileri ve yüksek baskı kalitesi sağlar. Çoğu genel yazdırma durumu için uygundur." msgid "Compared with the default profile of a 0.2 mm nozzle, it has lower speeds and acceleration, and the sparse infill pattern is Gyroid. This results in much higher print quality but a much longer print time." -msgstr "0,2 mm’lik nozülün varsayılan profiliyle karşılaştırıldığında daha düşük hız ve ivmeye sahiptir ve seyrek dolgu deseni Gyroid’dir. Böylece çok daha yüksek baskı kalitesi elde edilir, ancak çok daha uzun baskı süresi elde edilir." +msgstr "0,2 mm’lik nozulun varsayılan profiliyle karşılaştırıldığında daha düşük hız ve ivmeye sahiptir ve seyrek dolgu deseni Gyroid’dir. Böylece çok daha yüksek baskı kalitesi elde edilir, ancak çok daha uzun baskı süresi elde edilir." msgid "Compared with the default profile of a 0.2 mm nozzle, it has a slightly bigger layer height. This results in almost negligible layer lines and slightly shorter print time." msgstr "0,2 mm’lik püskürtme ucunun varsayılan profiliyle karşılaştırıldığında, biraz daha büyük katman yüksekliğine sahiptir ve neredeyse ihmal edilebilir düzeyde katman çizgileri ve biraz daha kısa yazdırma süresi sağlar." @@ -20531,7 +20531,7 @@ msgid "It has a normal layer height. This results in average layer lines and pri msgstr "Genel bir katman yüksekliğine sahiptir ve genel katman çizgileri ve baskı kalitesiyle sonuçlanır. Çoğu genel yazdırma durumu için uygundur." msgid "Compared with the default profile of a 0.4 mm nozzle, it has more wall loops and a higher sparse infill density. This results in higher print strength but more filament consumption and longer print time." -msgstr "0,4 mm’lik nozulun varsayılan profiliyle karşılaştırıldığında, daha fazla duvar döngüsüne ve daha yüksek seyrek dolgu yoğunluğuna sahiptir. Bu, baskıların daha güçlü olmasına, ancak daha fazla filaman tüketimine ve daha uzun baskı süresine neden olur." +msgstr "0,4 mm’lik nozulun varsayılan profiliyle karşılaştırıldığında, daha fazla duvar döngüsüne ve daha yüksek seyrek dolgu yoğunluğuna sahiptir. Bu, baskıların daha güçlü olmasına, ancak daha fazla filament tüketimine ve daha uzun baskı süresine neden olur." msgid "Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer height. This results in more apparent layer lines and lower print quality, but slightly shorter print time." msgstr "0,4 mm’lik püskürtme ucunun varsayılan profiliyle karşılaştırıldığında, daha büyük bir katman yüksekliğine sahiptir ve daha belirgin katman çizgileri ve daha düşük baskı kalitesi sağlar, ancak biraz daha kısa yazdırma süresi sağlar." @@ -20543,13 +20543,13 @@ msgid "Compared with the default profile of a 0.4 mm nozzle, it has a smaller la msgstr "0,4 mm’lik püskürtme ucunun varsayılan profiliyle karşılaştırıldığında, daha küçük bir katman yüksekliğine sahiptir ve daha az görünür katman çizgileri ve daha yüksek baskı kalitesi sağlar, ancak daha uzun yazdırma süresi sağlar." msgid "Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height, lower speeds and acceleration, and the sparse infill pattern is Gyroid. This results in less apparent layer lines and much higher print quality but much longer print time." -msgstr "0,4 mm’lik nozülün varsayılan profiliyle karşılaştırıldığında daha küçük katman yüksekliğine, daha düşük hızlara ve ivmeye sahiptir ve seyrek dolgu deseni Gyroid’dir. Böylece daha az belirgin katman çizgileri ve çok daha yüksek baskı kalitesi elde edilir, ancak çok daha uzun yazdırma süresi elde edilir." +msgstr "0,4 mm’lik nozulun varsayılan profiliyle karşılaştırıldığında daha küçük katman yüksekliğine, daha düşük hızlara ve ivmeye sahiptir ve seyrek dolgu deseni Gyroid’dir. Böylece daha az belirgin katman çizgileri ve çok daha yüksek baskı kalitesi elde edilir, ancak çok daha uzun yazdırma süresi elde edilir." msgid "Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height. This results in almost negligible layer lines and higher print quality but longer print time." msgstr "0,4 mm’lik püskürtme ucunun varsayılan profiliyle karşılaştırıldığında, katman yüksekliği daha küçüktür ve neredeyse göz ardı edilebilir katman çizgileri ve daha yüksek baskı kalitesi sağlar, ancak daha uzun yazdırma süresi sağlar." msgid "Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height, lower speeds and acceleration, and the sparse infill pattern is Gyroid. This results in almost negligible layer lines and much higher print quality but much longer print time." -msgstr "0,4 mm’lik nozülün varsayılan profiliyle karşılaştırıldığında daha küçük katman yüksekliğine, daha düşük hızlara ve ivmeye sahiptir ve seyrek dolgu deseni Gyroid’dir. Böylece, neredeyse göz ardı edilebilecek düzeyde katman çizgileri ve çok daha yüksek baskı kalitesi elde edilirken, çok daha uzun baskı süresi elde edilir." +msgstr "0,4 mm’lik nozulun varsayılan profiliyle karşılaştırıldığında daha küçük katman yüksekliğine, daha düşük hızlara ve ivmeye sahiptir ve seyrek dolgu deseni Gyroid’dir. Böylece, neredeyse göz ardı edilebilecek düzeyde katman çizgileri ve çok daha yüksek baskı kalitesi elde edilirken, çok daha uzun baskı süresi elde edilir." msgid "Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height. This results in almost negligible layer lines and longer print time." msgstr "0,4 mm’lik püskürtme ucunun varsayılan profiliyle karşılaştırıldığında, katman yüksekliği daha küçüktür ve neredeyse göz ardı edilebilecek düzeyde katman çizgileri ve daha uzun yazdırma süresi sağlar." @@ -20558,7 +20558,7 @@ msgid "It has a big layer height. This results in apparent layer lines and ordin msgstr "Büyük bir katman yüksekliğine sahiptir ve belirgin katman çizgileri ile sıradan baskı kalitesi ve baskı süresi sağlar." msgid "Compared with the default profile of a 0.6 mm nozzle, it has more wall loops and a higher sparse infill density. This results in higher print strength but more filament consumption and longer print time." -msgstr "0,6 mm’lik nozulun varsayılan profiliyle karşılaştırıldığında, daha fazla duvar döngüsüne ve daha yüksek seyrek dolgu yoğunluğuna sahiptir. Bu, baskıların daha güçlü olmasına, ancak daha fazla filaman tüketimine ve daha uzun baskı süresine neden olur." +msgstr "0,6 mm’lik nozulun varsayılan profiliyle karşılaştırıldığında, daha fazla duvar döngüsüne ve daha yüksek seyrek dolgu yoğunluğuna sahiptir. Bu, baskıların daha güçlü olmasına, ancak daha fazla filament tüketimine ve daha uzun baskı süresine neden olur." msgid "Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer height. This results in more apparent layer lines and lower print quality, but shorter print time in some cases." msgstr "0,6 mm’lik püskürtme ucunun varsayılan profiliyle karşılaştırıldığında, daha büyük bir katman yüksekliğine sahiptir ve daha belirgin katman çizgileri ve daha düşük baskı kalitesi sağlar, ancak bazı yazdırma durumlarında daha kısa yazdırma süresi sağlar." @@ -20591,16 +20591,16 @@ msgid "This is neither a commonly used filament, nor one of Bambu filaments, and msgstr "Bu ne yaygın olarak kullanılan bir filament ne de Bambu filamentlerinden biri ve markadan markaya çok değişiyor. Bu nedenle, yazdırmadan önce satıcınızdan uygun profili sormanız ve bazı parametreleri performansına göre ayarlamanız önemle tavsiye edilir." msgid "When printing this filament, there's a risk of warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials." -msgstr "Bu filamanı yazdırırken eğrilme ve düşük katman yapışma mukavemeti riski vardır. Daha iyi sonuçlar almak için lütfen şu wiki'ye bakın: Yüksek Sıcaklık / Mühendislik malzemeleri için Yazdırma İpuçları." +msgstr "Bu filamenti yazdırırken eğrilme ve düşük katman yapışma mukavemeti riski vardır. Daha iyi sonuçlar almak için lütfen şu wiki'ye bakın: Yüksek Sıcaklık / Mühendislik malzemeleri için Yazdırma İpuçları." msgid "When printing this filament, there's a risk of nozzle clogging, oozing, warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials." -msgstr "Bu filamanı yazdırırken nozulun tıkanması, sızması, eğrilmesi ve düşük katman yapışma mukavemeti riski vardır. Daha iyi sonuçlar almak için lütfen şu wiki'ye bakın: Yüksek Sıcaklık / Mühendislik malzemeleri için Yazdırma İpuçları." +msgstr "Bu filamenti yazdırırken nozulun tıkanması, sızması, eğrilmesi ve düşük katman yapışma mukavemeti riski vardır. Daha iyi sonuçlar almak için lütfen şu wiki'ye bakın: Yüksek Sıcaklık / Mühendislik malzemeleri için Yazdırma İpuçları." msgid "To get better transparent or translucent results with the corresponding filament, please refer to this wiki: Printing tips for transparent PETG." msgstr "İlgili filamentle daha iyi şeffaf veya yarı şeffaf sonuçlar elde etmek için lütfen şu wiki'ye bakın: Şeffaf PETG için yazdırma ipuçları." msgid "To make the prints get higher gloss, please dry the filament before use, and set the outer wall speed to be 40 to 60 mm/s when slicing." -msgstr "Baskıların daha parlak olmasını sağlamak için lütfen kullanmadan önce filamanı kurutun ve dilimleme sırasında dış duvar hızını 40 ila 60 mm/s olarak ayarlayın." +msgstr "Baskıların daha parlak olmasını sağlamak için lütfen kullanmadan önce filamenti kurutun ve dilimleme sırasında dış duvar hızını 40 ila 60 mm/s olarak ayarlayın." msgid "This filament is only used to print models with a low density usually, and some special parameters are required. To get better printing quality, please refer to this wiki: Instructions for printing RC model with foaming PLA (PLA Aero)." msgstr "Bu filament genellikle yalnızca düşük yoğunluklu modelleri basmak için kullanılır ve bazı özel parametreler gereklidir. Daha iyi baskı kalitesi elde etmek için lütfen bu wiki'ye bakın: RC modelini köpüklü PLA (PLA Aero) ile yazdırma talimatları." @@ -20609,7 +20609,7 @@ msgid "This filament is only used to print models with a low density usually, an msgstr "Bu filament genellikle yalnızca düşük yoğunluklu modelleri basmak için kullanılır ve bazı özel parametreler gereklidir. Daha iyi baskı kalitesi elde etmek için lütfen şu wiki'ye bakın: ASA Aero Printing Guide." msgid "This filament is too soft and not compatible with the AMS. Printing it is of many requirements, and to get better printing quality, please refer to this wiki: TPU printing guide." -msgstr "Bu filaman çok yumuşak ve AMS ile uyumlu değil. Yazdırmanın birçok gereksinimi vardır ve daha iyi yazdırma kalitesi elde etmek için lütfen şu wiki'ye bakın: TPU yazdırma kılavuzu." +msgstr "Bu filament çok yumuşak ve AMS ile uyumlu değil. Yazdırmanın birçok gereksinimi vardır ve daha iyi yazdırma kalitesi elde etmek için lütfen şu wiki'ye bakın: TPU yazdırma kılavuzu." msgid "This filament has high enough hardness (about 67D) and is compatible with the AMS. Printing it is of many requirements, and to get better printing quality, please refer to this wiki: TPU printing guide." msgstr "Bu filament yeterince yüksek sertliğe sahiptir (yaklaşık 67D) ve AMS ile uyumludur. Yazdırmanın birçok gereksinimi vardır ve daha iyi yazdırma kalitesi elde etmek için lütfen şu wiki'ye bakın: TPU yazdırma kılavuzu." @@ -20618,7 +20618,7 @@ msgid "If you are to print a kind of soft TPU, please don't slice with this prof msgstr "Bir tür yumuşak TPU yazdıracaksanız lütfen bu profille kesmeyin; bu yalnızca yeterince yüksek sertliğe sahip (55D'den az olmayan) ve AMS ile uyumlu TPU içindir. Daha iyi baskı kalitesi elde etmek için lütfen şu wiki'ye bakın: TPU yazdırma kılavuzu." msgid "This is a water-soluble support filament, and usually it is only for the support structure and not for the model body. Printing this filament is of many requirements, and to get better printing quality, please refer to this wiki: PVA Printing Guide." -msgstr "Bu suda çözünebilen bir destek filamentidir ve genellikle model gövdesi için değil yalnızca destek yapısı içindir. Bu filamanı yazdırmak birçok gereksinimi gerektirir ve daha iyi baskı kalitesi elde etmek için lütfen şu wiki'ye bakın: PVA Yazdırma Kılavuzu." +msgstr "Bu suda çözünebilen bir destek filamentidir ve genellikle model gövdesi için değil yalnızca destek yapısı içindir. Bu filamenti yazdırmak birçok gereksinimi gerektirir ve daha iyi baskı kalitesi elde etmek için lütfen şu wiki'ye bakın: PVA Yazdırma Kılavuzu." msgid "This is a non-water-soluble support filament, and usually it is only for the support structure and not for the model body. To get better printing quality, please refer to this wiki: Printing Tips for Support Filament and Support Function." msgstr "Bu suda çözünmeyen bir destek filamentidir ve genellikle model gövdesi için değil yalnızca destek yapısı içindir. Daha iyi baskı kalitesi elde etmek için lütfen şu wiki'ye bakın: Destek Filamenti ve Destek Fonksiyonu için Yazdırma İpuçları." @@ -20654,7 +20654,7 @@ msgid "High quality profile for 0.8mm nozzle, prioritizing print quality." msgstr "0,8 mm püskürtme ucu için baskı kalitesini ön planda tutan yüksek kaliteli profil." msgid "Strength profile for 0.8mm nozzle, prioritizing strength." -msgstr "0,8 mm'lik nozül için güç profili, dayanıklılığa öncelik verilir." +msgstr "0,8 mm'lik nozul için güç profili, dayanıklılığa öncelik verilir." msgid "Standard profile for 0.8mm nozzle, prioritizing speed." msgstr "Hıza öncelik veren 0,8 mm nozul için standart profil." @@ -20814,13 +20814,13 @@ msgid "Custom Mode" msgstr "Özel Mod" msgid "Generates filament grouping for the left and right nozzles based on the most filament-saving principles to minimize waste." -msgstr "Atıkları en aza indirmek için en fazla filaman tasarrufu sağlayan ilkelere dayalı olarak sol ve sağ püskürtme uçları için filaman gruplandırması oluşturur." +msgstr "Atıkları en aza indirmek için en fazla filament tasarrufu sağlayan ilkelere dayalı olarak sol ve sağ püskürtme uçları için filament gruplandırması oluşturur." msgid "Generates filament grouping for the left and right nozzles based on the printer's actual filament status, reducing the need for manual filament adjustment." -msgstr "Yazıcının gerçek filaman durumuna göre sol ve sağ püskürtme uçları için filaman gruplandırması oluşturarak manuel filaman ayarlaması ihtiyacını azaltır." +msgstr "Yazıcının gerçek filament durumuna göre sol ve sağ püskürtme uçları için filament gruplandırması oluşturarak manuel filament ayarlaması ihtiyacını azaltır." msgid "Manually assign filament to the left or right nozzle" -msgstr "Filamenti manuel olarak sol veya sağ memeye atayın" +msgstr "Filamenti manuel olarak sol veya sağ nozule atayın" msgid "Global settings" msgstr "Genel ayarlar" @@ -20855,7 +20855,7 @@ msgid "Set the physical nozzle count..." msgstr "Fiziksel nozul sayısını ayarlayın..." msgid "The filament grouping method for current plate is determined by the dropdown option at the slicing plate button." -msgstr "Geçerli plaka için filaman gruplandırma yöntemi, dilimleme plakası düğmesindeki açılır seçenekle belirlenir." +msgstr "Geçerli plaka için filament gruplandırma yöntemi, dilimleme plakası düğmesindeki açılır seçenekle belirlenir." msgid "Connected to Obico successfully!" msgstr "Obico'ya başarıyla bağlanıldı!" @@ -21552,10 +21552,10 @@ msgid "The filament model is unknown. Generic filament presets will be used." msgstr "Filament modeli bilinmiyor. Genel filament ön ayarları kullanılacaktır." msgid "The filament may not be compatible with the current machine settings. A random filament preset will be used." -msgstr "Filament mevcut makine ayarlarıyla uyumlu olmayabilir. Rastgele bir filaman ön ayarı kullanılacaktır." +msgstr "Filament mevcut makine ayarlarıyla uyumlu olmayabilir. Rastgele bir filament ön ayarı kullanılacaktır." msgid "The filament model is unknown. A random filament preset will be used." -msgstr "Filament modeli bilinmiyor. Rastgele bir filaman ön ayarı kullanılacaktır." +msgstr "Filament modeli bilinmiyor. Rastgele bir filament ön ayarı kullanılacaktır." #: resources/data/hints.ini: [hint:Precise wall] msgid "" @@ -21768,8 +21768,7 @@ msgstr "" "Baskılarınızı plakalara ayırın\n" "Çok sayıda parçası olan bir modeli baskıya hazır ayrı kalıplara bölebileceğinizi biliyor muydunuz? Bu, tüm parçaları takip etme sürecini basitleştirecektir." -#: resources/data/hints.ini: [hint:Speed up your print with Adaptive Layer -#: Height] +#: resources/data/hints.ini: [hint:Speed up your print with Adaptive Layer Height] msgid "" "Speed up your print with Adaptive Layer Height\n" "Did you know that you can print a model even faster by using the Adaptive Layer Height option? Check it out!" @@ -21842,8 +21841,7 @@ msgstr "" "Gücü artırın\n" "Modelin gücünü artırmak için daha fazla duvar halkası ve daha yüksek seyrek dolgu yoğunluğu kullanabileceğinizi biliyor muydunuz?" -#: resources/data/hints.ini: [hint:When do you need to print with the printer -#: door opened] +#: resources/data/hints.ini: [hint:When do you need to print with the printer door opened] msgid "" "When do you need to print with the printer door opened?\n" "Did you know that opening the printer door can reduce the probability of extruder/hotend clogging when printing lower temperature filament with a higher enclosure temperature? There is more info about this in the Wiki." @@ -21905,10 +21903,10 @@ msgstr "" #~ msgstr "Daha Sonra Yeniden Başlat" #~ msgid "Select filament that installed to the left nozzle" -#~ msgstr "Sol nozüle takılan filamanı seçin" +#~ msgstr "Sol nozule takılan filamenti seçin" #~ msgid "Select filament that installed to the right nozzle" -#~ msgstr "Sağ nozüle takılan filamanı seçin" +#~ msgstr "Sağ nozule takılan filamenti seçin" #, c-format, boost-format #~ msgid "Note: the filament type(%s) does not match with the filament type(%s) in the slicing file. If you want to use this slot, you can install %s instead of %s and change slot information on the 'Device' page." @@ -21919,7 +21917,7 @@ msgstr "" #~ msgstr "Not: yuva boş veya tanımsız. Bu yuvayı kullanmak istiyorsanız 'Cihaz' sayfasından %s yükleyebilir ve yuva bilgilerini değiştirebilirsiniz." #~ msgid "Note: Only filament-loaded slots can be selected." -#~ msgstr "Not: Yalnızca filaman yüklü yuvalar seçilebilir." +#~ msgstr "Not: Yalnızca filament yüklü yuvalar seçilebilir." #~ msgid "Save the printing files initiated from Bambu Studio, Bambu Handy and MakerWorld on External Storage" #~ msgstr "Bambu Studio, Bambu Handy ve MakerWorld'den başlatılan yazdırma dosyalarını Harici Depolamaya kaydedin" @@ -22244,7 +22242,7 @@ msgstr "" #~ msgstr "hafızaya alınan meme boyutu: %d" #~ msgid "The size of nozzle type in preset is not consistent with memorized nozzle. Did you change your nozzle lately?" -#~ msgstr "Ön ayardaki nozül tipinin boyutu hafızaya alınan nozül ile tutarlı değil. Son zamanlarda nozulunuzu değiştirdiniz mi?" +#~ msgstr "Ön ayardaki nozul tipinin boyutu hafızaya alınan nozul ile tutarlı değil. Son zamanlarda nozulunuzu değiştirdiniz mi?" #, c-format, boost-format #~ msgid "nozzle[%d] in preset: %.1f" @@ -22380,7 +22378,7 @@ msgstr "" #~ msgstr "Sol püskürtme ucu: %smm" #~ msgid "Right nozzle: %smm" -#~ msgstr "Sağ nozül: %smm" +#~ msgstr "Sağ nozul: %smm" #~ msgid "\"Fix Model\" feature is currently only on Windows. Please repair the model on Orca Slicer(windows) or CAD softwares." #~ msgstr "\"Modeli Onar\" özelliği şu anda yalnızca Windows'ta bulunmaktadır. Lütfen modeli Orca Slicer (windows) veya CAD yazılımlarında onarın." From fb36d5e73b8fa662ccf6b918581bda414bb53187 Mon Sep 17 00:00:00 2001 From: Valerii Bokhan <80919135+valerii-bokhan@users.noreply.github.com> Date: Sat, 1 Aug 2026 22:58:04 +0200 Subject: [PATCH 037/106] Feature: Smooth Factor for the Hilbert Curve sparse infill (#14969) --- src/libslic3r/Fill/Fill.cpp | 12 ++ src/libslic3r/Fill/FillBase.hpp | 3 + src/libslic3r/Fill/FillPlanePath.cpp | 163 +++++++++++++++++++++- src/libslic3r/Fill/FillPlanePath.hpp | 7 + src/libslic3r/Preset.cpp | 1 + src/libslic3r/PrintConfig.cpp | 12 ++ src/libslic3r/PrintConfig.hpp | 1 + src/libslic3r/PrintObject.cpp | 1 + src/slic3r/GUI/ConfigManipulation.cpp | 1 + src/slic3r/GUI/GUI_Factories.cpp | 1 + src/slic3r/GUI/Tab.cpp | 1 + tests/libslic3r/CMakeLists.txt | 1 + tests/libslic3r/test_fill_plane_path.cpp | 164 +++++++++++++++++++++++ 13 files changed, 366 insertions(+), 2 deletions(-) create mode 100644 tests/libslic3r/test_fill_plane_path.cpp diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index f29d4ef3fd..88d87ddb26 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -278,6 +278,9 @@ struct SurfaceFillParams // For Gyroid: when true, use the parameterized "optimized" wave. bool gyroid_optimized = false; + // Orca: corner smoothing factor in the range [0, 1]. + double smooth_factor { 0. }; + CenterOfSurfacePattern center_of_surface_pattern{CenterOfSurfacePattern::Each_Surface}; bool separated_infills{false}; @@ -316,6 +319,7 @@ struct SurfaceFillParams RETURN_COMPARE_NON_EQUAL(skin_infill_depth); RETURN_COMPARE_NON_EQUAL(infill_overhang_angle); RETURN_COMPARE_NON_EQUAL(gyroid_optimized); + RETURN_COMPARE_NON_EQUAL(smooth_factor); RETURN_COMPARE_NON_EQUAL(center_of_surface_pattern); RETURN_COMPARE_NON_EQUAL(separated_infills); RETURN_COMPARE_NON_EQUAL_TYPED(unsigned, fill_order); @@ -348,6 +352,7 @@ struct SurfaceFillParams this->center_of_surface_pattern == rhs.center_of_surface_pattern && this->separated_infills == rhs.separated_infills && this->gyroid_optimized == rhs.gyroid_optimized && + this->smooth_factor == rhs.smooth_factor && this->fill_order == rhs.fill_order; } }; @@ -964,6 +969,11 @@ std::vector group_fills(const Layer &layer, LockRegionParam &lock_p params.angle = calculate_infill_rotation_angle(layer.object(), layer.id(), region_config.infill_direction.value, region_config.sparse_infill_rotate_template.value); params.fixed_angle = !region_config.sparse_infill_rotate_template.value.empty(); + + // Orca: special case; apply smoothing factor only for Hilbert Curve sparse infill. + // FillHilbertCurve::generate clamps and validates the value itself. + if (params.pattern == ipHilbertCurve) + params.smooth_factor = 0.01 * region_config.sparse_infill_smooth_factor.value; } else { const bool top_layer_direction_set = surface.is_top() && region_config.top_layer_direction.value >= 0.; const bool bottom_layer_direction_set = surface.is_bottom() && region_config.bottom_layer_direction.value >= 0.; @@ -1328,6 +1338,7 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: params.lateral_lattice_angle_2 = surface_fill.params.lateral_lattice_angle_2; params.infill_overhang_angle = surface_fill.params.infill_overhang_angle; params.gyroid_optimized = surface_fill.params.gyroid_optimized; + params.smooth_factor = surface_fill.params.smooth_factor; // BBS params.flow = surface_fill.params.flow; @@ -1569,6 +1580,7 @@ Polylines Layer::generate_sparse_infill_polylines_for_anchoring(FillAdaptive::Oc params.infill_overhang_angle = surface_fill.params.infill_overhang_angle; params.multiline = surface_fill.params.multiline; params.gyroid_optimized = surface_fill.params.gyroid_optimized; + params.smooth_factor = surface_fill.params.smooth_factor; for (ExPolygon &expoly : surface_fill.expolygons) { // Spacing is modified by the filler to indicate adjustments. Reset it for each expolygon. diff --git a/src/libslic3r/Fill/FillBase.hpp b/src/libslic3r/Fill/FillBase.hpp index 8128b9c9d1..d50c29b332 100644 --- a/src/libslic3r/Fill/FillBase.hpp +++ b/src/libslic3r/Fill/FillBase.hpp @@ -82,6 +82,9 @@ struct FillParams // For Gyroid: when true, use the parameterized "optimized" variant. bool gyroid_optimized { false }; + // Orca: corner smoothing factor in the range [0, 1]. + double smooth_factor { 0. }; + // For Lateral lattice coordf_t lateral_lattice_angle_1 { 0.f }; coordf_t lateral_lattice_angle_2 { 0.f }; diff --git a/src/libslic3r/Fill/FillPlanePath.cpp b/src/libslic3r/Fill/FillPlanePath.cpp index 7ce8e4abb3..7c4f285ac6 100644 --- a/src/libslic3r/Fill/FillPlanePath.cpp +++ b/src/libslic3r/Fill/FillPlanePath.cpp @@ -114,12 +114,12 @@ void FillPlanePath::_fill_surface_single( // Filling in a bounding box over the whole object, clip generated polyline against the snug bounding box. snug_bounding_box.translate(-shift.x(), -shift.y()); InfillPolylineClipper output(snug_bounding_box, distance_between_lines); - this->generate(min_x, min_y, max_x, max_y, resolution, output); + this->generate(min_x, min_y, max_x, max_y, resolution, params, output); polyline.points = std::move(output.result()); } else { // Filling in a snug bounding box, no need to clip. InfillPolylineOutput output(distance_between_lines); - this->generate(min_x, min_y, max_x, max_y, resolution, output); + this->generate(min_x, min_y, max_x, max_y, resolution, params, output); polyline.points = std::move(output.result()); } } @@ -288,6 +288,147 @@ static void generate_hilbert_curve(coord_t min_x, coord_t min_y, coord_t max_x, } } +using QuinticBezier = std::array; + +static bool is_bezier_flat(const QuinticBezier &curve, const double deviation) +{ + // A Bezier curve stays inside the convex hull of its control points. Therefore, keeping every + // control point within a deviation-wide strip around the endpoint chord conservatively bounds the + // flattening error. The cross product is the perpendicular distance scaled by the chord length; + // comparing squared values avoids a square root. + const Vec2d chord = curve.back() - curve.front(); + const double chord_length_sq = chord.squaredNorm(); + const double max_cross_sq = deviation * deviation * chord_length_sq; + + for (size_t i = 1; i + 1 < curve.size(); ++i) { + const Vec2d offset = curve[i] - curve.front(); + const double cross = chord.x() * offset.y() - chord.y() * offset.x(); + if (cross * cross > max_cross_sq) + return false; + } + return true; +} + +static void subdivide_bezier(const QuinticBezier &curve, QuinticBezier &left, QuinticBezier &right) +{ + // Split the curve at t = 0.5 using de Casteljau's algorithm. Each averaging level contributes one + // control point to the left half and one to the right half; the latter is filled backwards to keep + // both resulting control polygons in their original parameter direction. + QuinticBezier subdivision = curve; + left.front() = subdivision.front(); + right.back() = subdivision.back(); + for (size_t level = 1; level < curve.size(); ++level) { + for (size_t i = 0; i + level < curve.size(); ++i) + subdivision[i] = 0.5 * (subdivision[i] + subdivision[i + 1]); + left[level] = subdivision.front(); + right[curve.size() - level - 1] = subdivision[curve.size() - level - 1]; + } +} + +static void flatten_bezier(const QuinticBezier &curve, const double deviation, std::vector &output) +{ + // Subdivide to at least depth 1 so a rounded corner cannot collapse to a single diagonal chord. + // A uniform subdivision depth keeps samples at equal parameter intervals t = k / 2^depth, + // avoiding abrupt segment-length jumps at adaptive-depth boundaries. + static constexpr size_t max_depth = 16; + + std::vector subcurves(2); + subdivide_bezier(curve, subcurves[0], subcurves[1]); + + for (size_t depth = 1; depth < max_depth; ++depth) { + bool all_flat = true; + for (const QuinticBezier &c : subcurves) + if (!is_bezier_flat(c, deviation)) { + all_flat = false; + break; + } + if (all_flat) + break; + std::vector finer(subcurves.size() * 2); + for (size_t i = 0; i < subcurves.size(); ++i) + subdivide_bezier(subcurves[i], finer[i * 2], finer[i * 2 + 1]); + subcurves = std::move(finer); + } + + // The curve start is deliberately omitted so consecutive curve pieces can share it without duplication. + output.reserve(output.size() + subcurves.size()); + for (const QuinticBezier &c : subcurves) + output.emplace_back(c.back()); +} + +template +static void generate_smooth_hilbert_curve( + coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double resolution, + const double corner_distance, Output &output) +{ + // A Hilbert curve is defined on a square grid whose side is a power of two. As in the unsmoothed + // generator, expand the larger requested dimension to the next valid Hilbert grid size. The output + // clipper or the later region intersection removes the padded part of the traversal. + size_t sz = 2; + const size_t sz0 = std::max(max_x + 1 - min_x, max_y + 1 - min_y); + while (sz < sz0) + sz <<= 1; + + const size_t point_count = sz * sz; + output.reserve(point_count); + + // The caller normalizes resolution to the unit Hilbert grid; retain a finite positive tolerance + // if this helper is invoked with an invalid resolution. + const double deviation = resolution > 0. && std::isfinite(resolution) ? resolution : EPSILON; + // Construct one canonical 90-degree corner from (-corner_distance, 0) to (0, corner_distance). + // At each end, the first three control points are collinear and equally spaced: the tangent follows + // the adjoining straight leg and the second derivative is zero. The endpoint curvature is therefore + // zero, giving G2 joins to both legs. Every Hilbert turn is an oriented copy of this curve, so flatten + // it only once to the requested chordal-deviation tolerance. + const QuinticBezier corner_curve {{ + {-corner_distance, 0.}, {-0.7 * corner_distance, 0.}, {-0.4 * corner_distance, 0.}, + {0., 0.4 * corner_distance}, {0., 0.7 * corner_distance}, {0., corner_distance} + }}; + std::vector curve_coefficients; + flatten_bezier(corner_curve, deviation, curve_coefficients); + + auto translated_point = [min_x, min_y](size_t idx) { + Point p = hilbert_n_to_xy(idx); + return Point(p.x() + min_x, p.y() + min_y); + }; + auto to_vec2d = [](const Point &p) { return Vec2d(double(p.x()), double(p.y())); }; + bool has_last_output = false; + Vec2d last_output; + // Fully smoothed adjacent corners may meet at the same segment midpoint. Suppress such duplicates + // to avoid emitting zero-length extrusion segments. + auto add_point = [&output, &has_last_output, &last_output](const Vec2d &point) { + if (!has_last_output || point.x() != last_output.x() || point.y() != last_output.y()) { + output.add_point(point); + last_output = point; + has_last_output = true; + } + }; + + Vec2d previous = to_vec2d(translated_point(0)); + Vec2d corner = to_vec2d(translated_point(1)); + add_point(previous); + // Replace each non-collinear Hilbert vertex by the canonical curve expressed in the local basis of + // its incoming and outgoing unit vectors. Collinear vertices remain part of the straight polyline. + for (size_t i = 1; i + 1 < point_count; ++i) { + const Vec2d next = to_vec2d(translated_point(i + 1)); + const Vec2d incoming = (corner - previous).normalized(); + const Vec2d outgoing = (next - corner).normalized(); + const double cross = incoming.x() * outgoing.y() - incoming.y() * outgoing.x(); + + if (std::abs(cross) < EPSILON) { + add_point(corner); + } else { + add_point(corner - corner_distance * incoming); + for (const Vec2d &coefficient : curve_coefficients) + add_point(corner + coefficient.x() * incoming + coefficient.y() * outgoing); + } + + previous = corner; + corner = next; + } + add_point(corner); +} + void FillHilbertCurve::generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double /* resolution */, InfillPolylineOutput &output) { if (output.clips()) @@ -296,6 +437,24 @@ void FillHilbertCurve::generate(coord_t min_x, coord_t min_y, coord_t max_x, coo generate_hilbert_curve(min_x, min_y, max_x, max_y, output); } +void FillHilbertCurve::generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double resolution, + const FillParams ¶ms, InfillPolylineOutput &output) +{ + const double smooth_factor = std::isfinite(params.smooth_factor) ? + std::clamp(params.smooth_factor, 0., 1.) : 0.; + if (smooth_factor == 0.) { + this->generate(min_x, min_y, max_x, max_y, resolution, output); + return; + } + + const double corner_distance = 0.5 * smooth_factor; + if (output.clips()) + generate_smooth_hilbert_curve( + min_x, min_y, max_x, max_y, resolution, corner_distance, static_cast(output)); + else + generate_smooth_hilbert_curve(min_x, min_y, max_x, max_y, resolution, corner_distance, output); +} + template static void generate_octagram_spiral(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, Output &output) { diff --git a/src/libslic3r/Fill/FillPlanePath.hpp b/src/libslic3r/Fill/FillPlanePath.hpp index 1371e8506a..b4b25b73ae 100644 --- a/src/libslic3r/Fill/FillPlanePath.hpp +++ b/src/libslic3r/Fill/FillPlanePath.hpp @@ -53,6 +53,11 @@ protected: friend class InfillPolylineClipper; virtual void generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double resolution, InfillPolylineOutput &output) = 0; + virtual void generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double resolution, + const FillParams & /* params */, InfillPolylineOutput &output) + { + this->generate(min_x, min_y, max_x, max_y, resolution, output); + } }; class FillArchimedeanChords : public FillPlanePath @@ -75,6 +80,8 @@ public: protected: bool centered() const override { return false; } void generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double resolution, InfillPolylineOutput &output) override; + void generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double resolution, + const FillParams ¶ms, InfillPolylineOutput &output) override; }; class FillOctagramSpiral : public FillPlanePath diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 775c31b563..3bd277d44a 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -1037,6 +1037,7 @@ static std::vector s_Preset_print_options{ "fill_multiline", "gyroid_optimized", "sparse_infill_pattern", + "sparse_infill_smooth_factor", "lateral_lattice_angle_1", "lateral_lattice_angle_2", "infill_overhang_angle", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 17dd195df9..f7222b864f 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -3457,6 +3457,18 @@ void PrintConfigDef::init_fff_params() def->enum_labels.push_back(L("Octagram Spiral")); def->set_default_value(new ConfigOptionEnum(ipCrossHatch)); + def = this->add("sparse_infill_smooth_factor", coPercent); + def->label = L("Sparse infill smooth factor"); + def->category = L("Strength"); + def->tooltip = L("Controls how strongly sparse infill corners are rounded. 0% keeps the original right-angle path, " + "while 100% produces the largest possible curves between adjacent infill lines. " + "Currently applies only to the Hilbert Curve."); + def->sidetext = "%"; + def->min = 0; + def->max = 100; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionPercent(0)); + def = this->add("top_surface_acceleration", coFloats); def->label = L("Top surface"); def->category = L("Speed"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 67841c6404..1082c43491 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1264,6 +1264,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionString, sparse_infill_rotate_template)) ((ConfigOptionPercent, sparse_infill_density)) ((ConfigOptionEnum, sparse_infill_pattern)) + ((ConfigOptionPercent, sparse_infill_smooth_factor)) ((ConfigOptionFloat, lateral_lattice_angle_1)) ((ConfigOptionFloat, lateral_lattice_angle_2)) ((ConfigOptionFloat, infill_overhang_angle)) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 0ef46fac92..9356f937ab 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -1409,6 +1409,7 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "infill_overhang_angle") { steps.emplace_back(posInfill); } else if (opt_key == "sparse_infill_pattern" + || opt_key == "sparse_infill_smooth_factor" || opt_key == "symmetric_infill_y_axis" || opt_key == "infill_shift_step" || opt_key == "sparse_infill_rotate_template" diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index c2643b5d0f..53a3575a57 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -707,6 +707,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, in bool has_top_shell = has_top_shell_layers && config->option("top_surface_density")->value > 0; bool has_bottom_shell = config->opt_int("bottom_shell_layers") > 0; bool has_solid_infill = has_top_shell_layers || has_bottom_shell; + toggle_line("sparse_infill_smooth_factor", pattern == ipHilbertCurve); toggle_field("top_surface_pattern", has_top_shell); toggle_field("bottom_surface_pattern", has_bottom_shell); toggle_field("top_surface_density", has_top_shell_layers); diff --git a/src/slic3r/GUI/GUI_Factories.cpp b/src/slic3r/GUI/GUI_Factories.cpp index a4a60ac4bd..5254492e5d 100644 --- a/src/slic3r/GUI/GUI_Factories.cpp +++ b/src/slic3r/GUI/GUI_Factories.cpp @@ -123,6 +123,7 @@ std::map> SettingsFactory::PART_CATE {"sparse_infill_density", "", 1}, {"fill_multiline", "", 1}, {"sparse_infill_pattern", "", 1}, + {"sparse_infill_smooth_factor", "", 1}, {"lateral_lattice_angle_1", "", 1}, {"lateral_lattice_angle_2", "", 1}, {"infill_overhang_angle", "", 1}, diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index ef830b7f35..01458b368a 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2816,6 +2816,7 @@ void TabPrint::build() optgroup->append_single_option_line("fill_multiline", "strength_settings_infill#fill-multiline"); optgroup->append_single_option_line("sparse_infill_pattern", "strength_settings_infill#sparse-infill-pattern"); optgroup->append_single_option_line("gyroid_optimized", "strength_settings_patterns#gyroid-optimized"); + optgroup->append_single_option_line("sparse_infill_smooth_factor", "strength_settings_patterns#sparse-infill-smooth-factor"); optgroup->append_single_option_line("infill_direction", "strength_settings_infill#direction"); optgroup->append_single_option_line("sparse_infill_rotate_template", "strength_settings_infill_rotation_template_metalanguage"); optgroup->append_single_option_line("skin_infill_density", "strength_settings_patterns#locked-zag"); diff --git a/tests/libslic3r/CMakeLists.txt b/tests/libslic3r/CMakeLists.txt index 7524c27479..dbc6c99f15 100644 --- a/tests/libslic3r/CMakeLists.txt +++ b/tests/libslic3r/CMakeLists.txt @@ -18,6 +18,7 @@ add_executable(${_TEST_NAME}_tests test_preset_setting_id.cpp test_preset_diff.cpp test_elephant_foot_compensation.cpp + test_fill_plane_path.cpp test_geometry.cpp test_multimaterial_segmentation.cpp test_placeholder_parser.cpp diff --git a/tests/libslic3r/test_fill_plane_path.cpp b/tests/libslic3r/test_fill_plane_path.cpp new file mode 100644 index 0000000000..bbb75dce58 --- /dev/null +++ b/tests/libslic3r/test_fill_plane_path.cpp @@ -0,0 +1,164 @@ +#include + +#include +#include +#include +#include + +#include "libslic3r/Fill/FillPlanePath.hpp" +#include "libslic3r/PrintConfig.hpp" + +using namespace Slic3r; + +namespace { + +constexpr double output_scale = 1'000'000.; + +class TestableHilbertCurve : public FillHilbertCurve +{ +public: + Points generate_points(double resolution, double smooth_factor = 0., coord_t max_coordinate = 7) + { + InfillPolylineOutput output(output_scale); + FillParams params; + params.smooth_factor = smooth_factor; + FillHilbertCurve::generate(0, 0, max_coordinate, max_coordinate, resolution, params, output); + return std::move(output.result()); + } +}; + +double path_length(const Points &points) +{ + double length = 0.; + for (size_t i = 1; i < points.size(); ++i) + length += (points[i] - points[i - 1]).cast().norm(); + return length; +} + +double discrete_curvature_at(const Points &points, const Point &point) +{ + const auto point_it = std::find(points.begin(), points.end(), point); + REQUIRE(point_it != points.end()); + const size_t point_idx = size_t(std::distance(points.begin(), point_it)); + REQUIRE(point_idx > 0); + REQUIRE(point_idx + 1 < points.size()); + + const Vec2d incoming = (points[point_idx] - points[point_idx - 1]).cast() / output_scale; + const Vec2d outgoing = (points[point_idx + 1] - points[point_idx]).cast() / output_scale; + const Vec2d chord = incoming + outgoing; + const double cross = std::abs(incoming.x() * outgoing.y() - incoming.y() * outgoing.x()); + return 2. * cross / (incoming.norm() * outgoing.norm() * chord.norm()); +} + +} // namespace + +TEST_CASE("Hilbert curve exposes a smoothing factor", "[FillPlanePath]") +{ + const ConfigOptionDef *factor_def = print_config_def.get("sparse_infill_smooth_factor"); + REQUIRE(factor_def != nullptr); + REQUIRE(factor_def->type == coPercent); + REQUIRE_THAT(factor_def->min, Catch::Matchers::WithinAbs(0., 1e-12)); + REQUIRE_THAT(factor_def->max, Catch::Matchers::WithinAbs(100., 1e-12)); + REQUIRE_THAT(factor_def->get_default_value()->value, + Catch::Matchers::WithinAbs(0., 1e-12)); +} + +TEST_CASE("Hilbert curve smoothing rounds right angle turns", "[FillPlanePath]") +{ + const Points sharp = TestableHilbertCurve().generate_points(0.005); + const Points smooth = TestableHilbertCurve().generate_points(0.005, 1.); + + REQUIRE(smooth.front() == sharp.front()); + REQUIRE(smooth.back() == sharp.back()); + REQUIRE(smooth.size() > sharp.size()); + + bool has_turn = false; + for (size_t i = 1; i < smooth.size(); ++i) { + const Vec2d segment = (smooth[i] - smooth[i - 1]).cast(); + REQUIRE(segment.squaredNorm() > 0.); + } + for (size_t i = 1; i + 1 < smooth.size(); ++i) { + const Vec2d incoming = (smooth[i] - smooth[i - 1]).cast(); + const Vec2d outgoing = (smooth[i + 1] - smooth[i]).cast(); + const double cross = incoming.x() * outgoing.y() - incoming.y() * outgoing.x(); + const double cosine = incoming.dot(outgoing) / (incoming.norm() * outgoing.norm()); + has_turn |= std::abs(cross) > 0.; + REQUIRE(cosine > 0.); + } + REQUIRE(has_turn); + + const coord_t upper_bound = coord_t(7 * output_scale); + for (const Point &point : smooth) { + REQUIRE(point.x() >= 0); + REQUIRE(point.y() >= 0); + REQUIRE(point.x() <= upper_bound); + REQUIRE(point.y() <= upper_bound); + } +} + +TEST_CASE("Smoothed Hilbert curve honors path resolution", "[FillPlanePath]") +{ + const Points coarse = TestableHilbertCurve().generate_points(0.1, 1.); + const Points fine = TestableHilbertCurve().generate_points(0.001, 1.); + + REQUIRE(fine.size() > coarse.size()); + REQUIRE(fine.front() == coarse.front()); + REQUIRE(fine.back() == coarse.back()); +} + +TEST_CASE("Smoothed Hilbert corners use a uniform subdivision depth", "[FillPlanePath]") +{ + const Points smooth = TestableHilbertCurve().generate_points(0.0035, 1., 1); + const Point curve_entry(0, coord_t(0.5 * output_scale)); + const Point curve_exit(coord_t(0.5 * output_scale), coord_t(output_scale)); + + const auto entry_it = std::find(smooth.begin(), smooth.end(), curve_entry); + REQUIRE(entry_it != smooth.end()); + const auto exit_it = std::find(entry_it, smooth.end(), curve_exit); + REQUIRE(exit_it != smooth.end()); + + const size_t segment_count = size_t(std::distance(entry_it, exit_it)); + REQUIRE(segment_count > 1); + REQUIRE((segment_count & (segment_count - 1)) == 0); + + double previous_length = (entry_it[1] - entry_it[0]).cast().norm(); + REQUIRE(previous_length > 0.); + double max_length_ratio = 1.; + for (size_t segment = 1; segment < segment_count; ++segment) { + const double current_length = (entry_it[segment + 1] - entry_it[segment]).cast().norm(); + REQUIRE(current_length > 0.); + max_length_ratio = std::max(max_length_ratio, + std::max(current_length / previous_length, previous_length / current_length)); + previous_length = current_length; + } + REQUIRE(max_length_ratio < 1.5); +} + +TEST_CASE("Hilbert smoothing joins straight segments with continuous curvature", "[FillPlanePath]") +{ + const Points coarse = TestableHilbertCurve().generate_points(0.005, 0.5, 1); + const Points fine = TestableHilbertCurve().generate_points(0.0001, 0.5, 1); + const Point first_curve_entry(0, coord_t(0.75 * output_scale)); + + const double coarse_entry_curvature = discrete_curvature_at(coarse, first_curve_entry); + const double fine_entry_curvature = discrete_curvature_at(fine, first_curve_entry); + REQUIRE(coarse_entry_curvature > 0.); + REQUIRE(fine_entry_curvature < 0.25 * coarse_entry_curvature); +} + +TEST_CASE("Hilbert curve smooth factor controls corner curvature", "[FillPlanePath]") +{ + const Points sharp = TestableHilbertCurve().generate_points(0.005); + const Points half_smooth = TestableHilbertCurve().generate_points(0.005, 0.5); + const Points full_smooth = TestableHilbertCurve().generate_points(0.005, 1.); + const Points invalid_factor = TestableHilbertCurve().generate_points( + 0.005, std::numeric_limits::quiet_NaN()); + + REQUIRE(full_smooth.front() == half_smooth.front()); + REQUIRE(full_smooth.back() == half_smooth.back()); + REQUIRE(path_length(full_smooth) < path_length(half_smooth)); + REQUIRE(invalid_factor == sharp); + + for (size_t i = 1; i < full_smooth.size(); ++i) + REQUIRE((full_smooth[i] - full_smooth[i - 1]).squaredNorm() > 0); +} From 13ae3a1c90781b555db06cb3811b9f1705be9d99 Mon Sep 17 00:00:00 2001 From: maddavo <1432875+maddavo@users.noreply.github.com> Date: Sun, 2 Aug 2026 12:54:16 +1000 Subject: [PATCH 038/106] Add outer-only mouse ears and align ear radius controls (#15015) Improve mouse ear brim controls --- src/libslic3r/Brim.cpp | 16 +-- src/libslic3r/Preset.cpp | 2 +- src/libslic3r/PrintConfig.cpp | 7 + src/libslic3r/PrintConfig.hpp | 1 + src/libslic3r/PrintObject.cpp | 1 + src/slic3r/GUI/ConfigManipulation.cpp | 21 ++- src/slic3r/GUI/ConfigManipulation.hpp | 7 +- src/slic3r/GUI/Gizmos/GLGizmoBrimEars.cpp | 70 +++++----- src/slic3r/GUI/Gizmos/GLGizmoBrimEars.hpp | 4 +- src/slic3r/GUI/OptionsGroup.cpp | 2 + src/slic3r/GUI/OptionsGroup.hpp | 9 ++ src/slic3r/GUI/Tab.cpp | 14 +- src/slic3r/GUI/Tab.hpp | 1 + tests/fff_print/test_skirt_brim.cpp | 150 ++++++++++++++++++++++ 14 files changed, 252 insertions(+), 53 deletions(-) diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp index b22c9c323e..9cee5a0e4b 100644 --- a/src/libslic3r/Brim.cpp +++ b/src/libslic3r/Brim.cpp @@ -349,7 +349,7 @@ static ExPolygons make_brim_ears_auto(const ExPolygons& obj_expoly, coord_t size return mouse_ears_ex; } -static ExPolygons make_brim_ears(const PrintObject* object, const double& flowWidth, float brim_offset, Flow &flow, bool is_outer_brim) +static ExPolygons make_brim_ears(const PrintObject* object) { ExPolygons mouse_ears_ex; BrimPoints brim_ear_points = object->model_object()->brim_points; @@ -373,12 +373,7 @@ static ExPolygons make_brim_ears(const PrintObject* object, const double& flowWi Vec3f world_pos = pt.transform(trsf.get_matrix()); if ( world_pos.z() > 0) continue; Polygon point_round; - float brim_width = floor(scale_(pt.head_front_radius) / flowWidth / 2) * flowWidth * 2; - if (is_outer_brim) { - double flowWidthScale = flowWidth / SCALING_FACTOR; - brim_width = floor(brim_width / flowWidthScale / 2) * flowWidthScale * 2; - } - coord_t size_ear = (brim_width - brim_offset - flow.scaled_spacing()); + const coord_t size_ear = scale_(pt.head_front_radius); for (size_t i = 0; i < POLY_SIDE_COUNT; i++) { double angle = (2.0 * PI * i) / POLY_SIDE_COUNT; point_round.points.emplace_back(size_ear * cos(angle), size_ear * sin(angle)); @@ -452,7 +447,8 @@ static ExPolygons outer_inner_brim_area(const Print& print, bool has_brim_auto = object->config().brim_type == btAutoBrim; const bool use_auto_brim_ears = object->config().brim_type == btEar; const bool use_brim_ears = object->config().brim_type == btPainted; - const bool has_inner_brim = brim_type == btInnerOnly || brim_type == btOuterAndInner || use_auto_brim_ears || use_brim_ears; + const bool use_inner_brim_ears = (use_auto_brim_ears || use_brim_ears) && !object->config().brim_ears_outer_only.value; + const bool has_inner_brim = brim_type == btInnerOnly || brim_type == btOuterAndInner || use_inner_brim_ears; const bool has_outer_brim = brim_type == btOuterOnly || brim_type == btOuterAndInner || brim_type == btAutoBrim || use_auto_brim_ears || use_brim_ears; coord_t ear_detection_length = scale_(object->config().brim_ears_detection_length.value); coordf_t brim_ears_max_angle = object->config().brim_ears_max_angle.value; @@ -531,7 +527,7 @@ static ExPolygons outer_inner_brim_area(const Print& print, auto innerExpoly = offset_ex(ex_poly.contour, brim_offset, jtRound, SCALED_RESOLUTION); ExPolygons outerExpoly; if (use_brim_ears) { - outerExpoly = make_brim_ears(object, flowWidth, brim_offset, flow, true); + outerExpoly = make_brim_ears(object); //outerExpoly = offset_ex(outerExpoly, brim_width_mod, jtRound, SCALED_RESOLUTION); } else if (use_auto_brim_ears) { coord_t size_ear = (brim_width_mod - brim_offset - flow.scaled_spacing()); @@ -545,7 +541,7 @@ static ExPolygons outer_inner_brim_area(const Print& print, ExPolygons outerExpoly; auto innerExpoly = offset_ex(ex_poly_holes_reversed, -brim_width - brim_offset); if (use_brim_ears) { - outerExpoly = make_brim_ears(object, flowWidth, brim_offset, flow, false); + outerExpoly = make_brim_ears(object); } else if (use_auto_brim_ears) { coord_t size_ear = (brim_width - brim_offset - flow.scaled_spacing()); outerExpoly = make_brim_ears_auto(offset_ex(ex_poly_holes_reversed, -brim_offset), size_ear, ear_detection_length, brim_ears_max_angle, false); diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 3bd277d44a..2821bef0af 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -1091,7 +1091,7 @@ static std::vector s_Preset_print_options{ "top_surface_speed", "support_speed", "support_object_xy_distance", "support_object_first_layer_gap", "support_interface_speed", "bridge_speed", "internal_bridge_speed", "gap_infill_speed", "travel_speed", "travel_speed_z", "initial_layer_speed", "outer_wall_acceleration", "initial_layer_acceleration", "top_surface_acceleration", "default_acceleration", "skirt_type", "skirt_loops", "skirt_speed","min_skirt_length", "skirt_distance", "skirt_start_angle", "skirt_height","single_loop_draft_shield", "draft_shield", - "brim_width", "brim_object_gap", "brim_flow_ratio", "brim_use_efc_outline", "combine_brims", "brim_type", "brim_ears_max_angle", "brim_ears_detection_length", "enable_support", "support_type", "support_threshold_angle", "support_threshold_overlap","enforce_support_layers", + "brim_width", "brim_object_gap", "brim_flow_ratio", "brim_use_efc_outline", "combine_brims", "brim_type", "brim_ears_max_angle", "brim_ears_detection_length", "brim_ears_outer_only", "enable_support", "support_type", "support_threshold_angle", "support_threshold_overlap","enforce_support_layers", "raft_layers", "raft_first_layer_density", "raft_first_layer_expansion", "raft_contact_distance", "raft_expansion", "support_base_pattern", "support_base_pattern_spacing", "support_expansion", "support_style", // BBS diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index f7222b864f..cc991f91cc 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1937,6 +1937,13 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloat(1)); + def = this->add("brim_ears_outer_only", coBool); + def->label = L("Brim ears outer only"); + def->category = L("Support"); + def->tooltip = L("Generate mouse ears only on the outer contour of the model, excluding holes and enclosed sections."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(false)); + def = this->add("compatible_printers", coStrings); def->label = L("Select printers"); def->mode = comAdvanced; diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 1082c43491..90aa1adb3d 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1082,6 +1082,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloat, brim_width)) ((ConfigOptionFloat, brim_ears_detection_length)) ((ConfigOptionFloat, brim_ears_max_angle)) + ((ConfigOptionBool, brim_ears_outer_only)) ((ConfigOptionFloat, skirt_start_angle)) ((ConfigOptionBool, bridge_no_support)) ((ConfigOptionFloat, elefant_foot_compensation)) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 9356f937ab..b2a92f11a6 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -1175,6 +1175,7 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "brim_type" || opt_key == "brim_ears_max_angle" || opt_key == "brim_ears_detection_length" + || opt_key == "brim_ears_outer_only" // BBS: brim generation depends on printing speed || opt_key == "outer_wall_speed" || opt_key == "small_perimeter_speed" diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 53a3575a57..e46faa803a 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -70,6 +70,12 @@ void ConfigManipulation::toggle_line(const std::string& opt_key, const bool togg cb_toggle_line(opt_key, toggle, opt_index); } +void ConfigManipulation::set_option_label(const std::string& opt_key, const wxString& label, int opt_index) +{ + if (cb_set_option_label) + cb_set_option_label(opt_key, label, opt_index); +} + void ConfigManipulation::check_nozzle_recommended_temperature_range(DynamicPrintConfig *config) { if (is_msg_dlg_already_exist) return; @@ -808,14 +814,19 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, in toggle_field("outer_wall_filament_id", have_perimeters || have_brim); toggle_field("inner_wall_filament_id", have_perimeters || have_brim); - bool have_brim_ear = (config->opt_enum("brim_type") == btEar); + const BrimType brim_type = config->opt_enum("brim_type"); + const bool have_auto_brim_ear = brim_type == btEar; + const bool have_painted_brim_ear = brim_type == btPainted; + set_option_label("brim_width", have_auto_brim_ear ? _L("Brim ear radius") : _L("Brim width")); const auto brim_width = config->opt_float("brim_width"); - // disable brim_ears_max_angle and brim_ears_detection_length if brim_width is 0 + // Automatic brim ear settings require a non-zero brim width. toggle_field("brim_ears_max_angle", brim_width > 0.0f); toggle_field("brim_ears_detection_length", brim_width > 0.0f); - // hide brim_ears_max_angle and brim_ears_detection_length if brim_ear is not selected - toggle_line("brim_ears_max_angle", have_brim_ear); - toggle_line("brim_ears_detection_length", have_brim_ear); + // Painted ears carry their own radius and do not depend on brim_width. + toggle_field("brim_ears_outer_only", have_painted_brim_ear || brim_width > 0.0f); + toggle_line("brim_ears_max_angle", have_auto_brim_ear); + toggle_line("brim_ears_detection_length", have_auto_brim_ear); + toggle_line("brim_ears_outer_only", have_auto_brim_ear || have_painted_brim_ear); // Hide Elephant foot compensation layers if elefant_foot_compensation is not enabled toggle_line("elefant_foot_compensation_layers", config->opt_float("elefant_foot_compensation") > 0 || config->option("elefant_foot_layers_density")->get_abs_value(1.0f) < 1.0f); diff --git a/src/slic3r/GUI/ConfigManipulation.hpp b/src/slic3r/GUI/ConfigManipulation.hpp index 0ad1fb0b7c..d191ef2c4f 100644 --- a/src/slic3r/GUI/ConfigManipulation.hpp +++ b/src/slic3r/GUI/ConfigManipulation.hpp @@ -29,6 +29,7 @@ class ConfigManipulation std::function load_config = nullptr; std::function cb_toggle_field = nullptr; std::function cb_toggle_line = nullptr; + std::function cb_set_option_label = nullptr; // callback to propagation of changed value, if needed std::function cb_value_change = nullptr; //BBS: change local config to const DynamicPrintConfig @@ -45,10 +46,12 @@ public: std::function cb_value_change, //BBS: change local config to DynamicPrintConfig const DynamicPrintConfig* local_config = nullptr, - wxWindow* msg_dlg_parent = nullptr) : + wxWindow* msg_dlg_parent = nullptr, + std::function cb_set_option_label = nullptr) : load_config(load_config), cb_toggle_field(cb_toggle_field), cb_toggle_line(cb_toggle_line), + cb_set_option_label(cb_set_option_label), cb_value_change(cb_value_change), m_msg_dlg_parent(msg_dlg_parent), local_config(local_config) {} @@ -58,6 +61,7 @@ public: load_config = nullptr; cb_toggle_field = nullptr; cb_toggle_line = nullptr; + cb_set_option_label = nullptr; cb_value_change = nullptr; } @@ -67,6 +71,7 @@ public: t_config_option_keys const &applying_keys() const; void toggle_field(const std::string& field_key, const bool toggle, int opt_index = -1); void toggle_line(const std::string& field_key, const bool toggle, int opt_index = -1); + void set_option_label(const std::string& field_key, const wxString& label, int opt_index = -1); // FFF print void update_print_fff_config(DynamicPrintConfig* config, const bool is_global_config = false, const bool is_plate_config = false); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.cpp index 45aaf37a86..709e7b5b21 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.cpp @@ -15,6 +15,8 @@ static const ColorRGBA DEF_COLOR = {0.7f, 0.7f, 0.7f, 1.f}; static const ColorRGBA SELECTED_COLOR = {0.0f, 0.5f, 0.5f, 1.0f}; static const ColorRGBA ERR_COLOR = {1.0f, 0.3f, 0.3f, 0.5f}; static const ColorRGBA HOVER_COLOR = {0.7f, 0.7f, 0.7f, 0.5f}; +static constexpr float BRIM_EAR_RADIUS_MIN = 0.1f; +static constexpr float BRIM_EAR_RADIUS_MAX = 100.f; static ModelVolume *get_model_volume(const Selection &selection, Model &model) { @@ -41,14 +43,14 @@ GLGizmoBrimEars::GLGizmoBrimEars(GLCanvas3D &parent, const std::string &icon_fil bool GLGizmoBrimEars::on_init() { - m_new_point_head_diameter = get_brim_default_radius(); + m_new_point_head_radius = get_brim_default_radius(); m_shortcut_key = WXK_CONTROL_E; const wxString ctrl = GUI::shortkey_ctrl_prefix(); const wxString alt = GUI::shortkey_alt_prefix(); - m_desc["head_diameter"] = _L("Head diameter"); + m_desc["brim_ear_radius"] = _L("Brim ear radius"); m_desc["max_angle"] = _L("Max angle"); m_desc["detection_radius"] = _L("Detection radius"); m_desc["remove"] = _L("Remove"); @@ -62,7 +64,7 @@ bool GLGizmoBrimEars::on_init() m_shortcuts = { {_L("Left mouse button"), _L("Add or Select")}, {_L("Right mouse button"), _L("Remove")}, - {ctrl + _L("Mouse wheel"), m_desc["head_diameter"]}, + {ctrl + _L("Mouse wheel"), m_desc["brim_ear_radius"]}, {alt + _L("Mouse wheel"), m_desc["section_view"]}, }; @@ -358,7 +360,7 @@ bool GLGizmoBrimEars::gizmo_event(SLAGizmoEventType action, const Vec2d &mouse_p Transform3d inverse_trsf = volume->get_instance_transformation().get_matrix_no_offset().inverse(); std::pair pos_and_normal; if (unproject_on_mesh2(mouse_position, pos_and_normal)) { - render_hover_point = CacheEntry(BrimPoint(pos_and_normal.first, m_new_point_head_diameter / 2.f), false, (inverse_trsf * m_world_normal).cast(), true); + render_hover_point = CacheEntry(BrimPoint(pos_and_normal.first, m_new_point_head_radius), false, (inverse_trsf * m_world_normal).cast(), true); } else { render_hover_point.reset(); } @@ -397,7 +399,7 @@ bool GLGizmoBrimEars::gizmo_event(SLAGizmoEventType action, const Vec2d &mouse_p Vec3d object_pos = trsf.inverse() * world_pos; // brim ear always face up Plater::TakeSnapshot snapshot(wxGetApp().plater(), "Add brim ear"); - add_point_to_cache(object_pos.cast(), m_new_point_head_diameter / 2.f, false, (inverse_trsf * m_world_normal).cast()); + add_point_to_cache(object_pos.cast(), m_new_point_head_radius, false, (inverse_trsf * m_world_normal).cast()); m_parent.set_as_dirty(); m_wait_for_up_event = true; find_single(); @@ -490,9 +492,9 @@ bool GLGizmoBrimEars::gizmo_event(SLAGizmoEventType action, const Vec2d &mouse_p // mouse wheel up if (action == SLAGizmoEventType::MouseWheelUp) { if (control_down) { - float initial_value = m_new_point_head_diameter; + float initial_value = m_new_point_head_radius; begin_radius_change(initial_value); - m_new_point_head_diameter = std::min(20., initial_value + 0.1); + m_new_point_head_radius = std::min(BRIM_EAR_RADIUS_MAX, initial_value + 0.1f); update_cache_radius(); return true; } @@ -502,9 +504,9 @@ bool GLGizmoBrimEars::gizmo_event(SLAGizmoEventType action, const Vec2d &mouse_p if (action == SLAGizmoEventType::MouseWheelDown) { if (control_down) { - float initial_value = m_new_point_head_diameter; + float initial_value = m_new_point_head_radius; begin_radius_change(initial_value); - m_new_point_head_diameter = std::max(5., initial_value - 0.1); + m_new_point_head_radius = std::max(BRIM_EAR_RADIUS_MIN, initial_value - 0.1f); update_cache_radius(); return true; } @@ -597,18 +599,18 @@ std::vector GLGizmoBrimEars::get_config_options(const std: void GLGizmoBrimEars::begin_radius_change(float initial_value) { - if (m_old_point_head_diameter == 0.f) - m_old_point_head_diameter = initial_value; + if (m_old_point_head_radius == 0.f) + m_old_point_head_radius = initial_value; } void GLGizmoBrimEars::update_cache_radius() { if (render_hover_point) - render_hover_point->brim_point.head_front_radius = m_new_point_head_diameter / 2.f; + render_hover_point->brim_point.head_front_radius = m_new_point_head_radius; for (auto &cache_entry : m_editing_cache) if (cache_entry.selected) { - cache_entry.brim_point.head_front_radius = m_new_point_head_diameter / 2.f; + cache_entry.brim_point.head_front_radius = m_new_point_head_radius; find_single(); update_model_object(); } @@ -617,18 +619,18 @@ void GLGizmoBrimEars::update_cache_radius() void GLGizmoBrimEars::apply_radius_change() { - if (m_old_point_head_diameter == 0.f) return; + if (m_old_point_head_radius == 0.f) return; // momentarily restore the old value to take snapshot for (auto& cache_entry : m_editing_cache) if (cache_entry.selected) - cache_entry.brim_point.head_front_radius = m_old_point_head_diameter / 2.f; - float backup = m_new_point_head_diameter; - m_new_point_head_diameter = m_old_point_head_diameter; - Plater::TakeSnapshot snapshot(wxGetApp().plater(), "Change point head diameter"); - m_new_point_head_diameter = backup; + cache_entry.brim_point.head_front_radius = m_old_point_head_radius; + float backup = m_new_point_head_radius; + m_new_point_head_radius = m_old_point_head_radius; + Plater::TakeSnapshot snapshot(wxGetApp().plater(), "Change brim ear radius"); + m_new_point_head_radius = backup; update_cache_radius(); - m_old_point_head_diameter = 0.f; + m_old_point_head_radius = 0.f; } void GLGizmoBrimEars::on_render_input_window(float x, float y, float bottom_limit) @@ -653,7 +655,7 @@ void GLGizmoBrimEars::on_render_input_window(float x, float y, float bottom_limi ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar); float space_size = m_imgui->get_style_scaling() * 8; - std::vector text_list = {m_desc["head_diameter"], m_desc["max_angle"], m_desc["detection_radius"], m_desc["clipping_of_view"], + std::vector text_list = {m_desc["brim_ear_radius"], m_desc["max_angle"], m_desc["detection_radius"], m_desc["clipping_of_view"], m_desc["create"], m_desc["remove"]}; float widest_text = m_imgui->find_widest_text(text_list); float caption_size = widest_text + space_size + ImGui::GetStyle().WindowPadding.x; @@ -680,11 +682,11 @@ void GLGizmoBrimEars::on_render_input_window(float x, float y, float bottom_limi // - keep updating the head radius during sliding so it is continuosly refreshed in 3D scene // - take correct undo/redo snapshot after the user is done with moving the slider ImGui::AlignTextToFramePadding(); - float initial_value = m_new_point_head_diameter; - m_imgui->text(m_desc["head_diameter"]); + float initial_value = m_new_point_head_radius; + m_imgui->text(m_desc["brim_ear_radius"]); ImGui::SameLine(caption_size); ImGui::PushItemWidth(slider_width); - m_imgui->bbl_slider_float_style("##head_diameter", &m_new_point_head_diameter, 5, 20, "%.1f", 1.0f, true); + m_imgui->bbl_slider_float_style("##brim_ear_radius", &m_new_point_head_radius, BRIM_EAR_RADIUS_MIN, BRIM_EAR_RADIUS_MAX, "%.1f", 1.0f, true); if (m_imgui->get_last_slider_status().clicked) { begin_radius_change(initial_value); } @@ -695,7 +697,7 @@ void GLGizmoBrimEars::on_render_input_window(float x, float y, float bottom_limi } ImGui::SameLine(drag_left_width); ImGui::PushItemWidth(1.5 * slider_icon_width); - ImGui::BBLDragFloat("##head_diameter_input", &m_new_point_head_diameter, 0.05f, 0.0f, 0.0f, "%.1f"); + ImGui::BBLDragFloat("##brim_ear_radius_input", &m_new_point_head_radius, 0.05f, BRIM_EAR_RADIUS_MIN, BRIM_EAR_RADIUS_MAX, "%.1f"); ImGui::Separator(); @@ -910,9 +912,9 @@ void GLGizmoBrimEars::on_stop_dragging() m_point_before_drag = CacheEntry(); } -void GLGizmoBrimEars::on_load(cereal::BinaryInputArchive &ar) { ar(m_new_point_head_diameter, m_editing_cache, m_selection_empty); } +void GLGizmoBrimEars::on_load(cereal::BinaryInputArchive &ar) { ar(m_new_point_head_radius, m_editing_cache, m_selection_empty); } -void GLGizmoBrimEars::on_save(cereal::BinaryOutputArchive &ar) const { ar(m_new_point_head_diameter, m_editing_cache, m_selection_empty); } +void GLGizmoBrimEars::on_save(cereal::BinaryOutputArchive &ar) const { ar(m_new_point_head_radius, m_editing_cache, m_selection_empty); } void GLGizmoBrimEars::select_point(int i) { @@ -920,11 +922,11 @@ void GLGizmoBrimEars::select_point(int i) for (auto &point_and_selection : m_editing_cache) point_and_selection.selected = (i == AllPoints); m_selection_empty = (i == NoPoints); - if (i == AllPoints) m_new_point_head_diameter = m_editing_cache[0].brim_point.head_front_radius * 2.f; + if (i == AllPoints) m_new_point_head_radius = m_editing_cache[0].brim_point.head_front_radius; } else { m_editing_cache[i].selected = true; m_selection_empty = false; - m_new_point_head_diameter = m_editing_cache[i].brim_point.head_front_radius * 2.f; + m_new_point_head_radius = m_editing_cache[i].brim_point.head_front_radius; } } @@ -1011,8 +1013,7 @@ void GLGizmoBrimEars::auto_generate() auto add_point = [this, &trsf, &normal](const Point &p) { Vec3d world_pos = {float(p.x() * SCALING_FACTOR), float(p.y() * SCALING_FACTOR), -0.0001}; Vec3d object_pos = trsf.inverse() * world_pos; - // m_editing_cache.emplace_back(BrimPoint(object_pos.cast(), m_new_point_head_diameter / 2), false, normal); - add_point_to_cache(object_pos.cast(), m_new_point_head_diameter / 2, false, normal); + add_point_to_cache(object_pos.cast(), m_new_point_head_radius, false, normal); }; for (const ExPolygon &ex_poly : m_first_layer) { Polygon out_poly = ex_poly.contour; @@ -1158,8 +1159,11 @@ void GLGizmoBrimEars::reset_all_pick() { std::mapprinters.get_edited_preset().config.option("nozzle_diameter")->get_at(0); - const DynamicPrintConfig &pring_cfg = wxGetApp().preset_bundle->prints.get_edited_preset().config; - return pring_cfg.get_abs_value("initial_layer_line_width", nozzle_diameter) * 16.0f; + const DynamicPrintConfig &print_cfg = wxGetApp().preset_bundle->prints.get_edited_preset().config; + return std::clamp( + float(print_cfg.get_abs_value("initial_layer_line_width", nozzle_diameter) * 8.0), + BRIM_EAR_RADIUS_MIN, + BRIM_EAR_RADIUS_MAX); } ExPolygon GLGizmoBrimEars::make_polygon(BrimPoint point, const Geometry::Transformation &trsf) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.hpp index 8b1ff2ca62..4e531e6acc 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.hpp @@ -98,12 +98,12 @@ private: void render_points(const Selection& selection); - float m_new_point_head_diameter; // Size of a new point. + float m_new_point_head_radius; // Radius of a new point. float m_max_angle = 125.f; float m_detection_radius = 1.f; double m_detection_radius_max = .0f; CacheEntry m_point_before_drag; // undo/redo - so we know what state was edited - float m_old_point_head_diameter = 0.; // the same + float m_old_point_head_radius = 0.; // the same mutable std::vector m_editing_cache; // a support point and whether it is currently selectedchanges or undo/redo std::map m_single_brim; ObjectID m_old_mo_id; diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index 0f6cdba602..9fb4483883 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -386,6 +386,7 @@ void OptionsGroup::activate_line(Line& line) } if (label != nullptr && line.label_tooltip != "") label->SetToolTip(line.label_tooltip); + line.label_widget = label; } } @@ -574,6 +575,7 @@ void OptionsGroup::clear(bool destroy_custom_ctrl) for (Line& line : m_lines) { if (line.near_label_widget_win) line.near_label_widget_win = nullptr; + line.label_widget = nullptr; if (line.widget_sizer) { line.widget_sizer->Clear(true); diff --git a/src/slic3r/GUI/OptionsGroup.hpp b/src/slic3r/GUI/OptionsGroup.hpp index 5e1f55dfd8..c808545145 100644 --- a/src/slic3r/GUI/OptionsGroup.hpp +++ b/src/slic3r/GUI/OptionsGroup.hpp @@ -62,6 +62,7 @@ public: widget_t widget {nullptr}; std::function near_label_widget{ nullptr }; wxWindow* near_label_widget_win {nullptr}; + wxStaticText* label_widget {nullptr}; wxSizer* widget_sizer {nullptr}; wxSizer* extra_widget_sizer {nullptr}; //BBS: export the extra colume widget @@ -81,6 +82,14 @@ public: label(_(label)), label_tooltip(_(tooltip)) {} Line() : m_is_separator(true) {} + void set_label(const wxString& new_label) { + label = new_label; + if (label_widget != nullptr) { + label_widget->SetLabel(label + (label.IsEmpty() ? "" : ": ")); + label_widget->Refresh(); + } + } + bool is_separator() const { return m_is_separator; } bool has_only_option(const std::string& opt_key) const { return m_options.size() == 1 && m_options[0].opt_id == opt_key; } diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 01458b368a..c8fa524ca5 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1738,6 +1738,13 @@ void Tab::toggle_line(const std::string &opt_key, bool toggle, int opt_index) if (line) line->toggle_visible = toggle; }; +void Tab::set_option_label(const std::string &opt_key, const wxString &label, int opt_index) +{ + if (!m_active_page) return; + Line *line = m_active_page->get_line(opt_key, opt_index); + if (line) line->set_label(label); +} + // To be called by custom widgets, load a value into a config, // update the preset selection boxes (the dirty flags) // If value is saved before calling this function, put saved_value = true, @@ -3070,6 +3077,7 @@ void TabPrint::build() optgroup->append_single_option_line("combine_brims", "others_settings_brim#combine-brims"); optgroup->append_single_option_line("brim_ears_max_angle", "others_settings_brim#ear-max-angle"); optgroup->append_single_option_line("brim_ears_detection_length", "others_settings_brim#ear-detection-radius"); + optgroup->append_single_option_line("brim_ears_outer_only"); optgroup = page->new_optgroup(L("Special mode"), L"param_special"); optgroup->append_single_option_line("slicing_mode", "others_settings_special_mode#slicing-mode"); @@ -8935,11 +8943,15 @@ ConfigManipulation Tab::get_config_manipulation() return toggle_line(opt_key, toggle, opt_index >= 0 ? opt_index + 256 : opt_index); }; + auto cb_set_option_label = [this](const t_config_option_key &opt_key, const wxString &label, int opt_index) { + return set_option_label(opt_key, label, opt_index >= 0 ? opt_index + 256 : opt_index); + }; + auto cb_value_change = [this](const std::string& opt_key, const boost::any& value) { return on_value_change(opt_key, value); }; - return ConfigManipulation(load_config, cb_toggle_field, cb_toggle_line, cb_value_change, nullptr, this); + return ConfigManipulation(load_config, cb_toggle_field, cb_toggle_line, cb_value_change, nullptr, this, cb_set_option_label); } diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 9be9bc17f8..7187aff467 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -402,6 +402,7 @@ public: Field* get_field(const t_config_option_key &opt_key, Page** selected_page, int opt_index = -1); void toggle_option(const std::string &opt_key, bool toggle, int opt_index = -1); void toggle_line(const std::string &opt_key, bool toggle, int opt_index = -1); // BBS: hide some line + void set_option_label(const std::string &opt_key, const wxString &label, int opt_index = -1); wxSizer* description_line_widget(wxWindow* parent, ogStaticText** StaticText, wxString text = wxEmptyString); bool current_preset_is_dirty() const; bool saved_preset_is_dirty() const; diff --git a/tests/fff_print/test_skirt_brim.cpp b/tests/fff_print/test_skirt_brim.cpp index 3f63d3de5f..17a79a7828 100644 --- a/tests/fff_print/test_skirt_brim.cpp +++ b/tests/fff_print/test_skirt_brim.cpp @@ -4,6 +4,7 @@ #include "libslic3r/Config.hpp" #include "libslic3r/Geometry.hpp" #include "libslic3r/Geometry/ConvexHull.hpp" +#include "libslic3r/Layer.hpp" #include @@ -32,6 +33,30 @@ static size_t brim_loop_count(Print &print) return n; } +static bool brim_enters_first_layer_hole(Print &print) +{ + const PrintObject *object = print.get_object(0); + Polygons holes; + for (const ExPolygon &slice : object->layers().front()->lslices) + holes.insert(holes.end(), slice.holes.begin(), slice.holes.end()); + + const Vec3d plate_origin = print.get_plate_origin(); + Point shift = object->instances().front().shift_without_plate_offset(); + shift += Point(scaled(plate_origin.x()), scaled(plate_origin.y())); + for (Polygon &hole : holes) + hole.translate(shift); + + for (const auto &kv : print.get_brimMap()) { + Polylines brim_paths; + kv.second.collect_polylines(brim_paths); + for (const Polyline &path : brim_paths) + for (const Point &point : path.points) + if (contains(holes, point, false)) + return true; + } + return false; +} + // The span is skirt_height layers, or every layer when a draft shield is on (forced even at // height 0); per-object skirts are rejected in By object printing (no room between objects). TEST_CASE("Skirt is emitted once per layer it spans", "[SkirtBrim]") @@ -225,6 +250,131 @@ TEST_CASE("Brim ears appear only at corners within the max angle", "[SkirtBrim]" } } +TEST_CASE("Outer-only brim ears stay out of model holes", "[SkirtBrim]") +{ + const bool outer_only = GENERATE(false, true); + DYNAMIC_SECTION("brim_ears_outer_only=" << outer_only) { + Print print; + init_and_process_print({ TestMesh::cube_with_concave_hole }, print, { + { "skirt_loops", 0 }, + { "brim_type", "brim_ears" }, + { "brim_width", 2 }, + { "brim_ears_max_angle", 125 }, + { "brim_ears_detection_length", 0 }, + { "brim_ears_outer_only", outer_only }, + { "initial_layer_line_width", 0.5 }, + }); + + REQUIRE(brim_loop_count(print) > 0); + CHECK(brim_enters_first_layer_hole(print) != outer_only); + } +} + +TEST_CASE("Painted brim ear radius controls sliced size", "[SkirtBrim]") +{ + constexpr double ear_radius = 10.0; + + DynamicPrintConfig config = DynamicPrintConfig::full_print_config(); + config.set_deserialize_strict({ + { "skirt_loops", 0 }, + { "brim_type", "painted" }, + { "brim_width", 15 }, + { "brim_object_gap", 0.1 }, + { "brim_ears_outer_only", true }, + { "initial_layer_line_width", 0.5 }, + }); + + Print print; + Model model; + init_print({ cube(20) }, print, model, config); + print.process(); + + const PrintObject *object = print.get_object(0); + REQUIRE(!object->layers().front()->lslices.empty()); + const Point ear_center = object->layers().front()->lslices.front().contour.points.front(); + + Transform3d model_transform = model.objects.front()->instances.front()->get_transformation().get_matrix_no_offset(); + const Point ¢er_offset = object->center_offset(); + model_transform = model_transform.pretranslate( + Vec3d(-unscale(center_offset.x()), -unscale(center_offset.y()), 0)); + Vec3d model_pos = model_transform.inverse() * + Vec3d(unscale(ear_center.x()), unscale(ear_center.y()), 0); + model_pos.z() = model.objects.front()->raw_mesh_bounding_box().min.z() - 0.0001; + model.objects.front()->brim_points = { + BrimPoint(model_pos.cast(), float(ear_radius)), + }; + + print.apply(model, config); + print.process(); + + const Vec3d plate_origin = print.get_plate_origin(); + Point path_center = ear_center + object->instances().front().shift_without_plate_offset(); + path_center += Point(scaled(plate_origin.x()), scaled(plate_origin.y())); + + double max_path_radius = 0.0; + for (const auto &kv : print.get_brimMap()) { + Polylines brim_paths; + kv.second.collect_polylines(brim_paths); + for (const Polyline &path : brim_paths) + for (const Point &point : path.points) + max_path_radius = std::max(max_path_radius, unscale((point - path_center).cast().norm())); + } + + REQUIRE(max_path_radius > 0.0); + INFO("Outermost painted-ear path radius: " << max_path_radius << " mm"); + CHECK(max_path_radius > ear_radius - 0.5); + CHECK(max_path_radius < ear_radius); +} + +TEST_CASE("Outer-only painted brim ears stay out of model holes", "[SkirtBrim]") +{ + DynamicPrintConfig config = DynamicPrintConfig::full_print_config(); + config.set_deserialize_strict({ + { "skirt_loops", 0 }, + { "brim_type", "painted" }, + { "brim_ears_outer_only", true }, + { "initial_layer_line_width", 0.5 }, + }); + + Print print; + Model model; + init_print({ TestMesh::cube_with_concave_hole }, print, model, config); + + // Slice once to obtain exact outer and inner contour points in print + // coordinates, then express them in the model coordinates painted ears store. + print.process(); + const PrintObject *object = print.get_object(0); + REQUIRE(!object->layers().front()->lslices.empty()); + REQUIRE(!object->layers().front()->lslices.front().holes.empty()); + + Transform3d model_transform = model.objects.front()->instances.front()->get_transformation().get_matrix_no_offset(); + const Point ¢er_offset = object->center_offset(); + model_transform = model_transform.pretranslate( + Vec3d(-unscale(center_offset.x()), -unscale(center_offset.y()), 0)); + const double bottom_z = model.objects.front()->raw_mesh_bounding_box().min.z() - 0.0001; + auto painted_point = [&model_transform, bottom_z](const Point &point) { + Vec3d model_pos = model_transform.inverse() * + Vec3d(unscale(point.x()), unscale(point.y()), 0); + model_pos.z() = bottom_z; + return BrimPoint(model_pos.cast(), 3.f); + }; + + const ExPolygon &first_slice = object->layers().front()->lslices.front(); + Polygon inner_contour = first_slice.holes.front(); + inner_contour.reverse(); + const Points inner_ear_points = inner_contour.concave_points(55. * PI / 180.); + REQUIRE(!inner_ear_points.empty()); + model.objects.front()->brim_points = { + painted_point(first_slice.contour.points.front()), + painted_point(inner_ear_points.front()), + }; + print.apply(model, config); + print.process(); + + REQUIRE(brim_loop_count(print) > 0); + CHECK_FALSE(brim_enters_first_layer_hole(print)); +} + SCENARIO("Skirt has the configured number of loops", "[SkirtBrim]") { GIVEN("20mm cube and default config") { WHEN("skirt_loops is set to 2") { From 6f3ca7d1b919b007e8071bb52b68a8a45403a77e Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Sun, 2 Aug 2026 06:01:19 +0300 Subject: [PATCH 039/106] Fix preview speeds and time estimates after firmware retract commands (#15066) --- src/libslic3r/GCode/GCodeProcessor.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index d66398354c..cebfe486cb 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -5926,8 +5926,11 @@ void GCodeProcessor::process_G10(const GCodeReader::GCodeLine& line) GCodeReader::GCodeLine g10; g10.set(Axis::E, -this->m_parser.config().retraction_length.get_at(m_extruder_id)); g10.set(Axis::F, this->m_parser.config().retraction_speed.get_at(m_extruder_id) * 60); + //Orca: Firmware retract emulation must not change the modal G1 feedrate. + const float feedrate = m_feedrate; --m_g1_line_id; process_G1(g10); + m_feedrate = feedrate; } void GCodeProcessor::process_G11(const GCodeReader::GCodeLine& line) @@ -5936,8 +5939,11 @@ void GCodeProcessor::process_G11(const GCodeReader::GCodeLine& line) GCodeReader::GCodeLine g11; g11.set(Axis::E, this->m_parser.config().retraction_length.get_at(m_extruder_id) + this->m_parser.config().retract_restart_extra.get_at(m_extruder_id)); g11.set(Axis::F, this->m_parser.config().deretraction_speed.get_at(m_extruder_id) * 60); + // Orca: Firmware unretract emulation must not change the modal G1 feedrate. + const float feedrate = m_feedrate; --m_g1_line_id; process_G1(g11); + m_feedrate = feedrate; } void GCodeProcessor::process_G20(const GCodeReader::GCodeLine& line) From f9fa1c117fd444fadd774ec8957b38e3ed73008b Mon Sep 17 00:00:00 2001 From: "Dipl.-Ing. Raoul Rubien, BSc" Date: Sun, 2 Aug 2026 12:20:35 +0200 Subject: [PATCH 040/106] Define WXINSPECTOR_DISABLE globally to prevent include-order-dependent class layout (#15063) fix: define WXINSPECTOR_DISABLE globally to prevent include-order-dependent class layouts --- CMakeLists.txt | 4 ++++ src/libslic3r/Technologies.hpp | 5 ----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c9417fc906..fc688b35df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,8 +80,12 @@ endif() if (DEFINED BBL_RELEASE_TO_PUBLIC) add_compile_definitions("BBL_RELEASE_TO_PUBLIC=${BBL_RELEASE_TO_PUBLIC}") + if (BBL_RELEASE_TO_PUBLIC) + add_compile_definitions(WXINSPECTOR_DISABLE) + endif () else () add_compile_definitions("BBL_RELEASE_TO_PUBLIC=$") + add_compile_definitions("$<$:WXINSPECTOR_DISABLE>") endif () find_package(Git) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 2dee4bc780..06ebbbf41d 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -51,9 +51,4 @@ // Enable extension of tool position imgui dialog to show actual speed profile #define ENABLE_ACTUAL_SPEED_DEBUG 1 -// Disable layout inspector for public release -#if BBL_RELEASE_TO_PUBLIC -#define WXINSPECTOR_DISABLE -#endif - #endif // _prusaslicer_technologies_h_ From 1b718353374c980618a7c855586fbfa6f58a7c17 Mon Sep 17 00:00:00 2001 From: Misterff1 Date: Sun, 2 Aug 2026 12:58:49 +0200 Subject: [PATCH 041/106] Fixed some desktop environments showing title bar on splash screen when running on Wayland (#15019) * Remove titlebar from splash screen on Wayland * Broadly check for window decorations and added explanatory description * Fixed hiding title bar on Wayland for all desktop environments * Update format --------- Co-authored-by: noisyfox --- src/slic3r/GUI/GUI_App.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 07e99348bb..4c4bdfd62c 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -307,6 +307,20 @@ public: #endif // !__APPLE__ ) { + // Some desktop environments ignore splash screen typed window properties + // when running the app through Wayland,resulting in the titlebar being shown + // on the splash screen. The code below creates a client-side window decoration + // when running on Wayland and then removes that decoration. This ensures every + // environment correctly targets and removes the titlebar for this screen. + #if defined(__WXGTK__) + if (Slic3r::GUI::is_running_on_wayland()) { + GtkWidget *empty = gtk_fixed_new(); + gtk_widget_set_size_request(empty, 0, 0); + gtk_window_set_titlebar(GTK_WINDOW(GetHandle()), empty); + gtk_window_set_decorated(GTK_WINDOW(GetHandle()), false); + } + #endif + this->SetPosition(pos); this->CenterOnScreen(); From e72a3a65b29fbfb53c0d2eee97b4d618fb7d8a16 Mon Sep 17 00:00:00 2001 From: yw4z Date: Sun, 2 Aug 2026 13:59:53 +0300 Subject: [PATCH 042/106] QOL Continue to capture mouse position while dragging ImGui controls and mouse position goes to outside of window (#14999) * Update GLCanvas3D.cpp * support navigation cube * capture events for transform widgets * camera rotation and pan * selection frame * object drag * fix navigation cube stealing drag events * fix lag on navigation cuve * variable layer height * fix plates toolbar scrollbar * Update GLCanvas3D.cpp * Fix issue that mouse button state is wrong in certain macOS mouse events --------- Co-authored-by: Noisyfox --- src/slic3r/GUI/GLCanvas3D.cpp | 98 +++++++++++++++++++++++++-- src/slic3r/GUI/GLCanvas3D.hpp | 2 + src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 2 +- 3 files changed, 96 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index f39761f0ec..a24c095ad6 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1842,6 +1842,10 @@ void GLCanvas3D::enable_separator_toolbar(bool enable) m_separator_toolbar.set_enabled(enable); } +bool GLCanvas3D::has_mouse_capture() const { + return m_canvas != nullptr && m_canvas->HasCapture(); +} + void GLCanvas3D::zoom_to_bed() { BoundingBoxf3 box = m_bed.build_volume().bounding_volume(); @@ -2182,7 +2186,7 @@ void GLCanvas3D::render(bool only_init) // Negative coordinate means out of the window, likely because the window was deactivated. // In that case the tooltip should be hidden. - if (m_mouse.position.x() >= 0. && m_mouse.position.y() >= 0.) { + if (m_mouse.position.x() >= 0. && m_mouse.position.y() >= 0. || has_mouse_capture()) { // ORCA continue to capture mouse pos mid drag if (tooltip.empty()) tooltip = m_layers_editing.get_tooltip(*this); @@ -4170,6 +4174,23 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // BBS: single snapshot Plater::SingleSnapshot single(wxGetApp().plater()); +#ifdef __WXMAC__ + // On macOS, the mouse key state is only present for mouse btn related events such as wxEVT_LEFT_DOWN. + // For other events, all buttons are reported as non-pressed, such as window leaving event. This causes + // imgui stopped responding if cursor moved out of window, such as + // https://github.com/OrcaSlicer/OrcaSlicer/pull/14999#issuecomment-5151344759 + // We solve this by correcting the state of the event from the actual mouse state querying with `wxGetMouseState()` + // so it works like on other platforms. + { + const auto state = wxGetMouseState(); + evt.SetLeftDown(state.LeftIsDown()); + evt.SetMiddleDown(state.MiddleIsDown()); + evt.SetRightDown(state.RightIsDown()); + evt.SetAux1Down(state.Aux1IsDown()); + evt.SetAux2Down(state.Aux2IsDown()); + } +#endif + #if ENABLE_RETINA_GL const float scale = m_retina_helper->get_scale_factor(); evt.SetX(evt.GetX() * scale); @@ -4183,11 +4204,27 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // ignore left up events coming from imgui windows and not processed by them m_mouse.ignore_left_up = true; m_tooltip.set_in_imgui(false); - if (imgui->update_mouse_data(evt)) { + + // while a non-ImGui drag is already in progress (gizmo grabber, object move, rectangle selection, layer editing), + // don't let ImGui/ImGuizmo claim the event just because the cursor is hovering something like the navigator cube + // that incorrectly suppresses the active drag's tooltip and can interrupt its processing. The active drag always takes priority. + const bool other_drag_active = m_gizmos.is_dragging() || m_mouse.dragging || m_rectangle_selection.is_dragging() || m_layers_editing.state == LayersEditing::Editing; + + if (imgui->update_mouse_data(evt) && !other_drag_active) { if ((evt.LeftDown() || (evt.Moving() && (evt.AltDown() || evt.ShiftDown()))) && m_canvas != nullptr) m_canvas->SetFocus(); m_mouse.position = evt.Leaving() ? Vec2d(-1.0, -1.0) : pos.cast(); m_tooltip.set_in_imgui(true); + + // ORCA keep tracking mouse position while drag active and cursor not in window bounds + const bool imgui_dragging_active = (GImGui != nullptr && ImGui::GetIO().MouseDown[0] && GImGui->ActiveId != 0) || m_navigator_dragging; + if (!has_mouse_capture() && imgui_dragging_active) + m_canvas->CaptureMouse(); + + // release capture as soon as the button goes up + if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) + mouse_up_cleanup(); + render(); #ifdef SLIC3R_DEBUG_MOUSE_EVENTS printf((format_mouse_event_debug_message(evt) + " - Consumed by ImGUI\n").c_str()); @@ -4284,6 +4321,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_main_toolbar.on_mouse(evt2, *this); } + // ORCA keep tracking mouse position while drag active and cursor not in window bounds + if (!has_mouse_capture() && evt.LeftIsDown() && m_gizmos.is_dragging()) + m_canvas->CaptureMouse(); + if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) mouse_up_cleanup(); @@ -4389,6 +4430,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // Start editing the layer height. m_layers_editing.state = LayersEditing::Editing; _perform_layer_editing_action(&evt); + + if (!has_mouse_capture()) // ORCA keep tracking mouse position while drag active and cursor not in window bounds + m_canvas->CaptureMouse(); } else { @@ -4402,6 +4446,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) && m_gizmos.get_current_type() != GLGizmosManager::MmSegmentation && m_gizmos.get_current_type() != GLGizmosManager::FuzzySkin) { m_rectangle_selection.start_dragging(m_mouse.position, evt.ShiftDown() ? GLSelectionRectangle::Select : GLSelectionRectangle::Deselect); + + if (!has_mouse_capture()) // ORCA keep tracking mouse position while drag active and cursor not in window bounds + m_canvas->CaptureMouse(); + m_dirty = true; } } @@ -4469,6 +4517,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_mouse.drag.start_position_3D = m_mouse.scene_position; m_sequential_print_clearance_first_displacement = true; m_moving = true; + + if (!has_mouse_capture()) // ORCA keep tracking mouse position while drag active and cursor not in window bounds + m_canvas->CaptureMouse(); } } } @@ -4477,6 +4528,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } else if (evt.Dragging() && evt.LeftIsDown() && m_mouse.drag.move_volume_idx != -1 && m_layers_editing.state == LayersEditing::Unknown) { if (m_canvas_type != ECanvasType::CanvasAssembleView) { + + if (!has_mouse_capture()) // ORCA keep tracking mouse position while drag active and cursor not in window bounds + m_canvas->CaptureMouse(); + if (!m_mouse.drag.move_requires_threshold) { m_mouse.dragging = true; Vec3d cur_pos = m_mouse.drag.start_position_3D; @@ -4528,6 +4583,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) else if (evt.Dragging() && evt.LeftIsDown() && m_picking_enabled && m_rectangle_selection.is_dragging()) { //BBS not in assemble view if (m_canvas_type != ECanvasType::CanvasAssembleView) { + + if (!has_mouse_capture()) // ORCA keep tracking mouse position while drag active and cursor not in window bounds + m_canvas->CaptureMouse(); + m_rectangle_selection.dragging(pos.cast()); m_dirty = true; } @@ -4537,12 +4596,19 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (m_layers_editing.state != LayersEditing::Unknown && layer_editing_object_idx != -1) { if (m_layers_editing.state == LayersEditing::Editing) { + if (!has_mouse_capture()) // ORCA keep tracking mouse position while drag active and cursor not in window bounds + m_canvas->CaptureMouse(); + _perform_layer_editing_action(&evt); m_mouse.position = pos.cast(); } } // do not process the dragging if the left mouse was set down in another canvas else if (is_camera_rotate(evt, button_mappings)) { + + if (!has_mouse_capture()) // ORCA keep tracking mouse position while drag active and cursor not in window bounds + m_canvas->CaptureMouse(); + // Orca: Sphere rotation for painting view // if dragging over blank area with left button or other button mapped to rotate, then rotate bool middle_or_right_button_used_as_rotate = (evt.MiddleIsDown() && button_mappings[MouseButton::Middle] == MouseAction::Rotation) || @@ -4622,6 +4688,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_mouse.drag.start_position_3D = Vec3d((double)pos(0), (double)pos(1), 0.0); } else if (is_camera_pan(evt, button_mappings)) { + + if (!has_mouse_capture()) // ORCA keep tracking mouse position while drag active and cursor not in window bounds + m_canvas->CaptureMouse(); + // if dragging with right button or if button functions swapped and dragging with left button over blank area then pan if (m_mouse.is_start_position_2D_defined()) { // get point in model space at Z = 0 @@ -6033,9 +6103,18 @@ void GLCanvas3D::_render_3d_navigator() { if (!wxGetApp().show_3d_navigator()) { m_canvas_toolbar_pos[0] = 0; + m_navigator_dragging = false; return; } + // Fix stealing capture event from other drag events + const bool other_drag_active = !m_navigator_dragging && (m_moving || m_rectangle_selection.is_dragging() || m_gizmos.is_dragging() || m_layers_editing.state == LayersEditing::Editing); + + ImGuiIO& io = ImGui::GetIO(); + const bool saved_mouse_down0 = io.MouseDown[0]; + if (other_drag_active) + io.MouseDown[0] = false; + ImGuizmo::BeginFrame(); auto& style = ImGuizmo::GetStyle(); @@ -6060,7 +6139,6 @@ void GLCanvas3D::_render_3d_navigator() sc *= (float) dpi / (float) DPI_DEFAULT; #endif // WIN32 - const ImGuiIO& io = ImGui::GetIO(); const float viewManipulateLeft = 0; const float viewManipulateTop = io.DisplaySize.y; const float camDistance = 8.f; @@ -6084,6 +6162,10 @@ void GLCanvas3D::_render_3d_navigator() camDistance, ImVec2(viewManipulateLeft, viewManipulateTop - size), ImVec2(size, size), 0x00101010); + // Restore the real mouse-down state + if (other_drag_active) + io.MouseDown[0] = saved_mouse_down0; + if (result.changed) { for (unsigned int c = 0; c < 4; ++c) { for (unsigned int r = 0; r < 4; ++r) { @@ -6115,6 +6197,8 @@ void GLCanvas3D::_render_3d_navigator() request_extra_frame(); } + + m_navigator_dragging = result.dragging; } #define ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT 0 @@ -9226,8 +9310,12 @@ void GLCanvas3D::_render_imgui_select_plate_toolbar() //ORCA ImGui::IsWindowHovered() returns false when left_down events on buttons that causes scrollbar disappears for a short time auto win_pos = ImGui::GetWindowPos(); - bool is_win_hovered = ImGui::IsMouseHoveringRect(win_pos, win_pos + ImVec2(window_width + (show_scroll ? scrollbar_size : 0), window_height), !show_scroll); // use non clipped rectangle to reserve clickable area for scrollbar track - m_sel_plate_toolbar.is_display_scrollbar = is_win_hovered; + bool is_win_hovered = ImGui::IsMouseHoveringRect(win_pos, win_pos + ImVec2(window_width + (show_scroll ? scrollbar_size : 0), window_height), !show_scroll); + + // Also show scrollbar visible and continue to capture mouse position + const bool is_scrollbar_active_drag = GImGui != nullptr && ImGui::GetIO().MouseDown[0] && GImGui->ActiveId != 0 && GImGui->ActiveIdWindow == ImGui::GetCurrentWindow(); + + m_sel_plate_toolbar.is_display_scrollbar = is_win_hovered || is_scrollbar_active_drag; imgui.end(); } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 84cf311e57..7bae744098 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -589,6 +589,7 @@ private: bool m_toolpath_outside{ false }; ECursorType m_cursor_type; GLSelectionRectangle m_rectangle_selection; + bool m_navigator_dragging{ false }; //BBS:add plate related logic mutable std::vector m_hover_volume_idxs; @@ -916,6 +917,7 @@ public: void update_volumes_colors_by_extruder(); bool is_dragging() const { return m_gizmos.is_dragging() || m_moving; } + bool has_mouse_capture() const; void render(bool only_init = false); bool is_rendering_enabled() diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index 7855ea92cc..1aaac99d40 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -442,7 +442,7 @@ bool GLGizmoBase::use_grabbers(const wxMouseEvent &mouse_event) { } } else if (m_dragging) { // when mouse cursor leave window than finish actual dragging operation - bool is_leaving = mouse_event.Leaving(); + bool is_leaving = mouse_event.Leaving() && !m_parent.has_mouse_capture(); // ORCA keep tracking mouse position while drag active and cursor not in window bounds if (mouse_event.Dragging()) { Point mouse_coord(mouse_event.GetX(), mouse_event.GetY()); auto ray = m_parent.mouse_ray(mouse_coord); From 6b5c8af1c8b48c7b75f1c82577ec824453305604 Mon Sep 17 00:00:00 2001 From: Ryan Hartman Date: Sun, 2 Aug 2026 21:03:59 -0600 Subject: [PATCH 043/106] Pin OpenSSL libdir so the bundled Python finds it (#15047) On Linux the bundled CPython silently links the system OpenSSL instead of the one built in deps/, and the dependency build then fails: install: cannot stat 'Modules/_ssl.cpython-312-x86_64-linux-gnu.so': No such file or directory The chain: * OpenSSL's linux-x86_64 target sets multilib=64, so 'make install_sw' installs the static libs to /lib64 while every other dependency in the prefix uses /lib. * CPython's --with-openssl= only ever emits -L/lib. It does not look in lib64, so -lssl resolves to the system OpenSSL. * gcc -shared does not error on unresolved symbols, so the link appears to succeed. _ssl.c was compiled against the bundled 1.1.1w headers, which map SSL_get1_peer_certificate onto the pre-3.0 SSL_get_peer_certificate -- a symbol OpenSSL 3.x removed. The module then fails to import: _ssl failed to import: undefined symbol: SSL_get_peer_certificate Could not build the ssl module! * With no _ssl built, 'make install' cannot stat it and the build stops. Passing --libdir=lib keeps the prefix single-layout, so CPython's -L/lib finds the bundled static libraries and links against the headers it was compiled with. CMake-based dependencies were unaffected throughout, because CMake's FindOpenSSL searches lib64 on its own; only CPython's autoconf path is sensitive to this. Affects any distribution where OpenSSL selects the lib64 layout, which is the Fedora, openSUSE and Arch families. Debian and Ubuntu are unaffected, which is why CI has not seen it. Verified on Arch (GCC 16.1.1, CMake 4.4.2): the dependency build completes and the bundled interpreter reports the bundled OpenSSL rather than the system one: $ deps/build/OrcaSlicer_dep/usr/local/libpython/bin/python3.12 \ -c 'import ssl; print(ssl.OPENSSL_VERSION)' OpenSSL 1.1.1w 11 Sep 2023 Not verified on macOS or Windows. The flag is accepted by OpenSSL's Configure on all platforms and Darwin targets do not set multilib, so it should be a no-op there, but CI is the check. --- deps/OpenSSL/OpenSSL.cmake | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/deps/OpenSSL/OpenSSL.cmake b/deps/OpenSSL/OpenSSL.cmake index 21a49b91b8..e43997265b 100644 --- a/deps/OpenSSL/OpenSSL.cmake +++ b/deps/OpenSSL/OpenSSL.cmake @@ -52,6 +52,14 @@ ExternalProject_Add(dep_OpenSSL CONFIGURE_COMMAND ${_conf_cmd} ${_cross_arch} "--openssldir=${DESTDIR}" "--prefix=${DESTDIR}" + # OpenSSL's linux-x86_64 target sets multilib=64, so it installs to + # /lib64 while every other dep uses /lib. CPython's + # --with-openssl only ever emits -L/lib, so it misses the bundled + # static libs and silently links the system OpenSSL instead -- which, + # against 1.1.1w headers, leaves _ssl.so with an undefined + # SSL_get_peer_certificate (removed in OpenSSL 3.x). Pin libdir so the + # prefix stays single-layout. + "--libdir=lib" ${_cross_comp_prefix_line} no-shared no-asm From 66d3f3f9c3fcd053acf4be4d7cfb8e858b91e674 Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Mon, 3 Aug 2026 18:34:05 +0800 Subject: [PATCH 044/106] imgui: Clamp mouse y-coordinate in multi-line click/drag to text bounds (#15052) * imgui: Clamp mouse y-coordinate in multi-line click/drag to text bounds In single-line mode, click and drag already clamped y to the line's y-coordinate so the cursor would continue to follow the x-position when the mouse went off the top or bottom of the text. Multi-line mode did not clamp, so stb_text_locate_coord() would return 0 (above) or n (below), snapping the cursor to the very start or end of text and ignoring the x-coordinate entirely. Now both modes walk the row layout to compute the top of the first row (y_min) and bottom of the last row (y_max, minus half a line height to add tolerance for rounding), then clamp y to that range before passing it to stb_text_locate_coord(). This means dragging or clicking above the text now places the cursor on the first line at the x-coordinate, and dragging/clicking below places it on the last line at the x-coordinate, matching the single-line precedent. * Fix issue that cursor cannot be placed at the last empty line --- deps_src/imgui/imstb_textedit.h | 95 +++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/deps_src/imgui/imstb_textedit.h b/deps_src/imgui/imstb_textedit.h index 7644670975..3733bb2fa9 100644 --- a/deps_src/imgui/imstb_textedit.h +++ b/deps_src/imgui/imstb_textedit.h @@ -465,6 +465,57 @@ static void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *stat STB_TEXTEDIT_LAYOUTROW(&r, str, 0); y = r.ymin; } + else + { + // In multi-line mode, clamp y to stay within the text vertical bounds. + // This lets the click still land at a valid location if the mouse is slightly + // above or below the text. + StbTexteditRow r; + int n = STB_TEXTEDIT_STRINGLEN(str); + int i = 0; + float base_y = 0, y_min, y_max; + + // Get the first row to establish y_min and start the iteration + STB_TEXTEDIT_LAYOUTROW(&r, str, 0); + if (r.num_chars <= 0) + { + state->cursor = 0; + state->select_start = state->cursor; + state->select_end = state->cursor; + state->has_preferred_x = 0; + return; + } + y_min = r.ymin; + y_max = base_y + r.ymax; + i = r.num_chars; + base_y += r.baseline_y_delta; + + // Walk the remaining rows to find the bottom of the last row + while (i < n) + { + STB_TEXTEDIT_LAYOUTROW(&r, str, i); + if (r.num_chars <= 0) + break; + y_max = base_y + r.ymax; + i += r.num_chars; + base_y += r.baseline_y_delta; + } + + // If the text ends with a newline, account for the empty trailing line + // so the cursor can be placed on it + if (n > 0 && STB_TEXTEDIT_GETCHAR(str, n - 1) == STB_TEXTEDIT_NEWLINE) + { + STB_TEXTEDIT_LAYOUTROW(&r, str, n); + y_max = base_y + r.ymax; + } + + // Subtract half the last line height to avoid rounding issues when the mouse + // is just barely below the last line (keep cursor on the last line, not after the text) + y_max -= (r.ymax - r.ymin) * 0.5f; + + if (y < y_min) y = y_min; + if (y > y_max) y = y_max; + } state->cursor = stb_text_locate_coord(str, x, y); state->select_start = state->cursor; @@ -485,6 +536,50 @@ static void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state STB_TEXTEDIT_LAYOUTROW(&r, str, 0); y = r.ymin; } + else + { + // In multi-line mode, clamp y to stay within the text vertical bounds. + // This lets the drag keep working if the mouse goes off the top or bottom of the text. + StbTexteditRow r; + int n = STB_TEXTEDIT_STRINGLEN(str); + int i = 0; + float base_y = 0, y_min, y_max; + + // Get the first row to establish y_min and start the iteration + STB_TEXTEDIT_LAYOUTROW(&r, str, 0); + if (r.num_chars <= 0) + return; + y_min = r.ymin; + y_max = base_y + r.ymax; + i = r.num_chars; + base_y += r.baseline_y_delta; + + // Walk the remaining rows to find the bottom of the last row + while (i < n) + { + STB_TEXTEDIT_LAYOUTROW(&r, str, i); + if (r.num_chars <= 0) + break; + y_max = base_y + r.ymax; + i += r.num_chars; + base_y += r.baseline_y_delta; + } + + // If the text ends with a newline, account for the empty trailing line + // so the cursor can be placed on it + if (n > 0 && STB_TEXTEDIT_GETCHAR(str, n - 1) == STB_TEXTEDIT_NEWLINE) + { + STB_TEXTEDIT_LAYOUTROW(&r, str, n); + y_max = base_y + r.ymax; + } + + // Subtract half the last line height to avoid rounding issues when the mouse + // is just barely below the last line (keep cursor on the last line, not after the text) + y_max -= (r.ymax - r.ymin) * 0.5f; + + if (y < y_min) y = y_min; + if (y > y_max) y = y_max; + } if (state->select_start == state->select_end) state->select_start = state->cursor; From dbb991bf076e8b83c0b8f33fa03ecf7956b1ff1c Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Mon, 3 Aug 2026 18:34:15 +0800 Subject: [PATCH 045/106] Fix gizmo being closed after releasing mouse outside the gizmo floating window (#15095) * Fix gizmo being closed after releasing mouse outside the gizmo floating window The left up event of a drag started on the gizmo floating window (e.g. selecting text in an input field) and released over the bed was treated as a click on the plate, which deselected the objects and closed the active gizmo. Add the ignore_left_up guard to the plate select branch, matching the deselect branch above. Co-Authored-By: Claude * Fix Emboss gizmo being closed after releasing mouse outside its floating window The Emboss gizmo has its own close-on-click-away handler (on_mouse_change_selection) that was not protected against left up events originating from ImGui windows, so the gizmo was still closed when a drag started on its floating window (e.g. selecting text in the input field) ended over the 3D scene. Expose the canvas's ignore_left_up state to gizmos and skip the close check for such releases. Co-Authored-By: Claude --------- Co-authored-by: Claude --- src/slic3r/GUI/GLCanvas3D.cpp | 4 +++- src/slic3r/GUI/GLCanvas3D.hpp | 4 ++++ src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp | 7 +++++-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index a24c095ad6..110b6697ae 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4756,7 +4756,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) deselect_all(); } //BBS Select plate in this 3D canvas. - else if (evt.LeftUp() && !m_mouse.dragging && m_picking_enabled && !m_hover_plate_idxs.empty() && (m_canvas_type == CanvasView3D) && !is_layers_editing_enabled()) + // The left up may come from an ImGui window (e.g. a drag started on the gizmo floating window and released over the bed), + // in which case it must not be treated as a click on the plate, otherwise the gizmo would be closed (see deselect_all below). + else if (evt.LeftUp() && !m_mouse.ignore_left_up && !m_mouse.dragging && m_picking_enabled && !m_hover_plate_idxs.empty() && (m_canvas_type == CanvasView3D) && !is_layers_editing_enabled()) { int hover_idx = m_hover_plate_idxs.front(); wxGetApp().plater()->select_plate_by_hover_id(hover_idx); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 7bae744098..17497edf16 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -1119,6 +1119,10 @@ public: void set_mouse_as_dragging() { m_mouse.dragging = true; } bool is_mouse_dragging() const { return m_mouse.dragging; } + // True when the current left up event comes from an ImGui window and was not processed by it + // (e.g. a drag that started on a gizmo floating window and was released over the 3D scene). + // Such a release is the end of an ImGui interaction, not a click on the scene. + bool is_mouse_left_up_ignored() const { return m_mouse.ignore_left_up; } double get_size_proportional_to_max_bed_size(double factor) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp index feba37133a..ecf465afe7 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp @@ -566,8 +566,11 @@ bool GLGizmoEmboss::on_mouse_for_translate(const wxMouseEvent &mouse_event) void GLGizmoEmboss::on_mouse_change_selection(const wxMouseEvent &mouse_event) { - static bool was_dragging = true; - if ((mouse_event.LeftUp() || mouse_event.RightUp()) && !was_dragging) { + static bool was_dragging = true; + // The left up may be the end of a drag that started on the gizmo floating window (e.g. selecting + // text in the input field). Such a release is not a click on the scene and must not close the gizmo. + // (The flag is only set for left up events, so right up behavior is unchanged.) + if ((mouse_event.LeftUp() || mouse_event.RightUp()) && !was_dragging && !m_parent.is_mouse_left_up_ignored()) { // is hovered volume closest hovered? int hovered_idx = m_parent.get_first_hover_volume_idx(); if (hovered_idx < 0) From 74c4a7e450a745380108b55a1dc72233a2742f6d Mon Sep 17 00:00:00 2001 From: SoftFever Date: Mon, 3 Aug 2026 22:25:50 +0800 Subject: [PATCH 046/106] Support printer specific filament profiles in the OrcaFilamentLibrary (#15101) * Support printer specific filament profiles in the Orca Filament Library --- scripts/orca_extra_profile_check.py | 10 ++- src/libslic3r/Preset.cpp | 6 +- .../libslic3r/test_preset_bundle_loading.cpp | 66 +++++++++++++++++++ 3 files changed, 77 insertions(+), 5 deletions(-) diff --git a/scripts/orca_extra_profile_check.py b/scripts/orca_extra_profile_check.py index cdfc8544a4..07ce3d69d3 100644 --- a/scripts/orca_extra_profile_check.py +++ b/scripts/orca_extra_profile_check.py @@ -46,12 +46,16 @@ def no_duplicates_object_pairs_hook(pairs): return seen # NOTE: currently Orca expects compatible_printers to be a defined in every instantiation profile, inheritation is not supported in Profile page -def check_filament_compatible_printers(vendor_folder): +def check_filament_compatible_printers(vendor, vendor_folder): """ Checks JSON files in the vendor folder for missing or empty 'compatible_printers' when 'instantiation' is flagged as true. + In the OrcaFilamentLibrary 'compatible_printers' is optional: a profile without it is generic and + offered on every printer, while a profile that lists printers supersedes the generic one there. + Parameters: + vendor (str): The vendor name the folder belongs to. vendor_folder (str or Path): The directory to search for JSON profile files. Returns: @@ -115,7 +119,7 @@ def check_filament_compatible_printers(vendor_folder): for profile in profiles.values(): instantiation = str(profile['content'].get("instantiation", "")).lower() == "true" - if instantiation: + if instantiation and vendor != 'OrcaFilamentLibrary': try: compatible_printers = get_property(profile, "compatible_printers") if not compatible_printers or (isinstance(compatible_printers, list) and not compatible_printers): @@ -571,7 +575,7 @@ def main(): vendor_path = profiles_dir / vendor_name if args.check_filaments or not (args.check_materials and not args.check_filaments): - errors_found += check_filament_compatible_printers(vendor_path / "filament") + errors_found += check_filament_compatible_printers(vendor_name, vendor_path / "filament") if args.check_materials: new_errors, new_warnings = check_machine_default_materials(profiles_dir, vendor_name) diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 2821bef0af..d5bf251d37 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -3784,12 +3784,14 @@ void PresetCollection::update_library_profile_excluded_from() } // Check all presets that has the same alias as the filament presets with empty compatible_printers in Orca Filament Library. + // A printer specific profile supersedes the generic one, no matter whether it lives in a vendor bundle or in the + // library itself. for (const Preset& preset : m_presets) { - if (preset.vendor == nullptr || preset.vendor->name == PresetBundle::ORCA_FILAMENT_LIBRARY) + if (preset.vendor == nullptr) continue; const auto* compatible_printers = dynamic_cast(preset.config.option("compatible_printers")); - // All profiles in concrete vendor profile shouldn't have empty compatible_printers, but here we check it for safety. + // Profiles with empty compatible_printers are the generic ones, they never supersede anything. if (compatible_printers == nullptr || compatible_printers->values.empty()) continue; auto itr = excluded_froms.find(preset.alias); diff --git a/tests/libslic3r/test_preset_bundle_loading.cpp b/tests/libslic3r/test_preset_bundle_loading.cpp index 351535dd9d..c697c4461c 100644 --- a/tests/libslic3r/test_preset_bundle_loading.cpp +++ b/tests/libslic3r/test_preset_bundle_loading.cpp @@ -488,3 +488,69 @@ TEST_CASE("Plugin capability override keys are scoped per preset type", "[Preset } } +namespace { + +// A standalone filament collection that exposes the protected library masking builder, so the Orca +// Filament Library scenario can be set up without the full system-profile load pipeline. +struct LibraryFilamentTestCollection : public PresetCollection +{ + LibraryFilamentTestCollection() + : PresetCollection(Preset::TYPE_FILAMENT, Preset::filament_options(), + static_cast(FullPrintConfig::defaults())) + {} + using PresetCollection::update_library_profile_excluded_from; +}; + +} // namespace + +// Orca: a filament in the Orca Filament Library that names its compatible printers has to hide the generic +// library filament sharing its alias, the same way a vendor owned filament does. Otherwise both are compatible +// with that printer and the plater combo box lists the shared alias twice. +TEST_CASE("A printer specific filament supersedes the generic library filament with the same alias", "[Preset][Bundle]") +{ + LibraryFilamentTestCollection filaments; + PresetCollection printers(Preset::TYPE_PRINTER, Preset::printer_options(), + static_cast(FullPrintConfig::defaults())); + // The masking keys off the vendor name, which VendorProfile's constructor does not derive from the id. + VendorProfile library(PresetBundle::ORCA_FILAMENT_LIBRARY); + VendorProfile vendor("Vendor"); + library.name = PresetBundle::ORCA_FILAMENT_LIBRARY; + vendor.name = "Vendor"; + + auto add_filament = [&filaments](const VendorProfile &owner, const std::string &name, std::vector compatible_printers) { + Preset &preset = add_inmemory_preset(filaments, name); + preset.alias = "Generic ABS"; + preset.vendor = &owner; + preset.config.option("compatible_printers", true)->values = std::move(compatible_printers); + }; + + add_filament(library, "Generic ABS @System", {}); + add_filament(library, "Generic ABS @Printer A", { "Printer A" }); + add_filament(vendor, "Generic ABS @Printer B", { "Printer B" }); + + filaments.update_library_profile_excluded_from(); + + const Preset *generic = filaments.find_preset("Generic ABS @System"); + REQUIRE(generic != nullptr); + CHECK(generic->m_excluded_from.count("Printer A") == 1); + CHECK(generic->m_excluded_from.count("Printer B") == 1); + CHECK(generic->m_excluded_from.size() == 2); + + // A printer specific profile names printers, so it is never the one being hidden - not even by itself. + const Preset *specific = filaments.find_preset("Generic ABS @Printer A"); + REQUIRE(specific != nullptr); + CHECK(specific->m_excluded_from.empty()); + + // ...and the generic profile really drops out of the compatible set on the printer it is hidden from. + add_inmemory_preset(printers, "Printer A"); + add_inmemory_preset(printers, "Printer C"); + const Preset *printer_a = printers.find_preset("Printer A"); + const Preset *printer_c = printers.find_preset("Printer C"); + REQUIRE(printer_a != nullptr); + REQUIRE(printer_c != nullptr); + + const PresetWithVendorProfile generic_lib(*generic, &library); + CHECK_FALSE(is_compatible_with_printer(generic_lib, PresetWithVendorProfile(*printer_a, nullptr))); + CHECK(is_compatible_with_printer(generic_lib, PresetWithVendorProfile(*printer_c, nullptr))); +} + From 06ef58bad8cbe7b6f9ee930372001e20dc24c156 Mon Sep 17 00:00:00 2001 From: Kris Austin Date: Mon, 3 Aug 2026 09:29:00 -0500 Subject: [PATCH 047/106] test: replace the disabled convex_hull_2d test (#14892) test(libslic3r): replace the disabled convex_hull_2d test, closing #11269 The last "failing libslic3r test" from #11269 was the disabled SCENARIO("2D convex hull of sinking object", "[3mf][.]") in test_3mf.cpp. It checked ModelObject::convex_hull_2d for a sinking object against PrusaSlicer's reference hull, but Orca's convex_hull_2d does not clip geometry below the bed the way PrusaSlicer's its_convex_hull_2d_above does, so the reference never matched. The test also wrote a debug mesh to a hardcoded /tmp path and its comparison loop was inverted. Remove it and add tests/libslic3r/test_model.cpp characterizing convex_hull_2d on non-sinking transforms (identity and scale+offset), where the projected footprint is unambiguous. Homed in a Model test file since it exercises ModelObject, not 3MF. --- tests/libslic3r/CMakeLists.txt | 1 + tests/libslic3r/test_3mf.cpp | 61 ---------------------------------- tests/libslic3r/test_model.cpp | 40 ++++++++++++++++++++++ 3 files changed, 41 insertions(+), 61 deletions(-) create mode 100644 tests/libslic3r/test_model.cpp diff --git a/tests/libslic3r/CMakeLists.txt b/tests/libslic3r/CMakeLists.txt index dbc6c99f15..1ad299473c 100644 --- a/tests/libslic3r/CMakeLists.txt +++ b/tests/libslic3r/CMakeLists.txt @@ -29,6 +29,7 @@ add_executable(${_TEST_NAME}_tests test_stl.cpp test_meshboolean.cpp test_marchingsquares.cpp + test_model.cpp test_utils.cpp test_timeutils.cpp test_voronoi.cpp diff --git a/tests/libslic3r/test_3mf.cpp b/tests/libslic3r/test_3mf.cpp index 1a082cd8e0..a6fe3ed460 100644 --- a/tests/libslic3r/test_3mf.cpp +++ b/tests/libslic3r/test_3mf.cpp @@ -509,64 +509,3 @@ SCENARIO("Nozzle-group metadata .3mf round-trip", "[3mf][MultiNozzle]") { boost::filesystem::remove_all(backup_dir); } } - -SCENARIO("2D convex hull of sinking object", "[3mf][.]") { - GIVEN("model") { - // load a model - Model model; - std::string src_file = std::string(TEST_DATA_DIR) + "/test_3mf/Prusa.stl"; - REQUIRE(load_stl(src_file.c_str(), &model)); - model.add_default_instances(); - - WHEN("model is rotated, scaled and set as sinking") { - ModelObject* object = model.objects[0]; - object->center_around_origin(false); - - // This outputs the same exact data as the Prusaslicer test - write_debug_stl("3mf/orca.ascii", object->volumes[0]->mesh()); - - // set instance's attitude so that it is rotated, scaled (and sinking? how is it sinking? the rotation? does it matter if it's sinking?) - ModelInstance* instance = object->instances[0]; - instance->set_rotation(X, -M_PI / 4.0); - instance->set_offset(Vec3d::Zero()); - instance->set_scaling_factor({ 2.0, 2.0, 2.0 }); - - // calculate 2D convex hull - auto trafo = instance->get_transformation().get_matrix(); - - // This matrix is the same exact matrix as the Prusaslicer test - CAPTURE(trafo); - Polygon hull_2d = object->convex_hull_2d(trafo); - - // But we get different hull_2d.points here (and somehow decimal numbers despite being int64_t values, but that's probabaly printing configuration somewhere -- Prusaslicer's prints out with newlines between the X&Y and not one between coordinates, which is about the worse possible output). - // I think it's something to do with PrusaSlicer ignoring everything under the Z plane, which makes sense from the results. - // See the comments added to ModelObject::convex_hull_2d for more information. - - // verify result - Points result = { - { -91501496, -15914144 }, - { 91501496, -15914144 }, - { 91501496, 4243 }, - { 78229680, 4246883 }, - { 56898100, 4246883 }, - { -85501496, 4242641 }, - { -91501496, 4243 } - }; - - THEN("2D convex hull should match with reference") { - // Allow 1um error due to floating point rounding. - bool res = hull_2d.points.size() == result.size(); - if (res) { - for (size_t i = 0; i < result.size(); ++ i) { - const Point &p1 = result[i]; - const Point &p2 = hull_2d.points[i]; - CHECK((std::abs(p1.x() - p2.x()) > 1 || std::abs(p1.y() - p2.y()) > 1)); - } - } - - CAPTURE(hull_2d.points); - REQUIRE(res); - } - } - } -} diff --git a/tests/libslic3r/test_model.cpp b/tests/libslic3r/test_model.cpp new file mode 100644 index 0000000000..3a580e3be2 --- /dev/null +++ b/tests/libslic3r/test_model.cpp @@ -0,0 +1,40 @@ +#include + +#include "libslic3r/Model.hpp" + +using namespace Slic3r; + +// convex_hull_2d does not clip geometry below the bed, so these cases avoid +// sinking transforms. +TEST_CASE("A part's 2D convex hull is its footprint projected onto the bed", "[Model]") +{ + Model model; + ModelObject* object = model.add_object(); + // Keep the cube's raw coordinates ([0,20] on every axis): the default + // add_volume re-centers the geometry, which would move the footprint. + object->add_volume(make_cube(20, 20, 20), ModelVolumeType::MODEL_PART, false); + + SECTION("identity transform yields the 20 mm square") { + const Polygon hull = object->convex_hull_2d(Geometry::Transformation{}.get_matrix()); + const BoundingBox bb = hull.bounding_box(); + CHECK(hull.size() == 4); + CHECK(bb.min.x() == scaled(0.)); + CHECK(bb.min.y() == scaled(0.)); + CHECK(bb.max.x() == scaled(20.)); + CHECK(bb.max.y() == scaled(20.)); + } + + SECTION("scaling and offset move and grow the footprint") { + Geometry::Transformation t; + t.set_scaling_factor({2, 2, 2}); // cube now spans [0,40] + t.set_offset({10, 5, 0}); // then shift +10 in X, +5 in Y + + const Polygon hull = object->convex_hull_2d(t.get_matrix()); + const BoundingBox bb = hull.bounding_box(); + CHECK(hull.size() == 4); + CHECK(bb.min.x() == scaled(10.)); + CHECK(bb.min.y() == scaled(5.)); + CHECK(bb.max.x() == scaled(50.)); + CHECK(bb.max.y() == scaled(45.)); + } +} From 7b404596e9eebef6c0595052604da5cc4f669139 Mon Sep 17 00:00:00 2001 From: "Mikhail f. Shiryaev" Date: Mon, 3 Aug 2026 20:10:01 +0200 Subject: [PATCH 048/106] Add `Skip G-code config block` to exclude the config comments from G-code files (#12455) Add feature to skip CONFIG_BLOCK in G-code files --- src/libslic3r/GCode.cpp | 37 ++++++++++++++++++---------------- src/libslic3r/Preset.cpp | 2 +- src/libslic3r/PrintConfig.cpp | 11 +++++++++- src/libslic3r/PrintConfig.hpp | 2 +- src/slic3r/GUI/Tab.cpp | 1 + tests/fff_print/test_print.cpp | 16 +++++++++++++++ 6 files changed, 49 insertions(+), 20 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index f5db2e8349..ff2384a0a4 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -2884,6 +2884,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato DoExport::init_gcode_processor(print.config(), m_processor, m_silent_time_estimator_enabled, print.get_layered_nozzle_group_result()); const bool is_bbl_printers = print.is_BBL_printer(); + const bool skip_config_block = print.config().gcode_skip_config_block; const WipeTowerType wipe_tower_type = print.wipe_tower_type(); m_calib_config.clear(); // resets analyzer's tracking data @@ -3059,7 +3060,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato // as configuration key / value pairs to be parsable by older versions of // PrusaSlicer G-code viewer. { - if (is_bbl_printers) { + if (is_bbl_printers && !skip_config_block) { file.write("; CONFIG_BLOCK_START\n"); std::string full_config; append_full_config(print, full_config); @@ -4086,23 +4087,25 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato GCodeProcessor::ETags::Estimated_Printing_Time_Placeholder) .c_str()); file.write("\n"); - file.write("; CONFIG_BLOCK_START\n"); - std::string full_config; - append_full_config(print, full_config); - if (!full_config.empty()) - file.write(full_config); + if (!skip_config_block) { + file.write("; CONFIG_BLOCK_START\n"); + std::string full_config; + append_full_config(print, full_config); + if (!full_config.empty()) + file.write(full_config); - // SoftFever: write compatiple info - int first_layer_bed_temperature = get_bed_temperature(0, true, print.config().curr_bed_type); - file.write_format("; first_layer_bed_temperature = %d\n", first_layer_bed_temperature); - file.write_format("; bed_shape = %s\n", print.full_print_config().opt_serialize("printable_area").c_str()); - file.write_format("; first_layer_temperature = %d\n", print.config().nozzle_temperature_initial_layer.get_at(0)); - file.write_format("; first_layer_height = %.3f\n", print.config().initial_layer_print_height.value); - - //SF TODO -// file.write_format("; variable_layer_height = %d\n", print.ad.adaptive_layer_height ? 1 : 0); - - file.write("; CONFIG_BLOCK_END\n\n"); + // SoftFever: write compatiple info + int first_layer_bed_temperature = get_bed_temperature(0, true, print.config().curr_bed_type); + file.write_format("; first_layer_bed_temperature = %d\n", first_layer_bed_temperature); + file.write_format("; bed_shape = %s\n", print.full_print_config().opt_serialize("printable_area").c_str()); + file.write_format("; first_layer_temperature = %d\n", print.config().nozzle_temperature_initial_layer.get_at(0)); + file.write_format("; first_layer_height = %.3f\n", print.config().initial_layer_print_height.value); + + //SF TODO +// file.write_format("; variable_layer_height = %d\n", print.ad.adaptive_layer_height ? 1 : 0); + + file.write("; CONFIG_BLOCK_END\n\n"); + } // !skip_config_block } file.write("\n"); diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index d5bf251d37..2e33a36c83 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -1404,7 +1404,7 @@ static std::vector s_Preset_machine_limits_options { static std::vector s_Preset_printer_options { "printer_technology", "printable_area", "extruder_printable_area", "support_parallel_printheads", "parallel_printheads_count", "parallel_printheads_bed_exclude_areas", "bed_exclude_area","bed_custom_texture", "bed_custom_model", "gcode_flavor", - "fan_kickstart", "part_cooling_fan_min_pwm", "fan_speedup_time", "fan_speedup_overhangs", + "gcode_skip_config_block", "fan_kickstart", "part_cooling_fan_min_pwm", "fan_speedup_time", "fan_speedup_overhangs", "single_extruder_multi_material", "manual_filament_change", "file_start_gcode", "machine_start_gcode", "machine_end_gcode", "before_layer_change_gcode", "printing_by_object_gcode", "layer_change_gcode", "time_lapse_gcode", "wrapping_detection_gcode", "change_filament_gcode", "change_extrusion_role_gcode", "printer_model", "printer_variant", "printer_extruder_id", "printer_extruder_variant", "extruder_variant_list", "default_nozzle_volume_type", "printable_height", "extruder_printable_height", "extruder_clearance_radius", "extruder_clearance_height_to_lid", "extruder_clearance_height_to_rod", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index cc991f91cc..ada05c4e9f 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -4259,6 +4259,15 @@ void PrintConfigDef::init_fff_params() def->readonly = false; def->set_default_value(new ConfigOptionEnum(gcfMarlinLegacy)); + def = this->add("gcode_skip_config_block", coBool); + def->label = L("Skip G-code config block"); + def->tooltip = L("Do not write the CONFIG_BLOCK (slicer configuration key/value pairs) into the G-code file. " + "This can help with printers whose firmware crashes when parsing these comment lines " + "(e.g. Anycubic go-klipper). Note: the G-code file will no longer contain slicer settings, " + "so importing it back into OrcaSlicer will not restore the configuration."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(false)); + def = this->add("pellet_modded_printer", coBool); def->label = L("Pellet Modded Printer"); def->tooltip = L("Enable this option if your printer uses pellets instead of filaments."); @@ -4292,7 +4301,7 @@ void PrintConfigDef::init_fff_params() "slow down."); def->mode = comAdvanced; def->set_default_value(new ConfigOptionBool(0)); - + //BBS def = this->add("infill_combination", coBool); def->label = L("Infill combination"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 90aa1adb3d..c1875e0288 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1547,7 +1547,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionBool, gcode_add_line_number)) ((ConfigOptionBool, bbl_bed_temperature_gcode)) ((ConfigOptionEnum, gcode_flavor)) - + ((ConfigOptionBool, gcode_skip_config_block)) ((ConfigOptionFloat, time_cost)) ((ConfigOptionString, layer_change_gcode)) ((ConfigOptionString, time_lapse_gcode)) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index c8fa524ca5..c436d70a15 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -5016,6 +5016,7 @@ void TabPrinter::build_fff() optgroup->append_single_option_line("printer_structure", "printer_basic_information_advanced#printer-structure"); optgroup->append_single_option_line("gcode_flavor", "printer_basic_information_advanced#g-code-flavor"); + optgroup->append_single_option_line("gcode_skip_config_block", "printer_basic_information_advanced#skip-g-code-config-block"); optgroup->append_single_option_line("pellet_modded_printer", "printer_basic_information_advanced#pellet-modded-printer"); optgroup->append_single_option_line("bbl_use_printhost", "printer_basic_information_advanced#use-3rd-party-print-host"); optgroup->append_single_option_line("use_3mf"); diff --git a/tests/fff_print/test_print.cpp b/tests/fff_print/test_print.cpp index 9cb085f78b..6bff945fc3 100644 --- a/tests/fff_print/test_print.cpp +++ b/tests/fff_print/test_print.cpp @@ -338,6 +338,22 @@ TEST_CASE("G-code lists the resolved extrusion-width settings", "[Print]") CHECK(with_first_layer.find("; first layer extrusion width") != std::string::npos); } +// gcode_skip_config_block suppresses the resolved-settings block while leaving the +// header and executable blocks intact. +TEST_CASE("gcode_skip_config_block omits the resolved-settings comment block", "[Print]") +{ + const std::string gcode = slice({ cube(20) }, { + { "gcode_skip_config_block", true }, + { "gcode_comments", true }, + }); + CHECK(gcode.find("; CONFIG_BLOCK_START") == std::string::npos); + CHECK(gcode.find("; CONFIG_BLOCK_END") == std::string::npos); + CHECK(gcode.find("; layer_height =") == std::string::npos); + CHECK(gcode.find("; fill_density =") == std::string::npos); + CHECK(gcode.find("; HEADER_BLOCK_START") != std::string::npos); + CHECK(gcode.find("; EXECUTABLE_BLOCK_START") != std::string::npos); +} + // Custom G-code templates substitute placeholders during export. TEST_CASE("Custom G-code placeholders are substituted", "[Print]") { From ca7fbfb00751e403817dcbff5286550a5ce98efd Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Tue, 4 Aug 2026 00:02:48 +0300 Subject: [PATCH 049/106] Fix missing overhang wall when no partial counterbore bridge is generated (#15100) --- src/libslic3r/PerimeterGenerator.cpp | 29 ++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index ad4d615807..2d6c993d78 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -1977,7 +1977,7 @@ void PerimeterGenerator::process_no_bridge(Surfaces& all_surfaces, coord_t perim ExPolygons unsupported = diff_ex(last, *this->lower_slices, ApplySafetyOffset::Yes); if (!unsupported.empty()) { //remove small overhangs - ExPolygons unsupported_filtered = offset2_ex(unsupported, double(-perimeter_spacing), double(perimeter_spacing)); + ExPolygons unsupported_filtered = opening_ex(unsupported, perimeter_spacing); if (!unsupported_filtered.empty()) { //to_draw.insert(to_draw.end(), last.begin(), last.end()); @@ -2090,35 +2090,40 @@ void PerimeterGenerator::process_no_bridge(Surfaces& all_surfaces, coord_t perim //TODO: add other polys as holes inside this one (-margin) } else { // if(this->config->counterbore_hole_bridging.value == chbBridges) // Orca: Partial counterbore bridging is mask-based. Preserve the supported - // remainder (`last`) and use simplified BridgeDetector coverage to derive the + // remainder and use simplified BridgeDetector coverage to derive the // bridgeable counterbore span. The span is grown from supported material, - // shrunk back, stripped from `last`, and expanded back. It is then prevented - // from intruding deeper into `last` than the explicit anchor overlap. - // Finally, add the allowed anchor band from `last` then remove the + // shrunk back, stripped from the remaining normal surface, and expanded back. + // It is then prevented from intruding deeper into it than the explicit anchor overlap. + // Finally, add the allowed anchor band from it then remove the // narrow hole-side wall contact, which must remain unbridgeable. - last = diff_ex(last, unsupported_filtered, ApplySafetyOffset::Yes); + const ExPolygons remaining = diff_ex(last, unsupported_filtered, ApplySafetyOffset::Yes); ExPolygons bridgeable_filtered; + for (ExPolygon& poly : bridgeable) { poly.simplify(perimeter_spacing, &bridgeable_filtered); } bridgeable_filtered = opening_ex(bridgeable_filtered, ext_perimeter_width); // Get rid of coarseness of the resulted bridgeable area by using the original supported area as reference. - // This is to avoid keeping tiny bridgeable areas that are far from the supported area, or protrude into it. - bridgeable_filtered = union_ex(offset_ex(last, perimeter_spacing), bridgeable_filtered); + // This is to avoid keeping tiny bridgeable areas that are far from the supported area, or protrude into it. + bridgeable_filtered = union_ex(offset_ex(remaining, perimeter_spacing), bridgeable_filtered); bridgeable_filtered = offset_ex(bridgeable_filtered, -perimeter_spacing); - bridgeable_filtered = diff_ex(bridgeable_filtered, last, ApplySafetyOffset::Yes); + bridgeable_filtered = diff_ex(bridgeable_filtered, remaining, ApplySafetyOffset::Yes); bridgeable_filtered = opening_ex(bridgeable_filtered, perimeter_spacing); // filter noise from the diff_ex bridgeable_filtered = offset_ex(bridgeable_filtered, perimeter_spacing); // restore the size to the original bridgeable area // Safety measure: Keep the bridge mask from intruding deeper into the - // supported anchor region (`last`) than the explicit anchor overlap. - bridgeable_filtered = diff_ex(bridgeable_filtered, offset_ex(last, -bridge_anchor_offset)); + // supported anchor region than the explicit anchor overlap. + bridgeable_filtered = diff_ex(bridgeable_filtered, offset_ex(remaining, -bridge_anchor_offset)); - ExPolygons bridge_anchor_areas = intersection_ex(last, offset_ex(unsupported_filtered, bridge_anchor_offset)); + ExPolygons bridge_anchor_areas = intersection_ex(remaining, offset_ex(unsupported_filtered, bridge_anchor_offset)); unsupported_filtered = union_ex(bridgeable_filtered, bridge_anchor_areas); // add bridge anchor unsupported_filtered = opening_ex(unsupported_filtered, bridge_anchor_offset); // remove anchor area from hole-side walls, it must remain unbridgeable + + // update 'last' only if we have a valid bridgeable area, otherwise we will lose the original unsupported area + if (!unsupported_filtered.empty()) + last = remaining; // TODO: Fix the case with thin outer walls around the bridge (1~2 walls) where classic wall // might generate two walls in a tiny space or non at all if "Detect thin walls" is not activated } From 40eab797c6a60a5949c0f92d00798da414c4b44a Mon Sep 17 00:00:00 2001 From: yw4z Date: Tue, 4 Aug 2026 03:45:31 +0300 Subject: [PATCH 050/106] match em_unit value for on_dpi_change for linux (#15043) * Update GUI_Utils.hpp * Update GUI_Utils.hpp --- src/slic3r/GUI/GUI_Utils.hpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/slic3r/GUI/GUI_Utils.hpp b/src/slic3r/GUI/GUI_Utils.hpp index 890e8b9e1c..c93c40b066 100644 --- a/src/slic3r/GUI/GUI_Utils.hpp +++ b/src/slic3r/GUI/GUI_Utils.hpp @@ -113,14 +113,7 @@ public: update_dark_ui(this); #endif - // Linux specific issue : get_dpi_for_window(this) still doesn't responce to the Display's scale in new wxWidgets(3.1.3). - // So, calculate the m_em_unit value from the font size, as before -#if !defined(__WXGTK__) - m_em_unit = std::max(10, 10.0f * m_scale_factor); -#else - // initialize default width_unit according to the width of the one symbol ("m") of the currently active font of this window. - m_em_unit = std::max(10, this->GetTextExtent("m").x - 1); -#endif // __WXGTK__ + update_em_unit(); // recalc_font(); @@ -235,6 +228,19 @@ private: // m_em_unit = metrics.averageWidth; // } + // update em_unit value for new window font + void update_em_unit() + { + // Linux specific issue : get_dpi_for_window(this) still doesn't responce to the Display's scale in new wxWidgets(3.1.3). + // So, calculate the m_em_unit value from the font size, as before +#if !defined(__WXGTK__) + m_em_unit = std::max(10, 10.0f * m_scale_factor); +#else + // initialize default width_unit according to the width of the one symbol ("m") of the currently active font of this window. + m_em_unit = std::max(10, this->GetTextExtent("m").x - 1); +#endif // __WXGTK__ + } + // check if new scale is differ from previous bool is_new_scale_factor() const { return fabs(m_scale_factor - m_prev_scale_factor) > 0.001; } @@ -247,8 +253,7 @@ private: // set normal application font as a current window font m_normal_font = this->GetFont(); - // update em_unit value for new window font - m_em_unit = std::max(10, 10.0f * m_scale_factor); + update_em_unit(); // rescale missed controls sizes and images on_dpi_changed(suggested_rect); From 16c44940d25757143cf75b6975cb06d3d3dd2242 Mon Sep 17 00:00:00 2001 From: Ian Chua Date: Tue, 4 Aug 2026 14:30:59 +0800 Subject: [PATCH 051/106] Add developer flag for printer agents --- src/libslic3r/AppConfig.cpp | 6 ++++++ src/slic3r/GUI/Preferences.cpp | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 159d9bbeda..1b170bf884 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -626,6 +626,12 @@ void AppConfig::set_defaults() set_bool("window_buttons_on_left", false); #endif + if (get("use_printer_agents").empty()) + { + // false = legacy behavior using print hosts + set_bool("use_printer_agents", false); + } + // Remove legacy window positions/sizes erase("app", "main_frame_maximized"); erase("app", "main_frame_pos"); diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index 6bcc00848b..1a3c6fd26a 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -2101,6 +2101,12 @@ void PreferencesDialog::create_items() auto item_show_unsupported = create_item_checkbox(_L("Show unsupported presets"), _L("Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."), "show_unsupported_presets"); g_sizer->Add(item_show_unsupported); + auto item_plugin_printer_agents = create_item_checkbox( + _L("(Experimental) Use printer agents instead of print hosts"), _L( + "Route print jobs for non-Bambu printers through printer plug-in agents instead of the classic print-host upload flow.\nWhen disabled, OrcaSlicer uses the legacy print-host behavior."), + "use_printer_agents"); + g_sizer->Add(item_plugin_printer_agents); + //// DEVELOPER > Experimental Features g_sizer->Add(create_item_title(_L("Experimental Features")), 1, wxEXPAND); From 501af81ba9fa29aa74c7d5d7e16e7d2217677f8c Mon Sep 17 00:00:00 2001 From: Andrew <159703254+andrewsoonqn@users.noreply.github.com> Date: Thu, 16 Jul 2026 16:21:05 +0800 Subject: [PATCH 052/106] Replace fake-enum printer agent dropdown (#121) A dedicated PrinterAgentChoice field reads rows straight from the live agent registry and stores the agent id string, replacing the fake-coEnum index mapping. The field moves to TabPrinter and registers with the searcher so UnsavedChanges renders it; the PhysicalPrinterDialog copy and its update hook are removed (#125). switch_printer_agent now resolves ids via resolve_printer_agent_id. --- src/libslic3r/Config.hpp | 2 + src/slic3r/GUI/Field.cpp | 268 +++++++++++++++-------- src/slic3r/GUI/Field.hpp | 38 ++++ src/slic3r/GUI/GUI_App.cpp | 23 +- src/slic3r/GUI/GUI_App.hpp | 7 +- src/slic3r/GUI/OptionsGroup.cpp | 26 +++ src/slic3r/GUI/PhysicalPrinterDialog.cpp | 88 +------- src/slic3r/GUI/PhysicalPrinterDialog.hpp | 1 - src/slic3r/GUI/Tab.cpp | 55 +++++ 9 files changed, 312 insertions(+), 196 deletions(-) diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index 6f4117d249..509095cbfc 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -2273,6 +2273,8 @@ public: plugin_picker, // Raw JSON string value, edited through a dialog behind a button rather than in the row. plugin_config, + // PrinterAgentChoice + printer_agent_select, }; // Identifier of this option. It is stored here so that it is accessible through the by_serialization_key_ordinal map. diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index 1fcaef1b52..8d05de13a4 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -35,6 +35,7 @@ #include "Widgets/TextCtrl.h" #include "../Utils/ColorSpaceConvert.hpp" +#include "../Utils/NetworkAgentFactory.hpp" #ifdef __WXOSX__ #define wxOSX true #else @@ -1403,39 +1404,6 @@ using choice_ctrl = ::ComboBox; // BBS static std::map dynamic_lists; -static bool is_plugin_printer_agent_key(const std::string& value) -{ - return value.rfind("plugin:", 0) == 0; -} - -static int printer_agent_item_for_enum_index(const choice_ctrl* field, int enum_index) -{ - if (!field) - return -1; - - const unsigned int count = field->GetCount(); - for (unsigned int idx = 0; idx < count; ++idx) { - if (void* data = field->GetClientData(idx)) { - const int stored = static_cast(reinterpret_cast(data)) - 1; - if (stored == enum_index) - return static_cast(idx); - } - } - - return -1; -} - -static int printer_agent_enum_index_for_item(const choice_ctrl* field, int item_index, int fallback) -{ - if (!field || item_index < 0) - return fallback; - - if (void* data = field->GetClientData(item_index)) - return static_cast(reinterpret_cast(data)) - 1; - - return fallback; -} - void Choice::register_dynamic_list(std::string const &optname, DynamicList *list) { dynamic_lists.emplace(optname, list); } void DynamicList::update() @@ -1518,33 +1486,7 @@ void Choice::BUILD() window = dynamic_cast(temp); if (! m_opt.enum_labels.empty() || ! m_opt.enum_values.empty()) { - if (m_opt_id == "printer_agent") { - const bool has_builtin_agents = std::any_of(m_opt.enum_values.begin(), m_opt.enum_values.end(), - [](const std::string& value) { return !is_plugin_printer_agent_key(value); }); - const bool has_plugin_agents = std::any_of(m_opt.enum_values.begin(), m_opt.enum_values.end(), - [](const std::string& value) { return is_plugin_printer_agent_key(value); }); - - auto append_agent_rows = [this, temp](bool plugins) { - for (size_t i = 0; i < m_opt.enum_values.size(); ++i) { - const bool is_plugin = is_plugin_printer_agent_key(m_opt.enum_values[i]); - if (is_plugin != plugins) - continue; - - const wxString label = i < m_opt.enum_labels.size() ? _(m_opt.enum_labels[i]) : wxString(m_opt.enum_values[i]); - const int item = temp->Append(label); - temp->SetClientData(item, reinterpret_cast(static_cast(i + 1))); - } - }; - - if (has_builtin_agents) { - temp->Append(_L("System agents"), wxNullBitmap, DD_ITEM_STYLE_SPLIT_ITEM | DD_ITEM_STYLE_DISABLED); - append_agent_rows(false); - } - if (has_plugin_agents) { - temp->Append(_L("Plugins"), wxNullBitmap, DD_ITEM_STYLE_SPLIT_ITEM | DD_ITEM_STYLE_DISABLED); - append_agent_rows(true); - } - } else if (m_opt.enum_labels.empty()) { + if (m_opt.enum_labels.empty()) { // Append non-localized enum_values for (auto el : m_opt.enum_values) temp->Append(el); @@ -1651,7 +1593,7 @@ void Choice::set_selection() switch (m_opt.type) { case coEnum:{ const int val = m_opt.default_value->getInt(); - field->SetSelection(m_opt_id == "printer_agent" ? printer_agent_item_for_enum_index(field, val) : val); + field->SetSelection(val); break; } case coFloat: @@ -1701,12 +1643,7 @@ void Choice::set_value(const std::string& value, bool change_event) //! Redunda } choice_ctrl* field = dynamic_cast(window); - if (m_opt_id == "printer_agent") { - const int enum_index = idx == m_opt.enum_values.size() ? - (m_opt.default_value ? m_opt.default_value->getInt() : 0) : - static_cast(idx); - field->SetSelection(printer_agent_item_for_enum_index(field, enum_index)); - } else if (idx == m_opt.enum_values.size()) + if (idx == m_opt.enum_values.size()) field->SetValue(value); else field->SetSelection(idx); @@ -1772,33 +1709,11 @@ void Choice::set_value(const boost::any& value, bool change_event) case coEnum: // BBS case coEnums: { - auto printer_agent_index_from_key = [this](const std::string& key) { - auto it = std::find(m_opt.enum_values.begin(), m_opt.enum_values.end(), key); - if (it != m_opt.enum_values.end()) - return static_cast(it - m_opt.enum_values.begin()); - return m_opt.default_value ? m_opt.default_value->getInt() : 0; - }; - - int val = 0; - if (m_opt_id == "printer_agent") { - if (const int* int_value = boost::any_cast(&value)) - val = *int_value; - else if (const wxString* wx_value = boost::any_cast(&value)) - val = printer_agent_index_from_key(into_u8(*wx_value)); - else if (const std::string* string_value = boost::any_cast(&value)) - val = printer_agent_index_from_key(*string_value); - else { - m_disable_change_event = false; - return; - } - } else - val = boost::any_cast(value); + int val = boost::any_cast(value); int selection = val; - if (m_opt_id == "printer_agent") { - selection = printer_agent_item_for_enum_index(field, val); - } else if (m_opt_id == "input_shaping_type") { + if (m_opt_id == "input_shaping_type") { if (field != nullptr) { const unsigned int count = field->GetCount(); int match_index = -1; @@ -1920,12 +1835,6 @@ boost::any& Choice::get_value() { if (m_opt.nullable && field->GetSelection() == -1) m_value = ConfigOptionEnumsGenericNullable::nil_value(); - else if (m_opt_id == "printer_agent") - { - const int selection = field->GetSelection(); - const int fallback = m_opt.default_value ? m_opt.default_value->getInt() : 0; - m_value = printer_agent_enum_index_for_item(field, selection, fallback); - } else if (m_opt_id == "input_shaping_type") { int selection = field->GetSelection(); @@ -2067,6 +1976,171 @@ void Choice::msw_rescale() } +// PrinterAgentChoice + +void PrinterAgentChoice::reload_rows() +{ + auto* combo = dynamic_cast(window); // wxWidgets ComboBox + if (!combo) + return; + + // clear ComboBox + combo->Clear(); + + // helpers + const auto agents = NetworkAgentFactory::get_registered_printer_agents(); + const bool has_builtin_agents = std::any_of(agents.begin(), agents.end(), + [](const PrinterAgentInfo& a) { return !a.is_plugin(); }); + const bool has_plugin_agents = std::any_of(agents.begin(), agents.end(), + [](const PrinterAgentInfo& a) { return a.is_plugin(); }); + + auto append_agent_rows = [combo](bool is_plugin) + { + const auto agents = NetworkAgentFactory::get_registered_printer_agents(); + for (size_t i = 0; i < agents.size(); ++i) + { + if (agents[i].is_plugin() != is_plugin) + continue; + const int item = combo->Append(_(agents[i].display_name)); + // why: carry the agent-id string on the row. alias is an owned wxString (auto-freed, never rendered) + combo->SetItemAlias(item, from_u8(agents[i].id)); + } + }; + + // append rows + if (has_builtin_agents) + { + combo->Append(_L("System agents"), wxNullBitmap, DD_ITEM_STYLE_SPLIT_ITEM | DD_ITEM_STYLE_DISABLED); + append_agent_rows(false); // append rows for agents that are not plugins + } + if (has_plugin_agents) + { + combo->Append(_L("Plugins"), wxNullBitmap, DD_ITEM_STYLE_SPLIT_ITEM | DD_ITEM_STYLE_DISABLED); + append_agent_rows(true); // append rows for agents that are plugins + } +} + +void PrinterAgentChoice::BUILD() +{ + wxSize size(def_width_wider() * m_em_unit, wxDefaultCoord); + if (m_opt.height >= 0) size.SetHeight(m_opt.height * m_em_unit); + if (m_opt.width >= 0) size.SetWidth(m_opt.width * m_em_unit); + + static Builder builder; + choice_ctrl* temp = builder.build(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr, + wxCB_READONLY); + temp->Clear(); + temp->GetDropDown().SetUseContentWidth(true); + if (parent_is_custom_ctrl && m_opt.height < 0) + opt_height = (double)temp->GetTextCtrl()->GetSize().GetHeight() / m_em_unit; + temp->SetTextLabel(_L(m_opt.sidetext)); + m_combine_side_text = true; +#ifdef __WXGTK3__ + wxSize best_sz = temp->GetBestSize(); + if (best_sz.x > size.x) temp->SetSize(best_sz); +#endif + if (!wxOSX) temp->SetBackgroundStyle(wxBG_STYLE_PAINT); + + window = dynamic_cast(temp); + + reload_rows(); + + temp->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent&) { on_change_field(); }, temp->GetId()); + temp->SetToolTip(get_tooltip_text(temp->GetValue())); +} + +// Resolve CONFIG id string to a matching row in the live REGISTRY. "" uses the vendor default. +// An unregistered id clears selection and shows " (missing)" as free text. +void PrinterAgentChoice::set_value(const std::string& value, bool change_event) +{ + m_disable_change_event = !change_event; + + auto* field = dynamic_cast(window); + + // check if any row's corresponding id matches the agent id we are attempting to set + const std::string effective_agent_id = wxGetApp().resolve_printer_agent_id(value); + const unsigned int count = field->GetCount(); + int match = wxNOT_FOUND; + for (unsigned int i = 0; i < count; ++i) + { + if (into_u8(field->GetItemAlias(i)) == effective_agent_id) // if alias == id + { + match = static_cast(i); + break; + } + } + + // based on match or not, set selection and value + // - SetSelection and SetValue are UI to manipulate the display of the ComboBox + // - SetSelection automatically calls SetValue for the same value + // - we can also SetValue separately from SetSelection + if (match == wxNOT_FOUND) + { + field->SetSelection(wxNOT_FOUND); // nothing shows as selected in the dropdown + field->SetValue(from_u8(value + " (missing)")); // set a value not in the selection (upper display field) + } + else + { + // display name of agent shows both in upper display field and appears selected in dropdown + field->SetSelection(match); + } + + m_disable_change_event = false; +} + +// Accept boost::any values from callers (usually to OptionsGroup/Field parent classes) and normalize them to an agent id. +// Then use PrinterAgentChoice::set_value(std::string& value, ...) +void PrinterAgentChoice::set_value(const boost::any& value, bool change_event) +{ + m_disable_change_event = !change_event; + + auto* field = dynamic_cast(window); + if (value.empty()) + { + field->SetValue(""); + m_value = value; + m_disable_change_event = false; + return; + } + + std::string id; + if (const std::string* s = boost::any_cast(&value)) + id = *s; + else if (const wxString* w = boost::any_cast(&value)) + id = into_u8(*w); + set_value(id, change_event); +} + +// A real row returns its alias, which is the agent id. Header rows, missing rows, +// and no selection return empty boost::any so the custom writer leaves config unchanged. +boost::any& PrinterAgentChoice::get_value() +{ + auto* field = dynamic_cast(window); + const int sel = field->GetSelection(); + const std::string id = sel < 0 ? std::string{} : into_u8(field->GetItemAlias(sel)); + if (id.empty()) + m_value = boost::any{}; + else + m_value = id; + return m_value; +} + +void PrinterAgentChoice::enable() { dynamic_cast(window)->Enable(); } +void PrinterAgentChoice::disable() { dynamic_cast(window)->Disable(); } + +void PrinterAgentChoice::msw_rescale() +{ + Field::msw_rescale(); + + auto* field = dynamic_cast(window)->GetTextCtrl(); + wxSize size(wxDefaultSize); + size.SetWidth((m_opt.width > 0 ? m_opt.width : def_width_wider()) * m_em_unit); + field->SetMinSize(wxSize(-1, int(1.5f * field->GetFont().GetPixelSize().y + 0.5f))); + field->SetSize(size); + + dynamic_cast(window)->Rescale(); +} + void PluginField::BUILD() { auto* panel = new wxPanel(m_parent, wxID_ANY); diff --git a/src/slic3r/GUI/Field.hpp b/src/slic3r/GUI/Field.hpp index 4e9c65da5d..e57a569561 100644 --- a/src/slic3r/GUI/Field.hpp +++ b/src/slic3r/GUI/Field.hpp @@ -469,6 +469,44 @@ public: void suppress_scroll(); }; +// printer_agent is a coString whose choices come from the live agent registry. +// PrinterAgentChoice uses a ComboBox directly because Choice expects static config enums. +// Real rows carry the stored agent id in the row alias (SetItemAlias/GetItemAlias). +class PrinterAgentChoice : public Field +{ + using Field::Field; + +public: + PrinterAgentChoice(const ConfigOptionDef& opt, const t_config_option_key& id) : Field(opt, id) + { + } + + PrinterAgentChoice(wxWindow* parent, const ConfigOptionDef& opt, const t_config_option_key& id) : Field( + parent, opt, id) + { + } + + ~PrinterAgentChoice() + { + } + + wxWindow* window{nullptr}; + + void BUILD() override; + // Clear and repopulate rows from the live registry (grouped System agents / Plugins). + // Does not change selection; the caller follows with set_value(stored id). + void reload_rows(); + + void set_value(const std::string& value, bool change_event = false); + void set_value(const boost::any& value, bool change_event = false) override; + boost::any& get_value() override; + + void enable() override; + void disable() override; + void msw_rescale() override; + wxWindow* getWindow() override { return window; } +}; + class PluginField : public Field { using Field::Field; public: diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 4c4bdfd62c..83d4f2abaf 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -3873,6 +3873,18 @@ unsigned GUI_App::get_colour_approx_luma(const wxColour &colour) )); } +std::string GUI_App::resolve_printer_agent_id(const std::string& stored_id) +{ + if (!stored_id.empty()) + return stored_id; + return (preset_bundle && preset_bundle->is_bbl_vendor()) ? BBL_PRINTER_AGENT_ID : ORCA_PRINTER_AGENT_ID; +} + +std::string GUI_App::canonical_printer_agent_id(const std::string& picked_id) +{ + return picked_id == resolve_printer_agent_id("") ? std::string() : picked_id; +} + void GUI_App::switch_printer_agent() { if (!m_agent) { @@ -3880,17 +3892,8 @@ void GUI_App::switch_printer_agent() return; } - // Read printer_agent from config, falling back to default - std::string effective_agent_id = ORCA_PRINTER_AGENT_ID; - if (preset_bundle->is_bbl_vendor()) - effective_agent_id = BBL_PRINTER_AGENT_ID; - const DynamicPrintConfig& config = preset_bundle->printers.get_edited_preset().config; - if (config.has("printer_agent")) { - const std::string& value = config.option("printer_agent")->value; - if (!value.empty()) - effective_agent_id = value; - } + const std::string effective_agent_id = resolve_printer_agent_id(config.opt_string("printer_agent")); // Check if agent is registered const PrinterAgentInfo* agent_info_ptr = NetworkAgentFactory::get_printer_agent_info(effective_agent_id); diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index bda27d40ec..6a977d37fc 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -365,9 +365,14 @@ public: HMSQuery* get_hms_query() { return hms_query; } NetworkAgent* getAgent() { return m_agent; } - // Dynamic printer agent switching + // Reconcile the live printer agent with the stored preset selection. void switch_printer_agent(); + std::string resolve_printer_agent_id(const std::string& stored_id); + // ORCA TODO: in the future, bbl presets should specify "bbl" printer agent id + // then, all resolve and canonical would just be ORCA<->"" + std::string canonical_printer_agent_id(const std::string& picked_id); + FilamentColorCodeQuery* get_filament_color_code_query(); bool is_editor() const { return m_app_mode == EAppMode::Editor; } bool is_gcode_viewer() const { return m_app_mode == EAppMode::GCodeViewer; } diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index 9fb4483883..25c13c4b8d 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -54,6 +54,9 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co case ConfigOptionDef::GUIType::one_string: m_fields.emplace(id, TextCtrl::Create(this->ctrl_parent(), opt, id)); break; case ConfigOptionDef::GUIType::plugin_picker: m_fields.emplace(id, PluginField::Create(this->ctrl_parent(), opt, id)); break; case ConfigOptionDef::GUIType::plugin_config: m_fields.emplace(id, PluginConfigField::Create(this->ctrl_parent(), opt, id)); break; + case ConfigOptionDef::GUIType::printer_agent_select: m_fields.emplace( + id, PrinterAgentChoice::Create(this->ctrl_parent(), opt, id)); + break; default: switch (opt.type) { case coFloatOrPercent: @@ -654,6 +657,16 @@ Option ConfigOptionsGroup::get_option(const std::string& opt_key, int opt_index void ConfigOptionsGroup::on_change_OG(const t_config_option_key& opt_id, const boost::any& value) { + if (opt_id == "printer_agent") { + // TODO: Replace this option-specific branch with a generic value adapter if + // more fields need custom field-value to config-value conversion. + if (const std::string* id = boost::any_cast(&value)) + this->change_opt_value("printer_agent", wxGetApp().canonical_printer_agent_id(*id)); + + OptionsGroup::on_change_OG(opt_id, value); + return; + } + if (!m_opt_map.empty()) { auto it = m_opt_map.find(opt_id); if (it == m_opt_map.end()) { @@ -772,6 +785,19 @@ void ConfigOptionsGroup::back_to_config_value(const DynamicPrintConfig& config, } } #endif + else if (opt_key == "printer_agent") + { + // why: printer_agent is a coString kept out of m_opt_map. The generic non-opt_map revert + // below restores the edited config from get_value(), but a deregistered/"(missing)" saved + // id has no selectable row, so the field yields no value and the edited config keeps the + // user's interim pick -> stuck dirty. Restore the SAVED id straight into the edited config + // (displayable or not; config is the saved or system baseline), then repaint and notify. + const std::string saved_id = config.opt_string("printer_agent"); + set_value(opt_key, saved_id); + this->change_opt_value(opt_key, saved_id); + OptionsGroup::on_change_OG(opt_key, saved_id); + return; + } else if (m_opt_map.find(opt_key) == m_opt_map.end() || // This option don't have corresponded field opt_key == "printable_area" || opt_key == "compatible_printers" || opt_key == "compatible_prints" || opt_key == "thumbnails" || diff --git a/src/slic3r/GUI/PhysicalPrinterDialog.cpp b/src/slic3r/GUI/PhysicalPrinterDialog.cpp index b40cd22697..4c9dd60d55 100644 --- a/src/slic3r/GUI/PhysicalPrinterDialog.cpp +++ b/src/slic3r/GUI/PhysicalPrinterDialog.cpp @@ -25,7 +25,6 @@ #include "GUI.hpp" #include "GUI_App.hpp" #include "MainFrame.hpp" -#include "slic3r/Utils/NetworkAgentFactory.hpp" #include "format.hpp" #include "Tab.hpp" #include "wxExtensions.hpp" @@ -128,22 +127,8 @@ PhysicalPrinterDialog::~PhysicalPrinterDialog() void PhysicalPrinterDialog::build_printhost_settings(ConfigOptionsGroup* m_optgroup) { m_optgroup->m_on_change = [this](t_config_option_key opt_key, boost::any value) { - // Special handling for printer_agent: convert fake enum index to string agent ID - if (opt_key == "printer_agent") { - try { - int selected_idx = boost::any_cast(value); - auto agents = NetworkAgentFactory::get_registered_printer_agents(); - if (selected_idx >= 0 && selected_idx < static_cast(agents.size())) { - m_config->set_key_value("printer_agent", - new ConfigOptionString(agents[selected_idx].id)); - } - } catch (const boost::bad_any_cast&) { - // If value is not an int, ignore - } + if (opt_key == "host_type" || opt_key == "printhost_authorization_type") this->update(); - } else if (opt_key == "host_type" || opt_key == "printhost_authorization_type") { - this->update(); - } if (opt_key == "print_host") this->update_printhost_buttons(); if (opt_key == "printhost_port") @@ -154,47 +139,6 @@ void PhysicalPrinterDialog::build_printhost_settings(ConfigOptionsGroup* m_optgr m_optgroup->append_single_option_line("host_type"); - // Build printer agent dropdown from registry (only if network agent is available) - if (wxGetApp().getAgent() != nullptr) { - auto agents = NetworkAgentFactory::get_registered_printer_agents(); - - if (!agents.empty()) { - // Create a fake enum option to force a Choice widget instead of TextCtrl - // (printer_agent is coString in config, but we need a dropdown) - ConfigOptionDef def; - def.type = coEnum; - def.width = Field::def_width_wider(); - def.label = L("Printer Agent"); - def.tooltip = L("Select the network agent implementation for printer communication. " - "Available agents are registered at startup."); - def.mode = comAdvanced; - - // Populate enum values and labels from registered agents - for (const auto& agent : agents) { - def.enum_values.push_back(agent.id); - def.enum_labels.push_back(agent.display_name); - } - - // Resolve selected agent: use config value if valid, otherwise fall back to default - std::string selected_agent = m_config->opt_string("printer_agent"); - auto it = std::find_if(agents.begin(), agents.end(), [&selected_agent](const auto& a) { return a.id == selected_agent; }); - if (it == agents.end()) { - selected_agent = ORCA_PRINTER_AGENT_ID; - it = std::find_if(agents.begin(), agents.end(), [&selected_agent](const auto& a) { return a.id == selected_agent; }); - } - - if (it != agents.end()) { - size_t default_idx = std::distance(agents.begin(), it); - def.set_default_value(new ConfigOptionInt(static_cast(default_idx))); - } - - // Create and append the option line - auto agent_option = Option(def, "printer_agent"); - Line agent_line = m_optgroup->create_single_option_line(agent_option); - m_optgroup->append_line(agent_line); - } - } - auto create_sizer_with_btn = [](wxWindow* parent, Button** btn, const std::string& icon_name, const wxString& label) { *btn = new Button(parent, label); (*btn)->SetStyle(ButtonStyle::Regular, ButtonType::Parameter); @@ -816,31 +760,6 @@ void PhysicalPrinterDialog::update_host_type(bool printer_change) } } -void PhysicalPrinterDialog::update_printer_agent_type() -{ - if (m_config == nullptr) - return; - - Field* agent_field = m_optgroup->get_field("printer_agent"); - if (!agent_field) - return; - - Choice* agent_choice = dynamic_cast(agent_field); - if (!agent_choice) - return; - - // Sync selection with current config value - const std::string current_agent = m_config->opt_string("printer_agent"); - - auto agents = NetworkAgentFactory::get_registered_printer_agents(); - for (size_t i = 0; i < agents.size(); ++i) { - if (agents[i].id == current_agent) { - agent_choice->set_value(i); - return; - } - } -} - void PhysicalPrinterDialog::update_printers() { wxBusyCursor wait; @@ -894,11 +813,6 @@ void PhysicalPrinterDialog::OnOK(wxEvent& event) { wxGetApp().get_tab(Preset::TYPE_PRINTER)->save_preset("", false, false, true, m_preset_name); event.Skip(); - - // Defer printer agent switch to ensure preset save completes first - wxGetApp().CallAfter([] { - wxGetApp().switch_printer_agent(); - }); } }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/PhysicalPrinterDialog.hpp b/src/slic3r/GUI/PhysicalPrinterDialog.hpp index 694e7aaf90..0ba2cad54f 100644 --- a/src/slic3r/GUI/PhysicalPrinterDialog.hpp +++ b/src/slic3r/GUI/PhysicalPrinterDialog.hpp @@ -60,7 +60,6 @@ public: void update(bool printer_change = false); void update_host_type(bool printer_change); - void update_printer_agent_type(); void update_preset_input(); void update_printhost_buttons(); void update_printers(); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index c8fa524ca5..857abdce67 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -33,6 +33,7 @@ #include "GUI_App.hpp" #include "GUI_ObjectList.hpp" +#include "slic3r/Utils/NetworkAgentFactory.hpp" #include "slic3r/Utils/PresetUpdater.hpp" #include "slic3r/plugin/PluginConfig.hpp" #include "Plater.hpp" @@ -5018,6 +5019,40 @@ void TabPrinter::build_fff() optgroup->append_single_option_line("gcode_flavor", "printer_basic_information_advanced#g-code-flavor"); optgroup->append_single_option_line("pellet_modded_printer", "printer_basic_information_advanced#pellet-modded-printer"); optgroup->append_single_option_line("bbl_use_printhost", "printer_basic_information_advanced#use-3rd-party-print-host"); + + // "Printer Agent" dropdown - printer_agent is a coString; gui_type routes it to + // PrinterAgentChoice instead of a TextCtrl. Rows and values come from the live agent + // registry, and the value is stored as the agent-id string. + if (wxGetApp().getAgent() != nullptr) + { + auto registered_printer_agents = NetworkAgentFactory::get_registered_printer_agents(); + if (!registered_printer_agents.empty()) + { + ConfigOptionDef def; + def.type = coString; + def.gui_type = ConfigOptionDef::GUIType::printer_agent_select; + def.width = 3 * Field::def_width_wider() / 2; + def.label = L("Printer Agent"); + def.tooltip = L("Select the network agent implementation for printer communication. " + "Available agents are registered at startup."); + def.mode = comAdvanced; + + // Create the field without get_option() so it is not registered in m_opt_map. + // ConfigOptionsGroup handles printer_agent before the generic mapped write path. + Line agent_line = optgroup->create_single_option_line(Option(def, "printer_agent")); + optgroup->append_line(agent_line); + if (Field* agent_field = get_field("printer_agent")) + { + if (auto* choice = dynamic_cast(agent_field); choice && choice->getWindow()) + choice->set_value(m_config->opt_string("printer_agent"), false); + } + + // Register by hand so the UnsavedChanges dialog can render a row for it. + wxGetApp().sidebar().get_searcher().add_key("printer_agent", m_type, optgroup->title, + optgroup->config_category()); + } + } + optgroup->append_single_option_line("use_3mf"); optgroup->append_single_option_line("scan_first_layer" , "printer_basic_information_advanced#scan-first-layer"); optgroup->append_single_option_line("enable_power_loss_recovery", "printer_basic_information_advanced#power-loss-recovery"); @@ -5884,6 +5919,16 @@ void TabPrinter::reload_config() // so update it implicitly if (m_active_page && m_active_page->title() == "Multimaterial") m_active_page->set_value("extruders_count", int(m_extruders_count)); + + // m_opt_map-driven reload does not cover printer_agent, so sync this custom field explicitly. + if (Field* agent_field = get_field("printer_agent")) + { + if (auto* choice = dynamic_cast(agent_field); choice && choice->getWindow()) + { + const std::string selected_agent = m_config->opt_string("printer_agent"); + choice->set_value(selected_agent, false); + } + } } void TabPrinter::activate_selected_page(std::function throw_if_canceled) @@ -5894,6 +5939,16 @@ void TabPrinter::activate_selected_page(std::function throw_if_canceled) // so update it implicitly if (m_active_page && m_active_page->title() == "Multimaterial") m_active_page->set_value("extruders_count", int(m_extruders_count)); + + // m_opt_map-driven reload does not cover printer_agent, so sync this custom field explicitly. + if (Field* agent_field = get_field("printer_agent")) + { + if (auto* choice = dynamic_cast(agent_field); choice && choice->getWindow()) + { + const std::string selected_agent = m_config->opt_string("printer_agent"); + choice->set_value(selected_agent, false); + } + } } void TabPrinter::clear_pages() From 15342681831a73e028f745c9c2d8b2efd8f44f71 Mon Sep 17 00:00:00 2001 From: Andrew <159703254+andrewsoonqn@users.noreply.github.com> Date: Thu, 16 Jul 2026 16:27:53 +0800 Subject: [PATCH 053/106] Reset device selection on agent swap or unload (#124) set_live_printer_agent centralizes the swap: deselect the machine, clear stale sidebar state and the previous agent's Other Devices, then install the new agent (or null when its provider vanished). Plugin load/unload callbacks refresh the dropdown and re-run agent selection. load_last_machine no longer falls back to the first available machine. --- src/slic3r/GUI/DeviceCore/DevManager.cpp | 70 ++++++++--------- src/slic3r/GUI/DeviceCore/DevManager.h | 8 +- src/slic3r/GUI/GUI_App.cpp | 95 +++++++++++++++++++++--- src/slic3r/GUI/GUI_App.hpp | 5 ++ src/slic3r/GUI/Tab.cpp | 18 +++++ src/slic3r/GUI/Tab.hpp | 1 + 6 files changed, 150 insertions(+), 47 deletions(-) diff --git a/src/slic3r/GUI/DeviceCore/DevManager.cpp b/src/slic3r/GUI/DeviceCore/DevManager.cpp index 2d54b5c85f..3c664facfd 100644 --- a/src/slic3r/GUI/DeviceCore/DevManager.cpp +++ b/src/slic3r/GUI/DeviceCore/DevManager.cpp @@ -496,6 +496,26 @@ namespace Slic3r OnSelectedMachineChanged(previous_selected_machine, selected_machine); } + void DeviceManager::clear_other_devices() + { + // why: on agent swap, keep "My Devices" but drop the transient "Other Devices" + // Those belong to the previous agent's network scan; the new agent's start_discovery re-populates its own. + const auto my = get_my_machine_list(); + for (auto it = localMachineList.begin(); it != localMachineList.end();) + { + if (my.find(it->first) == my.end()) + { + // not a "My Device" -> an "Other Device" + delete it->second; + it = localMachineList.erase(it); + } + else + { + ++it; + } + } + } + bool DeviceManager::set_selected_machine(std::string dev_id) { BOOST_LOG_TRIVIAL(info) << "set_selected_machine=" << dev_id @@ -558,7 +578,6 @@ namespace Slic3r } else { - Slic3r::GUI::wxGetApp().reset_unsigned_plugin_warning(); if (m_agent) { if (it->second->connection_type() != "lan" || it->second->connection_type().empty()) @@ -592,7 +611,6 @@ namespace Slic3r } selected_machine = dev_id; - record_user_last_machine(selected_machine); return true; } @@ -851,44 +869,26 @@ namespace Slic3r int result = m_agent->get_user_print_info(&http_code, &body, provider); if (result == 0) { - parse_user_print_info(body); + // parse_user_print_info and on_machine_alive (SSDP for discovery) both mutate the same userMachineList map. + // on_machine_alive mutates the map on the UI thread, do the same for parse_user_print_info. + Slic3r::GUI::wxGetApp().CallAfter([this, body]() { parse_user_print_info(body); }); } } - void DeviceManager::record_user_last_machine(const std::string& dev_id) - { - if (Slic3r::GUI::wxGetApp().app_config) { - Slic3r::GUI::wxGetApp().app_config->set("user_last_selected_machine", dev_id); - } - } - - std::string DeviceManager::get_user_last_machine() const - { - if (Slic3r::GUI::wxGetApp().app_config) { - const auto& user_last_machine = Slic3r::GUI::wxGetApp().app_config->get("user_last_selected_machine"); - if (!user_last_machine.empty()) { - return user_last_machine; - } else if (m_agent) { - return m_agent->get_user_selected_machine(); - } - } - - return ""; - } - void DeviceManager::load_last_machine() { - if (userMachineList.empty()) return; - else if (userMachineList.size() == 1) { - this->set_selected_machine(userMachineList.begin()->second->get_dev_id()); - } else { - const auto& last_monitor_machine = get_user_last_machine(); - if (userMachineList.find(last_monitor_machine) != userMachineList.end()) { - set_selected_machine(last_monitor_machine); - } else { - this->set_selected_machine(userMachineList.begin()->second->get_dev_id()); - } - } + // Get all available machines, include cloud machines and lan machines that have access right + auto all_machines = get_my_machine_list(); + if (all_machines.empty()) + return; + + // Reconnect the machine the user last selected, if it's still available. + // why: no first-available fallback - auto-connecting an arbitrary machine + // fights the agent-swap reset, which intentionally leaves nothing selected. + const std::string last_monitor_machine = m_agent ? m_agent->get_user_selected_machine() : ""; + const auto last_machine = all_machines.find(last_monitor_machine); + if (last_machine != all_machines.end()) + this->set_selected_machine(last_machine->second->get_dev_id()); } void DeviceManager::OnMachineBindStateChanged(MachineObject* obj, const std::string& new_state) diff --git a/src/slic3r/GUI/DeviceCore/DevManager.h b/src/slic3r/GUI/DeviceCore/DevManager.h index 1f7f87b7fb..70bee613a8 100644 --- a/src/slic3r/GUI/DeviceCore/DevManager.h +++ b/src/slic3r/GUI/DeviceCore/DevManager.h @@ -48,8 +48,9 @@ public: MachineObject* get_selected_machine(); bool set_selected_machine(std::string dev_id); - void record_user_last_machine(const std::string& dev_id); - std::string get_user_last_machine() const; + // why: clears stale sidebar sync-status / AMS visuals. Public so the printer-agent + // swap path can reuse it instead of duplicating the two sidebar calls. + void OnSelectedMachineLost(); // local machine void set_local_selected_machine(std::string dev_id) { local_selected_machine = dev_id; }; @@ -70,6 +71,8 @@ public: void erase_user_machine(std::string dev_id) { userMachineList.erase(dev_id); } void clean_user_info(bool keep_local_selection = false); + void clear_other_devices(); + void load_last_machine(); void update_user_machine_list_info(const std::string& provider); void parse_user_print_info(std::string body); @@ -110,7 +113,6 @@ private: void check_pushing(); void OnMachineBindStateChanged(MachineObject* obj, const std::string& new_state); - void OnSelectedMachineLost(); void OnSelectedMachineChanged(const std::string& pre_dev_id, const std::string& new_dev_id); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 83d4f2abaf..14edeb8038 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2809,16 +2809,58 @@ void GUI_App::init_plugin_gui_wiring() }); }; + // why: a newly loaded plugin only adds a selectable agent + // refresh the dropdown and leave the live agent alone + auto refresh_printer_agent_dropdown_after_load = [](const std::string&) + { + if (!wxTheApp) + return; + + GUI_App* app = &GUI::wxGetApp(); + if (app->is_closing()) + return; + + app->CallAfter([app] + { + if (!app->is_closing()) + app->refresh_printer_agent_dropdown(); + }); + }; + + // why: the unloaded plugin may have been the provider of the live agent + // re-run selection, where a now-missing agent will be cleared + // refresh dropdown after + auto switch_printer_agent_after_unload = [](const std::string&) + { + if (!wxTheApp) + return; + + GUI_App* app = &GUI::wxGetApp(); + if (app->is_closing()) + return; + + app->CallAfter([app] { + if (app->is_closing()) + return; + + app->switch_printer_agent(); + app->refresh_printer_agent_dropdown(); + }); + }; + plugin_mgr.subscribe_on_unload_callback(PluginHostUi::close_windows_for_plugin); plugin_mgr.subscribe_on_load_callback([refresh_plugins_dialog](const std::string&) { refresh_plugins_dialog(); }); plugin_mgr.subscribe_on_unload_callback([refresh_plugins_dialog](const std::string&) { refresh_plugins_dialog(); }); plugin_mgr.subscribe_on_load_callback(NetworkAgentFactory::register_python_plugin); plugin_mgr.subscribe_on_unload_callback(NetworkAgentFactory::deregister_python_plugin); + plugin_mgr.subscribe_on_load_callback(refresh_printer_agent_dropdown_after_load); + plugin_mgr.subscribe_on_unload_callback(switch_printer_agent_after_unload); plugin_mgr.subscribe_on_capability_load_callback( - [refresh_plugins_dialog](const PluginCapabilityId& capability) { + [refresh_plugins_dialog, refresh_printer_agent_dropdown_after_load](const PluginCapabilityId& capability) { if (capability.type == PluginCapabilityType::PrinterConnection) NetworkAgentFactory::register_python_printer_agent(capability.plugin_key, capability.name); refresh_plugins_dialog(); + refresh_printer_agent_dropdown_after_load(capability.plugin_key); // A newly loaded capability may satisfy a missing-plugin notification; re-validate the // current plate (on the UI thread) so the notification clears once its plugin is available. if (wxTheApp && !wxGetApp().is_closing()) @@ -2828,10 +2870,11 @@ void GUI_App::init_plugin_gui_wiring() }); }); plugin_mgr.subscribe_on_capability_unload_callback( - [refresh_plugins_dialog](const PluginCapabilityId& capability) { + [refresh_plugins_dialog, switch_printer_agent_after_unload](const PluginCapabilityId& capability) { if (capability.type == PluginCapabilityType::PrinterConnection) NetworkAgentFactory::deregister_python_printer_agent(capability.plugin_key, capability.name); refresh_plugins_dialog(); + switch_printer_agent_after_unload(capability.plugin_key); }); } @@ -3873,6 +3916,36 @@ unsigned GUI_App::get_colour_approx_luma(const wxColour &colour) )); } +void GUI_App::refresh_printer_agent_dropdown() +{ + if (Tab* tab = get_tab(Preset::TYPE_PRINTER)) + { + if (auto* printer_tab = dynamic_cast(tab)) + printer_tab->refresh_printer_agent_dropdown(); + } +} + +void GUI_App::set_live_printer_agent(std::shared_ptr agent) +{ + if (!m_agent) + return; + + // why: tearing down the old machine selection is only ever the prefix of setting the live + // agent (to a new one, or to null when the selection is missing) - so it lives here, not as + // a standalone helper. Pass nullptr to clear the selection. + if (DeviceManager* dev = getDeviceManager()) + { + dev->set_selected_machine(""); // why: empty id disconnects and deselects the current machine + m_agent->set_user_selected_machine(""); + // note: belt-and-suspenders (precedent: DeviceManagerRefresher::on_timer) + dev->OnSelectedMachineLost(); // why: clear stale sidebar sync-status / AMS + dev->clear_other_devices(); // why: drop stale LAN discoveries; keep My Devices + } + + m_agent->set_printer_agent(agent); + sidebar().update_all_preset_comboboxes(); +} + std::string GUI_App::resolve_printer_agent_id(const std::string& stored_id) { if (!stored_id.empty()) @@ -3898,9 +3971,11 @@ void GUI_App::switch_printer_agent() // Check if agent is registered const PrinterAgentInfo* agent_info_ptr = NetworkAgentFactory::get_printer_agent_info(effective_agent_id); if (!agent_info_ptr) { - BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << ": unregistered agent ID '" << effective_agent_id - << "', keeping current agent"; - // Keep current agent, don't switch + // why: the selected agent's provider is gone (e.g. plugin unloaded); leaving the old + // live agent up would keep talking to a machine the user can no longer select. + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": agent ID '" << effective_agent_id + << "' is unregistered; clearing live printer agent"; + set_live_printer_agent(nullptr); return; } const PrinterAgentInfo agent_info = *agent_info_ptr; @@ -3914,7 +3989,9 @@ void GUI_App::switch_printer_agent() NetworkAgentFactory::create_printer_agent_by_id(effective_agent_id, cloud_agent, log_dir); if (!new_printer_agent) { - BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << ": failed to create agent '" << effective_agent_id << "', keeping current agent"; + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << ": failed to create agent '" << effective_agent_id + << "'; clearing live printer agent"; + set_live_printer_agent(nullptr); return; } @@ -3937,9 +4014,9 @@ void GUI_App::switch_printer_agent() return; } - // Swap the agent - m_agent->set_printer_agent(new_printer_agent); - sidebar().update_all_preset_comboboxes(); + // Swap the agent; set_live_printer_agent resets the device selection so the new + // agent starts clean (#124). + set_live_printer_agent(new_printer_agent); BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": printer agent switched to " << effective_agent_id; diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 6a977d37fc..8bf32df64c 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -803,6 +803,11 @@ private: void window_pos_center(wxTopLevelWindow *window); bool select_language(); + // Dynamic printer agent selection - internal helpers for switch_printer_agent + // and the plugin load/unload callbacks (init_plugin_gui_wiring). + void refresh_printer_agent_dropdown(); + void set_live_printer_agent(std::shared_ptr agent); // null clears the selection + bool config_wizard_startup(); void check_updates(const bool verbose); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 857abdce67..bade7fee98 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -7907,6 +7907,24 @@ bool TabPrinter::apply_extruder_cnt_from_cache() return false; } +void TabPrinter::refresh_printer_agent_dropdown() const +{ + auto* choice = dynamic_cast(get_field("printer_agent")); + if (!choice || !choice->getWindow()) + return; + + const auto agents = NetworkAgentFactory::get_registered_printer_agents(); + if (agents.empty()) + return; + + // why: rows live on PrinterAgentChoice now; rebuild them from the live registry and re-select the stored id. + const std::string selected_agent = wxGetApp().preset_bundle->printers.get_edited_preset() + .config.opt_string("printer_agent"); + choice->reload_rows(); + choice->set_value(selected_agent, false); + this->GetParent()->Layout(); +} + bool Tab::validate_custom_gcodes() { if (m_type != Preset::TYPE_FILAMENT && diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 7187aff467..19eb0b849d 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -675,6 +675,7 @@ public: wxSizer* create_bed_shape_widget(wxWindow* parent); void cache_extruder_cnt(const DynamicPrintConfig* config = nullptr); bool apply_extruder_cnt_from_cache(); + void refresh_printer_agent_dropdown() const; }; class TabSLAMaterial : public Tab From 8dfc7a14b9287e4f983c8bcb37037cb5d0cb8fde Mon Sep 17 00:00:00 2001 From: Andrew <159703254+andrewsoonqn@users.noreply.github.com> Date: Thu, 16 Jul 2026 16:36:47 +0800 Subject: [PATCH 054/106] Gate agent mode behind use_printer_agents toggle Replace per-printer auto-activation (is_current_printer_agent_plugin) with a global experimental AppConfig toggle, default off: legacy print-host behavior is unchanged until the user opts in. The toggle drives device-tab routing, print button defaults, connect-button visibility and sidebar layout, and dedups machine-select dialog opens. --- src/slic3r/GUI/MainFrame.cpp | 9 ++-- src/slic3r/GUI/PhysicalPrinterDialog.cpp | 2 +- src/slic3r/GUI/Plater.cpp | 54 +++++++++++++----------- src/slic3r/GUI/Preferences.cpp | 8 ++++ src/slic3r/Utils/NetworkAgentFactory.cpp | 20 --------- src/slic3r/Utils/NetworkAgentFactory.hpp | 2 - 6 files changed, 43 insertions(+), 52 deletions(-) diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 7b638e3316..39082a9dca 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -708,7 +708,7 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, BORDERLESS_FRAME_ m_print_enable = get_enable_print_status(); m_print_btn->Enable(m_print_enable); if (m_print_enable) { - if (wxGetApp().preset_bundle->use_bbl_network()) + if (wxGetApp().preset_bundle->use_bbl_network() || wxGetApp().app_config->get_bool("use_printer_agents")) wxPostEvent(m_plater, SimpleEvent(EVT_GLTOOLBAR_PRINT_PLATE)); else wxPostEvent(m_plater, SimpleEvent(EVT_GLTOOLBAR_SEND_GCODE)); @@ -1999,7 +1999,8 @@ wxBoxSizer* MainFrame::create_side_tools() SidePopup* p = new SidePopup(this); if (wxGetApp().preset_bundle - && !wxGetApp().preset_bundle->is_bbl_vendor()) { + && !wxGetApp().preset_bundle->is_bbl_vendor() + && !wxGetApp().app_config->get_bool("use_printer_agents")) { // ThirdParty Buttons SideButton* export_gcode_btn = new SideButton(p, _L("Export G-code file"), ""); export_gcode_btn->SetCornerRadius(0); @@ -2132,7 +2133,7 @@ wxBoxSizer* MainFrame::create_side_tools() const auto preset_bundle = wxGetApp().preset_bundle; if (preset_bundle) { - if (preset_bundle->use_bbl_network()) { + if (preset_bundle->use_bbl_network() || wxGetApp().app_config->get_bool("use_printer_agents")) { // BBL network support everything } else { support_send = false; // All 3rd print hosts do not have the send options @@ -4253,7 +4254,7 @@ void MainFrame::load_printer_url(wxString url, wxString apikey) void MainFrame::load_printer_url() { PresetBundle &preset_bundle = *wxGetApp().preset_bundle; - if (preset_bundle.use_bbl_device_tab() || NetworkAgentFactory::is_current_printer_agent_plugin()) + if (preset_bundle.use_bbl_device_tab() || wxGetApp().app_config->get_bool("use_printer_agents")) return; auto cfg = preset_bundle.printers.get_edited_preset().config; diff --git a/src/slic3r/GUI/PhysicalPrinterDialog.cpp b/src/slic3r/GUI/PhysicalPrinterDialog.cpp index 4c9dd60d55..989cf204e1 100644 --- a/src/slic3r/GUI/PhysicalPrinterDialog.cpp +++ b/src/slic3r/GUI/PhysicalPrinterDialog.cpp @@ -669,7 +669,7 @@ void PhysicalPrinterDialog::update(bool printer_change) } // For bbl printers, show option to control the device tab - if (wxGetApp().preset_bundle->is_bbl_vendor()) { + if (wxGetApp().preset_bundle->is_bbl_vendor() || wxGetApp().app_config->get_bool("use_printer_agents")) { m_optgroup->show_field("bbl_use_print_host_webui"); const bool use_print_host_webui = !current_webui.empty(); if (Field* printhost_webui_field = m_optgroup->get_field("bbl_use_print_host_webui"); printhost_webui_field) { diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 106c142fea..d83ddded34 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3246,7 +3246,7 @@ void Sidebar::update_all_preset_comboboxes() auto p_mainframe = wxGetApp().mainframe; auto cfg = preset_bundle.printers.get_edited_preset().config; - const bool use_native_device_tab = preset_bundle.use_bbl_device_tab() || NetworkAgentFactory::is_current_printer_agent_plugin(); + const bool use_native_device_tab = preset_bundle.use_bbl_device_tab() || wxGetApp().app_config->get_bool("use_printer_agents"); if (preset_bundle.use_bbl_network()) { //only show connection button for not-BBL printer @@ -3258,7 +3258,8 @@ void Sidebar::update_all_preset_comboboxes() p_mainframe->set_print_button_to_default(MainFrame::PrintSelectType::ePrintPlate); } else { //p->btn_connect_printer->Show(); - p->m_printer_connect->Show(); + // ORCA: hide the physical-printer connection button when printer agents are enabled + p->m_printer_connect->Show(!wxGetApp().app_config->get_bool("use_printer_agents")); // ORCA: show/hide sync-ams button based on filament sync mode auto agent = wxGetApp().getAgent(); @@ -3280,7 +3281,9 @@ void Sidebar::update_all_preset_comboboxes() const auto host_type = cfg.option>("host_type")->value; if (cfg.has("printhost_apikey") && (host_type != htSimplyPrint)) apikey = cfg.opt_string("printhost_apikey"); - print_btn_type = preset_bundle.is_bbl_vendor() ? MainFrame::PrintSelectType::ePrintPlate : MainFrame::PrintSelectType::eSendGcode; + print_btn_type = (preset_bundle.is_bbl_vendor() || wxGetApp().app_config->get_bool("use_printer_agents")) + ? MainFrame::PrintSelectType::ePrintPlate + : MainFrame::PrintSelectType::eSendGcode; } if (!use_native_device_tab) @@ -3439,7 +3442,10 @@ void Sidebar::update_presets(Preset::Type preset_type) bool isBBL = preset_bundle.is_bbl_vendor(); bool is_dual_extruder = extruder_variants->size() == 2; - p->layout_printer(preset_bundle.use_bbl_network(), isBBL && is_dual_extruder); + // why: agent mode drives the native device tab, so the sidebar lays out like BBL + // (no physical-printer connect button). + p->layout_printer(preset_bundle.use_bbl_network() || wxGetApp().app_config->get_bool("use_printer_agents"), + isBBL && is_dual_extruder); // Update nozzle titles from printer config (e.g. "Main Nozzle" / "Auxiliary Nozzle" for N6) // UI left = DEPUTY_EXTRUDER_ID(1), UI right = MAIN_EXTRUDER_ID(0) @@ -5625,6 +5631,7 @@ struct Plater::priv void on_action_slice_all(SimpleEvent&); void on_action_publish(wxCommandEvent &evt); void on_action_print_plate(SimpleEvent&); + void open_machine_select_dialog(int plate_idx, PrintFromType print_type = PrintFromType::FROM_NORMAL); void on_action_print_all(SimpleEvent&); void on_action_export_gcode(SimpleEvent&); void on_action_send_gcode(SimpleEvent&); @@ -11166,18 +11173,23 @@ void Plater::priv::on_action_print_plate(SimpleEvent&) } PresetBundle& preset_bundle = *wxGetApp().preset_bundle; - if (preset_bundle.use_bbl_network()) { - // BBS - if (!m_select_machine_dlg) - m_select_machine_dlg = new SelectMachineDialog(q); - m_select_machine_dlg->set_print_type(PrintFromType::FROM_NORMAL); - m_select_machine_dlg->prepare(partplate_list.get_curr_plate_index()); - m_select_machine_dlg->ShowModal(); + if (preset_bundle.use_bbl_network() || wxGetApp().app_config->get_bool("use_printer_agents")) { + open_machine_select_dialog(partplate_list.get_curr_plate_index()); } else { q->send_gcode_legacy(PLATE_CURRENT_IDX, nullptr); } } +void Plater::priv::open_machine_select_dialog(int plate_idx, PrintFromType print_type) +{ + // BBS + if (!m_select_machine_dlg) + m_select_machine_dlg = new SelectMachineDialog(q); + m_select_machine_dlg->set_print_type(print_type); + m_select_machine_dlg->prepare(plate_idx); + m_select_machine_dlg->ShowModal(); +} + void Plater::priv::on_action_send_to_multi_machine(SimpleEvent&) { if (!m_send_multi_dlg) @@ -11193,10 +11205,7 @@ void Plater::priv::on_action_print_plate_from_sdcard(SimpleEvent&) } //BBS - if (!m_select_machine_dlg) m_select_machine_dlg = new SelectMachineDialog(q); - m_select_machine_dlg->set_print_type(PrintFromType::FROM_SDCARD_VIEW); - m_select_machine_dlg->prepare(0); - m_select_machine_dlg->ShowModal(); + open_machine_select_dialog(0, PrintFromType::FROM_SDCARD_VIEW); } void Plater::priv::on_tab_selection_changing(wxBookCtrlEvent& e) @@ -11211,13 +11220,13 @@ void Plater::priv::on_tab_selection_changing(wxBookCtrlEvent& e) sidebar_layout.show = new_sel == MainFrame::tp3DEditor || new_sel == MainFrame::tpPreview; update_sidebar(); int old_sel = e.GetOldSelection(); - const bool is_printer_agent_plugin = NetworkAgentFactory::is_current_printer_agent_plugin(); + const bool use_printer_agents = wxGetApp().app_config->get_bool("use_printer_agents"); const bool use_native_device_tab = wxGetApp().preset_bundle && - (wxGetApp().preset_bundle->use_bbl_device_tab() || is_printer_agent_plugin); + (wxGetApp().preset_bundle->use_bbl_device_tab() || use_printer_agents); if (use_native_device_tab && new_sel == MainFrame::tpMonitor) { // BBL network module is only required for BBL-vendor printers. // Non-BBL Python plugins (e.g. moonraker) drive the Device tab without it. - if (!is_printer_agent_plugin && wxGetApp().preset_bundle->is_bbl_vendor() && !Slic3r::NetworkAgent::is_network_module_loaded()) { + if (!use_printer_agents && wxGetApp().preset_bundle->is_bbl_vendor() && !Slic3r::NetworkAgent::is_network_module_loaded()) { e.Veto(); BOOST_LOG_TRIVIAL(info) << boost::format("skipped tab switch from %1% to %2%, lack of network plugins") % old_sel % new_sel; if (q) { @@ -11273,13 +11282,8 @@ void Plater::priv::on_action_print_all(SimpleEvent&) } PresetBundle& preset_bundle = *wxGetApp().preset_bundle; - if (preset_bundle.use_bbl_network()) { - // BBS - if (!m_select_machine_dlg) - m_select_machine_dlg = new SelectMachineDialog(q); - m_select_machine_dlg->set_print_type(PrintFromType::FROM_NORMAL); - m_select_machine_dlg->prepare(PLATE_ALL_IDX); - m_select_machine_dlg->ShowModal(); + if (preset_bundle.use_bbl_network() || wxGetApp().app_config->get_bool("use_printer_agents")) { + open_machine_select_dialog(PLATE_ALL_IDX); } else { q->send_gcode_legacy(PLATE_ALL_IDX, nullptr); } diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index 1a3c6fd26a..f802ba6ecb 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -1135,6 +1135,14 @@ wxBoxSizer *PreferencesDialog::create_item_checkbox(wxString title, wxString too wxGetApp().plater()->sidebar().update_presets(Preset::TYPE_FILAMENT); } + if (param == "use_printer_agents") + { + // Rebuild the Device tab so the native/web-UI choice reflects the new flag + // immediately, instead of only on the next printer-preset change or restart. + if (wxGetApp().plater()) + wxGetApp().plater()->sidebar().update_all_preset_comboboxes(); + } + if (param == "enable_high_low_temp_mixed_printing") { if (checkbox->GetValue()) { const wxString warning_title = _L("Bed Temperature Difference Warning"); diff --git a/src/slic3r/Utils/NetworkAgentFactory.cpp b/src/slic3r/Utils/NetworkAgentFactory.cpp index 3883d99f2e..ff950d0946 100644 --- a/src/slic3r/Utils/NetworkAgentFactory.cpp +++ b/src/slic3r/Utils/NetworkAgentFactory.cpp @@ -465,25 +465,5 @@ void NetworkAgentFactory::deregister_python_printer_agent(const std::string& plu << plugin_key << "' with agent ID '" << agent_id << "'"; } -bool NetworkAgentFactory::is_current_printer_agent_plugin() -{ - auto* preset_bundle = GUI::wxGetApp().preset_bundle; - if (!preset_bundle) - return false; - - std::string agent_key = ORCA_PRINTER_AGENT_ID; - if (preset_bundle->is_bbl_vendor()) - agent_key = BBL_PRINTER_AGENT_ID; - - const auto& cfg = preset_bundle->printers.get_edited_preset().config; - if (cfg.has("printer_agent")) { - const std::string& value = cfg.option("printer_agent")->value; - if (!value.empty()) - agent_key = value; - } - - const PrinterAgentInfo* info = get_printer_agent_info(agent_key); - return info && info->is_plugin(); -} } // namespace Slic3r diff --git a/src/slic3r/Utils/NetworkAgentFactory.hpp b/src/slic3r/Utils/NetworkAgentFactory.hpp index cfff6fb1c7..a055b19493 100644 --- a/src/slic3r/Utils/NetworkAgentFactory.hpp +++ b/src/slic3r/Utils/NetworkAgentFactory.hpp @@ -166,8 +166,6 @@ public: static void register_python_printer_agent(const std::string& plugin_key, const std::string& capability_name); static void deregister_python_printer_agent(const std::string& plugin_key, const std::string& capability_name); - static bool is_current_printer_agent_plugin(); - private: // Factory is not instantiable NetworkAgentFactory() = delete; From 79dcace1acfd1d9a66a7eda20c1e7e685c091bd2 Mon Sep 17 00:00:00 2001 From: Ian Chua Date: Tue, 4 Aug 2026 21:26:50 +0800 Subject: [PATCH 055/106] Add unsupported-command feedback to the device UI --- src/slic3r/GUI/DeviceManager.cpp | 34 ++++++++++++++++++++++++++++++++ src/slic3r/GUI/DeviceManager.hpp | 2 ++ 2 files changed, 36 insertions(+) diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index 5499694686..ef85870461 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -4647,6 +4647,40 @@ void MachineObject::set_ctt_dlg( wxString text){ } } +void MachineObject::show_unsupported_dlg(int code) +{ + // why: a dead control invites repeat clicks, and the frame is modeless - without the guard + // every click stacks another one. Same shape as set_ctt_dlg above, including the reset on + // both hide and close so a dismissed dialog can reappear on the next attempt. + if (m_unsupported_dlg_shown) { + return; + } + m_unsupported_dlg_shown = true; + + // why: two codes so the user learns which kind of dead end this is - the slicer having no + // translation for the command, or the printer's own config lacking the hardware to run it. + const wxString text = (code == ORCA_NETWORK_ERR_CAP_NOT_AVAILABLE) ? + _L("This printer is not configured with the hardware this control needs.") : + _L("This control is not supported on this printer."); + + // note: constructed directly rather than through CallAfter because every publish_json caller + // is on the UI thread - clicks come from wx handlers, and the agent marshals its own push + // callbacks back to main before parse_json runs. set_ctt_dlg relies on the same property. + auto unsupported_dlg = new GUI::SecondaryCheckDialog(nullptr, wxID_ANY, _L("Warning"), + GUI::SecondaryCheckDialog::VisibleButtons::ONLY_CONFIRM); + unsupported_dlg->update_text(text); + unsupported_dlg->Bind(wxEVT_SHOW, [this](auto& e) { + if (!e.IsShown()) { + m_unsupported_dlg_shown = false; + } + }); + unsupported_dlg->Bind(wxEVT_CLOSE_WINDOW, [this](auto& e) { + e.Skip(); + m_unsupported_dlg_shown = false; + }); + unsupported_dlg->on_show(); +} + int MachineObject::publish_gcode(std::string gcode_str) { json j; diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index 456901cf84..2790e37cfa 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -272,9 +272,11 @@ public: bool m_is_online; bool m_lan_mode_connection_state{false}; bool m_set_ctt_dlg{ false }; + bool m_unsupported_dlg_shown{ false }; void set_lan_mode_connection_state(bool state) {m_lan_mode_connection_state = state;}; bool get_lan_mode_connection_state() {return m_lan_mode_connection_state;}; void set_ctt_dlg( wxString text); + void show_unsupported_dlg(int code); int parse_msg_count = 0; int keep_alive_count = 0; std::chrono::system_clock::time_point last_update_time; /* last received print data from machine */ From 59155f26ac05d38817835d408a435f207b251477 Mon Sep 17 00:00:00 2001 From: Ian Bassi Date: Tue, 4 Aug 2026 10:56:15 -0300 Subject: [PATCH 056/106] Build Arch Fix (#15107) Arch Fix --- src/libslic3r/AABBTreeLines.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/AABBTreeLines.hpp b/src/libslic3r/AABBTreeLines.hpp index 97ad1bdf44..52c4cdf545 100644 --- a/src/libslic3r/AABBTreeLines.hpp +++ b/src/libslic3r/AABBTreeLines.hpp @@ -31,8 +31,9 @@ namespace AABBTreeLines { inline VectorType closest_point_to_origin(size_t primitive_index, ScalarType& squared_distance) const { Vec nearest_point; + Vec cast_origin = origin.template cast(); const LineType& line = lines[primitive_index]; - squared_distance = line_alg::distance_to_squared(line, origin.template cast(), &nearest_point); + squared_distance = line_alg::distance_to_squared(line, cast_origin, &nearest_point); return nearest_point.template cast(); } }; From 82759d3899745efbacc10e5bf9737cc5b23097dd Mon Sep 17 00:00:00 2001 From: Kris Austin Date: Tue, 4 Aug 2026 09:01:45 -0500 Subject: [PATCH 057/106] fix: make the error dialog caret point at the character it's blaming (#14886) * fix: make the error dialog caret point at the character it's blaming Custom G-code parse errors print the offending line with a '^' under the character that broke, positioned with spaces so it only lines up in a fixed-width font. Since v2.3.2 these dialogs rendered entirely in the proportional UI font, so the caret drifted left of its column and landed on unrelated text. Render only the code excerpts (the offending source line and its caret) in the fixed-width face, leaving the surrounding prose in the UI font, and reserve the horizontal scrollbar's height so a long line does not clip. Rename the flag to has_code_excerpts to match what it now means. Fixes #14869 * refactor(GUI): use instead of for error excerpts wxHTML maps , , and to the same fixed-width handler, so this renders identically. is the non-deprecated tag and matches what the original code used. * fix(GUI): align the error caret with real spaces, not   The caret line was padded with   so its spaces would survive inline HTML. wxHTML measures every glyph by its font extent, so where the fixed font lacks a U+00A0 glyph the fallback renders it about twice as wide, and the all-  caret line outran the source, drifting the ^ to the right. Wrap the excerpts in a small tag, registered on the dialog's own parser, that switches on wxHTML literal-whitespace mode so the caret uses real spaces that match the source column in any font. It sits inside for the fixed face;
 would do both but forces a blank line above it.

---------

Co-authored-by: Noisyfox 
---
 src/libslic3r/PlaceholderParser.cpp |   2 +
 src/slic3r/GUI/GUI.cpp              |   8 +-
 src/slic3r/GUI/GUI.hpp              |  10 +--
 src/slic3r/GUI/MsgDialog.cpp        | 124 ++++++++++++++++++++++++----
 src/slic3r/GUI/MsgDialog.hpp        |   6 +-
 5 files changed, 120 insertions(+), 30 deletions(-)

diff --git a/src/libslic3r/PlaceholderParser.cpp b/src/libslic3r/PlaceholderParser.cpp
index e3a4037590..3e29e0c172 100644
--- a/src/libslic3r/PlaceholderParser.cpp
+++ b/src/libslic3r/PlaceholderParser.cpp
@@ -1791,6 +1791,8 @@ namespace client
             // from UTF8 to UTF16 don't bail out.
             msg += boost::nowide::narrow(boost::nowide::widen(error_line));
             msg += '\n';
+            // The error dialog (MsgDialog.cpp) renders this excerpt monospaced. It recognizes a source
+            // line directly above a caret line of spaces and a single '^'.
             for (size_t i = 0; i < error_pos; ++ i)
                 msg += ' ';
             msg += "^\n";
diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp
index 554ecd4a4e..29f8fc9749 100644
--- a/src/slic3r/GUI/GUI.cpp
+++ b/src/slic3r/GUI/GUI.cpp
@@ -256,18 +256,18 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt
 	}
 }
 
-void show_error(wxWindow* parent, const wxString& message, bool monospaced_font)
+void show_error(wxWindow* parent, const wxString& message, bool has_code_excerpts)
 {
     wxGetApp().CallAfter([=] {
-        ErrorDialog msg(parent, message, monospaced_font);
+        ErrorDialog msg(parent, message, has_code_excerpts);
         msg.ShowModal();
     });
 }
 
-void show_error(wxWindow* parent, const char* message, bool monospaced_font)
+void show_error(wxWindow* parent, const char* message, bool has_code_excerpts)
 {
 	assert(message);
-	show_error(parent, wxString::FromUTF8(message), monospaced_font);
+	show_error(parent, wxString::FromUTF8(message), has_code_excerpts);
 }
 
 void show_error_id(int id, const std::string& message)
diff --git a/src/slic3r/GUI/GUI.hpp b/src/slic3r/GUI/GUI.hpp
index 357fd20a97..db882b79cf 100644
--- a/src/slic3r/GUI/GUI.hpp
+++ b/src/slic3r/GUI/GUI.hpp
@@ -40,11 +40,11 @@ extern void add_menus(wxMenuBar *menu, int event_preferences_changed, int event_
 // Change option value in config
 void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt_key, const boost::any& value, int opt_index = 0);
 
-// If monospaced_font is true, the error message is displayed using html 
tags, -// so that the code formatting will be preserved. This is useful for reporting errors from the placeholder parser. -void show_error(wxWindow* parent, const wxString& message, bool monospaced_font = false); -void show_error(wxWindow* parent, const char* message, bool monospaced_font = false); -inline void show_error(wxWindow* parent, const std::string& message, bool monospaced_font = false) { show_error(parent, message.c_str(), monospaced_font); } +// If has_code_excerpts is true, code excerpts (a source line and the caret line below it) render +// monospaced so the caret aligns. Used for placeholder-parser errors. +void show_error(wxWindow* parent, const wxString& message, bool has_code_excerpts = false); +void show_error(wxWindow* parent, const char* message, bool has_code_excerpts = false); +inline void show_error(wxWindow* parent, const std::string& message, bool has_code_excerpts = false) { show_error(parent, message.c_str(), has_code_excerpts); } void show_error_id(int id, const std::string& message); // For Perl void show_info(wxWindow* parent, const wxString& message, const wxString& title = wxString()); void show_info(wxWindow* parent, const char* message, const char* title = nullptr); diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp index ebf4db6846..7f1effd162 100644 --- a/src/slic3r/GUI/MsgDialog.cpp +++ b/src/slic3r/GUI/MsgDialog.cpp @@ -9,8 +9,13 @@ #include #include #include +#include + +#include #include +#include +#include #include "libslic3r/libslic3r.h" #include "libslic3r/Utils.hpp" @@ -229,12 +234,82 @@ void MsgDialog::finalize() } +// A placeholder-parser caret line, pointing at the column where parsing failed. +static bool is_caret_line(const std::string &line) +{ + return std::count(line.begin(), line.end(), '^') == 1 && + std::all_of(line.begin(), line.end(), [](char c) { return c == ' ' || c == '^'; }); +} + +// Tag each line as a code excerpt (a caret line or the source line above one) that must stay +// monospaced for the '^' to align. +static std::vector> classify_code_lines(const std::string &msg) +{ + std::vector lines; + boost::split(lines, msg, boost::is_any_of("\n")); + for (std::string &line : lines) + if (!line.empty() && line.back() == '\r') + line.pop_back(); + + std::vector> tagged; + tagged.reserve(lines.size()); + for (size_t i = 0; i < lines.size(); ++i) { + bool is_code = is_caret_line(lines[i]) || (i + 1 < lines.size() && is_caret_line(lines[i + 1])); + tagged.emplace_back(std::move(lines[i]), is_code); + } + return tagged; +} + +// Keeps whitespace literal so the caret's leading spaces survive. +// Used inside , which supplies the fixed face.
 does both but adds a blank line above it.
+class CodeExcerptTagHandler : public wxHtmlWinTagHandler
+{
+public:
+    wxString GetSupportedTags() override { return wxT("EXCERPT"); }
+    bool     HandleTag(const wxHtmlTag &tag) override
+    {
+        const wxHtmlWinParser::WhitespaceMode ws = m_WParser->GetWhitespaceMode();
+        m_WParser->SetWhitespaceMode(wxHtmlWinParser::Whitespace_Pre);
+        ParseInner(tag);
+        m_WParser->SetWhitespaceMode(ws);
+        return true;
+    }
+};
+
+// Render the message as HTML, monospacing only the code excerpts.
+static std::string format_parser_error_html(const std::string &msg)
+{
+    std::string out;
+    for (const auto &[text, is_code] : classify_code_lines(msg)) {
+        if (!out.empty()) out += "
"; // join, not trail; a trailing
forces a scrollbar + std::string escaped = xml_escape(text); + if (is_code) + out += "" + escaped + ""; + else + out += escaped; + } + return out; +} + +// Measure each line in the font it will render in, so the dialog fits the longest line without slack. +static wxSize measure_mixed_text(wxWindow *parent, const std::string &msg, const wxFont &prose_font, const wxFont &code_font) +{ + wxClientDC dc(parent); + int width = 0, height = 0; + for (const auto &[text, is_code] : classify_code_lines(msg)) { + dc.SetFont(is_code ? code_font : prose_font); + width = std::max(width, dc.GetTextExtent(wxString::FromUTF8(text.c_str())).GetWidth()); + height += dc.GetCharHeight(); + } + return wxSize(width, height); +} + // Text shown as HTML, so that mouse selection and Ctrl-V to copy will work. static void add_msg_content(wxWindow *parent, wxBoxSizer *content_sizer, wxString msg, - bool monospaced_font = false, - bool is_marked_msg = false, + bool has_code_excerpts = false, + bool is_marked_msg = false, const wxString &link_text = "", std::function link_callback = nullptr) { @@ -243,7 +318,7 @@ static void add_msg_content(wxWindow *parent, // count lines in the message int msg_lines = 0; - if (!monospaced_font) { + if (!has_code_excerpts) { int line_len = 55;// count of symbols in one line int start_line = 0; for (auto i = msg.begin(); i != msg.end(); ++i) { @@ -300,13 +375,23 @@ static void add_msg_content(wxWindow *parent, page_size = wxSize(info_width, page_height); } else { - wxClientDC dc(parent); - dc.SetFont(font); // ORCA without this it calculates bigger size - wxSize msg_sz = dc.GetMultiLineTextExtent(msg) + parent->FromDIP(wxSize(10,5)); // added extra spacing to prevent wrapping + wxSize msg_sz; + if (has_code_excerpts) { + msg_sz = measure_mixed_text(parent, msg.ToUTF8().data(), font, monospace); + } else { + wxClientDC dc(parent); + dc.SetFont(font); // ORCA without this it calculates bigger size + msg_sz = dc.GetMultiLineTextExtent(msg); + } + msg_sz += parent->FromDIP(wxSize(10,5)); // added extra spacing to prevent wrapping - page_size = wxSize(std::min(msg_sz.GetX(), info_width), std::min(msg_sz.GetY(), info_width)); + int page_height = msg_sz.GetY(); + // Reserve the horizontal scrollbar's height, or it clips the last line. + if (msg_sz.GetX() > info_width) + page_height += wxSystemSettings::GetMetric(wxSYS_HSCROLL_Y, parent); + page_size = wxSize(std::min(msg_sz.GetX(), info_width), std::min(page_height, info_width)); // Extra line breaks in message dialog - if (link_text.IsEmpty() && !link_callback && is_marked_msg == false) {//for common text + if (link_text.IsEmpty() && !link_callback && is_marked_msg == false && !has_code_excerpts) {//for common text html->Destroy(); if (msg_sz.GetX() < info_width) {//No need for line breaks info_width = msg_sz.GetX(); @@ -337,12 +422,15 @@ static void add_msg_content(wxWindow *parent, } html->SetMinSize(page_size); - std::string msg_escaped = xml_escape(msg.ToUTF8().data(), is_marked_msg); - boost::replace_all(msg_escaped, "\r\n", "
"); - boost::replace_all(msg_escaped, "\n", "
"); - if (monospaced_font) - // Code formatting will be preserved. This is useful for reporting errors from the placeholder parser. - msg_escaped = std::string("
") + msg_escaped + "
"; + std::string msg_escaped; + if (has_code_excerpts) { + html->GetParser()->AddTagHandler(new CodeExcerptTagHandler()); + msg_escaped = format_parser_error_html(msg.ToUTF8().data()); + } else { + msg_escaped = xml_escape(msg.ToUTF8().data(), is_marked_msg); + boost::replace_all(msg_escaped, "\r\n", "
"); + boost::replace_all(msg_escaped, "\n", "
"); + } if (!link_text.IsEmpty() && link_callback) { msg_escaped += "" + std::string(link_text.ToUTF8().data()) + ""; @@ -360,15 +448,15 @@ static void add_msg_content(wxWindow *parent, // ErrorDialog -ErrorDialog::ErrorDialog(wxWindow *parent, const wxString &temp_msg, bool monospaced_font) +ErrorDialog::ErrorDialog(wxWindow *parent, const wxString &temp_msg, bool has_code_excerpts) : MsgDialog(parent, wxString::Format(_(L("%s error")), SLIC3R_APP_FULL_NAME), wxString::Format(_(L("%s has encountered an error")), SLIC3R_APP_FULL_NAME), wxOK) , msg(temp_msg) { - add_msg_content(this, content_sizer, msg, monospaced_font); + add_msg_content(this, content_sizer, msg, has_code_excerpts); - // Use a small bitmap with monospaced font, as the error text will not be wrapped. - logo->SetBitmap(create_scaled_bitmap("OrcaSlicer_192px_grayscale.png", this, monospaced_font ? 48 : /*1*/64)); + // Use a small bitmap for code excerpts, which cannot wrap and so need the width. + logo->SetBitmap(create_scaled_bitmap("OrcaSlicer_192px_grayscale.png", this, has_code_excerpts ? 48 : /*1*/64)); SetMaxSize(MSG_DLG_MAX_SIZE); diff --git a/src/slic3r/GUI/MsgDialog.hpp b/src/slic3r/GUI/MsgDialog.hpp index 174d734336..90fd160310 100644 --- a/src/slic3r/GUI/MsgDialog.hpp +++ b/src/slic3r/GUI/MsgDialog.hpp @@ -106,9 +106,9 @@ protected: class ErrorDialog : public MsgDialog { public: - // If monospaced_font is true, the error message is displayed using html
tags, - // so that the code formatting will be preserved. This is useful for reporting errors from the placeholder parser. - ErrorDialog(wxWindow *parent, const wxString &temp_msg, bool courier_font); + // If has_code_excerpts is true, code excerpts (a source line and the caret line below it) render + // monospaced so the caret aligns. Used for placeholder-parser errors. + ErrorDialog(wxWindow *parent, const wxString &temp_msg, bool has_code_excerpts); ErrorDialog(ErrorDialog &&) = delete; ErrorDialog(const ErrorDialog &) = delete; ErrorDialog &operator=(ErrorDialog &&) = delete; From 1d078e005a1bff17f05745d7672a0bd1c5f7cc60 Mon Sep 17 00:00:00 2001 From: Ian Bassi Date: Tue, 4 Aug 2026 11:37:05 -0300 Subject: [PATCH 058/106] Mouse ear Wiki redirect (#15115) Based in https://github.com/OrcaSlicer/OrcaSlicer/pull/15015 and https://github.com/OrcaSlicer/OrcaSlicer_WIKI/pull/323 --- src/slic3r/GUI/Tab.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index c436d70a15..0c38977c74 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3077,7 +3077,7 @@ void TabPrint::build() optgroup->append_single_option_line("combine_brims", "others_settings_brim#combine-brims"); optgroup->append_single_option_line("brim_ears_max_angle", "others_settings_brim#ear-max-angle"); optgroup->append_single_option_line("brim_ears_detection_length", "others_settings_brim#ear-detection-radius"); - optgroup->append_single_option_line("brim_ears_outer_only"); + optgroup->append_single_option_line("brim_ears_outer_only", "others_settings_brim#brim-ears-outer-only"); optgroup = page->new_optgroup(L("Special mode"), L"param_special"); optgroup->append_single_option_line("slicing_mode", "others_settings_special_mode#slicing-mode"); From 0051768206bd3ba082e75e7a09d5906d438dedfd Mon Sep 17 00:00:00 2001 From: SoftFever Date: Wed, 5 Aug 2026 00:09:46 +0800 Subject: [PATCH 059/106] Smooth out the spiral lift when arc fitting is disabled (#15118) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The linear approximation used a heuristic segment count clamped to 4..16, so the lift ran as a coarse polygon. Every vertex is a direction change large enough to hit the firmware's jerk limit, forcing a decelerate/accelerate at each corner — the lift micro-stutters instead of running at speed. The segment count now comes from the chord deviation against the slicing resolution, reusing Geometry::ArcWelder::arc_discretization_steps, which keeps the turn at each vertex shallow enough for the firmware to carry speed through the whole move. Points are emitted through GCodeG1Formatter so they carry the same quantization as the rest of the G-code, and the move comment now trails the feedrate line to match _travel_to_z and the G2/G3 branch. No change when arc fitting is enabled. --- src/libslic3r/GCodeWriter.cpp | 52 +++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index e3d1c30362..0e80cc1fb7 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -3,6 +3,7 @@ #include "I18N.hpp" #include "PrintConfig.hpp" #include "ClipperUtils.hpp" +#include "Geometry/ArcWelder.hpp" #include "Line.hpp" #include #include @@ -1018,45 +1019,48 @@ std::string GCodeWriter::_spiral_travel_to_z(double z, const Vec2d &ij_offset, c } if (!this->config.enable_arc_fitting) { // Orca: if arc fitting is disabled, approximate the arc with small linear segments - std::ostringstream oss; const double z_start = m_pos(2); // starting Z height - // -------------------------------------------------------------------- - // Determine number of segments based on Resolution - // -------------------------------------------------------------------- - const double ref_resolution = 0.01; // reference resolution in mm - const double ref_segments = 8.0; // reference number of segments at reference resolution - - // number of linear segments to use for approximating the arc, clamp between 4 and 16 - const int segments = std::clamp(int(std::round(ref_segments * (ref_resolution / m_resolution))), 4, 16); - // -------------------------------------------------------------------- - const double px = m_pos(0) - m_x_offset; // take plate offset into consideration const double py = m_pos(1) - m_y_offset; // take plate offset into consideration const double cx = px + ij_offset(0); // center x const double cy = py + ij_offset(1); // center y const double radius = ij_offset.norm(); // radius + + // Number of linear segments approximating the circle, chosen so that a chord never deviates + // from the true arc by more than the slicing resolution. A resolution of 0 means "no + // simplification", which has no finite segment count, so it takes the upper bound. + constexpr size_t min_segments = 8; // keep a small spiral visibly round + constexpr size_t max_segments = 128; // bound the emitted G-code + const int segments = int(m_resolution > 0. ? + std::clamp(Geometry::ArcWelder::arc_discretization_steps(radius, 2. * M_PI, m_resolution), min_segments, max_segments) : + max_segments); + const double a0 = std::atan2(py - cy, px - cx); // start angle - const double delta = 2.0 * M_PI; // CCW full circle - if (full_gcode_comment) - oss << ";" << comment << "\n"; + auto emit_point = [&output](const Vec3d &point) { + GCodeG1Formatter w; + w.emit_xyz(point); + output += w.string(); + }; - oss << "G1 F" << (speed * 60.0) << "\n"; // set feedrate + output.reserve(size_t(segments) * 40); // ~40 characters per emitted G1 line + + GCodeG1Formatter w; // set feedrate + w.emit_f(speed * 60.0); + w.emit_comment(GCodeWriter::full_gcode_comment, comment); + output += w.string(); // approximate the arc with small linear segments (without the last point which is added later to ensure exactness) for (int i = 1; i < segments; ++i) { - double t = double(i) / segments; // parametric position along arc - double a = a0 + delta * t; // CCW arc param - double x = cx + radius * std::cos(a); // point on circle - double y = cy + radius * std::sin(a); // point on circle - double zz = z_start + (z - z_start) * t; // interpolated Z height - - oss << "G1 X" << x << " Y" << y << " Z" << zz << "\n"; + const double t = double(i) / segments; // parametric position along arc + const double a = a0 + 2. * M_PI * t; // CCW arc param, full circle + emit_point(Vec3d(cx + radius * std::cos(a), // point on circle + cy + radius * std::sin(a), + z_start + (z - z_start) * t)); // interpolated Z height } - oss << "G1 X" << px << " Y" << py << " Z" << z << "\n"; // final point to ensure exactness - output = oss.str(); + emit_point(Vec3d(px, py, z)); // final point to ensure exactness } else { // Orca: if arc fitting is enabled emit a G2/G3 command for the spiral lift output = std::string("G17") + (full_gcode_comment ? " ; XY plane for arc\n" : "\n"); From 6312caaf134c0b093fdb1ae4b69b2f54956ccd59 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Wed, 5 Aug 2026 00:13:27 +0800 Subject: [PATCH 060/106] Add filament_retract_length_toolchange/filament_retract_restart_extra_toolchange config and update tool changer printer's profiles (#15039) * update snapmaker profiles. largely ported for Snapmaker Orca fork * update prime volume * set precise_outer_wall to 1 * Update per-material multi-tool ramming to the filament library * Add per-filament overrides for toolchange retraction * Set toolchange retraction per filament for Snapmaker U1 * set default support type to tree * format snapmaker profiles --- resources/profiles/Custom.json | 2 +- .../filament/Generic ABS @MyToolChanger.json | 6 - .../filament/Generic ASA @MyToolChanger.json | 6 - .../filament/Generic PA @MyToolChanger.json | 6 - .../Generic PA-CF @MyToolChanger.json | 6 - .../filament/Generic PC @MyToolChanger.json | 6 - .../filament/Generic PETG @MyToolChanger.json | 6 - .../filament/Generic PLA @MyToolChanger.json | 6 - .../Generic PLA-CF @MyToolChanger.json | 6 - .../filament/Generic PVA @MyToolChanger.json | 6 - .../Custom/machine/fdm_klipper_common.json | 2 +- .../Custom/machine/fdm_repetier_common.json | 2 +- .../Custom/machine/fdm_rrf_common.json | 2 +- .../machine/fdm_toolchanger_common.json | 10 +- resources/profiles/OrcaFilamentLibrary.json | 2 +- .../filament/Bambu/Bambu PET-CF @base.json | 3 + .../Bambu/Bambu PETG Basic @base.json | 3 + .../Bambu/Bambu PETG Translucent @base.json | 3 + .../filament/Bambu/Bambu PLA Aero @base.json | 3 + .../Bambu Support For PLA-PETG @base.json | 3 + .../Bambu/Bambu Support for ABS @base.json | 3 + .../filament/COEX/COEX TPU 60A @base.json | 3 + .../filament/Elas/Elas ASA @base.json | 42 --- .../filament/Elas/Elas PETG Basic @base.json | 42 --- .../filament/Elas/Elas PLA Basic @base.json | 42 --- .../filament/Elas/Elas PLA Pro @base.json | 42 --- .../Elegoo/Elegoo PAHT-CF @System.json | 3 + .../filament/Elegoo/Elegoo PETG @base.json | 3 + .../Elegoo/Elegoo PLA Wood @System.json | 3 + .../Eolas Prints PLA Neon @System.json | 3 + .../Eolas Prints PLA Silk @System.json | 3 + .../filament/Generic PA-CF @System.json | 3 + .../filament/Generic PETG HF @System.json | 3 + .../filament/Generic PETG-CF @System.json | 3 + .../Generic PLA High Speed @System.json | 3 + .../filament/Generic PLA Matte @System.json | 3 + .../filament/Generic PP-CF @System.json | 3 + .../filament/Generic PP-GF @System.json | 3 + .../Overture/Overture Air PLA @base.json | 3 + .../Valment/Valment PLA Silk @base.json | 3 + .../filament/base/fdm_filament_abs.json | 6 + .../filament/base/fdm_filament_asa.json | 6 + .../filament/base/fdm_filament_bvoh.json | 9 + .../filament/base/fdm_filament_common.json | 6 + .../filament/base/fdm_filament_cope.json | 3 + .../filament/base/fdm_filament_eva.json | 3 + .../filament/base/fdm_filament_hips.json | 3 + .../filament/base/fdm_filament_pa.json | 3 + .../filament/base/fdm_filament_paht.json | 3 + .../filament/base/fdm_filament_pc.json | 3 + .../filament/base/fdm_filament_pctg.json | 3 + .../filament/base/fdm_filament_pe.json | 3 + .../filament/base/fdm_filament_pet.json | 3 + .../filament/base/fdm_filament_pha.json | 3 + .../filament/base/fdm_filament_pla.json | 3 + .../filament/base/fdm_filament_pla_silk.json | 3 + .../filament/base/fdm_filament_pp.json | 3 + .../filament/base/fdm_filament_ppa.json | 3 + .../filament/base/fdm_filament_pps.json | 3 + .../filament/base/fdm_filament_pva.json | 9 + .../filament/base/fdm_filament_sbs.json | 3 + .../filament/base/fdm_filament_tpu.json | 9 + .../filament/eSUN/eSUN PLA-Marble @base.json | 3 + .../filament/eSUN/eSUN PLA-Matte @base.json | 3 + .../filament/eSUN/eSUN ePLA-LW @System.json | 3 + resources/profiles/Snapmaker.json | 278 ++++++++++++++++- .../Polymaker General PLA Family @U1.json | 32 ++ .../filament/Polymaker PLA @U1 base.json | 107 +++++++ .../Polymaker Silk PLA Family @U1.json | 32 ++ .../Polymaker Tough PLA Family @U1.json | 32 ++ .../Fiberon ASA-CF08 @Snapmaker U1.json | 1 - .../Fiberon PA12-CF10 @Snapmaker U1.json | 1 - .../Fiberon PA6-CF20 @Snapmaker U1.json | 1 - .../Fiberon PETG-ESD @Snapmaker U1.json | 1 - .../PolyLite Dual PLA @0.2 nozzle.json | 6 +- .../PolyLite J1 PLA @0.2 nozzle.json | 6 +- .../filament/Polymaker/PolyLite J1 PLA.json | 6 +- .../Polymaker/PolyLite PETG @Base.json | 10 +- .../PolyLite PETG @Snapmaker U1.json | 1 - ...lyLite PETG Translucent @Snapmaker U1.json | 1 - .../Polymaker/PolyLite PLA @0.2 nozzle.json | 6 +- .../Polymaker/PolyLite PLA @base.json | 6 +- .../PolyTerra Dual PLA @0.2 nozzle.json | 6 +- .../PolyTerra J1 PLA @0.2 nozzle.json | 6 +- .../filament/Polymaker/PolyTerra J1 PLA.json | 6 +- .../Polymaker/PolyTerra PLA @0.2 nozzle.json | 6 +- .../Polymaker/Polymaker HT-PLA @Base.json | 10 +- .../Polymaker/Polymaker HT-PLA-GF @Base.json | 10 +- .../Polymaker/Polymaker PETG @Base.json | 10 +- .../Polymaker/Polymaker PLA Pro @Base.json | 10 +- .../Snapmaker/filament/Snapmaker ABS @U1.json | 3 + .../Snapmaker/filament/Snapmaker ASA @U1.json | 3 + ...akaway Support For PLA @U1 0.2 nozzle.json | 104 +++++++ ...akaway Support For PLA @U1 0.6 nozzle.json | 104 +++++++ ...akaway Support For PLA @U1 0.8 nozzle.json | 98 ++++++ ...apmaker Breakaway Support For PLA @U1.json | 78 +++++ .../Snapmaker PETG HF @U1 0.2 nozzle.json | 108 +++++++ .../Snapmaker PETG HF @U1 0.6 nozzle.json | 113 +++++++ .../Snapmaker PETG HF @U1 0.8 nozzle.json | 110 +++++++ .../filament/Snapmaker PETG HF @U1 base2.json | 279 +++++++++++++++++ ...maker PETG Translucent @U1 0.2 nozzle.json | 110 +++++++ ...maker PETG Translucent @U1 0.4 nozzle.json | 98 ++++++ ...maker PETG Translucent @U1 0.6 nozzle.json | 107 +++++++ ...maker PETG Translucent @U1 0.8 nozzle.json | 104 +++++++ .../Snapmaker PETG Translucent @U1 base.json | 8 + .../Snapmaker PLA Basic @U1 base.json | 127 ++++++++ .../filament/Snapmaker PLA Basic @U1.json | 284 +++++++++++++++++ ...aker PLA Full Spectrum @U1 0.4 nozzle.json | 284 +++++++++++++++++ .../Snapmaker PLA Glow @U1 0.4 nozzle.json | 95 ++++++ .../filament/Snapmaker PLA Glow @U1 base.json | 44 +++ .../Snapmaker PLA Matte @U1 0.2 nozzle.json | 287 ++++++++++++++++++ .../Snapmaker PLA Matte @U1 0.6 nozzle.json | 287 ++++++++++++++++++ .../Snapmaker PLA Matte @U1 0.8 nozzle.json | 287 ++++++++++++++++++ .../Snapmaker PLA Matte @U1 base2.json | 127 ++++++++ .../filament/Snapmaker PLA Matte @U1.json | 26 +- .../Snapmaker PLA Metal @U1 base.json | 3 - .../Snapmaker PLA Silk @U1 0.2 nozzle.json | 285 +++++++++++++++++ .../Snapmaker PLA Silk @U1 0.6 nozzle.json | 285 +++++++++++++++++ .../Snapmaker PLA Silk @U1 0.8 nozzle.json | 285 +++++++++++++++++ .../filament/Snapmaker PLA Silk @U1 base.json | 3 - .../filament/Snapmaker PLA Silk @U1.json | 276 ++++++++++++++++- ...napmaker PLA SnapSpeed @U1 0.2 nozzle.json | 50 +++ ...napmaker PLA SnapSpeed @U1 0.6 nozzle.json | 41 +++ ...napmaker PLA SnapSpeed @U1 0.8 nozzle.json | 41 +++ .../Snapmaker PLA SnapSpeed @U1 base2.json | 281 +++++++++++++++++ .../filament/Snapmaker PLA SnapSpeed @U1.json | 42 +-- ...pmaker PLA Translucent @U1 0.2 nozzle.json | 284 +++++++++++++++++ ...pmaker PLA Translucent @U1 0.4 nozzle.json | 284 +++++++++++++++++ ...pmaker PLA Translucent @U1 0.6 nozzle.json | 284 +++++++++++++++++ ...pmaker PLA Translucent @U1 0.8 nozzle.json | 284 +++++++++++++++++ .../Snapmaker PLA Translucent @U1 base.json | 44 +++ .../Snapmaker PLA Wood @U1 0.4 nozzle.json | 108 +++++++ .../Snapmaker PLA Wood @U1 0.6 nozzle.json | 114 +++++++ .../Snapmaker PLA Wood @U1 0.8 nozzle.json | 114 +++++++ .../Snapmaker PLA-CF @U1 0.4 nozzle.json | 132 ++++++++ .../Snapmaker PLA-CF @U1 0.6 nozzle.json | 138 +++++++++ .../Snapmaker PLA-CF @U1 0.8 nozzle.json | 135 ++++++++ .../filament/Snapmaker PLA-CF @U1 base.json | 3 - .../filament/Snapmaker PLA-CF @U1.json | 3 + .../Snapmaker PVA @U1 0.6 nozzle.json | 113 +++++++ .../Snapmaker PVA @U1 0.8 nozzle.json | 107 +++++++ .../Snapmaker/filament/Snapmaker PVA @U1.json | 90 ++++++ .../Snapmaker TPU 90A @U1 0.6 nozzle.json | 150 +++++++++ .../Snapmaker TPU 90A @U1 0.8 nozzle.json | 144 +++++++++ .../filament/Snapmaker TPU 90A @U1.json | 141 +++++++++ .../filament/Snapmaker TPU 95A @U1 base.json | 3 - .../Snapmaker TPU 95A HF @U1 0.6 nozzle.json | 147 +++++++++ .../Snapmaker TPU 95A HF @U1 0.8 nozzle.json | 147 +++++++++ .../filament/Snapmaker TPU 95A HF @U1.json | 144 +++++++++ .../machine/Snapmaker U1 (0.2 nozzle).json | 172 ++++++++++- .../machine/Snapmaker U1 (0.4 nozzle).json | 99 ++---- .../Snapmaker U1 (0.4+0.6 nozzle).json | 6 +- .../machine/Snapmaker U1 (0.6 nozzle).json | 180 ++++++++++- .../machine/Snapmaker U1 (0.8 nozzle).json | 172 ++++++++++- .../profiles/Snapmaker/machine/fdm_U1.json | 8 +- ...gh Quality @Snapmaker U1 (0.2 nozzle).json | 70 ++--- ...6 Standard @Snapmaker U1 (0.2 nozzle).json | 62 ++-- ...Extra Fine @Snapmaker U1 (0.4 nozzle).json | 15 +- ...gh Quality @Snapmaker U1 (0.2 nozzle).json | 70 ++--- ...gh Quality @Snapmaker U1 (0.4 nozzle).json | 14 +- ...8 Standard @Snapmaker U1 (0.2 nozzle).json | 62 ++-- ...gh Quality @Snapmaker U1 (0.2 nozzle).json | 70 ++--- ...0 Standard @Snapmaker U1 (0.2 nozzle).json | 66 ++-- .../0.12 Fine @Snapmaker U1 (0.4 nozzle).json | 15 +- ...gh Quality @Snapmaker U1 (0.4 nozzle).json | 17 +- ...2 Standard @Snapmaker U1 (0.2 nozzle).json | 62 ++-- ...4 Standard @Snapmaker U1 (0.2 nozzle).json | 62 ++-- ...gh Quality @Snapmaker U1 (0.4 nozzle).json | 15 +- ...16 Optimal @Snapmaker U1 (0.4 nozzle).json | 14 +- ...8 Standard @Snapmaker U1 (0.6 nozzle).json | 70 ++--- ... Support W @Snapmaker U1 (0.4 nozzle).json | 23 -- ...20 Quality @Snapmaker U1 (0.4 nozzle).json | 1 + ...0 Standard @Snapmaker U1 (0.4 nozzle).json | 2 + ...andard @Snapmaker U1 (0.4+0.6 nozzle).json | 1 + ...0 Standard @Snapmaker U1 (0.6 nozzle).json | 1 + ...0 Strength @Snapmaker U1 (0.4 nozzle).json | 14 +- ...20 Support @Snapmaker U1 (0.4 nozzle).json | 2 + ... Support W @Snapmaker U1 (0.4 nozzle).json | 2 + ...0.24 Draft @Snapmaker U1 (0.4 nozzle).json | 14 +- ...4 Standard @Snapmaker U1 (0.6 nozzle).json | 69 ++--- ...4 Standard @Snapmaker U1 (0.8 nozzle).json | 71 ++--- ...xtra Draft @Snapmaker U1 (0.4 nozzle).json | 16 +- ...0.30 Draft @Snapmaker U1 (0.6 nozzle).json | 2 + ...0 Standard @Snapmaker U1 (0.6 nozzle).json | 67 ++-- ...0 Strength @Snapmaker U1 (0.6 nozzle).json | 71 ++--- ...2 Standard @Snapmaker U1 (0.8 nozzle).json | 74 ++--- ...6 Standard @Snapmaker U1 (0.6 nozzle).json | 69 ++--- ...xtra Draft @Snapmaker U1 (0.6 nozzle).json | 2 + ...0 Standard @Snapmaker U1 (0.8 nozzle).json | 76 ++--- ...2 Standard @Snapmaker U1 (0.6 nozzle).json | 69 ++--- ...8 Standard @Snapmaker U1 (0.8 nozzle).json | 71 ++--- ...6 Standard @Snapmaker U1 (0.8 nozzle).json | 68 ++--- .../Snapmaker/process/fdm_process_U1.json | 1 - .../fdm_process_U1_0.06_nozzle_0.2.json | 27 ++ .../fdm_process_U1_0.08_nozzle_0.2.json | 27 ++ .../fdm_process_U1_0.10_nozzle_0.2.json | 27 ++ .../fdm_process_U1_0.12_nozzle_0.2.json | 27 ++ .../fdm_process_U1_0.14_nozzle_0.2.json | 27 ++ .../fdm_process_U1_0.18_nozzle_0.6.json | 26 ++ .../fdm_process_U1_0.24_nozzle_0.6.json | 24 ++ .../fdm_process_U1_0.24_nozzle_0.8.json | 26 ++ .../fdm_process_U1_0.30_nozzle_0.6.json | 24 ++ .../fdm_process_U1_0.32_nozzle_0.8.json | 26 ++ .../fdm_process_U1_0.36_nozzle_0.6.json | 24 ++ .../fdm_process_U1_0.40_nozzle_0.8.json | 26 ++ .../fdm_process_U1_0.42_nozzle_0.6.json | 24 ++ .../fdm_process_U1_0.48_nozzle_0.8.json | 26 ++ .../fdm_process_U1_0.56_nozzle_0.8.json | 26 ++ .../process/fdm_process_U1_0.6_common.json | 2 +- .../process/fdm_process_U1_common.json | 13 +- .../Snapmaker/process/fdm_process_a400.json | 2 +- .../Snapmaker/process/fdm_process_common.json | 2 +- .../Snapmaker/process/fdm_process_idex.json | 2 +- .../Voron/machine/fdm_klipper_common.json | 2 +- src/libslic3r/Extruder.cpp | 4 +- src/libslic3r/GCode.cpp | 8 +- src/libslic3r/Preset.cpp | 2 + src/libslic3r/PrintConfig.cpp | 18 +- src/slic3r/GUI/Tab.cpp | 23 +- 219 files changed, 10287 insertions(+), 1263 deletions(-) create mode 100644 resources/profiles/Snapmaker/filament/Polymaker General PLA Family @U1.json create mode 100644 resources/profiles/Snapmaker/filament/Polymaker PLA @U1 base.json create mode 100644 resources/profiles/Snapmaker/filament/Polymaker Silk PLA Family @U1.json create mode 100644 resources/profiles/Snapmaker/filament/Polymaker Tough PLA Family @U1.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1 0.2 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1 0.6 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1 0.8 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PETG HF @U1 0.2 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PETG HF @U1 0.6 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PETG HF @U1 0.8 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PETG HF @U1 base2.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 0.2 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 0.4 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 0.6 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 0.8 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 base.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Basic @U1 base.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Basic @U1.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Full Spectrum @U1 0.4 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Glow @U1 0.4 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Glow @U1 base.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1 0.2 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1 0.6 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1 0.8 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1 base2.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1 0.2 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1 0.6 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1 0.8 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1 0.2 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1 0.6 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1 0.8 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1 base2.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 0.2 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 0.4 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 0.6 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 0.8 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 base.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Wood @U1 0.4 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Wood @U1 0.6 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA Wood @U1 0.8 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1 0.4 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1 0.6 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1 0.8 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PVA @U1 0.6 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker PVA @U1 0.8 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker TPU 90A @U1 0.6 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker TPU 90A @U1 0.8 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker TPU 90A @U1.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker TPU 95A HF @U1 0.6 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker TPU 95A HF @U1 0.8 nozzle.json create mode 100644 resources/profiles/Snapmaker/filament/Snapmaker TPU 95A HF @U1.json delete mode 100644 resources/profiles/Snapmaker/process/0.20 Bambu Support W @Snapmaker U1 (0.4 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/fdm_process_U1_0.06_nozzle_0.2.json create mode 100644 resources/profiles/Snapmaker/process/fdm_process_U1_0.08_nozzle_0.2.json create mode 100644 resources/profiles/Snapmaker/process/fdm_process_U1_0.10_nozzle_0.2.json create mode 100644 resources/profiles/Snapmaker/process/fdm_process_U1_0.12_nozzle_0.2.json create mode 100644 resources/profiles/Snapmaker/process/fdm_process_U1_0.14_nozzle_0.2.json create mode 100644 resources/profiles/Snapmaker/process/fdm_process_U1_0.18_nozzle_0.6.json create mode 100644 resources/profiles/Snapmaker/process/fdm_process_U1_0.24_nozzle_0.6.json create mode 100644 resources/profiles/Snapmaker/process/fdm_process_U1_0.24_nozzle_0.8.json create mode 100644 resources/profiles/Snapmaker/process/fdm_process_U1_0.30_nozzle_0.6.json create mode 100644 resources/profiles/Snapmaker/process/fdm_process_U1_0.32_nozzle_0.8.json create mode 100644 resources/profiles/Snapmaker/process/fdm_process_U1_0.36_nozzle_0.6.json create mode 100644 resources/profiles/Snapmaker/process/fdm_process_U1_0.40_nozzle_0.8.json create mode 100644 resources/profiles/Snapmaker/process/fdm_process_U1_0.42_nozzle_0.6.json create mode 100644 resources/profiles/Snapmaker/process/fdm_process_U1_0.48_nozzle_0.8.json create mode 100644 resources/profiles/Snapmaker/process/fdm_process_U1_0.56_nozzle_0.8.json diff --git a/resources/profiles/Custom.json b/resources/profiles/Custom.json index a416f17db0..0429742c88 100644 --- a/resources/profiles/Custom.json +++ b/resources/profiles/Custom.json @@ -1,6 +1,6 @@ { "name": "Custom Printer", - "version": "02.04.00.01", + "version": "02.04.00.02", "force_update": "0", "description": "My configurations", "machine_model_list": [ diff --git a/resources/profiles/Custom/filament/Generic ABS @MyToolChanger.json b/resources/profiles/Custom/filament/Generic ABS @MyToolChanger.json index 1683513dbd..bf48e0488b 100644 --- a/resources/profiles/Custom/filament/Generic ABS @MyToolChanger.json +++ b/resources/profiles/Custom/filament/Generic ABS @MyToolChanger.json @@ -24,12 +24,6 @@ "filament_loading_speed_start": [ "50" ], - "filament_multitool_ramming": [ - "1" - ], - "filament_multitool_ramming_flow": [ - "40" - ], "filament_stamping_distance": [ "45" ], diff --git a/resources/profiles/Custom/filament/Generic ASA @MyToolChanger.json b/resources/profiles/Custom/filament/Generic ASA @MyToolChanger.json index 5cc46deb7e..ad26608bff 100644 --- a/resources/profiles/Custom/filament/Generic ASA @MyToolChanger.json +++ b/resources/profiles/Custom/filament/Generic ASA @MyToolChanger.json @@ -24,12 +24,6 @@ "filament_loading_speed_start": [ "50" ], - "filament_multitool_ramming": [ - "1" - ], - "filament_multitool_ramming_flow": [ - "40" - ], "filament_stamping_distance": [ "45" ], diff --git a/resources/profiles/Custom/filament/Generic PA @MyToolChanger.json b/resources/profiles/Custom/filament/Generic PA @MyToolChanger.json index 0c8918427d..d710282360 100644 --- a/resources/profiles/Custom/filament/Generic PA @MyToolChanger.json +++ b/resources/profiles/Custom/filament/Generic PA @MyToolChanger.json @@ -24,12 +24,6 @@ "filament_loading_speed_start": [ "50" ], - "filament_multitool_ramming": [ - "1" - ], - "filament_multitool_ramming_flow": [ - "40" - ], "filament_stamping_distance": [ "45" ], diff --git a/resources/profiles/Custom/filament/Generic PA-CF @MyToolChanger.json b/resources/profiles/Custom/filament/Generic PA-CF @MyToolChanger.json index a7d86885ef..481fd04152 100644 --- a/resources/profiles/Custom/filament/Generic PA-CF @MyToolChanger.json +++ b/resources/profiles/Custom/filament/Generic PA-CF @MyToolChanger.json @@ -24,12 +24,6 @@ "filament_loading_speed_start": [ "50" ], - "filament_multitool_ramming": [ - "1" - ], - "filament_multitool_ramming_flow": [ - "40" - ], "filament_stamping_distance": [ "45" ], diff --git a/resources/profiles/Custom/filament/Generic PC @MyToolChanger.json b/resources/profiles/Custom/filament/Generic PC @MyToolChanger.json index d80b197394..47f175c277 100644 --- a/resources/profiles/Custom/filament/Generic PC @MyToolChanger.json +++ b/resources/profiles/Custom/filament/Generic PC @MyToolChanger.json @@ -25,12 +25,6 @@ "filament_loading_speed_start": [ "50" ], - "filament_multitool_ramming": [ - "1" - ], - "filament_multitool_ramming_flow": [ - "40" - ], "filament_stamping_distance": [ "45" ], diff --git a/resources/profiles/Custom/filament/Generic PETG @MyToolChanger.json b/resources/profiles/Custom/filament/Generic PETG @MyToolChanger.json index 693551c428..95e47a32a8 100644 --- a/resources/profiles/Custom/filament/Generic PETG @MyToolChanger.json +++ b/resources/profiles/Custom/filament/Generic PETG @MyToolChanger.json @@ -25,12 +25,6 @@ "filament_loading_speed_start": [ "50" ], - "filament_multitool_ramming": [ - "1" - ], - "filament_multitool_ramming_flow": [ - "40" - ], "filament_stamping_distance": [ "45" ], diff --git a/resources/profiles/Custom/filament/Generic PLA @MyToolChanger.json b/resources/profiles/Custom/filament/Generic PLA @MyToolChanger.json index cf1db6e225..b8fe088325 100644 --- a/resources/profiles/Custom/filament/Generic PLA @MyToolChanger.json +++ b/resources/profiles/Custom/filament/Generic PLA @MyToolChanger.json @@ -25,12 +25,6 @@ "filament_loading_speed_start": [ "50" ], - "filament_multitool_ramming": [ - "1" - ], - "filament_multitool_ramming_flow": [ - "40" - ], "filament_stamping_distance": [ "45" ], diff --git a/resources/profiles/Custom/filament/Generic PLA-CF @MyToolChanger.json b/resources/profiles/Custom/filament/Generic PLA-CF @MyToolChanger.json index 6ae729d622..4a766aa3ef 100644 --- a/resources/profiles/Custom/filament/Generic PLA-CF @MyToolChanger.json +++ b/resources/profiles/Custom/filament/Generic PLA-CF @MyToolChanger.json @@ -25,12 +25,6 @@ "filament_loading_speed_start": [ "50" ], - "filament_multitool_ramming": [ - "1" - ], - "filament_multitool_ramming_flow": [ - "40" - ], "filament_stamping_distance": [ "45" ], diff --git a/resources/profiles/Custom/filament/Generic PVA @MyToolChanger.json b/resources/profiles/Custom/filament/Generic PVA @MyToolChanger.json index ccb6d16c73..6fe168abcc 100644 --- a/resources/profiles/Custom/filament/Generic PVA @MyToolChanger.json +++ b/resources/profiles/Custom/filament/Generic PVA @MyToolChanger.json @@ -25,12 +25,6 @@ "filament_loading_speed_start": [ "50" ], - "filament_multitool_ramming": [ - "1" - ], - "filament_multitool_ramming_flow": [ - "40" - ], "filament_stamping_distance": [ "45" ], diff --git a/resources/profiles/Custom/machine/fdm_klipper_common.json b/resources/profiles/Custom/machine/fdm_klipper_common.json index 36f3fe13c6..a0ee0f1a47 100644 --- a/resources/profiles/Custom/machine/fdm_klipper_common.json +++ b/resources/profiles/Custom/machine/fdm_klipper_common.json @@ -116,7 +116,7 @@ "deretraction_speed": [ "30" ], - "z_hop_types": "Normal Lift", + "z_hop_types": "Slope Lift", "silent_mode": "0", "single_extruder_multi_material": "1", "change_filament_gcode": "", diff --git a/resources/profiles/Custom/machine/fdm_repetier_common.json b/resources/profiles/Custom/machine/fdm_repetier_common.json index 1171559086..b36b716e4e 100644 --- a/resources/profiles/Custom/machine/fdm_repetier_common.json +++ b/resources/profiles/Custom/machine/fdm_repetier_common.json @@ -118,7 +118,7 @@ "deretraction_speed": [ "30" ], - "z_hop_types": "Normal Lift", + "z_hop_types": "Slope Lift", "silent_mode": "0", "single_extruder_multi_material": "1", "change_filament_gcode": "", diff --git a/resources/profiles/Custom/machine/fdm_rrf_common.json b/resources/profiles/Custom/machine/fdm_rrf_common.json index 68708490a1..2fc9df9a3d 100644 --- a/resources/profiles/Custom/machine/fdm_rrf_common.json +++ b/resources/profiles/Custom/machine/fdm_rrf_common.json @@ -116,7 +116,7 @@ "deretraction_speed": [ "30" ], - "z_hop_types": "Normal Lift", + "z_hop_types": "Slope Lift", "silent_mode": "0", "single_extruder_multi_material": "1", "change_filament_gcode": "", diff --git a/resources/profiles/Custom/machine/fdm_toolchanger_common.json b/resources/profiles/Custom/machine/fdm_toolchanger_common.json index ff702d0034..7ef8b5207c 100644 --- a/resources/profiles/Custom/machine/fdm_toolchanger_common.json +++ b/resources/profiles/Custom/machine/fdm_toolchanger_common.json @@ -172,11 +172,11 @@ "0.4" ], "z_hop_types": [ - "Normal Lift", - "Normal Lift", - "Normal Lift", - "Normal Lift", - "Normal Lift" + "Slope Lift", + "Slope Lift", + "Slope Lift", + "Slope Lift", + "Slope Lift" ], "purge_in_prime_tower": "0", "machine_pause_gcode": "M601", diff --git a/resources/profiles/OrcaFilamentLibrary.json b/resources/profiles/OrcaFilamentLibrary.json index cd9abd8b0d..9701c6eb0d 100644 --- a/resources/profiles/OrcaFilamentLibrary.json +++ b/resources/profiles/OrcaFilamentLibrary.json @@ -1,6 +1,6 @@ { "name": "OrcaFilamentLibrary", - "version": "02.04.00.03", + "version": "02.04.00.04", "force_update": "0", "description": "Orca Filament Library", "filament_list": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PET-CF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PET-CF @base.json index 5a4e910502..c455832b9c 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PET-CF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PET-CF @base.json @@ -36,6 +36,9 @@ "filament_max_volumetric_speed": [ "8" ], + "filament_multitool_ramming_flow": [ + "8" + ], "filament_type": [ "PET-CF" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG Basic @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG Basic @base.json index 9117643990..755f78cf08 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG Basic @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG Basic @base.json @@ -39,6 +39,9 @@ "filament_max_volumetric_speed": [ "8" ], + "filament_multitool_ramming_flow": [ + "8" + ], "filament_vendor": [ "Bambu Lab" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG Translucent @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG Translucent @base.json index 69cfb1dab7..0026f408f2 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG Translucent @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG Translucent @base.json @@ -39,6 +39,9 @@ "filament_max_volumetric_speed": [ "6" ], + "filament_multitool_ramming_flow": [ + "6" + ], "filament_vendor": [ "Bambu Lab" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Aero @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Aero @base.json index 889822b02f..1f11ddcc54 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Aero @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Aero @base.json @@ -21,6 +21,9 @@ "filament_max_volumetric_speed": [ "6" ], + "filament_multitool_ramming_flow": [ + "6" + ], "filament_type": [ "PLA-AERO" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support For PLA-PETG @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support For PLA-PETG @base.json index 49fdcb1e1b..1dea20d081 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support For PLA-PETG @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support For PLA-PETG @base.json @@ -27,6 +27,9 @@ "filament_max_volumetric_speed": [ "6" ], + "filament_multitool_ramming_flow": [ + "6" + ], "filament_scarf_seam_type": [ "none" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support for ABS @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support for ABS @base.json index 3fe47727e1..bf714a0352 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support for ABS @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support for ABS @base.json @@ -21,6 +21,9 @@ "filament_max_volumetric_speed": [ "6" ], + "filament_multitool_ramming_flow": [ + "6" + ], "filament_vendor": [ "Bambu Lab" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/COEX/COEX TPU 60A @base.json b/resources/profiles/OrcaFilamentLibrary/filament/COEX/COEX TPU 60A @base.json index 00834bb4a5..a4b0ebce09 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/COEX/COEX TPU 60A @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/COEX/COEX TPU 60A @base.json @@ -36,6 +36,9 @@ "filament_max_volumetric_speed": [ "1" ], + "filament_multitool_ramming_flow": [ + "1" + ], "filament_retraction_minimum_travel": [ "3" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Elas/Elas ASA @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Elas/Elas ASA @base.json index d6ca0d695b..b4da81db72 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Elas/Elas ASA @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Elas/Elas ASA @base.json @@ -72,15 +72,6 @@ "fan_min_speed": [ "10" ], - "filament_cooling_final_speed": [ - "0" - ], - "filament_cooling_initial_speed": [ - "0" - ], - "filament_cooling_moves": [ - "0" - ], "filament_cost": [ "599" ], @@ -99,30 +90,12 @@ "filament_is_support": [ "0" ], - "filament_loading_speed": [ - "0" - ], - "filament_loading_speed_start": [ - "0" - ], "filament_long_retractions_when_cut": [ "nil" ], "filament_max_volumetric_speed": [ "15" ], - "filament_minimal_purge_on_wipe_tower": [ - "0" - ], - "filament_multitool_ramming": [ - "0" - ], - "filament_multitool_ramming_flow": [ - "10" - ], - "filament_multitool_ramming_volume": [ - "10" - ], "filament_notes": [ "" ], @@ -165,21 +138,6 @@ "filament_soluble": [ "0" ], - "filament_stamping_distance": [ - "0" - ], - "filament_stamping_loading_speed": [ - "0" - ], - "filament_toolchange_delay": [ - "0" - ], - "filament_unloading_speed": [ - "0" - ], - "filament_unloading_speed_start": [ - "0" - ], "filament_vendor": [ "Elas" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Elas/Elas PETG Basic @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Elas/Elas PETG Basic @base.json index 478210bb7d..8b6db5d3ad 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Elas/Elas PETG Basic @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Elas/Elas PETG Basic @base.json @@ -42,15 +42,6 @@ "fan_min_speed": [ "20" ], - "filament_cooling_final_speed": [ - "0" - ], - "filament_cooling_initial_speed": [ - "0" - ], - "filament_cooling_moves": [ - "0" - ], "filament_cost": [ "445" ], @@ -69,30 +60,12 @@ "filament_is_support": [ "0" ], - "filament_loading_speed": [ - "0" - ], - "filament_loading_speed_start": [ - "0" - ], "filament_long_retractions_when_cut": [ "1" ], "filament_max_volumetric_speed": [ "18" ], - "filament_minimal_purge_on_wipe_tower": [ - "0" - ], - "filament_multitool_ramming": [ - "0" - ], - "filament_multitool_ramming_flow": [ - "10" - ], - "filament_multitool_ramming_volume": [ - "10" - ], "filament_notes": [ "" ], @@ -135,21 +108,6 @@ "filament_soluble": [ "0" ], - "filament_stamping_distance": [ - "0" - ], - "filament_stamping_loading_speed": [ - "0" - ], - "filament_toolchange_delay": [ - "0" - ], - "filament_unloading_speed": [ - "0" - ], - "filament_unloading_speed_start": [ - "0" - ], "filament_wipe": [ "nil" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Elas/Elas PLA Basic @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Elas/Elas PLA Basic @base.json index abfa611aa3..d3f34beb80 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Elas/Elas PLA Basic @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Elas/Elas PLA Basic @base.json @@ -71,15 +71,6 @@ "fan_min_speed": [ "60" ], - "filament_cooling_final_speed": [ - "0" - ], - "filament_cooling_initial_speed": [ - "0" - ], - "filament_cooling_moves": [ - "0" - ], "filament_cost": [ "449.5" ], @@ -98,30 +89,12 @@ "filament_is_support": [ "0" ], - "filament_loading_speed": [ - "0" - ], - "filament_loading_speed_start": [ - "0" - ], "filament_long_retractions_when_cut": [ "nil" ], "filament_max_volumetric_speed": [ "25" ], - "filament_minimal_purge_on_wipe_tower": [ - "0" - ], - "filament_multitool_ramming": [ - "0" - ], - "filament_multitool_ramming_flow": [ - "10" - ], - "filament_multitool_ramming_volume": [ - "10" - ], "filament_notes": [ "" ], @@ -164,21 +137,6 @@ "filament_soluble": [ "0" ], - "filament_stamping_distance": [ - "0" - ], - "filament_stamping_loading_speed": [ - "0" - ], - "filament_toolchange_delay": [ - "0" - ], - "filament_unloading_speed": [ - "0" - ], - "filament_unloading_speed_start": [ - "0" - ], "filament_vendor": [ "Elas" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Elas/Elas PLA Pro @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Elas/Elas PLA Pro @base.json index 38313d1d55..41fd91f011 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Elas/Elas PLA Pro @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Elas/Elas PLA Pro @base.json @@ -71,15 +71,6 @@ "fan_min_speed": [ "100" ], - "filament_cooling_final_speed": [ - "0" - ], - "filament_cooling_initial_speed": [ - "0" - ], - "filament_cooling_moves": [ - "0" - ], "filament_cost": [ "500" ], @@ -98,30 +89,12 @@ "filament_is_support": [ "0" ], - "filament_loading_speed": [ - "0" - ], - "filament_loading_speed_start": [ - "0" - ], "filament_long_retractions_when_cut": [ "nil" ], "filament_max_volumetric_speed": [ "18" ], - "filament_minimal_purge_on_wipe_tower": [ - "0" - ], - "filament_multitool_ramming": [ - "0" - ], - "filament_multitool_ramming_flow": [ - "10" - ], - "filament_multitool_ramming_volume": [ - "10" - ], "filament_notes": [ "" ], @@ -164,21 +137,6 @@ "filament_soluble": [ "0" ], - "filament_stamping_distance": [ - "0" - ], - "filament_stamping_loading_speed": [ - "0" - ], - "filament_toolchange_delay": [ - "0" - ], - "filament_unloading_speed": [ - "0" - ], - "filament_unloading_speed_start": [ - "0" - ], "filament_vendor": [ "Elas" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PAHT-CF @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PAHT-CF @System.json index d7dd19c086..7d22d28387 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PAHT-CF @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PAHT-CF @System.json @@ -24,6 +24,9 @@ "filament_max_volumetric_speed": [ "6" ], + "filament_multitool_ramming_flow": [ + "6" + ], "nozzle_temperature": [ "290" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PETG @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PETG @base.json index d6cd360eba..997f38ed4d 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PETG @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PETG @base.json @@ -35,6 +35,9 @@ "filament_max_volumetric_speed": [ "8" ], + "filament_multitool_ramming_flow": [ + "8" + ], "filament_vendor": [ "Elegoo" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PLA Wood @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PLA Wood @System.json index abae441db5..3d6c95ed00 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PLA Wood @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PLA Wood @System.json @@ -12,6 +12,9 @@ "filament_max_volumetric_speed": [ "10" ], + "filament_multitool_ramming_flow": [ + "10" + ], "nozzle_temperature": [ "220" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Neon @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Neon @System.json index b40ce2310b..dff734c96d 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Neon @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Neon @System.json @@ -44,5 +44,8 @@ ], "filament_max_volumetric_speed": [ "10" + ], + "filament_multitool_ramming_flow": [ + "10" ] } diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Silk @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Silk @System.json index 843cf72fc5..1c3184da11 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Silk @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Silk @System.json @@ -44,5 +44,8 @@ ], "filament_max_volumetric_speed": [ "8" + ], + "filament_multitool_ramming_flow": [ + "8" ] } diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Generic PA-CF @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Generic PA-CF @System.json index f7b9df437a..cf01ddf65b 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Generic PA-CF @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Generic PA-CF @System.json @@ -10,5 +10,8 @@ "filament_type": [ "PA-CF" ], + "filament_multitool_ramming_flow": [ + "8" + ], "compatible_printers": [] } diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Generic PETG HF @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Generic PETG HF @System.json index e402cdf775..25cf20c304 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Generic PETG HF @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Generic PETG HF @System.json @@ -8,5 +8,8 @@ "filament_max_volumetric_speed": [ "20" ], + "filament_multitool_ramming_flow": [ + "20" + ], "compatible_printers": [] } diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Generic PETG-CF @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Generic PETG-CF @System.json index 5ee99ffed9..30884cf5a0 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Generic PETG-CF @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Generic PETG-CF @System.json @@ -17,6 +17,9 @@ "filament_max_volumetric_speed": [ "11.5" ], + "filament_multitool_ramming_flow": [ + "13" + ], "overhang_fan_speed": [ "100" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Generic PLA High Speed @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Generic PLA High Speed @System.json index 041ff59c44..1880ca2b21 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Generic PLA High Speed @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Generic PLA High Speed @System.json @@ -12,6 +12,9 @@ "filament_max_volumetric_speed": [ "18" ], + "filament_multitool_ramming_flow": [ + "25" + ], "slow_down_layer_time": [ "4" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Generic PLA Matte @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Generic PLA Matte @System.json index d3a6d4813c..39c71d0d62 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Generic PLA Matte @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Generic PLA Matte @System.json @@ -8,6 +8,9 @@ "filament_max_volumetric_speed": [ "11" ], + "filament_multitool_ramming_flow": [ + "11" + ], "filament_retraction_length": [ "0.8" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Generic PP-CF @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Generic PP-CF @System.json index 65420e9dae..a7c1bbff00 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Generic PP-CF @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Generic PP-CF @System.json @@ -15,6 +15,9 @@ "filament_max_volumetric_speed": [ "6" ], + "filament_multitool_ramming_flow": [ + "6" + ], "filament_type": [ "PP-CF" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Generic PP-GF @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Generic PP-GF @System.json index 931ee4b7b3..cf9ea7ace2 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Generic PP-GF @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Generic PP-GF @System.json @@ -15,6 +15,9 @@ "filament_max_volumetric_speed": [ "6" ], + "filament_multitool_ramming_flow": [ + "6" + ], "filament_type": [ "PP-GF" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture Air PLA @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture Air PLA @base.json index 39e351a24c..98d390e9b8 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture Air PLA @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture Air PLA @base.json @@ -17,6 +17,9 @@ "filament_max_volumetric_speed": [ "8" ], + "filament_multitool_ramming_flow": [ + "8" + ], "filament_vendor": [ "Overture" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Valment/Valment PLA Silk @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Valment/Valment PLA Silk @base.json index d873590f08..258f80fb15 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Valment/Valment PLA Silk @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Valment/Valment PLA Silk @base.json @@ -23,6 +23,9 @@ "filament_max_volumetric_speed": [ "7.5" ], + "filament_multitool_ramming_flow": [ + "7.5" + ], "filament_vendor": [ "Valment" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_abs.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_abs.json index 6d9d015c11..dea3f03264 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_abs.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_abs.json @@ -43,6 +43,12 @@ "filament_max_volumetric_speed": [ "12" ], + "filament_multitool_ramming_flow": [ + "15" + ], + "filament_multitool_ramming_volume": [ + "10" + ], "filament_type": [ "ABS" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_asa.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_asa.json index 922a5eaa7a..09a29ce792 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_asa.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_asa.json @@ -43,6 +43,12 @@ "filament_max_volumetric_speed": [ "12" ], + "filament_multitool_ramming_flow": [ + "12" + ], + "filament_multitool_ramming_volume": [ + "10" + ], "filament_type": [ "ASA" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_bvoh.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_bvoh.json index d37476f458..cd15600a52 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_bvoh.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_bvoh.json @@ -41,6 +41,15 @@ "filament_max_volumetric_speed": [ "8" ], + "filament_multitool_ramming": [ + "0" + ], + "filament_multitool_ramming_flow": [ + "6" + ], + "filament_multitool_ramming_volume": [ + "0.1" + ], "filament_type": [ "BVOH" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_common.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_common.json index ce95ca7c52..3ff7e805ae 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_common.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_common.json @@ -66,6 +66,12 @@ "filament_minimal_purge_on_wipe_tower": [ "15" ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_volume": [ + "5" + ], "filament_retract_before_wipe": [ "nil" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_cope.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_cope.json index 80ffd173de..798f560e01 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_cope.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_cope.json @@ -41,6 +41,9 @@ "filament_max_volumetric_speed": [ "16" ], + "filament_multitool_ramming_flow": [ + "16" + ], "filament_scarf_seam_type": [ "none" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_eva.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_eva.json index bf1ff86af1..40498a05aa 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_eva.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_eva.json @@ -8,6 +8,9 @@ "filament_type": [ "EVA" ], + "filament_multitool_ramming_flow": [ + "12" + ], "supertack_plate_temp": [ "0" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_hips.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_hips.json index beaebbd0e7..f67709b4b2 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_hips.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_hips.json @@ -41,6 +41,9 @@ "filament_max_volumetric_speed": [ "8" ], + "filament_multitool_ramming_flow": [ + "8" + ], "filament_type": [ "HIPS" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pa.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pa.json index c2e4cf86df..185af32de7 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pa.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pa.json @@ -44,6 +44,9 @@ "filament_max_volumetric_speed": [ "8" ], + "filament_multitool_ramming_flow": [ + "12" + ], "filament_type": [ "PA" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_paht.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_paht.json index 058469ff71..2a1ca6d510 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_paht.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_paht.json @@ -7,6 +7,9 @@ "filament_max_volumetric_speed": [ "12" ], + "filament_multitool_ramming_flow": [ + "12" + ], "filament_type": [ "PAHT" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pc.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pc.json index 0f550063ad..d8fb7d00ae 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pc.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pc.json @@ -86,6 +86,9 @@ "filament_max_volumetric_speed": [ "12" ], + "filament_multitool_ramming_flow": [ + "16" + ], "filament_flow_ratio": [ "0.94" ] diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pctg.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pctg.json index 8ca7e39994..e656fb7715 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pctg.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pctg.json @@ -26,6 +26,9 @@ "filament_max_volumetric_speed": [ "12" ], + "filament_multitool_ramming_flow": [ + "10" + ], "filament_type": [ "PCTG" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pe.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pe.json index beb533d07f..a47543334b 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pe.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pe.json @@ -38,6 +38,9 @@ "filament_max_volumetric_speed": [ "12" ], + "filament_multitool_ramming_flow": [ + "12" + ], "filament_type": [ "PE" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pet.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pet.json index eabb12c708..8b3fef2f2b 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pet.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pet.json @@ -26,6 +26,9 @@ "filament_max_volumetric_speed": [ "10" ], + "filament_multitool_ramming_flow": [ + "15" + ], "filament_type": [ "PETG" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pha.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pha.json index f6ef3ffc0c..7719c6563d 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pha.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pha.json @@ -38,6 +38,9 @@ "filament_max_volumetric_speed": [ "6" ], + "filament_multitool_ramming_flow": [ + "6" + ], "filament_type": [ "PHA" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pla.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pla.json index ae82d44129..21b7c44365 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pla.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pla.json @@ -38,6 +38,9 @@ "filament_max_volumetric_speed": [ "12" ], + "filament_multitool_ramming_flow": [ + "20" + ], "filament_scarf_seam_type": [ "none" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pla_silk.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pla_silk.json index 3680a85602..a5fd601060 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pla_silk.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pla_silk.json @@ -9,6 +9,9 @@ "filament_flow_ratio": [ "0.98" ], + "filament_multitool_ramming_flow": [ + "10" + ], "slow_down_layer_time": [ "8" ] diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pp.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pp.json index ec9405ef9a..4df7753132 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pp.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pp.json @@ -38,6 +38,9 @@ "filament_max_volumetric_speed": [ "12" ], + "filament_multitool_ramming_flow": [ + "12" + ], "filament_type": [ "PP" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_ppa.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_ppa.json index 3eac71bc69..c250e588b0 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_ppa.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_ppa.json @@ -47,6 +47,9 @@ "filament_max_volumetric_speed": [ "8" ], + "filament_multitool_ramming_flow": [ + "8" + ], "filament_type": [ "PPA-CF" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pps.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pps.json index a6a95a804e..49e0bddefd 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pps.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pps.json @@ -43,6 +43,9 @@ "filament_max_volumetric_speed": [ "4" ], + "filament_multitool_ramming_flow": [ + "4" + ], "filament_type": [ "PPS" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pva.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pva.json index 0109726b0d..4bb30d7e11 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pva.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pva.json @@ -40,6 +40,15 @@ "filament_max_volumetric_speed": [ "12" ], + "filament_multitool_ramming": [ + "0" + ], + "filament_multitool_ramming_flow": [ + "6" + ], + "filament_multitool_ramming_volume": [ + "0.1" + ], "filament_soluble": [ "1" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_sbs.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_sbs.json index 96626d808d..9bc4d5ce36 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_sbs.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_sbs.json @@ -11,6 +11,9 @@ "filament_max_volumetric_speed": [ "12" ], + "filament_multitool_ramming_flow": [ + "12" + ], "filament_type": [ "SBS" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_tpu.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_tpu.json index 30d9415ad3..d6fb38a6ba 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_tpu.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_tpu.json @@ -43,6 +43,15 @@ "filament_max_volumetric_speed": [ "3.2" ], + "filament_multitool_ramming": [ + "0" + ], + "filament_multitool_ramming_flow": [ + "3.2" + ], + "filament_multitool_ramming_volume": [ + "0.1" + ], "filament_retraction_length": [ "0.4" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/eSUN/eSUN PLA-Marble @base.json b/resources/profiles/OrcaFilamentLibrary/filament/eSUN/eSUN PLA-Marble @base.json index 40c314585c..cbd4f84ed4 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/eSUN/eSUN PLA-Marble @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/eSUN/eSUN PLA-Marble @base.json @@ -17,6 +17,9 @@ "filament_max_volumetric_speed": [ "8" ], + "filament_multitool_ramming_flow": [ + "8" + ], "filament_vendor": [ "eSUN" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/eSUN/eSUN PLA-Matte @base.json b/resources/profiles/OrcaFilamentLibrary/filament/eSUN/eSUN PLA-Matte @base.json index 85c6049935..8d22168408 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/eSUN/eSUN PLA-Matte @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/eSUN/eSUN PLA-Matte @base.json @@ -17,6 +17,9 @@ "filament_max_volumetric_speed": [ "8" ], + "filament_multitool_ramming_flow": [ + "8" + ], "filament_vendor": [ "eSUN" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/eSUN/eSUN ePLA-LW @System.json b/resources/profiles/OrcaFilamentLibrary/filament/eSUN/eSUN ePLA-LW @System.json index 138a388419..732eb3fd5b 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/eSUN/eSUN ePLA-LW @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/eSUN/eSUN ePLA-LW @System.json @@ -21,6 +21,9 @@ "filament_max_volumetric_speed": [ "6" ], + "filament_multitool_ramming_flow": [ + "6" + ], "filament_vendor": [ "eSUN" ], diff --git a/resources/profiles/Snapmaker.json b/resources/profiles/Snapmaker.json index cdc7f0fe81..ab2433242e 100644 --- a/resources/profiles/Snapmaker.json +++ b/resources/profiles/Snapmaker.json @@ -1,6 +1,6 @@ { "name": "Snapmaker", - "version": "02.04.00.07", + "version": "02.04.00.08", "force_update": "0", "description": "Snapmaker configurations", "machine_model_list": [ @@ -426,10 +426,6 @@ "name": "0.16 Optimal @Snapmaker U1 (0.4 nozzle)", "sub_path": "process/0.16 Optimal @Snapmaker U1 (0.4 nozzle).json" }, - { - "name": "0.20 Bambu Support W @Snapmaker U1 (0.4 nozzle)", - "sub_path": "process/0.20 Bambu Support W @Snapmaker U1 (0.4 nozzle).json" - }, { "name": "0.20 Quality @Snapmaker U1 (0.4 nozzle)", "sub_path": "process/0.20 Quality @Snapmaker U1 (0.4 nozzle).json" @@ -486,6 +482,66 @@ "name": "fdm_process_U1_0.8_common", "sub_path": "process/fdm_process_U1_0.8_common.json" }, + { + "name": "fdm_process_U1_0.06_nozzle_0.2", + "sub_path": "process/fdm_process_U1_0.06_nozzle_0.2.json" + }, + { + "name": "fdm_process_U1_0.08_nozzle_0.2", + "sub_path": "process/fdm_process_U1_0.08_nozzle_0.2.json" + }, + { + "name": "fdm_process_U1_0.10_nozzle_0.2", + "sub_path": "process/fdm_process_U1_0.10_nozzle_0.2.json" + }, + { + "name": "fdm_process_U1_0.12_nozzle_0.2", + "sub_path": "process/fdm_process_U1_0.12_nozzle_0.2.json" + }, + { + "name": "fdm_process_U1_0.14_nozzle_0.2", + "sub_path": "process/fdm_process_U1_0.14_nozzle_0.2.json" + }, + { + "name": "fdm_process_U1_0.18_nozzle_0.6", + "sub_path": "process/fdm_process_U1_0.18_nozzle_0.6.json" + }, + { + "name": "fdm_process_U1_0.24_nozzle_0.6", + "sub_path": "process/fdm_process_U1_0.24_nozzle_0.6.json" + }, + { + "name": "fdm_process_U1_0.24_nozzle_0.8", + "sub_path": "process/fdm_process_U1_0.24_nozzle_0.8.json" + }, + { + "name": "fdm_process_U1_0.30_nozzle_0.6", + "sub_path": "process/fdm_process_U1_0.30_nozzle_0.6.json" + }, + { + "name": "fdm_process_U1_0.32_nozzle_0.8", + "sub_path": "process/fdm_process_U1_0.32_nozzle_0.8.json" + }, + { + "name": "fdm_process_U1_0.36_nozzle_0.6", + "sub_path": "process/fdm_process_U1_0.36_nozzle_0.6.json" + }, + { + "name": "fdm_process_U1_0.40_nozzle_0.8", + "sub_path": "process/fdm_process_U1_0.40_nozzle_0.8.json" + }, + { + "name": "fdm_process_U1_0.42_nozzle_0.6", + "sub_path": "process/fdm_process_U1_0.42_nozzle_0.6.json" + }, + { + "name": "fdm_process_U1_0.48_nozzle_0.8", + "sub_path": "process/fdm_process_U1_0.48_nozzle_0.8.json" + }, + { + "name": "fdm_process_U1_0.56_nozzle_0.8", + "sub_path": "process/fdm_process_U1_0.56_nozzle_0.8.json" + }, { "name": "0.06 High Quality @Snapmaker U1 (0.2 nozzle)", "sub_path": "process/0.06 High Quality @Snapmaker U1 (0.2 nozzle).json" @@ -1508,10 +1564,6 @@ "name": "Snapmaker PLA Metal @U1", "sub_path": "filament/Snapmaker PLA Metal @U1.json" }, - { - "name": "Snapmaker PLA Silk @U1", - "sub_path": "filament/Snapmaker PLA Silk @U1.json" - }, { "name": "Snapmaker PLA Silk", "sub_path": "filament/Snapmaker PLA Silk.json" @@ -1671,6 +1723,214 @@ { "name": "Snapmaker PLA Matte @U1 base", "sub_path": "filament/Snapmaker PLA Matte @U1 base.json" + }, + { + "name": "Polymaker PLA @U1 base", + "sub_path": "filament/Polymaker PLA @U1 base.json" + }, + { + "name": "Polymaker Silk PLA Family @U1", + "sub_path": "filament/Polymaker Silk PLA Family @U1.json" + }, + { + "name": "Polymaker Tough PLA Family @U1", + "sub_path": "filament/Polymaker Tough PLA Family @U1.json" + }, + { + "name": "Snapmaker Breakaway Support For PLA @U1 0.2 nozzle", + "sub_path": "filament/Snapmaker Breakaway Support For PLA @U1 0.2 nozzle.json" + }, + { + "name": "Snapmaker Breakaway Support For PLA @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker Breakaway Support For PLA @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker Breakaway Support For PLA @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker Breakaway Support For PLA @U1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PETG HF @U1 base2", + "sub_path": "filament/Snapmaker PETG HF @U1 base2.json" + }, + { + "name": "Snapmaker PETG Translucent @U1 base", + "sub_path": "filament/Snapmaker PETG Translucent @U1 base.json" + }, + { + "name": "Snapmaker PLA Basic @U1 base", + "sub_path": "filament/Snapmaker PLA Basic @U1 base.json" + }, + { + "name": "Snapmaker PLA Full Spectrum @U1 0.4 nozzle", + "sub_path": "filament/Snapmaker PLA Full Spectrum @U1 0.4 nozzle.json" + }, + { + "name": "Snapmaker PLA Glow @U1 base", + "sub_path": "filament/Snapmaker PLA Glow @U1 base.json" + }, + { + "name": "Snapmaker PLA Matte @U1 base2", + "sub_path": "filament/Snapmaker PLA Matte @U1 base2.json" + }, + { + "name": "Snapmaker PLA Silk @U1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Silk @U1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PLA Silk @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker PLA Silk @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker PLA Silk @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA Silk @U1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @U1 base2", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 base2.json" + }, + { + "name": "Snapmaker PLA Translucent @U1 base", + "sub_path": "filament/Snapmaker PLA Translucent @U1 base.json" + }, + { + "name": "Snapmaker PLA Wood @U1 0.4 nozzle", + "sub_path": "filament/Snapmaker PLA Wood @U1 0.4 nozzle.json" + }, + { + "name": "Snapmaker PLA Wood @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker PLA Wood @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker PLA Wood @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA Wood @U1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA-CF @U1 0.4 nozzle", + "sub_path": "filament/Snapmaker PLA-CF @U1 0.4 nozzle.json" + }, + { + "name": "Snapmaker PLA-CF @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker PLA-CF @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker PLA-CF @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA-CF @U1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PVA @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker PVA @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker PVA @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker PVA @U1 0.8 nozzle.json" + }, + { + "name": "Snapmaker TPU 90A @U1", + "sub_path": "filament/Snapmaker TPU 90A @U1.json" + }, + { + "name": "Snapmaker TPU 90A @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker TPU 90A @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker TPU 90A @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker TPU 90A @U1 0.8 nozzle.json" + }, + { + "name": "Snapmaker TPU 95A HF @U1", + "sub_path": "filament/Snapmaker TPU 95A HF @U1.json" + }, + { + "name": "Snapmaker TPU 95A HF @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker TPU 95A HF @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker TPU 95A HF @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker TPU 95A HF @U1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA Silk @U1", + "sub_path": "filament/Snapmaker PLA Silk @U1.json" + }, + { + "name": "Polymaker General PLA Family @U1", + "sub_path": "filament/Polymaker General PLA Family @U1.json" + }, + { + "name": "Snapmaker PETG HF @U1 0.2 nozzle", + "sub_path": "filament/Snapmaker PETG HF @U1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PETG HF @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker PETG HF @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker PETG HF @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker PETG HF @U1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PETG Translucent @U1 0.2 nozzle", + "sub_path": "filament/Snapmaker PETG Translucent @U1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PETG Translucent @U1 0.4 nozzle", + "sub_path": "filament/Snapmaker PETG Translucent @U1 0.4 nozzle.json" + }, + { + "name": "Snapmaker PETG Translucent @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker PETG Translucent @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker PETG Translucent @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker PETG Translucent @U1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA Basic @U1", + "sub_path": "filament/Snapmaker PLA Basic @U1.json" + }, + { + "name": "Snapmaker PLA Glow @U1 0.4 nozzle", + "sub_path": "filament/Snapmaker PLA Glow @U1 0.4 nozzle.json" + }, + { + "name": "Snapmaker PLA Matte @U1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Matte @U1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PLA Matte @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker PLA Matte @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker PLA Matte @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA Matte @U1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @U1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA Translucent @U1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Translucent @U1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PLA Translucent @U1 0.4 nozzle", + "sub_path": "filament/Snapmaker PLA Translucent @U1 0.4 nozzle.json" + }, + { + "name": "Snapmaker PLA Translucent @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker PLA Translucent @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker PLA Translucent @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA Translucent @U1 0.8 nozzle.json" } ], "machine_list": [ diff --git a/resources/profiles/Snapmaker/filament/Polymaker General PLA Family @U1.json b/resources/profiles/Snapmaker/filament/Polymaker General PLA Family @U1.json new file mode 100644 index 0000000000..c706ba776d --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker General PLA Family @U1.json @@ -0,0 +1,32 @@ +{ + "type": "filament", + "name": "Polymaker General PLA Family @U1", + "inherits": "Polymaker PLA @U1 base", + "from": "system", + "setting_id": "thXfSaUkOAKJ50ey", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "enable_pressure_advance": [ + "0" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature_range_high": [ + "230" + ], + "temperature_vitrification": [ + "62" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Polymaker PLA @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker PLA @U1 base.json new file mode 100644 index 0000000000..b27c48f720 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker PLA @U1 base.json @@ -0,0 +1,107 @@ +{ + "type": "filament", + "name": "Polymaker PLA @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "OGFL99", + "instantiation": "false", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "activate_air_filtration": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "35" + ], + "cool_plate_temp_initial_layer": [ + "35" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "filament_cost": [ + "20" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_vendor": [ + "Generic" + ], + "filament_scarf_seam_type": [ + "none" + ], + "filament_scarf_height": [ + "10%" + ], + "filament_scarf_gap": [ + "15%" + ], + "filament_scarf_length": [ + "10" + ], + "filament_shrink": [ + "100%" + ], + "hot_plate_temp": [ + "55" + ], + "hot_plate_temp_initial_layer": [ + "55" + ], + "nozzle_temperature": [ + "220" + ], + "overhang_fan_threshold": [ + "50%" + ], + "supertack_plate_temp": [ + "45" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "slow_down_layer_time": [ + "4" + ], + "slow_down_min_speed": [ + "10" + ], + "temperature_vitrification": [ + "45" + ], + "textured_plate_temp": [ + "55" + ], + "textured_plate_temp_initial_layer": [ + "55" + ], + "filament_start_gcode": [ + "; Filament gcode\n" + ], + "filament_end_gcode": [ + "; filament end gcode\n" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Polymaker Silk PLA Family @U1.json b/resources/profiles/Snapmaker/filament/Polymaker Silk PLA Family @U1.json new file mode 100644 index 0000000000..b6bd119022 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker Silk PLA Family @U1.json @@ -0,0 +1,32 @@ +{ + "type": "filament", + "name": "Polymaker Silk PLA Family @U1", + "inherits": "Polymaker PLA @U1 base", + "from": "system", + "setting_id": "h8vIYpXbxFtHPV6e", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "filament_density": [ + "1.34" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature": [ + "230" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "nozzle_temperature_range_high": [ + "230" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Polymaker Tough PLA Family @U1.json b/resources/profiles/Snapmaker/filament/Polymaker Tough PLA Family @U1.json new file mode 100644 index 0000000000..e5c2c7d7f6 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker Tough PLA Family @U1.json @@ -0,0 +1,32 @@ +{ + "type": "filament", + "name": "Polymaker Tough PLA Family @U1", + "inherits": "Polymaker PLA @U1 base", + "from": "system", + "setting_id": "d6CC81Es2hp46bto", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "filament_density": [ + "1.23" + ], + "filament_flow_ratio": [ + "0.96" + ], + "filament_vendor": [ + "Polymaker" + ], + "slow_down_layer_time": [ + "6" + ], + "temperature_vitrification": [ + "55" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Fiberon ASA-CF08 @Snapmaker U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Fiberon ASA-CF08 @Snapmaker U1.json index 31799163c6..b38925e01b 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/Fiberon ASA-CF08 @Snapmaker U1.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/Fiberon ASA-CF08 @Snapmaker U1.json @@ -11,7 +11,6 @@ "filament_minimal_purge_on_wipe_tower": [ "15" ], - "pressure_advance": [ "0.05" ] diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Fiberon PA12-CF10 @Snapmaker U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Fiberon PA12-CF10 @Snapmaker U1.json index fd99eee105..1bb569c291 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/Fiberon PA12-CF10 @Snapmaker U1.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/Fiberon PA12-CF10 @Snapmaker U1.json @@ -17,7 +17,6 @@ "filament_z_hop": [ "0.0" ], - "enable_pressure_advance": [ "1" ], diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Fiberon PA6-CF20 @Snapmaker U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Fiberon PA6-CF20 @Snapmaker U1.json index 1b227b2fd0..d6106faa50 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/Fiberon PA6-CF20 @Snapmaker U1.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/Fiberon PA6-CF20 @Snapmaker U1.json @@ -17,7 +17,6 @@ "filament_z_hop": [ "0.0" ], - "enable_pressure_advance": [ "1" ], diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Fiberon PETG-ESD @Snapmaker U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Fiberon PETG-ESD @Snapmaker U1.json index cfe6890a80..6e1797904c 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/Fiberon PETG-ESD @Snapmaker U1.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/Fiberon PETG-ESD @Snapmaker U1.json @@ -17,7 +17,6 @@ "supertack_plate_temp_initial_layer": [ "70" ], - "pressure_advance": [ "0.04" ] diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite Dual PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite Dual PLA @0.2 nozzle.json index 707d5ae54b..f4703d6c40 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite Dual PLA @0.2 nozzle.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite Dual PLA @0.2 nozzle.json @@ -1,10 +1,10 @@ { "type": "filament", - "from": "system", - "instantiation": "true", "name": "PolyLite Dual PLA @0.2 nozzle", - "setting_id": "jhmy4YHi9MuL0DWu", "inherits": "PolyLite PLA @0.2 nozzle", + "from": "system", + "setting_id": "jhmy4YHi9MuL0DWu", + "instantiation": "true", "compatible_printers": [ "Snapmaker A250 Dual (0.2 nozzle)", "Snapmaker A250 Dual BKit (0.2 nozzle)", diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite J1 PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite J1 PLA @0.2 nozzle.json index 1a4422472c..e1ce855c61 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite J1 PLA @0.2 nozzle.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite J1 PLA @0.2 nozzle.json @@ -1,10 +1,10 @@ { "type": "filament", - "from": "system", - "instantiation": "true", "name": "PolyLite J1 PLA @0.2 nozzle", - "setting_id": "jFlRSxx0KvN3BOUu", "inherits": "PolyLite PLA @0.2 nozzle", + "from": "system", + "setting_id": "jFlRSxx0KvN3BOUu", + "instantiation": "true", "compatible_printers": [ "Snapmaker J1 (0.2 nozzle)" ] diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite J1 PLA.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite J1 PLA.json index 6c5017d0a8..55d39a0832 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite J1 PLA.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite J1 PLA.json @@ -1,10 +1,10 @@ { "type": "filament", - "from": "system", - "instantiation": "true", "name": "PolyLite J1 PLA", - "setting_id": "wcpOTTMyZNPFKyXr", "inherits": "PolyLite PLA @base", + "from": "system", + "setting_id": "wcpOTTMyZNPFKyXr", + "instantiation": "true", "compatible_printers": [ "Snapmaker J1 (0.4 nozzle)", "Snapmaker J1 (0.6 nozzle)", diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PETG @Base.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PETG @Base.json index cd5f75a463..579940a5b2 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PETG @Base.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PETG @Base.json @@ -1,4 +1,9 @@ { + "type": "filament", + "name": "PolyLite PETG @Base", + "inherits": "fdm_filament_petg", + "from": "system", + "instantiation": "false", "filament_density": [ "1.25" ], @@ -18,11 +23,6 @@ "0" ], "description": "", - "inherits": "fdm_filament_petg", - "name": "PolyLite PETG @Base", - "type": "filament", - "instantiation": "false", - "from": "system", "filament_vendor": [ "Polymaker" ] diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PETG @Snapmaker U1.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PETG @Snapmaker U1.json index 47cf37385d..f51cc5eeec 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PETG @Snapmaker U1.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PETG @Snapmaker U1.json @@ -17,7 +17,6 @@ "supertack_plate_temp_initial_layer": [ "70" ], - "pressure_advance": [ "0.05" ] diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PETG Translucent @Snapmaker U1.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PETG Translucent @Snapmaker U1.json index 6089dd66c4..a3efeee371 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PETG Translucent @Snapmaker U1.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PETG Translucent @Snapmaker U1.json @@ -17,7 +17,6 @@ "supertack_plate_temp_initial_layer": [ "70" ], - "pressure_advance": [ "0.05" ] diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @0.2 nozzle.json index c3897e63c2..fcceb14014 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @0.2 nozzle.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @0.2 nozzle.json @@ -1,10 +1,10 @@ { "type": "filament", - "from": "system", - "instantiation": "true", "name": "PolyLite PLA @0.2 nozzle", - "setting_id": "s9mdMaFca8SHfji9", "inherits": "PolyLite PLA @base", + "from": "system", + "setting_id": "s9mdMaFca8SHfji9", + "instantiation": "true", "compatible_printers": [ "Snapmaker A250 (0.2 nozzle)", "Snapmaker A250 BKit (0.2 nozzle)", diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @base.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @base.json index 4173572637..3a4621b838 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @base.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @base.json @@ -1,10 +1,10 @@ { "type": "filament", - "from": "system", - "instantiation": "false", "name": "PolyLite PLA @base", - "filament_id": "1393866034", "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "1393866034", + "instantiation": "false", "filament_flow_ratio": [ "0.95" ], diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra Dual PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra Dual PLA @0.2 nozzle.json index b45068dd52..3f8cbc7674 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra Dual PLA @0.2 nozzle.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra Dual PLA @0.2 nozzle.json @@ -1,10 +1,10 @@ { "type": "filament", - "from": "system", - "instantiation": "true", "name": "PolyTerra Dual PLA @0.2 nozzle", - "setting_id": "UQYgjH1uVxf3d2Nv", "inherits": "PolyTerra PLA @0.2 nozzle", + "from": "system", + "setting_id": "UQYgjH1uVxf3d2Nv", + "instantiation": "true", "compatible_printers": [ "Snapmaker A250 Dual (0.2 nozzle)", "Snapmaker A250 Dual BKit (0.2 nozzle)", diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra J1 PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra J1 PLA @0.2 nozzle.json index dd4f969f62..9cb7060139 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra J1 PLA @0.2 nozzle.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra J1 PLA @0.2 nozzle.json @@ -1,10 +1,10 @@ { "type": "filament", - "from": "system", - "instantiation": "true", "name": "PolyTerra J1 PLA @0.2 nozzle", - "setting_id": "mxKHxGmBZzPLS82O", "inherits": "PolyTerra PLA @0.2 nozzle", + "from": "system", + "setting_id": "mxKHxGmBZzPLS82O", + "instantiation": "true", "compatible_printers": [ "Snapmaker J1 (0.2 nozzle)" ] diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra J1 PLA.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra J1 PLA.json index 7b66438058..2583b2a2c3 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra J1 PLA.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra J1 PLA.json @@ -1,10 +1,10 @@ { "type": "filament", - "from": "system", - "instantiation": "true", "name": "PolyTerra J1 PLA", - "setting_id": "4MZWZX7QPBzxdEGj", "inherits": "PolyTerra PLA @base", + "from": "system", + "setting_id": "4MZWZX7QPBzxdEGj", + "instantiation": "true", "compatible_printers": [ "Snapmaker J1 (0.4 nozzle)", "Snapmaker J1 (0.6 nozzle)", diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra PLA @0.2 nozzle.json index 07d45a7633..e70ee3d5a0 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra PLA @0.2 nozzle.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra PLA @0.2 nozzle.json @@ -1,10 +1,10 @@ { "type": "filament", - "from": "system", - "instantiation": "true", "name": "PolyTerra PLA @0.2 nozzle", - "setting_id": "6W1ygT08NordBdIW", "inherits": "PolyTerra PLA @base", + "from": "system", + "setting_id": "6W1ygT08NordBdIW", + "instantiation": "true", "compatible_printers": [ "Snapmaker A250 (0.2 nozzle)", "Snapmaker A250 BKit (0.2 nozzle)", diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA @Base.json b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA @Base.json index 7c05254a2e..76b1d2020c 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA @Base.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA @Base.json @@ -1,4 +1,9 @@ { + "type": "filament", + "name": "Polymaker HT-PLA @Base", + "inherits": "fdm_filament_pla", + "from": "system", + "instantiation": "false", "filament_density": [ "1.28" ], @@ -18,11 +23,6 @@ "0" ], "description": "", - "inherits": "fdm_filament_pla", - "name": "Polymaker HT-PLA @Base", - "type": "filament", - "instantiation": "false", - "from": "system", "filament_vendor": [ "Polymaker" ] diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA-GF @Base.json b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA-GF @Base.json index 3a64237122..06019b562c 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA-GF @Base.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA-GF @Base.json @@ -1,4 +1,9 @@ { + "type": "filament", + "name": "Polymaker HT-PLA-GF @Base", + "inherits": "fdm_filament_pla", + "from": "system", + "instantiation": "false", "filament_density": [ "1.34" ], @@ -18,11 +23,6 @@ "0" ], "description": "", - "inherits": "fdm_filament_pla", - "name": "Polymaker HT-PLA-GF @Base", - "type": "filament", - "instantiation": "false", - "from": "system", "filament_vendor": [ "Polymaker" ] diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PETG @Base.json b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PETG @Base.json index 0965bd153b..3692eac7d5 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PETG @Base.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PETG @Base.json @@ -1,4 +1,9 @@ { + "type": "filament", + "name": "Polymaker PETG @Base", + "inherits": "fdm_filament_petg", + "from": "system", + "instantiation": "false", "filament_density": [ "1.3" ], @@ -18,11 +23,6 @@ "0" ], "description": "", - "inherits": "fdm_filament_petg", - "name": "Polymaker PETG @Base", - "type": "filament", - "instantiation": "false", - "from": "system", "filament_vendor": [ "Polymaker" ] diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PLA Pro @Base.json b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PLA Pro @Base.json index 072fa53c93..d69ccc79f2 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PLA Pro @Base.json +++ b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PLA Pro @Base.json @@ -1,4 +1,9 @@ { + "type": "filament", + "name": "Polymaker PLA Pro @Base", + "inherits": "fdm_filament_pla", + "from": "system", + "instantiation": "false", "filament_density": [ "1.23" ], @@ -18,11 +23,6 @@ "0" ], "description": "", - "inherits": "fdm_filament_pla", - "name": "Polymaker PLA Pro @Base", - "type": "filament", - "instantiation": "false", - "from": "system", "filament_vendor": [ "Polymaker" ] diff --git a/resources/profiles/Snapmaker/filament/Snapmaker ABS @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker ABS @U1.json index 083432ebd5..fe6c59ba80 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker ABS @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker ABS @U1.json @@ -7,5 +7,8 @@ "instantiation": "true", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" + ], + "filament_retract_length_toolchange": [ + "5" ] } diff --git a/resources/profiles/Snapmaker/filament/Snapmaker ASA @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker ASA @U1.json index 0c5d22723a..67bde29e8d 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker ASA @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker ASA @U1.json @@ -7,5 +7,8 @@ "instantiation": "true", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" + ], + "filament_retract_length_toolchange": [ + "5" ] } diff --git a/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1 0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1 0.2 nozzle.json new file mode 100644 index 0000000000..db331b0daa --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1 0.2 nozzle.json @@ -0,0 +1,104 @@ +{ + "type": "filament", + "name": "Snapmaker Breakaway Support For PLA @U1 0.2 nozzle", + "inherits": "Snapmaker Breakaway Support @base", + "from": "system", + "setting_id": "mJoaud6wulT4p8SA", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "filament_type": [ + "PLA" + ], + "enable_pressure_advance": [ + "0" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "fan_max_speed": [ + "30" + ], + "fan_min_speed": [ + "20" + ], + "filament_cost": [ + "69.98" + ], + "filament_density": [ + "1.3" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_max_volumetric_speed": [ + "0.5" + ], + "filament_retract_length_toolchange": [ + "10" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "240" + ], + "nozzle_temperature_initial_layer": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "pressure_advance": [ + "0.2" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_loading_speed": [ + "28" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "5" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_unloading_speed": [ + "90" + ], + "filament_unloading_speed_start": [ + "100" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1 0.6 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1 0.6 nozzle.json new file mode 100644 index 0000000000..248c57f6d0 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1 0.6 nozzle.json @@ -0,0 +1,104 @@ +{ + "type": "filament", + "name": "Snapmaker Breakaway Support For PLA @U1 0.6 nozzle", + "inherits": "Snapmaker Breakaway Support @base", + "from": "system", + "setting_id": "rKUUREJNhstIU0I2", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "filament_type": [ + "PLA" + ], + "enable_pressure_advance": [ + "0" + ], + "filament_cost": [ + "69.98" + ], + "filament_density": [ + "1.3" + ], + "filament_flow_ratio": [ + "0.95" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "210" + ], + "nozzle_temperature_initial_layer": [ + "210" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "pressure_advance": [ + "0.02" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "fan_min_speed": [ + "100" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_retract_length_toolchange": [ + "10" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "1" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_wipe_distance": [ + "2" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_loading_speed": [ + "28" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "20" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_unloading_speed": [ + "90" + ], + "filament_unloading_speed_start": [ + "100" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1 0.8 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1 0.8 nozzle.json new file mode 100644 index 0000000000..47cf80d076 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1 0.8 nozzle.json @@ -0,0 +1,98 @@ +{ + "type": "filament", + "name": "Snapmaker Breakaway Support For PLA @U1 0.8 nozzle", + "inherits": "Snapmaker Breakaway Support @base", + "from": "system", + "setting_id": "hQ8jQ5GKQKGKuPew", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "filament_type": [ + "PLA" + ], + "enable_pressure_advance": [ + "0" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "filament_cost": [ + "69.98" + ], + "filament_density": [ + "1.3" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_flow_ratio": [ + "0.93" + ], + "filament_retract_length_toolchange": [ + "10" + ], + "filament_retraction_length": [ + "3" + ], + "filament_retraction_speed": [ + "nil" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "210" + ], + "nozzle_temperature_initial_layer": [ + "210" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "pressure_advance": [ + "0.015" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_loading_speed": [ + "28" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "20" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_unloading_speed": [ + "90" + ], + "filament_unloading_speed_start": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "textured_plate_temp": [ + "65" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1.json index 97b2f8b07f..9e5d63a63c 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1.json @@ -10,5 +10,83 @@ ], "filament_type": [ "PLA" + ], + "enable_pressure_advance": [ + "1" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "fan_min_speed": [ + "100" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_loading_speed": [ + "28" + ], + "filament_minimal_purge_on_wipe_tower": [ + "20" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "20" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_retract_length_toolchange": [ + "5" + ], + "filament_retraction_length": [ + "1" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_unloading_speed": [ + "90" + ], + "filament_unloading_speed_start": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "210" + ], + "nozzle_temperature_initial_layer": [ + "210" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "pressure_advance": [ + "0.03" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" ] } diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG HF @U1 0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG HF @U1 0.2 nozzle.json new file mode 100644 index 0000000000..f1c3aa30a1 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG HF @U1 0.2 nozzle.json @@ -0,0 +1,108 @@ +{ + "type": "filament", + "name": "Snapmaker PETG HF @U1 0.2 nozzle", + "inherits": "Snapmaker PETG HF @U1 base2", + "from": "system", + "setting_id": "Ujul2YTBwfldFiFd", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "1", + "1" + ], + "filament_ramming_travel_time": [ + "0", + "0" + ], + "long_retractions_when_ec": [ + "0", + "0" + ], + "retraction_distances_when_ec": [ + "0", + "0" + ], + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "eng_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "fan_cooling_layer_time": [ + "20" + ], + "fan_max_speed": [ + "60" + ], + "fan_min_speed": [ + "30" + ], + "filament_end_gcode": [ + "\n\n" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "3" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_retract_length_toolchange": [ + "5" + ], + "filament_retraction_length": [ + "1.5" + ], + "filament_start_gcode": [ + "" + ], + "filament_vendor": [ + "Snapmaker" + ], + "hot_plate_temp": [ + "80" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "nozzle_temperature": [ + "245" + ], + "nozzle_temperature_initial_layer": [ + "245" + ], + "nozzle_temperature_range_low": [ + "230" + ], + "overhang_fan_speed": [ + "100" + ], + "slow_down_layer_time": [ + "10" + ], + "slow_down_min_speed": [ + "20" + ], + "supertack_plate_temp": [ + "60" + ], + "supertack_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp": [ + "80" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "filament_z_hop_types": [ + "Slope Lift" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG HF @U1 0.6 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG HF @U1 0.6 nozzle.json new file mode 100644 index 0000000000..66a535b7fb --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG HF @U1 0.6 nozzle.json @@ -0,0 +1,113 @@ +{ + "type": "filament", + "name": "Snapmaker PETG HF @U1 0.6 nozzle", + "inherits": "Snapmaker PETG HF @U1 base2", + "from": "system", + "setting_id": "2FfQZdp5xunngnF0", + "instantiation": "true", + "filament_ramming_travel_time": [ + "0", + "0" + ], + "long_retractions_when_ec": [ + "0", + "0" + ], + "retraction_distances_when_ec": [ + "0", + "0" + ], + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "eng_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "fan_cooling_layer_time": [ + "20" + ], + "fan_max_speed": [ + "60" + ], + "fan_min_speed": [ + "30" + ], + "filament_end_gcode": [ + "\n" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "20" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_retract_length_toolchange": [ + "5" + ], + "filament_retraction_length": [ + "2.5" + ], + "filament_start_gcode": [ + "" + ], + "filament_vendor": [ + "Snapmaker" + ], + "filament_wipe": [ + "1" + ], + "filament_wipe_distance": [ + "1" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "hot_plate_temp": [ + "80" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "nozzle_temperature": [ + "245" + ], + "nozzle_temperature_initial_layer": [ + "245" + ], + "nozzle_temperature_range_low": [ + "230" + ], + "overhang_fan_speed": [ + "100" + ], + "slow_down_layer_time": [ + "10" + ], + "slow_down_min_speed": [ + "20" + ], + "supertack_plate_temp": [ + "60" + ], + "supertack_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp": [ + "80" + ], + "textured_plate_temp_initial_layer": [ + "80" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG HF @U1 0.8 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG HF @U1 0.8 nozzle.json new file mode 100644 index 0000000000..04446a623e --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG HF @U1 0.8 nozzle.json @@ -0,0 +1,110 @@ +{ + "type": "filament", + "name": "Snapmaker PETG HF @U1 0.8 nozzle", + "inherits": "Snapmaker PETG HF @U1 base2", + "from": "system", + "setting_id": "ebANa67V4B2nwUaX", + "instantiation": "true", + "filament_ramming_travel_time": [ + "0", + "0" + ], + "long_retractions_when_ec": [ + "0", + "0" + ], + "retraction_distances_when_ec": [ + "0", + "0" + ], + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "eng_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "fan_cooling_layer_time": [ + "20" + ], + "fan_max_speed": [ + "60" + ], + "fan_min_speed": [ + "30" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "20" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_retract_length_toolchange": [ + "5" + ], + "filament_retraction_length": [ + "1" + ], + "filament_start_gcode": [ + "" + ], + "filament_vendor": [ + "Snapmaker" + ], + "filament_wipe": [ + "1" + ], + "filament_wipe_distance": [ + "2" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "hot_plate_temp": [ + "80" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "nozzle_temperature": [ + "245" + ], + "nozzle_temperature_initial_layer": [ + "245" + ], + "nozzle_temperature_range_low": [ + "230" + ], + "overhang_fan_speed": [ + "100" + ], + "slow_down_layer_time": [ + "10" + ], + "slow_down_min_speed": [ + "20" + ], + "supertack_plate_temp": [ + "60" + ], + "supertack_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp": [ + "80" + ], + "textured_plate_temp_initial_layer": [ + "80" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG HF @U1 base2.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG HF @U1 base2.json new file mode 100644 index 0000000000..0ad75759a1 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG HF @U1 base2.json @@ -0,0 +1,279 @@ +{ + "type": "filament", + "name": "Snapmaker PETG HF @U1 base2", + "inherits": "fdm_filament_petg", + "from": "system", + "filament_id": "GFG96", + "instantiation": "false", + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "eng_plate_temp": [ + "70" + ], + "eng_plate_temp_initial_layer": [ + "70" + ], + "filament_type": [ + "PETG" + ], + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "40" + ], + "filament_cost": [ + "24.99" + ], + "filament_density": [ + "1.28" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "16" + ], + "hot_plate_temp": [ + "70" + ], + "hot_plate_temp_initial_layer": [ + "70" + ], + "nozzle_temperature_range_high": [ + "270" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "overhang_fan_speed": [ + "90" + ], + "overhang_fan_threshold": [ + "10%" + ], + "slow_down_layer_time": [ + "25" + ], + "textured_plate_temp": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "70" + ], + "filament_start_gcode": [ + "; filament start gcode\n{if (bed_temperature[current_extruder] >80)||(bed_temperature_initial_layer[current_extruder] >80)}M106 P3 S255\n{elsif (bed_temperature[current_extruder] >60)||(bed_temperature_initial_layer[current_extruder] >60)}M106 P3 S180\n{endif}\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}" + ], + "activate_air_filtration": [ + "0" + ], + "additional_cooling_fan_speed": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "counter_coef_1": [ + "0" + ], + "counter_coef_2": [ + "0.008" + ], + "counter_coef_3": [ + "-0.041" + ], + "counter_limit_min": [ + "-0.035" + ], + "counter_limit_max": [ + "0.033" + ], + "circle_compensation_speed": [ + "200" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "diameter_limit": [ + "50" + ], + "fan_min_speed": [ + "20" + ], + "filament_cooling_before_tower": [ + "0" + ], + "filament_dev_ams_drying_ams_limitations": [ + "0" + ], + "filament_dev_ams_drying_temperature": [ + "40.0" + ], + "filament_dev_ams_drying_time": [ + "8.0" + ], + "filament_dev_drying_softening_temperature": [ + "40.0" + ], + "filament_dev_ams_drying_heat_distortion_temperature": [ + "45.0" + ], + "filament_dev_drying_cooling_temperature": [ + "35.0" + ], + "filament_dev_chamber_drying_bed_temperature": [ + "90.0" + ], + "filament_dev_chamber_drying_time": [ + "12.0" + ], + "filament_flush_temp": [ + "0" + ], + "filament_flush_volumetric_speed": [ + "0" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_long_retractions_when_ec": [ + "nil" + ], + "filament_ramming_volumetric_speed": [ + "-1" + ], + "filament_ramming_volumetric_speed_nc": [ + "-1" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_printable": [ + "3" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_distances_when_ec": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_vendor": [ + "Generic" + ], + "filament_prime_volume": [ + "45" + ], + "filament_prime_volume_nc": [ + "60" + ], + "filament_extruder_variant": [ + "Direct Drive Standard" + ], + "filament_scarf_seam_type": [ + "none" + ], + "filament_scarf_height": [ + "10%" + ], + "filament_scarf_gap": [ + "0%" + ], + "filament_scarf_length": [ + "10" + ], + "filament_shrink": [ + "100%" + ], + "filament_pre_cooling_temperature": [ + "0" + ], + "filament_pre_cooling_temperature_nc": [ + "0" + ], + "filament_ramming_travel_time": [ + "0" + ], + "filament_ramming_travel_time_nc": [ + "0" + ], + "filament_retract_length_nc": [ + "14" + ], + "hole_coef_1": [ + "0" + ], + "hole_coef_2": [ + "-0.008" + ], + "hole_coef_3": [ + "0.23415" + ], + "hole_limit_min": [ + "0.088" + ], + "hole_limit_max": [ + "0.22" + ], + "impact_strength_z": [ + "10" + ], + "long_retractions_when_ec": [ + "0" + ], + "retraction_distances_when_ec": [ + "0" + ], + "supertack_plate_temp": [ + "70" + ], + "supertack_plate_temp_initial_layer": [ + "70" + ], + "no_slow_down_for_cooling_on_outwalls": [ + "0" + ], + "slow_down_min_speed": [ + "10" + ], + "temperature_vitrification": [ + "70" + ], + "filament_change_length": [ + "10" + ], + "filament_velocity_adaptation_factor": [ + "1" + ], + "compatible_printers": [], + "filament_end_gcode": [ + "; filament end gcode \n\n" + ], + "filament_adaptive_volumetric_speed": [ + "0" + ], + "volumetric_speed_coefficients": [ + "0 0 0 0 0 0" + ], + "filament_adhesiveness_category": [ + "300" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 0.2 nozzle.json new file mode 100644 index 0000000000..ee6234f406 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 0.2 nozzle.json @@ -0,0 +1,110 @@ +{ + "type": "filament", + "name": "Snapmaker PETG Translucent @U1 0.2 nozzle", + "inherits": "Snapmaker PETG Translucent @U1 base", + "from": "system", + "setting_id": "UTpedqYJysaoe3OI", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "additional_cooling_fan_speed": [ + "20" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "20" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_cost": [ + "25" + ], + "filament_density": [ + "1.25" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_loading_speed": [ + "28" + ], + "filament_max_volumetric_speed": [ + "1" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "5" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_retract_length_toolchange": [ + "10" + ], + "filament_retraction_length": [ + "1" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "50" + ], + "filament_unloading_speed": [ + "90" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "hot_plate_temp": [ + "80" + ], + "nozzle_temperature": [ + "245" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_low": [ + "230" + ], + "overhang_fan_threshold": [ + "10%" + ], + "pressure_advance": [ + "0.23" + ], + "slow_down_min_speed": [ + "10" + ], + "textured_plate_temp": [ + "80" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "enable_pressure_advance": [ + "0" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 0.4 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 0.4 nozzle.json new file mode 100644 index 0000000000..e0e60a0e14 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 0.4 nozzle.json @@ -0,0 +1,98 @@ +{ + "type": "filament", + "name": "Snapmaker PETG Translucent @U1 0.4 nozzle", + "inherits": "Snapmaker PETG Translucent @U1 base", + "from": "system", + "setting_id": "k6UQJJASzFSfePqN", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "fan_max_speed": [ + "30" + ], + "fan_min_speed": [ + "10" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_cost": [ + "24.99" + ], + "filament_flow_ratio": [ + "0.97" + ], + "filament_loading_speed": [ + "28" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "20" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_retract_length_toolchange": [ + "5" + ], + "filament_retraction_length": [ + "1" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_unloading_speed": [ + "90" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "hot_plate_temp": [ + "80" + ], + "nozzle_temperature": [ + "250" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_low": [ + "230" + ], + "overhang_fan_threshold": [ + "10%" + ], + "pressure_advance": [ + "0.04" + ], + "slow_down_min_speed": [ + "10" + ], + "textured_plate_temp": [ + "80" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "filament_density": [ + "1.25" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 0.6 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 0.6 nozzle.json new file mode 100644 index 0000000000..14f59104f8 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 0.6 nozzle.json @@ -0,0 +1,107 @@ +{ + "type": "filament", + "name": "Snapmaker PETG Translucent @U1 0.6 nozzle", + "inherits": "Snapmaker PETG Translucent @U1 base", + "from": "system", + "setting_id": "FlcbnP3kWiJLMDMl", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "fan_max_speed": [ + "60" + ], + "fan_min_speed": [ + "20" + ], + "filament_cost": [ + "25" + ], + "filament_density": [ + "1.25" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "16" + ], + "hot_plate_temp": [ + "80" + ], + "nozzle_temperature": [ + "245" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_low": [ + "230" + ], + "overhang_fan_threshold": [ + "10%" + ], + "pressure_advance": [ + "0.02" + ], + "slow_down_min_speed": [ + "10" + ], + "textured_plate_temp": [ + "80" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_loading_speed": [ + "28" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "20" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_retract_length_toolchange": [ + "10" + ], + "filament_retraction_length": [ + "1.2" + ], + "filament_retraction_minimum_travel": [ + "1" + ], + "filament_unloading_speed": [ + "90" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_wipe_distance": [ + "2" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "enable_pressure_advance": [ + "0" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 0.8 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 0.8 nozzle.json new file mode 100644 index 0000000000..e746141f06 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 0.8 nozzle.json @@ -0,0 +1,104 @@ +{ + "type": "filament", + "name": "Snapmaker PETG Translucent @U1 0.8 nozzle", + "inherits": "Snapmaker PETG Translucent @U1 base", + "from": "system", + "setting_id": "aJk3TnFTU3uQGjd3", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "fan_max_speed": [ + "60" + ], + "fan_min_speed": [ + "20" + ], + "filament_cost": [ + "25" + ], + "filament_density": [ + "1.25" + ], + "filament_flow_ratio": [ + "0.97" + ], + "filament_max_volumetric_speed": [ + "16" + ], + "hot_plate_temp": [ + "80" + ], + "nozzle_temperature": [ + "245" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_low": [ + "230" + ], + "overhang_fan_threshold": [ + "10%" + ], + "pressure_advance": [ + "0.02" + ], + "slow_down_min_speed": [ + "10" + ], + "textured_plate_temp": [ + "80" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_loading_speed": [ + "28" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "30" + ], + "filament_multitool_ramming_volume": [ + "10" + ], + "filament_retract_length_toolchange": [ + "10" + ], + "filament_retraction_length": [ + "1" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_unloading_speed": [ + "90" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "enable_pressure_advance": [ + "0" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 base.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 base.json new file mode 100644 index 0000000000..eb18fb4838 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG Translucent @U1 base.json @@ -0,0 +1,8 @@ +{ + "type": "filament", + "name": "Snapmaker PETG Translucent @U1 base", + "inherits": "fdm_filament_petg", + "from": "system", + "filament_id": "PETG_TRANSLUCENT_001", + "instantiation": "false" +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Basic @U1 base.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Basic @U1 base.json new file mode 100644 index 0000000000..adf7624e1f --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Basic @U1 base.json @@ -0,0 +1,127 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Basic @U1 base", + "from": "system", + "filament_id": "1417031127011", + "instantiation": "false", + "filament_end_gcode": [ + "" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_loading_speed_start": [ + "35" + ], + "filament_loading_speed": [ + "35" + ], + "filament_unloading_speed_start": [ + "35" + ], + "filament_unloading_speed": [ + "35" + ], + "filament_load_time": [ + "2" + ], + "filament_unload_time": [ + "2" + ], + "filament_cooling_moves": [ + "2" + ], + "filament_cooling_initial_speed": [ + "35" + ], + "filament_cooling_final_speed": [ + "60" + ], + "fan_cooling_layer_time": [ + "100" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "filament_type": [ + "PLA" + ], + "filament_density": [ + "1.24" + ], + "filament_cost": [ + "20" + ], + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp": [ + "60" + ], + "hot_plate_temp": [ + "60" + ], + "textured_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "nozzle_temperature": [ + "220" + ], + "temperature_vitrification": [ + "60" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_range_high": [ + "230" + ], + "slow_down_min_speed": [ + "10" + ], + "slow_down_layer_time": [ + "4" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "filament_start_gcode": [ + "; filament start gcode\n" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Basic @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Basic @U1.json new file mode 100644 index 0000000000..4b68672fa5 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Basic @U1.json @@ -0,0 +1,284 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Basic @U1", + "inherits": "Snapmaker PLA Basic @U1 base", + "from": "system", + "setting_id": "ZtUJN4JpkR0MLpiY", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "activate_air_filtration": [ + "0" + ], + "activate_chamber_temp_control": [ + "0" + ], + "adaptive_pressure_advance": [ + "0" + ], + "adaptive_pressure_advance_bridges": [ + "0" + ], + "adaptive_pressure_advance_model": [ + "0,0,0\n0,0,0" + ], + "adaptive_pressure_advance_overhangs": [ + "0" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "chamber_temperature": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "compatible_printers_condition": "", + "compatible_prints": [], + "compatible_prints_condition": "", + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "dont_slow_down_outer_wall": [ + "0" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "enable_pressure_advance": [ + "0" + ], + "eng_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cooling_final_speed": [ + "3.5" + ], + "filament_cooling_initial_speed": [ + "10" + ], + "filament_cooling_moves": [ + "2" + ], + "filament_cost": [ + "25.4" + ], + "filament_density": [ + "1.32" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_end_gcode": [ + "; filament end gcode \n" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_is_support": [ + "0" + ], + "filament_loading_speed": [ + "10" + ], + "filament_loading_speed_start": [ + "50" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "25" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_notes": [ + "" + ], + "filament_ramming_parameters": [ + "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_length_toolchange": [ + "10" + ], + "filament_retract_lift_above": [ + "nil" + ], + "filament_retract_lift_below": [ + "nil" + ], + "filament_retract_lift_enforce": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_shrink": [ + "100%" + ], + "filament_shrinkage_compensation_z": [ + "100%" + ], + "filament_soluble": [ + "0" + ], + "filament_stamping_distance": [ + "45" + ], + "filament_stamping_loading_speed": [ + "29" + ], + "filament_start_gcode": [ + "" + ], + "filament_toolchange_delay": [ + "0" + ], + "filament_type": [ + "PLA" + ], + "filament_unloading_speed": [ + "100" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_vendor": [ + "Snapmaker" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "idle_temperature": [ + "0" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "pellet_flow_coefficient": [ + "0.4157" + ], + "pressure_advance": [ + "0.02" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "0" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "4" + ], + "slow_down_min_speed": [ + "20" + ], + "support_material_interface_fan_speed": [ + "-1" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp": [ + "40" + ], + "textured_cool_plate_temp_initial_layer": [ + "40" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Full Spectrum @U1 0.4 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Full Spectrum @U1 0.4 nozzle.json new file mode 100644 index 0000000000..990e67a79e --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Full Spectrum @U1 0.4 nozzle.json @@ -0,0 +1,284 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Full Spectrum @U1 0.4 nozzle", + "inherits": "Snapmaker PLA Basic @U1 base", + "from": "system", + "setting_id": "iybaFWrXKOsmXgMJ", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "activate_air_filtration": [ + "0" + ], + "activate_chamber_temp_control": [ + "0" + ], + "adaptive_pressure_advance": [ + "0" + ], + "adaptive_pressure_advance_bridges": [ + "0" + ], + "adaptive_pressure_advance_model": [ + "0,0,0\n0,0,0" + ], + "adaptive_pressure_advance_overhangs": [ + "0" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "chamber_temperature": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "compatible_printers_condition": "", + "compatible_prints": [], + "compatible_prints_condition": "", + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "dont_slow_down_outer_wall": [ + "0" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "enable_pressure_advance": [ + "0" + ], + "eng_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cooling_final_speed": [ + "3.5" + ], + "filament_cooling_initial_speed": [ + "10" + ], + "filament_cooling_moves": [ + "2" + ], + "filament_cost": [ + "25.4" + ], + "filament_density": [ + "1.32" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_end_gcode": [ + "; filament end gcode \n" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_is_support": [ + "0" + ], + "filament_loading_speed": [ + "10" + ], + "filament_loading_speed_start": [ + "50" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "25" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_notes": [ + "" + ], + "filament_ramming_parameters": [ + "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_length_toolchange": [ + "10" + ], + "filament_retract_lift_above": [ + "nil" + ], + "filament_retract_lift_below": [ + "nil" + ], + "filament_retract_lift_enforce": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_shrink": [ + "100%" + ], + "filament_shrinkage_compensation_z": [ + "100%" + ], + "filament_soluble": [ + "0" + ], + "filament_stamping_distance": [ + "45" + ], + "filament_stamping_loading_speed": [ + "29" + ], + "filament_start_gcode": [ + "" + ], + "filament_toolchange_delay": [ + "0" + ], + "filament_type": [ + "PLA" + ], + "filament_unloading_speed": [ + "100" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_vendor": [ + "Snapmaker" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "idle_temperature": [ + "0" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "pellet_flow_coefficient": [ + "0.4157" + ], + "pressure_advance": [ + "0.02" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "0" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "4" + ], + "slow_down_min_speed": [ + "20" + ], + "support_material_interface_fan_speed": [ + "-1" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp": [ + "40" + ], + "textured_cool_plate_temp_initial_layer": [ + "40" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Glow @U1 0.4 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Glow @U1 0.4 nozzle.json new file mode 100644 index 0000000000..907781cd2c --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Glow @U1 0.4 nozzle.json @@ -0,0 +1,95 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Glow @U1 0.4 nozzle", + "inherits": "Snapmaker PLA Glow @U1 base", + "from": "system", + "setting_id": "ee1YNNr8CwKetuvY", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "additional_cooling_fan_speed": [ + "80" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "filament_cooling_final_speed": [ + "3.4" + ], + "filament_cooling_initial_speed": [ + "2.2" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_cost": [ + "20" + ], + "filament_flow_ratio": [ + "0.97" + ], + "filament_loading_speed": [ + "28" + ], + "filament_loading_speed_start": [ + "3" + ], + "filament_max_volumetric_speed": [ + "16" + ], + "filament_minimal_purge_on_wipe_tower": [ + "30" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "20" + ], + "filament_multitool_ramming_volume": [ + "10" + ], + "filament_retract_length_toolchange": [ + "5" + ], + "filament_retraction_length": [ + "0.4" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_unloading_speed": [ + "90" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_z_hop": [ + "0.2" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "overhang_fan_threshold": [ + "50%" + ], + "slow_down_layer_time": [ + "4" + ], + "slow_down_min_speed": [ + "20" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Glow @U1 base.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Glow @U1 base.json new file mode 100644 index 0000000000..ad3c1f4bbb --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Glow @U1 base.json @@ -0,0 +1,44 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Glow @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "SPGLOW001", + "instantiation": "false", + "filament_end_gcode": [ + "" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_loading_speed_start": [ + "35" + ], + "filament_loading_speed": [ + "35" + ], + "filament_unloading_speed_start": [ + "35" + ], + "filament_unloading_speed": [ + "35" + ], + "filament_load_time": [ + "2" + ], + "filament_unload_time": [ + "2" + ], + "filament_cooling_moves": [ + "2" + ], + "filament_cooling_initial_speed": [ + "35" + ], + "filament_cooling_final_speed": [ + "60" + ], + "nozzle_temperature": [ + "220" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1 0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1 0.2 nozzle.json new file mode 100644 index 0000000000..2a8c1e40c3 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1 0.2 nozzle.json @@ -0,0 +1,287 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Matte @U1 0.2 nozzle", + "inherits": "Snapmaker PLA Matte @U1 base2", + "from": "system", + "setting_id": "d3c48DeNk7VDeeHf", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "activate_air_filtration": [ + "0" + ], + "activate_chamber_temp_control": [ + "0" + ], + "adaptive_pressure_advance": [ + "0" + ], + "adaptive_pressure_advance_bridges": [ + "0" + ], + "adaptive_pressure_advance_model": [ + "0,0,0\n0,0,0" + ], + "adaptive_pressure_advance_overhangs": [ + "0" + ], + "chamber_temperature": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "compatible_printers_condition": "", + "compatible_prints": [], + "compatible_prints_condition": "", + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "35" + ], + "cool_plate_temp_initial_layer": [ + "35" + ], + "default_filament_colour": [ + "" + ], + "dont_slow_down_outer_wall": [ + "0" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "enable_pressure_advance": [ + "0" + ], + "eng_plate_temp": [ + "45" + ], + "eng_plate_temp_initial_layer": [ + "45" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cost": [ + "24.99" + ], + "filament_density": [ + "1.26" + ], + "filament_diameter": [ + "1.75" + ], + "filament_end_gcode": [ + " " + ], + "filament_is_support": [ + "0" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_notes": [ + "" + ], + "filament_ramming_parameters": [ + "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_length_toolchange": [ + "2" + ], + "filament_retract_lift_above": [ + "nil" + ], + "filament_retract_lift_below": [ + "nil" + ], + "filament_retract_lift_enforce": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_shrink": [ + "100%" + ], + "filament_shrinkage_compensation_z": [ + "100%" + ], + "filament_soluble": [ + "0" + ], + "filament_start_gcode": [ + " " + ], + "filament_toolchange_delay": [ + "0" + ], + "filament_type": [ + "PLA" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_vendor": [ + "Snapmaker" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "idle_temperature": [ + "0" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "pellet_flow_coefficient": [ + "0.4157" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "0" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "4" + ], + "slow_down_min_speed": [ + "20" + ], + "support_material_interface_fan_speed": [ + "-1" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp": [ + "40" + ], + "textured_cool_plate_temp_initial_layer": [ + "40" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "additional_cooling_fan_speed": [ + "80" + ], + "filament_cooling_final_speed": [ + "3.5" + ], + "filament_cooling_initial_speed": [ + "10" + ], + "filament_cooling_moves": [ + "2" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_flow_ratio": [ + "1.05" + ], + "filament_loading_speed": [ + "10" + ], + "filament_loading_speed_start": [ + "50" + ], + "filament_minimal_purge_on_wipe_tower": [ + "5" + ], + "filament_multitool_ramming_flow": [ + "4" + ], + "filament_multitool_ramming_volume": [ + "4" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_stamping_distance": [ + "45" + ], + "filament_stamping_loading_speed": [ + "29" + ], + "filament_unloading_speed": [ + "100" + ], + "filament_z_hop_types": [ + "nil" + ], + "nozzle_temperature": [ + "215" + ], + "nozzle_temperature_initial_layer": [ + "215" + ], + "pressure_advance": [ + "0.025" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1 0.6 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1 0.6 nozzle.json new file mode 100644 index 0000000000..9de7615ae5 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1 0.6 nozzle.json @@ -0,0 +1,287 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Matte @U1 0.6 nozzle", + "inherits": "Snapmaker PLA Matte @U1 base2", + "from": "system", + "setting_id": "l3E1WaljDn2uoTqW", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "activate_air_filtration": [ + "0" + ], + "activate_chamber_temp_control": [ + "0" + ], + "adaptive_pressure_advance": [ + "0" + ], + "adaptive_pressure_advance_bridges": [ + "0" + ], + "adaptive_pressure_advance_model": [ + "0,0,0\n0,0,0" + ], + "adaptive_pressure_advance_overhangs": [ + "0" + ], + "chamber_temperature": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "compatible_printers_condition": "", + "compatible_prints": [], + "compatible_prints_condition": "", + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "35" + ], + "cool_plate_temp_initial_layer": [ + "35" + ], + "default_filament_colour": [ + "" + ], + "dont_slow_down_outer_wall": [ + "0" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "enable_pressure_advance": [ + "0" + ], + "eng_plate_temp": [ + "45" + ], + "eng_plate_temp_initial_layer": [ + "45" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cost": [ + "24.99" + ], + "filament_density": [ + "1.26" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_end_gcode": [ + " " + ], + "filament_is_support": [ + "0" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_notes": [ + "" + ], + "filament_ramming_parameters": [ + "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_length_toolchange": [ + "10" + ], + "filament_retract_lift_above": [ + "nil" + ], + "filament_retract_lift_below": [ + "nil" + ], + "filament_retract_lift_enforce": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_shrink": [ + "100%" + ], + "filament_shrinkage_compensation_z": [ + "100%" + ], + "filament_soluble": [ + "0" + ], + "filament_start_gcode": [ + " " + ], + "filament_toolchange_delay": [ + "0" + ], + "filament_type": [ + "PLA" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_vendor": [ + "Snapmaker" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "idle_temperature": [ + "0" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "pellet_flow_coefficient": [ + "0.4157" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "0" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "4" + ], + "slow_down_min_speed": [ + "20" + ], + "support_material_interface_fan_speed": [ + "-1" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp": [ + "40" + ], + "textured_cool_plate_temp_initial_layer": [ + "40" + ], + "textured_plate_temp": [ + "45" + ], + "textured_plate_temp_initial_layer": [ + "45" + ], + "additional_cooling_fan_speed": [ + "80" + ], + "filament_cooling_final_speed": [ + "3.5" + ], + "filament_cooling_initial_speed": [ + "10" + ], + "filament_cooling_moves": [ + "2" + ], + "filament_flow_ratio": [ + "0.99" + ], + "filament_loading_speed": [ + "10" + ], + "filament_loading_speed_start": [ + "50" + ], + "filament_multitool_ramming_flow": [ + "40" + ], + "filament_multitool_ramming_volume": [ + "10" + ], + "filament_retraction_length": [ + "0.6" + ], + "filament_stamping_distance": [ + "45" + ], + "filament_stamping_loading_speed": [ + "29" + ], + "filament_unloading_speed": [ + "100" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "215" + ], + "nozzle_temperature_initial_layer": [ + "215" + ], + "pressure_advance": [ + "0.015" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1 0.8 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1 0.8 nozzle.json new file mode 100644 index 0000000000..251b2a47b6 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1 0.8 nozzle.json @@ -0,0 +1,287 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Matte @U1 0.8 nozzle", + "inherits": "Snapmaker PLA Matte @U1 base2", + "from": "system", + "setting_id": "NLPd4AA0seW3NXdy", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "activate_air_filtration": [ + "0" + ], + "activate_chamber_temp_control": [ + "0" + ], + "adaptive_pressure_advance": [ + "0" + ], + "adaptive_pressure_advance_bridges": [ + "0" + ], + "adaptive_pressure_advance_model": [ + "0,0,0\n0,0,0" + ], + "adaptive_pressure_advance_overhangs": [ + "0" + ], + "chamber_temperature": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "compatible_printers_condition": "", + "compatible_prints": [], + "compatible_prints_condition": "", + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "35" + ], + "cool_plate_temp_initial_layer": [ + "35" + ], + "default_filament_colour": [ + "" + ], + "dont_slow_down_outer_wall": [ + "0" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "enable_pressure_advance": [ + "0" + ], + "eng_plate_temp": [ + "45" + ], + "eng_plate_temp_initial_layer": [ + "45" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cost": [ + "24.99" + ], + "filament_density": [ + "1.26" + ], + "filament_diameter": [ + "1.75" + ], + "filament_end_gcode": [ + " " + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_is_support": [ + "0" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_notes": [ + "" + ], + "filament_ramming_parameters": [ + "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_length_toolchange": [ + "10" + ], + "filament_retract_lift_above": [ + "nil" + ], + "filament_retract_lift_below": [ + "nil" + ], + "filament_retract_lift_enforce": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_shrink": [ + "100%" + ], + "filament_shrinkage_compensation_z": [ + "100%" + ], + "filament_soluble": [ + "0" + ], + "filament_start_gcode": [ + " " + ], + "filament_toolchange_delay": [ + "0" + ], + "filament_type": [ + "PLA" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_vendor": [ + "Snapmaker" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "idle_temperature": [ + "0" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "pellet_flow_coefficient": [ + "0.4157" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "0" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "4" + ], + "slow_down_min_speed": [ + "20" + ], + "support_material_interface_fan_speed": [ + "-1" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp": [ + "40" + ], + "textured_cool_plate_temp_initial_layer": [ + "40" + ], + "nozzle_temperature": [ + "215" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "additional_cooling_fan_speed": [ + "80" + ], + "filament_cooling_final_speed": [ + "3.5" + ], + "filament_cooling_initial_speed": [ + "10" + ], + "filament_cooling_moves": [ + "2" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_loading_speed": [ + "10" + ], + "filament_loading_speed_start": [ + "50" + ], + "filament_multitool_ramming_flow": [ + "40" + ], + "filament_multitool_ramming_volume": [ + "10" + ], + "filament_retraction_length": [ + "0.6" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_stamping_distance": [ + "45" + ], + "filament_stamping_loading_speed": [ + "29" + ], + "filament_unloading_speed": [ + "100" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature_initial_layer": [ + "215" + ], + "pressure_advance": [ + "0.015" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1 base2.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1 base2.json new file mode 100644 index 0000000000..6c0dcf26fd --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1 base2.json @@ -0,0 +1,127 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Matte @U1 base2", + "from": "system", + "filament_id": "141703112701", + "instantiation": "false", + "filament_end_gcode": [ + "" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_loading_speed_start": [ + "35" + ], + "filament_loading_speed": [ + "35" + ], + "filament_unloading_speed_start": [ + "35" + ], + "filament_unloading_speed": [ + "35" + ], + "filament_load_time": [ + "2" + ], + "filament_unload_time": [ + "2" + ], + "filament_cooling_moves": [ + "2" + ], + "filament_cooling_initial_speed": [ + "35" + ], + "filament_cooling_final_speed": [ + "60" + ], + "fan_cooling_layer_time": [ + "100" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "filament_type": [ + "PLA" + ], + "filament_density": [ + "1.24" + ], + "filament_cost": [ + "20" + ], + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp": [ + "60" + ], + "hot_plate_temp": [ + "60" + ], + "textured_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "nozzle_temperature": [ + "220" + ], + "temperature_vitrification": [ + "60" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_range_high": [ + "230" + ], + "slow_down_min_speed": [ + "10" + ], + "slow_down_layer_time": [ + "4" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "filament_start_gcode": [ + "; filament start gcode\n" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1.json index fcb1d74c92..a71c43f9b0 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Matte @U1.json @@ -27,7 +27,7 @@ "0" ], "additional_cooling_fan_speed": [ - "70" + "80" ], "chamber_temperature": [ "0" @@ -47,9 +47,6 @@ "cool_plate_temp_initial_layer": [ "60" ], - "default_filament_colour": [ - "" - ], "dont_slow_down_outer_wall": [ "0" ], @@ -60,7 +57,7 @@ "1" ], "enable_pressure_advance": [ - "1" + "0" ], "eng_plate_temp": [ "60" @@ -102,7 +99,7 @@ "; filament end gcode \n" ], "filament_flow_ratio": [ - "1.01" + "1" ], "filament_is_support": [ "0" @@ -117,7 +114,7 @@ "nil" ], "filament_max_volumetric_speed": [ - "20" + "22" ], "filament_minimal_purge_on_wipe_tower": [ "15" @@ -140,6 +137,9 @@ "filament_retract_before_wipe": [ "nil" ], + "filament_retract_length_toolchange": [ + "5" + ], "filament_retract_lift_above": [ "nil" ], @@ -216,19 +216,19 @@ "0" ], "hot_plate_temp": [ - "55" + "65" ], "hot_plate_temp_initial_layer": [ - "55" + "65" ], "idle_temperature": [ "0" ], "nozzle_temperature": [ - "220" + "215" ], "nozzle_temperature_initial_layer": [ - "220" + "215" ], "nozzle_temperature_range_high": [ "240" @@ -276,9 +276,9 @@ "40" ], "textured_plate_temp": [ - "60" + "65" ], "textured_plate_temp_initial_layer": [ - "60" + "65" ] } diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Metal @U1 base.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Metal @U1 base.json index a530b9208e..9fba864f40 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA Metal @U1 base.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Metal @U1 base.json @@ -46,8 +46,5 @@ ], "nozzle_temperature": [ "220" - ], - "default_filament_colour": [ - "" ] } diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1 0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1 0.2 nozzle.json new file mode 100644 index 0000000000..5eb860506c --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1 0.2 nozzle.json @@ -0,0 +1,285 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Silk @U1 0.2 nozzle", + "inherits": "Snapmaker PLA Basic @U1 base", + "from": "system", + "setting_id": "Q5xH6oGGlbXr14Pa", + "filament_id": "11813638720", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "activate_air_filtration": [ + "0" + ], + "activate_chamber_temp_control": [ + "0" + ], + "adaptive_pressure_advance": [ + "0" + ], + "adaptive_pressure_advance_bridges": [ + "0" + ], + "adaptive_pressure_advance_model": [ + "0,0,0\n0,0,0" + ], + "adaptive_pressure_advance_overhangs": [ + "0" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "chamber_temperature": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "compatible_printers_condition": "", + "compatible_prints": [], + "compatible_prints_condition": "", + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "enable_pressure_advance": [ + "0" + ], + "eng_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cost": [ + "25.4" + ], + "filament_density": [ + "1.32" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_end_gcode": [ + "; filament end gcode \n" + ], + "filament_flow_ratio": [ + "1.02" + ], + "filament_is_support": [ + "0" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "3" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_notes": [ + "" + ], + "filament_ramming_parameters": [ + "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_length_toolchange": [ + "5" + ], + "filament_retract_lift_above": [ + "nil" + ], + "filament_retract_lift_below": [ + "nil" + ], + "filament_retract_lift_enforce": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_shrink": [ + "100%" + ], + "filament_shrinkage_compensation_z": [ + "100%" + ], + "filament_soluble": [ + "0" + ], + "filament_start_gcode": [ + "" + ], + "filament_toolchange_delay": [ + "0" + ], + "filament_type": [ + "PLA" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_vendor": [ + "Snapmaker" + ], + "filament_wipe": [ + "1" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "full_fan_speed_layer": [ + "0" + ], + "idle_temperature": [ + "0" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "pellet_flow_coefficient": [ + "0.4157" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "0" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "18" + ], + "slow_down_min_speed": [ + "20" + ], + "support_material_interface_fan_speed": [ + "-1" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp": [ + "40" + ], + "textured_cool_plate_temp_initial_layer": [ + "40" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "dont_slow_down_outer_wall": [ + "1" + ], + "filament_cooling_final_speed": [ + "3.4" + ], + "filament_cooling_initial_speed": [ + "2.2" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_loading_speed": [ + "28" + ], + "filament_loading_speed_start": [ + "3" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "filament_retraction_length": [ + "0.4" + ], + "filament_stamping_distance": [ + "0" + ], + "filament_stamping_loading_speed": [ + "0" + ], + "filament_unloading_speed": [ + "90" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "230" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "pressure_advance": [ + "0.015" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1 0.6 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1 0.6 nozzle.json new file mode 100644 index 0000000000..5df6ff5a3a --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1 0.6 nozzle.json @@ -0,0 +1,285 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Silk @U1 0.6 nozzle", + "inherits": "Snapmaker PLA Basic @U1 base", + "from": "system", + "setting_id": "2pieDQoz9PiDCnU1", + "filament_id": "11813638720", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "activate_air_filtration": [ + "0" + ], + "activate_chamber_temp_control": [ + "0" + ], + "adaptive_pressure_advance": [ + "0" + ], + "adaptive_pressure_advance_bridges": [ + "0" + ], + "adaptive_pressure_advance_model": [ + "0,0,0\n0,0,0" + ], + "adaptive_pressure_advance_overhangs": [ + "0" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "chamber_temperature": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "compatible_printers_condition": "", + "compatible_prints": [], + "compatible_prints_condition": "", + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "enable_pressure_advance": [ + "0" + ], + "eng_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cost": [ + "25.4" + ], + "filament_density": [ + "1.32" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_end_gcode": [ + "; filament end gcode \n" + ], + "filament_flow_ratio": [ + "0.97" + ], + "filament_is_support": [ + "0" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "40" + ], + "filament_multitool_ramming_volume": [ + "10" + ], + "filament_notes": [ + "" + ], + "filament_ramming_parameters": [ + "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_length_toolchange": [ + "10" + ], + "filament_retract_lift_above": [ + "nil" + ], + "filament_retract_lift_below": [ + "nil" + ], + "filament_retract_lift_enforce": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_shrink": [ + "100%" + ], + "filament_shrinkage_compensation_z": [ + "100%" + ], + "filament_soluble": [ + "0" + ], + "filament_start_gcode": [ + "" + ], + "filament_toolchange_delay": [ + "0" + ], + "filament_type": [ + "PLA" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_vendor": [ + "Snapmaker" + ], + "filament_wipe": [ + "1" + ], + "filament_wipe_distance": [ + "1" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "full_fan_speed_layer": [ + "0" + ], + "idle_temperature": [ + "0" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "pellet_flow_coefficient": [ + "0.4157" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "0" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "15" + ], + "slow_down_min_speed": [ + "20" + ], + "support_material_interface_fan_speed": [ + "-1" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp": [ + "40" + ], + "textured_cool_plate_temp_initial_layer": [ + "40" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "dont_slow_down_outer_wall": [ + "0" + ], + "filament_cooling_final_speed": [ + "3.4" + ], + "filament_cooling_initial_speed": [ + "2.2" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_loading_speed": [ + "28" + ], + "filament_loading_speed_start": [ + "3" + ], + "filament_max_volumetric_speed": [ + "10" + ], + "filament_retraction_length": [ + "0.4" + ], + "filament_stamping_distance": [ + "0" + ], + "filament_stamping_loading_speed": [ + "0" + ], + "filament_unloading_speed": [ + "90" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "230" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "pressure_advance": [ + "0.015" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1 0.8 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1 0.8 nozzle.json new file mode 100644 index 0000000000..0758372ea0 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1 0.8 nozzle.json @@ -0,0 +1,285 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Silk @U1 0.8 nozzle", + "inherits": "Snapmaker PLA Basic @U1 base", + "from": "system", + "setting_id": "f3H0JFUnds0mkKCN", + "filament_id": "11813638720", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "activate_air_filtration": [ + "0" + ], + "activate_chamber_temp_control": [ + "0" + ], + "adaptive_pressure_advance": [ + "0" + ], + "adaptive_pressure_advance_bridges": [ + "0" + ], + "adaptive_pressure_advance_model": [ + "0,0,0\n0,0,0" + ], + "adaptive_pressure_advance_overhangs": [ + "0" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "chamber_temperature": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "compatible_printers_condition": "", + "compatible_prints": [], + "compatible_prints_condition": "", + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "enable_pressure_advance": [ + "0" + ], + "eng_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cost": [ + "25.4" + ], + "filament_density": [ + "1.32" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_end_gcode": [ + "; filament end gcode \n" + ], + "filament_flow_ratio": [ + "0.97" + ], + "filament_is_support": [ + "0" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "40" + ], + "filament_multitool_ramming_volume": [ + "10" + ], + "filament_notes": [ + "" + ], + "filament_ramming_parameters": [ + "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_length_toolchange": [ + "10" + ], + "filament_retract_lift_above": [ + "nil" + ], + "filament_retract_lift_below": [ + "nil" + ], + "filament_retract_lift_enforce": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_shrink": [ + "100%" + ], + "filament_shrinkage_compensation_z": [ + "100%" + ], + "filament_soluble": [ + "0" + ], + "filament_start_gcode": [ + "" + ], + "filament_toolchange_delay": [ + "0" + ], + "filament_type": [ + "PLA" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_vendor": [ + "Snapmaker" + ], + "filament_wipe": [ + "1" + ], + "filament_wipe_distance": [ + "1" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "full_fan_speed_layer": [ + "0" + ], + "idle_temperature": [ + "0" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "pellet_flow_coefficient": [ + "0.4157" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "0" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "15" + ], + "slow_down_min_speed": [ + "20" + ], + "support_material_interface_fan_speed": [ + "-1" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp": [ + "40" + ], + "textured_cool_plate_temp_initial_layer": [ + "40" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "dont_slow_down_outer_wall": [ + "0" + ], + "filament_cooling_final_speed": [ + "3.4" + ], + "filament_cooling_initial_speed": [ + "2.2" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_loading_speed": [ + "28" + ], + "filament_loading_speed_start": [ + "3" + ], + "filament_max_volumetric_speed": [ + "10" + ], + "filament_retraction_length": [ + "0.4" + ], + "filament_stamping_distance": [ + "0" + ], + "filament_stamping_loading_speed": [ + "0" + ], + "filament_unloading_speed": [ + "90" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "230" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "pressure_advance": [ + "0.015" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1 base.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1 base.json index 12d65834ea..227fa034dc 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1 base.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1 base.json @@ -55,8 +55,5 @@ ], "nozzle_temperature": [ "230" - ], - "default_filament_colour": [ - "" ] } diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1.json index 7fdf44e792..c68904ffd9 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1.json @@ -1,11 +1,285 @@ { "type": "filament", "name": "Snapmaker PLA Silk @U1", - "inherits": "Snapmaker PLA Silk @U1 base", + "inherits": "Snapmaker PLA Basic @U1 base", "from": "system", "setting_id": "9PkHSwtXFM0zPWth", + "filament_id": "11813638720", "instantiation": "true", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" + ], + "activate_air_filtration": [ + "0" + ], + "activate_chamber_temp_control": [ + "0" + ], + "adaptive_pressure_advance": [ + "0" + ], + "adaptive_pressure_advance_bridges": [ + "0" + ], + "adaptive_pressure_advance_model": [ + "0,0,0\n0,0,0" + ], + "adaptive_pressure_advance_overhangs": [ + "0" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "chamber_temperature": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "compatible_printers_condition": "", + "compatible_prints": [], + "compatible_prints_condition": "", + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "enable_pressure_advance": [ + "0" + ], + "eng_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cost": [ + "25.4" + ], + "filament_density": [ + "1.32" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_end_gcode": [ + "; filament end gcode \n" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_is_support": [ + "0" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "25" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_notes": [ + "" + ], + "filament_ramming_parameters": [ + "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_length_toolchange": [ + "5" + ], + "filament_retract_lift_above": [ + "nil" + ], + "filament_retract_lift_below": [ + "nil" + ], + "filament_retract_lift_enforce": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_shrink": [ + "100%" + ], + "filament_shrinkage_compensation_z": [ + "100%" + ], + "filament_soluble": [ + "0" + ], + "filament_start_gcode": [ + "" + ], + "filament_toolchange_delay": [ + "0" + ], + "filament_type": [ + "PLA" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_vendor": [ + "Snapmaker" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "idle_temperature": [ + "0" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "pellet_flow_coefficient": [ + "0.4157" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "0" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "4" + ], + "slow_down_min_speed": [ + "20" + ], + "support_material_interface_fan_speed": [ + "-1" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp": [ + "40" + ], + "textured_cool_plate_temp_initial_layer": [ + "40" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "dont_slow_down_outer_wall": [ + "1" + ], + "filament_cooling_final_speed": [ + "3.4" + ], + "filament_cooling_initial_speed": [ + "2.2" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_loading_speed": [ + "28" + ], + "filament_loading_speed_start": [ + "3" + ], + "filament_max_volumetric_speed": [ + "10" + ], + "filament_retraction_length": [ + "0.2" + ], + "filament_stamping_distance": [ + "0" + ], + "filament_stamping_loading_speed": [ + "0" + ], + "filament_unloading_speed": [ + "90" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "230" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "pressure_advance": [ + "0.015" ] } diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1 0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1 0.2 nozzle.json new file mode 100644 index 0000000000..7fcb20f31b --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1 0.2 nozzle.json @@ -0,0 +1,50 @@ +{ + "type": "filament", + "name": "Snapmaker PLA SnapSpeed @U1 0.2 nozzle", + "inherits": "Snapmaker PLA SnapSpeed @U1 base2", + "from": "system", + "setting_id": "jsAgNNiUC6DoO7rz", + "instantiation": "true", + "filament_deretraction_speed": [ + "30" + ], + "filament_flow_ratio": [ + "1.01" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "filament_multitool_ramming_flow": [ + "30" + ], + "filament_retract_length_toolchange": [ + "5" + ], + "filament_retraction_speed": [ + "30" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "pressure_advance": [ + "0.2" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "enable_pressure_advance": [ + "0" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1 0.6 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1 0.6 nozzle.json new file mode 100644 index 0000000000..18fca8b4fd --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1 0.6 nozzle.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Snapmaker PLA SnapSpeed @U1 0.6 nozzle", + "inherits": "Snapmaker PLA SnapSpeed @U1 base2", + "from": "system", + "setting_id": "aKudBpQBj3MZZZav", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "filament_deretraction_speed": [ + "30" + ], + "filament_flow_ratio": [ + "0.97" + ], + "filament_multitool_ramming_flow": [ + "30" + ], + "filament_retract_length_toolchange": [ + "5" + ], + "filament_retraction_length": [ + "1.6" + ], + "filament_retraction_speed": [ + "30" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "enable_pressure_advance": [ + "0" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1 0.8 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1 0.8 nozzle.json new file mode 100644 index 0000000000..2ebadbd2b2 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1 0.8 nozzle.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Snapmaker PLA SnapSpeed @U1 0.8 nozzle", + "inherits": "Snapmaker PLA SnapSpeed @U1 base2", + "from": "system", + "setting_id": "sWoInox4hzxzIHfe", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "filament_deretraction_speed": [ + "30" + ], + "filament_multitool_ramming_flow": [ + "30" + ], + "filament_retract_length_toolchange": [ + "5" + ], + "filament_retraction_length": [ + "1.6" + ], + "filament_retraction_speed": [ + "30" + ], + "nozzle_temperature": [ + "215" + ], + "pressure_advance": [ + "0.018" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "enable_pressure_advance": [ + "0" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1 base2.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1 base2.json new file mode 100644 index 0000000000..84889e3d9b --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1 base2.json @@ -0,0 +1,281 @@ +{ + "type": "filament", + "name": "Snapmaker PLA SnapSpeed @U1 base2", + "from": "system", + "filament_id": "141703112701", + "instantiation": "false", + "activate_air_filtration": [ + "0" + ], + "activate_chamber_temp_control": [ + "0" + ], + "adaptive_pressure_advance": [ + "0" + ], + "adaptive_pressure_advance_bridges": [ + "0" + ], + "adaptive_pressure_advance_model": [ + "0,0,0\n0,0,0" + ], + "adaptive_pressure_advance_overhangs": [ + "0" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "chamber_temperature": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "compatible_printers": [], + "compatible_printers_condition": "", + "compatible_prints": [], + "compatible_prints_condition": "", + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "35" + ], + "cool_plate_temp_initial_layer": [ + "35" + ], + "default_filament_colour": [ + "" + ], + "dont_slow_down_outer_wall": [ + "0" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "enable_pressure_advance": [ + "1" + ], + "eng_plate_temp": [ + "45" + ], + "eng_plate_temp_initial_layer": [ + "45" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cooling_final_speed": [ + "3.4" + ], + "filament_cooling_initial_speed": [ + "2.2" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_cost": [ + "24.99" + ], + "filament_density": [ + "1.26" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_end_gcode": [ + " " + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_is_support": [ + "0" + ], + "filament_loading_speed": [ + "28" + ], + "filament_loading_speed_start": [ + "3" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "20" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_notes": [ + "" + ], + "filament_ramming_parameters": [ + "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_lift_above": [ + "nil" + ], + "filament_retract_lift_below": [ + "nil" + ], + "filament_retract_lift_enforce": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_shrink": [ + "100%" + ], + "filament_shrinkage_compensation_z": [ + "100%" + ], + "filament_soluble": [ + "0" + ], + "filament_stamping_distance": [ + "0" + ], + "filament_stamping_loading_speed": [ + "0" + ], + "filament_start_gcode": [ + " " + ], + "filament_toolchange_delay": [ + "0" + ], + "filament_type": [ + "PLA" + ], + "filament_unloading_speed": [ + "90" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_vendor": [ + "snapmaker" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "55" + ], + "hot_plate_temp_initial_layer": [ + "55" + ], + "idle_temperature": [ + "0" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "pellet_flow_coefficient": [ + "0.4157" + ], + "pressure_advance": [ + "0.02" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "0" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "4" + ], + "slow_down_min_speed": [ + "20" + ], + "support_material_interface_fan_speed": [ + "-1" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp": [ + "40" + ], + "textured_cool_plate_temp_initial_layer": [ + "40" + ], + "textured_plate_temp": [ + "45" + ], + "textured_plate_temp_initial_layer": [ + "45" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1.json index 96d86d2a81..2525f5b2a9 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA SnapSpeed @U1.json @@ -33,13 +33,13 @@ "0" ], "close_fan_the_first_x_layers": [ - "3" + "1" ], "compatible_printers_condition": "", "compatible_prints": [], "compatible_prints_condition": "", "complete_print_exhaust_fan_speed": [ - "80" + "70" ], "cool_plate_temp": [ "60" @@ -47,20 +47,17 @@ "cool_plate_temp_initial_layer": [ "60" ], - "default_filament_colour": [ - "" - ], "dont_slow_down_outer_wall": [ "0" ], "during_print_exhaust_fan_speed": [ - "60" + "70" ], "enable_overhang_bridge_fan": [ "1" ], "enable_pressure_advance": [ - "1" + "0" ], "eng_plate_temp": [ "60" @@ -102,7 +99,7 @@ "; filament end gcode \n" ], "filament_flow_ratio": [ - "0.99" + "0.966" ], "filament_is_support": [ "0" @@ -117,7 +114,7 @@ "nil" ], "filament_max_volumetric_speed": [ - "18" + "20" ], "filament_minimal_purge_on_wipe_tower": [ "15" @@ -126,7 +123,7 @@ "1" ], "filament_multitool_ramming_flow": [ - "40" + "30" ], "filament_multitool_ramming_volume": [ "5" @@ -140,6 +137,9 @@ "filament_retract_before_wipe": [ "nil" ], + "filament_retract_length_toolchange": [ + "5" + ], "filament_retract_lift_above": [ "nil" ], @@ -159,13 +159,13 @@ "nil" ], "filament_retraction_length": [ - "0.8" + "1.2" ], "filament_retraction_minimum_travel": [ "nil" ], "filament_retraction_speed": [ - "30" + "nil" ], "filament_shrink": [ "100%" @@ -207,19 +207,19 @@ "nil" ], "filament_z_hop": [ - "nil" + "0.4" ], "filament_z_hop_types": [ - "nil" + "Slope Lift" ], "full_fan_speed_layer": [ "0" ], "hot_plate_temp": [ - "55" + "65" ], "hot_plate_temp_initial_layer": [ - "55" + "65" ], "idle_temperature": [ "0" @@ -231,7 +231,7 @@ "220" ], "nozzle_temperature_range_high": [ - "230" + "240" ], "nozzle_temperature_range_low": [ "190" @@ -246,7 +246,7 @@ "0.4157" ], "pressure_advance": [ - "0.026" + "0.02" ], "reduce_fan_stop_start_freq": [ "1" @@ -267,7 +267,7 @@ "-1" ], "temperature_vitrification": [ - "60" + "45" ], "textured_cool_plate_temp": [ "40" @@ -276,9 +276,9 @@ "40" ], "textured_plate_temp": [ - "60" + "65" ], "textured_plate_temp_initial_layer": [ - "60" + "65" ] } diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 0.2 nozzle.json new file mode 100644 index 0000000000..6271b7af42 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 0.2 nozzle.json @@ -0,0 +1,284 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Translucent @U1 0.2 nozzle", + "inherits": "Snapmaker PLA Translucent @U1 base", + "from": "system", + "setting_id": "zIg9XLrieYNBduyn", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "activate_air_filtration": [ + "0" + ], + "activate_chamber_temp_control": [ + "0" + ], + "adaptive_pressure_advance": [ + "0" + ], + "adaptive_pressure_advance_bridges": [ + "0" + ], + "adaptive_pressure_advance_model": [ + "0,0,0\n0,0,0" + ], + "adaptive_pressure_advance_overhangs": [ + "0" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "chamber_temperature": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "compatible_printers_condition": "", + "compatible_prints": [], + "compatible_prints_condition": "", + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "dont_slow_down_outer_wall": [ + "0" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "enable_pressure_advance": [ + "0" + ], + "eng_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cooling_final_speed": [ + "3.4" + ], + "filament_cooling_initial_speed": [ + "2.2" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_cost": [ + "25" + ], + "filament_density": [ + "1.22" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_end_gcode": [ + "; filament end gcode \n" + ], + "filament_flow_ratio": [ + "1.02" + ], + "filament_is_support": [ + "0" + ], + "filament_loading_speed": [ + "28" + ], + "filament_loading_speed_start": [ + "3" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_max_volumetric_speed": [ + "1.6" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "5" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_notes": [ + "" + ], + "filament_ramming_parameters": [ + "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" + ], + "filament_retract_before_wipe": [ + "0%" + ], + "filament_retract_length_toolchange": [ + "5" + ], + "filament_retract_lift_above": [ + "nil" + ], + "filament_retract_lift_below": [ + "nil" + ], + "filament_retract_lift_enforce": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_length": [ + "0.2" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_shrink": [ + "100%" + ], + "filament_shrinkage_compensation_z": [ + "100%" + ], + "filament_soluble": [ + "0" + ], + "filament_stamping_distance": [ + "0" + ], + "filament_stamping_loading_speed": [ + "0" + ], + "filament_start_gcode": [ + "; filament start gcode\n" + ], + "filament_toolchange_delay": [ + "0" + ], + "filament_type": [ + "PLA" + ], + "filament_unloading_speed": [ + "90" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_vendor": [ + "Snapmaker" + ], + "filament_wipe": [ + "1" + ], + "filament_wipe_distance": [ + "1" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "idle_temperature": [ + "0" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "200" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "pellet_flow_coefficient": [ + "0.4157" + ], + "pressure_advance": [ + "0.15" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "0" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "10" + ], + "slow_down_min_speed": [ + "20" + ], + "support_material_interface_fan_speed": [ + "-1" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp": [ + "40" + ], + "textured_cool_plate_temp_initial_layer": [ + "40" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 0.4 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 0.4 nozzle.json new file mode 100644 index 0000000000..7d4270ef31 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 0.4 nozzle.json @@ -0,0 +1,284 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Translucent @U1 0.4 nozzle", + "inherits": "Snapmaker PLA Translucent @U1 base", + "from": "system", + "setting_id": "RqtrcLcy124ICGEc", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "activate_air_filtration": [ + "0" + ], + "activate_chamber_temp_control": [ + "0" + ], + "adaptive_pressure_advance": [ + "0" + ], + "adaptive_pressure_advance_bridges": [ + "0" + ], + "adaptive_pressure_advance_model": [ + "0,0,0\n0,0,0" + ], + "adaptive_pressure_advance_overhangs": [ + "0" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "chamber_temperature": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "compatible_printers_condition": "", + "compatible_prints": [], + "compatible_prints_condition": "", + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "dont_slow_down_outer_wall": [ + "0" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "enable_pressure_advance": [ + "1" + ], + "eng_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cooling_final_speed": [ + "3.4" + ], + "filament_cooling_initial_speed": [ + "2.2" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_cost": [ + "25.4" + ], + "filament_density": [ + "1.32" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_end_gcode": [ + "; filament end gcode \n" + ], + "filament_flow_ratio": [ + "0.97" + ], + "filament_is_support": [ + "0" + ], + "filament_loading_speed": [ + "8" + ], + "filament_loading_speed_start": [ + "3" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "filament_minimal_purge_on_wipe_tower": [ + "50" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "20" + ], + "filament_multitool_ramming_volume": [ + "10" + ], + "filament_notes": [ + "" + ], + "filament_ramming_parameters": [ + "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_length_toolchange": [ + "5" + ], + "filament_retract_lift_above": [ + "nil" + ], + "filament_retract_lift_below": [ + "nil" + ], + "filament_retract_lift_enforce": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_length": [ + "0.2" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_shrink": [ + "100%" + ], + "filament_shrinkage_compensation_z": [ + "100%" + ], + "filament_soluble": [ + "0" + ], + "filament_stamping_distance": [ + "0" + ], + "filament_stamping_loading_speed": [ + "0" + ], + "filament_start_gcode": [ + "; filament start gcode\n" + ], + "filament_toolchange_delay": [ + "0" + ], + "filament_type": [ + "PLA" + ], + "filament_unloading_speed": [ + "90" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_vendor": [ + "Snapmaker" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "idle_temperature": [ + "0" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "pellet_flow_coefficient": [ + "0.4157" + ], + "pressure_advance": [ + "0.02" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "0" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "8" + ], + "slow_down_min_speed": [ + "20" + ], + "support_material_interface_fan_speed": [ + "-1" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp": [ + "40" + ], + "textured_cool_plate_temp_initial_layer": [ + "40" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 0.6 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 0.6 nozzle.json new file mode 100644 index 0000000000..af3f95c757 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 0.6 nozzle.json @@ -0,0 +1,284 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Translucent @U1 0.6 nozzle", + "inherits": "Snapmaker PLA Translucent @U1 base", + "from": "system", + "setting_id": "OZHemzEcvzFMN8fL", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "activate_air_filtration": [ + "0" + ], + "activate_chamber_temp_control": [ + "0" + ], + "adaptive_pressure_advance": [ + "0" + ], + "adaptive_pressure_advance_bridges": [ + "0" + ], + "adaptive_pressure_advance_model": [ + "0,0,0\n0,0,0" + ], + "adaptive_pressure_advance_overhangs": [ + "0" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "chamber_temperature": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "compatible_printers_condition": "", + "compatible_prints": [], + "compatible_prints_condition": "", + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "dont_slow_down_outer_wall": [ + "0" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "enable_pressure_advance": [ + "0" + ], + "eng_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cooling_final_speed": [ + "3.4" + ], + "filament_cooling_initial_speed": [ + "2.2" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_cost": [ + "25" + ], + "filament_density": [ + "1.22" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_end_gcode": [ + "; filament end gcode \n" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_is_support": [ + "0" + ], + "filament_loading_speed": [ + "28" + ], + "filament_loading_speed_start": [ + "3" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "20" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_notes": [ + "" + ], + "filament_ramming_parameters": [ + "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" + ], + "filament_retract_before_wipe": [ + "0%" + ], + "filament_retract_length_toolchange": [ + "10" + ], + "filament_retract_lift_above": [ + "nil" + ], + "filament_retract_lift_below": [ + "nil" + ], + "filament_retract_lift_enforce": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_length": [ + "0.5" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "50" + ], + "filament_shrink": [ + "100%" + ], + "filament_shrinkage_compensation_z": [ + "100%" + ], + "filament_soluble": [ + "0" + ], + "filament_stamping_distance": [ + "0" + ], + "filament_stamping_loading_speed": [ + "0" + ], + "filament_start_gcode": [ + "; filament start gcode\n" + ], + "filament_toolchange_delay": [ + "0" + ], + "filament_type": [ + "PLA" + ], + "filament_unloading_speed": [ + "90" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_vendor": [ + "Snapmaker" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "idle_temperature": [ + "0" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "200" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "pellet_flow_coefficient": [ + "0.4157" + ], + "pressure_advance": [ + "0.02" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "0" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "8" + ], + "slow_down_min_speed": [ + "20" + ], + "support_material_interface_fan_speed": [ + "-1" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp": [ + "40" + ], + "textured_cool_plate_temp_initial_layer": [ + "40" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 0.8 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 0.8 nozzle.json new file mode 100644 index 0000000000..a10a4b2fb1 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 0.8 nozzle.json @@ -0,0 +1,284 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Translucent @U1 0.8 nozzle", + "inherits": "Snapmaker PLA Translucent @U1 base", + "from": "system", + "setting_id": "IPehCg9fKawLorB5", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "activate_air_filtration": [ + "0" + ], + "activate_chamber_temp_control": [ + "0" + ], + "adaptive_pressure_advance": [ + "0" + ], + "adaptive_pressure_advance_bridges": [ + "0" + ], + "adaptive_pressure_advance_model": [ + "0,0,0\n0,0,0" + ], + "adaptive_pressure_advance_overhangs": [ + "0" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "chamber_temperature": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "compatible_printers_condition": "", + "compatible_prints": [], + "compatible_prints_condition": "", + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "dont_slow_down_outer_wall": [ + "0" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "enable_pressure_advance": [ + "0" + ], + "eng_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cooling_final_speed": [ + "3.4" + ], + "filament_cooling_initial_speed": [ + "2.2" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_cost": [ + "25" + ], + "filament_density": [ + "1.22" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_end_gcode": [ + "; filament end gcode \n" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_is_support": [ + "0" + ], + "filament_loading_speed": [ + "28" + ], + "filament_loading_speed_start": [ + "3" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "20" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_notes": [ + "" + ], + "filament_ramming_parameters": [ + "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" + ], + "filament_retract_before_wipe": [ + "0%" + ], + "filament_retract_length_toolchange": [ + "10" + ], + "filament_retract_lift_above": [ + "nil" + ], + "filament_retract_lift_below": [ + "nil" + ], + "filament_retract_lift_enforce": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_length": [ + "1" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_shrink": [ + "100%" + ], + "filament_shrinkage_compensation_z": [ + "100%" + ], + "filament_soluble": [ + "0" + ], + "filament_stamping_distance": [ + "0" + ], + "filament_stamping_loading_speed": [ + "0" + ], + "filament_start_gcode": [ + "; filament start gcode\n" + ], + "filament_toolchange_delay": [ + "0" + ], + "filament_type": [ + "PLA" + ], + "filament_unloading_speed": [ + "90" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_vendor": [ + "Snapmaker" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "idle_temperature": [ + "0" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "200" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "pellet_flow_coefficient": [ + "0.4157" + ], + "pressure_advance": [ + "0.02" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "0" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "8" + ], + "slow_down_min_speed": [ + "20" + ], + "support_material_interface_fan_speed": [ + "-1" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp": [ + "40" + ], + "textured_cool_plate_temp_initial_layer": [ + "40" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 base.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 base.json new file mode 100644 index 0000000000..4f4842ae1d --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Translucent @U1 base.json @@ -0,0 +1,44 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Translucent @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "SPTR001", + "instantiation": "false", + "filament_end_gcode": [ + "" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_loading_speed_start": [ + "35" + ], + "filament_loading_speed": [ + "35" + ], + "filament_unloading_speed_start": [ + "35" + ], + "filament_unloading_speed": [ + "35" + ], + "filament_load_time": [ + "2" + ], + "filament_unload_time": [ + "2" + ], + "filament_cooling_moves": [ + "2" + ], + "filament_cooling_initial_speed": [ + "35" + ], + "filament_cooling_final_speed": [ + "60" + ], + "nozzle_temperature": [ + "220" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Wood @U1 0.4 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Wood @U1 0.4 nozzle.json new file mode 100644 index 0000000000..4768ac2783 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Wood @U1 0.4 nozzle.json @@ -0,0 +1,108 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Wood @U1 0.4 nozzle", + "inherits": "fdm_filament_pla", + "from": "system", + "setting_id": "XvizDDHbds3bVrzi", + "filament_id": "GFL9922", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "filament_start_gcode": [ + "" + ], + "enable_pressure_advance": [ + "1" + ], + "filament_end_gcode": [ + "\n" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_vendor": [ + "Snapmaker" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "filament_flow_ratio": [ + "0.97" + ], + "filament_max_volumetric_speed": [ + "18" + ], + "filament_multitool_ramming_flow": [ + "40" + ], + "filament_multitool_ramming_volume": [ + "10" + ], + "filament_retract_length_toolchange": [ + "5" + ], + "filament_retraction_length": [ + "0.6" + ], + "pressure_advance": [ + "0.025" + ], + "slow_down_layer_time": [ + "4" + ], + "activate_air_filtration": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "35" + ], + "cool_plate_temp_initial_layer": [ + "35" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "filament_cost": [ + "20" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "nozzle_temperature": [ + "220" + ], + "overhang_fan_threshold": [ + "50%" + ], + "slow_down_min_speed": [ + "20" + ], + "temperature_vitrification": [ + "45" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Wood @U1 0.6 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Wood @U1 0.6 nozzle.json new file mode 100644 index 0000000000..43d306ebae --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Wood @U1 0.6 nozzle.json @@ -0,0 +1,114 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Wood @U1 0.6 nozzle", + "inherits": "fdm_filament_pla", + "from": "system", + "setting_id": "Kp77DCcitdmoyjqm", + "filament_id": "GFL9922", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "filament_start_gcode": [ + "" + ], + "enable_pressure_advance": [ + "0" + ], + "filament_end_gcode": [ + "\n" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_vendor": [ + "Snapmaker" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "18" + ], + "filament_multitool_ramming_flow": [ + "40" + ], + "filament_multitool_ramming_volume": [ + "10" + ], + "filament_retract_length_toolchange": [ + "5" + ], + "filament_retraction_length": [ + "0.4" + ], + "pressure_advance": [ + "0.014" + ], + "slow_down_layer_time": [ + "4" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "activate_air_filtration": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "35" + ], + "cool_plate_temp_initial_layer": [ + "35" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "filament_cost": [ + "20" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "nozzle_temperature": [ + "220" + ], + "overhang_fan_threshold": [ + "50%" + ], + "slow_down_min_speed": [ + "20" + ], + "temperature_vitrification": [ + "45" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Wood @U1 0.8 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Wood @U1 0.8 nozzle.json new file mode 100644 index 0000000000..da788a35fb --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Wood @U1 0.8 nozzle.json @@ -0,0 +1,114 @@ +{ + "type": "filament", + "name": "Snapmaker PLA Wood @U1 0.8 nozzle", + "inherits": "fdm_filament_pla", + "from": "system", + "setting_id": "nBYnNiqwLo6nAsqi", + "filament_id": "GFL9922", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "filament_start_gcode": [ + "" + ], + "enable_pressure_advance": [ + "0" + ], + "filament_end_gcode": [ + "\n" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_vendor": [ + "Snapmaker" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "filament_flow_ratio": [ + "0.965" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "filament_multitool_ramming_flow": [ + "40" + ], + "filament_multitool_ramming_volume": [ + "10" + ], + "filament_retract_length_toolchange": [ + "5" + ], + "filament_retraction_length": [ + "0.4" + ], + "pressure_advance": [ + "0.007" + ], + "slow_down_layer_time": [ + "4" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "activate_air_filtration": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "35" + ], + "cool_plate_temp_initial_layer": [ + "35" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "filament_cost": [ + "20" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "nozzle_temperature": [ + "220" + ], + "overhang_fan_threshold": [ + "50%" + ], + "slow_down_min_speed": [ + "20" + ], + "temperature_vitrification": [ + "45" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1 0.4 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1 0.4 nozzle.json new file mode 100644 index 0000000000..b986a7244a --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1 0.4 nozzle.json @@ -0,0 +1,132 @@ +{ + "type": "filament", + "name": "Snapmaker PLA-CF @U1 0.4 nozzle", + "inherits": "fdm_filament_pla", + "from": "system", + "setting_id": "2INwruC3ZVkBTdUT", + "filament_id": "GFL98111", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "enable_pressure_advance": [ + "1" + ], + "filament_end_gcode": [ + "" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "20" + ], + "filament_start_gcode": [ + "" + ], + "filament_vendor": [ + "Snapmaker" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_minimal_purge_on_wipe_tower": [ + "50" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_retract_length_toolchange": [ + "5" + ], + "filament_retraction_length": [ + "1" + ], + "filament_type": [ + "PLA-CF" + ], + "filament_z_hop": [ + "0.4" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "nozzle_temperature": [ + "240" + ], + "nozzle_temperature_initial_layer": [ + "240" + ], + "nozzle_temperature_range_high": [ + "250" + ], + "nozzle_temperature_range_low": [ + "200" + ], + "pressure_advance": [ + "0.01" + ], + "activate_air_filtration": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "filament_cost": [ + "20" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "overhang_fan_threshold": [ + "50%" + ], + "required_nozzle_HRC": [ + "40" + ], + "slow_down_layer_time": [ + "7" + ], + "slow_down_min_speed": [ + "20" + ], + "temperature_vitrification": [ + "45" + ], + "additional_cooling_fan_speed": [ + "0" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1 0.6 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1 0.6 nozzle.json new file mode 100644 index 0000000000..dcb6392634 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1 0.6 nozzle.json @@ -0,0 +1,138 @@ +{ + "type": "filament", + "name": "Snapmaker PLA-CF @U1 0.6 nozzle", + "inherits": "fdm_filament_pla", + "from": "system", + "setting_id": "CKfdL85SvbOLzMuP", + "filament_id": "GFL98111", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "enable_pressure_advance": [ + "0" + ], + "filament_end_gcode": [ + "" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "25" + ], + "filament_start_gcode": [ + "" + ], + "filament_vendor": [ + "Snapmaker" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "18" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_retract_length_toolchange": [ + "10" + ], + "filament_retraction_length": [ + "2" + ], + "filament_type": [ + "PLA-CF" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "250" + ], + "nozzle_temperature_range_low": [ + "210" + ], + "pressure_advance": [ + "0.015" + ], + "filament_cost": [ + "35" + ], + "filament_density": [ + "1.22" + ], + "slow_down_layer_time": [ + "8" + ], + "filament_wipe_distance": [ + "2" + ], + "activate_air_filtration": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "overhang_fan_threshold": [ + "50%" + ], + "required_nozzle_HRC": [ + "40" + ], + "slow_down_min_speed": [ + "20" + ], + "temperature_vitrification": [ + "45" + ], + "additional_cooling_fan_speed": [ + "0" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1 0.8 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1 0.8 nozzle.json new file mode 100644 index 0000000000..1e6e961497 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1 0.8 nozzle.json @@ -0,0 +1,135 @@ +{ + "type": "filament", + "name": "Snapmaker PLA-CF @U1 0.8 nozzle", + "inherits": "fdm_filament_pla", + "from": "system", + "setting_id": "fhhnfJm4dN9FXpWQ", + "filament_id": "GFL98111", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "enable_pressure_advance": [ + "0" + ], + "filament_end_gcode": [ + "" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "25" + ], + "filament_start_gcode": [ + "" + ], + "filament_vendor": [ + "Snapmaker" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "18" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_retract_length_toolchange": [ + "10" + ], + "filament_retraction_length": [ + "3" + ], + "filament_type": [ + "PLA-CF" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "250" + ], + "nozzle_temperature_range_low": [ + "210" + ], + "pressure_advance": [ + "0.015" + ], + "filament_cost": [ + "35" + ], + "filament_density": [ + "1.22" + ], + "slow_down_layer_time": [ + "8" + ], + "activate_air_filtration": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "overhang_fan_threshold": [ + "50%" + ], + "required_nozzle_HRC": [ + "40" + ], + "slow_down_min_speed": [ + "20" + ], + "temperature_vitrification": [ + "45" + ], + "additional_cooling_fan_speed": [ + "0" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1 base.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1 base.json index 617a8c23ea..63f877d965 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1 base.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1 base.json @@ -59,9 +59,6 @@ "temperature_vitrification": [ "150" ], - "default_filament_colour": [ - "" - ], "filament_type": [ "PLA-CF" ], diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1.json index ec04c8108d..9091258467 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1.json @@ -7,5 +7,8 @@ "instantiation": "true", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" + ], + "filament_retract_length_toolchange": [ + "5" ] } diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1 0.6 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1 0.6 nozzle.json new file mode 100644 index 0000000000..b28e0627ad --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1 0.6 nozzle.json @@ -0,0 +1,113 @@ +{ + "type": "filament", + "name": "Snapmaker PVA @U1 0.6 nozzle", + "inherits": "Snapmaker PVA @U1 base", + "from": "system", + "setting_id": "lIqgnfeZdAm8G0TH", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "enable_pressure_advance": [ + "0" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "filament_cost": [ + "79.98" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_retract_length_toolchange": [ + "10" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "1" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_soluble": [ + "1" + ], + "filament_wipe_distance": [ + "2" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "230" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "nozzle_temperature_range_low": [ + "210" + ], + "pressure_advance": [ + "0.03" + ], + "slow_down_layer_time": [ + "7" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "filament_cooling_final_speed": [ + "3.4" + ], + "filament_cooling_initial_speed": [ + "2.2" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_loading_speed": [ + "28" + ], + "filament_loading_speed_start": [ + "3" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "20" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_unloading_speed": [ + "90" + ], + "filament_unloading_speed_start": [ + "100" + ], + "fan_min_speed": [ + "100" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1 0.8 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1 0.8 nozzle.json new file mode 100644 index 0000000000..6572a60078 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1 0.8 nozzle.json @@ -0,0 +1,107 @@ +{ + "type": "filament", + "name": "Snapmaker PVA @U1 0.8 nozzle", + "inherits": "Snapmaker PVA @U1 base", + "from": "system", + "setting_id": "WxtuvwWxy73Gi0IK", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "enable_pressure_advance": [ + "0" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "fan_min_speed": [ + "100" + ], + "filament_cost": [ + "79.98" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_flow_ratio": [ + "0.96" + ], + "filament_retract_length_toolchange": [ + "10" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_soluble": [ + "1" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "225" + ], + "nozzle_temperature_initial_layer": [ + "225" + ], + "nozzle_temperature_range_low": [ + "205" + ], + "pressure_advance": [ + "0.03" + ], + "slow_down_layer_time": [ + "7" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "filament_cooling_final_speed": [ + "3.4" + ], + "filament_cooling_initial_speed": [ + "2.2" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_loading_speed": [ + "28" + ], + "filament_loading_speed_start": [ + "3" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "20" + ], + "filament_multitool_ramming_volume": [ + "5" + ], + "filament_unloading_speed": [ + "90" + ], + "filament_unloading_speed_start": [ + "100" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1.json index f9a33d7bcb..5ed5d243ac 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1.json @@ -7,5 +7,95 @@ "instantiation": "true", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" + ], + "enable_pressure_advance": [ + "1" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "pressure_advance": [ + "0.03" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "fan_min_speed": [ + "100" + ], + "filament_cooling_final_speed": [ + "3.4" + ], + "filament_cooling_initial_speed": [ + "2.2" + ], + "filament_cooling_moves": [ + "4" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_loading_speed": [ + "28" + ], + "filament_loading_speed_start": [ + "3" + ], + "filament_max_volumetric_speed": [ + "5" + ], + "filament_minimal_purge_on_wipe_tower": [ + "20" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_volume": [ + "0.1" + ], + "filament_retract_length_toolchange": [ + "4" + ], + "filament_retraction_length": [ + "0.4" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_unloading_speed": [ + "90" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "240" + ], + "nozzle_temperature_initial_layer": [ + "240" + ], + "slow_down_layer_time": [ + "10" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" ] } diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPU 90A @U1 0.6 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker TPU 90A @U1 0.6 nozzle.json new file mode 100644 index 0000000000..6ae8a5b675 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPU 90A @U1 0.6 nozzle.json @@ -0,0 +1,150 @@ +{ + "type": "filament", + "name": "Snapmaker TPU 90A @U1 0.6 nozzle", + "inherits": "fdm_filament_tpu", + "from": "system", + "setting_id": "uQCplebxmpBpzsnk", + "filament_id": "GFU99", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "3.2" + ], + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "filament_start_gcode": [ + "; filament start gcode\n" + ], + "filament_end_gcode": [ + "; filament end gcode \n\n" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_volume": [ + "0.1" + ], + "pressure_advance": [ + "0.02" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "enable_pressure_advance": [ + "0" + ], + "filament_deretraction_speed": [ + "20" + ], + "filament_flow_ratio": [ + "1.093" + ], + "filament_multitool_ramming_flow": [ + "5" + ], + "filament_retract_length_toolchange": [ + "4" + ], + "filament_retraction_length": [ + "0.6" + ], + "filament_retraction_speed": [ + "20" + ], + "filament_vendor": [ + "Snapmaker" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "slow_down_layer_time": [ + "14" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "filament_wipe": [ + "1" + ], + "filament_wipe_distance": [ + "0" + ], + "activate_air_filtration": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "cool_plate_temp": [ + "30" + ], + "cool_plate_temp_initial_layer": [ + "30" + ], + "eng_plate_temp": [ + "30" + ], + "eng_plate_temp_initial_layer": [ + "30" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cost": [ + "20" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "hot_plate_temp": [ + "35" + ], + "hot_plate_temp_initial_layer": [ + "35" + ], + "overhang_fan_speed": [ + "100" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "temperature_vitrification": [ + "30" + ], + "textured_plate_temp": [ + "35" + ], + "textured_plate_temp_initial_layer": [ + "35" + ], + "nozzle_temperature_range_low": [ + "200" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPU 90A @U1 0.8 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker TPU 90A @U1 0.8 nozzle.json new file mode 100644 index 0000000000..45f0f7a0e9 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPU 90A @U1 0.8 nozzle.json @@ -0,0 +1,144 @@ +{ + "type": "filament", + "name": "Snapmaker TPU 90A @U1 0.8 nozzle", + "inherits": "fdm_filament_tpu", + "from": "system", + "setting_id": "w4Hpl2qNPmgNvaeM", + "filament_id": "GFU99", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "3.5" + ], + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "filament_start_gcode": [ + "; filament start gcode\n" + ], + "filament_end_gcode": [ + "; filament end gcode \n\n" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_volume": [ + "0.1" + ], + "pressure_advance": [ + "0.02" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "enable_pressure_advance": [ + "0" + ], + "filament_deretraction_speed": [ + "20" + ], + "filament_flow_ratio": [ + "1.095" + ], + "filament_multitool_ramming_flow": [ + "5" + ], + "filament_retract_length_toolchange": [ + "4" + ], + "filament_retraction_length": [ + "1.2" + ], + "filament_retraction_speed": [ + "20" + ], + "filament_vendor": [ + "Snapmaker" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "slow_down_layer_time": [ + "14" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "activate_air_filtration": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "cool_plate_temp": [ + "30" + ], + "cool_plate_temp_initial_layer": [ + "30" + ], + "eng_plate_temp": [ + "30" + ], + "eng_plate_temp_initial_layer": [ + "30" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cost": [ + "20" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "hot_plate_temp": [ + "35" + ], + "hot_plate_temp_initial_layer": [ + "35" + ], + "overhang_fan_speed": [ + "100" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "temperature_vitrification": [ + "30" + ], + "textured_plate_temp": [ + "35" + ], + "textured_plate_temp_initial_layer": [ + "35" + ], + "nozzle_temperature_range_low": [ + "200" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPU 90A @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker TPU 90A @U1.json new file mode 100644 index 0000000000..e89397849b --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPU 90A @U1.json @@ -0,0 +1,141 @@ +{ + "type": "filament", + "name": "Snapmaker TPU 90A @U1", + "inherits": "fdm_filament_tpu", + "from": "system", + "setting_id": "T4MmgICRrSzvmCZ5", + "filament_id": "GFU99", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "3.2" + ], + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "filament_start_gcode": [ + "; filament start gcode\n" + ], + "filament_end_gcode": [ + "; filament end gcode \n\n" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_volume": [ + "0.1" + ], + "pressure_advance": [ + "0.4" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "complete_print_exhaust_fan_speed": [ + "100" + ], + "during_print_exhaust_fan_speed": [ + "100" + ], + "enable_pressure_advance": [ + "0" + ], + "filament_deretraction_speed": [ + "15" + ], + "filament_flow_ratio": [ + "1.045" + ], + "filament_multitool_ramming_flow": [ + "5" + ], + "filament_retract_length_toolchange": [ + "2" + ], + "filament_retraction_length": [ + "1.2" + ], + "filament_retraction_speed": [ + "15" + ], + "filament_vendor": [ + "Snapmaker" + ], + "nozzle_temperature": [ + "230" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "slow_down_layer_time": [ + "14" + ], + "activate_air_filtration": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "cool_plate_temp": [ + "30" + ], + "cool_plate_temp_initial_layer": [ + "30" + ], + "eng_plate_temp": [ + "30" + ], + "eng_plate_temp_initial_layer": [ + "30" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cost": [ + "20" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "hot_plate_temp": [ + "35" + ], + "hot_plate_temp_initial_layer": [ + "35" + ], + "overhang_fan_speed": [ + "100" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "temperature_vitrification": [ + "30" + ], + "textured_plate_temp": [ + "35" + ], + "textured_plate_temp_initial_layer": [ + "35" + ], + "nozzle_temperature_range_low": [ + "200" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPU 95A @U1 base.json b/resources/profiles/Snapmaker/filament/Snapmaker TPU 95A @U1 base.json index a6d8c41b5d..3c51439206 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker TPU 95A @U1 base.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPU 95A @U1 base.json @@ -43,9 +43,6 @@ "filament_retraction_speed": [ "nil" ], - "filament_settings_id": [ - "" - ], "filament_soluble": [ "0" ], diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPU 95A HF @U1 0.6 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker TPU 95A HF @U1 0.6 nozzle.json new file mode 100644 index 0000000000..1085c84e6f --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPU 95A HF @U1 0.6 nozzle.json @@ -0,0 +1,147 @@ +{ + "type": "filament", + "name": "Snapmaker TPU 95A HF @U1 0.6 nozzle", + "inherits": "fdm_filament_tpu", + "from": "system", + "setting_id": "Q2svXpkEqg0dCdq3", + "filament_id": "GFU99", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "filament_start_gcode": [ + "; filament start gcode\n" + ], + "filament_end_gcode": [ + "; filament end gcode \n\n" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_volume": [ + "0.1" + ], + "enable_pressure_advance": [ + "0" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_flow_ratio": [ + "1.067" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "filament_multitool_ramming_flow": [ + "10" + ], + "filament_retract_length_toolchange": [ + "8" + ], + "filament_retraction_length": [ + "0.8" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_vendor": [ + "Snapmaker" + ], + "nozzle_temperature": [ + "215" + ], + "nozzle_temperature_initial_layer": [ + "215" + ], + "overhang_fan_threshold": [ + "95%" + ], + "pressure_advance": [ + "0.14" + ], + "slow_down_layer_time": [ + "8" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "activate_air_filtration": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "30" + ], + "cool_plate_temp_initial_layer": [ + "30" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "eng_plate_temp": [ + "30" + ], + "eng_plate_temp_initial_layer": [ + "30" + ], + "filament_cost": [ + "20" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "hot_plate_temp": [ + "35" + ], + "hot_plate_temp_initial_layer": [ + "35" + ], + "overhang_fan_speed": [ + "100" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "temperature_vitrification": [ + "30" + ], + "textured_plate_temp": [ + "35" + ], + "textured_plate_temp_initial_layer": [ + "35" + ], + "nozzle_temperature_range_low": [ + "200" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPU 95A HF @U1 0.8 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker TPU 95A HF @U1 0.8 nozzle.json new file mode 100644 index 0000000000..bef4c7712f --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPU 95A HF @U1 0.8 nozzle.json @@ -0,0 +1,147 @@ +{ + "type": "filament", + "name": "Snapmaker TPU 95A HF @U1 0.8 nozzle", + "inherits": "fdm_filament_tpu", + "from": "system", + "setting_id": "RjsE08h3l37cAkAs", + "filament_id": "GFU99", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "filament_start_gcode": [ + "; filament start gcode\n" + ], + "filament_end_gcode": [ + "; filament end gcode \n\n" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_volume": [ + "0.1" + ], + "enable_pressure_advance": [ + "0" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_flow_ratio": [ + "1.045" + ], + "filament_max_volumetric_speed": [ + "16" + ], + "filament_multitool_ramming_flow": [ + "15" + ], + "filament_retract_length_toolchange": [ + "8" + ], + "filament_retraction_length": [ + "1" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_vendor": [ + "Snapmaker" + ], + "nozzle_temperature": [ + "215" + ], + "nozzle_temperature_initial_layer": [ + "215" + ], + "overhang_fan_threshold": [ + "95%" + ], + "pressure_advance": [ + "0.12" + ], + "slow_down_layer_time": [ + "12" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "filament_z_hop_types": [ + "Slope Lift" + ], + "activate_air_filtration": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "30" + ], + "cool_plate_temp_initial_layer": [ + "30" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "eng_plate_temp": [ + "30" + ], + "eng_plate_temp_initial_layer": [ + "30" + ], + "filament_cost": [ + "20" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "hot_plate_temp": [ + "35" + ], + "hot_plate_temp_initial_layer": [ + "35" + ], + "overhang_fan_speed": [ + "100" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "temperature_vitrification": [ + "30" + ], + "textured_plate_temp": [ + "35" + ], + "textured_plate_temp_initial_layer": [ + "35" + ], + "nozzle_temperature_range_low": [ + "200" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPU 95A HF @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker TPU 95A HF @U1.json new file mode 100644 index 0000000000..5e0696d906 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPU 95A HF @U1.json @@ -0,0 +1,144 @@ +{ + "type": "filament", + "name": "Snapmaker TPU 95A HF @U1", + "inherits": "fdm_filament_tpu", + "from": "system", + "setting_id": "KwcwmV2UmZUgCBoz", + "filament_id": "GFU99", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "filament_start_gcode": [ + "; filament start gcode\n" + ], + "filament_end_gcode": [ + "; filament end gcode \n\n" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_volume": [ + "0.1" + ], + "enable_pressure_advance": [ + "0" + ], + "fan_cooling_layer_time": [ + "40" + ], + "fan_max_speed": [ + "50" + ], + "fan_min_speed": [ + "10" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_flow_ratio": [ + "1.067" + ], + "filament_max_volumetric_speed": [ + "9" + ], + "filament_multitool_ramming_flow": [ + "10" + ], + "filament_retract_length_toolchange": [ + "6" + ], + "filament_retraction_length": [ + "1" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_vendor": [ + "Snapmaker" + ], + "nozzle_temperature": [ + "230" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "overhang_fan_threshold": [ + "25%" + ], + "pressure_advance": [ + "0.23" + ], + "slow_down_layer_time": [ + "10" + ], + "activate_air_filtration": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "30" + ], + "cool_plate_temp_initial_layer": [ + "30" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "eng_plate_temp": [ + "30" + ], + "eng_plate_temp_initial_layer": [ + "30" + ], + "filament_cost": [ + "20" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "hot_plate_temp": [ + "35" + ], + "hot_plate_temp_initial_layer": [ + "35" + ], + "overhang_fan_speed": [ + "100" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "temperature_vitrification": [ + "30" + ], + "textured_plate_temp": [ + "35" + ], + "textured_plate_temp_initial_layer": [ + "35" + ], + "nozzle_temperature_range_low": [ + "200" + ] +} diff --git a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.2 nozzle).json index 8a5cbc56d8..aebc032855 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.2 nozzle).json +++ b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.2 nozzle).json @@ -1,13 +1,54 @@ { "type": "machine", - "setting_id": "CwJeuh1rxZcjvkXh", "name": "Snapmaker U1 (0.2 nozzle)", - "from": "system", - "instantiation": "true", "inherits": "fdm_U1", + "from": "system", + "setting_id": "CwJeuh1rxZcjvkXh", + "instantiation": "true", "printer_model": "Snapmaker U1", "printer_variant": "0.2", - "default_print_profile": "0.10 Standard @Snapmaker U1 (0.2 nozzle)", + "auxiliary_fan": "1", + "change_filament_gcode": ";===== date: 20260607 =====================\n; Change Tool[previous_extruder] -> Tool[next_extruder] (layer [layer_num])\n; max_layer_z [max_layer_z]\n; max_print_height [max_print_height]\n; print_sequence [print_sequence]\n\n{\nlocal move_z = 1.5;\nlocal max_speed_toolchange = 350.0;\nlocal wait_for_extruder_temp = true;\nposition[2] = position[2] + 2.0;\nlocal speed_toolchange = max_speed_toolchange;\n\nif travel_speed < max_speed_toolchange then\n speed_toolchange = travel_speed;\nendif\n\nif print_sequence == \"by object\" then\n\n if max_layer_z < ((max_print_height - z_offset) - 2) then\n move_z = z_offset + min(((max_layer_z - z_offset) + 2), max_print_height);\n endif\n\nendif\n\n\"G91\nG1 Z\" + move_z + \" F600\nG90\n\";\n\"G1 F\" + (speed_toolchange * 60) + \"\n\";\nif wait_for_extruder_temp and not((layer_num < 0) and (next_extruder == initial_tool)) then\n \"\n\";\n \"; \" + layer_num + \"\n\";\n if layer_num == 0 then\n \"M109 S\" + first_layer_temperature[next_extruder] + \" T\" + next_extruder + \"\n\";\n else\n \"M109 S\" + temperature[next_extruder] + \" T\" + next_extruder + \"\n\";\n endif\nendif\n\"M400\" + \"\n\";\n\"T\" + next_extruder + \"\n\";\nif filament_type[next_extruder] == \"PVA\" then\n\"SET_VELOCITY_LIMIT ACCEL=3000\n\";\nelse\nendif\nif previous_extruder != next_extruder and initial_extruder != next_extruder then\n\"SM_PRINT_PREEXTRUDE_FILAMENT INDEX=\" + next_extruder + \"\n\";\nendif\n\"G90\n\";\n}\n", + "deretraction_speed": [ + "30", + "30", + "30", + "30" + ], + "extruder_colour": [ + "#FCE94F", + "#FCE94F", + "#FCE94F", + "#FCE94F" + ], + "extruder_offset": [ + "0x0", + "0x0", + "0x0", + "0x0" + ], + "host_type": "octoprint", + "long_retractions_when_cut": [ + "0", + "0", + "0", + "0" + ], + "machine_end_gcode": ";===== date: 20260605 =====================\n; layer [layer_num]\n; max_layer_z [max_layer_z]\n; print_sequence [print_sequence]\n\n{if print_sequence == \"by object\"}\n{\nlocal move_z = max_print_height;\n\nif max_layer_z < ((max_print_height - z_offset) - 2) then\n move_z = z_offset + min(((max_layer_z - z_offset) + 2), max_print_height);\nendif\n}\n\nG91\nG1 X2 Y2 Z1 F24000\nG90\nG1 Z{move_z} F600\n{endif}\n\nPRINT_END\nTIMELAPSE_STOP\n", + "machine_max_jerk_z": [ + "3", + "0.4" + ], + "machine_max_speed_e": [ + "30", + "25" + ], + "machine_max_speed_z": [ + "20", + "12" + ], + "machine_start_gcode": "SET_PRINT_AUTO_BED_LEVELING ENABLE=1\nSET_TIME_LAPSE_CAMERA ENABLE=1\n;===== date: 20260128 =====================\n\nPRINT_START\nDEFECT_DETECTION_START\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} CURRENT_LAYER=0\nTIMELAPSE_START\nM140 S{bed_temperature_initial_layer_single}\nM104 T{initial_extruder} S140\nM204 S10000\nG28 X Y\nDEFECT_DETECT_NOODLE_FIRST\n;===== 床面异物检测 ========\nT{initial_extruder}\nG90\nDEFECT_DETECTION_DETECT_BED\n;===== 取放头检测 =================\nSM_PRINT_CHECK_SWITCH_EXTRUDER\n\n;===== 自动进料 & 挤出流量 & 预挤出 ======================\nSM_PRINT_EXTRUDER_PREHEAT EXTRUDER=1 TEMP=140\nSM_PRINT_AUTO_FEED EXTRUDER=0\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=0\nSM_PRINT_EXTRUDER_PREHEAT EXTRUDER=2 TEMP=140\nSM_PRINT_AUTO_FEED EXTRUDER=1\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=1\nSM_PRINT_EXTRUDER_PREHEAT EXTRUDER=3 TEMP=140\nSM_PRINT_AUTO_FEED EXTRUDER=2\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=2\nSM_PRINT_AUTO_FEED EXTRUDER=3\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=3\nM104 S0 T0 A0\nM104 S0 T1 A0\nM104 S0 T2 A0\nM104 S0 T3 A0\nM104 T{initial_extruder} S{nozzle_temperature[initial_extruder] - 90}\n\n;===== 粗回零 =================\nT{initial_extruder}\nM106 S255\nM106 P2 S0\nMOVE_TO_DISCARD_FILAMENT_POSITION\nM109 T{initial_extruder} S{nozzle_temperature[initial_extruder] - 90}\nROUGHLY_CLEAN_NOZZLE_WITH_DISCARD\nMOVE_TO_XY_IDLE_POSITION_EXTRUDER\nG28 Z I140 J140\n\n;===== 检测钢板 =================\nDETECT_BED_PLATE\n\n;===== 深度清洁喷嘴 =================\nG90\nG0 Z5 F10000\nMOVE_TO_DISCARD_FILAMENT_POSITION\nM109 S{nozzle_temperature[initial_extruder] - 50}\nROUGHLY_CLEAN_NOZZLE\nMOVE_TO_XY_IDLE_POSITION_EXTRUDER\nFINELY_CLEAN_NOZZLE_STAGE_1\nM104 S{nozzle_temperature[initial_extruder] - 90}\nG0 Z5 F10000\nMOVE_TO_DISCARD_FILAMENT_POSITION\nROUGHLY_CLEAN_NOZZLE\nMOVE_TO_XY_IDLE_POSITION_EXTRUDER\nFINELY_CLEAN_NOZZLE_STAGE_2\n\n;===== 精回零 =================\nM106 S255\nM109 S{nozzle_temperature[initial_extruder] - 90}\nM190 S{bed_temperature_initial_layer_single}\nM107 P2\nG90\nG0 Z5 F10000\nWAIT_CHAMBER_TEMP TIMEOUT=180\n{if curr_bed_type==\"High Temp Plate\"} \nG28 Z Z_OFFSET -0.07 \n{else} \nG28 Z \n{endif} \n\n\n;===== 热床调平 =================\n{if curr_bed_type==\"High Temp Plate\"} \n; Always pass `ADAPTIVE_MARGIN=0` because Orca has already handled `adaptive_bed_mesh_margin` internally\n; Make sure to set ADAPTIVE to 0 otherwise Klipper will use it's own adaptive bed mesh logic\nBED_MESH_CALIBRATE mesh_min={adaptive_bed_mesh_min[0]},{adaptive_bed_mesh_min[1]} mesh_max={adaptive_bed_mesh_max[0]},{adaptive_bed_mesh_max[1]} ALGORITHM=[bed_mesh_algo] PROBE_COUNT={bed_mesh_probe_count[0]},{bed_mesh_probe_count[1]} ADAPTIVE=0 ADAPTIVE_MARGIN=0 Z_OFFSET=-0.07\n{else} \n; Always pass `ADAPTIVE_MARGIN=0` because Orca has already handled `adaptive_bed_mesh_margin` internally\n; Make sure to set ADAPTIVE to 0 otherwise Klipper will use it's own adaptive bed mesh logic\nBED_MESH_CALIBRATE mesh_min={adaptive_bed_mesh_min[0]},{adaptive_bed_mesh_min[1]} mesh_max={adaptive_bed_mesh_max[0]},{adaptive_bed_mesh_max[1]} ALGORITHM=[bed_mesh_algo] PROBE_COUNT={bed_mesh_probe_count[0]},{bed_mesh_probe_count[1]} ADAPTIVE=0 ADAPTIVE_MARGIN=0\n{endif} \n\n\n;===== 画起始线 =================\nG90\nG1 Z1.5\nG0 X85 Y1 Z2 F18000\nM109 S{nozzle_temperature_initial_layer[initial_extruder]}\nG1 Z0.2\nM83\nG1 X185 E15 F360\nG1 Z1.5\n\nG90\nM106 S0", + "machine_tool_change_time": "5", "max_layer_height": [ "0.14", "0.14", @@ -26,5 +67,126 @@ "0.2", "0.2" ], - "nozzle_type": "hardened_steel" + "nozzle_type": "hardened_steel", + "printable_area": [ + "0.5x1", + "270.5x1", + "270.5x271", + "0.5x271" + ], + "printable_height": "270.05", + "retract_before_wipe": [ + "0%", + "0%", + "0%", + "0%" + ], + "retract_length_toolchange": [ + "10", + "10", + "10", + "10" + ], + "retract_lift_above": [ + "0", + "0", + "0", + "0" + ], + "retract_lift_below": [ + "269", + "269", + "269", + "269" + ], + "retract_lift_enforce": [ + "All Surfaces", + "All Surfaces", + "All Surfaces", + "All Surfaces" + ], + "retract_restart_extra": [ + "0", + "0", + "0", + "0" + ], + "retract_restart_extra_toolchange": [ + "0", + "0", + "0", + "0" + ], + "retract_when_changing_layer": [ + "1", + "1", + "1", + "1" + ], + "retraction_distances_when_cut": [ + "18", + "18", + "18", + "18" + ], + "retraction_length": [ + "0.4", + "0.4", + "0.4", + "0.4" + ], + "retraction_minimum_travel": [ + "1", + "1", + "1", + "1" + ], + "retraction_speed": [ + "30", + "30", + "30", + "30" + ], + "thumbnails": "48x48/PNG, 300x300/PNG", + "travel_slope": [ + "3", + "3", + "3", + "3" + ], + "wipe": [ + "1", + "1", + "1", + "1" + ], + "wipe_distance": [ + "2", + "2", + "2", + "2" + ], + "z_hop": [ + "0.4", + "0.4", + "0.4", + "0.4" + ], + "z_hop_types": [ + "Auto Lift", + "Auto Lift", + "Auto Lift", + "Auto Lift" + ], + "enable_filament_ramming": "0", + "extruder_clearance_height_to_rod": "27.5", + "extruder_clearance_radius": "72.5", + "machine_load_filament_time": "0", + "machine_unload_filament_time": "0", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\nTIMELAPSE_TAKE_FRAME\nDEFECT_DETECTION_DETECT", + "machine_pause_gcode": "M600", + "nozzle_volume": "143", + "support_multi_bed_types": "0", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} CURRENT_LAYER={layer_num+1}", + "default_print_profile": "0.10 Standard @Snapmaker U1 (0.2 nozzle)" } diff --git a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json index 1105a7ec1d..28ccfd0a29 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json +++ b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json @@ -1,14 +1,20 @@ { "type": "machine", - "setting_id": "UeTP4RqAd7xAMHVE", "name": "Snapmaker U1 (0.4 nozzle)", - "from": "system", - "instantiation": "true", "inherits": "fdm_U1", + "from": "system", + "setting_id": "UeTP4RqAd7xAMHVE", + "instantiation": "true", "printer_model": "Snapmaker U1", "printer_variant": "0.4", "auxiliary_fan": "1", "change_filament_gcode": ";===== date: 20260607 =====================\n; Change Tool[previous_extruder] -> Tool[next_extruder] (layer [layer_num])\n; max_layer_z [max_layer_z]\n; max_print_height [max_print_height]\n; print_sequence [print_sequence]\n\n{\nlocal move_z = 1.5;\nlocal max_speed_toolchange = 350.0;\nlocal wait_for_extruder_temp = true;\nposition[2] = position[2] + 2.0;\nlocal speed_toolchange = max_speed_toolchange;\n\nif travel_speed < max_speed_toolchange then\n speed_toolchange = travel_speed;\nendif\n\nif print_sequence == \"by object\" then\n\n if max_layer_z < ((max_print_height - z_offset) - 2) then\n move_z = z_offset + min(((max_layer_z - z_offset) + 2), max_print_height);\n endif\n\nendif\n\n\"G91\nG1 Z\" + move_z + \" F600\nG90\n\";\n\"G1 F\" + (speed_toolchange * 60) + \"\n\";\nif wait_for_extruder_temp and not((layer_num < 0) and (next_extruder == initial_tool)) then\n \"\n\";\n \"; \" + layer_num + \"\n\";\n if layer_num == 0 then\n \"M109 S\" + first_layer_temperature[next_extruder] + \" T\" + next_extruder + \"\n\";\n else\n \"M109 S\" + temperature[next_extruder] + \" T\" + next_extruder + \"\n\";\n endif\nendif\n\"M400\" + \"\n\";\n\"T\" + next_extruder + \"\n\";\nif filament_type[next_extruder] == \"PVA\" then\n\"SET_VELOCITY_LIMIT ACCEL=3000\n\";\nelse\nendif\nif previous_extruder != next_extruder and initial_extruder != next_extruder then\n\"SM_PRINT_PREEXTRUDE_FILAMENT INDEX=\" + next_extruder + \"\n\";\nendif\n\"G90\n\";\n}\n", + "deretraction_speed": [ + "30", + "30", + "30", + "30" + ], "extruder_colour": [ "#FCE94F", "#FCE94F", @@ -29,38 +35,6 @@ "0" ], "machine_end_gcode": ";===== date: 20260605 =====================\n; layer [layer_num]\n; max_layer_z [max_layer_z]\n; print_sequence [print_sequence]\n\n{if print_sequence == \"by object\"}\n{\nlocal move_z = max_print_height;\n\nif max_layer_z < ((max_print_height - z_offset) - 2) then\n move_z = z_offset + min(((max_layer_z - z_offset) + 2), max_print_height);\nendif\n}\n\nG91\nG1 X2 Y2 Z1 F24000\nG90\nG1 Z{move_z} F600\n{endif}\n\nPRINT_END\nTIMELAPSE_STOP\n", - "machine_max_acceleration_extruding": [ - "25000", - "25000" - ], - "machine_max_acceleration_retracting": [ - "5000", - "5000" - ], - "machine_max_acceleration_travel": [ - "25000", - "25000" - ], - "machine_max_acceleration_x": [ - "25000", - "25000" - ], - "machine_max_acceleration_y": [ - "25000", - "25000" - ], - "machine_max_acceleration_z": [ - "500", - "200" - ], - "machine_max_jerk_x": [ - "9", - "9" - ], - "machine_max_jerk_y": [ - "9", - "9" - ], "machine_max_jerk_z": [ "3", "0.4" @@ -69,22 +43,11 @@ "30", "25" ], - "machine_max_speed_x": [ - "1000", - "200" - ], - "machine_max_speed_y": [ - "1000", - "200" - ], "machine_max_speed_z": [ "20", "12" ], - "resonance_avoidance": "1", - "min_resonance_avoidance_speed": "40", - "max_resonance_avoidance_speed": "90", - "machine_start_gcode": "SET_PRINT_AUTO_BED_LEVELING ENABLE=1\nSET_TIME_LAPSE_CAMERA ENABLE=1\n;===== date: 20251222 =====================\n\nPRINT_START\nDEFECT_DETECTION_START\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count}\nSET_PRINT_STATS_INFO CURRENT_LAYER=0\nTIMELAPSE_START\nM140 S{bed_temperature_initial_layer_single}\nM104 T{initial_extruder} S140\nM204 S10000\n\nG28 X Y\n;===== 床面异物检测 ========\nT{initial_extruder}\nG90\nDEFECT_DETECTION_DETECT_BED\n;===== 取放头检测 =================\nSM_PRINT_CHECK_SWITCH_EXTRUDER\n\n;===== 自动进料 & 挤出流量 & 预挤出 ======================\nSM_PRINT_EXTRUDER_PREHEAT EXTRUDER=1 TEMP=140\nSM_PRINT_AUTO_FEED EXTRUDER=0\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=0\nSM_PRINT_EXTRUDER_PREHEAT EXTRUDER=2 TEMP=140\nSM_PRINT_AUTO_FEED EXTRUDER=1\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=1\nSM_PRINT_EXTRUDER_PREHEAT EXTRUDER=3 TEMP=140\nSM_PRINT_AUTO_FEED EXTRUDER=2\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=2\nSM_PRINT_AUTO_FEED EXTRUDER=3\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=3\nM104 S0 T0 A0\nM104 S0 T1 A0\nM104 S0 T2 A0\nM104 S0 T3 A0\nM104 T{initial_extruder} S{nozzle_temperature[initial_extruder] - 90}\n\n;===== 粗回零 =================\nT{initial_extruder}\nM106 S255\nM106 P2 S0\nMOVE_TO_DISCARD_FILAMENT_POSITION\nM109 T{initial_extruder} S{nozzle_temperature[initial_extruder] - 90}\nROUGHLY_CLEAN_NOZZLE_WITH_DISCARD\nMOVE_TO_XY_IDLE_POSITION_EXTRUDER\nG28 Z I140 J140\n\n;===== 检测钢板 =================\nDETECT_BED_PLATE\n\n;===== 深度清洁喷嘴 =================\nG90\nG0 Z5 F10000\nMOVE_TO_DISCARD_FILAMENT_POSITION\nM109 S{nozzle_temperature[initial_extruder] - 50}\nROUGHLY_CLEAN_NOZZLE\nMOVE_TO_XY_IDLE_POSITION_EXTRUDER\nFINELY_CLEAN_NOZZLE_STAGE_1\nM104 S{nozzle_temperature[initial_extruder] - 90}\nG0 Z5 F10000\nMOVE_TO_DISCARD_FILAMENT_POSITION\nROUGHLY_CLEAN_NOZZLE\nMOVE_TO_XY_IDLE_POSITION_EXTRUDER\nFINELY_CLEAN_NOZZLE_STAGE_2\n\n;===== 精回零 =================\nM106 S255\nM109 S{nozzle_temperature[initial_extruder] - 90}\nM190 S{bed_temperature_initial_layer_single}\nM107 P2\nG90\nG0 Z5 F10000\nG28 Z\n\n;===== 热床调平 =================\n; Always pass `ADAPTIVE_MARGIN=0` because Orca has already handled `adaptive_bed_mesh_margin` internally\n; Make sure to set ADAPTIVE to 0 otherwise Klipper will use it's own adaptive bed mesh logic\nBED_MESH_CALIBRATE mesh_min={adaptive_bed_mesh_min[0]},{adaptive_bed_mesh_min[1]} mesh_max={adaptive_bed_mesh_max[0]},{adaptive_bed_mesh_max[1]} ALGORITHM=[bed_mesh_algo] PROBE_COUNT={bed_mesh_probe_count[0]},{bed_mesh_probe_count[1]} ADAPTIVE=0 ADAPTIVE_MARGIN=0\n; Original upstream: BED_MESH_CALIBRATE PROBE_COUNT=11,11\n\n;===== 画起始线 =================\nG90\nG1 Z1.5\nG0 X10 Y3 Z2 F18000\nM109 S{nozzle_temperature_initial_layer[initial_extruder]}\nG1 Z0.2\nM83\nG1 X110 E15 F360\nG1 Z1.5\n\nG90\nM106 S0", + "machine_start_gcode": "SET_PRINT_AUTO_BED_LEVELING ENABLE=1\nSET_TIME_LAPSE_CAMERA ENABLE=1\n;===== date: 20260128 =====================\n\nPRINT_START\nDEFECT_DETECTION_START\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} CURRENT_LAYER=0\nTIMELAPSE_START\nM140 S{bed_temperature_initial_layer_single}\nM104 T{initial_extruder} S140\nM204 S10000\nG28 X Y\nDEFECT_DETECT_NOODLE_FIRST\n;===== 床面异物检测 ========\nT{initial_extruder}\nG90\nDEFECT_DETECTION_DETECT_BED\n;===== 取放头检测 =================\nSM_PRINT_CHECK_SWITCH_EXTRUDER\n\n;===== 自动进料 & 挤出流量 & 预挤出 ======================\nSM_PRINT_EXTRUDER_PREHEAT EXTRUDER=1 TEMP=140\nSM_PRINT_AUTO_FEED EXTRUDER=0\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=0\nSM_PRINT_EXTRUDER_PREHEAT EXTRUDER=2 TEMP=140\nSM_PRINT_AUTO_FEED EXTRUDER=1\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=1\nSM_PRINT_EXTRUDER_PREHEAT EXTRUDER=3 TEMP=140\nSM_PRINT_AUTO_FEED EXTRUDER=2\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=2\nSM_PRINT_AUTO_FEED EXTRUDER=3\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=3\nM104 S0 T0 A0\nM104 S0 T1 A0\nM104 S0 T2 A0\nM104 S0 T3 A0\nM104 T{initial_extruder} S{nozzle_temperature[initial_extruder] - 90}\n\n;===== 粗回零 =================\nT{initial_extruder}\nM106 S255\nM106 P2 S0\nMOVE_TO_DISCARD_FILAMENT_POSITION\nM109 T{initial_extruder} S{nozzle_temperature[initial_extruder] - 90}\nROUGHLY_CLEAN_NOZZLE_WITH_DISCARD\nMOVE_TO_XY_IDLE_POSITION_EXTRUDER\nG28 Z I140 J140\n\n;===== 检测钢板 =================\nDETECT_BED_PLATE\n\n;===== 深度清洁喷嘴 =================\nG90\nG0 Z5 F10000\nMOVE_TO_DISCARD_FILAMENT_POSITION\nM109 S{nozzle_temperature[initial_extruder] - 50}\nROUGHLY_CLEAN_NOZZLE\nMOVE_TO_XY_IDLE_POSITION_EXTRUDER\nFINELY_CLEAN_NOZZLE_STAGE_1\nM104 S{nozzle_temperature[initial_extruder] - 90}\nG0 Z5 F10000\nMOVE_TO_DISCARD_FILAMENT_POSITION\nROUGHLY_CLEAN_NOZZLE\nMOVE_TO_XY_IDLE_POSITION_EXTRUDER\nFINELY_CLEAN_NOZZLE_STAGE_2\n\n;===== 精回零 =================\nM106 S255\nM109 S{nozzle_temperature[initial_extruder] - 90}\nM190 S{bed_temperature_initial_layer_single}\nM107 P2\nG90\nG0 Z5 F10000\nWAIT_CHAMBER_TEMP TIMEOUT=180\n{if curr_bed_type==\"High Temp Plate\"} \nG28 Z Z_OFFSET -0.07 \n{else} \nG28 Z \n{endif} \n\n\n;===== 热床调平 =================\n{if curr_bed_type==\"High Temp Plate\"} \n; Always pass `ADAPTIVE_MARGIN=0` because Orca has already handled `adaptive_bed_mesh_margin` internally\n; Make sure to set ADAPTIVE to 0 otherwise Klipper will use it's own adaptive bed mesh logic\nBED_MESH_CALIBRATE mesh_min={adaptive_bed_mesh_min[0]},{adaptive_bed_mesh_min[1]} mesh_max={adaptive_bed_mesh_max[0]},{adaptive_bed_mesh_max[1]} ALGORITHM=[bed_mesh_algo] PROBE_COUNT={bed_mesh_probe_count[0]},{bed_mesh_probe_count[1]} ADAPTIVE=0 ADAPTIVE_MARGIN=0 Z_OFFSET=-0.07\n{else} \n; Always pass `ADAPTIVE_MARGIN=0` because Orca has already handled `adaptive_bed_mesh_margin` internally\n; Make sure to set ADAPTIVE to 0 otherwise Klipper will use it's own adaptive bed mesh logic\nBED_MESH_CALIBRATE mesh_min={adaptive_bed_mesh_min[0]},{adaptive_bed_mesh_min[1]} mesh_max={adaptive_bed_mesh_max[0]},{adaptive_bed_mesh_max[1]} ALGORITHM=[bed_mesh_algo] PROBE_COUNT={bed_mesh_probe_count[0]},{bed_mesh_probe_count[1]} ADAPTIVE=0 ADAPTIVE_MARGIN=0\n{endif} \n\n\n;===== 画起始线 =================\nG90\nG1 Z1.5\nG0 X85 Y1 Z2 F18000\nM109 S{nozzle_temperature_initial_layer[initial_extruder]}\nG1 Z0.2\nM83\nG1 X185 E15 F360\nG1 Z1.5\n\nG90\nM106 S0", "machine_tool_change_time": "5", "max_layer_height": [ "0.32", @@ -104,7 +67,7 @@ "0.4", "0.4" ], - "nozzle_type": "stainless_steel", + "nozzle_type": "hardened_steel", "printable_area": [ "0.5x1", "270.5x1", @@ -112,7 +75,6 @@ "0.5x271" ], "printable_height": "270.05", - "printer_settings_id": "MyToolChanger 0.4 nozzle - Copy", "retract_before_wipe": [ "0%", "0%", @@ -168,10 +130,10 @@ "18" ], "retraction_length": [ - "0.8", - "0.8", - "0.8", - "0.8" + "1.5", + "1.5", + "1.5", + "1.5" ], "retraction_minimum_travel": [ "1", @@ -180,16 +142,10 @@ "1" ], "retraction_speed": [ - "40", - "40", - "40", - "40" - ], - "deretraction_speed": [ - "35", - "35", - "35", - "35" + "30", + "30", + "30", + "30" ], "thumbnails": "48x48/PNG, 300x300/PNG", "travel_slope": [ @@ -228,17 +184,12 @@ "machine_load_filament_time": "0", "machine_unload_filament_time": "0", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\nTIMELAPSE_TAKE_FRAME\nDEFECT_DETECTION_DETECT", - "z_hop_when_prime": [ - "0", - "0", - "0", - "0" - ], - "ramming_pressure_advance_value": "0.02", - "tool_change_temprature_wait": "0", - "printer_notes": "", + "default_print_profile": "0.20 Standard @Snapmaker U1 (0.4 nozzle)", "machine_pause_gcode": "M600", "default_bed_type": "Textured PEI Plate", - "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count}\nSET_PRINT_STATS_INFO CURRENT_LAYER={layer_num+1}", - "nozzle_volume": "143" + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} CURRENT_LAYER={layer_num+1}", + "nozzle_volume": "143", + "resonance_avoidance": "1", + "min_resonance_avoidance_speed": "40", + "max_resonance_avoidance_speed": "90" } diff --git a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4+0.6 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4+0.6 nozzle).json index f637b2a592..c9866329bd 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4+0.6 nozzle).json +++ b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4+0.6 nozzle).json @@ -1,10 +1,10 @@ { "type": "machine", - "setting_id": "O6AMxX1Ptbtv4zCK", "name": "Snapmaker U1 (0.4+0.6 nozzle)", - "from": "system", - "instantiation": "true", "inherits": "fdm_U1", + "from": "system", + "setting_id": "O6AMxX1Ptbtv4zCK", + "instantiation": "true", "printer_model": "Snapmaker U1", "printer_variant": "0.4+0.6", "default_print_profile": "0.20 Standard @Snapmaker U1 (0.4+0.6 nozzle)", diff --git a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.6 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.6 nozzle).json index 60e699d108..f4dff2f357 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.6 nozzle).json +++ b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.6 nozzle).json @@ -1,18 +1,59 @@ { "type": "machine", - "setting_id": "1OseO7RSPgE4CRKO", "name": "Snapmaker U1 (0.6 nozzle)", - "from": "system", - "instantiation": "true", "inherits": "fdm_U1", + "from": "system", + "setting_id": "1OseO7RSPgE4CRKO", + "instantiation": "true", "printer_model": "Snapmaker U1", "printer_variant": "0.6", - "default_print_profile": "0.20 Standard @Snapmaker U1 (0.6 nozzle)", + "auxiliary_fan": "1", + "change_filament_gcode": ";===== date: 20260607 =====================\n; Change Tool[previous_extruder] -> Tool[next_extruder] (layer [layer_num])\n; max_layer_z [max_layer_z]\n; max_print_height [max_print_height]\n; print_sequence [print_sequence]\n\n{\nlocal move_z = 1.5;\nlocal max_speed_toolchange = 350.0;\nlocal wait_for_extruder_temp = true;\nposition[2] = position[2] + 2.0;\nlocal speed_toolchange = max_speed_toolchange;\n\nif travel_speed < max_speed_toolchange then\n speed_toolchange = travel_speed;\nendif\n\nif print_sequence == \"by object\" then\n\n if max_layer_z < ((max_print_height - z_offset) - 2) then\n move_z = z_offset + min(((max_layer_z - z_offset) + 2), max_print_height);\n endif\n\nendif\n\n\"G91\nG1 Z\" + move_z + \" F600\nG90\n\";\n\"G1 F\" + (speed_toolchange * 60) + \"\n\";\nif wait_for_extruder_temp and not((layer_num < 0) and (next_extruder == initial_tool)) then\n \"\n\";\n \"; \" + layer_num + \"\n\";\n if layer_num == 0 then\n \"M109 S\" + first_layer_temperature[next_extruder] + \" T\" + next_extruder + \"\n\";\n else\n \"M109 S\" + temperature[next_extruder] + \" T\" + next_extruder + \"\n\";\n endif\nendif\n\"M400\" + \"\n\";\n\"T\" + next_extruder + \"\n\";\nif filament_type[next_extruder] == \"PVA\" then\n\"SET_VELOCITY_LIMIT ACCEL=3000\n\";\nelse\nendif\nif previous_extruder != next_extruder and initial_extruder != next_extruder then\n\"SM_PRINT_PREEXTRUDE_FILAMENT INDEX=\" + next_extruder + \"\n\";\nendif\n\"G90\n\";\n}\n", + "deretraction_speed": [ + "30", + "30", + "30", + "30" + ], + "extruder_colour": [ + "#FCE94F", + "#FCE94F", + "#FCE94F", + "#FCE94F" + ], + "extruder_offset": [ + "0x0", + "0x0", + "0x0", + "0x0" + ], + "host_type": "octoprint", + "long_retractions_when_cut": [ + "0", + "0", + "0", + "0" + ], + "machine_end_gcode": ";===== date: 20260605 =====================\n; layer [layer_num]\n; max_layer_z [max_layer_z]\n; print_sequence [print_sequence]\n\n{if print_sequence == \"by object\"}\n{\nlocal move_z = max_print_height;\n\nif max_layer_z < ((max_print_height - z_offset) - 2) then\n move_z = z_offset + min(((max_layer_z - z_offset) + 2), max_print_height);\nendif\n}\n\nG91\nG1 X2 Y2 Z1 F24000\nG90\nG1 Z{move_z} F600\n{endif}\n\nPRINT_END\nTIMELAPSE_STOP\n", + "machine_max_jerk_z": [ + "3", + "0.4" + ], + "machine_max_speed_e": [ + "30", + "25" + ], + "machine_max_speed_z": [ + "20", + "12" + ], + "machine_start_gcode": "SET_PRINT_AUTO_BED_LEVELING ENABLE=1\nSET_TIME_LAPSE_CAMERA ENABLE=1\n;===== date: 20260128 =====================\n\nPRINT_START\nDEFECT_DETECTION_START\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} CURRENT_LAYER=0\nTIMELAPSE_START\nM140 S{bed_temperature_initial_layer_single}\nM104 T{initial_extruder} S140\nM204 S10000\nG28 X Y\nDEFECT_DETECT_NOODLE_FIRST\n;===== 床面异物检测 ========\nT{initial_extruder}\nG90\nDEFECT_DETECTION_DETECT_BED\n;===== 取放头检测 =================\nSM_PRINT_CHECK_SWITCH_EXTRUDER\n\n;===== 自动进料 & 挤出流量 & 预挤出 ======================\nSM_PRINT_EXTRUDER_PREHEAT EXTRUDER=1 TEMP=140\nSM_PRINT_AUTO_FEED EXTRUDER=0\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=0\nSM_PRINT_EXTRUDER_PREHEAT EXTRUDER=2 TEMP=140\nSM_PRINT_AUTO_FEED EXTRUDER=1\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=1\nSM_PRINT_EXTRUDER_PREHEAT EXTRUDER=3 TEMP=140\nSM_PRINT_AUTO_FEED EXTRUDER=2\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=2\nSM_PRINT_AUTO_FEED EXTRUDER=3\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=3\nM104 S0 T0 A0\nM104 S0 T1 A0\nM104 S0 T2 A0\nM104 S0 T3 A0\nM104 T{initial_extruder} S{nozzle_temperature[initial_extruder] - 90}\n\n;===== 粗回零 =================\nT{initial_extruder}\nM106 S255\nM106 P2 S0\nMOVE_TO_DISCARD_FILAMENT_POSITION\nM109 T{initial_extruder} S{nozzle_temperature[initial_extruder] - 90}\nROUGHLY_CLEAN_NOZZLE_WITH_DISCARD\nMOVE_TO_XY_IDLE_POSITION_EXTRUDER\nG28 Z I140 J140\n\n;===== 检测钢板 =================\nDETECT_BED_PLATE\n\n;===== 深度清洁喷嘴 =================\nG90\nG0 Z5 F10000\nMOVE_TO_DISCARD_FILAMENT_POSITION\nM109 S{nozzle_temperature[initial_extruder] - 50}\nROUGHLY_CLEAN_NOZZLE\nMOVE_TO_XY_IDLE_POSITION_EXTRUDER\nFINELY_CLEAN_NOZZLE_STAGE_1\nM104 S{nozzle_temperature[initial_extruder] - 90}\nG0 Z5 F10000\nMOVE_TO_DISCARD_FILAMENT_POSITION\nROUGHLY_CLEAN_NOZZLE\nMOVE_TO_XY_IDLE_POSITION_EXTRUDER\nFINELY_CLEAN_NOZZLE_STAGE_2\n\n;===== 精回零 =================\nM106 S255\nM109 S{nozzle_temperature[initial_extruder] - 90}\nM190 S{bed_temperature_initial_layer_single}\nM107 P2\nG90\nG0 Z5 F10000\nWAIT_CHAMBER_TEMP TIMEOUT=180\n{if curr_bed_type==\"High Temp Plate\"} \nG28 Z Z_OFFSET -0.07 \n{else} \nG28 Z \n{endif} \n\n\n;===== 热床调平 =================\n{if curr_bed_type==\"High Temp Plate\"} \n; Always pass `ADAPTIVE_MARGIN=0` because Orca has already handled `adaptive_bed_mesh_margin` internally\n; Make sure to set ADAPTIVE to 0 otherwise Klipper will use it's own adaptive bed mesh logic\nBED_MESH_CALIBRATE mesh_min={adaptive_bed_mesh_min[0]},{adaptive_bed_mesh_min[1]} mesh_max={adaptive_bed_mesh_max[0]},{adaptive_bed_mesh_max[1]} ALGORITHM=[bed_mesh_algo] PROBE_COUNT={bed_mesh_probe_count[0]},{bed_mesh_probe_count[1]} ADAPTIVE=0 ADAPTIVE_MARGIN=0 Z_OFFSET=-0.07\n{else} \n; Always pass `ADAPTIVE_MARGIN=0` because Orca has already handled `adaptive_bed_mesh_margin` internally\n; Make sure to set ADAPTIVE to 0 otherwise Klipper will use it's own adaptive bed mesh logic\nBED_MESH_CALIBRATE mesh_min={adaptive_bed_mesh_min[0]},{adaptive_bed_mesh_min[1]} mesh_max={adaptive_bed_mesh_max[0]},{adaptive_bed_mesh_max[1]} ALGORITHM=[bed_mesh_algo] PROBE_COUNT={bed_mesh_probe_count[0]},{bed_mesh_probe_count[1]} ADAPTIVE=0 ADAPTIVE_MARGIN=0\n{endif} \n\n\n;===== 画起始线 =================\nG90\nG1 Z1.5\nG0 X85 Y1 Z2 F18000\nM109 S{nozzle_temperature_initial_layer[initial_extruder]}\nG1 Z0.2\nM83\nG1 X185 E15 F360\nG1 Z1.5\n\nG90\nM106 S0", + "machine_tool_change_time": "5", "max_layer_height": [ - "0.48", - "0.48", - "0.48", - "0.48" + "0.42", + "0.42", + "0.42", + "0.42" ], "min_layer_height": [ "0.12", @@ -26,5 +67,126 @@ "0.6", "0.6" ], - "nozzle_type": "stainless_steel" + "nozzle_type": "stainless_steel", + "printable_area": [ + "0.5x1", + "270.5x1", + "270.5x271", + "0.5x271" + ], + "printable_height": "270.05", + "retract_before_wipe": [ + "0%", + "0%", + "0%", + "0%" + ], + "retract_length_toolchange": [ + "10", + "10", + "10", + "10" + ], + "retract_lift_above": [ + "0", + "0", + "0", + "0" + ], + "retract_lift_below": [ + "269", + "269", + "269", + "269" + ], + "retract_lift_enforce": [ + "All Surfaces", + "All Surfaces", + "All Surfaces", + "All Surfaces" + ], + "retract_restart_extra": [ + "0", + "0", + "0", + "0" + ], + "retract_restart_extra_toolchange": [ + "0", + "0", + "0", + "0" + ], + "retract_when_changing_layer": [ + "1", + "1", + "1", + "1" + ], + "retraction_distances_when_cut": [ + "18", + "18", + "18", + "18" + ], + "retraction_length": [ + "1.4", + "1.4", + "1.4", + "1.4" + ], + "retraction_minimum_travel": [ + "3", + "3", + "3", + "3" + ], + "retraction_speed": [ + "30", + "30", + "30", + "30" + ], + "thumbnails": "48x48/PNG, 300x300/PNG", + "travel_slope": [ + "3", + "3", + "3", + "3" + ], + "wipe": [ + "1", + "1", + "1", + "1" + ], + "wipe_distance": [ + "1", + "1", + "1", + "1" + ], + "z_hop": [ + "0.4", + "0.4", + "0.4", + "0.4" + ], + "z_hop_types": [ + "Auto Lift", + "Auto Lift", + "Auto Lift", + "Auto Lift" + ], + "enable_filament_ramming": "0", + "extruder_clearance_height_to_rod": "27.5", + "extruder_clearance_radius": "72.5", + "machine_load_filament_time": "0", + "machine_unload_filament_time": "0", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\nTIMELAPSE_TAKE_FRAME\nDEFECT_DETECTION_DETECT", + "machine_pause_gcode": "M600", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} CURRENT_LAYER={layer_num+1}", + "nozzle_volume": "143", + "support_multi_bed_types": "0", + "default_print_profile": "0.30 Standard @Snapmaker U1 (0.6 nozzle)" } diff --git a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.8 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.8 nozzle).json index b775c2c964..e356f4264b 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.8 nozzle).json +++ b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.8 nozzle).json @@ -1,13 +1,54 @@ { "type": "machine", - "setting_id": "WTkhQtyDO06YY6AG", "name": "Snapmaker U1 (0.8 nozzle)", - "from": "system", - "instantiation": "true", "inherits": "fdm_U1", + "from": "system", + "setting_id": "WTkhQtyDO06YY6AG", + "instantiation": "true", "printer_model": "Snapmaker U1", "printer_variant": "0.8", - "default_print_profile": "0.40 Standard @Snapmaker U1 (0.8 nozzle)", + "auxiliary_fan": "1", + "change_filament_gcode": ";===== date: 20260607 =====================\n; Change Tool[previous_extruder] -> Tool[next_extruder] (layer [layer_num])\n; max_layer_z [max_layer_z]\n; max_print_height [max_print_height]\n; print_sequence [print_sequence]\n\n{\nlocal move_z = 1.5;\nlocal max_speed_toolchange = 350.0;\nlocal wait_for_extruder_temp = true;\nposition[2] = position[2] + 2.0;\nlocal speed_toolchange = max_speed_toolchange;\n\nif travel_speed < max_speed_toolchange then\n speed_toolchange = travel_speed;\nendif\n\nif print_sequence == \"by object\" then\n\n if max_layer_z < ((max_print_height - z_offset) - 2) then\n move_z = z_offset + min(((max_layer_z - z_offset) + 2), max_print_height);\n endif\n\nendif\n\n\"G91\nG1 Z\" + move_z + \" F600\nG90\n\";\n\"G1 F\" + (speed_toolchange * 60) + \"\n\";\nif wait_for_extruder_temp and not((layer_num < 0) and (next_extruder == initial_tool)) then\n \"\n\";\n \"; \" + layer_num + \"\n\";\n if layer_num == 0 then\n \"M109 S\" + first_layer_temperature[next_extruder] + \" T\" + next_extruder + \"\n\";\n else\n \"M109 S\" + temperature[next_extruder] + \" T\" + next_extruder + \"\n\";\n endif\nendif\n\"M400\" + \"\n\";\n\"T\" + next_extruder + \"\n\";\nif filament_type[next_extruder] == \"PVA\" then\n\"SET_VELOCITY_LIMIT ACCEL=3000\n\";\nelse\nendif\nif previous_extruder != next_extruder and initial_extruder != next_extruder then\n\"SM_PRINT_PREEXTRUDE_FILAMENT INDEX=\" + next_extruder + \"\n\";\nendif\n\"G90\n\";\n}\n", + "deretraction_speed": [ + "30", + "30", + "30", + "30" + ], + "extruder_colour": [ + "#FCE94F", + "#FCE94F", + "#FCE94F", + "#FCE94F" + ], + "extruder_offset": [ + "0x0", + "0x0", + "0x0", + "0x0" + ], + "host_type": "octoprint", + "long_retractions_when_cut": [ + "0", + "0", + "0", + "0" + ], + "machine_end_gcode": ";===== date: 20260605 =====================\n; layer [layer_num]\n; max_layer_z [max_layer_z]\n; print_sequence [print_sequence]\n\n{if print_sequence == \"by object\"}\n{\nlocal move_z = max_print_height;\n\nif max_layer_z < ((max_print_height - z_offset) - 2) then\n move_z = z_offset + min(((max_layer_z - z_offset) + 2), max_print_height);\nendif\n}\n\nG91\nG1 X2 Y2 Z1 F24000\nG90\nG1 Z{move_z} F600\n{endif}\n\nPRINT_END\nTIMELAPSE_STOP\n", + "machine_max_jerk_z": [ + "3", + "0.4" + ], + "machine_max_speed_e": [ + "30", + "25" + ], + "machine_max_speed_z": [ + "20", + "12" + ], + "machine_start_gcode": "SET_PRINT_AUTO_BED_LEVELING ENABLE=1\nSET_TIME_LAPSE_CAMERA ENABLE=1\n;===== date: 20260128 =====================\n\nPRINT_START\nDEFECT_DETECTION_START\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} CURRENT_LAYER=0\nTIMELAPSE_START\nM140 S{bed_temperature_initial_layer_single}\nM104 T{initial_extruder} S140\nM204 S10000\nG28 X Y\nDEFECT_DETECT_NOODLE_FIRST\n;===== 床面异物检测 ========\nT{initial_extruder}\nG90\nDEFECT_DETECTION_DETECT_BED\n;===== 取放头检测 =================\nSM_PRINT_CHECK_SWITCH_EXTRUDER\n\n;===== 自动进料 & 挤出流量 & 预挤出 ======================\nSM_PRINT_EXTRUDER_PREHEAT EXTRUDER=1 TEMP=140\nSM_PRINT_AUTO_FEED EXTRUDER=0\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=0\nSM_PRINT_EXTRUDER_PREHEAT EXTRUDER=2 TEMP=140\nSM_PRINT_AUTO_FEED EXTRUDER=1\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=1\nSM_PRINT_EXTRUDER_PREHEAT EXTRUDER=3 TEMP=140\nSM_PRINT_AUTO_FEED EXTRUDER=2\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=2\nSM_PRINT_AUTO_FEED EXTRUDER=3\nSM_PRINT_FLOW_CALIBRATE EXTRUDER=3\nM104 S0 T0 A0\nM104 S0 T1 A0\nM104 S0 T2 A0\nM104 S0 T3 A0\nM104 T{initial_extruder} S{nozzle_temperature[initial_extruder] - 90}\n\n;===== 粗回零 =================\nT{initial_extruder}\nM106 S255\nM106 P2 S0\nMOVE_TO_DISCARD_FILAMENT_POSITION\nM109 T{initial_extruder} S{nozzle_temperature[initial_extruder] - 90}\nROUGHLY_CLEAN_NOZZLE_WITH_DISCARD\nMOVE_TO_XY_IDLE_POSITION_EXTRUDER\nG28 Z I140 J140\n\n;===== 检测钢板 =================\nDETECT_BED_PLATE\n\n;===== 深度清洁喷嘴 =================\nG90\nG0 Z5 F10000\nMOVE_TO_DISCARD_FILAMENT_POSITION\nM109 S{nozzle_temperature[initial_extruder] - 50}\nROUGHLY_CLEAN_NOZZLE\nMOVE_TO_XY_IDLE_POSITION_EXTRUDER\nFINELY_CLEAN_NOZZLE_STAGE_1\nM104 S{nozzle_temperature[initial_extruder] - 90}\nG0 Z5 F10000\nMOVE_TO_DISCARD_FILAMENT_POSITION\nROUGHLY_CLEAN_NOZZLE\nMOVE_TO_XY_IDLE_POSITION_EXTRUDER\nFINELY_CLEAN_NOZZLE_STAGE_2\n\n;===== 精回零 =================\nM106 S255\nM109 S{nozzle_temperature[initial_extruder] - 90}\nM190 S{bed_temperature_initial_layer_single}\nM107 P2\nG90\nG0 Z5 F10000\nWAIT_CHAMBER_TEMP TIMEOUT=180\n{if curr_bed_type==\"High Temp Plate\"} \nG28 Z Z_OFFSET -0.07 \n{else} \nG28 Z \n{endif} \n\n\n;===== 热床调平 =================\n{if curr_bed_type==\"High Temp Plate\"} \n; Always pass `ADAPTIVE_MARGIN=0` because Orca has already handled `adaptive_bed_mesh_margin` internally\n; Make sure to set ADAPTIVE to 0 otherwise Klipper will use it's own adaptive bed mesh logic\nBED_MESH_CALIBRATE mesh_min={adaptive_bed_mesh_min[0]},{adaptive_bed_mesh_min[1]} mesh_max={adaptive_bed_mesh_max[0]},{adaptive_bed_mesh_max[1]} ALGORITHM=[bed_mesh_algo] PROBE_COUNT={bed_mesh_probe_count[0]},{bed_mesh_probe_count[1]} ADAPTIVE=0 ADAPTIVE_MARGIN=0 Z_OFFSET=-0.07\n{else} \n; Always pass `ADAPTIVE_MARGIN=0` because Orca has already handled `adaptive_bed_mesh_margin` internally\n; Make sure to set ADAPTIVE to 0 otherwise Klipper will use it's own adaptive bed mesh logic\nBED_MESH_CALIBRATE mesh_min={adaptive_bed_mesh_min[0]},{adaptive_bed_mesh_min[1]} mesh_max={adaptive_bed_mesh_max[0]},{adaptive_bed_mesh_max[1]} ALGORITHM=[bed_mesh_algo] PROBE_COUNT={bed_mesh_probe_count[0]},{bed_mesh_probe_count[1]} ADAPTIVE=0 ADAPTIVE_MARGIN=0\n{endif} \n\n\n;===== 画起始线 =================\nG90\nG1 Z1.5\nG0 X85 Y1 Z2 F18000\nM109 S{nozzle_temperature_initial_layer[initial_extruder]}\nG1 Z0.2\nM83\nG1 X185 E15 F360\nG1 Z1.5\n\nG90\nM106 S0", + "machine_tool_change_time": "5", "max_layer_height": [ "0.56", "0.56", @@ -26,5 +67,126 @@ "0.8", "0.8" ], - "nozzle_type": "hardened_steel" + "nozzle_type": "hardened_steel", + "printable_area": [ + "0.5x1", + "270.5x1", + "270.5x271", + "0.5x271" + ], + "printable_height": "270.05", + "retract_before_wipe": [ + "0%", + "0%", + "0%", + "0%" + ], + "retract_length_toolchange": [ + "10", + "10", + "10", + "10" + ], + "retract_lift_above": [ + "0", + "0", + "0", + "0" + ], + "retract_lift_below": [ + "269", + "269", + "269", + "269" + ], + "retract_lift_enforce": [ + "All Surfaces", + "All Surfaces", + "All Surfaces", + "All Surfaces" + ], + "retract_restart_extra": [ + "0", + "0", + "0", + "0" + ], + "retract_restart_extra_toolchange": [ + "0", + "0", + "0", + "0" + ], + "retract_when_changing_layer": [ + "1", + "1", + "1", + "1" + ], + "retraction_distances_when_cut": [ + "18", + "18", + "18", + "18" + ], + "retraction_length": [ + "1.5", + "1.5", + "1.5", + "1.5" + ], + "retraction_minimum_travel": [ + "1", + "1", + "1", + "1" + ], + "retraction_speed": [ + "30", + "30", + "30", + "30" + ], + "thumbnails": "48x48/PNG, 300x300/PNG", + "travel_slope": [ + "3", + "3", + "3", + "3" + ], + "wipe": [ + "1", + "1", + "1", + "1" + ], + "wipe_distance": [ + "2", + "2", + "2", + "2" + ], + "z_hop": [ + "0.4", + "0.4", + "0.4", + "0.4" + ], + "z_hop_types": [ + "Auto Lift", + "Auto Lift", + "Auto Lift", + "Auto Lift" + ], + "enable_filament_ramming": "0", + "extruder_clearance_height_to_rod": "27.5", + "extruder_clearance_radius": "72.5", + "machine_load_filament_time": "0", + "machine_unload_filament_time": "0", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\nTIMELAPSE_TAKE_FRAME\nDEFECT_DETECTION_DETECT", + "machine_pause_gcode": "M600", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} CURRENT_LAYER={layer_num+1}", + "nozzle_volume": "143", + "support_multi_bed_types": "0", + "default_print_profile": "0.40 Standard @Snapmaker U1 (0.8 nozzle)" } diff --git a/resources/profiles/Snapmaker/machine/fdm_U1.json b/resources/profiles/Snapmaker/machine/fdm_U1.json index 73fe5b74ef..7ee65878e6 100644 --- a/resources/profiles/Snapmaker/machine/fdm_U1.json +++ b/resources/profiles/Snapmaker/machine/fdm_U1.json @@ -176,8 +176,6 @@ "Normal Lift", "Normal Lift" ], - "bed_mesh_max": "267,267", - "bed_mesh_min": "3,3", "purge_in_prime_tower": "0", "machine_pause_gcode": "M601", "change_filament_gcode": "", @@ -186,12 +184,14 @@ "nozzle_type": "undefine", "auxiliary_fan": "0", "default_bed_type": "Textured PEI Plate", - "printer_agent": "snapmaker", "printable_area": [ "0.5x1", "270.5x1", "270.5x271", "0.5x271" ], - "printable_height": "270.05" + "printable_height": "270.05", + "bed_mesh_min": "3,3", + "bed_mesh_max": "267,267", + "printer_agent": "snapmaker" } diff --git a/resources/profiles/Snapmaker/process/0.06 High Quality @Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.06 High Quality @Snapmaker U1 (0.2 nozzle).json index 996b127b77..3dec06228e 100644 --- a/resources/profiles/Snapmaker/process/0.06 High Quality @Snapmaker U1 (0.2 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.06 High Quality @Snapmaker U1 (0.2 nozzle).json @@ -1,43 +1,31 @@ { - "type": "process", - "name": "0.06 High Quality @Snapmaker U1 (0.2 nozzle)", - "inherits": "fdm_process_U1_0.2_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.06", - "initial_layer_print_height": "0.1", - "wall_loops": "4", - "bottom_shell_layers": "5", - "top_shell_layers": "7", - "bridge_flow": "1", - "initial_layer_speed": "40", - "initial_layer_infill_speed": "70", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "support_top_z_distance": "0.06", - "support_bottom_z_distance": "0.06", - "setting_id": "3SCofR6VrVyo3vJp", - "description": "Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer lines, lower speeds and acceleration, and the sparse infill pattern is Gyroid. So, it results in minimal layer lines and much higher printing quality, but much longer printing time.", - "default_acceleration": "4000", - "elefant_foot_compensation": "0.15", - "outer_wall_acceleration": "2000", - "outer_wall_speed": "60", - "sparse_infill_pattern": "gyroid", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.2 nozzle)" - ], - "enable_arc_fitting": "0", - "ooze_prevention": "1", - "precise_outer_wall": "0", - "prime_tower_brim_width": "5", - "prime_tower_width": "30", - "prime_volume": "13.5", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150", - "support_type": "tree(auto)", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_extra_spacing": "120%", - "wipe_tower_wall_type": "rib" + "type": "process", + "name": "0.06 High Quality @Snapmaker U1 (0.2 nozzle)", + "inherits": "fdm_process_U1_0.06_nozzle_0.2", + "from": "system", + "setting_id": "3SCofR6VrVyo3vJp", + "instantiation": "true", + "description": "Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer lines, lower speeds and acceleration, and the sparse infill pattern is Gyroid. So, it results in minimal layer lines and much higher printing quality, but much longer printing time.", + "default_acceleration": "4000", + "elefant_foot_compensation": "0.15", + "outer_wall_acceleration": "2000", + "outer_wall_speed": "60", + "sparse_infill_pattern": "gyroid", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "13.5", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib" } diff --git a/resources/profiles/Snapmaker/process/0.06 Standard @Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.06 Standard @Snapmaker U1 (0.2 nozzle).json index 85e50ec87f..7c80e048f6 100644 --- a/resources/profiles/Snapmaker/process/0.06 Standard @Snapmaker U1 (0.2 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.06 Standard @Snapmaker U1 (0.2 nozzle).json @@ -1,39 +1,27 @@ { - "type": "process", - "name": "0.06 Standard @Snapmaker U1 (0.2 nozzle)", - "inherits": "fdm_process_U1_0.2_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.06", - "initial_layer_print_height": "0.1", - "wall_loops": "4", - "bottom_shell_layers": "5", - "top_shell_layers": "7", - "bridge_flow": "1", - "initial_layer_speed": "40", - "initial_layer_infill_speed": "70", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "support_top_z_distance": "0.06", - "support_bottom_z_distance": "0.06", - "setting_id": "997RaiNHd2YhpaRB", - "description": "Compared with the default profile of 0.2 mm nozzle, it has a smaller layer height, and results in minimal layer lines and higher printing quality, but shorter printing time.", - "elefant_foot_compensation": "0.15", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.2 nozzle)" - ], - "enable_arc_fitting": "0", - "ooze_prevention": "1", - "precise_outer_wall": "0", - "prime_tower_brim_width": "5", - "prime_tower_width": "30", - "prime_volume": "13.5", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150", - "support_type": "tree(auto)", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_extra_spacing": "120%", - "wipe_tower_wall_type": "rib" + "type": "process", + "name": "0.06 Standard @Snapmaker U1 (0.2 nozzle)", + "inherits": "fdm_process_U1_0.06_nozzle_0.2", + "from": "system", + "setting_id": "997RaiNHd2YhpaRB", + "instantiation": "true", + "description": "Compared with the default profile of 0.2 mm nozzle, it has a smaller layer height, and results in minimal layer lines and higher printing quality, but shorter printing time.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "13.5", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib" } diff --git a/resources/profiles/Snapmaker/process/0.08 Extra Fine @Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.08 Extra Fine @Snapmaker U1 (0.4 nozzle).json index aeffe99f2a..b8a8e126aa 100644 --- a/resources/profiles/Snapmaker/process/0.08 Extra Fine @Snapmaker U1 (0.4 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.08 Extra Fine @Snapmaker U1 (0.4 nozzle).json @@ -12,6 +12,19 @@ "Snapmaker U1 (0.4 nozzle)" ], "ooze_prevention": "1", + "prime_tower_width": "30", + "prime_volume": "18", "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150" + "standby_temperature_delta": "-150", + "wipe_tower_filament": "0", + "prime_tower_brim_width": "5", + "wipe_tower_cone_angle": "15", + "wipe_tower_extra_spacing": "120%", + "enable_arc_fitting": "0", + "outer_wall_speed": "100", + "precise_outer_wall": "1", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_wall_type": "rib", + "gap_fill_target": "topbottom" } diff --git a/resources/profiles/Snapmaker/process/0.08 High Quality @Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.08 High Quality @Snapmaker U1 (0.2 nozzle).json index fe0fc0e87d..27d3903f06 100644 --- a/resources/profiles/Snapmaker/process/0.08 High Quality @Snapmaker U1 (0.2 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.08 High Quality @Snapmaker U1 (0.2 nozzle).json @@ -1,43 +1,31 @@ { - "type": "process", - "name": "0.08 High Quality @Snapmaker U1 (0.2 nozzle)", - "inherits": "fdm_process_U1_0.2_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.08", - "initial_layer_print_height": "0.1", - "wall_loops": "4", - "bottom_shell_layers": "5", - "top_shell_layers": "7", - "bridge_flow": "1", - "initial_layer_speed": "40", - "initial_layer_infill_speed": "70", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "support_top_z_distance": "0.08", - "support_bottom_z_distance": "0.08", - "setting_id": "6ExpMU3Wq4J1R7wy", - "description": "Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer lines, lower speeds and acceleration, and the sparse infill pattern is Gyroid. So, it results in almost invisible layer lines and much higher printing quality, but much longer printing time.", - "default_acceleration": "4000", - "elefant_foot_compensation": "0.15", - "outer_wall_acceleration": "2000", - "outer_wall_speed": "60", - "sparse_infill_pattern": "gyroid", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.2 nozzle)" - ], - "enable_arc_fitting": "0", - "ooze_prevention": "1", - "precise_outer_wall": "0", - "prime_tower_brim_width": "5", - "prime_tower_width": "30", - "prime_volume": "18", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150", - "support_type": "tree(auto)", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_extra_spacing": "120%", - "wipe_tower_wall_type": "rib" + "type": "process", + "name": "0.08 High Quality @Snapmaker U1 (0.2 nozzle)", + "inherits": "fdm_process_U1_0.08_nozzle_0.2", + "from": "system", + "setting_id": "6ExpMU3Wq4J1R7wy", + "instantiation": "true", + "description": "Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer lines, lower speeds and acceleration, and the sparse infill pattern is Gyroid. So, it results in almost invisible layer lines and much higher printing quality, but much longer printing time.", + "default_acceleration": "4000", + "elefant_foot_compensation": "0.15", + "outer_wall_acceleration": "2000", + "outer_wall_speed": "60", + "sparse_infill_pattern": "gyroid", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "18", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib" } diff --git a/resources/profiles/Snapmaker/process/0.08 High Quality @Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.08 High Quality @Snapmaker U1 (0.4 nozzle).json index b86156d841..677e6742d9 100644 --- a/resources/profiles/Snapmaker/process/0.08 High Quality @Snapmaker U1 (0.4 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.08 High Quality @Snapmaker U1 (0.4 nozzle).json @@ -21,6 +21,18 @@ "Snapmaker U1 (0.4 nozzle)" ], "ooze_prevention": "1", + "prime_tower_width": "30", + "prime_volume": "18", "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150" + "standby_temperature_delta": "-150", + "wipe_tower_filament": "0", + "prime_tower_brim_width": "5", + "wipe_tower_cone_angle": "15", + "wipe_tower_extra_spacing": "120%", + "enable_arc_fitting": "0", + "precise_outer_wall": "1", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_wall_type": "rib", + "gap_fill_target": "topbottom" } diff --git a/resources/profiles/Snapmaker/process/0.08 Standard @Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.08 Standard @Snapmaker U1 (0.2 nozzle).json index 472176ff40..b4728bd60f 100644 --- a/resources/profiles/Snapmaker/process/0.08 Standard @Snapmaker U1 (0.2 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.08 Standard @Snapmaker U1 (0.2 nozzle).json @@ -1,39 +1,27 @@ { - "type": "process", - "name": "0.08 Standard @Snapmaker U1 (0.2 nozzle)", - "inherits": "fdm_process_U1_0.2_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.08", - "initial_layer_print_height": "0.1", - "wall_loops": "4", - "bottom_shell_layers": "5", - "top_shell_layers": "7", - "bridge_flow": "1", - "initial_layer_speed": "40", - "initial_layer_infill_speed": "70", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "support_top_z_distance": "0.08", - "support_bottom_z_distance": "0.08", - "setting_id": "loFrCYH9ux2L5JpZ", - "description": "Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer height, and results in almost invisible layer lines and higher printing quality, but shorter printing time.", - "elefant_foot_compensation": "0.15", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.2 nozzle)" - ], - "enable_arc_fitting": "0", - "ooze_prevention": "1", - "precise_outer_wall": "0", - "prime_tower_brim_width": "5", - "prime_tower_width": "30", - "prime_volume": "18", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150", - "support_type": "tree(auto)", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_extra_spacing": "120%", - "wipe_tower_wall_type": "rib" + "type": "process", + "name": "0.08 Standard @Snapmaker U1 (0.2 nozzle)", + "inherits": "fdm_process_U1_0.08_nozzle_0.2", + "from": "system", + "setting_id": "loFrCYH9ux2L5JpZ", + "instantiation": "true", + "description": "Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer height, and results in almost invisible layer lines and higher printing quality, but shorter printing time.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "18", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib" } diff --git a/resources/profiles/Snapmaker/process/0.10 High Quality @Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.10 High Quality @Snapmaker U1 (0.2 nozzle).json index 0f15ce7c5f..80b2120807 100644 --- a/resources/profiles/Snapmaker/process/0.10 High Quality @Snapmaker U1 (0.2 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.10 High Quality @Snapmaker U1 (0.2 nozzle).json @@ -1,43 +1,31 @@ { - "type": "process", - "name": "0.10 High Quality @Snapmaker U1 (0.2 nozzle)", - "inherits": "fdm_process_U1_0.2_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.1", - "initial_layer_print_height": "0.1", - "wall_loops": "4", - "bottom_shell_layers": "5", - "top_shell_layers": "7", - "bridge_flow": "1", - "initial_layer_speed": "40", - "initial_layer_infill_speed": "70", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "support_top_z_distance": "0.1", - "support_bottom_z_distance": "0.1", - "setting_id": "BfLpmnJnSBYBFInR", - "description": "Compared with the default profile of a 0.2 mm nozzle, it has lower speeds and acceleration, and the sparse infill pattern is Gyroid. So, it results in much higher printing quality, but a much longer printing time.", - "default_acceleration": "4000", - "elefant_foot_compensation": "0.15", - "outer_wall_acceleration": "2000", - "outer_wall_speed": "60", - "sparse_infill_pattern": "gyroid", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.2 nozzle)" - ], - "enable_arc_fitting": "0", - "ooze_prevention": "1", - "precise_outer_wall": "0", - "prime_tower_brim_width": "5", - "prime_tower_width": "28", - "prime_volume": "25", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150", - "support_type": "tree(auto)", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_extra_spacing": "120%", - "wipe_tower_wall_type": "rib" + "type": "process", + "name": "0.10 High Quality @Snapmaker U1 (0.2 nozzle)", + "inherits": "fdm_process_U1_0.10_nozzle_0.2", + "from": "system", + "setting_id": "BfLpmnJnSBYBFInR", + "instantiation": "true", + "description": "Compared with the default profile of a 0.2 mm nozzle, it has lower speeds and acceleration, and the sparse infill pattern is Gyroid. So, it results in much higher printing quality, but a much longer printing time.", + "default_acceleration": "4000", + "elefant_foot_compensation": "0.15", + "outer_wall_acceleration": "2000", + "outer_wall_speed": "60", + "sparse_infill_pattern": "gyroid", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "prime_tower_brim_width": "5", + "prime_tower_width": "28", + "prime_volume": "25", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib" } diff --git a/resources/profiles/Snapmaker/process/0.10 Standard @Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.10 Standard @Snapmaker U1 (0.2 nozzle).json index 460bf8b6fd..80739205ac 100644 --- a/resources/profiles/Snapmaker/process/0.10 Standard @Snapmaker U1 (0.2 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.10 Standard @Snapmaker U1 (0.2 nozzle).json @@ -1,41 +1,29 @@ { - "type": "process", - "name": "0.10 Standard @Snapmaker U1 (0.2 nozzle)", - "inherits": "fdm_process_U1_0.2_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.1", - "initial_layer_print_height": "0.1", - "wall_loops": "4", - "bottom_shell_layers": "5", - "top_shell_layers": "7", - "bridge_flow": "1", - "initial_layer_speed": "40", - "initial_layer_infill_speed": "70", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "support_top_z_distance": "0.1", - "support_bottom_z_distance": "0.1", - "setting_id": "SOq962UWv1ml1Mk0", - "description": "It has a small layer height, and results in almost negligible layer lines and high printing quality. It is suitable for most general printing cases.", - "elefant_foot_compensation": "0.15", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.2 nozzle)" - ], - "enable_arc_fitting": "0", - "ooze_prevention": "1", - "precise_outer_wall": "0", - "preheat_time": "31", - "prime_tower_brim_width": "6", - "prime_tower_width": "28", - "prime_volume": "25", - "standby_temperature_delta": "-150", - "support_threshold_angle": "35", - "support_type": "tree(auto)", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_extra_spacing": "120%", - "wipe_tower_wall_type": "rib", - "slowdown_for_curled_perimeters": "0" + "type": "process", + "name": "0.10 Standard @Snapmaker U1 (0.2 nozzle)", + "inherits": "fdm_process_U1_0.10_nozzle_0.2", + "from": "system", + "setting_id": "SOq962UWv1ml1Mk0", + "instantiation": "true", + "description": "It has a small layer height, and results in almost negligible layer lines and high printing quality. It is suitable for most general printing cases.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "preheat_time": "31", + "prime_tower_brim_width": "6", + "prime_tower_width": "28", + "prime_volume": "25", + "standby_temperature_delta": "-150", + "support_threshold_angle": "35", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "slowdown_for_curled_perimeters": "0" } diff --git a/resources/profiles/Snapmaker/process/0.12 Fine @Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.12 Fine @Snapmaker U1 (0.4 nozzle).json index 42823b3f0b..2da54a6dc3 100644 --- a/resources/profiles/Snapmaker/process/0.12 Fine @Snapmaker U1 (0.4 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.12 Fine @Snapmaker U1 (0.4 nozzle).json @@ -13,5 +13,18 @@ ], "ooze_prevention": "1", "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150" + "standby_temperature_delta": "-150", + "wipe_tower_filament": "0", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "27", + "wipe_tower_cone_angle": "15", + "wipe_tower_extra_spacing": "120%", + "enable_arc_fitting": "0", + "precise_outer_wall": "1", + "support_threshold_angle": "25", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_wall_type": "rib", + "gap_fill_target": "topbottom" } diff --git a/resources/profiles/Snapmaker/process/0.12 High Quality @Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.12 High Quality @Snapmaker U1 (0.4 nozzle).json index 8564a41b24..9302a40421 100644 --- a/resources/profiles/Snapmaker/process/0.12 High Quality @Snapmaker U1 (0.4 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.12 High Quality @Snapmaker U1 (0.4 nozzle).json @@ -20,5 +20,20 @@ "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" ], - "slowdown_for_curled_perimeters": "0" + "prime_tower_width": "30", + "prime_volume": "27", + "slowdown_for_curled_perimeters": "0", + "wipe_tower_filament": "0", + "prime_tower_brim_width": "5", + "wipe_tower_cone_angle": "15", + "wipe_tower_extra_spacing": "120%", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "standby_temperature_delta": "-150", + "support_threshold_angle": "25", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_wall_type": "rib", + "gap_fill_target": "topbottom" } diff --git a/resources/profiles/Snapmaker/process/0.12 Standard @Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.12 Standard @Snapmaker U1 (0.2 nozzle).json index de68cc0dd0..cc93a97e99 100644 --- a/resources/profiles/Snapmaker/process/0.12 Standard @Snapmaker U1 (0.2 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.12 Standard @Snapmaker U1 (0.2 nozzle).json @@ -1,39 +1,27 @@ { - "type": "process", - "name": "0.12 Standard @Snapmaker U1 (0.2 nozzle)", - "inherits": "fdm_process_U1_0.2_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.12", - "initial_layer_print_height": "0.1", - "wall_loops": "4", - "bottom_shell_layers": "5", - "top_shell_layers": "7", - "bridge_flow": "1", - "initial_layer_speed": "40", - "initial_layer_infill_speed": "70", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "support_top_z_distance": "0.12", - "support_bottom_z_distance": "0.12", - "setting_id": "KHC1zpxpuvaUEzvf", - "description": "Compared with the default profile of a 0.2 mm nozzle, it has a slightly bigger layer height, and results in almost negligible layer lines, and slightly shorter printing time.", - "elefant_foot_compensation": "0.15", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.2 nozzle)" - ], - "enable_arc_fitting": "0", - "ooze_prevention": "1", - "precise_outer_wall": "0", - "prime_tower_brim_width": "5", - "prime_tower_width": "28", - "prime_volume": "27", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150", - "support_type": "tree(auto)", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_extra_spacing": "120%", - "wipe_tower_wall_type": "rib" + "type": "process", + "name": "0.12 Standard @Snapmaker U1 (0.2 nozzle)", + "inherits": "fdm_process_U1_0.12_nozzle_0.2", + "from": "system", + "setting_id": "KHC1zpxpuvaUEzvf", + "instantiation": "true", + "description": "Compared with the default profile of a 0.2 mm nozzle, it has a slightly bigger layer height, and results in almost negligible layer lines, and slightly shorter printing time.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "prime_tower_brim_width": "5", + "prime_tower_width": "28", + "prime_volume": "27", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib" } diff --git a/resources/profiles/Snapmaker/process/0.14 Standard @Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.14 Standard @Snapmaker U1 (0.2 nozzle).json index c265d55e67..54513eb14b 100644 --- a/resources/profiles/Snapmaker/process/0.14 Standard @Snapmaker U1 (0.2 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.14 Standard @Snapmaker U1 (0.2 nozzle).json @@ -1,39 +1,27 @@ { - "type": "process", - "name": "0.14 Standard @Snapmaker U1 (0.2 nozzle)", - "inherits": "fdm_process_U1_0.2_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.14", - "initial_layer_print_height": "0.1", - "wall_loops": "4", - "bottom_shell_layers": "5", - "top_shell_layers": "7", - "bridge_flow": "1", - "initial_layer_speed": "40", - "initial_layer_infill_speed": "70", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "support_top_z_distance": "0.14", - "support_bottom_z_distance": "0.14", - "setting_id": "NGJoV0n6T510y9wM", - "description": "Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer height, and results in slightly visible layer lines, but shorter printing time.", - "elefant_foot_compensation": "0.15", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.2 nozzle)" - ], - "enable_arc_fitting": "0", - "ooze_prevention": "1", - "precise_outer_wall": "0", - "prime_tower_brim_width": "5", - "prime_tower_width": "30", - "prime_volume": "32", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150", - "support_type": "tree(auto)", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_extra_spacing": "120%", - "wipe_tower_wall_type": "rib" + "type": "process", + "name": "0.14 Standard @Snapmaker U1 (0.2 nozzle)", + "inherits": "fdm_process_U1_0.14_nozzle_0.2", + "from": "system", + "setting_id": "NGJoV0n6T510y9wM", + "instantiation": "true", + "description": "Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer height, and results in slightly visible layer lines, but shorter printing time.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "32", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib" } diff --git a/resources/profiles/Snapmaker/process/0.16 High Quality @Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.16 High Quality @Snapmaker U1 (0.4 nozzle).json index e66f9f3beb..416d85881c 100644 --- a/resources/profiles/Snapmaker/process/0.16 High Quality @Snapmaker U1 (0.4 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.16 High Quality @Snapmaker U1 (0.4 nozzle).json @@ -21,6 +21,19 @@ "Snapmaker U1 (0.4 nozzle)" ], "ooze_prevention": "1", + "prime_tower_width": "30", + "prime_volume": "36", "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150" + "standby_temperature_delta": "-150", + "wipe_tower_filament": "0", + "prime_tower_brim_width": "5", + "wipe_tower_cone_angle": "15", + "wipe_tower_extra_spacing": "120%", + "enable_arc_fitting": "0", + "precise_outer_wall": "1", + "support_threshold_angle": "30", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_wall_type": "rib", + "gap_fill_target": "topbottom" } diff --git a/resources/profiles/Snapmaker/process/0.16 Optimal @Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.16 Optimal @Snapmaker U1 (0.4 nozzle).json index 2817871fad..6871a3e120 100644 --- a/resources/profiles/Snapmaker/process/0.16 Optimal @Snapmaker U1 (0.4 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.16 Optimal @Snapmaker U1 (0.4 nozzle).json @@ -12,6 +12,18 @@ "Snapmaker U1 (0.4 nozzle)" ], "ooze_prevention": "1", + "prime_tower_width": "30", + "prime_volume": "36", "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150" + "standby_temperature_delta": "-150", + "wipe_tower_filament": "0", + "prime_tower_brim_width": "5", + "wipe_tower_cone_angle": "15", + "wipe_tower_extra_spacing": "120%", + "enable_arc_fitting": "0", + "precise_outer_wall": "1", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_wall_type": "rib", + "gap_fill_target": "topbottom" } diff --git a/resources/profiles/Snapmaker/process/0.18 Standard @Snapmaker U1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.18 Standard @Snapmaker U1 (0.6 nozzle).json index e68cf86d75..77b756bffc 100644 --- a/resources/profiles/Snapmaker/process/0.18 Standard @Snapmaker U1 (0.6 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.18 Standard @Snapmaker U1 (0.6 nozzle).json @@ -1,42 +1,32 @@ { - "type": "process", - "name": "0.18 Standard @Snapmaker U1 (0.6 nozzle)", - "inherits": "fdm_process_U1_0.6_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.25", - "initial_layer_print_height": "0.3", - "bridge_flow": "1", - "initial_layer_speed": "35", - "initial_layer_infill_speed": "55", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "bridge_speed": "30", - "overhang_3_4_speed": "15", - "support_top_z_distance": "0.18", - "support_bottom_z_distance": "0.18", - "setting_id": "XGSrVgnsUFv6uCRs", - "description": "Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer height, and results in less apparent layer lines and higher printing quality, but longer printing time.", - "elefant_foot_compensation": "0.15", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.6 nozzle)" - ], - "filter_out_gap_fill": "1", - "gap_fill_target": "topbottom", - "internal_bridge_speed": "100%", - "prime_tower_brim_width": "5", - "prime_tower_width": "30", - "prime_volume": "41", - "seam_gap": "15%", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_extra_spacing": "120%", - "wipe_tower_wall_type": "rib", - "enable_arc_fitting": "0", - "ooze_prevention": "1", - "precise_outer_wall": "0", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150", - "support_type": "tree(auto)" + "type": "process", + "name": "0.18 Standard @Snapmaker U1 (0.6 nozzle)", + "inherits": "fdm_process_U1_0.18_nozzle_0.6", + "from": "system", + "setting_id": "XGSrVgnsUFv6uCRs", + "instantiation": "true", + "description": "Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer height, and results in less apparent layer lines and higher printing quality, but longer printing time.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "layer_height": "0.25", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "41", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)" } diff --git a/resources/profiles/Snapmaker/process/0.20 Bambu Support W @Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.20 Bambu Support W @Snapmaker U1 (0.4 nozzle).json deleted file mode 100644 index 5de608c68d..0000000000 --- a/resources/profiles/Snapmaker/process/0.20 Bambu Support W @Snapmaker U1 (0.4 nozzle).json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "process", - "name": "0.20 Bambu Support W @Snapmaker U1 (0.4 nozzle)", - "inherits": "fdm_process_U1_0.20", - "from": "system", - "setting_id": "8OkVMuElKExBdftG", - "instantiation": "true", - "enable_support": "1", - "support_interface_top_layers": "3", - "support_top_z_distance": "0.2", - "support_interface_loop_pattern": "1", - "support_interface_spacing": "0", - "support_interface_speed": "80", - "support_filament": "0", - "support_interface_filament": "0", - "enable_prime_tower": "1", - "compatible_printers": [ - "Snapmaker U1 (0.4 nozzle)" - ], - "ooze_prevention": "1", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150" -} diff --git a/resources/profiles/Snapmaker/process/0.20 Quality @Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.20 Quality @Snapmaker U1 (0.4 nozzle).json index ac7fc102bc..da92006d49 100644 --- a/resources/profiles/Snapmaker/process/0.20 Quality @Snapmaker U1 (0.4 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.20 Quality @Snapmaker U1 (0.4 nozzle).json @@ -12,6 +12,7 @@ "Snapmaker U1 (0.4 nozzle)" ], "ooze_prevention": "1", + "prime_tower_width": "30", "slowdown_for_curled_perimeters": "0", "standby_temperature_delta": "-150", "wipe_tower_filament": "0", diff --git a/resources/profiles/Snapmaker/process/0.20 Standard @Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.20 Standard @Snapmaker U1 (0.4 nozzle).json index 243718507b..5d873d5efd 100644 --- a/resources/profiles/Snapmaker/process/0.20 Standard @Snapmaker U1 (0.4 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.20 Standard @Snapmaker U1 (0.4 nozzle).json @@ -12,6 +12,8 @@ "Snapmaker U1 (0.4 nozzle)" ], "ooze_prevention": "1", + "prime_tower_width": "30", + "prime_volume": "45", "slowdown_for_curled_perimeters": "0", "standby_temperature_delta": "-150", "wipe_tower_filament": "0", diff --git a/resources/profiles/Snapmaker/process/0.20 Standard @Snapmaker U1 (0.4+0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.20 Standard @Snapmaker U1 (0.4+0.6 nozzle).json index 52e1aa9349..63bb6ea170 100644 --- a/resources/profiles/Snapmaker/process/0.20 Standard @Snapmaker U1 (0.4+0.6 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.20 Standard @Snapmaker U1 (0.4+0.6 nozzle).json @@ -20,6 +20,7 @@ "smooth_coefficient": "150", "overhang_totally_speed": "50", "ooze_prevention": "1", + "prime_tower_width": "30", "slowdown_for_curled_perimeters": "0", "standby_temperature_delta": "-150", "wipe_tower_filament": "0", diff --git a/resources/profiles/Snapmaker/process/0.20 Standard @Snapmaker U1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.20 Standard @Snapmaker U1 (0.6 nozzle).json index f5ab699928..d1bb174a62 100644 --- a/resources/profiles/Snapmaker/process/0.20 Standard @Snapmaker U1 (0.6 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.20 Standard @Snapmaker U1 (0.6 nozzle).json @@ -13,6 +13,7 @@ "Snapmaker U1 (0.6 nozzle)" ], "ooze_prevention": "1", + "prime_tower_width": "30", "slowdown_for_curled_perimeters": "0", "standby_temperature_delta": "-150", "wipe_tower_filament": "0", diff --git a/resources/profiles/Snapmaker/process/0.20 Strength @Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.20 Strength @Snapmaker U1 (0.4 nozzle).json index 4defa45a16..91c5995b92 100644 --- a/resources/profiles/Snapmaker/process/0.20 Strength @Snapmaker U1 (0.4 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.20 Strength @Snapmaker U1 (0.4 nozzle).json @@ -15,6 +15,18 @@ "Snapmaker U1 (0.4 nozzle)" ], "ooze_prevention": "1", + "prime_tower_width": "30", + "prime_volume": "45", "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150" + "standby_temperature_delta": "-150", + "wipe_tower_filament": "0", + "prime_tower_brim_width": "5", + "wipe_tower_cone_angle": "15", + "wipe_tower_extra_spacing": "120%", + "enable_arc_fitting": "0", + "precise_outer_wall": "1", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_wall_type": "rib", + "gap_fill_target": "topbottom" } diff --git a/resources/profiles/Snapmaker/process/0.20 Support @Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.20 Support @Snapmaker U1 (0.4 nozzle).json index 36a3172b48..0cb85cc26d 100644 --- a/resources/profiles/Snapmaker/process/0.20 Support @Snapmaker U1 (0.4 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.20 Support @Snapmaker U1 (0.4 nozzle).json @@ -12,6 +12,8 @@ "Snapmaker U1 (0.4 nozzle)" ], "ooze_prevention": "1", + "prime_tower_width": "40", + "prime_volume": "15", "slowdown_for_curled_perimeters": "0", "standby_temperature_delta": "-150", "wipe_tower_filament": "0", diff --git a/resources/profiles/Snapmaker/process/0.20 Support W @Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.20 Support W @Snapmaker U1 (0.4 nozzle).json index 37ba596b63..3d1887bea9 100644 --- a/resources/profiles/Snapmaker/process/0.20 Support W @Snapmaker U1 (0.4 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.20 Support W @Snapmaker U1 (0.4 nozzle).json @@ -18,6 +18,8 @@ "Snapmaker U1 (0.4 nozzle)" ], "ooze_prevention": "1", + "prime_tower_width": "50", + "prime_volume": "38", "slowdown_for_curled_perimeters": "0", "standby_temperature_delta": "-150" } diff --git a/resources/profiles/Snapmaker/process/0.24 Draft @Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.24 Draft @Snapmaker U1 (0.4 nozzle).json index a4c10a8ad1..f98007b6e1 100644 --- a/resources/profiles/Snapmaker/process/0.24 Draft @Snapmaker U1 (0.4 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.24 Draft @Snapmaker U1 (0.4 nozzle).json @@ -12,6 +12,18 @@ "Snapmaker U1 (0.4 nozzle)" ], "ooze_prevention": "1", + "prime_tower_width": "30", + "prime_volume": "54", "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150" + "standby_temperature_delta": "-150", + "wipe_tower_filament": "0", + "prime_tower_brim_width": "5", + "wipe_tower_cone_angle": "15", + "wipe_tower_extra_spacing": "120%", + "enable_arc_fitting": "0", + "precise_outer_wall": "1", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_wall_type": "rib", + "gap_fill_target": "topbottom" } diff --git a/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker U1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker U1 (0.6 nozzle).json index b8a8427baf..7a9f4e2154 100644 --- a/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker U1 (0.6 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker U1 (0.6 nozzle).json @@ -1,41 +1,32 @@ { - "type": "process", - "name": "0.24 Standard @Snapmaker U1 (0.6 nozzle)", - "inherits": "fdm_process_U1_0.6_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.24", - "initial_layer_print_height": "0.3", - "bridge_flow": "1", - "initial_layer_speed": "35", - "initial_layer_infill_speed": "55", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "bridge_speed": "30", - "overhang_3_4_speed": "15", - "setting_id": "BziJYuA5U5gWm6FM", - "description": "Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer height, and results in less apparent layer lines and slight higher printing quality, but longer printing time.", - "elefant_foot_compensation": "0.15", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.6 nozzle)" - ], - "filter_out_gap_fill": "1", - "gap_fill_target": "topbottom", - "internal_bridge_speed": "100%", - "prime_tower_brim_width": "5", - "prime_tower_width": "30", - "prime_volume": "55", - "seam_gap": "15%", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_extra_spacing": "120%", - "wipe_tower_wall_type": "rib", - "enable_arc_fitting": "0", - "ooze_prevention": "1", - "precise_outer_wall": "0", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150", - "support_threshold_angle": "35", - "support_type": "tree(auto)" + "type": "process", + "name": "0.24 Standard @Snapmaker U1 (0.6 nozzle)", + "inherits": "fdm_process_U1_0.24_nozzle_0.6", + "from": "system", + "setting_id": "BziJYuA5U5gWm6FM", + "instantiation": "true", + "description": "Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer height, and results in less apparent layer lines and slight higher printing quality, but longer printing time.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "55", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_threshold_angle": "35", + "support_type": "tree(auto)" } diff --git a/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker U1 (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker U1 (0.8 nozzle).json index 1b13e745d2..d9e1a2bf94 100644 --- a/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker U1 (0.8 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker U1 (0.8 nozzle).json @@ -1,43 +1,32 @@ { - "type": "process", - "name": "0.24 Standard @Snapmaker U1 (0.8 nozzle)", - "inherits": "fdm_process_U1_0.8_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.24", - "initial_layer_print_height": "0.4", - "bridge_flow": "1", - "top_surface_pattern": "monotonic", - "initial_layer_speed": "35", - "initial_layer_infill_speed": "55", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "bridge_speed": "30", - "overhang_3_4_speed": "25", - "overhang_4_4_speed": "5", - "setting_id": "QcJ5p9h0eYUb91ak", - "description": "Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer height, and results in less apparent layer lines and slight higher printing quality, but longer printing time.", - "elefant_foot_compensation": "0.15", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.8 nozzle)" - ], - "filter_out_gap_fill": "1", - "gap_fill_target": "topbottom", - "internal_bridge_speed": "100%", - "min_width_top_surface": "90", - "prime_tower_brim_width": "5", - "prime_tower_width": "30", - "prime_volume": "54", - "seam_gap": "15%", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_extra_spacing": "120%", - "wipe_tower_wall_type": "rib", - "enable_arc_fitting": "0", - "ooze_prevention": "1", - "precise_outer_wall": "0", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150", - "support_type": "tree(auto)" + "type": "process", + "name": "0.24 Standard @Snapmaker U1 (0.8 nozzle)", + "inherits": "fdm_process_U1_0.24_nozzle_0.8", + "from": "system", + "setting_id": "QcJ5p9h0eYUb91ak", + "instantiation": "true", + "description": "Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer height, and results in less apparent layer lines and slight higher printing quality, but longer printing time.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "min_width_top_surface": "90", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "54", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)" } diff --git a/resources/profiles/Snapmaker/process/0.28 Extra Draft @Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.28 Extra Draft @Snapmaker U1 (0.4 nozzle).json index 4adf06f100..4382b11e41 100644 --- a/resources/profiles/Snapmaker/process/0.28 Extra Draft @Snapmaker U1 (0.4 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.28 Extra Draft @Snapmaker U1 (0.4 nozzle).json @@ -11,5 +11,19 @@ "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" ], - "slowdown_for_curled_perimeters": "0" + "prime_tower_width": "30", + "prime_volume": "63", + "slowdown_for_curled_perimeters": "0", + "wipe_tower_filament": "0", + "prime_tower_brim_width": "5", + "wipe_tower_cone_angle": "15", + "wipe_tower_extra_spacing": "120%", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_wall_type": "rib", + "gap_fill_target": "topbottom" } diff --git a/resources/profiles/Snapmaker/process/0.30 Draft @Snapmaker U1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.30 Draft @Snapmaker U1 (0.6 nozzle).json index 8f8e6a1d15..52eb63a64d 100644 --- a/resources/profiles/Snapmaker/process/0.30 Draft @Snapmaker U1 (0.6 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.30 Draft @Snapmaker U1 (0.6 nozzle).json @@ -13,6 +13,8 @@ "Snapmaker U1 (0.6 nozzle)" ], "ooze_prevention": "1", + "prime_tower_width": "30", + "prime_volume": "68", "slowdown_for_curled_perimeters": "0", "standby_temperature_delta": "-150", "wipe_tower_filament": "0", diff --git a/resources/profiles/Snapmaker/process/0.30 Standard @Snapmaker U1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.30 Standard @Snapmaker U1 (0.6 nozzle).json index 3ed454a7d5..e2d5c192bb 100644 --- a/resources/profiles/Snapmaker/process/0.30 Standard @Snapmaker U1 (0.6 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.30 Standard @Snapmaker U1 (0.6 nozzle).json @@ -1,40 +1,31 @@ { - "type": "process", - "name": "0.30 Standard @Snapmaker U1 (0.6 nozzle)", - "inherits": "fdm_process_U1_0.6_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.3", - "initial_layer_print_height": "0.3", - "bridge_flow": "1", - "initial_layer_speed": "35", - "initial_layer_infill_speed": "55", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "bridge_speed": "30", - "overhang_3_4_speed": "15", - "setting_id": "TWxp6qgz1DJa8Ngo", - "description": "It has a big layer height, and results in apparent layer lines and ordinary printing quality and printing time.", - "elefant_foot_compensation": "0.15", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.6 nozzle)" - ], - "filter_out_gap_fill": "1", - "gap_fill_target": "topbottom", - "internal_bridge_speed": "100%", - "prime_tower_brim_width": "5", - "prime_tower_width": "30", - "prime_volume": "68", - "seam_gap": "15%", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_extra_spacing": "120%", - "wipe_tower_wall_type": "rib", - "ooze_prevention": "1", - "precise_outer_wall": "0", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150", - "support_threshold_angle": "35", - "support_type": "tree(auto)" + "type": "process", + "name": "0.30 Standard @Snapmaker U1 (0.6 nozzle)", + "inherits": "fdm_process_U1_0.30_nozzle_0.6", + "from": "system", + "setting_id": "TWxp6qgz1DJa8Ngo", + "instantiation": "true", + "description": "It has a big layer height, and results in apparent layer lines and ordinary printing quality and printing time.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "68", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_threshold_angle": "35", + "support_type": "tree(auto)" } diff --git a/resources/profiles/Snapmaker/process/0.30 Strength @Snapmaker U1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.30 Strength @Snapmaker U1 (0.6 nozzle).json index ce6563d960..c216eb09d2 100644 --- a/resources/profiles/Snapmaker/process/0.30 Strength @Snapmaker U1 (0.6 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.30 Strength @Snapmaker U1 (0.6 nozzle).json @@ -1,42 +1,33 @@ { - "type": "process", - "name": "0.30 Strength @Snapmaker U1 (0.6 nozzle)", - "inherits": "fdm_process_U1_0.6_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.3", - "initial_layer_print_height": "0.3", - "bridge_flow": "1", - "initial_layer_speed": "35", - "initial_layer_infill_speed": "55", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "bridge_speed": "30", - "overhang_3_4_speed": "15", - "setting_id": "CBaL0vgwtgsd6Snj", - "description": "Compared with the default profile of a 0.6 mm nozzle, it has more wall loops and a higher sparse infill density. So, it results in higher strength of the prints, but more filament consumption and longer printing time.", - "elefant_foot_compensation": "0.15", - "sparse_infill_density": "25%", - "wall_loops": "4", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.6 nozzle)" - ], - "filter_out_gap_fill": "1", - "gap_fill_target": "topbottom", - "internal_bridge_speed": "100%", - "prime_tower_width": "30", - "prime_volume": "68", - "seam_gap": "15%", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_wall_type": "rib", - "enable_arc_fitting": "0", - "ooze_prevention": "1", - "precise_outer_wall": "0", - "prime_tower_brim_width": "5", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150", - "support_type": "tree(auto)", - "wipe_tower_extra_spacing": "120%" + "type": "process", + "name": "0.30 Strength @Snapmaker U1 (0.6 nozzle)", + "inherits": "fdm_process_U1_0.30_nozzle_0.6", + "from": "system", + "setting_id": "CBaL0vgwtgsd6Snj", + "instantiation": "true", + "description": "Compared with the default profile of a 0.6 mm nozzle, it has more wall loops and a higher sparse infill density. So, it results in higher strength of the prints, but more filament consumption and longer printing time.", + "elefant_foot_compensation": "0.15", + "sparse_infill_density": "25%", + "wall_loops": "4", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "prime_tower_width": "30", + "prime_volume": "68", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_wall_type": "rib", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "prime_tower_brim_width": "5", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)", + "wipe_tower_extra_spacing": "120%" } diff --git a/resources/profiles/Snapmaker/process/0.32 Standard @Snapmaker U1 (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.32 Standard @Snapmaker U1 (0.8 nozzle).json index 47ac276acc..d2c20559fd 100644 --- a/resources/profiles/Snapmaker/process/0.32 Standard @Snapmaker U1 (0.8 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.32 Standard @Snapmaker U1 (0.8 nozzle).json @@ -1,44 +1,34 @@ { - "type": "process", - "name": "0.32 Standard @Snapmaker U1 (0.8 nozzle)", - "inherits": "fdm_process_U1_0.8_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.32", - "initial_layer_print_height": "0.4", - "bridge_flow": "0.7", - "top_surface_pattern": "monotonic", - "initial_layer_speed": "35", - "initial_layer_infill_speed": "55", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "bridge_speed": "30", - "overhang_3_4_speed": "25", - "overhang_4_4_speed": "5", - "setting_id": "iVRz2B0VBIBL1xVd", - "description": "Compared with the default profile of a 0.8 mm nozzle, it has a slightly smaller layer height, and results in slightly less but still apparent layer lines and slightly higher printing quality, but longer printing time in some printing cases.", - "elefant_foot_compensation": "0.15", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.8 nozzle)" - ], - "filter_out_gap_fill": "1", - "gap_fill_target": "topbottom", - "internal_bridge_speed": "100%", - "prime_tower_brim_width": "5", - "prime_tower_width": "30", - "prime_volume": "72", - "seam_gap": "15%", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_extra_spacing": "120%", - "wipe_tower_wall_type": "rib", - "bridge_density": "70%", - "enable_arc_fitting": "0", - "ooze_prevention": "1", - "precise_outer_wall": "0", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150", - "support_threshold_angle": "35", - "support_type": "tree(auto)" + "type": "process", + "name": "0.32 Standard @Snapmaker U1 (0.8 nozzle)", + "inherits": "fdm_process_U1_0.32_nozzle_0.8", + "from": "system", + "setting_id": "iVRz2B0VBIBL1xVd", + "instantiation": "true", + "description": "Compared with the default profile of a 0.8 mm nozzle, it has a slightly smaller layer height, and results in slightly less but still apparent layer lines and slightly higher printing quality, but longer printing time in some printing cases.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "72", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "bridge_density": "70%", + "bridge_flow": "0.7", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_threshold_angle": "35", + "support_type": "tree(auto)" } diff --git a/resources/profiles/Snapmaker/process/0.36 Standard @Snapmaker U1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.36 Standard @Snapmaker U1 (0.6 nozzle).json index ddd97a76c3..44ea3bb3f4 100644 --- a/resources/profiles/Snapmaker/process/0.36 Standard @Snapmaker U1 (0.6 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.36 Standard @Snapmaker U1 (0.6 nozzle).json @@ -1,41 +1,32 @@ { - "type": "process", - "name": "0.36 Standard @Snapmaker U1 (0.6 nozzle)", - "inherits": "fdm_process_U1_0.6_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.36", - "initial_layer_print_height": "0.3", - "bridge_flow": "1", - "initial_layer_speed": "35", - "initial_layer_infill_speed": "55", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "bridge_speed": "30", - "overhang_3_4_speed": "15", - "setting_id": "C0PiCFd3P222knX9", - "description": "Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer height, and results in more apparent layer lines and lower printing quality, but shorter printing time in some printing cases.", - "elefant_foot_compensation": "0.15", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.6 nozzle)" - ], - "filter_out_gap_fill": "1", - "gap_fill_target": "topbottom", - "internal_bridge_speed": "100%", - "prime_tower_brim_width": "5", - "prime_tower_width": "30", - "prime_volume": "81", - "seam_gap": "15%", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_extra_spacing": "120%", - "wipe_tower_wall_type": "rib", - "enable_arc_fitting": "0", - "ooze_prevention": "1", - "precise_outer_wall": "0", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150", - "support_threshold_angle": "35", - "support_type": "tree(auto)" + "type": "process", + "name": "0.36 Standard @Snapmaker U1 (0.6 nozzle)", + "inherits": "fdm_process_U1_0.36_nozzle_0.6", + "from": "system", + "setting_id": "C0PiCFd3P222knX9", + "instantiation": "true", + "description": "Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer height, and results in more apparent layer lines and lower printing quality, but shorter printing time in some printing cases.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "81", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_threshold_angle": "35", + "support_type": "tree(auto)" } diff --git a/resources/profiles/Snapmaker/process/0.40 Extra Draft @Snapmaker U1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.40 Extra Draft @Snapmaker U1 (0.6 nozzle).json index 265c91eb35..37238fb0ea 100644 --- a/resources/profiles/Snapmaker/process/0.40 Extra Draft @Snapmaker U1 (0.6 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.40 Extra Draft @Snapmaker U1 (0.6 nozzle).json @@ -13,6 +13,8 @@ "Snapmaker U1 (0.6 nozzle)" ], "ooze_prevention": "1", + "prime_tower_width": "30", + "prime_volume": "90", "slowdown_for_curled_perimeters": "0", "standby_temperature_delta": "-150", "wipe_tower_filament": "0", diff --git a/resources/profiles/Snapmaker/process/0.40 Standard @Snapmaker U1 (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.40 Standard @Snapmaker U1 (0.8 nozzle).json index 24edfabf6d..8d00eb9fab 100644 --- a/resources/profiles/Snapmaker/process/0.40 Standard @Snapmaker U1 (0.8 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.40 Standard @Snapmaker U1 (0.8 nozzle).json @@ -1,45 +1,35 @@ { - "type": "process", - "name": "0.40 Standard @Snapmaker U1 (0.8 nozzle)", - "inherits": "fdm_process_U1_0.8_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.4", - "initial_layer_print_height": "0.4", - "bridge_flow": "0.8", - "top_surface_pattern": "monotonic", - "initial_layer_speed": "35", - "initial_layer_infill_speed": "55", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "bridge_speed": "30", - "overhang_3_4_speed": "25", - "overhang_4_4_speed": "5", - "setting_id": "VqkPgUtZi159BKpJ", - "description": "It has a very big layer height, and results in very apparent layer lines, low printing quality and general printing time.", - "elefant_foot_compensation": "0.15", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.8 nozzle)" - ], - "filter_out_gap_fill": "1", - "gap_fill_target": "topbottom", - "internal_bridge_speed": "100%", - "prime_tower_brim_width": "5", - "prime_tower_width": "30", - "prime_volume": "90", - "seam_gap": "15%", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_extra_spacing": "120%", - "wipe_tower_wall_type": "rib", - "bridge_density": "60%", - "enable_arc_fitting": "0", - "min_width_top_surface": "200%", - "ooze_prevention": "1", - "precise_outer_wall": "0", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150", - "support_threshold_angle": "40", - "support_type": "tree(auto)" + "type": "process", + "name": "0.40 Standard @Snapmaker U1 (0.8 nozzle)", + "inherits": "fdm_process_U1_0.40_nozzle_0.8", + "from": "system", + "setting_id": "VqkPgUtZi159BKpJ", + "instantiation": "true", + "description": "It has a very big layer height, and results in very apparent layer lines, low printing quality and general printing time.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "90", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "bridge_density": "60%", + "bridge_flow": "0.8", + "enable_arc_fitting": "0", + "min_width_top_surface": "200%", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_threshold_angle": "40", + "support_type": "tree(auto)" } diff --git a/resources/profiles/Snapmaker/process/0.42 Standard @Snapmaker U1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.42 Standard @Snapmaker U1 (0.6 nozzle).json index d65ba8e688..d3e4bf7f07 100644 --- a/resources/profiles/Snapmaker/process/0.42 Standard @Snapmaker U1 (0.6 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.42 Standard @Snapmaker U1 (0.6 nozzle).json @@ -1,41 +1,32 @@ { - "type": "process", - "name": "0.42 Standard @Snapmaker U1 (0.6 nozzle)", - "inherits": "fdm_process_U1_0.6_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.42", - "initial_layer_print_height": "0.3", - "bridge_flow": "1", - "initial_layer_speed": "35", - "initial_layer_infill_speed": "55", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "bridge_speed": "30", - "overhang_3_4_speed": "15", - "setting_id": "SVJzhQA3KQetRZmo", - "description": "Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer height, and results in much more apparent layer lines and much lower printing quality, but shorter printing time in some printing cases.", - "elefant_foot_compensation": "0.15", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.6 nozzle)" - ], - "filter_out_gap_fill": "1", - "gap_fill_target": "topbottom", - "internal_bridge_speed": "100%", - "precise_z_height": "0", - "prime_tower_brim_width": "5", - "prime_tower_width": "30", - "prime_volume": "95", - "seam_gap": "15%", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_extra_spacing": "120%", - "wipe_tower_wall_type": "rib", - "enable_arc_fitting": "0", - "ooze_prevention": "1", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150", - "support_threshold_angle": "35", - "support_type": "tree(auto)" + "type": "process", + "name": "0.42 Standard @Snapmaker U1 (0.6 nozzle)", + "inherits": "fdm_process_U1_0.42_nozzle_0.6", + "from": "system", + "setting_id": "SVJzhQA3KQetRZmo", + "instantiation": "true", + "description": "Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer height, and results in much more apparent layer lines and much lower printing quality, but shorter printing time in some printing cases.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "precise_z_height": "0", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "95", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_threshold_angle": "35", + "support_type": "tree(auto)" } diff --git a/resources/profiles/Snapmaker/process/0.48 Standard @Snapmaker U1 (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.48 Standard @Snapmaker U1 (0.8 nozzle).json index 08e054619e..d6cdf607dd 100644 --- a/resources/profiles/Snapmaker/process/0.48 Standard @Snapmaker U1 (0.8 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.48 Standard @Snapmaker U1 (0.8 nozzle).json @@ -1,43 +1,32 @@ { - "type": "process", - "name": "0.48 Standard @Snapmaker U1 (0.8 nozzle)", - "inherits": "fdm_process_U1_0.8_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.48", - "initial_layer_print_height": "0.4", - "bridge_flow": "1", - "top_surface_pattern": "monotonic", - "initial_layer_speed": "35", - "initial_layer_infill_speed": "55", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "bridge_speed": "30", - "overhang_3_4_speed": "25", - "overhang_4_4_speed": "5", - "setting_id": "5H6JWChFEo3zqoHQ", - "description": "Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer height, and results in very apparent layer lines and much lower printing quality, but shorter printing time in some printing cases.", - "elefant_foot_compensation": "0.15", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.8 nozzle)" - ], - "filter_out_gap_fill": "1", - "gap_fill_target": "topbottom", - "internal_bridge_speed": "100%", - "prime_tower_brim_width": "5", - "prime_tower_width": "30", - "prime_volume": "108", - "seam_gap": "15%", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_extra_spacing": "120%", - "wipe_tower_wall_type": "rib", - "enable_arc_fitting": "0", - "ooze_prevention": "1", - "precise_outer_wall": "0", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150", - "support_threshold_angle": "35", - "support_type": "tree(auto)" + "type": "process", + "name": "0.48 Standard @Snapmaker U1 (0.8 nozzle)", + "inherits": "fdm_process_U1_0.48_nozzle_0.8", + "from": "system", + "setting_id": "5H6JWChFEo3zqoHQ", + "instantiation": "true", + "description": "Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer height, and results in very apparent layer lines and much lower printing quality, but shorter printing time in some printing cases.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "108", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_threshold_angle": "35", + "support_type": "tree(auto)" } diff --git a/resources/profiles/Snapmaker/process/0.56 Standard @Snapmaker U1 (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.56 Standard @Snapmaker U1 (0.8 nozzle).json index 86b571d1f5..9f67114c20 100644 --- a/resources/profiles/Snapmaker/process/0.56 Standard @Snapmaker U1 (0.8 nozzle).json +++ b/resources/profiles/Snapmaker/process/0.56 Standard @Snapmaker U1 (0.8 nozzle).json @@ -1,41 +1,31 @@ { - "type": "process", - "name": "0.56 Standard @Snapmaker U1 (0.8 nozzle)", - "inherits": "fdm_process_U1_0.8_common", - "from": "system", - "instantiation": "true", - "layer_height": "0.56", - "initial_layer_print_height": "0.4", - "bridge_flow": "1", - "top_surface_pattern": "monotonic", - "initial_layer_speed": "35", - "initial_layer_infill_speed": "55", - "sparse_infill_speed": "100", - "top_surface_speed": "150", - "bridge_speed": "30", - "overhang_3_4_speed": "25", - "overhang_4_4_speed": "5", - "setting_id": "JZEIXOUT33c7MrZj", - "description": "Compared with the default profile of a 0.8 mm nozzle, it has a much bigger layer height, and results in extremely apparent layer lines and much lower printing quality, but much shorter printing time in some printing cases.", - "elefant_foot_compensation": "0.15", - "smooth_coefficient": "150", - "overhang_totally_speed": "50", - "compatible_printers": [ - "Snapmaker U1 (0.8 nozzle)" - ], - "filter_out_gap_fill": "1", - "gap_fill_target": "topbottom", - "prime_tower_brim_width": "5", - "prime_tower_width": "30", - "prime_volume": "126", - "wipe_tower_extra_rib_length": "8", - "wipe_tower_extra_spacing": "120%", - "wipe_tower_wall_type": "rib", - "enable_arc_fitting": "0", - "ooze_prevention": "1", - "precise_outer_wall": "0", - "slowdown_for_curled_perimeters": "0", - "standby_temperature_delta": "-150", - "support_threshold_angle": "35", - "support_type": "tree(auto)" + "type": "process", + "name": "0.56 Standard @Snapmaker U1 (0.8 nozzle)", + "inherits": "fdm_process_U1_0.56_nozzle_0.8", + "from": "system", + "setting_id": "JZEIXOUT33c7MrZj", + "instantiation": "true", + "description": "Compared with the default profile of a 0.8 mm nozzle, it has a much bigger layer height, and results in extremely apparent layer lines and much lower printing quality, but much shorter printing time in some printing cases.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "layer_height": "0.56", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "126", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "1", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_threshold_angle": "35", + "support_type": "tree(auto)" } diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1.json b/resources/profiles/Snapmaker/process/fdm_process_U1.json index 5d89a91866..72dab0c16b 100644 --- a/resources/profiles/Snapmaker/process/fdm_process_U1.json +++ b/resources/profiles/Snapmaker/process/fdm_process_U1.json @@ -33,7 +33,6 @@ "wall_loops": "2", "inner_wall_line_width": "0.45", "inner_wall_speed": "40", - "print_settings_id": "", "raft_layers": "0", "seam_position": "nearest", "skirt_distance": "2", diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_0.06_nozzle_0.2.json b/resources/profiles/Snapmaker/process/fdm_process_U1_0.06_nozzle_0.2.json new file mode 100644 index 0000000000..240fd4f425 --- /dev/null +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_0.06_nozzle_0.2.json @@ -0,0 +1,27 @@ +{ + "type": "process", + "name": "fdm_process_U1_0.06_nozzle_0.2", + "inherits": "fdm_process_U1_common", + "from": "system", + "instantiation": "false", + "layer_height": "0.06", + "initial_layer_print_height": "0.1", + "wall_loops": "4", + "bottom_shell_layers": "5", + "top_shell_layers": "7", + "bridge_flow": "1", + "line_width": "0.22", + "outer_wall_line_width": "0.22", + "initial_layer_line_width": "0.25", + "sparse_infill_line_width": "0.22", + "inner_wall_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "support_line_width": "0.22", + "top_surface_line_width": "0.22", + "initial_layer_speed": "40", + "initial_layer_infill_speed": "70", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "support_top_z_distance": "0.06", + "support_bottom_z_distance": "0.06" +} diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_0.08_nozzle_0.2.json b/resources/profiles/Snapmaker/process/fdm_process_U1_0.08_nozzle_0.2.json new file mode 100644 index 0000000000..41a824fa3a --- /dev/null +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_0.08_nozzle_0.2.json @@ -0,0 +1,27 @@ +{ + "type": "process", + "name": "fdm_process_U1_0.08_nozzle_0.2", + "inherits": "fdm_process_U1_common", + "from": "system", + "instantiation": "false", + "layer_height": "0.08", + "initial_layer_print_height": "0.1", + "wall_loops": "4", + "bottom_shell_layers": "5", + "top_shell_layers": "7", + "bridge_flow": "1", + "line_width": "0.22", + "outer_wall_line_width": "0.22", + "initial_layer_line_width": "0.25", + "sparse_infill_line_width": "0.22", + "inner_wall_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "support_line_width": "0.22", + "top_surface_line_width": "0.22", + "initial_layer_speed": "40", + "initial_layer_infill_speed": "70", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "support_top_z_distance": "0.08", + "support_bottom_z_distance": "0.08" +} diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_0.10_nozzle_0.2.json b/resources/profiles/Snapmaker/process/fdm_process_U1_0.10_nozzle_0.2.json new file mode 100644 index 0000000000..5ca58d7bd1 --- /dev/null +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_0.10_nozzle_0.2.json @@ -0,0 +1,27 @@ +{ + "type": "process", + "name": "fdm_process_U1_0.10_nozzle_0.2", + "inherits": "fdm_process_U1_common", + "from": "system", + "instantiation": "false", + "layer_height": "0.1", + "initial_layer_print_height": "0.1", + "wall_loops": "4", + "bottom_shell_layers": "5", + "top_shell_layers": "7", + "bridge_flow": "1", + "line_width": "0.22", + "outer_wall_line_width": "0.22", + "initial_layer_line_width": "0.25", + "sparse_infill_line_width": "0.22", + "inner_wall_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "support_line_width": "0.22", + "top_surface_line_width": "0.22", + "initial_layer_speed": "40", + "initial_layer_infill_speed": "70", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "support_top_z_distance": "0.1", + "support_bottom_z_distance": "0.1" +} diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_0.12_nozzle_0.2.json b/resources/profiles/Snapmaker/process/fdm_process_U1_0.12_nozzle_0.2.json new file mode 100644 index 0000000000..8c70dd9dee --- /dev/null +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_0.12_nozzle_0.2.json @@ -0,0 +1,27 @@ +{ + "type": "process", + "name": "fdm_process_U1_0.12_nozzle_0.2", + "inherits": "fdm_process_U1_common", + "from": "system", + "instantiation": "false", + "layer_height": "0.12", + "initial_layer_print_height": "0.1", + "wall_loops": "4", + "bottom_shell_layers": "5", + "top_shell_layers": "7", + "bridge_flow": "1", + "line_width": "0.22", + "outer_wall_line_width": "0.22", + "initial_layer_line_width": "0.25", + "sparse_infill_line_width": "0.22", + "inner_wall_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "support_line_width": "0.22", + "top_surface_line_width": "0.22", + "initial_layer_speed": "40", + "initial_layer_infill_speed": "70", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "support_top_z_distance": "0.12", + "support_bottom_z_distance": "0.12" +} diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_0.14_nozzle_0.2.json b/resources/profiles/Snapmaker/process/fdm_process_U1_0.14_nozzle_0.2.json new file mode 100644 index 0000000000..1ac42c9ffa --- /dev/null +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_0.14_nozzle_0.2.json @@ -0,0 +1,27 @@ +{ + "type": "process", + "name": "fdm_process_U1_0.14_nozzle_0.2", + "inherits": "fdm_process_U1_common", + "from": "system", + "instantiation": "false", + "layer_height": "0.14", + "initial_layer_print_height": "0.1", + "wall_loops": "4", + "bottom_shell_layers": "5", + "top_shell_layers": "7", + "bridge_flow": "1", + "line_width": "0.22", + "outer_wall_line_width": "0.22", + "initial_layer_line_width": "0.25", + "sparse_infill_line_width": "0.22", + "inner_wall_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "support_line_width": "0.22", + "top_surface_line_width": "0.22", + "initial_layer_speed": "40", + "initial_layer_infill_speed": "70", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "support_top_z_distance": "0.14", + "support_bottom_z_distance": "0.14" +} diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_0.18_nozzle_0.6.json b/resources/profiles/Snapmaker/process/fdm_process_U1_0.18_nozzle_0.6.json new file mode 100644 index 0000000000..f4725a73c7 --- /dev/null +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_0.18_nozzle_0.6.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "fdm_process_U1_0.18_nozzle_0.6", + "inherits": "fdm_process_U1_common", + "from": "system", + "instantiation": "false", + "layer_height": "0.18", + "initial_layer_print_height": "0.3", + "bridge_flow": "1", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.62", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "15", + "support_top_z_distance": "0.18", + "support_bottom_z_distance": "0.18" +} diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_0.24_nozzle_0.6.json b/resources/profiles/Snapmaker/process/fdm_process_U1_0.24_nozzle_0.6.json new file mode 100644 index 0000000000..a014a375b3 --- /dev/null +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_0.24_nozzle_0.6.json @@ -0,0 +1,24 @@ +{ + "type": "process", + "name": "fdm_process_U1_0.24_nozzle_0.6", + "inherits": "fdm_process_U1_common", + "from": "system", + "instantiation": "false", + "layer_height": "0.24", + "initial_layer_print_height": "0.3", + "bridge_flow": "1", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.62", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "15" +} diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_0.24_nozzle_0.8.json b/resources/profiles/Snapmaker/process/fdm_process_U1_0.24_nozzle_0.8.json new file mode 100644 index 0000000000..e958e9a2ee --- /dev/null +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_0.24_nozzle_0.8.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "fdm_process_U1_0.24_nozzle_0.8", + "inherits": "fdm_process_U1_common", + "from": "system", + "instantiation": "false", + "layer_height": "0.24", + "initial_layer_print_height": "0.4", + "bridge_flow": "1", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5" +} diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_0.30_nozzle_0.6.json b/resources/profiles/Snapmaker/process/fdm_process_U1_0.30_nozzle_0.6.json new file mode 100644 index 0000000000..a44a9ca05a --- /dev/null +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_0.30_nozzle_0.6.json @@ -0,0 +1,24 @@ +{ + "type": "process", + "name": "fdm_process_U1_0.30_nozzle_0.6", + "inherits": "fdm_process_U1_common", + "from": "system", + "instantiation": "false", + "layer_height": "0.3", + "initial_layer_print_height": "0.3", + "bridge_flow": "1", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.62", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "15" +} diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_0.32_nozzle_0.8.json b/resources/profiles/Snapmaker/process/fdm_process_U1_0.32_nozzle_0.8.json new file mode 100644 index 0000000000..67d9ecdb62 --- /dev/null +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_0.32_nozzle_0.8.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "fdm_process_U1_0.32_nozzle_0.8", + "inherits": "fdm_process_U1_common", + "from": "system", + "instantiation": "false", + "layer_height": "0.32", + "initial_layer_print_height": "0.4", + "bridge_flow": "1", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5" +} diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_0.36_nozzle_0.6.json b/resources/profiles/Snapmaker/process/fdm_process_U1_0.36_nozzle_0.6.json new file mode 100644 index 0000000000..314965b603 --- /dev/null +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_0.36_nozzle_0.6.json @@ -0,0 +1,24 @@ +{ + "type": "process", + "name": "fdm_process_U1_0.36_nozzle_0.6", + "inherits": "fdm_process_U1_common", + "from": "system", + "instantiation": "false", + "layer_height": "0.36", + "initial_layer_print_height": "0.3", + "bridge_flow": "1", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.62", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "15" +} diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_0.40_nozzle_0.8.json b/resources/profiles/Snapmaker/process/fdm_process_U1_0.40_nozzle_0.8.json new file mode 100644 index 0000000000..ec19b56fa5 --- /dev/null +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_0.40_nozzle_0.8.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "fdm_process_U1_0.40_nozzle_0.8", + "inherits": "fdm_process_U1_common", + "from": "system", + "instantiation": "false", + "layer_height": "0.4", + "initial_layer_print_height": "0.4", + "bridge_flow": "1", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5" +} diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_0.42_nozzle_0.6.json b/resources/profiles/Snapmaker/process/fdm_process_U1_0.42_nozzle_0.6.json new file mode 100644 index 0000000000..18c1e7d79b --- /dev/null +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_0.42_nozzle_0.6.json @@ -0,0 +1,24 @@ +{ + "type": "process", + "name": "fdm_process_U1_0.42_nozzle_0.6", + "inherits": "fdm_process_U1_common", + "from": "system", + "instantiation": "false", + "layer_height": "0.42", + "initial_layer_print_height": "0.3", + "bridge_flow": "1", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.62", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "15" +} diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_0.48_nozzle_0.8.json b/resources/profiles/Snapmaker/process/fdm_process_U1_0.48_nozzle_0.8.json new file mode 100644 index 0000000000..8d5632b790 --- /dev/null +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_0.48_nozzle_0.8.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "fdm_process_U1_0.48_nozzle_0.8", + "inherits": "fdm_process_U1_common", + "from": "system", + "instantiation": "false", + "layer_height": "0.48", + "initial_layer_print_height": "0.4", + "bridge_flow": "1", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5" +} diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_0.56_nozzle_0.8.json b/resources/profiles/Snapmaker/process/fdm_process_U1_0.56_nozzle_0.8.json new file mode 100644 index 0000000000..7a5c92932d --- /dev/null +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_0.56_nozzle_0.8.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "fdm_process_U1_0.56_nozzle_0.8", + "inherits": "fdm_process_U1_common", + "from": "system", + "instantiation": "false", + "layer_height": "0.56", + "initial_layer_print_height": "0.4", + "bridge_flow": "1", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5" +} diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_0.6_common.json b/resources/profiles/Snapmaker/process/fdm_process_U1_0.6_common.json index 93119a9370..40ea900ba2 100644 --- a/resources/profiles/Snapmaker/process/fdm_process_U1_0.6_common.json +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_0.6_common.json @@ -7,7 +7,7 @@ "line_width": "0.62", "outer_wall_line_width": "0.62", "inner_wall_line_width": "0.62", - "initial_layer_line_width": "0.72", + "initial_layer_line_width": "0.62", "sparse_infill_line_width": "0.62", "internal_solid_infill_line_width": "0.62", "support_line_width": "0.62", diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_common.json b/resources/profiles/Snapmaker/process/fdm_process_U1_common.json index 0af8c229a7..462ddb53ae 100644 --- a/resources/profiles/Snapmaker/process/fdm_process_U1_common.json +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_common.json @@ -13,8 +13,7 @@ "compatible_printers_condition": "", "draft_shield": "disabled", "elefant_foot_compensation": "0", - "enable_arc_fitting": "1", - "exclude_object": "1", + "enable_arc_fitting": "0", "outer_wall_acceleration": "5000", "wall_infill_order": "inner wall/outer wall/infill", "line_width": "0.42", @@ -46,7 +45,7 @@ "internal_solid_infill_speed": "150", "initial_layer_infill_speed": "60", "resolution": "0.012", - "support_type": "normal(auto)", + "support_type": "tree(auto)", "support_style": "default", "support_top_z_distance": "0.2", "support_bottom_z_distance": "0.2", @@ -68,11 +67,9 @@ "travel_speed": "500", "enable_prime_tower": "1", "wipe_tower_no_sparse_layers": "0", - "wipe_tower_cone_angle": "30", - "wipe_tower_wall_type": "rib", - "wipe_tower_extra_rib_length": "0", "prime_tower_width": "35", - "prime_volume": "30", "wall_generator": "arachne", - "compatible_printers": [] + "compatible_printers": [], + "wipe_tower_extra_rib_length": "8", + "exclude_object": "1" } diff --git a/resources/profiles/Snapmaker/process/fdm_process_a400.json b/resources/profiles/Snapmaker/process/fdm_process_a400.json index 39e7565f0b..f8ca481f9f 100644 --- a/resources/profiles/Snapmaker/process/fdm_process_a400.json +++ b/resources/profiles/Snapmaker/process/fdm_process_a400.json @@ -5,7 +5,7 @@ "from": "system", "instantiation": "false", "initial_layer_print_height": "0.2", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "initial_layer_infill_speed": "75", "outer_wall_speed": "100", "inner_wall_speed": "160", diff --git a/resources/profiles/Snapmaker/process/fdm_process_common.json b/resources/profiles/Snapmaker/process/fdm_process_common.json index 6fb4fa2de4..458a0f6162 100644 --- a/resources/profiles/Snapmaker/process/fdm_process_common.json +++ b/resources/profiles/Snapmaker/process/fdm_process_common.json @@ -110,7 +110,7 @@ "top_surface_jerk": "2", "travel_jerk": "4", "enable_support": "0", - "support_type": "normal(auto)", + "support_type": "tree(auto)", "support_style": "snug", "support_threshold_angle": "30", "support_on_build_plate_only": "1", diff --git a/resources/profiles/Snapmaker/process/fdm_process_idex.json b/resources/profiles/Snapmaker/process/fdm_process_idex.json index 7e04710bd3..6aeabfdaa7 100644 --- a/resources/profiles/Snapmaker/process/fdm_process_idex.json +++ b/resources/profiles/Snapmaker/process/fdm_process_idex.json @@ -5,7 +5,7 @@ "from": "system", "instantiation": "false", "initial_layer_print_height": "0.2", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "initial_layer_infill_speed": "75", "outer_wall_speed": "120", "inner_wall_speed": "250", diff --git a/resources/profiles/Voron/machine/fdm_klipper_common.json b/resources/profiles/Voron/machine/fdm_klipper_common.json index 4d40f3d168..b4ffd1a4bb 100644 --- a/resources/profiles/Voron/machine/fdm_klipper_common.json +++ b/resources/profiles/Voron/machine/fdm_klipper_common.json @@ -116,7 +116,7 @@ "deretraction_speed": [ "30" ], - "z_hop_types": "Normal Lift", + "z_hop_types": "Slope Lift", "silent_mode": "0", "single_extruder_multi_material": "1", "change_filament_gcode": "", diff --git a/src/libslic3r/Extruder.cpp b/src/libslic3r/Extruder.cpp index 1e250b707e..b1b6ca347a 100644 --- a/src/libslic3r/Extruder.cpp +++ b/src/libslic3r/Extruder.cpp @@ -220,12 +220,12 @@ double Extruder::retract_restart_extra() const double Extruder::retract_length_toolchange() const { - return m_config->retract_length_toolchange.get_at(extruder_id()); + return m_config->retract_length_toolchange.get_at(m_config_index); } double Extruder::retract_restart_extra_toolchange() const { - return m_config->retract_restart_extra_toolchange.get_at(extruder_id()); + return m_config->retract_restart_extra_toolchange.get_at(m_config_index); } double Extruder::travel_slope() const diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index ff2384a0a4..babe018651 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1137,8 +1137,8 @@ static std::vector get_path_of_change_filament(const Print& print) float old_retract_length = (old_filament_id != -1) ? full_config.retraction_length.get_at(old_fi) : 0; float new_retract_length = full_config.retraction_length.get_at(new_fi); - float old_retract_length_toolchange = (old_filament_id != -1) ? full_config.retract_length_toolchange.get_at(old_filament_id) : 0; - float new_retract_length_toolchange = full_config.retract_length_toolchange.get_at(new_filament_id); + float old_retract_length_toolchange = (old_filament_id != -1) ? full_config.retract_length_toolchange.get_at(old_fi) : 0; + float new_retract_length_toolchange = full_config.retract_length_toolchange.get_at(new_fi); int old_filament_temp = (old_filament_id != -1) ? (gcodegen.on_first_layer()? full_config.nozzle_temperature_initial_layer.get_at(old_fi) : full_config.nozzle_temperature.get_at(old_fi)) : 210; int new_filament_temp = gcodegen.on_first_layer() ? full_config.nozzle_temperature_initial_layer.get_at(new_fi) : full_config.nozzle_temperature.get_at(new_fi); Vec3d nozzle_pos = gcode_writer.get_position(); @@ -9038,7 +9038,7 @@ std::string GCode::set_extruder(unsigned int new_filament_id, double print_z, bo // per-layer nozzle grouping; resolve the column instead of indexing by the filament id. size_t new_fi = get_filament_config_index((int)new_filament_id); float new_retract_length = m_config.retraction_length.get_at(new_fi); - float new_retract_length_toolchange = m_config.retract_length_toolchange.get_at(new_filament_id); + float new_retract_length_toolchange = m_config.retract_length_toolchange.get_at(new_fi); int new_filament_temp = this->on_first_layer() ? m_config.nozzle_temperature_initial_layer.get_at(new_fi) : m_config.nozzle_temperature.get_at(new_fi); // BBS: if print_z == 0 use first layer temperature if (abs(print_z) < EPSILON) @@ -9069,7 +9069,7 @@ std::string GCode::set_extruder(unsigned int new_filament_id, double print_z, bo // gap-filled carry-forward, so its current-layer column matches the nozzle it occupies. size_t old_fi = get_filament_config_index(old_filament_id); old_retract_length = m_config.retraction_length.get_at(old_fi); - old_retract_length_toolchange = m_config.retract_length_toolchange.get_at(old_filament_id); + old_retract_length_toolchange = m_config.retract_length_toolchange.get_at(old_fi); old_filament_temp = this->on_first_layer()? m_config.nozzle_temperature_initial_layer.get_at(old_fi) : m_config.nozzle_temperature.get_at(old_fi); //During the filament change, the extruder will extrude an extra length of grab_length for the corresponding detection, so the purge can reduce this length. diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 2e33a36c83..47d448b69b 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -1351,6 +1351,8 @@ static std::vector s_Preset_filament_options {/*"filament_colour", "filament_retraction_length", "filament_retraction_minimum_travel", "filament_retraction_speed", + "filament_retract_length_toolchange", + "filament_retract_restart_extra_toolchange", "filament_wipe", "filament_z_hop", "filament_z_hop_types", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index ada05c4e9f..849b0754dc 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -72,6 +72,8 @@ const std::vector filament_extruder_override_keys = { "filament_deretraction_speed", "filament_retract_restart_extra", //not in filament_options_with_variant, added on 20250816 "filament_retraction_minimum_travel", + "filament_retract_length_toolchange", + "filament_retract_restart_extra_toolchange", // BBS: floats "filament_wipe_distance", // bools @@ -5734,12 +5736,10 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionFloatsNullable{10}); def = this->add("retract_length_toolchange", coFloats); - def->label = L("Length"); - //def->full_label = L("Retraction Length (Toolchange)"); - def->full_label = "Retraction Length (Toolchange)"; - //def->tooltip = L("When retraction is triggered before changing tool, filament is pulled back " - // "by the specified amount (the length is measured on raw filament, before it enters " - // "the extruder)."); + def->label = L("Retraction Length (Toolchange)"); + def->tooltip = L("When retraction is triggered before changing tool, filament is pulled back " + "by the specified amount (the length is measured on raw filament, before it enters " + "the extruder)."); def->sidetext = L("mm"); // millimeters, CIS languages need translation def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloats { 10. }); @@ -5993,7 +5993,7 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionFloats { 0. }); def = this->add("retract_restart_extra_toolchange", coFloats); - def->label = L("Extra length on restart"); + def->label = L("Extra length on restart (Toolchange)"); def->tooltip = L("When the retraction is compensated after changing tool, the extruder will push " "this additional amount of filament."); def->sidetext = L("mm"); // millimeters, CIS languages need translation @@ -8163,10 +8163,12 @@ void PrintConfigDef::init_extruder_option_keys() "long_retractions_when_cut", "retract_after_wipe", "retract_before_wipe", + "retract_length_toolchange", "retract_lift_above", "retract_lift_below", "retract_lift_enforce", "retract_restart_extra", + "retract_restart_extra_toolchange", "retract_when_changing_layer", "retraction_distances_when_cut", "retraction_length", @@ -9254,6 +9256,8 @@ std::set filament_options_with_variant = { "filament_retract_lift_below", "filament_retract_lift_enforce", "filament_retract_restart_extra", + "filament_retract_length_toolchange", + "filament_retract_restart_extra_toolchange", "filament_retraction_speed", "filament_deretraction_speed", "filament_retraction_minimum_travel", diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 0c38977c74..4bd963b098 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -4006,13 +4006,12 @@ void TabFilament::add_filament_overrides_page() const int extruder_idx = 0; // #ys_FIXME - ConfigOptionsGroupShp retraction_optgroup = page->new_optgroup(L("Retraction"), L"param_retraction"); - auto append_retraction_option = [this, retraction_optgroup](const std::string& opt_key, int opt_index) + auto append_retraction_option = [this](ConfigOptionsGroupShp optgroup, const std::string& opt_key, int opt_index) { Line line {"",""}; - line = retraction_optgroup->create_single_option_line(retraction_optgroup->get_option(opt_key, opt_index)); + line = optgroup->create_single_option_line(optgroup->get_option(opt_key, opt_index)); - line.near_label_widget = [this, optgroup_wk = ConfigOptionsGroupWkp(retraction_optgroup), opt_key, opt_index](wxWindow* parent) { + line.near_label_widget = [this, optgroup_wk = ConfigOptionsGroupWkp(optgroup), opt_key, opt_index](wxWindow* parent) { auto check_box = new ::CheckBox(parent); // ORCA modernize checkboxes check_box->Bind(wxEVT_TOGGLEBUTTON, [this, optgroup_wk, opt_key, opt_index](wxCommandEvent& evt) { const bool is_checked = evt.IsChecked(); @@ -4039,9 +4038,10 @@ void TabFilament::add_filament_overrides_page() return check_box; }; - retraction_optgroup->append_line(line); + optgroup->append_line(line); }; + ConfigOptionsGroupShp retraction_optgroup = page->new_optgroup(L("Retraction"), L"param_retraction"); for (const std::string opt_key : { "filament_retraction_length", "filament_z_hop", "filament_z_hop_types", @@ -4065,7 +4065,13 @@ void TabFilament::add_filament_overrides_page() //SoftFever // "filament_seam_gap" }) - append_retraction_option(opt_key, extruder_idx); + append_retraction_option(retraction_optgroup, opt_key, extruder_idx); + + ConfigOptionsGroupShp toolchange_optgroup = page->new_optgroup(L("Retraction when switching material"), L"param_retraction_material_change"); + for (const std::string opt_key : { "filament_retract_length_toolchange", + "filament_retract_restart_extra_toolchange" + }) + append_retraction_option(toolchange_optgroup, opt_key, extruder_idx); ConfigOptionsGroupShp ironing_optgroup = page->new_optgroup(L("Ironing"), L"param_ironing"); auto append_ironing_option = [this, ironing_optgroup](const std::string& opt_key, int opt_index) @@ -4180,6 +4186,8 @@ void TabFilament::update_filament_overrides_page(const DynamicPrintConfig* print "filament_retraction_speed", "filament_deretraction_speed", "filament_retract_restart_extra", + "filament_retract_length_toolchange", + "filament_retract_restart_extra_toolchange", "filament_retraction_minimum_travel", "filament_retract_when_changing_layer", "filament_wipe", @@ -4210,7 +4218,8 @@ void TabFilament::update_filament_overrides_page(const DynamicPrintConfig* print is_checked &= !dynamic_cast(m_config->option(opt_key))->is_nil(extruder_idx); m_overrides_options[opt_key]->SetValue(is_checked); - Field* field = optgroup->get_fieldc(opt_key, 0); + // the toolchange overrides live in their own optgroup, so search the whole page + Field* field = page->get_field(opt_key, 0); if (field == nullptr) continue; if (opt_key == "filament_long_retractions_when_cut") { From 596cbb8b2da5199ff1f897344a16fd96f4006036 Mon Sep 17 00:00:00 2001 From: Ian Chua Date: Wed, 5 Aug 2026 11:39:37 +0800 Subject: [PATCH 061/106] Keep printer-agent error codes available to UI workflow --- src/slic3r/Utils/IPrinterAgent.hpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/slic3r/Utils/IPrinterAgent.hpp b/src/slic3r/Utils/IPrinterAgent.hpp index 91d271316e..0fa3616344 100644 --- a/src/slic3r/Utils/IPrinterAgent.hpp +++ b/src/slic3r/Utils/IPrinterAgent.hpp @@ -2,6 +2,13 @@ #define __I_PRINTER_AGENT_HPP__ #include "bambu_networking.hpp" +// why: these extend the BAMBU_NETWORK_* return space rather than opening a new one - the value +// flows through the same int domain callers already compare against BAMBU_NETWORK_SUCCESS. +// They live here and not in bambu_networking.hpp because that file is a vendor header replaced +// wholesale by header-sync commits (see c09252ce11), which would silently clobber them. +// -70xx is free: the vendor occupies -1..-25 and -10xx through -60xx. +#define ORCA_NETWORK_ERR_CMD_NOT_SUPPORTED -7010 // no translation exists for this command +#define ORCA_NETWORK_ERR_CAP_NOT_AVAILABLE -7020 // a translation exists; this printer lacks the capability #include #include From 32f82b64e7da1d038d421fd28bd86b8f436c6fd8 Mon Sep 17 00:00:00 2001 From: Ian Chua Date: Wed, 5 Aug 2026 13:07:32 +0800 Subject: [PATCH 062/106] fix: enable both device tabs --- src/slic3r/GUI/MainFrame.cpp | 83 +++++++++++++++++++++++++++++++++++- src/slic3r/GUI/MainFrame.hpp | 4 +- src/slic3r/GUI/Plater.cpp | 7 +-- 3 files changed, 87 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 39082a9dca..5ef81a32e1 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -1368,9 +1368,88 @@ void MainFrame::init_tabpanel() { } // SoftFever -void MainFrame::show_device(bool bBBLPrinter) { +void MainFrame::show_device(bool should_use_native) { auto idx = -1; - if (bBBLPrinter) { + + const bool use_printer_agents = wxGetApp().app_config->get_bool("use_printer_agents"); + + // The legacy page is appended when printer agents are enabled. Remove that + // extra page before switching back to the normal native/legacy layout. + if (!use_printer_agents) { + if ((idx = m_tabpanel->FindPage(m_printer_view)) != wxNOT_FOUND && idx != tpMonitor) { + m_printer_view->Show(false); + m_tabpanel->RemovePage(idx); + } + } + + if (use_printer_agents) { + if (!m_monitor) { + m_monitor = new MonitorPanel(m_tabpanel, wxID_ANY, wxDefaultPosition, wxDefaultSize); + m_monitor->SetBackgroundColour(*wxWHITE); + } + + if (m_tabpanel->FindPage(m_monitor) == wxNOT_FOUND) { + if ((idx = m_tabpanel->FindPage(m_printer_view)) != wxNOT_FOUND) { + m_printer_view->Show(false); + m_tabpanel->RemovePage(idx); + } + m_monitor->Show(false); + m_tabpanel->InsertPage(tpMonitor, m_monitor, _L("Device"), std::string("tab_monitor_active"), + std::string("tab_monitor_active")); + } + + if (m_printer_view == nullptr) { + m_printer_view = new PrinterWebView(m_tabpanel); + Bind(EVT_LOAD_PRINTER_URL, [this](LoadPrinterViewEvent& evt) { + wxString url = evt.GetString(); + wxString key = evt.GetAPIkey(); + // select_tab(MainFrame::tpMonitor); + m_printer_view->load_url(url, key); + }); + } + + if (wxGetApp().is_enable_multi_machine()) { + if (!m_multi_machine) { + m_multi_machine = new MultiMachinePage(m_tabpanel, wxID_ANY, wxDefaultPosition, wxDefaultSize); + m_multi_machine->SetBackgroundColour(*wxWHITE); + } + // TODO: change the bitmap + if (m_tabpanel->FindPage(m_multi_machine) == wxNOT_FOUND) { + m_multi_machine->Show(false); + m_tabpanel->InsertPage(tpMultiDevice, m_multi_machine, _L("Multi-device"), std::string("tab_multi_active"), + std::string("tab_multi_active"), false); + } + } + if (!m_calibration) { + m_calibration = new CalibrationPanel(m_tabpanel, wxID_ANY, wxDefaultPosition, wxDefaultSize); + m_calibration->SetBackgroundColour(*wxWHITE); + } + // Calibration is always the last page, so don't use InsertPage here. Otherwise, if multi_machine page is not enabled, + // the calibration tab won't be properly added as well, due to the TabPosition::tpCalibration no longer matches the real tab position. + if (m_tabpanel->FindPage(m_calibration) == wxNOT_FOUND) { + m_calibration->Show(false); + m_tabpanel->AddPage(m_calibration, _L("Calibration"), std::string("tab_calibration_active"), + std::string("tab_calibration_active"), false); + } + + if ((idx = m_tabpanel->FindPage(m_printer_view)) == wxNOT_FOUND) { + m_printer_view->Show(false); + m_tabpanel->AddPage(m_printer_view, _L("Device (legacy)"), std::string("tab_monitor_active"), + std::string("tab_monitor_active"), false); + } else { + m_tabpanel->SetPageText(idx, _L("Device (legacy)")); + } + +#ifdef _MSW_DARK_MODE + wxGetApp().UpdateDarkUIWin(this); +#endif // _MSW_DARK_MODE + + fit_tab_labels(); // ORCA on printer change + + return; + } + + if (should_use_native) { if (m_tabpanel->FindPage(m_monitor) != wxNOT_FOUND) { fit_tab_labels(); // ORCA on printer change - same button layout return; diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index 20229a611e..a614783c31 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -358,7 +358,7 @@ public: void RunScript(wxString js); //SoftFever - void show_device(bool bBBLPrinter); + void show_device(bool should_use_native); void fit_tab_labels(); // ORCA PA_Calibration_Dlg* m_pa_calib_dlg{ nullptr }; @@ -385,7 +385,7 @@ public: CalibrationPanel* m_calibration{ nullptr }; WebViewPanel* m_webview { nullptr }; PrinterWebView* m_printer_view{nullptr}; - wxLogWindow* m_log_window { nullptr }; + wxLogWindow* m_log_window { nullptr }; // BBS //wxBookCtrlBase* m_tabpanel { nullptr }; Notebook* m_tabpanel{ nullptr }; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index d83ddded34..3ee09fed06 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3246,7 +3246,8 @@ void Sidebar::update_all_preset_comboboxes() auto p_mainframe = wxGetApp().mainframe; auto cfg = preset_bundle.printers.get_edited_preset().config; - const bool use_native_device_tab = preset_bundle.use_bbl_device_tab() || wxGetApp().app_config->get_bool("use_printer_agents"); + const bool use_printer_agents = wxGetApp().app_config->get_bool("use_printer_agents"); + const bool use_native_device_tab = preset_bundle.use_bbl_device_tab() || use_printer_agents; if (preset_bundle.use_bbl_network()) { //only show connection button for not-BBL printer @@ -3259,7 +3260,7 @@ void Sidebar::update_all_preset_comboboxes() } else { //p->btn_connect_printer->Show(); // ORCA: hide the physical-printer connection button when printer agents are enabled - p->m_printer_connect->Show(!wxGetApp().app_config->get_bool("use_printer_agents")); + p->m_printer_connect->Show(!use_printer_agents); // ORCA: show/hide sync-ams button based on filament sync mode auto agent = wxGetApp().getAgent(); @@ -3286,7 +3287,7 @@ void Sidebar::update_all_preset_comboboxes() : MainFrame::PrintSelectType::eSendGcode; } - if (!use_native_device_tab) + if (!use_native_device_tab || use_printer_agents) p_mainframe->load_printer_url(url, apikey); From 38cb1ae8d10031f5ac377236bb546017606f47ae Mon Sep 17 00:00:00 2001 From: Ian Chua Date: Wed, 5 Aug 2026 13:40:05 +0800 Subject: [PATCH 063/106] Add developer flag for printer agents (#15110) --- src/libslic3r/AppConfig.cpp | 6 ++++++ src/slic3r/GUI/Preferences.cpp | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 159d9bbeda..1b170bf884 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -626,6 +626,12 @@ void AppConfig::set_defaults() set_bool("window_buttons_on_left", false); #endif + if (get("use_printer_agents").empty()) + { + // false = legacy behavior using print hosts + set_bool("use_printer_agents", false); + } + // Remove legacy window positions/sizes erase("app", "main_frame_maximized"); erase("app", "main_frame_pos"); diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index 6bcc00848b..1a3c6fd26a 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -2101,6 +2101,12 @@ void PreferencesDialog::create_items() auto item_show_unsupported = create_item_checkbox(_L("Show unsupported presets"), _L("Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."), "show_unsupported_presets"); g_sizer->Add(item_show_unsupported); + auto item_plugin_printer_agents = create_item_checkbox( + _L("(Experimental) Use printer agents instead of print hosts"), _L( + "Route print jobs for non-Bambu printers through printer plug-in agents instead of the classic print-host upload flow.\nWhen disabled, OrcaSlicer uses the legacy print-host behavior."), + "use_printer_agents"); + g_sizer->Add(item_plugin_printer_agents); + //// DEVELOPER > Experimental Features g_sizer->Add(create_item_title(_L("Experimental Features")), 1, wxEXPAND); From 38f5c84e7fcaf32496c692a0392d6b0e7aa54151 Mon Sep 17 00:00:00 2001 From: Ian Chua Date: Wed, 5 Aug 2026 16:20:58 +0800 Subject: [PATCH 064/106] fix: regression error --- src/slic3r/GUI/DeviceCore/DevManager.cpp | 41 +++++++++++++++++------- src/slic3r/GUI/DeviceCore/DevManager.h | 3 ++ 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/slic3r/GUI/DeviceCore/DevManager.cpp b/src/slic3r/GUI/DeviceCore/DevManager.cpp index 3c664facfd..d13f8b7215 100644 --- a/src/slic3r/GUI/DeviceCore/DevManager.cpp +++ b/src/slic3r/GUI/DeviceCore/DevManager.cpp @@ -611,6 +611,7 @@ namespace Slic3r } selected_machine = dev_id; + record_user_last_machine(selected_machine); return true; } @@ -875,20 +876,38 @@ namespace Slic3r } } + void DeviceManager::record_user_last_machine(const std::string& dev_id) + { + if (Slic3r::GUI::wxGetApp().app_config) { + Slic3r::GUI::wxGetApp().app_config->set("user_last_selected_machine", dev_id); + } + } + + std::string DeviceManager::get_user_last_machine() const + { + if (Slic3r::GUI::wxGetApp().app_config) { + const auto& user_last_machine = Slic3r::GUI::wxGetApp().app_config->get("user_last_selected_machine"); + if (!user_last_machine.empty()) { + return user_last_machine; + } else if (m_agent) { + return m_agent->get_user_selected_machine(); + } + } + + return ""; + } + void DeviceManager::load_last_machine() { - // Get all available machines, include cloud machines and lan machines that have access right - auto all_machines = get_my_machine_list(); - if (all_machines.empty()) + // Only reconnect the remembered cloud machine. Do not select an arbitrary + // first machine: agent swaps intentionally leave the selection empty until + // the new agent explicitly selects its configured printer. + if (userMachineList.empty()) return; - - // Reconnect the machine the user last selected, if it's still available. - // why: no first-available fallback - auto-connecting an arbitrary machine - // fights the agent-swap reset, which intentionally leaves nothing selected. - const std::string last_monitor_machine = m_agent ? m_agent->get_user_selected_machine() : ""; - const auto last_machine = all_machines.find(last_monitor_machine); - if (last_machine != all_machines.end()) - this->set_selected_machine(last_machine->second->get_dev_id()); + + const auto& last_monitor_machine = get_user_last_machine(); + if (userMachineList.find(last_monitor_machine) != userMachineList.end()) + set_selected_machine(last_monitor_machine); } void DeviceManager::OnMachineBindStateChanged(MachineObject* obj, const std::string& new_state) diff --git a/src/slic3r/GUI/DeviceCore/DevManager.h b/src/slic3r/GUI/DeviceCore/DevManager.h index 70bee613a8..e3ac0064b9 100644 --- a/src/slic3r/GUI/DeviceCore/DevManager.h +++ b/src/slic3r/GUI/DeviceCore/DevManager.h @@ -52,6 +52,9 @@ public: // swap path can reuse it instead of duplicating the two sidebar calls. void OnSelectedMachineLost(); + void record_user_last_machine(const std::string& dev_id); + std::string get_user_last_machine() const; + // local machine void set_local_selected_machine(std::string dev_id) { local_selected_machine = dev_id; }; MachineObject* get_local_selected_machine() const { return get_local_machine(local_selected_machine); } From 4e1caa39eb6d7e6ac7353cc7238d505b003cda42 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Wed, 5 Aug 2026 01:21:32 +0800 Subject: [PATCH 065/106] Flush the wipe tower planner queue with M400 on Klipper The wipe tower emitted G4 S0 to make the firmware finish its queued moves before commands that must not take effect early. Klipper's G4 reads only the P parameter, so that flush never happened there and a temperature change could land seconds ahead of the moves it was meant to follow. Klipper now gets M400 instead, through one helper shared by both wipe tower implementations. No change to any other firmware flavor's output, so no shipped profile or saved project is affected. --- src/libslic3r/GCode/WipeTower.cpp | 7 ++++++- src/libslic3r/GCode/WipeTower.hpp | 8 ++++++++ src/libslic3r/GCode/WipeTower2.cpp | 9 +++++---- tests/fff_print/CMakeLists.txt | 1 + tests/fff_print/test_wipe_tower.cpp | 27 +++++++++++++++++++++++++++ 5 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 tests/fff_print/test_wipe_tower.cpp diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index 3d7353eadf..cfa407ea73 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -617,6 +617,11 @@ Polygon generate_rectange_polygon(const Vec2f &wt_box_min ,const Vec2f & wt_box_ return res; } +const char* flush_planner_queue_command(GCodeFlavor flavor) +{ + return flavor == gcfKlipper ? "M400\n" : "G4 S0\n"; +} + class WipeTowerWriter { public: @@ -1190,7 +1195,7 @@ public: WipeTowerWriter& flush_planner_queue() { - m_gcode += "G4 S0\n"; + m_gcode += flush_planner_queue_command(m_gcode_flavor); return *this; } diff --git a/src/libslic3r/GCode/WipeTower.hpp b/src/libslic3r/GCode/WipeTower.hpp index 66e8acf1c4..a083da1fb2 100644 --- a/src/libslic3r/GCode/WipeTower.hpp +++ b/src/libslic3r/GCode/WipeTower.hpp @@ -26,6 +26,14 @@ enum GCodeFlavor : unsigned char; Polylines construct_gap_for_skip_points( const Polygon& polygon, const std::vector& skip_points, float wt_width, float gap_length, Polygon& insert_skip_polygon); +// Returns the command that makes the firmware finish its queued moves, so a command or +// custom-G-code boundary right after (resetting the extruder position, entering +// [change_filament_gcode] / [filament_start_gcode]) is not reached early. Klipper acts on +// such commands the moment it parses them, and its G4 reads only P, so the zero dwell the +// other flavors use synchronizes nothing there — M400 does. Defined in WipeTower.cpp, shared +// by WipeTower and WipeTower2. +const char* flush_planner_queue_command(GCodeFlavor flavor); + class WipeTower { public: diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index 51ab155dd9..5dc78d4785 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -386,7 +386,8 @@ public: } WipeTowerWriter2& switch_filament_monitoring(bool enable) { - m_gcode += std::string("G4 S0\n") + "M591 " + (enable ? "R" : "S0") + "\n"; + m_gcode += flush_planner_queue_command(m_gcode_flavor); + m_gcode += std::string("M591 ") + (enable ? "R" : "S0") + "\n"; return *this; } @@ -625,7 +626,7 @@ public: // Set extruder temperature, don't wait by default. WipeTowerWriter2& set_extruder_temp(int temperature, bool wait = false) { - m_gcode += "G4 S0\n"; // to flush planner queue + m_gcode += flush_planner_queue_command(m_gcode_flavor); m_gcode += "M" + std::to_string(wait ? 109 : 104) + " S" + std::to_string(temperature) + "\n"; return *this; } @@ -677,8 +678,8 @@ public: } WipeTowerWriter2& flush_planner_queue() - { - m_gcode += "G4 S0\n"; + { + m_gcode += flush_planner_queue_command(m_gcode_flavor); return *this; } diff --git a/tests/fff_print/CMakeLists.txt b/tests/fff_print/CMakeLists.txt index 70ab639faa..08f86de8a7 100644 --- a/tests/fff_print/CMakeLists.txt +++ b/tests/fff_print/CMakeLists.txt @@ -18,6 +18,7 @@ add_executable(${_TEST_NAME}_tests test_slicing_pipeline_hook.cpp test_support_material.cpp test_trianglemesh.cpp + test_wipe_tower.cpp ) target_link_libraries(${_TEST_NAME}_tests test_common libslic3r Catch2::Catch2WithMain) set_property(TARGET ${_TEST_NAME}_tests PROPERTY FOLDER "tests") diff --git a/tests/fff_print/test_wipe_tower.cpp b/tests/fff_print/test_wipe_tower.cpp new file mode 100644 index 0000000000..de5836ba7a --- /dev/null +++ b/tests/fff_print/test_wipe_tower.cpp @@ -0,0 +1,27 @@ +#include + +#include + +#include "libslic3r/GCode/WipeTower.hpp" +#include "libslic3r/PrintConfig.hpp" + +using namespace Slic3r; + +// The wipe tower flushes the firmware's motion queue before a command or custom-G-code +// boundary that must not be reached early (an extruder-position reset, entering custom +// G-code). Klipper acts on those the moment it parses them, and its G4 reads only P, so the +// zero dwell every other flavor uses is not a flush there. +TEST_CASE("Klipper flushes the wipe tower planner queue with M400", "[WipeTower]") +{ + CHECK(std::string(flush_planner_queue_command(gcfKlipper)) == "M400\n"); +} + +TEST_CASE("Other flavors flush the wipe tower planner queue with a zero dwell", "[WipeTower]") +{ + const GCodeFlavor flavor = GENERATE(gcfMarlinLegacy, gcfRepRapFirmware, gcfRepetier, + gcfMarlinFirmware, gcfRepRapSprinter, gcfTeacup, + gcfMakerWare, gcfSailfish, gcfMach3, gcfMachinekit, + gcfSmoothie, gcfNoExtrusion); + INFO("gcode flavor enum value: " << int(flavor)); + CHECK(std::string(flush_planner_queue_command(flavor)) == "G4 S0\n"); +} From 194ef34080f77d2b14f964279704483c898e15ee Mon Sep 17 00:00:00 2001 From: SoftFever Date: Wed, 5 Aug 2026 17:09:49 +0800 Subject: [PATCH 066/106] Wait in the wipe tower with a millisecond dwell on Klipper The wipe tower's "Delay after unloading" never happened on Klipper. It was emitted as G4 S, and Klipper's G4 reads only the P parameter, in milliseconds, so the pause was silently skipped. The option now produces a dwell Klipper actually performs. Also corrects the planner flush rationale, which cited an extruder position reset that Klipper resolves at parse time and does not need synchronized, and adds end-to-end coverage that slices a two-filament print and checks the emitted wipe tower G-code on both a Klipper and a non-Klipper flavor. No change to any other firmware flavor's output, and no shipped profile sets a non-zero delay, so no shipped profile's output moves either. --- src/libslic3r/GCode/WipeTower.cpp | 9 ++- src/libslic3r/GCode/WipeTower.hpp | 15 ++-- src/libslic3r/GCode/WipeTower2.cpp | 2 +- tests/fff_print/test_wipe_tower.cpp | 111 +++++++++++++++++++++++++++- 4 files changed, 125 insertions(+), 12 deletions(-) diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index cfa407ea73..35d99498eb 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -622,6 +622,13 @@ const char* flush_planner_queue_command(GCodeFlavor flavor) return flavor == gcfKlipper ? "M400\n" : "G4 S0\n"; } +std::string wait_command(GCodeFlavor flavor, float seconds) +{ + if (flavor == gcfKlipper) + return "G4 P" + std::to_string(std::lround(seconds * 1000.f)) + "\n"; + return "G4 S" + Slic3r::float_to_string_decimal_point(seconds, 3) + "\n"; +} + class WipeTowerWriter { public: @@ -1150,7 +1157,7 @@ public: { if (time==0.f) return *this; - m_gcode += "G4 S" + Slic3r::float_to_string_decimal_point(time, 3) + "\n"; + m_gcode += wait_command(m_gcode_flavor, time); return *this; } diff --git a/src/libslic3r/GCode/WipeTower.hpp b/src/libslic3r/GCode/WipeTower.hpp index a083da1fb2..e6493378d6 100644 --- a/src/libslic3r/GCode/WipeTower.hpp +++ b/src/libslic3r/GCode/WipeTower.hpp @@ -26,14 +26,17 @@ enum GCodeFlavor : unsigned char; Polylines construct_gap_for_skip_points( const Polygon& polygon, const std::vector& skip_points, float wt_width, float gap_length, Polygon& insert_skip_polygon); -// Returns the command that makes the firmware finish its queued moves, so a command or -// custom-G-code boundary right after (resetting the extruder position, entering -// [change_filament_gcode] / [filament_start_gcode]) is not reached early. Klipper acts on -// such commands the moment it parses them, and its G4 reads only P, so the zero dwell the -// other flavors use synchronizes nothing there — M400 does. Defined in WipeTower.cpp, shared -// by WipeTower and WipeTower2. +// Returns the command that makes the firmware finish its queued moves around an M104/M109 +// or custom-G-code boundary. Klipper acts on commands the instant it parses them, and its G4 +// reads only P, so the zero dwell other flavors use synchronizes nothing there — M400 does. +// Defined in WipeTower.cpp, shared by WipeTower and WipeTower2. const char* flush_planner_queue_command(GCodeFlavor flavor); +// Returns the command that pauses for `seconds`. Klipper's G4 reads only P, in +// milliseconds, and ignores S, so the seconds form the other flavors use would dwell zero +// there. Defined in WipeTower.cpp, shared by WipeTower and WipeTower2. +std::string wait_command(GCodeFlavor flavor, float seconds); + class WipeTower { public: diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index 5dc78d4785..d2abf0a155 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -636,7 +636,7 @@ public: { if (time==0.f) return *this; - m_gcode += "G4 S" + Slic3r::float_to_string_decimal_point(time, 3) + "\n"; + m_gcode += wait_command(m_gcode_flavor, time); return *this; } diff --git a/tests/fff_print/test_wipe_tower.cpp b/tests/fff_print/test_wipe_tower.cpp index de5836ba7a..4ea11f7a2a 100644 --- a/tests/fff_print/test_wipe_tower.cpp +++ b/tests/fff_print/test_wipe_tower.cpp @@ -5,11 +5,17 @@ #include "libslic3r/GCode/WipeTower.hpp" #include "libslic3r/PrintConfig.hpp" -using namespace Slic3r; +#include "test_helpers.hpp" -// The wipe tower flushes the firmware's motion queue before a command or custom-G-code -// boundary that must not be reached early (an extruder-position reset, entering custom -// G-code). Klipper acts on those the moment it parses them, and its G4 reads only P, so the +using namespace Slic3r; +using namespace Slic3r::Test; + +// Pins the enum's size: the two GENERATE lists below hand-list every non-Klipper flavor, so a +// 14th `GCodeFlavor` value would silently go untested unless this fails the build first. +static_assert(int(gcfNoExtrusion) == 12, "GCodeFlavor grew: add the new value to the GENERATE lists in this file"); + +// The wipe tower flushes the firmware's motion queue around an M104/M109 or custom-G-code +// boundary. Klipper acts on those the moment it parses them, and its G4 reads only P, so the // zero dwell every other flavor uses is not a flush there. TEST_CASE("Klipper flushes the wipe tower planner queue with M400", "[WipeTower]") { @@ -25,3 +31,100 @@ TEST_CASE("Other flavors flush the wipe tower planner queue with a zero dwell", INFO("gcode flavor enum value: " << int(flavor)); CHECK(std::string(flush_planner_queue_command(flavor)) == "G4 S0\n"); } + +// A timed pause is emitted in seconds for most firmware. Klipper's G4 reads only P, in +// milliseconds, and ignores S, so the seconds form would pause for no time at all there. +// 1.5s is exactly representable as a float, so neither form can drift when rounded. +TEST_CASE("Klipper waits in the wipe tower with a millisecond dwell", "[WipeTower]") +{ + CHECK(wait_command(gcfKlipper, 1.5f) == "G4 P1500\n"); +} + +TEST_CASE("Other flavors wait in the wipe tower with a seconds dwell", "[WipeTower]") +{ + const GCodeFlavor flavor = GENERATE(gcfMarlinLegacy, gcfRepRapFirmware, gcfRepetier, + gcfMarlinFirmware, gcfRepRapSprinter, gcfTeacup, + gcfMakerWare, gcfSailfish, gcfMach3, gcfMachinekit, + gcfSmoothie, gcfNoExtrusion); + INFO("gcode flavor enum value: " << int(flavor)); + CHECK(wait_command(flavor, 1.5f) == "G4 S1.500\n"); +} + +// The two helpers above are only unit-tested in isolation. Nothing yet confirms that a +// Klipper `gcode_flavor` actually reaches the wipe tower writer and lands in the exported +// G-code, which is the binding constraint of both changes above ("only gcfKlipper changes"). +// These slice a real two-filament print and check that. + +// The G-code between each "WIPE_TOWER_START"/"WIPE_TOWER_END" tag pair the wipe tower writes +// around its toolchange chunks, concatenated. Isolates the region the flush/dwell helpers can +// emit into from ordinary object G-code, where an unrelated M400 (e.g. GCodeProcessor's +// pre-heat injector, gated off here since neither test sets enable_pre_heating) would +// otherwise create a false match. +static std::string wipe_tower_regions(const std::string &gcode) +{ + std::string regions; + size_t pos = 0; + while (true) { + size_t start = gcode.find("WIPE_TOWER_START", pos); + if (start == std::string::npos) + break; + size_t end = gcode.find("WIPE_TOWER_END", start); + if (end == std::string::npos) + break; + regions += gcode.substr(start, end - start); + pos = end + 1; + } + return regions; +} + +// A per-layer toolchange between the wall and infill filaments, same shape as +// test_multifilament.cpp's "Each feature prints with its assigned filament", so the wipe +// tower actually runs its toolchange path (and so `flush_planner_queue()`) on every layer. +static DynamicPrintConfig wipe_tower_toolchange_config(const std::string &gcode_flavor) +{ + return multifilament_config(2, { + { "sparse_infill_filament_id", 1 }, + { "internal_solid_filament_id", 1 }, + { "top_surface_filament_id", 1 }, + { "bottom_surface_filament_id", 1 }, + { "outer_wall_filament_id", 2 }, + { "inner_wall_filament_id", 2 }, + { "enable_prime_tower", true }, + { "gcode_flavor", gcode_flavor }, + }); +} + +// Slices a 20mm cube under `config`. Not just `Test::slice(...)`: a brand-new Print's first +// `apply()` call still has no per-feature regions built, so it undercounts the filaments in +// use and lets DynamicPrintConfig::normalize_fdm_2's "single filament" rule turn +// `enable_prime_tower` back off before the wipe tower ever runs. Applying the same config a +// second time, once init_print's first apply has settled those regions, lets that count see +// both filaments so the prime tower stays on. +static std::string slice_with_prime_tower(const DynamicPrintConfig &config) +{ + Print print; + Model model; + init_print({ cube(20) }, print, model, config); + print.apply(model, config); + return gcode(print); +} + +TEST_CASE("Klipper's wipe tower toolchanges flush the planner queue with M400 in exported G-code", "[WipeTower]") +{ + const std::string gcode = slice_with_prime_tower(wipe_tower_toolchange_config("klipper")); + REQUIRE_THAT(gcode, Catch::Matchers::ContainsSubstring("WIPE_TOWER_START")); + + const std::string tower = wipe_tower_regions(gcode); + CHECK_THAT(tower, Catch::Matchers::ContainsSubstring("M400")); + CHECK_THAT(tower, !Catch::Matchers::ContainsSubstring("G4 S0")); +} + +TEST_CASE("Marlin's wipe tower toolchanges keep the zero-dwell flush in exported G-code", "[WipeTower]") +{ + const std::string gcode = slice_with_prime_tower(wipe_tower_toolchange_config("marlin")); + REQUIRE_THAT(gcode, Catch::Matchers::ContainsSubstring("WIPE_TOWER_START")); + + const std::string tower = wipe_tower_regions(gcode); + CHECK_THAT(tower, Catch::Matchers::ContainsSubstring("G4 S0")); + CHECK_THAT(tower, !Catch::Matchers::ContainsSubstring("M400")); +} From 1d023216f226714b7dd95a41db8bac974e299e36 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Wed, 5 Aug 2026 18:09:36 +0800 Subject: [PATCH 067/106] clean up --- src/libslic3r/GCode/WipeTower.cpp | 2 + src/libslic3r/GCode/WipeTower.hpp | 15 ++-- src/libslic3r/GCode/WipeTower2.cpp | 6 +- tests/fff_print/test_wipe_tower.cpp | 105 +++++++++++++--------------- 4 files changed, 59 insertions(+), 69 deletions(-) diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index 35d99498eb..b97e773e63 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -1345,6 +1345,8 @@ public: { std::string buffer; if (wait_for_moves) + // Not flush_planner_queue_command(): this BBL precool path wants M400, which every + // flavor it reaches understands, not the zero dwell the other flavors flush with. buffer += "M400\n"; buffer += "M104"; if (target_extruder != -1) diff --git a/src/libslic3r/GCode/WipeTower.hpp b/src/libslic3r/GCode/WipeTower.hpp index e6493378d6..0819a04f10 100644 --- a/src/libslic3r/GCode/WipeTower.hpp +++ b/src/libslic3r/GCode/WipeTower.hpp @@ -26,16 +26,11 @@ enum GCodeFlavor : unsigned char; Polylines construct_gap_for_skip_points( const Polygon& polygon, const std::vector& skip_points, float wt_width, float gap_length, Polygon& insert_skip_polygon); -// Returns the command that makes the firmware finish its queued moves around an M104/M109 -// or custom-G-code boundary. Klipper acts on commands the instant it parses them, and its G4 -// reads only P, so the zero dwell other flavors use synchronizes nothing there — M400 does. -// Defined in WipeTower.cpp, shared by WipeTower and WipeTower2. -const char* flush_planner_queue_command(GCodeFlavor flavor); - -// Returns the command that pauses for `seconds`. Klipper's G4 reads only P, in -// milliseconds, and ignores S, so the seconds form the other flavors use would dwell zero -// there. Defined in WipeTower.cpp, shared by WipeTower and WipeTower2. -std::string wait_command(GCodeFlavor flavor, float seconds); +// Klipper acts on commands the instant it parses them, and its G4 reads only P (milliseconds), +// so the zero-second and seconds-valued dwells every other flavor uses neither synchronize nor +// pause there. Both defined in WipeTower.cpp, shared by WipeTower and WipeTower2. +const char* flush_planner_queue_command(GCodeFlavor flavor); // finish queued moves, e.g. around M104/M109 +std::string wait_command(GCodeFlavor flavor, float seconds); // pause for `seconds` class WipeTower { diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index d2abf0a155..0837bfa908 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -386,8 +386,8 @@ public: } WipeTowerWriter2& switch_filament_monitoring(bool enable) { - m_gcode += flush_planner_queue_command(m_gcode_flavor); - m_gcode += std::string("M591 ") + (enable ? "R" : "S0") + "\n"; + flush_planner_queue(); + m_gcode += enable ? "M591 R\n" : "M591 S0\n"; return *this; } @@ -626,7 +626,7 @@ public: // Set extruder temperature, don't wait by default. WipeTowerWriter2& set_extruder_temp(int temperature, bool wait = false) { - m_gcode += flush_planner_queue_command(m_gcode_flavor); + flush_planner_queue(); m_gcode += "M" + std::to_string(wait ? 109 : 104) + " S" + std::to_string(temperature) + "\n"; return *this; } diff --git a/tests/fff_print/test_wipe_tower.cpp b/tests/fff_print/test_wipe_tower.cpp index 4ea11f7a2a..bb9e4781d1 100644 --- a/tests/fff_print/test_wipe_tower.cpp +++ b/tests/fff_print/test_wipe_tower.cpp @@ -1,7 +1,9 @@ #include #include +#include +#include "libslic3r/GCode/GCodeProcessor.hpp" #include "libslic3r/GCode/WipeTower.hpp" #include "libslic3r/PrintConfig.hpp" @@ -10,13 +12,22 @@ using namespace Slic3r; using namespace Slic3r::Test; -// Pins the enum's size: the two GENERATE lists below hand-list every non-Klipper flavor, so a -// 14th `GCodeFlavor` value would silently go untested unless this fails the build first. -static_assert(int(gcfNoExtrusion) == 12, "GCodeFlavor grew: add the new value to the GENERATE lists in this file"); +// Taken from the config enum map rather than hand-listed, so a flavor added to GCodeFlavor later +// is covered here without editing this file. +static std::vector non_klipper_flavors() +{ + std::vector flavors; + for (const auto &[name, value] : ConfigOptionEnum::get_enum_values()) + if (GCodeFlavor(value) != gcfKlipper) + flavors.push_back(GCodeFlavor(value)); + return flavors; +} + +static std::string flavor_name(GCodeFlavor flavor) +{ + return ConfigOptionEnum::get_enum_names()[int(flavor)]; +} -// The wipe tower flushes the firmware's motion queue around an M104/M109 or custom-G-code -// boundary. Klipper acts on those the moment it parses them, and its G4 reads only P, so the -// zero dwell every other flavor uses is not a flush there. TEST_CASE("Klipper flushes the wipe tower planner queue with M400", "[WipeTower]") { CHECK(std::string(flush_planner_queue_command(gcfKlipper)) == "M400\n"); @@ -24,16 +35,11 @@ TEST_CASE("Klipper flushes the wipe tower planner queue with M400", "[WipeTower] TEST_CASE("Other flavors flush the wipe tower planner queue with a zero dwell", "[WipeTower]") { - const GCodeFlavor flavor = GENERATE(gcfMarlinLegacy, gcfRepRapFirmware, gcfRepetier, - gcfMarlinFirmware, gcfRepRapSprinter, gcfTeacup, - gcfMakerWare, gcfSailfish, gcfMach3, gcfMachinekit, - gcfSmoothie, gcfNoExtrusion); - INFO("gcode flavor enum value: " << int(flavor)); + const GCodeFlavor flavor = GENERATE(from_range(non_klipper_flavors())); + INFO("gcode flavor: " << flavor_name(flavor)); CHECK(std::string(flush_planner_queue_command(flavor)) == "G4 S0\n"); } -// A timed pause is emitted in seconds for most firmware. Klipper's G4 reads only P, in -// milliseconds, and ignores S, so the seconds form would pause for no time at all there. // 1.5s is exactly representable as a float, so neither form can drift when rounded. TEST_CASE("Klipper waits in the wipe tower with a millisecond dwell", "[WipeTower]") { @@ -42,44 +48,39 @@ TEST_CASE("Klipper waits in the wipe tower with a millisecond dwell", "[WipeTowe TEST_CASE("Other flavors wait in the wipe tower with a seconds dwell", "[WipeTower]") { - const GCodeFlavor flavor = GENERATE(gcfMarlinLegacy, gcfRepRapFirmware, gcfRepetier, - gcfMarlinFirmware, gcfRepRapSprinter, gcfTeacup, - gcfMakerWare, gcfSailfish, gcfMach3, gcfMachinekit, - gcfSmoothie, gcfNoExtrusion); - INFO("gcode flavor enum value: " << int(flavor)); + const GCodeFlavor flavor = GENERATE(from_range(non_klipper_flavors())); + INFO("gcode flavor: " << flavor_name(flavor)); CHECK(wait_command(flavor, 1.5f) == "G4 S1.500\n"); } -// The two helpers above are only unit-tested in isolation. Nothing yet confirms that a -// Klipper `gcode_flavor` actually reaches the wipe tower writer and lands in the exported -// G-code, which is the binding constraint of both changes above ("only gcfKlipper changes"). -// These slice a real two-filament print and check that. +// The cases above only exercise the helpers in isolation. The one below slices a real +// two-filament print, so it also covers the binding constraint of both changes: that the +// configured `gcode_flavor` reaches the wipe tower writer and lands in the exported G-code. -// The G-code between each "WIPE_TOWER_START"/"WIPE_TOWER_END" tag pair the wipe tower writes -// around its toolchange chunks, concatenated. Isolates the region the flush/dwell helpers can -// emit into from ordinary object G-code, where an unrelated M400 (e.g. GCodeProcessor's -// pre-heat injector, gated off here since neither test sets enable_pre_heating) would -// otherwise create a false match. +// The G-code inside each WIPE_TOWER_START/WIPE_TOWER_END pair, concatenated, so an M400 emitted +// outside the tower (e.g. GCodeProcessor's pre-heat injector) cannot create a false match. static std::string wipe_tower_regions(const std::string &gcode) { + const std::string &start_tag = GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Wipe_Tower_Start); + const std::string &end_tag = GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Wipe_Tower_End); std::string regions; size_t pos = 0; while (true) { - size_t start = gcode.find("WIPE_TOWER_START", pos); + size_t start = gcode.find(start_tag, pos); if (start == std::string::npos) break; - size_t end = gcode.find("WIPE_TOWER_END", start); + size_t end = gcode.find(end_tag, start); if (end == std::string::npos) break; - regions += gcode.substr(start, end - start); + regions.append(gcode, start, end - start); pos = end + 1; } return regions; } // A per-layer toolchange between the wall and infill filaments, same shape as -// test_multifilament.cpp's "Each feature prints with its assigned filament", so the wipe -// tower actually runs its toolchange path (and so `flush_planner_queue()`) on every layer. +// test_multifilament.cpp's "Each feature prints with its assigned filament", so the wipe tower +// runs its toolchange path (and so `flush_planner_queue()`) on every layer. static DynamicPrintConfig wipe_tower_toolchange_config(const std::string &gcode_flavor) { return multifilament_config(2, { @@ -90,41 +91,33 @@ static DynamicPrintConfig wipe_tower_toolchange_config(const std::string &gcode_ { "outer_wall_filament_id", 2 }, { "inner_wall_filament_id", 2 }, { "enable_prime_tower", true }, + { "layer_height", 0.3 }, { "gcode_flavor", gcode_flavor }, }); } -// Slices a 20mm cube under `config`. Not just `Test::slice(...)`: a brand-new Print's first -// `apply()` call still has no per-feature regions built, so it undercounts the filaments in -// use and lets DynamicPrintConfig::normalize_fdm_2's "single filament" rule turn -// `enable_prime_tower` back off before the wipe tower ever runs. Applying the same config a -// second time, once init_print's first apply has settled those regions, lets that count see -// both filaments so the prime tower stays on. +// Slices a 10mm cube under `config`. Not plain Test::slice: a brand-new Print's first `apply()` +// counts one filament in use, and DynamicPrintConfig::normalize_fdm_2's single-filament rule then +// clears `enable_prime_tower`. A second apply, once init_print's regions have settled, sees both +// filaments and the tower survives. static std::string slice_with_prime_tower(const DynamicPrintConfig &config) { Print print; Model model; - init_print({ cube(20) }, print, model, config); + init_print({ cube(10) }, print, model, config); print.apply(model, config); return gcode(print); } -TEST_CASE("Klipper's wipe tower toolchanges flush the planner queue with M400 in exported G-code", "[WipeTower]") +TEST_CASE("The wipe tower's toolchange planner flush follows the gcode flavor", "[WipeTower]") { - const std::string gcode = slice_with_prime_tower(wipe_tower_toolchange_config("klipper")); - REQUIRE_THAT(gcode, Catch::Matchers::ContainsSubstring("WIPE_TOWER_START")); - - const std::string tower = wipe_tower_regions(gcode); - CHECK_THAT(tower, Catch::Matchers::ContainsSubstring("M400")); - CHECK_THAT(tower, !Catch::Matchers::ContainsSubstring("G4 S0")); -} - -TEST_CASE("Marlin's wipe tower toolchanges keep the zero-dwell flush in exported G-code", "[WipeTower]") -{ - const std::string gcode = slice_with_prime_tower(wipe_tower_toolchange_config("marlin")); - REQUIRE_THAT(gcode, Catch::Matchers::ContainsSubstring("WIPE_TOWER_START")); - - const std::string tower = wipe_tower_regions(gcode); - CHECK_THAT(tower, Catch::Matchers::ContainsSubstring("G4 S0")); - CHECK_THAT(tower, !Catch::Matchers::ContainsSubstring("M400")); + auto [flavor, expected, unexpected] = GENERATE(table({ + { "klipper", "M400", "G4 S0" }, + { "marlin", "G4 S0", "M400" } })); + DYNAMIC_SECTION(flavor) { + const std::string tower = wipe_tower_regions(slice_with_prime_tower(wipe_tower_toolchange_config(flavor))); + REQUIRE_FALSE(tower.empty()); + CHECK_THAT(tower, Catch::Matchers::ContainsSubstring(expected)); + CHECK_THAT(tower, !Catch::Matchers::ContainsSubstring(unexpected)); + } } From 23bd320076056dd40a141869ee848633799227ea Mon Sep 17 00:00:00 2001 From: "Dipl.-Ing. Raoul Rubien, BSc" Date: Wed, 5 Aug 2026 15:41:04 +0200 Subject: [PATCH 068/106] Fixes 2 Bugs and 13 Compiler Warnings (#10670) * fixes: %g directive writing between 1 and 13 bytes into a region of size between 6 and 18 [-Wformat-overflow=] * fixes: %5s directive writing between 5 and 63 bytes into a region of size 58 [-Wformat-overflow=] * fixes: catching polymorphic type by value [-Wcatch-value=] * fixes: [-Wcomment]; removes whitespaces * increases buffer size from 71B to 90B to avoid potential ovfl. --- src/OrcaSlicer.cpp | 2 +- src/libslic3r/AppConfig.cpp | 2 +- src/libslic3r/Fill/FillRectilinear.cpp | 2 +- src/libslic3r/Format/STEP.cpp | 2 +- src/libslic3r/GCode.cpp | 2 +- src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.cpp | 8 ++++---- src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.h | 10 +++++----- src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.cpp | 8 ++++---- src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.h | 8 ++++---- src/slic3r/GUI/GUI_ObjectList.cpp | 2 +- src/slic3r/GUI/IMSlider.cpp | 2 +- src/slic3r/GUI/SelectMachine.cpp | 13 ++++++------- 12 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/OrcaSlicer.cpp b/src/OrcaSlicer.cpp index e0a15209a3..71d6ffde80 100644 --- a/src/OrcaSlicer.cpp +++ b/src/OrcaSlicer.cpp @@ -7054,7 +7054,7 @@ int CLI::run(int argc, char **argv) gcode_viewer.render_calibration_thumbnail(*calibration_data, cali_thumbnail_width, cali_thumbnail_height, calibration_params, partplate_list, opengl_mgr); //generate_calibration_thumbnail(*calibration_data, thumbnail_width, thumbnail_height, calibration_params); - //*plate_bboxes[index] = p->generate_first_layer_bbox(); + // *plate_bboxes[index] = p->generate_first_layer_bbox(); calibration_thumbnails.push_back(calibration_data);*/ PlateBBoxData* plate_bbox = new PlateBBoxData(); diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 1b170bf884..a5d0e24eac 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -883,7 +883,7 @@ std::string AppConfig::load() } } } - } catch(std::exception err) { + } catch(const std::exception &err) { BOOST_LOG_TRIVIAL(info) << format("parse app config \"%1%\", error: %2%", AppConfig::loading_path(), err.what()); return err.what(); diff --git a/src/libslic3r/Fill/FillRectilinear.cpp b/src/libslic3r/Fill/FillRectilinear.cpp index 138b50bc88..8b40b8753c 100644 --- a/src/libslic3r/Fill/FillRectilinear.cpp +++ b/src/libslic3r/Fill/FillRectilinear.cpp @@ -3576,7 +3576,7 @@ Polylines FillLateralHoneycomb::fill_surface(const Surface *surface, const FillP // | // | // 0 --+-- - // / \ + // ⟋ ⟍ // why inverted? // it makes determining some of the properties easier // and the two angled legs provide additional horizontal stiffness diff --git a/src/libslic3r/Format/STEP.cpp b/src/libslic3r/Format/STEP.cpp index 8b07286c5b..f82ced7d86 100644 --- a/src/libslic3r/Format/STEP.cpp +++ b/src/libslic3r/Format/STEP.cpp @@ -712,7 +712,7 @@ unsigned int Step::get_triangle_num(double linear_deflection, double angle_defle return 0; } } - } catch(Exception e) { + } catch(const Exception &e) { return 0; } diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index babe018651..b898284d89 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5511,7 +5511,7 @@ LayerResult GCode::process_layer( // add tag for processor gcode += ";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Layer_Change) + "\n"; // export layer z - char buf[64]; + char buf[80]; sprintf(buf, print.is_BBL_printer() ? "; Z_HEIGHT: %g\n" : ";Z:%g\n", print_z); gcode += buf; // export layer height diff --git a/src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.cpp b/src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.cpp index 33e9cdf518..259506612d 100644 --- a/src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.cpp +++ b/src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.cpp @@ -1,9 +1,9 @@ -//**********************************************************/ -/* File: uiAmsHumidityPopup.cpp +/********************************************************** +* File: uiAmsHumidityPopup.cpp * Description: The popup with DevAms Humidity * * \n class uiAmsHumidityPopup -//**********************************************************/ +**********************************************************/ #include "uiAmsHumidityPopup.h" @@ -191,4 +191,4 @@ void uiAmsPercentHumidityDryPopup::msw_rescale() } // namespace GUI -} // namespace Slic3r \ No newline at end of file +} // namespace Slic3r diff --git a/src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.h b/src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.h index 0f22c6b662..a109381c86 100644 --- a/src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.h +++ b/src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.h @@ -1,9 +1,9 @@ -//**********************************************************/ -/* File: uiAmsHumidityPopup.h +/********************************************************** +* File: uiAmsHumidityPopup.h * Description: The popup with DevAms Humidity * * \n class uiAmsHumidityPopup -//**********************************************************/ +**********************************************************/ #pragma once #include "slic3r/GUI/Widgets/AMSItem.hpp" @@ -68,7 +68,7 @@ private: wxStaticBitmap* m_dry_state_img; Label* m_dry_state; - + Label* m_humidity_header; Label* m_humidity_label; @@ -81,4 +81,4 @@ private: wxSizer* m_sizer; }; -}} // namespace Slic3r::GUI \ No newline at end of file +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.cpp b/src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.cpp index 5167f482b8..59fc8809ce 100644 --- a/src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.cpp +++ b/src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.cpp @@ -1,9 +1,9 @@ -//**********************************************************/ -/* File: uiDeviceUpdateVersion.cpp +/********************************************************** +* File: uiDeviceUpdateVersion.cpp * Description: The panel with firmware info * * \n class uiDeviceUpdateVersion -//**********************************************************/ +**********************************************************/ #include "uiDeviceUpdateVersion.h" @@ -114,4 +114,4 @@ void uiDeviceUpdateVersion::CreateWidgets() Layout(); wxGetApp().UpdateDarkUIWin(this); -} \ No newline at end of file +} diff --git a/src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.h b/src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.h index 100280db62..342067e374 100644 --- a/src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.h +++ b/src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.h @@ -1,9 +1,9 @@ -//**********************************************************/ -/* File: uiDeviceUpdateVersion.h +/********************************************************** +* File: uiDeviceUpdateVersion.h * Description: The panel with firmware info * * \n class uiDeviceUpdateVersion -//**********************************************************/ +**********************************************************/ #pragma once #include @@ -44,4 +44,4 @@ private: wxStaticText* m_dev_version; wxStaticBitmap* m_dev_upgrade_indicator; }; -};// end of namespace Slic3r::GUI \ No newline at end of file +};// end of namespace Slic3r::GUI diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index b23b554a74..dc89f5f9bb 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -3213,7 +3213,7 @@ void ObjectList::merge(bool to_multipart_object) //changed_object(obj_idx); //remove(); } - /* wxGetApp().plater()->load_model_objects(objects); + // wxGetApp().plater()->load_model_objects(objects); Selection& selection = p->view3D->get_canvas3d()->get_selection(); size_t last_obj_idx = p->model.objects.size() - 1; diff --git a/src/slic3r/GUI/IMSlider.cpp b/src/slic3r/GUI/IMSlider.cpp index 35f4761257..c008963646 100644 --- a/src/slic3r/GUI/IMSlider.cpp +++ b/src/slic3r/GUI/IMSlider.cpp @@ -1733,7 +1733,7 @@ std::string IMSlider::get_label(int tick, LabelType label_type) ::sprintf(layer_height, "%.2f", m_values.empty() ? m_label_koef * value : m_values[value]); if (label_type == ltHeight) return std::string(layer_height); if (label_type == ltHeightWithLayer) { - char buffer[64]; + char buffer[90]; size_t layer_number; layer_number = m_draw_mode == dmSequentialFffPrint ? (m_values.empty() ? value : value + 1) : m_is_wipe_tower ? get_layer_number(value, label_type) + 1 : (m_values.empty() ? value : value + 1); ::sprintf(buffer, "%5s\n%5s", std::to_string(layer_number).c_str(), layer_height); diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 1ab78fcc11..6cc988b879 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -3629,7 +3629,7 @@ void SelectMachineDialog::on_send_print() BOOST_LOG_TRIVIAL(error) << "build_nozzle_info errors"; } - m_print_job->sdcard_state = obj_->GetStorage()->get_sdcard_state(); + m_print_job->sdcard_state = obj_->GetStorage()->get_sdcard_state(); m_print_job->has_sdcard = wxGetApp().app_config->get("allow_abnormal_storage") == "true" ? (m_print_job->sdcard_state == DevStorage::SdcardState::HAS_SDCARD_NORMAL || m_print_job->sdcard_state == DevStorage::SdcardState::HAS_SDCARD_ABNORMAL) @@ -3868,12 +3868,11 @@ _compare_obj_names(MachineObject* obj1, MachineObject* obj2) } /******************************************************************* -*@note _collect_machine_list -*@param dev_manager -- the device manager -*@param sorted_machine_objs -- return the sorted machine objects -*@param best_one -- return the best one -*/ -/*******************************************************************/ +* @note _collect_machine_list +* @param dev_manager -- the device manager +* @param sorted_machine_objs -- return the sorted machine objects +* @param best_one -- return the best one +*******************************************************************/ static void _collect_sorted_machines(Slic3r::DeviceManager* dev_manager, std::vector& sorted_machine_objs) From 7fbfb7ba879852b02de3670479a31883993376df Mon Sep 17 00:00:00 2001 From: "Dipl.-Ing. Raoul Rubien, BSc" Date: Wed, 5 Aug 2026 15:42:15 +0200 Subject: [PATCH 069/106] Fixes 14 Compiler Warnings [-Wmaybe-uninitialized] (#10778) * fixes: may be used uninitialized [-Wmaybe-uninitialized] * fixes: may be used uninitialized [-Wmaybe-uninitialized] * fixes: may be used uninitialized [-Wmaybe-uninitialized] * fixes: may be used uninitialized [-Wmaybe-uninitialized] * reverts {} initializer to = to keep code style consistent --- src/libslic3r/AABBMesh.cpp | 15 +++++++-------- src/libslic3r/Measure.hpp | 2 +- src/libslic3r/SLA/IndexedMesh.cpp | 8 ++++---- src/slic3r/Utils/RaycastManager.cpp | 2 +- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/libslic3r/AABBMesh.cpp b/src/libslic3r/AABBMesh.cpp index a23fd69f68..be026f69d7 100644 --- a/src/libslic3r/AABBMesh.cpp +++ b/src/libslic3r/AABBMesh.cpp @@ -54,12 +54,12 @@ public: int & i, Eigen::Matrix &closest) { - size_t idx_unsigned = 0; - Vec3d closest_vec3d(closest); - double dist = + size_t idx_unsigned { 0 }; + Vec3d closest_vec3d { Vec3d::Zero() }; + const double dist { AABBTreeIndirect::squared_distance_to_indexed_triangle_set( its.vertices, its.indices, m_tree, point, idx_unsigned, - closest_vec3d); + closest_vec3d) }; i = int(idx_unsigned); closest = closest_vec3d; return dist; @@ -311,10 +311,9 @@ AABBMesh::hit_result IndexedMesh::filter_hits( double AABBMesh::squared_distance(const Vec3d &p, int& i, Vec3d& c) const { - double sqdst = 0; - Eigen::Matrix pp = p; - Eigen::Matrix cc; - sqdst = m_aabb->squared_distance(*m_tm, pp, i, cc); + const Eigen::Matrix pp { p }; + Eigen::Matrix cc { Vec3d::Zero() }; + const double sqdst { m_aabb->squared_distance(*m_tm, pp, i, cc) }; c = cc; return sqdst; } diff --git a/src/libslic3r/Measure.hpp b/src/libslic3r/Measure.hpp index 614b443131..2f378f5778 100644 --- a/src/libslic3r/Measure.hpp +++ b/src/libslic3r/Measure.hpp @@ -94,7 +94,7 @@ public: void* volume{nullptr}; std::vector* plane_indices{nullptr}; - Transform3d world_tran; + Transform3d world_tran = Transform3d::Identity(); std::shared_ptr> world_plane_features{nullptr}; std::shared_ptr origin_surface_feature{nullptr}; diff --git a/src/libslic3r/SLA/IndexedMesh.cpp b/src/libslic3r/SLA/IndexedMesh.cpp index b879e3f48b..65d9d90b34 100644 --- a/src/libslic3r/SLA/IndexedMesh.cpp +++ b/src/libslic3r/SLA/IndexedMesh.cpp @@ -56,12 +56,12 @@ public: int & i, Eigen::Matrix &closest) { - size_t idx_unsigned = 0; - Vec3d closest_vec3d(closest); - double dist = + size_t idx_unsigned { 0 }; + Vec3d closest_vec3d { Vec3d::Zero() }; + const double dist { AABBTreeIndirect::squared_distance_to_indexed_triangle_set( its.vertices, its.indices, m_tree, point, idx_unsigned, - closest_vec3d); + closest_vec3d) }; i = int(idx_unsigned); closest = closest_vec3d; return dist; diff --git a/src/slic3r/Utils/RaycastManager.cpp b/src/slic3r/Utils/RaycastManager.cpp index c51a19ebd9..62c7a922d7 100644 --- a/src/slic3r/Utils/RaycastManager.cpp +++ b/src/slic3r/Utils/RaycastManager.cpp @@ -107,7 +107,7 @@ std::optional RaycastManager::first_hit(const Vec3d& point, const AABBMesh *hit_mesh = nullptr; double hit_squared_distance = 0.; int hit_face = -1; - Vec3d hit_world; + Vec3d hit_world { Vec3d::Zero() }; const Transform3d *hit_tramsformation = nullptr; const TrKey *hit_key = nullptr; From f73566dd2b9c88178a39d0149cd799914f0b7aa0 Mon Sep 17 00:00:00 2001 From: "Dipl.-Ing. Raoul Rubien, BSc" Date: Wed, 5 Aug 2026 15:45:48 +0200 Subject: [PATCH 070/106] Fixes 1 Technical Debt and 3 Compiler Warnings [-Wclass-memaccess] (#10707) * fixes: memcpy(...) writing to an object of type OrientParams with no trivial copy-assignment; use copy-assignment or copy-initialization instead [-Wclass-memaccess] * review result: replaces anonymous namespace with static --- src/libslic3r/Orient.hpp | 120 +++++++++--------------------- src/slic3r/GUI/Jobs/OrientJob.cpp | 43 ++++++++++- 2 files changed, 76 insertions(+), 87 deletions(-) diff --git a/src/libslic3r/Orient.hpp b/src/libslic3r/Orient.hpp index 30dbdd3a20..370f23d4fb 100644 --- a/src/libslic3r/Orient.hpp +++ b/src/libslic3r/Orient.hpp @@ -48,100 +48,50 @@ struct OrientMesh { }; -// params for minimizing support area -struct OrientParamsArea { - float TAR_A = 0.015f; - float TAR_B = 0.177f; - float RELATIVE_F = 20; - float CONTOUR_F = 0.5f; - float BOTTOM_F = 2.5f; - float BOTTOM_HULL_F = 0.1f; - float TAR_C = 0.1f; - float TAR_D = 1; - float TAR_E = 0.0115f; - float FIRST_LAY_H = 0.2f;//0.0475; - float VECTOR_TOL = -0.00083f; - float NEGL_FACE_SIZE = 0.01f; - float ASCENT = -0.5f; - float PLAFOND_ADV = 0.0599f; - float CONTOUR_AMOUNT = 0.0182427f; - float OV_H = 2.574f; - float height_offset = 2.3728f; - float height_log = 0.041375f; - float height_log_k = 1.9325457f; - float LAF_MAX = 0.999f; // cos(1.4\degree) for low angle face 0.9997f - float LAF_MIN = 0.97f; // cos(14\degree) 0.9703f - float TAR_LAF = 0.001f; //0.01f - float TAR_PROJ_AREA = 0.1f; - float BOTTOM_MIN = 0.1f; // min bottom area. If lower than it the object may be unstable - float BOTTOM_MAX = 2000; // max bottom area. If get to it the object is stable enough (further increase bottom area won't do more help) - float height_to_bottom_hull_ratio_MIN = 1; - float BOTTOM_HULL_MAX = 2000;// max bottom hull area - float APPERANCE_FACE_SUPP=3; // penalty of generating supports on appearance face - - float overhang_angle = 60.f; - bool use_low_angle_face = true; - bool min_volume = false; - Eigen::Vector3f fun_dir; - - /// Allow parallel execution. - bool parallel = true; - - /// Progress indicator callback called when an object gets packed. - /// The unsigned argument is the number of items remaining to pack. - std::function progressind = {}; - - /// A predicate returning true if abort is needed. - std::function stopcondition = {}; - - OrientParamsArea() = default; -}; - struct OrientParams { - float TAR_A = 0.01f;//0.128f; - float TAR_B = 0.177f; - float RELATIVE_F= 6.610621027964314f; - float CONTOUR_F = 0.23228623269775997f; - float BOTTOM_F = 1.167152017941474f; - float BOTTOM_HULL_F = 0.1f; - float TAR_C = 0.24308070476924726f; - float TAR_D = 0.6284515508160871f; - float TAR_E = 0;//0.032157292647062234; - float FIRST_LAY_H = 0.2f;//0.029; - float VECTOR_TOL = -0.0011163303070972383f; - float NEGL_FACE_SIZE = 0.1f; - float ASCENT= -0.5f; - float PLAFOND_ADV = 0.04079208948120519f; - float CONTOUR_AMOUNT = 0.0101472219892684f; - float OV_H = 1.0370178217794535f; - float height_offset = 2.7417608343142073f; - float height_log = 0.06442030687034085f; - float height_log_k = 0.3933594673063997f; - float LAF_MAX = 0.999f; // cos(1.4\degree) for low angle face //0.9997f; - float LAF_MIN= 0.9703f; // cos(14\degree) 0.9703f; - float TAR_LAF = 0.01f; //0.1f - float TAR_PROJ_AREA = 0.1f; - float BOTTOM_MIN = 0.1f; // min bottom area. If lower than it the objects may be unstable - float BOTTOM_MAX = 2000; //400 - float height_to_bottom_hull_ratio_MIN = 1; - float BOTTOM_HULL_MAX = 2000;// max bottom hull area to clip //600 - float APPERANCE_FACE_SUPP=3; // penalty of generating supports on appearance face - - float overhang_angle = 60.f; - bool use_low_angle_face = true; - bool min_volume = false; - Eigen::Vector3f fun_dir; + float TAR_A { 0.01f }; // 0.128f; + float TAR_B { 0.177f }; + float RELATIVE_F { 6.610621027964314f }; + float CONTOUR_F { 0.23228623269775997f }; + float BOTTOM_F { 1.167152017941474f }; + float BOTTOM_HULL_F { 0.1f }; + float TAR_C { 0.24308070476924726f }; + float TAR_D { 0.6284515508160871f }; + float TAR_E { 0}; // 0.032157292647062234; + float FIRST_LAY_H { 0.2f}; // 0.029; + float VECTOR_TOL { -0.0011163303070972383f }; + float NEGL_FACE_SIZE { 0.1f }; + float ASCENT { -0.5f }; + float PLAFOND_ADV { 0.04079208948120519f }; + float CONTOUR_AMOUNT { 0.0101472219892684f }; + float OV_H { 1.0370178217794535f }; + float height_offset { 2.7417608343142073f }; + float height_log { 0.06442030687034085f }; + float height_log_k { 0.3933594673063997f }; + float LAF_MAX { 0.999f }; // cos(1.4\degree) for low angle face //0.9997f; + float LAF_MIN { 0.9703f }; // cos(14\degree) 0.9703f; + float TAR_LAF { 0.01f }; // 0.1f + float TAR_PROJ_AREA { 0.1f }; + float BOTTOM_MIN { 0.1f }; // min bottom area. If lower than it the objects may be unstable + float BOTTOM_MAX { 2000 }; // 400 + float height_to_bottom_hull_ratio_MIN { 1 }; + float BOTTOM_HULL_MAX { 2000 }; // max bottom hull area to clip //600 + float APPERANCE_FACE_SUPP { 3 }; // penalty of generating supports on appearance face + float overhang_angle { 60.f }; + bool use_low_angle_face { true }; + bool min_volume { false }; + Eigen::Vector3f fun_dir {}; /// Allow parallel execution. - bool parallel = false; + bool parallel { false }; /// Progress indicator callback called when an object gets packed. /// The unsigned argument is the number of items remaining to pack. - std::function progressind = {}; + std::function progressind {}; /// A predicate returning true if abort is needed. - std::function stopcondition = {}; + std::function stopcondition {}; OrientParams() = default; }; diff --git a/src/slic3r/GUI/Jobs/OrientJob.cpp b/src/slic3r/GUI/Jobs/OrientJob.cpp index 7347bad6a2..ee8ea875c0 100644 --- a/src/slic3r/GUI/Jobs/OrientJob.cpp +++ b/src/slic3r/GUI/Jobs/OrientJob.cpp @@ -149,6 +149,46 @@ void OrientJob::prepare() } } +/// parameters to minimize support area +static void setMinimalSupportAreaPrams(Slic3r::orientation::OrientParams &out) +{ + out.TAR_A = 0.015f; + out.TAR_B = 0.177f; + out.RELATIVE_F = 20; + out.CONTOUR_F = 0.5f; + out.BOTTOM_F = 2.5f; + out.BOTTOM_HULL_F = 0.1f; + out.TAR_C = 0.1f; + out.TAR_D = 1; + out.TAR_E = 0.0115f; + out.FIRST_LAY_H = 0.2f; // 0.0475; + out.VECTOR_TOL = -0.00083f; + out.NEGL_FACE_SIZE = 0.01f; + out.ASCENT = -0.5f; + out.PLAFOND_ADV = 0.0599f; + out.CONTOUR_AMOUNT = 0.0182427f; + out.OV_H = 2.574f; + out.height_offset = 2.3728f; + out.height_log = 0.041375f; + out.height_log_k = 1.9325457f; + out.LAF_MAX = 0.999f; // cos(1.4\degree) for low angle face 0.9997f + out.LAF_MIN = 0.97f; // cos(14\degree) 0.9703f + out.TAR_LAF = 0.001f; // 0.01f + out.TAR_PROJ_AREA = 0.1f; + out.BOTTOM_MIN = 0.1f; // min bottom area. If lower than it the object may be unstable + out.BOTTOM_MAX = 2000; // max bottom area. If get to it the object is stable enough (further increase bottom area won't do more help) + out.height_to_bottom_hull_ratio_MIN = 1, + out.BOTTOM_HULL_MAX = 2000; // max bottom hull area + out.APPERANCE_FACE_SUPP = 3; // penalty of generating supports on appearance face + out.overhang_angle = 60.f; + out.use_low_angle_face = true; + out.min_volume = false; + out.fun_dir = {}; + out.parallel = true; + out.progressind = {}; + out.stopcondition = {}; +} + void OrientJob::process(Ctl &ctl) { static const auto arrangestr = _u8L("Orienting..."); @@ -161,9 +201,8 @@ void OrientJob::process(Ctl &ctl) const GLCanvas3D::OrientSettings& settings = m_plater->canvas3D()->get_orient_settings(); orientation::OrientParams params; - orientation::OrientParamsArea params_area; if (settings.min_area) { - memcpy(¶ms, ¶ms_area, sizeof(params)); + setMinimalSupportAreaPrams(params); params.min_volume = false; } else { From b97ca3c0ace8cb04eb520d86417fbe13b7ddbdde Mon Sep 17 00:00:00 2001 From: Alexander Haibl Date: Wed, 5 Aug 2026 21:25:34 +0200 Subject: [PATCH 071/106] disable arc_fitting for K1 potato mcu (#14654) --- .../process/0.08mm SuperDetail @Creality K1 (0.4 nozzle).json | 2 +- .../0.08mm SuperDetail @Creality K1 Max_CFS-C 0.4 nozzle.json | 2 +- .../process/0.08mm SuperDetail @Creality K1C 0.4 nozzle.json | 2 +- .../0.08mm SuperDetail @Creality K1C_CFS-C 0.4 nozzle.json | 2 +- .../0.08mm SuperDetail @Creality K1Max (0.4 nozzle).json | 2 +- .../0.08mm SuperDetail @Creality K1_CFS-C 0.4 nozzle.json | 2 +- .../process/0.16mm Optimal @Creality K1 (0.4 nozzle).json | 2 +- .../0.16mm Optimal @Creality K1 Max_CFS-C 0.4 nozzle.json | 2 +- .../process/0.16mm Optimal @Creality K1 SE 0.4 nozzle.json | 2 +- .../0.16mm Optimal @Creality K1 SE_CFS-C 0.4 nozzle.json | 2 +- .../process/0.16mm Optimal @Creality K1C 0.4 nozzle.json | 2 +- .../process/0.16mm Optimal @Creality K1C_CFS-C 0.4 nozzle.json | 2 +- .../process/0.16mm Optimal @Creality K1Max (0.4 nozzle).json | 2 +- .../process/0.16mm Optimal @Creality K1_CFS-C 0.4 nozzle.json | 2 +- .../process/0.20mm Standard @Creality K1 (0.4 nozzle).json | 2 +- .../0.20mm Standard @Creality K1 Max_CFS-C 0.4 nozzle.json | 2 +- .../Creality/process/0.20mm Standard @Creality K1 SE 0.4.json | 2 +- .../0.20mm Standard @Creality K1 SE_CFS-C 0.4 nozzle.json | 2 +- .../process/0.20mm Standard @Creality K1C 0.4 nozzle.json | 2 +- .../process/0.20mm Standard @Creality K1C_CFS-C 0.4 nozzle.json | 2 +- .../process/0.20mm Standard @Creality K1Max (0.4 nozzle).json | 2 +- .../process/0.20mm Standard @Creality K1_CFS-C 0.4 nozzle.json | 2 +- .../process/0.24mm Draft @Creality K1 (0.4 nozzle).json | 2 +- .../process/0.24mm Draft @Creality K1 Max_CFS-C 0.4 nozzle.json | 2 +- .../process/0.24mm Draft @Creality K1 SE 0.4 nozzle.json | 2 +- .../process/0.24mm Draft @Creality K1 SE_CFS-C 0.4 nozzle.json | 2 +- .../Creality/process/0.24mm Draft @Creality K1C 0.4 nozzle.json | 2 +- .../process/0.24mm Draft @Creality K1C_CFS-C 0.4 nozzle.json | 2 +- .../process/0.24mm Draft @Creality K1Max (0.4 nozzle).json | 2 +- .../process/0.24mm Draft @Creality K1_CFS-C 0.4 nozzle.json | 2 +- .../process/0.30mm Standard @Creality K1 (0.6 nozzle).json | 2 +- .../process/0.30mm Standard @Creality K1 SE 0.6 nozzle.json | 2 +- .../process/0.30mm Standard @Creality K1C 0.6 nozzle.json | 2 +- .../process/0.30mm Standard @Creality K1Max (0.6 nozzle).json | 2 +- .../process/0.40mm Standard @Creality K1 (0.8 nozzle).json | 2 +- .../process/0.40mm Standard @Creality K1C 0.8 nozzle.json | 2 +- .../process/0.40mm Standard @Creality K1Max (0.8 nozzle).json | 2 +- 37 files changed, 37 insertions(+), 37 deletions(-) diff --git a/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1 (0.4 nozzle).json b/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1 (0.4 nozzle).json index 8bf73caf41..7300c45c8d 100644 --- a/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1 (0.4 nozzle).json +++ b/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1 (0.4 nozzle).json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1 Max_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1 Max_CFS-C 0.4 nozzle.json index 5ff07e264b..adc86b4768 100644 --- a/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1 Max_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1 Max_CFS-C 0.4 nozzle.json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1C 0.4 nozzle.json b/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1C 0.4 nozzle.json index fbc953f420..976756a212 100644 --- a/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1C 0.4 nozzle.json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1C_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1C_CFS-C 0.4 nozzle.json index bacd88b9f3..6748914ae7 100644 --- a/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1C_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1C_CFS-C 0.4 nozzle.json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1Max (0.4 nozzle).json b/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1Max (0.4 nozzle).json index 1083550af8..f3f37caca7 100644 --- a/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1Max (0.4 nozzle).json +++ b/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1Max (0.4 nozzle).json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1_CFS-C 0.4 nozzle.json index 3e98181430..0144a35372 100644 --- a/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.08mm SuperDetail @Creality K1_CFS-C 0.4 nozzle.json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 (0.4 nozzle).json b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 (0.4 nozzle).json index dba47d76a5..d6caa5e775 100644 --- a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 (0.4 nozzle).json +++ b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 (0.4 nozzle).json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 Max_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 Max_CFS-C 0.4 nozzle.json index ef22dc37ab..a1896fa377 100644 --- a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 Max_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 Max_CFS-C 0.4 nozzle.json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 SE 0.4 nozzle.json b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 SE 0.4 nozzle.json index 2ac16fb484..087d90a584 100644 --- a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 SE 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 SE 0.4 nozzle.json @@ -38,7 +38,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 SE_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 SE_CFS-C 0.4 nozzle.json index b247bece36..62708a822a 100644 --- a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 SE_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 SE_CFS-C 0.4 nozzle.json @@ -38,7 +38,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1C 0.4 nozzle.json b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1C 0.4 nozzle.json index b1d6201ba7..5deb17002e 100644 --- a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1C 0.4 nozzle.json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1C_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1C_CFS-C 0.4 nozzle.json index 44dc07e070..2365a82d31 100644 --- a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1C_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1C_CFS-C 0.4 nozzle.json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1Max (0.4 nozzle).json b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1Max (0.4 nozzle).json index 0b4ae9c777..02507c806f 100644 --- a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1Max (0.4 nozzle).json +++ b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1Max (0.4 nozzle).json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1_CFS-C 0.4 nozzle.json index 6b201d6f4d..cda928b2e7 100644 --- a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1_CFS-C 0.4 nozzle.json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.20mm Standard @Creality K1 (0.4 nozzle).json b/resources/profiles/Creality/process/0.20mm Standard @Creality K1 (0.4 nozzle).json index 42e894eecd..eaaeb4529f 100644 --- a/resources/profiles/Creality/process/0.20mm Standard @Creality K1 (0.4 nozzle).json +++ b/resources/profiles/Creality/process/0.20mm Standard @Creality K1 (0.4 nozzle).json @@ -128,7 +128,7 @@ "detect_narrow_internal_solid_infill": "1", "dont_filter_internal_bridges": "disabled", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enforce_support_layers": "0", "ensure_vertical_shell_thickness": "ensure_all", diff --git a/resources/profiles/Creality/process/0.20mm Standard @Creality K1 Max_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/process/0.20mm Standard @Creality K1 Max_CFS-C 0.4 nozzle.json index f765f850c8..1a4bd4a3f3 100644 --- a/resources/profiles/Creality/process/0.20mm Standard @Creality K1 Max_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.20mm Standard @Creality K1 Max_CFS-C 0.4 nozzle.json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.20mm Standard @Creality K1 SE 0.4.json b/resources/profiles/Creality/process/0.20mm Standard @Creality K1 SE 0.4.json index 003a8287ae..19b01a9964 100644 --- a/resources/profiles/Creality/process/0.20mm Standard @Creality K1 SE 0.4.json +++ b/resources/profiles/Creality/process/0.20mm Standard @Creality K1 SE 0.4.json @@ -124,7 +124,7 @@ "detect_narrow_internal_solid_infill": "1", "dont_filter_internal_bridges": "disabled", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enforce_support_layers": "0", "ensure_vertical_shell_thickness": "ensure_all", diff --git a/resources/profiles/Creality/process/0.20mm Standard @Creality K1 SE_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/process/0.20mm Standard @Creality K1 SE_CFS-C 0.4 nozzle.json index 85de09803b..b7365760f4 100644 --- a/resources/profiles/Creality/process/0.20mm Standard @Creality K1 SE_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.20mm Standard @Creality K1 SE_CFS-C 0.4 nozzle.json @@ -38,7 +38,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.20mm Standard @Creality K1C 0.4 nozzle.json b/resources/profiles/Creality/process/0.20mm Standard @Creality K1C 0.4 nozzle.json index c33dc038f5..aa8e7b440a 100644 --- a/resources/profiles/Creality/process/0.20mm Standard @Creality K1C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.20mm Standard @Creality K1C 0.4 nozzle.json @@ -128,7 +128,7 @@ "detect_narrow_internal_solid_infill": "1", "dont_filter_internal_bridges": "disabled", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enforce_support_layers": "0", "ensure_vertical_shell_thickness": "ensure_all", diff --git a/resources/profiles/Creality/process/0.20mm Standard @Creality K1C_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/process/0.20mm Standard @Creality K1C_CFS-C 0.4 nozzle.json index 7957e09303..882703434d 100644 --- a/resources/profiles/Creality/process/0.20mm Standard @Creality K1C_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.20mm Standard @Creality K1C_CFS-C 0.4 nozzle.json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.20mm Standard @Creality K1Max (0.4 nozzle).json b/resources/profiles/Creality/process/0.20mm Standard @Creality K1Max (0.4 nozzle).json index cea8966d46..51ada298d8 100644 --- a/resources/profiles/Creality/process/0.20mm Standard @Creality K1Max (0.4 nozzle).json +++ b/resources/profiles/Creality/process/0.20mm Standard @Creality K1Max (0.4 nozzle).json @@ -128,7 +128,7 @@ "detect_narrow_internal_solid_infill": "1", "dont_filter_internal_bridges": "disabled", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enforce_support_layers": "0", "ensure_vertical_shell_thickness": "ensure_all", diff --git a/resources/profiles/Creality/process/0.20mm Standard @Creality K1_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/process/0.20mm Standard @Creality K1_CFS-C 0.4 nozzle.json index a617d8e2b4..85dd6bbf3d 100644 --- a/resources/profiles/Creality/process/0.20mm Standard @Creality K1_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.20mm Standard @Creality K1_CFS-C 0.4 nozzle.json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.24mm Draft @Creality K1 (0.4 nozzle).json b/resources/profiles/Creality/process/0.24mm Draft @Creality K1 (0.4 nozzle).json index 051a14e1d4..ce0abbf5ac 100644 --- a/resources/profiles/Creality/process/0.24mm Draft @Creality K1 (0.4 nozzle).json +++ b/resources/profiles/Creality/process/0.24mm Draft @Creality K1 (0.4 nozzle).json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.24mm Draft @Creality K1 Max_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/process/0.24mm Draft @Creality K1 Max_CFS-C 0.4 nozzle.json index 8170eb02d6..afd921a54b 100644 --- a/resources/profiles/Creality/process/0.24mm Draft @Creality K1 Max_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.24mm Draft @Creality K1 Max_CFS-C 0.4 nozzle.json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.24mm Draft @Creality K1 SE 0.4 nozzle.json b/resources/profiles/Creality/process/0.24mm Draft @Creality K1 SE 0.4 nozzle.json index 349601c857..34a577c896 100644 --- a/resources/profiles/Creality/process/0.24mm Draft @Creality K1 SE 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.24mm Draft @Creality K1 SE 0.4 nozzle.json @@ -38,7 +38,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.24mm Draft @Creality K1 SE_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/process/0.24mm Draft @Creality K1 SE_CFS-C 0.4 nozzle.json index 40ecd965b1..3522e46d5a 100644 --- a/resources/profiles/Creality/process/0.24mm Draft @Creality K1 SE_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.24mm Draft @Creality K1 SE_CFS-C 0.4 nozzle.json @@ -38,7 +38,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.24mm Draft @Creality K1C 0.4 nozzle.json b/resources/profiles/Creality/process/0.24mm Draft @Creality K1C 0.4 nozzle.json index ef58869e10..697593d8c4 100644 --- a/resources/profiles/Creality/process/0.24mm Draft @Creality K1C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.24mm Draft @Creality K1C 0.4 nozzle.json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.24mm Draft @Creality K1C_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/process/0.24mm Draft @Creality K1C_CFS-C 0.4 nozzle.json index af9f2c5b86..b3bf816290 100644 --- a/resources/profiles/Creality/process/0.24mm Draft @Creality K1C_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.24mm Draft @Creality K1C_CFS-C 0.4 nozzle.json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.24mm Draft @Creality K1Max (0.4 nozzle).json b/resources/profiles/Creality/process/0.24mm Draft @Creality K1Max (0.4 nozzle).json index cea238f1f3..9f886804e3 100644 --- a/resources/profiles/Creality/process/0.24mm Draft @Creality K1Max (0.4 nozzle).json +++ b/resources/profiles/Creality/process/0.24mm Draft @Creality K1Max (0.4 nozzle).json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.24mm Draft @Creality K1_CFS-C 0.4 nozzle.json b/resources/profiles/Creality/process/0.24mm Draft @Creality K1_CFS-C 0.4 nozzle.json index 5f91995b41..16ebf21b9a 100644 --- a/resources/profiles/Creality/process/0.24mm Draft @Creality K1_CFS-C 0.4 nozzle.json +++ b/resources/profiles/Creality/process/0.24mm Draft @Creality K1_CFS-C 0.4 nozzle.json @@ -39,7 +39,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "1", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.30mm Standard @Creality K1 (0.6 nozzle).json b/resources/profiles/Creality/process/0.30mm Standard @Creality K1 (0.6 nozzle).json index 1259ac5186..a4bd5b2abc 100644 --- a/resources/profiles/Creality/process/0.30mm Standard @Creality K1 (0.6 nozzle).json +++ b/resources/profiles/Creality/process/0.30mm Standard @Creality K1 (0.6 nozzle).json @@ -126,7 +126,7 @@ "detect_narrow_internal_solid_infill": "1", "dont_filter_internal_bridges": "disabled", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enforce_support_layers": "0", "ensure_vertical_shell_thickness": "ensure_all", diff --git a/resources/profiles/Creality/process/0.30mm Standard @Creality K1 SE 0.6 nozzle.json b/resources/profiles/Creality/process/0.30mm Standard @Creality K1 SE 0.6 nozzle.json index 81e54598e3..d4073f4221 100644 --- a/resources/profiles/Creality/process/0.30mm Standard @Creality K1 SE 0.6 nozzle.json +++ b/resources/profiles/Creality/process/0.30mm Standard @Creality K1 SE 0.6 nozzle.json @@ -38,7 +38,7 @@ "draft_shield": "disabled", "elefant_foot_compensation": "0.15", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enable_prime_tower": "0", "enable_support": "0", diff --git a/resources/profiles/Creality/process/0.30mm Standard @Creality K1C 0.6 nozzle.json b/resources/profiles/Creality/process/0.30mm Standard @Creality K1C 0.6 nozzle.json index 71ecb52e77..3f86d9e613 100644 --- a/resources/profiles/Creality/process/0.30mm Standard @Creality K1C 0.6 nozzle.json +++ b/resources/profiles/Creality/process/0.30mm Standard @Creality K1C 0.6 nozzle.json @@ -126,7 +126,7 @@ "detect_narrow_internal_solid_infill": "1", "dont_filter_internal_bridges": "disabled", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enforce_support_layers": "0", "ensure_vertical_shell_thickness": "ensure_all", diff --git a/resources/profiles/Creality/process/0.30mm Standard @Creality K1Max (0.6 nozzle).json b/resources/profiles/Creality/process/0.30mm Standard @Creality K1Max (0.6 nozzle).json index db9e4b1539..54ac0870a4 100644 --- a/resources/profiles/Creality/process/0.30mm Standard @Creality K1Max (0.6 nozzle).json +++ b/resources/profiles/Creality/process/0.30mm Standard @Creality K1Max (0.6 nozzle).json @@ -126,7 +126,7 @@ "detect_narrow_internal_solid_infill": "1", "dont_filter_internal_bridges": "disabled", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enforce_support_layers": "0", "ensure_vertical_shell_thickness": "ensure_all", diff --git a/resources/profiles/Creality/process/0.40mm Standard @Creality K1 (0.8 nozzle).json b/resources/profiles/Creality/process/0.40mm Standard @Creality K1 (0.8 nozzle).json index 5f61b218bc..2de391b8ad 100644 --- a/resources/profiles/Creality/process/0.40mm Standard @Creality K1 (0.8 nozzle).json +++ b/resources/profiles/Creality/process/0.40mm Standard @Creality K1 (0.8 nozzle).json @@ -126,7 +126,7 @@ "detect_narrow_internal_solid_infill": "1", "dont_filter_internal_bridges": "disabled", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enforce_support_layers": "0", "ensure_vertical_shell_thickness": "ensure_all", diff --git a/resources/profiles/Creality/process/0.40mm Standard @Creality K1C 0.8 nozzle.json b/resources/profiles/Creality/process/0.40mm Standard @Creality K1C 0.8 nozzle.json index d5d5d62cda..5cd1a9cb6a 100644 --- a/resources/profiles/Creality/process/0.40mm Standard @Creality K1C 0.8 nozzle.json +++ b/resources/profiles/Creality/process/0.40mm Standard @Creality K1C 0.8 nozzle.json @@ -126,7 +126,7 @@ "detect_narrow_internal_solid_infill": "1", "dont_filter_internal_bridges": "disabled", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enforce_support_layers": "0", "ensure_vertical_shell_thickness": "ensure_all", diff --git a/resources/profiles/Creality/process/0.40mm Standard @Creality K1Max (0.8 nozzle).json b/resources/profiles/Creality/process/0.40mm Standard @Creality K1Max (0.8 nozzle).json index 793c6aa43e..c1c968cbb6 100644 --- a/resources/profiles/Creality/process/0.40mm Standard @Creality K1Max (0.8 nozzle).json +++ b/resources/profiles/Creality/process/0.40mm Standard @Creality K1Max (0.8 nozzle).json @@ -126,7 +126,7 @@ "detect_narrow_internal_solid_infill": "1", "dont_filter_internal_bridges": "disabled", "elefant_foot_compensation_layers": "1", - "enable_arc_fitting": "1", + "enable_arc_fitting": "0", "enable_overhang_speed": "1", "enforce_support_layers": "0", "ensure_vertical_shell_thickness": "ensure_all", From 408db4b3b048afcfcbf05a336a41cc3cf4034665 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Thu, 6 Aug 2026 12:24:00 +0800 Subject: [PATCH 072/106] Wait for the toolchange temperature on the wipe tower Adds a printer option that picks up the new tool without a blocking temperature wait, travels to the wipe tower, and waits there right before purging, parked beside the tower so the ooze from the heat-up lands next to it rather than on the model. The incoming filament's target is raised ahead of the tool change, so the heat-up overlaps both the change itself and the travel to the tower. Off by default, and only offered for multi-extruder printers using a Type 2 wipe tower; the generic toolchanger profile enables it. --- resources/profiles/Custom.json | 2 +- .../machine/fdm_toolchanger_common.json | 1 + src/libslic3r/GCode.cpp | 31 +- src/libslic3r/GCode.hpp | 2 +- src/libslic3r/GCode/WipeTower2.cpp | 123 +++- src/libslic3r/GCode/WipeTower2.hpp | 14 +- src/libslic3r/Preset.cpp | 2 +- src/libslic3r/Print.cpp | 9 + src/libslic3r/PrintConfig.cpp | 11 + src/libslic3r/PrintConfig.hpp | 1 + src/slic3r/GUI/Tab.cpp | 2 + .../wipe_tower_temperature_trace_main.txt | 167 ++++++ tests/fff_print/test_multifilament.cpp | 546 ++++++++++++++++++ 13 files changed, 895 insertions(+), 16 deletions(-) create mode 100644 tests/data/wipe_tower_temperature_trace_main.txt diff --git a/resources/profiles/Custom.json b/resources/profiles/Custom.json index 0429742c88..7eba013111 100644 --- a/resources/profiles/Custom.json +++ b/resources/profiles/Custom.json @@ -1,6 +1,6 @@ { "name": "Custom Printer", - "version": "02.04.00.02", + "version": "02.04.00.03", "force_update": "0", "description": "My configurations", "machine_model_list": [ diff --git a/resources/profiles/Custom/machine/fdm_toolchanger_common.json b/resources/profiles/Custom/machine/fdm_toolchanger_common.json index 7ef8b5207c..55f1b2cadb 100644 --- a/resources/profiles/Custom/machine/fdm_toolchanger_common.json +++ b/resources/profiles/Custom/machine/fdm_toolchanger_common.json @@ -6,6 +6,7 @@ "instantiation": "false", "gcode_flavor": "klipper", "single_extruder_multi_material": "0", + "wait_for_temp_on_wipe_tower": "1", "default_filament_profile": [ "Generic PLA @MyToolChanger" ], diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index b898284d89..85903cb779 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1554,7 +1554,8 @@ static std::vector get_path_of_change_filament(const Print& print) interface_temp = gcodegen.config().nozzle_temperature_range_high.get_at(new_extruder_id); toolchange_temp_override = interface_temp; } - toolchange_gcode_str = gcodegen.set_extruder(new_extruder_id, tcr.print_z, false, toolchange_temp_override); // TODO: toolchange_z vs print_z + toolchange_gcode_str = gcodegen.set_extruder(new_extruder_id, tcr.print_z, false, toolchange_temp_override, + WipeTower2::wait_for_temp_enabled(gcodegen.m_config)); // TODO: toolchange_z vs print_z if (!travel_to_tower_now && !tcr.priming && WipeTower2::use_gap_wall(gcodegen.m_config)) { // The tool changed in place (multi-tool printer without ramming), so the // tower entry is the tcr's own positioning move — a straight line across @@ -1705,7 +1706,7 @@ static std::vector get_path_of_change_filament(const Print& print) std::string trimmed = line; trimmed.erase(0, trimmed.find_first_not_of(" \t")); bool skip_line = false; - if (boost::starts_with(trimmed, "M109")) { + if (boost::starts_with(trimmed, "M109") && trimmed.find(WipeTower2::wait_for_temp_tag()) == std::string::npos) { bool matches_extruder = true; if (trimmed.find('T') != std::string::npos) matches_extruder = trimmed.find(t_token) != std::string::npos; @@ -8939,7 +8940,7 @@ void GCode::update_placeholder_parser_with_variant_params() } } -std::string GCode::set_extruder(unsigned int new_filament_id, double print_z, bool by_object, int toolchange_temp_override) +std::string GCode::set_extruder(unsigned int new_filament_id, double print_z, bool by_object, int toolchange_temp_override, bool defer_temp_wait) { int new_extruder_id = get_extruder_id(new_filament_id); if (!m_writer.need_toolchange(new_filament_id)) @@ -9046,6 +9047,24 @@ std::string GCode::set_extruder(unsigned int new_filament_id, double print_z, bo if (toolchange_temp_override > 0) new_filament_temp = toolchange_temp_override; + // With wait_for_temp_on_wipe_tower the blocking M109 is deferred to the wipe tower, so raise + // the incoming filament's target here — ahead of the tool change rather than after it — and + // let the heat-up overlap the change itself as well as the travel to the tower. The command + // always carries an explicit tool index (the option is off for single extruder MM, so the + // writer emits one), leaving the outgoing filament that pre_toolchange just dropped to its + // standby temperature alone. nozzle_temperature == 0 means "use the first layer temperature". + if (defer_temp_wait) { + // Target what the tower will wait on. It waits on the first layer temperature not only on + // the first layer but also while priming, which runs before any layer is set: there + // on_first_layer() is false and print_z is the initial layer height, so neither test above + // catches it. nozzle_temperature == 0 means "use the first layer temperature" as well. + int preheat_temp = new_filament_temp; + if (toolchange_temp_override <= 0 && (m_layer == nullptr || preheat_temp <= 0)) + preheat_temp = m_config.nozzle_temperature_initial_layer.get_at(new_fi); + if (preheat_temp > 0) + gcode += m_writer.set_temperature(preheat_temp, false, new_filament_id); + } + Vec3d nozzle_pos = m_writer.get_position(); float old_retract_length, old_retract_length_toolchange, wipe_volume; int old_filament_temp, old_filament_e_feedrate; @@ -9349,8 +9368,10 @@ std::string GCode::set_extruder(unsigned int new_filament_id, double print_z, bo } check_add_eol(gcode); } - // Set the new extruder to the operating temperature. - if (m_ooze_prevention.enable) + // Set the new extruder to the operating temperature. With defer_temp_wait the target was + // already raised before the tool change and the blocking wait belongs to the wipe tower + // generator, so there is nothing left to restore here. + if (m_ooze_prevention.enable && !defer_temp_wait) gcode += m_ooze_prevention.post_toolchange(*this); if (m_config.enable_pressure_advance.get_at(new_filament_id)) { diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 47abf6be85..6346334889 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -262,7 +262,7 @@ public: std::string retract(bool toolchange = false, bool is_last_retraction = false, LiftType lift_type = LiftType::NormalLift, bool apply_instantly = false, ExtrusionRole role = erNone); // extra_retract forwards a PETG pre-extrusion over-extrusion; default 0 -> identical to the plain deretract. std::string unretract(float extra_retract = 0.f) { return m_writer.unlift() + m_writer.unretract(extra_retract); } - std::string set_extruder(unsigned int extruder_id, double print_z, bool by_object=false, int toolchange_temp_override = -1); + std::string set_extruder(unsigned int extruder_id, double print_z, bool by_object=false, int toolchange_temp_override = -1, bool defer_temp_wait = false); bool is_BBL_Printer(); WipeTowerType wipe_tower_type(); diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index 0837bfa908..34e4b6146f 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -413,6 +413,7 @@ public: const Vec2f& pos() const { return m_current_pos; } const Vec2f start_pos_rotated() const { return m_start_pos; } const Vec2f pos_rotated() const { return this->rotate(m_current_pos); } + const Vec2f rotated(const Vec2f &pt) const { return this->rotate(pt); } float elapsed_time() const { return m_elapsed_time; } float get_and_reset_used_filament_length() { float temp = m_used_filament_length; m_used_filament_length = 0.f; return temp; } @@ -624,10 +625,13 @@ public: } // Set extruder temperature, don't wait by default. - WipeTowerWriter2& set_extruder_temp(int temperature, bool wait = false) + WipeTowerWriter2& set_extruder_temp(int temperature, bool wait = false, const std::string& comment = std::string()) { flush_planner_queue(); - m_gcode += "M" + std::to_string(wait ? 109 : 104) + " S" + std::to_string(temperature) + "\n"; + m_gcode += "M" + std::to_string(wait ? 109 : 104) + " S" + std::to_string(temperature); + if (!comment.empty()) + m_gcode += " " + comment; + m_gcode += "\n"; return *this; } @@ -1006,6 +1010,13 @@ bool WipeTower2::use_gap_wall(const PrintConfig& config) return config.prime_tower_skip_points.value && config.wipe_tower_wall_type.value != wtwCone; } +bool WipeTower2::wait_for_temp_enabled(const PrintConfig& config) +{ + // SEMM runs its own unload/load temperature sequence; the GUI hides the option + // there but a profile may still carry it set. + return config.wait_for_temp_on_wipe_tower.value && !config.single_extruder_multi_material.value; +} + WipeTower2::WipeTower2(const PrintConfig& config, const PrintRegionConfig& default_region_config,int plate_idx, Vec3d plate_origin, const std::vector>& wiping_matrix, size_t initial_tool) : m_semm(config.single_extruder_multi_material.value), m_enable_filament_ramming(config.enable_filament_ramming.value), @@ -1035,7 +1046,8 @@ WipeTower2::WipeTower2(const PrintConfig& config, const PrintRegionConfig& defau m_wall_type((int)config.wipe_tower_wall_type), m_use_gap_wall(use_gap_wall(config)), m_enable_tower_interface_features(config.enable_tower_interface_features.value), - m_enable_tower_interface_cooldown_during_tower(config.enable_tower_interface_cooldown_during_tower.value) + m_enable_tower_interface_cooldown_during_tower(config.enable_tower_interface_cooldown_during_tower.value), + m_wait_for_temp_on_wipe_tower(wait_for_temp_enabled(config)) { // Read absolute value of first layer speed, if given as percentage, // it is taken over following default. Speeds from config are not @@ -1085,6 +1097,7 @@ WipeTower2::WipeTower2(const PrintConfig& config, const PrintRegionConfig& defau m_bed_bottom_left = m_bed_shape == RectangularBed ? Vec2f(bed_points.front().x(), bed_points.front().y()) : Vec2f::Zero(); + m_bed_polygon = Polygon::new_scale(bed_points); } @@ -1236,7 +1249,7 @@ std::vector WipeTower2::prime( unsigned int tool = tools[idx_tool]; m_left_to_right = true; - toolchange_Change(writer, tool, m_filpar[tool].material); // Select the tool, set a speed override for soluble and flex materials. + toolchange_Change(writer, tool, m_filpar[tool].material, m_filpar[tool].first_layer_temperature, false); // Select the tool, set a speed override for soluble and flex materials. toolchange_Load(writer, cleaning_box); // Prime the tool. if (idx_tool + 1 == tools.size()) { // Last tool should not be unloaded, but it should be wiped enough to become of a pure color. @@ -1355,13 +1368,19 @@ WipeTower::ToolChangeResult WipeTower2::tool_change(size_t tool) toolchange_Unload(writer, cleaning_box, m_filpar[m_current_tool].material, (is_first_layer() ? m_filpar[m_current_tool].first_layer_temperature : m_filpar[m_current_tool].temperature), new_tool_temp); - toolchange_Change(writer, tool, m_filpar[tool].material); // Change the tool, set a speed override for soluble and flex materials. + // Wait-at-tower target: the interface temp when an interface boost applies on this layer, + // otherwise the print temp (nozzle_temperature == 0 means "use the first layer temp"). + int wait_for_temp = interface_layer && m_filpar[tool].interface_print_temperature > 0 ? + m_filpar[tool].interface_print_temperature : + (is_first_layer() || m_filpar[tool].temperature == 0 ? m_filpar[tool].first_layer_temperature : m_filpar[tool].temperature); + toolchange_Change(writer, tool, m_filpar[tool].material, wait_for_temp, true); // Change the tool, set a speed override for soluble and flex materials. toolchange_Load(writer, cleaning_box); writer.travel(writer.x(), writer.y()-m_perimeter_width); // cooling and loading were done a bit down the road int base_temp = is_first_layer() ? m_filpar[tool].first_layer_temperature : m_filpar[tool].temperature; if (interface_layer) { int interface_temp = m_filpar[tool].interface_print_temperature; - if (interface_temp > 0 && interface_temp != base_temp) + // With wait-for-temp-on-wipe-tower the toolchange already blocked for the interface temp. + if (interface_temp > 0 && interface_temp != base_temp && !m_wait_for_temp_on_wipe_tower) writer.set_extruder_temp(interface_temp, true); if (m_enable_tower_interface_cooldown_during_tower && interface_temp > 0 && interface_temp != base_temp) writer.set_extruder_temp(base_temp, false); @@ -1671,7 +1690,9 @@ void WipeTower2::toolchange_Unload( void WipeTower2::toolchange_Change( WipeTowerWriter2 &writer, const size_t new_tool, - const std::string& new_material) + const std::string& new_material, + const int wait_for_temp, + const bool wait_beside_tower) { // Ask the writer about how much of the old filament we consumed: if (m_current_tool < m_used_filament_length.size()) @@ -1685,6 +1706,90 @@ void WipeTower2::toolchange_Change( if (m_is_mk4mmu3) writer.switch_filament_monitoring(true); + const bool wait_for_temp_here = m_wait_for_temp_on_wipe_tower && wait_for_temp > 0; + + // The Tn above was issued without a blocking temperature wait (GCode::set_extruder only raises + // the target, ahead of the Tn); block here, before the deretraction below, which must not + // extrude on a cold nozzle. Like the Bambu H2C, park beside the tower for the heat-up so drool lands + // next to it instead of on its top surface — nearest x side first, then that side clamped + // toward the bed edge, then the far side, in place if all would leave the bed. Raw + // pre-rotated moves (see the repositioning move below) keep the writer's tracked position + // at the tower entry. The tag keeps the + // interface-temp deduplication pass in append_tcr2 from stripping the M109. + if (wait_for_temp_here && wait_beside_tower) { + // The rib wall and the stabilization cone bulge past the nominal width rectangle + // (widest near the bottom), and the first-layer brim is printed around the wall later + // in the layer — clear the widest of them, not just the rectangle, so the park point + // and its drool stay off the tower. + float min_x = 0.f, max_x = m_wipe_tower_width; + if (m_wall_type == (int)wtwRib) { + WipeTower::box_coordinates wt_box(Vec2f(0.f, 0.f), m_wipe_tower_width, m_layer_info->depth + m_perimeter_width); + const BoundingBox rib_bbox = get_extents(generate_rib_polygon(wt_box)); // the fillet stays within this bbox + min_x = std::min(min_x, unscaled(rib_bbox.min.x())); + max_x = std::max(max_x, unscaled(rib_bbox.max.x())); + } else if (m_wall_type == (int)wtwCone) { + const double support_scale = get_wipe_tower_cone_base(m_wipe_tower_width, m_wipe_tower_height, m_wipe_tower_depth, + m_wipe_tower_cone_angle).second; + const double z = m_no_sparse_layers ? (m_current_height + m_layer_info->height) : m_layer_info->z; + const double r = std::tan(Geometry::deg2rad(m_wipe_tower_cone_angle / 2.f)) * (m_wipe_tower_height - z); + const double w = m_layer_info->depth + m_perimeter_width; + if (r > 0.5 * w + 0.01) { // same guard as generate_support_cone_wall + const float bulge = float(std::sqrt(r * r - 0.25 * w * w) / support_scale); + min_x = std::min(min_x, m_wipe_tower_width / 2.f - bulge); + max_x = std::max(max_x, m_wipe_tower_width / 2.f + bulge); + } + } + if (is_first_layer()) { + const float brim = m_wipe_tower_brim_width < 0.f ? WipeTower::get_auto_brim_by_height(m_wipe_tower_height) : + m_wipe_tower_brim_width; + min_x -= brim; + max_x += brim; + } + constexpr float gap = 2.f; + constexpr float min_gap = 0.5f; + const bool on_left = writer.x() < m_wipe_tower_width / 2.f; + const float near_x = on_left ? min_x - gap : max_x + gap; + const float far_x = on_left ? max_x + gap : min_x - gap; + const Eigen::Rotation2Df to_bed(float(Geometry::deg2rad(m_wipe_tower_rotation_angle))); + auto park_pt_on_bed = [this, &writer, to_bed](float side_x) { + const Vec2f bed_pt = to_bed * (writer.rotated(Vec2f(side_x, writer.y())) + m_rib_offset) + m_wipe_tower_pos; + return m_bed_polygon.contains(Point::new_scale(bed_pt.x(), bed_pt.y())); + }; + float park_x = near_x; + bool have_park = park_pt_on_bed(near_x); + if (!have_park) { + // The ideal near point hangs off the bed: pull it back to the bed edge as long + // as that still clears the tower envelope by min_gap (the BBL tower clamps its + // stop_pos against the bed the same way in append_tcr). Bisection, because with + // tower rotation and non-rectangular beds the bed edge is not axis-aligned. + const float limit_x = on_left ? min_x - min_gap : max_x + min_gap; + if (park_pt_on_bed(limit_x)) { + float on = limit_x, off = near_x; + for (int i = 0; i < 8; ++i) { + const float mid = 0.5f * (on + off); + if (park_pt_on_bed(mid)) + on = mid; + else + off = mid; + } + park_x = on; + have_park = true; + } + } + if (!have_park && park_pt_on_bed(far_x)) { + park_x = far_x; + have_park = true; + } + if (have_park) { + const Vec2f stop = writer.rotated(Vec2f(park_x, writer.y())); + writer.feedrate(m_travel_speed * 60.f) + .append(std::string("G1 X") + Slic3r::float_to_string_decimal_point(stop.x()) + + " Y" + Slic3r::float_to_string_decimal_point(stop.y()) + + never_skip_tag() + "\n"); + } + writer.set_extruder_temp(wait_for_temp, true, wait_for_temp_tag()); + } + // 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. 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. @@ -1695,6 +1800,10 @@ void WipeTower2::toolchange_Change( + never_skip_tag() + "\n" ); + // Priming has no tower to park beside — wait right at the priming line instead. + if (wait_for_temp_here && !wait_beside_tower) + writer.set_extruder_temp(wait_for_temp, true, wait_for_temp_tag()); + writer.append("[deretraction_from_wipe_tower_generator]"); // The toolchange Tn command will be inserted later, only in case that the user does diff --git a/src/libslic3r/GCode/WipeTower2.hpp b/src/libslic3r/GCode/WipeTower2.hpp index 3efa884202..ca9e73bb28 100644 --- a/src/libslic3r/GCode/WipeTower2.hpp +++ b/src/libslic3r/GCode/WipeTower2.hpp @@ -22,6 +22,9 @@ class WipeTower2 { public: static const std::string never_skip_tag() { return "_GCODE_WIPE_TOWER_NEVER_SKIP_TAG"; } + // Marks the wait-for-temp-on-wipe-tower M109 so the interface-temp deduplication pass + // in WipeTowerIntegration::append_tcr2 does not strip it. + static const std::string wait_for_temp_tag() { return ";_WAIT_FOR_TEMP_ON_WIPE_TOWER"; } static std::pair get_wipe_tower_cone_base(double width, double height, double depth, double angle_deg); static std::vector> extract_wipe_volumes(const PrintConfig& config); @@ -38,6 +41,11 @@ public: // Shared with the entry routing in GCode.cpp so the router and the tower agree. static bool use_gap_wall(const PrintConfig& config); + // Whether the blocking toolchange temperature wait moves onto the wipe tower. + // Shared with the defer flag in GCode.cpp append_tcr2 so the deferral and the + // tower's tagged M109 can never disagree. + static bool wait_for_temp_enabled(const PrintConfig& config); + // x -- x coordinates of wipe tower in mm ( left bottom corner ) // y -- y coordinates of wipe tower in mm ( left bottom corner ) // width -- width of wipe tower in mm ( default 60 mm - leave as it is ) @@ -227,6 +235,7 @@ private: size_t m_first_layer_idx = size_t(-1); bool m_enable_tower_interface_features = false; bool m_enable_tower_interface_cooldown_during_tower = false; + bool m_wait_for_temp_on_wipe_tower = false; bool m_prev_layer_had_interface = false; bool m_current_layer_has_interface = false; @@ -263,6 +272,7 @@ private: } m_bed_shape; float m_bed_width; // width of the bed bounding box Vec2f m_bed_bottom_left; // bottom-left corner coordinates (for rectangular beds) + Polygon m_bed_polygon; // printable_area contour (scaled) float m_perimeter_width = 0.4f * Width_To_Nozzle_Ratio; // Width of an extrusion line, also a perimeter spacing for 100% infill. float m_extrusion_flow = 0.038f; //0.029f;// Extrusion flow is derived from m_perimeter_width, layer height and filament diameter. @@ -385,7 +395,9 @@ private: void toolchange_Change( WipeTowerWriter2 &writer, const size_t new_tool, - const std::string& new_material); + const std::string& new_material, + const int wait_for_temp, + const bool wait_beside_tower); void toolchange_Load( WipeTowerWriter2 &writer, diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 47d448b69b..9ae8b86fd8 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -1423,7 +1423,7 @@ static std::vector s_Preset_printer_options { "use_relative_e_distances", "extruder_type", "use_firmware_retraction", "printer_notes", "grab_length", "support_object_skip_flush", "physical_extruder_map", "cooling_tube_retraction", - "cooling_tube_length", "high_current_on_filament_swap", "parking_pos_retraction", "extra_loading_move", "wipe_tower_type", "purge_in_prime_tower", "enable_filament_ramming", "tool_change_on_wipe_tower", + "cooling_tube_length", "high_current_on_filament_swap", "parking_pos_retraction", "extra_loading_move", "wipe_tower_type", "purge_in_prime_tower", "enable_filament_ramming", "tool_change_on_wipe_tower", "wait_for_temp_on_wipe_tower", "z_offset", "disable_m73", "preferred_orientation", "emit_machine_limits_to_gcode", "pellet_modded_printer", "support_multi_bed_types", "use_3mf", "default_bed_type", "bed_mesh_min","bed_mesh_max","bed_mesh_probe_distance", "adaptive_bed_mesh_margin", "enable_long_retraction_when_cut","long_retractions_when_cut","retraction_distances_when_cut", "bed_temperature_formula", "nozzle_flush_dataset", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 371f1e68ea..61025c89d7 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -282,6 +282,14 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n || opt_key == "wipe_tower_x" || opt_key == "wipe_tower_y" || opt_key == "wipe_tower_rotation_angle") { + // The tower gcode itself is position-independent (position and rotation are applied + // at export), except that the wait_for_temp_on_wipe_tower park bakes a bed-relative + // side choice into it (WipeTower2::toolchange_Change) — regenerate it when the tower + // moves. Gating on the old config is safe: both inputs of wait_for_temp_enabled + // invalidate psWipeTower themselves when they are part of the same diff. + if ((opt_key == "wipe_tower_x" || opt_key == "wipe_tower_y" || opt_key == "wipe_tower_rotation_angle") + && WipeTower2::wait_for_temp_enabled(m_config)) + steps.emplace_back(psWipeTower); steps.emplace_back(psSkirtBrim); } else if ( opt_key == "slicing_pipeline_plugin" @@ -382,6 +390,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n || opt_key == "wiping_volumes_extruders" || opt_key == "enable_filament_ramming" || opt_key == "tool_change_on_wipe_tower" + || opt_key == "wait_for_temp_on_wipe_tower" || opt_key == "purge_in_prime_tower" || opt_key == "z_offset" || opt_key == "support_multi_bed_types" diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 849b0754dc..fdb20253d6 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -6570,6 +6570,17 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionBool(false)); + def = this->add("wait_for_temp_on_wipe_tower", coBool); + def->label = L("Wait for temperature on wipe tower"); + def->tooltip = L("Pick up the new tool without waiting for it to reach printing temperature, travel to the wipe " + "tower, and wait for the temperature there, right before purging. Ooze from the heat-up lands on " + "the tower instead of the model, and the travel overlaps with the heating. " + "Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. " + "The firmware or tool change macro must not wait for the temperature itself. " + "When disabled, the temperature wait is issued right after the tool change command."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(false)); + def = this->add("wipe_tower_no_sparse_layers", coBool); def->label = L("No sparse layers (beta)"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index c1875e0288..6029d5bd88 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1660,6 +1660,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionBool, purge_in_prime_tower)) ((ConfigOptionBool, enable_filament_ramming)) ((ConfigOptionBool, tool_change_on_wipe_tower)) + ((ConfigOptionBool, wait_for_temp_on_wipe_tower)) ((ConfigOptionBool, support_multi_bed_types)) ((ConfigOptionBool, use_3mf)) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index f5cb3d045b..64c2b586c8 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -5627,6 +5627,7 @@ if (is_marlin_flavor) optgroup->append_single_option_line("purge_in_prime_tower", "printer_multimaterial_wipe_tower#purge-in-prime-tower"); optgroup->append_single_option_line("enable_filament_ramming", "printer_multimaterial_wipe_tower#enable-filament-ramming"); optgroup->append_single_option_line("tool_change_on_wipe_tower", "printer_multimaterial_wipe_tower#tool-change-on-wipe-tower"); + optgroup->append_single_option_line("wait_for_temp_on_wipe_tower", "printer_multimaterial_wipe_tower#wait-for-temperature-on-wipe-tower"); optgroup = page->new_optgroup(L("Single extruder multi-material parameters"), "param_settings"); @@ -6160,6 +6161,7 @@ void TabPrinter::toggle_options() // so the option is irrelevant there. const size_t extruders_count = m_config->option("nozzle_diameter")->size(); toggle_option("tool_change_on_wipe_tower", !bSEMM && supports_wipe_tower_2 && extruders_count > 1); + toggle_option("wait_for_temp_on_wipe_tower", !bSEMM && supports_wipe_tower_2 && extruders_count > 1); } wxString extruder_number; long val = 1; diff --git a/tests/data/wipe_tower_temperature_trace_main.txt b/tests/data/wipe_tower_temperature_trace_main.txt new file mode 100644 index 0000000000..b7453bdc93 --- /dev/null +++ b/tests/data/wipe_tower_temperature_trace_main.txt @@ -0,0 +1,167 @@ +# Temperature and tool-change commands of a wait_for_temp_on_wipe_tower-off slice, +# captured from the main branch at a10d9e77cf. Regeneration is described +# at the test that reads this file: "Toolchange temperature commands are unchanged +# when the wipe tower wait is off" in tests/fff_print/test_multifilament.cpp. +M104 S215 T0 ; set nozzle temperature +M104 S215 T1 ; set nozzle temperature +; CP PRIMING START +T1 ; change extruder +M109 S215 T1 ; set nozzle temperature and wait for it to be reached +M104 S175 T1 ; set nozzle temperature ;cooldown +T0 ; change extruder +M109 S215 T0 ; set nozzle temperature and wait for it to be reached +; CP PRIMING END +M104 S215 T1 ; preheat T1 time: 30s lead 30.2s +; CP TOOLCHANGE START +M104 S175 T0 ; set nozzle temperature ;cooldown +T1 ; change extruder +M109 S215 T1 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T1 ; set nozzle temperature +M104 S240 T0 ; preheat T0 time: 30s lead 30.0s +; CP TOOLCHANGE START +M104 S200 T1 ; set nozzle temperature ;cooldown +T0 ; change extruder +M109 S240 T0 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T1 ; preheat T1 time: 30s lead 30.4s +; CP TOOLCHANGE START +M104 S200 T0 ; set nozzle temperature ;cooldown +T1 ; change extruder +M109 S240 T1 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T0 ; preheat T0 time: 31s lead 30.9s +; CP TOOLCHANGE START +M104 S200 T1 ; set nozzle temperature ;cooldown +T0 ; change extruder +M109 S240 T0 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T1 ; preheat T1 time: 30s lead 30.2s +; CP TOOLCHANGE START +M104 S200 T0 ; set nozzle temperature ;cooldown +T1 ; change extruder +M109 S240 T1 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T0 ; preheat T0 time: 30s lead 30.2s +; CP TOOLCHANGE START +M104 S200 T1 ; set nozzle temperature ;cooldown +T0 ; change extruder +M109 S240 T0 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T1 ; preheat T1 time: 30s lead 30.2s +; CP TOOLCHANGE START +M104 S200 T0 ; set nozzle temperature ;cooldown +T1 ; change extruder +M109 S240 T1 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T0 ; preheat T0 time: 30s lead 30.2s +; CP TOOLCHANGE START +M104 S200 T1 ; set nozzle temperature ;cooldown +T0 ; change extruder +M109 S240 T0 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T1 ; preheat T1 time: 30s lead 30.2s +; CP TOOLCHANGE START +M104 S200 T0 ; set nozzle temperature ;cooldown +T1 ; change extruder +M109 S240 T1 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T0 ; preheat T0 time: 30s lead 30.2s +; CP TOOLCHANGE START +M104 S200 T1 ; set nozzle temperature ;cooldown +T0 ; change extruder +M109 S240 T0 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T1 ; preheat T1 time: 31s lead 30.7s +; CP TOOLCHANGE START +M104 S200 T0 ; set nozzle temperature ;cooldown +T1 ; change extruder +M109 S240 T1 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T0 ; preheat T0 time: 31s lead 30.6s +; CP TOOLCHANGE START +M104 S200 T1 ; set nozzle temperature ;cooldown +T0 ; change extruder +M109 S240 T0 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T1 ; preheat T1 time: 30s lead 30.3s +; CP TOOLCHANGE START +M104 S200 T0 ; set nozzle temperature ;cooldown +T1 ; change extruder +M109 S240 T1 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T0 ; preheat T0 time: 31s lead 30.6s +; CP TOOLCHANGE START +M104 S200 T1 ; set nozzle temperature ;cooldown +T0 ; change extruder +M109 S240 T0 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T1 ; preheat T1 time: 30s lead 30.0s +; CP TOOLCHANGE START +M104 S200 T0 ; set nozzle temperature ;cooldown +T1 ; change extruder +M109 S240 T1 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T0 ; preheat T0 time: 30s lead 30.2s +; CP TOOLCHANGE START +M104 S200 T1 ; set nozzle temperature ;cooldown +T0 ; change extruder +M109 S240 T0 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T1 ; preheat T1 time: 30s lead 30.2s +; CP TOOLCHANGE START +M104 S200 T0 ; set nozzle temperature ;cooldown +T1 ; change extruder +M109 S240 T1 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T0 ; preheat T0 time: 30s lead 30.2s +; CP TOOLCHANGE START +M104 S200 T1 ; set nozzle temperature ;cooldown +T0 ; change extruder +M109 S240 T0 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T1 ; preheat T1 time: 30s lead 30.2s +; CP TOOLCHANGE START +M104 S200 T0 ; set nozzle temperature ;cooldown +T1 ; change extruder +M109 S240 T1 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T0 ; preheat T0 time: 30s lead 30.2s +; CP TOOLCHANGE START +M104 S200 T1 ; set nozzle temperature ;cooldown +T0 ; change extruder +M109 S240 T0 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T1 ; preheat T1 time: 31s lead 30.7s +; CP TOOLCHANGE START +M104 S200 T0 ; set nozzle temperature ;cooldown +T1 ; change extruder +M109 S240 T1 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T0 ; preheat T0 time: 30s lead 30.4s +; CP TOOLCHANGE START +M104 S200 T1 ; set nozzle temperature ;cooldown +T0 ; change extruder +M109 S240 T0 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T1 ; preheat T1 time: 30s lead 30.4s +; CP TOOLCHANGE START +M104 S200 T0 ; set nozzle temperature ;cooldown +T1 ; change extruder +M109 S240 T1 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T0 ; preheat T0 time: 30s lead 30.0s +; CP TOOLCHANGE START +M104 S200 T1 ; set nozzle temperature ;cooldown +T0 ; change extruder +M109 S240 T0 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +M104 S240 T1 ; preheat T1 time: 30s lead 30.0s +; CP TOOLCHANGE START +M104 S200 T0 ; set nozzle temperature ;cooldown +T1 ; change extruder +M109 S240 T1 ; set nozzle temperature and wait for it to be reached +; CP TOOLCHANGE END +; CP TOOLCHANGE START +; CP TOOLCHANGE END +M104 S0 ; turn off temperature diff --git a/tests/fff_print/test_multifilament.cpp b/tests/fff_print/test_multifilament.cpp index f33a8e1e61..081c0fa2ba 100644 --- a/tests/fff_print/test_multifilament.cpp +++ b/tests/fff_print/test_multifilament.cpp @@ -1,12 +1,24 @@ #include +#include "libslic3r/GCode/GCodeProcessor.hpp" #include "libslic3r/GCodeReader.hpp" #include "test_helpers.hpp" +#include "test_utils.hpp" +#include #include +#include +#include +#include +#include +#include +#include #include +#include #include +#include +#include using namespace Slic3r; using namespace Slic3r::Test; @@ -27,6 +39,156 @@ static std::set tools_for_role(const std::string& gcode, const std::string& return tools; } +// X where the nozzle sits while each tagged _WAIT_FOR_TEMP_ON_WIPE_TOWER M109 blocks: +// the nearest preceding G1 carrying an X (the park travel emitted just before the wait). +static std::vector wait_park_xs(const std::string& gcode) +{ + std::vector lines; + std::istringstream stream(gcode); + for (std::string line; std::getline(stream, line);) + lines.emplace_back(std::move(line)); + std::vector xs; + for (size_t i = 0; i < lines.size(); ++i) { + if (lines[i].rfind("M109", 0) != 0 || lines[i].find("_WAIT_FOR_TEMP_ON_WIPE_TOWER") == std::string::npos) + continue; + for (size_t j = i; j-- > 0;) { + if (lines[j].rfind("G1 ", 0) != 0) + continue; + const size_t x_pos = lines[j].find('X'); + if (x_pos == std::string::npos) + continue; + xs.push_back(std::stod(lines[j].substr(x_pos + 1))); + break; + } + } + return xs; +} + +// Estimated print time at each 1-based line of an exported G-code file, from a second +// GCodeProcessor pass over it. MoveVertex::time is the duration of one move and gcode_id is the +// line it came from (already rebased past the M73 insertions), so the running sum before the first +// move of a line is the elapsed time at that line. The file carries its own config footer, so +// process_file configures the processor -- including the shared s_IsBBLPrinter static that other +// tests in this binary mutate -- from the settings the export itself used. +static std::vector elapsed_time_by_line(const std::string& gcode) +{ + ScopedTemporaryFile temp_gcode(".gcode"); + { + std::ofstream os(temp_gcode.string()); + os << gcode; + } + GCodeProcessor processor; + processor.process_file(temp_gcode.string()); + + constexpr size_t NORMAL = size_t(PrintEstimatedStatistics::ETimeMode::Normal); + const size_t n_lines = size_t(std::count(gcode.begin(), gcode.end(), '\n')) + 2; + std::vector elapsed(n_lines, 0.); + double running = 0.; + size_t next = 0; + for (const auto& move : processor.get_result().moves) { + const size_t id = std::min(move.gcode_id, n_lines - 1); + while (next <= id) + elapsed[next++] = running; + running += move.time[NORMAL]; + } + while (next < n_lines) + elapsed[next++] = running; + return elapsed; +} + +// The temperature-relevant projection of `gcode`: every M104/M109/Tn line, plus the toolchange and +// priming markers that anchor them, in order. A preheat -- an M104 the GCodeProcessor backtrace +// inserts mid-object, outside any block, naming a tool other than the one currently loaded -- also +// carries "lead s", the estimated time from there to the tool change it heats for, which is the +// property preheat_time controls. No other temperature command gets one: for an M104 retargeting +// the active tool (the first-layer-to-other-layers bump) or one inside a block, the distance to the +// next Tn is a layer time or a handful of moves and says nothing about preheat_time. Everything +// else is dropped, so the trace does not move when travel, tower geometry or line numbering do. +static std::vector temperature_trace(const std::string& gcode) +{ + std::vector lines; + std::istringstream stream(gcode); + for (std::string line; std::getline(stream, line);) { + line.erase(0, line.find_first_not_of(" \t")); + while (!line.empty() && (line.back() == '\r' || line.back() == ' ' || line.back() == '\t')) + line.pop_back(); + lines.emplace_back(std::move(line)); + } + const std::vector elapsed = elapsed_time_by_line(gcode); + + const auto is_tool = [](const std::string& l) { return l.size() >= 2 && l[0] == 'T' && std::isdigit((unsigned char) l[1]); }; + const auto is_temp = [](const std::string& l) { return l.rfind("M104", 0) == 0 || l.rfind("M109", 0) == 0; }; + const auto marker = [](const std::string& l) -> const char* { + for (const char* m : { "; CP TOOLCHANGE START", "; CP TOOLCHANGE END", "; CP PRIMING START", "; CP PRIMING END" }) + if (l.find(m) != std::string::npos) + return m; + return nullptr; + }; + + // Tool a "T" line, or the "T" argument of an M104, names -- or -1 when it names none. + const auto tool_of = [&is_tool](const std::string& l) -> int { + size_t t = std::string::npos; // index of the 'T' + if (is_tool(l)) + t = 0; + else if (l.rfind("M104", 0) == 0 && l.find(" T") != std::string::npos) + t = l.find(" T") + 1; + if (t == std::string::npos || t + 1 >= l.size() || !std::isdigit((unsigned char) l[t + 1])) + return -1; + return std::stoi(l.substr(t + 1)); + }; + + std::vector trace; + bool in_block = false; + int current_tool = -1; + for (size_t i = 0; i < lines.size(); ++i) { + if (const char* m = marker(lines[i])) { + in_block = std::string(m).find("START") != std::string::npos; + trace.emplace_back(m); // the marker alone: some carry a trailing tool id, some do not + } else if (is_tool(lines[i]) || is_temp(lines[i])) { + std::string entry = lines[i]; + const int named = tool_of(lines[i]); + if (!in_block && lines[i].rfind("M104", 0) == 0 && current_tool != -1 && named != -1 && named != current_tool) { + size_t tn = i; + while (tn < lines.size() && !is_tool(lines[tn])) + ++tn; + if (tn < lines.size()) { + char lead[32]; + std::snprintf(lead, sizeof(lead), "\tlead %.1fs", elapsed[tn + 1] - elapsed[i + 1]); + entry += lead; + } + } + if (is_tool(lines[i])) + current_tool = named; + trace.emplace_back(std::move(entry)); + } + } + return trace; +} + +// Splits a trace entry into its command text and the lead time appended after a tab, if any. +static std::pair> split_lead(const std::string& entry) +{ + const size_t tab = entry.find('\t'); + if (tab == std::string::npos) + return { entry, std::nullopt }; + const std::string tail = entry.substr(tab + 1); // "lead 30.2s" + return { entry.substr(0, tab), std::stod(tail.substr(tail.find(' ') + 1)) }; +} + +// Same command, and a lead time within half a second. The lead is an estimate summed over every +// move before it, so it drifts slightly with unrelated changes to travel or tower geometry; half a +// second is far below the tens of seconds a preheat leaving its backtrace position would shift it. +static bool trace_entries_match(const std::string& a, const std::string& b) +{ + const auto x = split_lead(a); + const auto y = split_lead(b); + if (x.first != y.first) + return false; + if (x.second.has_value() != y.second.has_value()) + return false; + return !x.second.has_value() || std::abs(*x.second - *y.second) <= 0.5; +} + // Tool index = filament id - 1; brim and skirt follow the wall filament. TEST_CASE("Each feature prints with its assigned filament", "[MultiFilament]") { @@ -86,6 +248,389 @@ TEST_CASE("Per-object wall filament override is honored", "[MultiFilament]") CHECK(tools_for_role(gcode, "infill") == std::set{ 0 }); // infill not overridden: stays on F1 } +// With wait_for_temp_on_wipe_tower the blocking M109 moves from right after the Tn command to +// a stop point parked beside the wipe tower (heat-up drool falls next to the tower, not onto +// its top): tagged with _WAIT_FOR_TEMP_ON_WIPE_TOWER, after the toolchange and before the +// repositioning move and the first extrusion of the purge. The restore that used to block there +// demotes to a non-blocking M104 and moves ahead of the Tn, so the incoming tool heats up over +// the change itself. Ordering and the off-tower stop are the contract here. +TEST_CASE("Toolchange temperature wait moves to the wipe tower when enabled", "[MultiFilament]") +{ + const bool wait_on_tower = GENERATE(false, true); + DYNAMIC_SECTION("wait_for_temp_on_wipe_tower " << (wait_on_tower ? 1 : 0)) { + const std::string gcode = slice_with_object_overrides( + { cube(20), cube(20) }, + multifilament_config(2, { + { "nozzle_diameter", "0.4,0.4" }, + { "printer_extruder_id", "1,2" }, + { "printer_extruder_variant", "Direct Drive Standard,Direct Drive Standard" }, + { "extruder_printable_height", "0,0" }, + { "single_extruder_multi_material", 0 }, + { "enable_prime_tower", 1 }, + { "prime_tower_width", 35 }, + { "wipe_tower_x", "50" }, + { "wipe_tower_y", "50" }, + { "ooze_prevention", 1 }, + { "standby_temperature_delta", -40 }, + // The post-processor's own preheat pass also inserts an M104 for the incoming + // filament ahead of the Tn; switch it off so the temperature commands under test + // are the only ones in the toolchange block. + { "preheat_time", 0 }, + { "wait_for_temp_on_wipe_tower", wait_on_tower ? 1 : 0 }, + }), + // One filament per object -> a toolchange on every layer. Assigned at the object + // level: the used-filament count that gates the prime tower is derived from + // object/volume configs on the harness's single apply (region filament ids such + // as sparse_infill_filament_id are not counted there and the tower would be + // silently disabled). + { { { "extruder", 1 } }, { { "extruder", 2 } } }); + + // Split into lines and scan the "; CP TOOLCHANGE START".."; CP TOOLCHANGE END" blocks. + std::vector lines; + std::istringstream gcode_stream(gcode); + for (std::string line; std::getline(gcode_stream, line);) + lines.emplace_back(std::move(line)); + const auto is_tool_line = [](const std::string& l) { return l.size() >= 2 && l[0] == 'T' && std::isdigit((unsigned char)l[1]); }; + const auto is_m109_line = [](const std::string& l) { return l.rfind("M109", 0) == 0; }; + // A non-blocking set-temperature naming one specific tool, e.g. "M104 S255 T1". + const auto is_m104_for_tool = [](const std::string& l, int tool) { + if (l.rfind("M104", 0) != 0) + return false; + const std::string token = " T" + std::to_string(tool); + const size_t at = l.find(token); + return at != std::string::npos && !std::isdigit((unsigned char)l[at + token.size()]); + }; + const auto is_tagged_wait = [](const std::string& l) { return l.find("_WAIT_FOR_TEMP_ON_WIPE_TOWER") != std::string::npos; }; + const auto is_extruding = [](const std::string& l) { + if (l.rfind("G1 ", 0) != 0) + return false; + const size_t e = l.find(" E"); + return e != std::string::npos && l.find_first_of("XY") != std::string::npos && l[e + 2] != '-'; + }; + + int checked_blocks = 0; + for (size_t i = 0; i < lines.size(); ++i) { + if (lines[i].find("; CP TOOLCHANGE START") == std::string::npos) + continue; + size_t block_end = i; + while (block_end < lines.size() && lines[block_end].find("; CP TOOLCHANGE END") == std::string::npos) + ++block_end; + size_t tool_line = block_end; + for (size_t j = i; j < block_end; ++j) + if (is_tool_line(lines[j])) { tool_line = j; break; } + if (tool_line == block_end) + continue; // final unload block, no toolchange + ++checked_blocks; + + // Where the incoming tool's target temperature is raised, relative to its Tn. + const int new_tool = std::stoi(lines[tool_line].substr(1)); + size_t preheat = tool_line, restore = block_end; + for (size_t j = i; j < tool_line; ++j) + if (is_m104_for_tool(lines[j], new_tool)) { preheat = j; break; } + for (size_t j = tool_line + 1; j < block_end; ++j) + if (is_m104_for_tool(lines[j], new_tool)) { restore = j; break; } + + size_t tagged_wait = block_end, untagged_m109 = block_end, first_extrusion = block_end; + for (size_t j = tool_line + 1; j < block_end; ++j) { + if (is_m109_line(lines[j]) && tagged_wait == block_end && is_tagged_wait(lines[j])) + tagged_wait = j; + if (is_m109_line(lines[j]) && untagged_m109 == block_end && !is_tagged_wait(lines[j])) + untagged_m109 = j; + if (first_extrusion == block_end && is_extruding(lines[j])) + first_extrusion = j; + } + INFO("toolchange block at line " << i + 1); + if (wait_on_tower) { + // The only blocking wait is the tagged one, parked beside the tower before the purge. + REQUIRE(tagged_wait < block_end); + CHECK(untagged_m109 == block_end); + // The target is raised ahead of the toolchange, so the incoming tool heats up + // while it is picked up, and nothing sets it again afterwards. + CHECK(preheat < tool_line); + CHECK(restore == block_end); + REQUIRE(first_extrusion < block_end); + CHECK(tagged_wait < first_extrusion); + // The travel preceding the wait parks outside the tower footprint. The tower + // auto-sizes, so derive its extent from the purge extrusions of this block. + size_t stop_line = block_end; + for (size_t j = tagged_wait; j-- > tool_line;) + if (lines[j].rfind("G1 ", 0) == 0 && lines[j].find('X') != std::string::npos) { stop_line = j; break; } + REQUIRE(stop_line < block_end); + const double stop_x = std::stod(lines[stop_line].substr(lines[stop_line].find('X') + 1)); + double purge_min_x = std::numeric_limits::max(), purge_max_x = std::numeric_limits::lowest(); + for (size_t j = tagged_wait; j < block_end; ++j) { + const size_t x_pos = lines[j].find('X'); + if (!is_extruding(lines[j]) || x_pos == std::string::npos) + continue; + const double x = std::stod(lines[j].substr(x_pos + 1)); + purge_min_x = std::min(purge_min_x, x); + purge_max_x = std::max(purge_max_x, x); + } + REQUIRE(purge_min_x <= purge_max_x); + INFO("stop travel: " << lines[stop_line] << " purge x range: " << purge_min_x << ".." << purge_max_x); + const bool beside_tower = stop_x < purge_min_x - 0.5 || stop_x > purge_max_x + 0.5; + CHECK(beside_tower); + } else { + // Stock behavior: the blocking wait follows the toolchange command directly, and + // nothing raises the incoming tool's target before it. + REQUIRE(untagged_m109 < block_end); + CHECK(tagged_wait == block_end); + CHECK(preheat == tool_line); + if (first_extrusion < block_end) + CHECK(untagged_m109 < first_extrusion); + } + i = block_end; + } + REQUIRE(checked_blocks > 0); + if (!wait_on_tower) + CHECK(gcode.find("_WAIT_FOR_TEMP_ON_WIPE_TOWER") == std::string::npos); + } +} + +// Priming runs before the first layer is set up, so set_extruder sees no layer at all: its +// on_first_layer() test is false and print_z is the initial layer height rather than 0. The +// tower nonetheless blocks on the first layer temperature there, so the pre-heat raised ahead +// of each priming Tn has to name that same temperature — pre-heating to the "other layers" +// value instead leaves the tagged M109 asking the firmware to cool back down before the +// priming lines are extruded. +TEST_CASE("Wipe tower priming pre-heats to the first layer temperature", "[MultiFilament]") +{ + const std::string gcode = slice_with_object_overrides( + { cube(20), cube(20) }, + multifilament_config(2, { + { "nozzle_diameter", "0.4,0.4" }, + { "printer_extruder_id", "1,2" }, + { "printer_extruder_variant", "Direct Drive Standard,Direct Drive Standard" }, + { "extruder_printable_height", "0,0" }, + { "single_extruder_multi_material", 0 }, + { "single_extruder_multi_material_priming", 1 }, + { "enable_prime_tower", 1 }, + { "prime_tower_width", 35 }, + { "wipe_tower_x", "50" }, + { "wipe_tower_y", "50" }, + { "preheat_time", 0 }, // see the wait test above + // Distinct enough that picking the wrong one is unambiguous. + { "nozzle_temperature_initial_layer", "215,215" }, + { "nozzle_temperature", "240,240" }, + { "wait_for_temp_on_wipe_tower", 1 }, + }), + { { { "extruder", 1 } }, { { "extruder", 2 } } }); + + std::vector lines; + std::istringstream gcode_stream(gcode); + for (std::string line; std::getline(gcode_stream, line);) + lines.emplace_back(std::move(line)); + // Temperature of an M104/M109, or -1 when the line is neither. + const auto temp_of = [](const std::string& l) { + if (l.rfind("M104", 0) != 0 && l.rfind("M109", 0) != 0) + return -1; + const size_t s = l.find('S'); + return s == std::string::npos ? -1 : std::stoi(l.substr(s + 1)); + }; + + size_t start = lines.size(), end = lines.size(); + for (size_t i = 0; i < lines.size(); ++i) { + if (start == lines.size() && lines[i].find("; CP PRIMING START") != std::string::npos) + start = i; + else if (start < lines.size() && lines[i].find("; CP PRIMING END") != std::string::npos) { + end = i; + break; + } + } + REQUIRE(start < end); + + int checked_waits = 0; + for (size_t i = start; i < end; ++i) { + if (lines[i].find("_WAIT_FOR_TEMP_ON_WIPE_TOWER") == std::string::npos) + continue; + ++checked_waits; + INFO("priming wait at line " << i + 1 << ": " << lines[i]); + CHECK(temp_of(lines[i]) == 215); // the tower waits on the first layer temperature + // The most recent set-temperature before it is the pre-heat, and must agree with it. + int preheat = -1; + for (size_t j = i; j-- > start;) + if ((preheat = temp_of(lines[j])) != -1) + break; + CHECK(preheat == 215); + } + REQUIRE(checked_waits > 0); // the feature under test is active +} + +// The temperature-wait park picks its side of the tower by testing bed containment with the +// tower position at psWipeTower generation time, while WipeTowerIntegration shifts the cached +// moves by the CURRENT position at export. Moving the tower normally invalidates only +// psSkirtBrim (tower gcode is position-independent), but the park makes it bed-relative, so a +// GUI-style move-and-reslice on the same Print must regenerate the tower — otherwise the stale +// park prints outside the bed. Contract: every tagged wait parks inside the printable area. +TEST_CASE("Wipe tower temperature-wait park is regenerated when the tower moves", "[MultiFilament]") +{ + // Two objects, one filament each: a toolchange (and a tagged wait) on every layer, like + // the wait test above — but on a single-extruder machine profile: the synthetic + // dual-extruder keys would drag in the extruder-variant expansion, which is not + // idempotent on the default machine profile and would pollute the re-apply diff below. + // Rectangle wall and no brim keep the tower-local footprint inside [0, 35], so the park + // sits at the generator's 2mm side gap: local -2 or 37. + DynamicPrintConfig config = multifilament_config(2, { + { "single_extruder_multi_material", 0 }, + { "enable_prime_tower", 1 }, + { "prime_tower_width", 35 }, + { "wipe_tower_wall_type", "rectangle" }, // the default rib bulges past the width + { "prime_tower_brim_width", 0 }, // the default 3 widens the first-layer envelope + { "printable_area", "0x0,200x0,200x200,0x200" }, + { "wipe_tower_x", "0" }, + { "wipe_tower_y", "50" }, + { "ooze_prevention", 1 }, + { "standby_temperature_delta", -40 }, + { "wait_for_temp_on_wipe_tower", 1 }, + }); + // init_print force-sets this on its own copy; set it here too so the re-apply below + // diffs in wipe_tower_x ONLY — the exact GUI increment under test. + config.set_key_value("gcode_comments", new ConfigOptionBool(true)); + + Print print; + Model model; + const std::vector> overrides{ + { { "extruder", 1 } }, { { "extruder", 2 } } }; // object-level, see the wait test above + init_print(std::vector{ cube(20), cube(20) }, print, model, config, &overrides); + + const std::string at_edge = gcode(print); + const std::vector at_edge_parks = wait_park_xs(at_edge); + REQUIRE(!at_edge_parks.empty()); // the feature under test is active + for (double x : at_edge_parks) { + INFO("wait park X " << x << " with the tower at x=0 on a 200mm bed"); + CHECK(x >= -0.05); + CHECK(x <= 200.05); + } + REQUIRE(print.is_step_done(psWipeTower)); + + // Move the tower to the right bed edge (164 + 35 = 199 keeps the body printable) and + // re-apply on the SAME Print, as the GUI does. Base the re-apply on the print's own + // resolved config so the diff is wipe_tower_x alone — re-applying the caller's config + // would also diff the apply-time extruder normalization write-backs, and those keys + // regenerate the tower for the wrong reason. The cached right-side park would export + // at 164 + 37 = 201, off the bed; regeneration clamps the park against the bed edge. + // Assemble the moved config exactly the way init_print assembled the first one — the + // apply-time normalization is only idempotent when both applies start from the same + // derivation, and any stray diff key would regenerate the tower for the wrong reason. + config.set_deserialize_strict({ { "wipe_tower_x", "164" } }); + DynamicPrintConfig moved_config = DynamicPrintConfig::full_print_config(); + moved_config.apply(config); + moved_config.set_key_value("gcode_comments", new ConfigOptionBool(true)); + print.apply(model, moved_config); + CHECK_FALSE(print.is_step_done(psWipeTower)); // the move must re-generate the tower + + const std::string moved = gcode(print); + const std::vector moved_parks = wait_park_xs(moved); + REQUIRE(!moved_parks.empty()); // the waits must survive the re-slice + for (double x : moved_parks) { + INFO("wait park X " << x << " with the tower at x=164 on a 200mm bed"); + CHECK(x >= -0.05); + CHECK(x <= 200.05); + } +} + +// The flag-off half of the three tests above. Every site wait_for_temp_on_wipe_tower touches is +// guarded -- set_extruder's pre-toolchange preheat block and its post_toolchange skip, +// toolchange_Change's park, the interface-temp guard in WipeTower2::tool_change, and append_tcr2's +// tagged-M109 filter -- so with the option off the feature has to be inert and temperature emission +// has to stay exactly as it was before the option existed. That is pinned against a trace captured +// from main rather than against expectations written from the current code, which would be +// re-derived from the very code they are meant to guard. +// +// Note what main emits here, since it is easy to misread as a missing wait: with preheat_time set, +// the toolchange carries no blocking M109 at all. GCodeProcessor's backtrace moves the heat-up to +// an M104 preheat_time seconds earlier and demotes the in-place command, which is the entire point +// of preheating. The lead times below are what pin that placement. +TEST_CASE("Toolchange temperature commands are unchanged when the wipe tower wait is off", "[MultiFilament][Regression]") +{ + // 20x20x5 cubes at the default 0.2mm layer height are 25 layers, one filament each, so there is + // a toolchange -- and a preheat ahead of it -- on every layer. + const std::string gcode = slice_with_object_overrides( + { make_cube(20., 20., 5.), make_cube(20., 20., 5.) }, + multifilament_config(2, { + { "nozzle_diameter", "0.4,0.4" }, + { "printer_extruder_id", "1,2" }, + { "printer_extruder_variant", "Direct Drive Standard,Direct Drive Standard" }, + { "extruder_printable_height", "0,0" }, + { "single_extruder_multi_material", 0 }, + { "single_extruder_multi_material_priming", 1 }, // reaches toolchange_Change's priming path + { "enable_prime_tower", 1 }, + { "prime_tower_width", 35 }, + { "wipe_tower_x", "50" }, + { "wipe_tower_y", "50" }, + // GCodeProcessor::apply_config enables the preheat backtrace on + // ooze_prevention && preheat_time > 0 && !SEMM && filaments > 1. That is what puts an + // M104 preheat_time seconds ahead of every Tn, and it also gives set_extruder's + // standby/restore pair, which the option demotes and moves when it is on. + { "ooze_prevention", 1 }, + { "standby_temperature_delta", -40 }, + { "preheat_time", 30 }, + { "preheat_steps", 1 }, + // enable_tower_interface_features is deliberately left off: the interface temperature + // is observable only through a change_filament_gcode template that reads + // new_filament_temp, since append_tcr2 strips the tower's own M109 for it, and the + // default template here has none. The option's interface-temp guard is covered by the + // enabled-path tests above instead. + // + // Distinct enough that a wrong pick between the two is unambiguous in the trace. + { "nozzle_temperature_initial_layer", "215,215" }, + { "nozzle_temperature", "240,240" }, + { "wait_for_temp_on_wipe_tower", 0 }, + }), + // Object-level, so the used-filament count that gates the prime tower is derived from it. + { { { "extruder", 1 } }, { { "extruder", 2 } } }); + + const std::vector trace = temperature_trace(gcode); + REQUIRE(trace.size() > 1); + CHECK(gcode.find("_WAIT_FOR_TEMP_ON_WIPE_TOWER") == std::string::npos); + + const std::string golden_path = std::string(TEST_DATA_DIR PATH_SEPARATOR "wipe_tower_temperature_trace_main.txt"); + + // Regenerate by appending this test and its helpers to the same file on main (dropping the + // wait_for_temp_on_wipe_tower key, which main's config does not know), rebuilding + // fff_print_tests there, running it with ORCA_UPDATE_WIPE_TOWER_TEMP_TRACE=1, copying the file + // it writes back here, and filling in the commit it was captured from. + if (std::getenv("ORCA_UPDATE_WIPE_TOWER_TEMP_TRACE") != nullptr) { + std::ofstream out(golden_path); + REQUIRE(out.good()); + out << "# Temperature and tool-change commands of a wait_for_temp_on_wipe_tower-off slice,\n" + "# captured from the main branch at . Regeneration is described\n" + "# at the test that reads this file: \"Toolchange temperature commands are unchanged\n" + "# when the wipe tower wait is off\" in tests/fff_print/test_multifilament.cpp.\n"; + for (const std::string& entry : trace) + out << entry << "\n"; + WARN("Rewrote " << golden_path << " from this run; it no longer reflects main."); + return; + } + + std::vector golden; + { + std::ifstream in(golden_path); + INFO("reading " << golden_path); + REQUIRE(in.good()); + for (std::string line; std::getline(in, line);) { + if (!line.empty() && line.back() == '\r') + line.pop_back(); + if (!line.empty() && line[0] != '#') + golden.push_back(std::move(line)); + } + } + REQUIRE(!golden.empty()); + + const size_t common = std::min(trace.size(), golden.size()); + for (size_t i = 0; i < common; ++i) { + if (trace_entries_match(trace[i], golden[i])) + continue; + // Report the first difference only: past it the two are misaligned and every later entry + // would be reported as a difference too. + INFO("first difference at trace entry " << i + 1); + INFO(" main: " << golden[i]); + INFO(" branch: " << trace[i]); + FAIL("temperature emission differs from main with wait_for_temp_on_wipe_tower off"); + } + CHECK(trace.size() == golden.size()); +} + // max_layer_height can be shorter than the extruder count (normalization sizes it to the // filament count under single_extruder_multi_material). calc_max_layer_height() in ToolOrdering // indexed it per-nozzle and read past the end. Shortened directly here to isolate that read; @@ -104,3 +649,4 @@ TEST_CASE("Multi-extruder slice stays in bounds with a short max_layer_height", init_and_process_print({ cube(20) }, print, config); REQUIRE_FALSE(print.objects().front()->layers().empty()); } + From 7c73739e1aefb6865be7eea89cad03cd679551a8 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Thu, 6 Aug 2026 12:45:39 +0800 Subject: [PATCH 073/106] Keep the prime tower and its approach travel on non-rectangular beds The placement clamps and the tower-approach router both stood in the bed's bounding box for the bed itself, so on a delta or hexagonal bed the prime tower could be parked in a corner that does not exist and the nozzle could be routed across it. Both now test the real printable outline, slicing reports a tower that does not fit instead of printing it off the bed, and a tower parked near an edge is routed along the clamped side rather than falling back to a straight line across the tower. Also fixes the placement validation rotating the tower hull by degrees read as radians about the plate origin, and never rotating the generated tower footprint at all. --- src/libslic3r/GCode.cpp | 95 ++++++++++++++++------------- src/libslic3r/GCode.hpp | 4 +- src/libslic3r/GCode/WipeTower.cpp | 59 +++++++++++++----- src/libslic3r/GCode/WipeTower.hpp | 6 +- src/libslic3r/Print.cpp | 19 +++++- src/slic3r/GUI/GLCanvas3D.cpp | 58 ++++++------------ src/slic3r/GUI/PartPlate.cpp | 17 ++++++ src/slic3r/GUI/PartPlate.hpp | 3 + src/slic3r/GUI/Selection.cpp | 17 +----- tests/fff_print/test_wipe_tower.cpp | 61 ++++++++++++++++++ 10 files changed, 224 insertions(+), 115 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 85903cb779..c20405781b 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -768,30 +768,31 @@ static std::vector get_path_of_change_filament(const Print& print) return changes; } + // Clearance the tower-approach router keeps around the tower: the avoid box is + // inflated by this much before routing, and the inflated corners must stay on the + // bed for a route to be generated at all. + static constexpr float wipe_tower_routing_clearance = 2.f; + // BBS // start_pos refers to the last position before the wipe_tower. // end_pos refers to the wipe tower's start_pos. // using the print coordinate system - Polyline WipeTowerIntegration::generate_path_to_wipe_tower(const Point& start_pos,const Point &end_pos , const BoundingBox& avoid_polygon , const BoundingBox& printer_bbx) const + Polyline WipeTowerIntegration::generate_path_to_wipe_tower(const Point& start_pos,const Point &end_pos , const BoundingBox& avoid_polygon , const Polygons& bed_polygons) const { Polyline res; - coord_t alpha = scaled(2.f); // offset distance + coord_t alpha = scaled(wipe_tower_routing_clearance); // offset distance BoundingBox avoid_polygon_inner = avoid_polygon; avoid_polygon_inner.offset(alpha); coord_t width = avoid_polygon_inner.max[0] - avoid_polygon_inner.min[0]; - Polygon bed_polygon = printer_bbx.polygon(); Vec2f v(1, 0); // the first print direction of end_pos. if (abs(end_pos[0] - avoid_polygon_inner.min[0]) < width / 2) v = -v; // judge whether the wipe tower's infill goes to the left or right. - // Judge whether the avoid_polygon_inner is outside the printer_bbx. + // Judge whether the avoid_polygon_inner is outside the bed. The real printable + // outline is tested (not its bounding box), so on circular/custom beds corners + // hanging off the bed are rejected. // If so, do nothing and just go directly to the end_pos. - bool is_bbx_in_bed = true; Points avoid_points = avoid_polygon_inner.polygon().points; - for (auto &wipe_tower_bbx_p : avoid_points) { - if (ClipperLib::PointInPolygon(wipe_tower_bbx_p, bed_polygon.points) != 1) { - is_bbx_in_bed = false; - break; - } - } + const bool is_bbx_in_bed = std::all_of(avoid_points.begin(), avoid_points.end(), + [&bed_polygons](const Point &pt) { return contains(bed_polygons, pt, /*border_result=*/false); }); if (!is_bbx_in_bed) { res.points.push_back(end_pos); return res; @@ -898,27 +899,17 @@ static std::vector get_path_of_change_filament(const Print& print) return Eigen::Rotation2Df(alpha) * (pt + m_rib_offset) + m_wipe_tower_pos; } - // Printable-area bounds for tower-approach routing, in object coordinates (shared by - // the BBL avoid-perimeter path in append_tcr and the Type2 skip-points router). - // Multi-nozzle: clamp the travel bounds to the region every extruder can reach - // (get_extruder_shared_printable_polygon) instead of the full bed. Gated on the - // multi-nozzle predicate so every existing single/dual printer keeps the historic - // full-printable_area routing byte-identical. - BoundingBox WipeTowerIntegration::printer_travel_bounds(GCode &gcodegen) const + // Bed outline the tower-approach router plans against, in object coordinates. The real + // outline is returned, not its bounding box, so the router's containment tests fail off + // the bed on circular/custom shapes; the multi-nozzle narrowing lives in the accessor. + Polygons WipeTowerIntegration::shared_printable_area(GCode &gcodegen) const { - const Vec2f plate_origin_2d(m_plate_origin(0), m_plate_origin(1)); - BoundingBox printer_bbx; - if (is_multi_nozzle_printer(gcodegen.m_config)) { - printer_bbx = get_extents(gcodegen.m_print->get_extruder_shared_printable_polygon()); - printer_bbx.min = wipe_tower_point_to_object_point(gcodegen, unscaled(printer_bbx.min) + plate_origin_2d); - printer_bbx.max = wipe_tower_point_to_object_point(gcodegen, unscaled(printer_bbx.max) + plate_origin_2d); - } else { - Points bed_points; - for (const auto& p : gcodegen.m_config.printable_area.values) - bed_points.push_back(wipe_tower_point_to_object_point(gcodegen, p.cast() + plate_origin_2d)); - printer_bbx = BoundingBox(bed_points); - } - return printer_bbx; + // The frame change is a pure translation, so transform the origin once. + const Point offset = wipe_tower_point_to_object_point(gcodegen, Vec2f(m_plate_origin(0), m_plate_origin(1))); + Polygons bed_polygons = gcodegen.m_print->get_extruder_shared_printable_polygon(); + for (Polygon &poly : bed_polygons) + poly.translate(offset); + return bed_polygons; } // With skip points enabled the Type2 tower wall has an opening at each toolchange's @@ -933,15 +924,37 @@ static std::vector get_path_of_change_filament(const Print& print) if (!WipeTower2::use_gap_wall(gcodegen.m_config)) return {}; const Vec2f plate_origin_2d(m_plate_origin(0), m_plate_origin(1)); - // Transform the tower-local bbx corners exactly like the tcr points; a rotated - // tower gets a conservative axis-aligned envelope. - Polygon avoid_points = scaled(m_wipe_tower_bbx).polygon(); - for (auto& p : avoid_points.points) - p = wipe_tower_point_to_object_point(gcodegen, transform_wt2_pt(unscale(p).cast()) + plate_origin_2d); - BoundingBox avoid_bbx(avoid_points.points); - if (avoid_bbx.contains(route_start)) + // Transform tower-local corners exactly like the tcr points; a rotated tower gets a + // conservative axis-aligned envelope from the result. + auto tower_polygon = [&](const BoundingBoxf &bbx) { + Polygon poly = scaled(bbx).polygon(); + for (Point &p : poly.points) + p = wipe_tower_point_to_object_point(gcodegen, transform_wt2_pt(unscale(p).cast()) + plate_origin_2d); + return poly; + }; + // The avoid envelope covers the first-layer brim (and rib flare), which a travel may + // cross freely: early-out only when the approach already starts over the tower body + // itself, so a start between the wall and the brim edge still gets routed in through + // the wall opening. Test the rotated polygon, not its bounding box — at angles off the + // axes the box's corner triangles cover most of the brim ring. + const float body_width = gcodegen.m_config.wipe_tower_wall_type.value == WipeTowerWallType::wtwRib ? m_wipe_tower_depth : m_right; + if (tower_polygon(BoundingBoxf(Vec2d(0., 0.), Vec2d(body_width, m_wipe_tower_depth))).contains(route_start)) return {}; - Polyline travel_polyline = generate_path_to_wipe_tower(route_start, start_wipe_pos, avoid_bbx, printer_travel_bounds(gcodegen)); + + const Polygons bed = shared_printable_area(gcodegen); + BoundingBox avoid_bbx = get_extents(tower_polygon(m_wipe_tower_bbx)); + // The inflated corners must stay on the bed for the router to generate a route at all: + // clamp the box against the bed shrunk by the clearance the router adds, so a tower + // parked near the bed edge is still routed along the clamped side instead of always + // travelling straight across the tower. + BoundingBox clamp_bbx = get_extents(bed); + clamp_bbx.offset(-(scaled(wipe_tower_routing_clearance) + SCALED_EPSILON)); + avoid_bbx.min = avoid_bbx.min.cwiseMax(clamp_bbx.min); + avoid_bbx.max = avoid_bbx.max.cwiseMin(clamp_bbx.max); + if (avoid_bbx.min.x() >= avoid_bbx.max.x() || avoid_bbx.min.y() >= avoid_bbx.max.y()) + return {}; + + Polyline travel_polyline = generate_path_to_wipe_tower(route_start, start_wipe_pos, avoid_bbx, bed); std::string gcode; // The polyline's last point is start_wipe_pos itself — emitted by the caller. for (size_t i = 0; i + 1 < travel_polyline.points.size(); ++i) @@ -1322,7 +1335,7 @@ static std::vector get_path_of_change_filament(const Print& print) Vec2f gcode_last_pos2d{gcode_last_pos[0], gcode_last_pos[1]}; Point gcode_last_pos2d_object = gcodegen.gcode_to_point(gcode_last_pos2d.cast() + plate_origin_2d.cast()); Point start_wipe_pos = wipe_tower_point_to_object_point(gcodegen, tool_change_start_pos + plate_origin_2d); - BoundingBox avoid_bbx, printer_bbx = printer_travel_bounds(gcodegen); + BoundingBox avoid_bbx; { // set avoid_bbx avoid_bbx = scaled(m_wipe_tower_bbx); @@ -1334,7 +1347,7 @@ static std::vector get_path_of_change_filament(const Print& print) avoid_bbx = BoundingBox(avoid_points.points); } std::string travel_to_wipe_tower_gcode; - Polyline travel_polyline = generate_path_to_wipe_tower(gcode_last_pos2d_object, start_wipe_pos, avoid_bbx, printer_bbx); + Polyline travel_polyline = generate_path_to_wipe_tower(gcode_last_pos2d_object, start_wipe_pos, avoid_bbx, shared_printable_area(gcodegen)); for (size_t i = 0; i < travel_polyline.points.size(); ++i) { const auto &p = travel_polyline.points[i]; diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 6346334889..6bdb04a8a9 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -130,11 +130,11 @@ public: private: WipeTowerIntegration& operator=(const WipeTowerIntegration&); std::string append_tcr(GCode &gcodegen, const WipeTower::ToolChangeResult &tcr, int new_extruder_id, double z = -1.) const; - Polyline generate_path_to_wipe_tower(const Point &start_pos, const Point &end_pos, const BoundingBox &avoid_polygon, const BoundingBox &printer_bbx) const; + Polyline generate_path_to_wipe_tower(const Point &start_pos, const Point &end_pos, const BoundingBox &avoid_polygon, const Polygons &bed_polygons) const; std::string append_tcr2(GCode &gcodegen, const WipeTower::ToolChangeResult &tcr, int new_extruder_id, double z = -1.) const; std::string travel_to_tower_gap(GCode &gcodegen, const Point &route_start, const Point &start_wipe_pos) const; Vec2f transform_wt2_pt(const Vec2f &pt) const; - BoundingBox printer_travel_bounds(GCode &gcodegen) const; + Polygons shared_printable_area(GCode &gcodegen) const; // Postprocesses gcode: rotates and moves G1 extrusions and returns result std::string post_process_wipe_tower_moves(const WipeTower::ToolChangeResult& tcr, const Vec2f& translation, float angle) const; diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index b97e773e63..5834937169 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -1630,25 +1630,56 @@ float WipeTower::get_auto_brim_by_height(float max_height) { return 8.f; } -Vec2f WipeTower::move_box_inside_box(const BoundingBox &box1, const BoundingBox &box2,int scaled_offset) +Vec2f WipeTower::move_box_inside_polygon(const BoundingBox &box, const Polygons &polygons, coord_t offset) { - Vec2f res{0, 0}; - if (box1.size()[0] >= box2.size()[0]- 2*scaled_offset || box1.size()[1] >= box2.size()[1]-2*scaled_offset) return res; + if (polygons.empty()) return Vec2f{0.f, 0.f}; - if (box1.max[0] > box2.max[0] - scaled_offset) { - res[0] = unscaled((box2.max[0] - scaled_offset) - box1.max[0]); - } - else if (box1.min[0] < box2.min[0] + scaled_offset) { - res[0] = unscaled((box2.min[0] + scaled_offset) - box1.min[0]); + const BoundingBox bed = get_extents(polygons); + // No position fits the footprint. + if (box.size().x() >= bed.size().x() - 2 * offset || box.size().y() >= bed.size().y() - 2 * offset) + return Vec2f{0.f, 0.f}; + + // Clamp against the bounding box first, moving only along the axis that is violated so a dragged + // prime tower slides along the bed edge instead of jumping inwards. + Point shift(0, 0); + for (int axis = 0; axis < 2; ++axis) { + if (box.max[axis] > bed.max[axis] - offset) + shift[axis] = (bed.max[axis] - offset) - box.max[axis]; + else if (box.min[axis] < bed.min[axis] + offset) + shift[axis] = (bed.min[axis] + offset) - box.min[axis]; } - if (box1.max[1] > box2.max[1] - scaled_offset) { - res[1] = unscaled((box2.max[1] - scaled_offset) - box1.max[1]); + // A bed that fills its own bounding box is fully clamped by that, so every rectangular bed — all + // but the delta-style profiles — stops here and keeps its historic placement, including when a + // negative margin lets the footprint hang over the edge. The tolerance is relative because an + // exact rectangle loses a few ulps once the areas are squared world coordinates. + double area = 0.; + for (const Polygon &poly : polygons) area += std::abs(poly.area()); + const double bed_area = double(bed.size().x()) * double(bed.size().y()); + if (area >= bed_area * (1. - EPSILON)) return unscaled(shift); + + // Clamp a negative margin (an auto brim width that has not been resolved yet) to zero: padding by + // it would shrink the footprint and hand back a position the validation still rejects. The + // epsilon lets the move's round trip through millimeters land on the outline without counting as + // a violation. + BoundingBox padded = box.inflated(std::max(offset, 0) - SCALED_EPSILON); + padded.translate(shift); + auto fits = [&padded, &polygons](const Point &move) { + BoundingBox moved = padded; + moved.translate(move); + return diff(Polygons{moved.polygon()}, polygons).empty(); + }; + if (fits(Point(0, 0))) return unscaled(shift); + + // Walk towards the middle of the bed. On every non-rectangular bed we ship, the fitting positions + // form a convex region around it, so bisecting stops just inside the outline. + Point lo(0, 0), hi = bed.center() - padded.center(); + if (!fits(hi)) return unscaled(shift); + for (int i = 0; i < 12; ++i) { + const Point mid = (lo + hi) / 2; + if (fits(mid)) hi = mid; else lo = mid; } - else if (box1.min[1] < box2.min[1] + scaled_offset) { - res[1] = unscaled((box2.min[1] + scaled_offset) - box1.min[1]); - } - return res; + return unscaled(Point(shift + hi)); } Polygon WipeTower::rib_section(float width, float depth, float rib_length, float rib_width,bool fillet_wall) diff --git a/src/libslic3r/GCode/WipeTower.hpp b/src/libslic3r/GCode/WipeTower.hpp index 0819a04f10..045c82cbf3 100644 --- a/src/libslic3r/GCode/WipeTower.hpp +++ b/src/libslic3r/GCode/WipeTower.hpp @@ -45,7 +45,11 @@ public: static TriangleMesh its_make_rib_tower(float width, float depth, float height, float rib_length, float rib_width, bool fillet_wall); static TriangleMesh its_make_rib_brim(const Polygon& brim, float layer_height); static Polygon rib_section(float width, float depth, float rib_length, float rib_width, bool fillet_wall); - static Vec2f move_box_inside_box(const BoundingBox &box1, const BoundingBox &box2, int offset = 0); + // Translation that brings a footprint inside the printable outline, padded by offset. The prime + // tower is validated against the real outline (see layered_print_cleareance_valid), so clamping + // against the bounding box alone would leave it off a delta or hexagonal bed. box and polygons + // must share one scaled coordinate frame; the translation comes back in millimeters. + static Vec2f move_box_inside_polygon(const BoundingBox &box, const Polygons &polygons, coord_t offset = 0); static Polygon rounding_polygon(Polygon &polygon, double rounding = 2., double angle_tol = 30. / 180. * PI); struct Extrusion { diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 61025c89d7..6a34cc31ff 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1048,13 +1048,14 @@ static StringObjectException layered_print_cleareance_valid(const Print &print, wipe_tower_convex_hull.points.emplace_back(scale_(x + width), scale_(y)); wipe_tower_convex_hull.points.emplace_back(scale_(x + width), scale_(y + depth)); wipe_tower_convex_hull.points.emplace_back(scale_(x), scale_(y + depth)); - wipe_tower_convex_hull.rotate(a); + wipe_tower_convex_hull.rotate(Geometry::deg2rad(a), Point(scale_(x), scale_(y))); convex_hulls_temp.push_back(wipe_tower_convex_hull); } else { //here, wipe_tower_polygon is not always convex. Polygon wipe_tower_polygon; if (print.wipe_tower_data().wipe_tower_mesh_data) wipe_tower_polygon = print.wipe_tower_data().wipe_tower_mesh_data->bottom; + wipe_tower_polygon.rotate(Geometry::deg2rad(a)); wipe_tower_polygon.translate(Point(scale_(x), scale_(y))); convex_hulls_temp.push_back(wipe_tower_polygon); } @@ -1073,6 +1074,22 @@ static StringObjectException layered_print_cleareance_valid(const Print &print, if (print_config.enable_wrapping_detection.value && !intersection({wrapping_poly}, convex_hulls_temp).empty()) { return {L("Prime Tower") + L(" is too close to clumping detection area, and collisions will be caused.\n")}; } + // Skip the containment check for towers that will never be printed (single-filament + // prints without smooth timelapse keep the config's tower position but emit nothing). + // Pre-generation only the body square is tested — the auto-brim estimate can overshoot + // the generated brim by several mm and must not hard-fail a print that physically fits. + // Post-generation the mesh bottom already includes the real brim, so the exact + // footprint is tested. + if (filaments_count > 1 || print.enable_timelapse_print()) { + // The shared printable polygon is plate-local, while the tower polygons above are + // already shifted by the plate origin. + Polygons printable_polys = print.get_extruder_shared_printable_polygon(); + const Point plate_shift(scale_(plate_origin.x()), scale_(plate_origin.y())); + for (Polygon &p : printable_polys) + p.translate(plate_shift); + if (!diff(convex_hulls_temp, printable_polys).empty()) + return {L("Prime Tower") + L(" is partially outside the printable area, and it cannot be printed.\n")}; + } return {}; } diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 110b6697ae..45c0d87791 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2899,47 +2899,23 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re int nozzle_nums = wxGetApp().preset_bundle->get_printer_extruder_count(); Vec3d wipe_tower_size = ppl.get_plate(plate_id)->estimate_wipe_tower_size(print_cfg, w, v, nozzle_nums, 0, false, dynamic_cast(dconfig.option("enable_wrapping_detection"))->value); - { - const float margin = WIPE_TOWER_MARGIN + brim_width; - BoundingBoxf3 plate_bbox = part_plate->get_bounding_box(); - BoundingBoxf plate_bbox_2d(Vec2d(plate_bbox.min(0), plate_bbox.min(1)), Vec2d(plate_bbox.max(0), plate_bbox.max(1))); - const std::vector &extruder_areas = part_plate->get_extruder_areas(); - for (Pointfs points : extruder_areas) { - BoundingBoxf bboxf(points); - plate_bbox_2d.min = plate_bbox_2d.min(0) >= bboxf.min(0) ? plate_bbox_2d.min : bboxf.min; - plate_bbox_2d.max = plate_bbox_2d.max(0) <= bboxf.max(0) ? plate_bbox_2d.max : bboxf.max; - } - - coordf_t plate_bbox_x_min_local_coord = plate_bbox_2d.min(0) - plate_origin(0); - coordf_t plate_bbox_x_max_local_coord = plate_bbox_2d.max(0) - plate_origin(0); - coordf_t plate_bbox_y_max_local_coord = plate_bbox_2d.max(1) - plate_origin(1); - - if (!current_print->is_step_done(psWipeTower) || !current_print->wipe_tower_data().wipe_tower_mesh_data) { - // update for wipe tower position - { - int volume_idx_wipe_tower_new = m_volumes.load_wipe_tower_preview(1000 + plate_id, x + plate_origin(0), y + plate_origin(1), - (float) wipe_tower_size(0), (float) wipe_tower_size(1), (float) wipe_tower_size(2), - a, - /*!print->is_step_done(psWipeTower)*/ true, brim_width); - int volume_idx_wipe_tower_old = volume_idxs_wipe_tower_old[plate_id]; - if (volume_idx_wipe_tower_old != -1) map_glvolume_old_to_new[volume_idx_wipe_tower_old] = volume_idx_wipe_tower_new; - } - } else { - const float margin = 2.f; - auto tower_bottom = current_print->wipe_tower_data().wipe_tower_mesh_data->bottom; - tower_bottom.translate(scaled(Vec2d{x, y})); - tower_bottom.translate(scaled(Vec2d{plate_origin[0], plate_origin[1]})); - auto tower_bottom_bbox = get_extents(tower_bottom); - BoundingBoxf3 plate_bbox = wxGetApp().plater()->get_partplate_list().get_plate(plate_id)->get_build_volume(true); - BoundingBox plate_bbox2d = BoundingBox(scaled(Vec2f(plate_bbox.min[0], plate_bbox.min[1])), scaled(Vec2f(plate_bbox.max[0], plate_bbox.max[1]))); - Vec2f offset = WipeTower::move_box_inside_box(tower_bottom_bbox, plate_bbox2d, scaled(margin)); - int volume_idx_wipe_tower_new = m_volumes.load_real_wipe_tower_preview(1000 + plate_id, x + plate_origin(0), y + plate_origin(1), - current_print->wipe_tower_data().wipe_tower_mesh_data->real_wipe_tower_mesh, - current_print->wipe_tower_data().wipe_tower_mesh_data->real_brim_mesh, - true,a,/*!print->is_step_done(psWipeTower)*/ true, m_initialized); - int volume_idx_wipe_tower_old = volume_idxs_wipe_tower_old[plate_id]; - if (volume_idx_wipe_tower_old != -1) map_glvolume_old_to_new[volume_idx_wipe_tower_old] = volume_idx_wipe_tower_new; - } + // The stored position is already clamped onto the bed, by + // set_default_wipe_tower_pos_for_plate and again on every drag. + if (!current_print->is_step_done(psWipeTower) || !current_print->wipe_tower_data().wipe_tower_mesh_data) { + // update for wipe tower position + int volume_idx_wipe_tower_new = m_volumes.load_wipe_tower_preview(1000 + plate_id, x + plate_origin(0), y + plate_origin(1), + (float) wipe_tower_size(0), (float) wipe_tower_size(1), (float) wipe_tower_size(2), + a, + /*!print->is_step_done(psWipeTower)*/ true, brim_width); + int volume_idx_wipe_tower_old = volume_idxs_wipe_tower_old[plate_id]; + if (volume_idx_wipe_tower_old != -1) map_glvolume_old_to_new[volume_idx_wipe_tower_old] = volume_idx_wipe_tower_new; + } else { + int volume_idx_wipe_tower_new = m_volumes.load_real_wipe_tower_preview(1000 + plate_id, x + plate_origin(0), y + plate_origin(1), + current_print->wipe_tower_data().wipe_tower_mesh_data->real_wipe_tower_mesh, + current_print->wipe_tower_data().wipe_tower_mesh_data->real_brim_mesh, + true,a,/*!print->is_step_done(psWipeTower)*/ true, m_initialized); + int volume_idx_wipe_tower_old = volume_idxs_wipe_tower_old[plate_id]; + if (volume_idx_wipe_tower_old != -1) map_glvolume_old_to_new[volume_idx_wipe_tower_old] = volume_idx_wipe_tower_new; } } } diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index 4f57c2577d..3ab764aaf3 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -3337,6 +3337,11 @@ BoundingBoxf3 PartPlate::get_build_volume(bool use_share) return plate_box; } +Polygon PartPlate::get_shared_printable_polygon() const +{ + return m_extruder_areas.empty() ? Polygon::new_scale(m_shape) : get_shared_poly(m_extruder_areas); +} + bool PartPlate::contains(const Vec3d& point) const { return m_bounding_box.contains(point); @@ -4412,6 +4417,18 @@ void PartPlateList::set_default_wipe_tower_pos_for_plate(int plate_idx, bool ini } } + // The bounding box above still allows a corner a delta or hexagonal bed does not have, and the + // prime tower is validated against the real outline — pull it onto the bed before storing. + { + Polygons bed{part_plate->get_shared_printable_polygon()}; + bed.front().translate(Point(-scaled(plate_origin.x()), -scaled(plate_origin.y()))); // into the frame x/y live in + const BoundingBox tower(Point::new_scale(x, y), + Point::new_scale(x + wipe_tower_size(0), y + wipe_tower_size(1))); + const Vec2f move = WipeTower::move_box_inside_polygon(tower, bed, scaled(margin)); + x += move.x(); + y += move.y(); + } + ConfigOptionFloat wt_x_opt(x); ConfigOptionFloat wt_y_opt(y); dynamic_cast(proj_cfg.option("wipe_tower_x"))->set_at(&wt_x_opt, plate_idx, 0); diff --git a/src/slic3r/GUI/PartPlate.hpp b/src/slic3r/GUI/PartPlate.hpp index 8f4055706f..47481dcad4 100644 --- a/src/slic3r/GUI/PartPlate.hpp +++ b/src/slic3r/GUI/PartPlate.hpp @@ -425,6 +425,9 @@ public: const BoundingBox get_bounding_box_crd(); BoundingBoxf3 get_plate_box() {return get_build_volume();} BoundingBoxf3 get_build_volume(bool use_share = false); + // Polygon counterpart of get_build_volume(true), in scaled world coordinates. The bounding box + // that one returns hides the corners a non-rectangular bed does not have. + Polygon get_shared_printable_polygon() const; const std::vector& get_exclude_areas() { return m_exclude_bounding_box; } diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 5d6a545873..b6d7abde21 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -1270,9 +1270,7 @@ void Selection::translate(const Vec3d &displacement, TransformationType transfor } else { if (v.is_wipe_tower) {//in world cs int plate_idx = v.object_idx() - 1000; - BoundingBoxf3 plate_bbox = wxGetApp().plater()->get_partplate_list().get_plate(plate_idx)->get_build_volume(true); - BoundingBox plate_bbox2d = BoundingBox(scaled(Vec2f(plate_bbox.min[0], plate_bbox.min[1])), scaled(Vec2f(plate_bbox.max[0], plate_bbox.max[1]))); - Vec3d tower_size = v.bounding_box().size(); + const Polygons bed_polys{wxGetApp().plater()->get_partplate_list().get_plate(plate_idx)->get_shared_printable_polygon()}; Vec3d tower_origin = m_cache.volumes_data[i].get_volume_position(); Vec3d actual_displacement = displacement; bool show_read_wipe_tower = wxGetApp().plater()->get_partplate_list().get_plate(plate_idx)->fff_print()->is_step_done(psWipeTower); @@ -1287,18 +1285,7 @@ void Selection::translate(const Vec3d &displacement, TransformationType transfor BoundingBoxf3 tower_bbox = v.bounding_box(); tower_bbox.translate(actual_displacement + tower_origin); BoundingBox tower_bbox2d = BoundingBox(scaled(Vec2f(tower_bbox.min[0], tower_bbox.min[1])), scaled(Vec2f(tower_bbox.max[0], tower_bbox.max[1]))); - Vec2f offset = WipeTower::move_box_inside_box(tower_bbox2d, plate_bbox2d,scaled(margin)); - //if (tower_origin(0) + actual_displacement(0) - margin < plate_bbox.min(0)) { - // actual_displacement(0) = plate_bbox.min(0) - tower_origin(0) + margin; - //} else if (tower_origin(0) + actual_displacement(0) + tower_size(0) + margin > plate_bbox.max(0)) { - // actual_displacement(0) = plate_bbox.max(0) - tower_origin(0) - tower_size(0) - margin; - //} - - //if (tower_origin(1) + actual_displacement(1) - margin < plate_bbox.min(1)) { - // actual_displacement(1) = plate_bbox.min(1) - tower_origin(1) + margin; - //} else if (tower_origin(1) + actual_displacement(1) + tower_size(1) + margin > plate_bbox.max(1)) { - // actual_displacement(1) = plate_bbox.max(1) - tower_origin(1) - tower_size(1) - margin; - //} + const Vec2f offset = WipeTower::move_box_inside_polygon(tower_bbox2d, bed_polys, scaled(margin)); actual_displacement += Vec3d(offset[0], offset[1],0); v.set_volume_offset(m_cache.volumes_data[i].get_volume_position() + actual_displacement); } diff --git a/tests/fff_print/test_wipe_tower.cpp b/tests/fff_print/test_wipe_tower.cpp index bb9e4781d1..2bd7ac4189 100644 --- a/tests/fff_print/test_wipe_tower.cpp +++ b/tests/fff_print/test_wipe_tower.cpp @@ -3,6 +3,8 @@ #include #include +#include "libslic3r/BoundingBox.hpp" +#include "libslic3r/ClipperUtils.hpp" #include "libslic3r/GCode/GCodeProcessor.hpp" #include "libslic3r/GCode/WipeTower.hpp" #include "libslic3r/PrintConfig.hpp" @@ -53,6 +55,65 @@ TEST_CASE("Other flavors wait in the wipe tower with a seconds dwell", "[WipeTow CHECK(wait_command(flavor, 1.5f) == "G4 S1.500\n"); } +// The prime tower is validated against the real printable outline, so the placement clamps have to +// agree with it wherever that outline is not a rectangle. A regular hexagon inscribed in a 200mm +// circle stands in for the shipped delta beds. +TEST_CASE("The wipe tower placement clamp follows a non-rectangular bed outline", "[WipeTower]") +{ + const coord_t margin = scaled(1.); + auto square_at = [](double x, double y, double side) { + return BoundingBox(Point::new_scale(x, y), Point::new_scale(x + side, y + side)); + }; + // Does the footprint, padded by pad, sit inside the outline once the returned move is applied? + auto lands_inside = [](BoundingBox box, const Polygons &bed, const Vec2f &move, coord_t pad) { + box.translate(Point::new_scale(move.x(), move.y())); + return diff(Polygons{box.inflated(pad).polygon()}, bed).empty(); + }; + + const Polygons hex_bed{make_circle_num_segments(scaled(100.), 6)}; + const Polygons square_bed{Polygon::new_scale(Pointfs{{0., 0.}, {200., 0.}, {200., 200.}, {0., 200.}})}; + + SECTION("a rectangular bed is left to the bounding box clamp") { + const Vec2f move = WipeTower::move_box_inside_polygon(square_at(50., 50., 30.), square_bed, margin); + CHECK_THAT(move.x(), Catch::Matchers::WithinAbs(0., 1e-6)); + CHECK_THAT(move.y(), Catch::Matchers::WithinAbs(0., 1e-6)); + } + + // Dragging the tower off one edge may not pull it away from the other, or it would jump out from + // under the cursor instead of sliding along the edge. + SECTION("only the violated axis is clamped") { + const Vec2f move = WipeTower::move_box_inside_polygon(square_at(185., 50., 30.), square_bed, margin); + CHECK_THAT(move.x(), Catch::Matchers::WithinAbs(-16., 1e-6)); + CHECK_THAT(move.y(), Catch::Matchers::WithinAbs(0., 1e-6)); + } + + SECTION("a footprint already inside the outline is left alone") { + const Vec2f move = WipeTower::move_box_inside_polygon(square_at(-15., -15., 30.), hex_bed, margin); + CHECK_THAT(move.x(), Catch::Matchers::WithinAbs(0., 1e-6)); + CHECK_THAT(move.y(), Catch::Matchers::WithinAbs(0., 1e-6)); + } + + SECTION("a footprint in the bounding box corner is pulled onto the bed") { + const BoundingBox box = square_at(55., 50., 30.); + REQUIRE_FALSE(lands_inside(box, hex_bed, Vec2f::Zero(), margin)); // in the bbox, off the hexagon + CHECK(lands_inside(box, hex_bed, WipeTower::move_box_inside_polygon(box, hex_bed, margin), margin)); + } + + // An unresolved auto brim width reaches the drag clamp as a negative margin. Padding by it would + // shrink the footprint and hand back a position the slice validation still rejects. + SECTION("a negative margin still lands the footprint inside the outline") { + const BoundingBox box = square_at(55., 50., 30.); + const coord_t brim = scaled(-0.5); + CHECK(lands_inside(box, hex_bed, WipeTower::move_box_inside_polygon(box, hex_bed, brim), 0)); + } + + SECTION("a footprint too large for the bed is left alone") { + const Vec2f move = WipeTower::move_box_inside_polygon(square_at(-200., -200., 400.), hex_bed, margin); + CHECK_THAT(move.x(), Catch::Matchers::WithinAbs(0., 1e-6)); + CHECK_THAT(move.y(), Catch::Matchers::WithinAbs(0., 1e-6)); + } +} + // The cases above only exercise the helpers in isolation. The one below slices a real // two-filament print, so it also covers the binding constraint of both changes: that the // configured `gcode_flavor` reaches the wipe tower writer and lands in the exported G-code. From 32a4e0fb3700aca32901ce05197a64c58951fa00 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Thu, 6 Aug 2026 16:23:04 +0800 Subject: [PATCH 074/106] Size the prime tower from the actual flush volumes Prime towers reserved depth from the prime volume alone, ignoring the flush matrix: rib-wall towers in both the engine and the preview, and rectangle and cone towers in the preview, which never carried the flush-aware estimate the engine already used. The preview also read the print preset, which does not carry the printer- and filament-scope keys the estimate needs and so silently fell back to defaults. On multi-nozzle printers the flush matrix, which holds one block per nozzle, was additionally read as a single block. The tower could come out too small for the purge it has to hold. The flush-based estimate also skipped the height-based minimum depth that the prime-volume one applies, so low-flush prints could estimate a tower shallower than the one that actually gets built. --- src/libslic3r/GCode/WipeTower2.cpp | 61 ++++++++++++++++++++++++------ src/libslic3r/GCode/WipeTower2.hpp | 6 ++- src/libslic3r/Print.cpp | 32 ++++++---------- src/slic3r/GUI/GLCanvas3D.cpp | 6 ++- src/slic3r/GUI/PartPlate.cpp | 19 +++++++--- 5 files changed, 83 insertions(+), 41 deletions(-) diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index 34e4b6146f..ee0f9c375a 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -2130,31 +2130,68 @@ std::pair WipeTower2::get_wipe_tower_cone_base(double width, dou } // Static method to extract wipe_volumes[from][to] from the configuration. -std::vector> WipeTower2::extract_wipe_volumes(const PrintConfig& config) +// Takes a ConfigBase so the GUI's wipe tower size estimate can pass the plate's +// DynamicPrintConfig directly instead of materializing a full PrintConfig per call. +std::vector> WipeTower2::extract_wipe_volumes(const ConfigBase& config) { - // Get wiping matrix to get number of extruders and convert vector to vector: - std::vector wiping_matrix(cast(config.flush_volumes_matrix.values)); - auto scale = config.flush_multiplier.get_at(0); + // flush_volumes_matrix holds one filaments x filaments block per nozzle (written by + // PresetBundle::update_multi_material_filament_presets), so the filament count is + // sqrt(size / nozzles). One tower serves every nozzle and the filament to nozzle assignment is + // only decided later by ToolOrdering, so fold the blocks with std::max: the depth reserved here + // has to cover the worst nozzle. With a single nozzle the fold has one term. + const std::vector &raw_matrix = config.option("flush_volumes_matrix")->values; + const auto *nozzle_diameter = config.option("nozzle_diameter"); + size_t nozzle_nums = (nozzle_diameter == nullptr || nozzle_diameter->values.empty()) ? 1 : nozzle_diameter->values.size(); + unsigned int number_of_extruders = (unsigned int)(sqrt(raw_matrix.size() / nozzle_nums) + EPSILON); + if (size_t(number_of_extruders) * number_of_extruders * nozzle_nums != raw_matrix.size()) { + // Saved for a different nozzle count (older project, or the printer was just switched): + // fall back to reading the whole option as one block, as this did before. + nozzle_nums = 1; + number_of_extruders = (unsigned int)(sqrt(raw_matrix.size()) + EPSILON); + } // The values shall only be used when SEMM is enabled. The purging for other printers // is determined by filament_minimal_purge_on_wipe_tower. - if (! config.purge_in_prime_tower.value || ! config.single_extruder_multi_material.value) - std::fill(wiping_matrix.begin(), wiping_matrix.end(), 0.f); + const bool purge = config.option("purge_in_prime_tower")->value + && config.option("single_extruder_multi_material")->value; - // Extract purging volumes for each extruder pair: - std::vector> wipe_volumes; - const unsigned int number_of_extruders = (unsigned int)(sqrt(wiping_matrix.size())+EPSILON); - for (size_t i = 0; i(wiping_matrix.begin()+i*number_of_extruders, wiping_matrix.begin()+(i+1)*number_of_extruders)); + // Extract purging volumes for each extruder pair, each nozzle's block scaled by its own multiplier: + std::vector> wipe_volumes(number_of_extruders, std::vector(number_of_extruders, 0.f)); + if (purge) { + const auto *multiplier = config.option("flush_multiplier"); + for (size_t nozzle_id = 0; nozzle_id < nozzle_nums; ++nozzle_id) { + const std::vector block = get_flush_volumes_matrix(raw_matrix, nozzle_id, nozzle_nums); + const double scale = multiplier->get_at(nozzle_id); + for (unsigned int i = 0; i(wipe_volumes[i][j], float(block[size_t(i) * number_of_extruders + j]) * scale); + } + } // Also include filament_minimal_purge_on_wipe_tower. This is needed for the preview. + const auto *minimal_purge = config.option("filament_minimal_purge_on_wipe_tower"); for (unsigned int i = 0; i(wipe_volumes[i][j] * scale, config.filament_minimal_purge_on_wipe_tower.get_at(j)); + wipe_volumes[i][j] = std::max(wipe_volumes[i][j], minimal_purge->get_at(j)); return wipe_volumes; } +float WipeTower2::estimate_semm_flush_volume(const ConfigBase& config, size_t filaments_cnt) +{ + const std::vector> wipe_volumes = extract_wipe_volumes(config); + if (wipe_volumes.empty()) // an empty flush matrix would make the average below 0/0 + return 0.f; + float maximum = 0.f; + for (const std::vector &v : wipe_volumes) + maximum += *std::max_element(v.begin(), v.end()); + maximum = maximum * filaments_cnt / wipe_volumes.size(); + + // Orca: it's overshooting a bit, so let's reduce it a bit + maximum *= 0.6; + return maximum; +} + static float get_wipe_depth(float volume, float layer_height, float perimeter_width, float extra_flow, float extra_spacing, float width) { float length_to_extrude = (volume_to_length(volume, perimeter_width, layer_height)) / extra_flow; diff --git a/src/libslic3r/GCode/WipeTower2.hpp b/src/libslic3r/GCode/WipeTower2.hpp index ca9e73bb28..5b1a474b5d 100644 --- a/src/libslic3r/GCode/WipeTower2.hpp +++ b/src/libslic3r/GCode/WipeTower2.hpp @@ -17,6 +17,7 @@ namespace Slic3r class WipeTowerWriter2; class PrintRegionConfig; +class ConfigBase; class WipeTower2 { @@ -26,7 +27,10 @@ public: // in WipeTowerIntegration::append_tcr2 does not strip it. static const std::string wait_for_temp_tag() { return ";_WAIT_FOR_TEMP_ON_WIPE_TOWER"; } static std::pair get_wipe_tower_cone_base(double width, double height, double depth, double angle_deg); - static std::vector> extract_wipe_volumes(const PrintConfig& config); + static std::vector> extract_wipe_volumes(const ConfigBase& config); + // Estimated total flush volume of a SEMM print with the given number of filaments, + // used to reserve wipe tower space before the tower is generated. + static float estimate_semm_flush_volume(const ConfigBase& config, size_t filaments_cnt); // Construct ToolChangeResult from current state of WipeTower2 and WipeTowerWriter2. diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 6a34cc31ff..1af28255ee 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -3944,6 +3944,12 @@ const WipeTowerData &Print::wipe_tower_data(size_t filaments_cnt) const double volume = wipe_volume * filament_depth_count; if (m_config.nozzle_diameter.values.size() == 2) volume += filament_change_volume * (int) (filaments_cnt / 2); + // Sizing should take into account currently set wiping volumes. + // For a long time, the initial preview would just use 900/width per toolchange (15mm on a 60mm wide tower) + // and it worked well enough. Let's try to do slightly better by accounting for the purging volumes. + const bool semm_flush = m_config.purge_in_prime_tower && m_config.single_extruder_multi_material; + if (semm_flush) volume = WipeTower2::estimate_semm_flush_volume(m_config, filaments_cnt); + if (m_config.wipe_tower_wall_type.value == WipeTowerWallType::wtwRib) { double depth = std::sqrt(volume / layer_height * extra_spacing); if (need_wipe_tower || filaments_cnt > 1) { @@ -3955,30 +3961,16 @@ const WipeTowerData &Print::wipe_tower_data(size_t filaments_cnt) const } } else { - double width = m_config.prime_tower_width; - if (m_config.purge_in_prime_tower && m_config.single_extruder_multi_material) { - // Calculating depth should take into account currently set wiping volumes. - // For a long time, the initial preview would just use 900/width per toolchange (15mm on a 60mm wide tower) - // and it worked well enough. Let's try to do slightly better by accounting for the purging volumes. - std::vector> wipe_volumes = WipeTower2::extract_wipe_volumes(m_config); - std::vector max_wipe_volumes; - for (const std::vector &v : wipe_volumes) - max_wipe_volumes.emplace_back(*std::max_element(v.begin(), v.end())); - float maximum = std::accumulate(max_wipe_volumes.begin(), max_wipe_volumes.end(), 0.f); - maximum = maximum * filaments_cnt / max_wipe_volumes.size(); - - // Orca: it's overshooting a bit, so let's reduce it a bit - maximum *= 0.6; - const_cast(this)->m_wipe_tower_data.depth = maximum / (layer_height * width); - } else { - double depth = volume / (layer_height * width) * extra_spacing; - if (need_wipe_tower || m_wipe_tower_data.depth > EPSILON) { + double width = m_config.prime_tower_width; + double depth = volume / (layer_height * width); + // The flush volumes already hold the spacing between wipes. + if (!semm_flush) depth *= extra_spacing; + if (need_wipe_tower || depth > EPSILON) { float min_wipe_tower_depth = WipeTower::get_limit_depth_by_height(max_height); depth = std::max((double) min_wipe_tower_depth, depth); } const_cast(this)->m_wipe_tower_data.depth = depth; - } - const_cast(this)->m_wipe_tower_data.brim_width = m_config.prime_tower_brim_width; + const_cast(this)->m_wipe_tower_data.brim_width = m_config.prime_tower_brim_width; } if (m_config.prime_tower_brim_width < 0) const_cast(this)->m_wipe_tower_data.brim_width = WipeTower::get_auto_brim_by_height(max_height); } diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 45c0d87791..27fe44a867 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2871,6 +2871,9 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re } if (wt && (need_wipe_tower || filaments_count > 1) && !wxGetApp().plater()->only_gcode_mode() && !wxGetApp().plater()->is_gcode_3mf()) { + // The tower size estimate reads printer- and filament-scope keys, which the print preset + // does not carry; built once here rather than per plate. + const DynamicPrintConfig full_config = wxGetApp().preset_bundle->full_config(); for (int plate_id = 0; plate_id < n_plates; plate_id++) { // If print ByObject and there is only one object in the plate, the wipe tower is allowed to be generated. PartPlate* part_plate = ppl.get_plate(plate_id); @@ -2895,9 +2898,8 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re if (part_plate->get_objects_on_this_plate().empty()) continue; float brim_width = print->wipe_tower_data(filaments_count).brim_width; - const DynamicPrintConfig &print_cfg = wxGetApp().preset_bundle->prints.get_edited_preset().config; int nozzle_nums = wxGetApp().preset_bundle->get_printer_extruder_count(); - Vec3d wipe_tower_size = ppl.get_plate(plate_id)->estimate_wipe_tower_size(print_cfg, w, v, nozzle_nums, 0, false, dynamic_cast(dconfig.option("enable_wrapping_detection"))->value); + Vec3d wipe_tower_size = ppl.get_plate(plate_id)->estimate_wipe_tower_size(full_config, w, v, nozzle_nums, 0, false, dynamic_cast(dconfig.option("enable_wrapping_detection"))->value); // The stored position is already clamped onto the bed, by // set_default_wipe_tower_pos_for_plate and again on every drag. diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index 3ab764aaf3..910c761c06 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -2262,6 +2262,12 @@ Vec3d PartPlate::estimate_wipe_tower_size(const DynamicPrintConfig & config, con } double volume = wipe_volume * (extruder_count == 2 ? plate_extruder_size : (plate_extruder_size - 1)); if (extruder_count == 2) volume += filament_change_volume * (int) (plate_extruder_size / 2); + // Read from the passed plate config — m_print may not have been applied yet + // (fresh plates, CLI), in which case its PrintConfig still holds defaults. + const auto *purge_opt = config.option("purge_in_prime_tower"); + const auto *semm_opt = config.option("single_extruder_multi_material"); + const bool semm_flush = purge_opt && purge_opt->value && semm_opt && semm_opt->value; + if (semm_flush) volume = WipeTower2::estimate_semm_flush_volume(config, plate_extruder_size); if (use_rib_wall) { depth = std::sqrt(volume / layer_height * extra_spacing); if (need_wipe_tower || plate_extruder_size > 1) { @@ -2274,7 +2280,9 @@ Vec3d PartPlate::estimate_wipe_tower_size(const DynamicPrintConfig & config, con } } else { - depth = volume/ (layer_height * w) *extra_spacing; + depth = volume / (layer_height * w); + // The flush volumes already hold the spacing between wipes. + if (!semm_flush) depth *= extra_spacing; if (need_wipe_tower || depth > EPSILON) { float min_wipe_tower_depth = WipeTower::get_limit_depth_by_height(max_height); depth = std::max((double)min_wipe_tower_depth, depth); @@ -4380,22 +4388,21 @@ void PartPlateList::set_default_wipe_tower_pos_for_plate(int plate_idx, bool ini f_volume_maps = wxGetApp().preset_bundle->get_default_nozzle_volume_types_for_filaments(filament_maps); } DynamicPrintConfig full_config = wxGetApp().preset_bundle->full_config(false, filament_maps, f_volume_maps); - const DynamicPrintConfig &print_cfg = wxGetApp().preset_bundle->prints.get_edited_preset().config; - float w = dynamic_cast(print_cfg.option("prime_tower_width"))->value; + float w = dynamic_cast(full_config.option("prime_tower_width"))->value; float v = dynamic_cast(full_config.option("prime_volume"))->value; bool enable_wrapping = false; const ConfigOptionBool *wrapping_opt = dynamic_cast(full_config.option("enable_wrapping_detection")); if (wrapping_opt) enable_wrapping = wrapping_opt->value; int nozzle_nums = wxGetApp().preset_bundle->get_printer_extruder_count(); - Vec3d wipe_tower_size = part_plate->estimate_wipe_tower_size(print_cfg, w, v, nozzle_nums, init_pos ? 2 : 0, false, enable_wrapping); + Vec3d wipe_tower_size = part_plate->estimate_wipe_tower_size(full_config, w, v, nozzle_nums, init_pos ? 2 : 0, false, enable_wrapping); if (!init_pos && (is_approx(wipe_tower_size(0), 0.0) || is_approx(wipe_tower_size(1), 0.0))) { - wipe_tower_size = part_plate->estimate_wipe_tower_size(print_cfg, w, v, nozzle_nums, 2, false, enable_wrapping); + wipe_tower_size = part_plate->estimate_wipe_tower_size(full_config, w, v, nozzle_nums, 2, false, enable_wrapping); } // Compute brim-aware margin: brim extends outward from tower position float brim_width = 0.f; - const ConfigOptionFloat *brim_opt = print_cfg.option("prime_tower_brim_width"); + const ConfigOptionFloat *brim_opt = full_config.option("prime_tower_brim_width"); if (brim_opt) { brim_width = brim_opt->value; if (brim_width < 0) brim_width = WipeTower::get_auto_brim_by_height((float) wipe_tower_size.z()); From b57d7a67e2125150818861a34ab25f386c6c3770 Mon Sep 17 00:00:00 2001 From: Ian Bassi Date: Thu, 6 Aug 2026 11:43:37 -0300 Subject: [PATCH 075/106] Regression version for Bug report (#15139) --- .github/ISSUE_TEMPLATE/bug_report.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 1b3ba3f407..63f74a069e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -32,9 +32,17 @@ body: attributes: label: OrcaSlicer Version description: Which version of Orca Slicer are you running? You can see the full version in `Help` -> `About Orca Slicer`. - placeholder: e.g. 1.9.0 + placeholder: e.g. 2.5.0 validations: required: true + - type: input + id: working_version + attributes: + label: Regression compared to a previous version + description: Did it work in a previous version? + placeholder: e.g. 2.3.2 + validations: + required: false - type: dropdown id: os_type attributes: From b281c91b99155219242dfcfcaec35beb01444430 Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Thu, 6 Aug 2026 17:54:11 +0300 Subject: [PATCH 076/106] Fix ignored filament-specific ironing speed override (#15082) Fix overridden ironing speed Use filament_ironing_speed for the active filament when configured, falling back to the process setting when unset. --- src/libslic3r/GCode.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index c20405781b..8e2e9f713c 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -7650,8 +7650,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, if (sloped) { speed = std::min(speed, m_config.scarf_joint_speed.get_abs_value(speed)); } - } - else if(path.role() == erInternalBridgeInfill) { + } else if(path.role() == erInternalBridgeInfill) { speed = m_config.get_abs_value_at("internal_bridge_speed", get_nozzle_config_index(m_writer.filament()->id())); } else if (path.role() == erOverhangPerimeter || path.role() == erSupportTransition || path.role() == erBridgeInfill) { speed = NOZZLE_CONFIG(bridge_speed); @@ -7662,7 +7661,10 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, } else if (path.role() == erTopSolidInfill) { speed = NOZZLE_CONFIG(top_surface_speed); } else if (path.role() == erIroning) { - speed = m_config.get_abs_value("ironing_speed"); + const size_t filament_idx = get_filament_config_index(m_writer.filament()->id()); + speed = m_config.filament_ironing_speed.is_nil(filament_idx) + ? m_config.get_abs_value("ironing_speed") + : m_config.filament_ironing_speed.get_at(filament_idx); } else if (path.role() == erBottomSurface) { speed = NOZZLE_CONFIG(initial_layer_infill_speed); } else if (path.role() == erGapFill) { From 945520b8274eddd61fae248235e0efed34a95cfc Mon Sep 17 00:00:00 2001 From: yw4z Date: Thu, 6 Aug 2026 17:58:39 +0300 Subject: [PATCH 077/106] QOL Add parent preset information next to detach preset checkbox and match checkbox style on Save Preset dialog (#15076) init --- src/slic3r/GUI/SavePresetDialog.cpp | 43 +++++++++++++++++++++++++---- src/slic3r/GUI/SavePresetDialog.hpp | 1 - 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/SavePresetDialog.cpp b/src/slic3r/GUI/SavePresetDialog.cpp index 52bcbed4de..e24a2fc497 100644 --- a/src/slic3r/GUI/SavePresetDialog.cpp +++ b/src/slic3r/GUI/SavePresetDialog.cpp @@ -111,13 +111,46 @@ SavePresetDialog::Item::Item(Preset::Type type, const std::string &suffix, wxBox sizer->Add(m_radio_group, 0, wxEXPAND | wxTOP | wxLEFT, BORDER_W); - if (parent->m_mode == comDevelop) { - m_detach_checkbox = new wxCheckBox(parent, wxID_ANY, _L("Detach from parent")); - sizer->Add(m_detach_checkbox, 0, wxALIGN_LEFT | wxALL, BORDER_W); + std::string inherits_str = sel_preset.inherits(); + if (parent->m_mode == comDevelop && !inherits_str.empty()) { + wxBoxSizer *detach_sizer = new wxBoxSizer(wxHORIZONTAL); + + auto detach_tooltip = _L("Copies all inherited values from the parent preset into this preset and removes the connection with the parent preset."); + + auto detach_checkbox = new ::CheckBox(parent); + detach_checkbox->SetToolTip(detach_tooltip); + + auto detach_label = new wxStaticText(parent, wxID_ANY, _L("Detach from parent")); + detach_label->SetFont(::Label::Body_14); + detach_label->SetForegroundColour(wxColour("#363636")); + detach_label->SetToolTip(detach_tooltip); + + detach_sizer->Add(detach_checkbox, 0, wxALIGN_LEFT | wxLEFT, BORDER_W); + detach_sizer->Add(detach_label , 0, wxALIGN_CENTRE_VERTICAL | wxLEFT, FromDIP(5)); + sizer->Add(detach_sizer, 0, wxEXPAND | wxTOP, BORDER_W); + sizer->AddSpacer(FromDIP(5)); + + auto parent_label = new wxStaticText(parent, wxID_ANY, inherits_str); + parent_label->SetFont(::Label::Body_12); + parent_label->SetForegroundColour(wxColour("#6B6B6B")); + parent_label->SetToolTip(_L("Parent preset")); + sizer->Add(parent_label, 0, wxEXPAND | wxLEFT, BORDER_W + FromDIP(24)); + + sizer->AddSpacer(FromDIP(5)); + // Set initial state (unchecked by default) - m_detach_checkbox->SetValue(m_detach); + detach_checkbox->SetValue(m_detach); // Bind the checkbox event to update the detach state for this item - m_detach_checkbox->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent&) { m_detach = m_detach_checkbox->GetValue(); }); + detach_checkbox->Bind(wxEVT_TOGGLEBUTTON, [this, detach_checkbox](wxCommandEvent&) { m_detach = detach_checkbox->GetValue(); }); + + auto on_toggle = [this, detach_checkbox]() { + detach_checkbox->SetValue(!detach_checkbox->GetValue()); + wxCommandEvent ev(wxEVT_TOGGLEBUTTON, detach_checkbox->GetId()); + ev.SetEventObject(detach_checkbox); + detach_checkbox->GetEventHandler()->ProcessEvent(ev); + }; + detach_label->Bind(wxEVT_LEFT_DOWN, [on_toggle](wxMouseEvent& e) {if(!e.LeftDClick()) on_toggle();}); + detach_label->Bind(wxEVT_LEFT_DCLICK, [on_toggle](wxMouseEvent& e) {on_toggle();}); } m_radio_group->Bind(wxEVT_COMMAND_RADIOBOX_SELECTED, [this](wxCommandEvent &e) { diff --git a/src/slic3r/GUI/SavePresetDialog.hpp b/src/slic3r/GUI/SavePresetDialog.hpp index 0b71325927..05aa1b2d39 100644 --- a/src/slic3r/GUI/SavePresetDialog.hpp +++ b/src/slic3r/GUI/SavePresetDialog.hpp @@ -75,7 +75,6 @@ class SavePresetDialog : public DPIDialog bool m_save_to_project {false}; RadioGroup* m_radio_group; // ORCA bool m_detach{false}; - wxCheckBox* m_detach_checkbox{nullptr}; void update(); }; From 7f10c73dce79dd94cf484610a03256c799c274b0 Mon Sep 17 00:00:00 2001 From: TheLegendTubaGuy <95944177+thelegendtubaguy@users.noreply.github.com> Date: Thu, 6 Aug 2026 16:26:42 -0500 Subject: [PATCH 078/106] Fix redundant QIDI startup tool changes (#15096) * Fix redundant QIDI startup tool changes Guard Q2, X-Max 4, and X-Plus 4 filament-change G-code so same-tool startup selections do not run the full cut, unload, and purge sequence. * Guard Q2C against redundant startup tool changes Skip the complete filament-change sequence when the requested tool is already selected during startup. * Bump Qidi profile version --- resources/profiles/Qidi.json | 2 +- resources/profiles/Qidi/machine/Qidi Q2 0.4 nozzle.json | 2 +- resources/profiles/Qidi/machine/Qidi Q2C 0.4 nozzle.json | 2 +- resources/profiles/Qidi/machine/Qidi X-Max 4 0.4 nozzle.json | 2 +- resources/profiles/Qidi/machine/Qidi X-Plus 4 0.4 nozzle.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/profiles/Qidi.json b/resources/profiles/Qidi.json index 9e7a290f96..0cf0c6bb7d 100644 --- a/resources/profiles/Qidi.json +++ b/resources/profiles/Qidi.json @@ -1,6 +1,6 @@ { "name": "Qidi", - "version": "02.04.00.08", + "version": "02.04.00.09", "force_update": "0", "description": "Qidi configurations", "machine_model_list": [ diff --git a/resources/profiles/Qidi/machine/Qidi Q2 0.4 nozzle.json b/resources/profiles/Qidi/machine/Qidi Q2 0.4 nozzle.json index 6f3115dbd5..6a0a91b2ac 100644 --- a/resources/profiles/Qidi/machine/Qidi Q2 0.4 nozzle.json +++ b/resources/profiles/Qidi/machine/Qidi Q2 0.4 nozzle.json @@ -17,7 +17,7 @@ "cooling_tube_length": "0", "parking_pos_retraction": "0", "extra_loading_move": "5", - "change_filament_gcode": "G1 Z{max_layer_z + 3.0} F1200\nTOOL_CHANGE_START F=[current_extruder] T=[next_extruder]\nBUFFER_MONITORING ENABLE=0\nDISABLE_ALL_SENSOR\nM106 S255\nMOVE_TO_TRASH\n{if long_retractions_when_cut[previous_extruder]}\nG1 E-{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{else}\nG1 E-10 F{old_filament_e_feedrate}\n{endif}\nM400\nCUT_FILAMENT T=[current_extruder]\nMOVE_TO_TRASH\nM106 P2 S0\nUNLOAD_T[current_extruder]\nT[next_extruder]\n{if nozzle_temperature_range_high[current_extruder] >= nozzle_temperature_range_high[next_extruder]}\nM104 S{nozzle_temperature_range_high[current_extruder]}\n{else}\nM104 S{nozzle_temperature_range_high[next_extruder]}\n{endif}\n; FLUSH_START\nM106 S25\nG1 E30 F300\n; FLUSH_END\n{if long_retractions_when_cut[previous_extruder]}\nG1 E{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{endif}\n{if flush_length_1 > 1}\n; FLUSH_START\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\nG1 E-[old_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\n{if flush_length_2 > 1}\n; FLUSH_START\nG1 X92 F9000\nG1 E[old_retract_length_toolchange] F300\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E-[new_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\n{if flush_length_3 > 1}\n; FLUSH_START\nG1 X85 F9000\nG1 E[new_retract_length_toolchange] F300\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E-[new_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\n{if flush_length_4 > 1}\n; FLUSH_START\nG1 X92 F9000\nG1 E[new_retract_length_toolchange] F300\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E-[new_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\nM400\nM106 S255\nM104 S[new_filament_temp]\nINIT_SYNC_BUFFER_STATE\nBUFFER_MONITORING ENABLE=1\nG1 E10 F25 \nM109 S[new_filament_temp]\nG1 E-5 F1800\nCLEAR_OOZE\nTOOL_CHANGE_END\nG1 Y270 F8000\nM106 S0\nG1 E2 F1800\nENABLE_ALL_SENSOR\n", + "change_filament_gcode": "{if current_extruder != next_extruder}\nG1 Z{max_layer_z + 3.0} F1200\nTOOL_CHANGE_START F=[current_extruder] T=[next_extruder]\nBUFFER_MONITORING ENABLE=0\nDISABLE_ALL_SENSOR\nM106 S255\nMOVE_TO_TRASH\n{if long_retractions_when_cut[previous_extruder]}\nG1 E-{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{else}\nG1 E-10 F{old_filament_e_feedrate}\n{endif}\nM400\nCUT_FILAMENT T=[current_extruder]\nMOVE_TO_TRASH\nM106 P2 S0\nUNLOAD_T[current_extruder]\nT[next_extruder]\n{if nozzle_temperature_range_high[current_extruder] >= nozzle_temperature_range_high[next_extruder]}\nM104 S{nozzle_temperature_range_high[current_extruder]}\n{else}\nM104 S{nozzle_temperature_range_high[next_extruder]}\n{endif}\n; FLUSH_START\nM106 S25\nG1 E30 F300\n; FLUSH_END\n{if long_retractions_when_cut[previous_extruder]}\nG1 E{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{endif}\n{if flush_length_1 > 1}\n; FLUSH_START\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\nG1 E-[old_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\n{if flush_length_2 > 1}\n; FLUSH_START\nG1 X92 F9000\nG1 E[old_retract_length_toolchange] F300\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E-[new_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\n{if flush_length_3 > 1}\n; FLUSH_START\nG1 X85 F9000\nG1 E[new_retract_length_toolchange] F300\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E-[new_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\n{if flush_length_4 > 1}\n; FLUSH_START\nG1 X92 F9000\nG1 E[new_retract_length_toolchange] F300\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E-[new_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\nM400\nM106 S255\nM104 S[new_filament_temp]\nINIT_SYNC_BUFFER_STATE\nBUFFER_MONITORING ENABLE=1\nG1 E10 F25 \nM109 S[new_filament_temp]\nG1 E-5 F1800\nCLEAR_OOZE\nTOOL_CHANGE_END\nG1 Y270 F8000\nM106 S0\nG1 E2 F1800\nENABLE_ALL_SENSOR\n{endif}\n", "default_filament_profile": [ "QIDI PLA Rapido @Qidi Q2 0.4 nozzle" ], diff --git a/resources/profiles/Qidi/machine/Qidi Q2C 0.4 nozzle.json b/resources/profiles/Qidi/machine/Qidi Q2C 0.4 nozzle.json index fbf61a6af9..9d4683885f 100644 --- a/resources/profiles/Qidi/machine/Qidi Q2C 0.4 nozzle.json +++ b/resources/profiles/Qidi/machine/Qidi Q2C 0.4 nozzle.json @@ -17,7 +17,7 @@ "cooling_tube_length": "0", "parking_pos_retraction": "0", "extra_loading_move": "5", - "change_filament_gcode": "G1 Z{max_layer_z + 3.0} F1200\nTOOL_CHANGE_START F=[current_extruder] T=[next_extruder]\nBUFFER_MONITORING ENABLE=0\nDISABLE_ALL_SENSOR\nM106 S255\nMOVE_TO_TRASH\n{if long_retractions_when_cut[previous_extruder]}\nG1 E-{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{else}\nG1 E-10 F{old_filament_e_feedrate}\n{endif}\nM400\nCUT_FILAMENT T=[current_extruder]\nMOVE_TO_TRASH\nM106 P2 S0\nUNLOAD_T[current_extruder]\nT[next_extruder]\n{if nozzle_temperature_range_high[current_extruder] >= nozzle_temperature_range_high[next_extruder]}\nM104 S{nozzle_temperature_range_high[current_extruder]}\n{else}\nM104 S{nozzle_temperature_range_high[next_extruder]}\n{endif}\n; FLUSH_START\nM106 S25\nG1 E30 F300\n; FLUSH_END\n{if long_retractions_when_cut[previous_extruder]}\nG1 E{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{endif}\n{if flush_length_1 > 1}\n; FLUSH_START\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\nG1 E-[old_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\n{if flush_length_2 > 1}\n; FLUSH_START\nG1 X92 F9000\nG1 E[old_retract_length_toolchange] F300\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E-[new_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\n{if flush_length_3 > 1}\n; FLUSH_START\nG1 X85 F9000\nG1 E[new_retract_length_toolchange] F300\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E-[new_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\n{if flush_length_4 > 1}\n; FLUSH_START\nG1 X92 F9000\nG1 E[new_retract_length_toolchange] F300\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E-[new_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\nM400\nM106 S255\nM104 S[new_filament_temp]\nINIT_SYNC_BUFFER_STATE\nBUFFER_MONITORING ENABLE=1\nG1 E10 F25 \nM109 S[new_filament_temp]\nG1 E-5 F1800\nCLEAR_OOZE\nTOOL_CHANGE_END\nG1 Y270 F8000\nM106 S0\nG1 E2 F1800\nENABLE_ALL_SENSOR\n", + "change_filament_gcode": "{if current_extruder != next_extruder}\nG1 Z{max_layer_z + 3.0} F1200\nTOOL_CHANGE_START F=[current_extruder] T=[next_extruder]\nBUFFER_MONITORING ENABLE=0\nDISABLE_ALL_SENSOR\nM106 S255\nMOVE_TO_TRASH\n{if long_retractions_when_cut[previous_extruder]}\nG1 E-{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{else}\nG1 E-10 F{old_filament_e_feedrate}\n{endif}\nM400\nCUT_FILAMENT T=[current_extruder]\nMOVE_TO_TRASH\nM106 P2 S0\nUNLOAD_T[current_extruder]\nT[next_extruder]\n{if nozzle_temperature_range_high[current_extruder] >= nozzle_temperature_range_high[next_extruder]}\nM104 S{nozzle_temperature_range_high[current_extruder]}\n{else}\nM104 S{nozzle_temperature_range_high[next_extruder]}\n{endif}\n; FLUSH_START\nM106 S25\nG1 E30 F300\n; FLUSH_END\n{if long_retractions_when_cut[previous_extruder]}\nG1 E{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{endif}\n{if flush_length_1 > 1}\n; FLUSH_START\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\nG1 E-[old_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\n{if flush_length_2 > 1}\n; FLUSH_START\nG1 X92 F9000\nG1 E[old_retract_length_toolchange] F300\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E-[new_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\n{if flush_length_3 > 1}\n; FLUSH_START\nG1 X85 F9000\nG1 E[new_retract_length_toolchange] F300\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E-[new_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\n{if flush_length_4 > 1}\n; FLUSH_START\nG1 X92 F9000\nG1 E[new_retract_length_toolchange] F300\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E-[new_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\nM400\nM106 S255\nM104 S[new_filament_temp]\nINIT_SYNC_BUFFER_STATE\nBUFFER_MONITORING ENABLE=1\nG1 E10 F25 \nM109 S[new_filament_temp]\nG1 E-5 F1800\nCLEAR_OOZE\nTOOL_CHANGE_END\nG1 Y270 F8000\nM106 S0\nG1 E2 F1800\nENABLE_ALL_SENSOR\n{endif}\n", "default_filament_profile": [ "QIDI PLA Rapido @Qidi Q2C 0.4 nozzle" ], diff --git a/resources/profiles/Qidi/machine/Qidi X-Max 4 0.4 nozzle.json b/resources/profiles/Qidi/machine/Qidi X-Max 4 0.4 nozzle.json index be754eb338..ef26c0a620 100644 --- a/resources/profiles/Qidi/machine/Qidi X-Max 4 0.4 nozzle.json +++ b/resources/profiles/Qidi/machine/Qidi X-Max 4 0.4 nozzle.json @@ -13,7 +13,7 @@ "bed_exclude_area": [ "0x0, 16x0, 16x13, 0x13, 0x0, 0x0, 0x0, 0x0, 0x13, 6x13, 6x23, 0x23, 0x13, 0x13, 0x13, 0x13, 0x387, 53x387, 53x390, 0x390, 0x387, 0x387, 0x397, 0x390, 338x390, 338x384, 390x384, 390x390, 0x390" ], - "change_filament_gcode": "G1 Z{max_layer_z + 3.0} F1200\nTOOL_CHANGE_START F=[current_extruder] T=[next_extruder]\nDISABLE_ALL_SENSOR\nM104 S{old_filament_temp - 10}\nM106 S255\n{if long_retractions_when_cut[previous_extruder]}\nG1 E-{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{else}\nG1 E-2 F{old_filament_e_feedrate}\n{endif}\nM400\nCUT_FILAMENT T=[current_extruder]\nMOVE_TO_TRASH\nM106 P2 S0\nUNLOAD_T[current_extruder]\nT[next_extruder]\nM106 S0\n{if nozzle_temperature_range_high[current_extruder] >= nozzle_temperature_range_high[next_extruder]}\nM104 S{nozzle_temperature_range_high[current_extruder]}\nM109.0 S{(nozzle_temperature_range_high[current_extruder])-25}\n{else}\nM104 S{nozzle_temperature_range_high[next_extruder]}\nM109.0 S{(nozzle_temperature_range_high[next_extruder])-25}\n{endif}\n{if long_retractions_when_cut[previous_extruder]}\nG1 E{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{endif}\n{if flush_length_1 > 1}\n; FLUSH_START\nG1 Y403.5 F2000\nG1 E{flush_length_1} F{old_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\n{if flush_length_2 > 1}\n; FLUSH_START\nG1 E{flush_length_2} F{new_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\n{if flush_length_3 > 1}\n; FLUSH_START\nG1 E{flush_length_3} F{new_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\n{if flush_length_4 > 1}\n; FLUSH_START\nG1 E{flush_length_4} F{new_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\nM400\nM106 S180\nM104 S{new_filament_temp - 10}\nG1 E1 F10\nM109.1 S{new_filament_temp - 10}\nG1 E-4 F1000\nG4 P2000\nM204 S5000\nG1 Y403 F2000\nG1 X163 F8000\nG1 X145 F5000\nG1 X163 F3000\nG1 X145 F2000\nG1 X175 F6000\nG1 X163\nG1 X175\nG1 X163\nG1 X175\nG1 X163\nG1 X180 F8000\nG1 Y380\nG1 X116\nG4 P2000\nG1 Y403 F3000\nG1 X130\nG1 X100 F8000\nG1 Y380\nG1 X116\nG1 Y403 F3000\nG1 X130 F3000\nG1 X100 F8000\nG1 Y380\nM104 S[new_filament_temp]\nTOOL_CHANGE_END\nG1 E{new_retract_length_toolchange + 1} F{new_filament_e_feedrate}\nENABLE_ALL_SENSOR\n", + "change_filament_gcode": "{if current_extruder != next_extruder}\nG1 Z{max_layer_z + 3.0} F1200\nTOOL_CHANGE_START F=[current_extruder] T=[next_extruder]\nDISABLE_ALL_SENSOR\nM104 S{old_filament_temp - 10}\nM106 S255\n{if long_retractions_when_cut[previous_extruder]}\nG1 E-{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{else}\nG1 E-2 F{old_filament_e_feedrate}\n{endif}\nM400\nCUT_FILAMENT T=[current_extruder]\nMOVE_TO_TRASH\nM106 P2 S0\nUNLOAD_T[current_extruder]\nT[next_extruder]\nM106 S0\n{if nozzle_temperature_range_high[current_extruder] >= nozzle_temperature_range_high[next_extruder]}\nM104 S{nozzle_temperature_range_high[current_extruder]}\nM109.0 S{(nozzle_temperature_range_high[current_extruder])-25}\n{else}\nM104 S{nozzle_temperature_range_high[next_extruder]}\nM109.0 S{(nozzle_temperature_range_high[next_extruder])-25}\n{endif}\n{if long_retractions_when_cut[previous_extruder]}\nG1 E{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{endif}\n{if flush_length_1 > 1}\n; FLUSH_START\nG1 Y403.5 F2000\nG1 E{flush_length_1} F{old_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\n{if flush_length_2 > 1}\n; FLUSH_START\nG1 E{flush_length_2} F{new_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\n{if flush_length_3 > 1}\n; FLUSH_START\nG1 E{flush_length_3} F{new_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\n{if flush_length_4 > 1}\n; FLUSH_START\nG1 E{flush_length_4} F{new_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\nM400\nM106 S180\nM104 S{new_filament_temp - 10}\nG1 E1 F10\nM109.1 S{new_filament_temp - 10}\nG1 E-4 F1000\nG4 P2000\nM204 S5000\nG1 Y403 F2000\nG1 X163 F8000\nG1 X145 F5000\nG1 X163 F3000\nG1 X145 F2000\nG1 X175 F6000\nG1 X163\nG1 X175\nG1 X163\nG1 X175\nG1 X163\nG1 X180 F8000\nG1 Y380\nG1 X116\nG4 P2000\nG1 Y403 F3000\nG1 X130\nG1 X100 F8000\nG1 Y380\nG1 X116\nG1 Y403 F3000\nG1 X130 F3000\nG1 X100 F8000\nG1 Y380\nM104 S[new_filament_temp]\nTOOL_CHANGE_END\nG1 E{new_retract_length_toolchange + 1} F{new_filament_e_feedrate}\nENABLE_ALL_SENSOR\n{endif}\n", "default_filament_profile": [ "QIDI PLA Rapido @Qidi X-Max 4 0.4 nozzle" ], diff --git a/resources/profiles/Qidi/machine/Qidi X-Plus 4 0.4 nozzle.json b/resources/profiles/Qidi/machine/Qidi X-Plus 4 0.4 nozzle.json index c4e758a451..82e9da78cb 100644 --- a/resources/profiles/Qidi/machine/Qidi X-Plus 4 0.4 nozzle.json +++ b/resources/profiles/Qidi/machine/Qidi X-Plus 4 0.4 nozzle.json @@ -60,7 +60,7 @@ "2" ], "single_extruder_multi_material": "1", - "change_filament_gcode": "{if max_layer_z < 12}\nG1 Z15 F1200\n{else}\nG1 Z{max_layer_z + 3.0} F1200\n{endif}\nTOOL_CHANGE_START F=[current_extruder] T=[next_extruder]\nDISABLE_ALL_SENSOR\n{if long_retractions_when_cut[previous_extruder]}\nMOVE_TO_TRASH\nG1 E-{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\nM400\n{else}\nG1 E-5 F{old_filament_e_feedrate}\n{endif}\nCUT_FILAMENT T=[current_extruder]\nMOVE_TO_TRASH\nM400\n{if nozzle_temperature_range_high[current_extruder] >= nozzle_temperature_range_high[next_extruder]}\nM104 S{nozzle_temperature_range_high[current_extruder]}\n{else}\nM104 S{nozzle_temperature_range_high[next_extruder]}\n{endif}\nM106 S0\nM106 P2 S0\nUNLOAD_T[current_extruder]\nG92 E0\nM83\nG1 E2 F50\nT[next_extruder]\n{if nozzle_temperature_range_high[current_extruder] >= nozzle_temperature_range_high[next_extruder]}\nSET_HEATER_TEMPERATURE HEATER=extruder TARGET={nozzle_temperature_range_high[current_extruder]} WAIT=1\n{else}\nSET_HEATER_TEMPERATURE HEATER=extruder TARGET={nozzle_temperature_range_high[next_extruder]} WAIT=1\n{endif}\n{if long_retractions_when_cut[previous_extruder]}\nG1 E{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{endif}\nM400\nM106 S60\n; FLUSH_START\nG1 E1 F50\nG1 E{65.5 * 0.58} F{old_filament_e_feedrate}\nG1 E{65.5 * 0.02} F50\nG1 E{65.5 * 0.18} F{old_filament_e_feedrate}\nG1 E{65.5 * 0.02} F50\nG1 E{65.5 * 0.18} F{old_filament_e_feedrate}\nG1 E{65.5 * 0.02} F50\nG1 E-[old_retract_length_toolchange] F1800\n; FLUSH_END\n{if flush_length_1 > 1}\nM400\nM106 S255\nG91\nG1 X-5 F60\nG1 X5 F60\nG90\nCLEAR_FLUSH\nM400\nM106 S60\n; FLUSH_START\nG1 E[old_retract_length_toolchange] F300\nG1 E{flush_length_1 * 0.58} F{new_filament_e_feedrate}\nG1 E{flush_length_1 * 0.02} F50\nG1 E{flush_length_1 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_1 * 0.02} F50\nG1 E{flush_length_1 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_1 * 0.02} F50\nG1 E-[old_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\n{if flush_length_2 > 1}\nM400\nM106 S255\nG91\nG1 X-5 F60\nG1 X5 F60\nG90\nCLEAR_FLUSH\nM400\nM106 S60\n; FLUSH_START\nG1 E[old_retract_length_toolchange] F300\nG1 E{flush_length_2 * 0.58} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E-[new_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\n{if flush_length_3 > 1}\nM400\nM106 S255\nG91\nG1 X-5 F60\nG1 X5 F60\nG90\nCLEAR_FLUSH\nM400\nM106 S60\n; FLUSH_START\nG1 E[new_retract_length_toolchange] F300\nG1 E{flush_length_3 * 0.58} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E-[new_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\n{if flush_length_4 > 1}\nM400\nM106 S255\nG91\nG1 X-5 F60\nG1 X5 F60\nG90\nCLEAR_FLUSH\nM400\nM106 S60\n; FLUSH_START\nG1 E[new_retract_length_toolchange] F300\nG1 E{flush_length_4 * 0.58} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E-[new_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\nM104 S[new_filament_temp]\nM400\nM106 S255\nG91\nG1 X-5 F60\nG1 X5 F60\nG90\nM109 S[new_filament_temp]\nG92 E0\nM400\nCLEAR_FLUSH\nCLEAR_OOZE\nM400\nM106 S0\nTOOL_CHANGE_END\nG1 Y305 F9000\nENABLE_ALL_SENSOR", + "change_filament_gcode": "{if current_extruder != next_extruder}\n{if max_layer_z < 12}\nG1 Z15 F1200\n{else}\nG1 Z{max_layer_z + 3.0} F1200\n{endif}\nTOOL_CHANGE_START F=[current_extruder] T=[next_extruder]\nDISABLE_ALL_SENSOR\n{if long_retractions_when_cut[previous_extruder]}\nMOVE_TO_TRASH\nG1 E-{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\nM400\n{else}\nG1 E-5 F{old_filament_e_feedrate}\n{endif}\nCUT_FILAMENT T=[current_extruder]\nMOVE_TO_TRASH\nM400\n{if nozzle_temperature_range_high[current_extruder] >= nozzle_temperature_range_high[next_extruder]}\nM104 S{nozzle_temperature_range_high[current_extruder]}\n{else}\nM104 S{nozzle_temperature_range_high[next_extruder]}\n{endif}\nM106 S0\nM106 P2 S0\nUNLOAD_T[current_extruder]\nG92 E0\nM83\nG1 E2 F50\nT[next_extruder]\n{if nozzle_temperature_range_high[current_extruder] >= nozzle_temperature_range_high[next_extruder]}\nSET_HEATER_TEMPERATURE HEATER=extruder TARGET={nozzle_temperature_range_high[current_extruder]} WAIT=1\n{else}\nSET_HEATER_TEMPERATURE HEATER=extruder TARGET={nozzle_temperature_range_high[next_extruder]} WAIT=1\n{endif}\n{if long_retractions_when_cut[previous_extruder]}\nG1 E{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{endif}\nM400\nM106 S60\n; FLUSH_START\nG1 E1 F50\nG1 E{65.5 * 0.58} F{old_filament_e_feedrate}\nG1 E{65.5 * 0.02} F50\nG1 E{65.5 * 0.18} F{old_filament_e_feedrate}\nG1 E{65.5 * 0.02} F50\nG1 E{65.5 * 0.18} F{old_filament_e_feedrate}\nG1 E{65.5 * 0.02} F50\nG1 E-[old_retract_length_toolchange] F1800\n; FLUSH_END\n{if flush_length_1 > 1}\nM400\nM106 S255\nG91\nG1 X-5 F60\nG1 X5 F60\nG90\nCLEAR_FLUSH\nM400\nM106 S60\n; FLUSH_START\nG1 E[old_retract_length_toolchange] F300\nG1 E{flush_length_1 * 0.58} F{new_filament_e_feedrate}\nG1 E{flush_length_1 * 0.02} F50\nG1 E{flush_length_1 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_1 * 0.02} F50\nG1 E{flush_length_1 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_1 * 0.02} F50\nG1 E-[old_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\n{if flush_length_2 > 1}\nM400\nM106 S255\nG91\nG1 X-5 F60\nG1 X5 F60\nG90\nCLEAR_FLUSH\nM400\nM106 S60\n; FLUSH_START\nG1 E[old_retract_length_toolchange] F300\nG1 E{flush_length_2 * 0.58} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E-[new_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\n{if flush_length_3 > 1}\nM400\nM106 S255\nG91\nG1 X-5 F60\nG1 X5 F60\nG90\nCLEAR_FLUSH\nM400\nM106 S60\n; FLUSH_START\nG1 E[new_retract_length_toolchange] F300\nG1 E{flush_length_3 * 0.58} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E-[new_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\n{if flush_length_4 > 1}\nM400\nM106 S255\nG91\nG1 X-5 F60\nG1 X5 F60\nG90\nCLEAR_FLUSH\nM400\nM106 S60\n; FLUSH_START\nG1 E[new_retract_length_toolchange] F300\nG1 E{flush_length_4 * 0.58} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E-[new_retract_length_toolchange] F1800\n; FLUSH_END\n{endif}\nM104 S[new_filament_temp]\nM400\nM106 S255\nG91\nG1 X-5 F60\nG1 X5 F60\nG90\nM109 S[new_filament_temp]\nG92 E0\nM400\nCLEAR_FLUSH\nCLEAR_OOZE\nM400\nM106 S0\nTOOL_CHANGE_END\nG1 Y305 F9000\nENABLE_ALL_SENSOR\n{endif}", "is_support_multi_box": "0", "machine_pause_gcode": "PAUSE", "thumbnails": [ From a684c6daf6256abdcba5ab261a0b874555ae926b Mon Sep 17 00:00:00 2001 From: Ian Bassi Date: Thu, 6 Aug 2026 18:44:40 -0300 Subject: [PATCH 079/106] Bump Creality (#15157) To apply https://github.com/OrcaSlicer/OrcaSlicer/pull/14654 --- resources/profiles/Creality.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/profiles/Creality.json b/resources/profiles/Creality.json index 8e91974b9c..077ee827e5 100644 --- a/resources/profiles/Creality.json +++ b/resources/profiles/Creality.json @@ -1,6 +1,6 @@ { "name": "Creality", - "version": "02.03.02.75", + "version": "02.03.02.76", "force_update": "0", "description": "Creality configurations", "machine_model_list": [ From f444176df86999d393b0c97f11f50b39d3a0609d Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Fri, 7 Aug 2026 12:13:25 +0300 Subject: [PATCH 080/106] Fix Windows crash after using "Replace all with 3D files" (#15102) Fix Windows crash in Replace all with 3D file Keep the replacement result message as wxString and substitute the volume name directly. On Windows, wxString::ToStdString() cannot encode the Unicode status icon through the active ANSI code page and returns an empty string. Passing that empty string to boost::format with a volume-name argument throws boost::too_many_args and exits OrcaSlicer. --- localization/i18n/OrcaSlicer.pot | 8 +++---- localization/i18n/ca/OrcaSlicer_ca.po | 24 ++++++++++----------- localization/i18n/cs/OrcaSlicer_cs.po | 24 ++++++++++----------- localization/i18n/de/OrcaSlicer_de.po | 24 ++++++++++----------- localization/i18n/en/OrcaSlicer_en.po | 16 +++++++------- localization/i18n/es/OrcaSlicer_es.po | 24 ++++++++++----------- localization/i18n/eu/OrcaSlicer_eu.po | 24 ++++++++++----------- localization/i18n/fr/OrcaSlicer_fr.po | 24 ++++++++++----------- localization/i18n/hu/OrcaSlicer_hu.po | 24 ++++++++++----------- localization/i18n/it/OrcaSlicer_it.po | 24 ++++++++++----------- localization/i18n/ja/OrcaSlicer_ja.po | 24 ++++++++++----------- localization/i18n/ko/OrcaSlicer_ko.po | 24 ++++++++++----------- localization/i18n/lt/OrcaSlicer_lt.po | 24 ++++++++++----------- localization/i18n/nl/OrcaSlicer_nl.po | 24 ++++++++++----------- localization/i18n/pl/OrcaSlicer_pl.po | 24 ++++++++++----------- localization/i18n/pt_BR/OrcaSlicer_pt_BR.po | 24 ++++++++++----------- localization/i18n/ru/OrcaSlicer_ru.po | 24 ++++++++++----------- localization/i18n/sv/OrcaSlicer_sv.po | 24 ++++++++++----------- localization/i18n/th/OrcaSlicer_th.po | 24 ++++++++++----------- localization/i18n/tr/OrcaSlicer_tr.po | 24 ++++++++++----------- localization/i18n/uk/OrcaSlicer_uk.po | 24 ++++++++++----------- localization/i18n/vi/OrcaSlicer_vi.po | 24 ++++++++++----------- localization/i18n/zh_CN/OrcaSlicer_zh_CN.po | 24 ++++++++++----------- localization/i18n/zh_TW/OrcaSlicer_zh_TW.po | 24 ++++++++++----------- src/slic3r/GUI/Plater.cpp | 10 ++++----- 25 files changed, 281 insertions(+), 281 deletions(-) diff --git a/localization/i18n/OrcaSlicer.pot b/localization/i18n/OrcaSlicer.pot index e83112d989..88e49a85fc 100644 --- a/localization/i18n/OrcaSlicer.pot +++ b/localization/i18n/OrcaSlicer.pot @@ -7781,19 +7781,19 @@ msgid "Replaced with 3D files from directory:\n" msgstr "" #, possible-boost-format -msgid "✖ Skipped %1%: same file.\n" +msgid "✖ Skipped %s: same file.\n" msgstr "" #, possible-boost-format -msgid "✖ Skipped %1%: file does not exist.\n" +msgid "✖ Skipped %s: file does not exist.\n" msgstr "" #, possible-boost-format -msgid "✖ Skipped %1%: failed to replace.\n" +msgid "✖ Skipped %s: failed to replace.\n" msgstr "" #, possible-boost-format -msgid "✔ Replaced %1%.\n" +msgid "✔ Replaced %s.\n" msgstr "" msgid "Replaced volumes" diff --git a/localization/i18n/ca/OrcaSlicer_ca.po b/localization/i18n/ca/OrcaSlicer_ca.po index ab80943ca0..79a9d82df4 100644 --- a/localization/i18n/ca/OrcaSlicer_ca.po +++ b/localization/i18n/ca/OrcaSlicer_ca.po @@ -8361,21 +8361,21 @@ msgstr "No s'ha seleccionat el directori per a la substitució" msgid "Replaced with 3D files from directory:\n" msgstr "Substituït amb fitxers 3D del directori:\n" -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ Omès %1%: mateix fitxer.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ Omès %s: mateix fitxer.\n" -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ Omès %1%: el fitxer no existeix.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ Omès %s: el fitxer no existeix.\n" -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ Omès %1%: la substitució ha fallat.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ Omès %s: la substitució ha fallat.\n" -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ Substituït %1%.\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ Substituït %s.\n" msgid "Replaced volumes" msgstr "Volums substituïts" diff --git a/localization/i18n/cs/OrcaSlicer_cs.po b/localization/i18n/cs/OrcaSlicer_cs.po index 63b69765d7..e21fd3086c 100644 --- a/localization/i18n/cs/OrcaSlicer_cs.po +++ b/localization/i18n/cs/OrcaSlicer_cs.po @@ -8320,21 +8320,21 @@ msgstr "Nebyla vybrána složka pro nahrazení" msgid "Replaced with 3D files from directory:\n" msgstr "Nahrazeno 3D soubory ze složky:\n" -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ Přeskočeno %1%: stejný soubor.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ Přeskočeno %s: stejný soubor.\n" -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ Přeskočeno %1%: soubor neexistuje.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ Přeskočeno %s: soubor neexistuje.\n" -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ Přeskočeno %1%: nahrazení se nezdařilo.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ Přeskočeno %s: nahrazení se nezdařilo.\n" -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ Nahrazeno %1%.\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ Nahrazeno %s.\n" msgid "Replaced volumes" msgstr "Nahrazené objemy" diff --git a/localization/i18n/de/OrcaSlicer_de.po b/localization/i18n/de/OrcaSlicer_de.po index b9389f5399..50384598e3 100644 --- a/localization/i18n/de/OrcaSlicer_de.po +++ b/localization/i18n/de/OrcaSlicer_de.po @@ -8191,21 +8191,21 @@ msgstr "Verzeichnis um daraus zu ersetzen wurde nicht ausgewählt" msgid "Replaced with 3D files from directory:\n" msgstr "Ersetzt durch 3D-Dateien aus Verzeichnis:\n" -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ Übersprungen %1%: gleiche Datei.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ Übersprungen %s: gleiche Datei.\n" -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ Übersprungen %1%: Datei existiert nicht.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ Übersprungen %s: Datei existiert nicht.\n" -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ Übersprungen %1%: Ersetzen fehlgeschlagen.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ Übersprungen %s: Ersetzen fehlgeschlagen.\n" -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ Ersetzt %1%.\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ Ersetzt %s.\n" msgid "Replaced volumes" msgstr "Ersetzte Volumen" diff --git a/localization/i18n/en/OrcaSlicer_en.po b/localization/i18n/en/OrcaSlicer_en.po index eb25f226ee..232820f681 100644 --- a/localization/i18n/en/OrcaSlicer_en.po +++ b/localization/i18n/en/OrcaSlicer_en.po @@ -7776,20 +7776,20 @@ msgstr "" msgid "Replaced with 3D files from directory:\n" msgstr "" -#, boost-format -msgid "✖ Skipped %1%: same file.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" msgstr "" -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" msgstr "" -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" msgstr "" -#, boost-format -msgid "✔ Replaced %1%.\n" +#, c-format +msgid "✔ Replaced %s.\n" msgstr "" msgid "Replaced volumes" diff --git a/localization/i18n/es/OrcaSlicer_es.po b/localization/i18n/es/OrcaSlicer_es.po index c1709fe45f..1913c4512a 100644 --- a/localization/i18n/es/OrcaSlicer_es.po +++ b/localization/i18n/es/OrcaSlicer_es.po @@ -7997,21 +7997,21 @@ msgstr "No se seleccionó el directorio para el reemplazo" msgid "Replaced with 3D files from directory:\n" msgstr "Reemplazado con archivos 3D desde el directorio:\n" -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ Omitido %1%: mismo archivo.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ Omitido %s: mismo archivo.\n" -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ Omitido %1%: el archivo no existe.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ Omitido %s: el archivo no existe.\n" -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ Omitido %1%: fallo al reemplazar.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ Omitido %s: fallo al reemplazar.\n" -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ Reemplazado %1%.\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ Reemplazado %s.\n" msgid "Replaced volumes" msgstr "Volúmenes reemplazados" diff --git a/localization/i18n/eu/OrcaSlicer_eu.po b/localization/i18n/eu/OrcaSlicer_eu.po index db9235b8c1..430e4f5a60 100644 --- a/localization/i18n/eu/OrcaSlicer_eu.po +++ b/localization/i18n/eu/OrcaSlicer_eu.po @@ -8064,21 +8064,21 @@ msgstr "Ez da ordezkatzeko direktoriorik hautatu" msgid "Replaced with 3D files from directory:\n" msgstr "Direktorio honetako 3D fitxategiekin ordeztuta:\n" -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ %1% saltatu da: fitxategi bera.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ %s saltatu da: fitxategi bera.\n" -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ %1% saltatu da: fitxategia ez da existitzen.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ %s saltatu da: fitxategia ez da existitzen.\n" -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ %1% saltatu da: ezin izan da ordeztu.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ %s saltatu da: ezin izan da ordeztu.\n" -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ %1% ordezkatu da.\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ %s ordezkatu da.\n" msgid "Replaced volumes" msgstr "Ordeztutako bolumenak" diff --git a/localization/i18n/fr/OrcaSlicer_fr.po b/localization/i18n/fr/OrcaSlicer_fr.po index 2d0fb14b5c..82f0239d0a 100644 --- a/localization/i18n/fr/OrcaSlicer_fr.po +++ b/localization/i18n/fr/OrcaSlicer_fr.po @@ -8120,21 +8120,21 @@ msgstr "Le répertoire pour le remplacement n'a pas été sélectionné" msgid "Replaced with 3D files from directory:\n" msgstr "Remplacé par des fichiers 3D depuis le répertoire :\n" -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ Ignoré %1% : même fichier.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ Ignoré %s : même fichier.\n" -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ Ignoré %1% : le fichier n'existe pas.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ Ignoré %s : le fichier n'existe pas.\n" -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ Ignoré %1% : échec du remplacement.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ Ignoré %s : échec du remplacement.\n" -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ Remplacé %1%.\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ Remplacé %s.\n" msgid "Replaced volumes" msgstr "Volumes remplacés" diff --git a/localization/i18n/hu/OrcaSlicer_hu.po b/localization/i18n/hu/OrcaSlicer_hu.po index bd4a9915c8..98cd987512 100644 --- a/localization/i18n/hu/OrcaSlicer_hu.po +++ b/localization/i18n/hu/OrcaSlicer_hu.po @@ -8244,21 +8244,21 @@ msgstr "A cseréhez nem lett mappa kiválasztva" msgid "Replaced with 3D files from directory:\n" msgstr "Cserélve a mappából származó 3D fájlokra:\n" -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ Kihagyva %1%: azonos fájl.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ %s kihagyva: azonos fájl.\n" -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ Kihagyva %1%: a fájl nem létezik.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ %s kihagyva: a fájl nem létezik.\n" -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ Kihagyva %1%: a csere sikertelen.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ %s kihagyva: a csere sikertelen.\n" -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ Lecserélve: %1%.\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔%s lecserélve.\n" msgid "Replaced volumes" msgstr "Lecserélt térfogatok" diff --git a/localization/i18n/it/OrcaSlicer_it.po b/localization/i18n/it/OrcaSlicer_it.po index 7be197c578..3c43178102 100644 --- a/localization/i18n/it/OrcaSlicer_it.po +++ b/localization/i18n/it/OrcaSlicer_it.po @@ -8244,21 +8244,21 @@ msgstr "La directory per la sostituzione non è stata selezionata" msgid "Replaced with 3D files from directory:\n" msgstr "Sostituito con file 3D dalla directory:\n" -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ Saltato %1%: stesso file.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ Saltato %s: stesso file.\n" -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ Saltato %1%: il file non esiste.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ Saltato %s: il file non esiste.\n" -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ Saltato %1%: sostituzione fallita.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ Saltato %s: sostituzione fallita.\n" -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ Sostituito %1%.\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ Sostituito %s.\n" msgid "Replaced volumes" msgstr "Volumi sostituiti" diff --git a/localization/i18n/ja/OrcaSlicer_ja.po b/localization/i18n/ja/OrcaSlicer_ja.po index 1c78f50b54..0d9f044060 100644 --- a/localization/i18n/ja/OrcaSlicer_ja.po +++ b/localization/i18n/ja/OrcaSlicer_ja.po @@ -8262,21 +8262,21 @@ msgstr "置換用のディレクトリが選択されていません" msgid "Replaced with 3D files from directory:\n" msgstr "ディレクトリの3Dファイルで置換しました:\n" -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ スキップ %1%: 同一ファイル。\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ スキップ %s: 同一ファイル。\n" -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ スキップ %1%: ファイルが存在しません。\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ スキップ %s: ファイルが存在しません。\n" -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ スキップ %1%: 置換に失敗しました。\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ スキップ %s: 置換に失敗しました。\n" -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ 置換しました %1%。\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ 置換しました %s。\n" msgid "Replaced volumes" msgstr "置換されたボリューム" diff --git a/localization/i18n/ko/OrcaSlicer_ko.po b/localization/i18n/ko/OrcaSlicer_ko.po index debb3fb818..5a6ac0438b 100644 --- a/localization/i18n/ko/OrcaSlicer_ko.po +++ b/localization/i18n/ko/OrcaSlicer_ko.po @@ -8288,24 +8288,24 @@ msgid "Replaced with 3D files from directory:\n" msgstr "다음 디렉터리의 3D 파일로 교체했습니다:\n" # AI Translated -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ 건너뜀 %1%: 동일한 파일입니다.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ 건너뜀 %s: 동일한 파일입니다.\n" # AI Translated -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ 건너뜀 %1%: 파일이 존재하지 않습니다.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ 건너뜀 %s: 파일이 존재하지 않습니다.\n" # AI Translated -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ 건너뜀 %1%: 교체하지 못했습니다.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ 건너뜀 %s: 교체하지 못했습니다.\n" # AI Translated -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ %1%을(를) 교체했습니다.\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ %s을(를) 교체했습니다.\n" # AI Translated msgid "Replaced volumes" diff --git a/localization/i18n/lt/OrcaSlicer_lt.po b/localization/i18n/lt/OrcaSlicer_lt.po index 23d2aae6f1..9a6b7ae590 100644 --- a/localization/i18n/lt/OrcaSlicer_lt.po +++ b/localization/i18n/lt/OrcaSlicer_lt.po @@ -8239,21 +8239,21 @@ msgstr "" "Pakeista 3D failais iš katalogo:\n" "\n" -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ Praleistas %1%: tas pats failas.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ Praleistas %s: tas pats failas.\n" -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ Praleistas %1%: failas neegzistuoja.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ Praleistas %s: failas neegzistuoja.\n" -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ Praleistas %1%: nepavyko pakeisti.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ Praleistas %s: nepavyko pakeisti.\n" -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ Pakeistas %1%.\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ Pakeistas %s.\n" msgid "Replaced volumes" msgstr "Pakeisti tūriai" diff --git a/localization/i18n/nl/OrcaSlicer_nl.po b/localization/i18n/nl/OrcaSlicer_nl.po index a7ef340804..1ae53b2888 100644 --- a/localization/i18n/nl/OrcaSlicer_nl.po +++ b/localization/i18n/nl/OrcaSlicer_nl.po @@ -8999,24 +8999,24 @@ msgid "Replaced with 3D files from directory:\n" msgstr "Vervangen door 3D-bestanden uit de map:\n" # AI Translated -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ Overgeslagen %1%: hetzelfde bestand.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ Overgeslagen %s: hetzelfde bestand.\n" # AI Translated -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ Overgeslagen %1%: bestand bestaat niet.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ Overgeslagen %s: bestand bestaat niet.\n" # AI Translated -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ Overgeslagen %1%: vervangen is mislukt.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ Overgeslagen %s: vervangen is mislukt.\n" # AI Translated -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ Vervangen %1%.\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ Vervangen %s.\n" # AI Translated msgid "Replaced volumes" diff --git a/localization/i18n/pl/OrcaSlicer_pl.po b/localization/i18n/pl/OrcaSlicer_pl.po index 8599e750e4..a0701dca09 100644 --- a/localization/i18n/pl/OrcaSlicer_pl.po +++ b/localization/i18n/pl/OrcaSlicer_pl.po @@ -8444,24 +8444,24 @@ msgid "Replaced with 3D files from directory:\n" msgstr "Zastąpiono plikami 3D z katalogu:\n" # AI Translated -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ Pominięto %1%: ten sam plik.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ Pominięto %s: ten sam plik.\n" # AI Translated -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ Pominięto %1%: plik nie istnieje.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ Pominięto %s: plik nie istnieje.\n" # AI Translated -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ Pominięto %1%: nie udało się zastąpić.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ Pominięto %s: nie udało się zastąpić.\n" # AI Translated -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ Zastąpiono %1%.\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ Zastąpiono %s.\n" # AI Translated msgid "Replaced volumes" diff --git a/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po b/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po index 58eabd99ef..14a479881f 100644 --- a/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po +++ b/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po @@ -8026,21 +8026,21 @@ msgstr "Diretório para substituição não foi selecionado" msgid "Replaced with 3D files from directory:\n" msgstr "Substituído por arquivos 3D do diretório:\n" -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ %1% Ignorados: mesmo arquivo.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ %s Ignorados: mesmo arquivo.\n" -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ %1% Ignorados: arquivo não existe.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ %s Ignorados: arquivo não existe.\n" -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ %1% Ignorados: falha ao substituir.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ %s Ignorados: falha ao substituir.\n" -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ %1% Substituídos.\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ %s Substituídos.\n" msgid "Replaced volumes" msgstr "Volumes substiruídos" diff --git a/localization/i18n/ru/OrcaSlicer_ru.po b/localization/i18n/ru/OrcaSlicer_ru.po index a0a48560ff..607890b047 100644 --- a/localization/i18n/ru/OrcaSlicer_ru.po +++ b/localization/i18n/ru/OrcaSlicer_ru.po @@ -8413,21 +8413,21 @@ msgstr "Расположение для замены не указано" msgid "Replaced with 3D files from directory:\n" msgstr "Заменено файлами из расположения:\n" -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ Пропущен %1%: идентичный файл.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ Пропущен %s: идентичный файл.\n" -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ Пропущен %1%: файл не существует.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ Пропущен %s: файл не существует.\n" -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ Пропущен %1%: не удалось заменить.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ Пропущен %s: не удалось заменить.\n" -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ Заменён %1%.\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ Заменён %s.\n" msgid "Replaced volumes" msgstr "Модели заменены" diff --git a/localization/i18n/sv/OrcaSlicer_sv.po b/localization/i18n/sv/OrcaSlicer_sv.po index 6d28e4e66f..5686fb7d8f 100644 --- a/localization/i18n/sv/OrcaSlicer_sv.po +++ b/localization/i18n/sv/OrcaSlicer_sv.po @@ -9088,24 +9088,24 @@ msgid "Replaced with 3D files from directory:\n" msgstr "Ersatt med 3D-filer från mappen:\n" # AI Translated -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ Hoppade över %1%: samma fil.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ Hoppade över %s: samma fil.\n" # AI Translated -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ Hoppade över %1%: filen finns inte.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ Hoppade över %s: filen finns inte.\n" # AI Translated -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ Hoppade över %1%: det gick inte att ersätta.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ Hoppade över %s: det gick inte att ersätta.\n" # AI Translated -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ Ersatte %1%.\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ Ersatte %s.\n" # AI Translated msgid "Replaced volumes" diff --git a/localization/i18n/th/OrcaSlicer_th.po b/localization/i18n/th/OrcaSlicer_th.po index 84b41505a9..6a4499d148 100644 --- a/localization/i18n/th/OrcaSlicer_th.po +++ b/localization/i18n/th/OrcaSlicer_th.po @@ -8199,21 +8199,21 @@ msgstr "ไม่ได้เลือกไดเรกทอรีสำหร msgid "Replaced with 3D files from directory:\n" msgstr "แทนที่ด้วยไฟล์ 3D จากไดเรกทอรี:\n" -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ ข้าม %1%: ไฟล์เดียวกัน\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ ข้าม %s: ไฟล์เดียวกัน\n" -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ ข้าม %1%: ไม่มีไฟล์อยู่\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ ข้าม %s: ไม่มีไฟล์อยู่\n" -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ ข้าม %1%: ไม่สามารถแทนที่ได้\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ ข้าม %s: ไม่สามารถแทนที่ได้\n" -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔แทนที่ %1%\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔แทนที่ %s\n" msgid "Replaced volumes" msgstr "ปริมาณที่ถูกแทนที่" diff --git a/localization/i18n/tr/OrcaSlicer_tr.po b/localization/i18n/tr/OrcaSlicer_tr.po index fd1ad673af..467b3c355b 100644 --- a/localization/i18n/tr/OrcaSlicer_tr.po +++ b/localization/i18n/tr/OrcaSlicer_tr.po @@ -8335,21 +8335,21 @@ msgstr "Değiştirme için dizin seçilmedi" msgid "Replaced with 3D files from directory:\n" msgstr "Dizindeki 3D dosyalarla değiştirildi:\n" -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ %1% atlandı: aynı dosya.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ %s atlandı: aynı dosya.\n" -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ %1% atlandı: dosya mevcut değil.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ %s atlandı: dosya mevcut değil.\n" -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ %1% atlandı: değiştirilemedi.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ %s atlandı: değiştirilemedi.\n" -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ %1% değiştirildi.\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ %s değiştirildi.\n" msgid "Replaced volumes" msgstr "Değiştirilen birimler" diff --git a/localization/i18n/uk/OrcaSlicer_uk.po b/localization/i18n/uk/OrcaSlicer_uk.po index 464cd4042a..9204a67ec3 100644 --- a/localization/i18n/uk/OrcaSlicer_uk.po +++ b/localization/i18n/uk/OrcaSlicer_uk.po @@ -8306,21 +8306,21 @@ msgstr "Каталог для заміни не вибрано" msgid "Replaced with 3D files from directory:\n" msgstr "Замінено 3D-файлами з каталогу:\n" -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ Пропущено %1%: той самий файл.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ Пропущено %s: той самий файл.\n" -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ Пропущено %1%: файл не існує.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ Пропущено %s: файл не існує.\n" -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ Пропущено %1%: не вдалося замінити.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ Пропущено %s: не вдалося замінити.\n" -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ Замінено %1%.\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ Замінено %s.\n" msgid "Replaced volumes" msgstr "Замінені обʼєми" diff --git a/localization/i18n/vi/OrcaSlicer_vi.po b/localization/i18n/vi/OrcaSlicer_vi.po index 2133579d50..e6e7adf43d 100644 --- a/localization/i18n/vi/OrcaSlicer_vi.po +++ b/localization/i18n/vi/OrcaSlicer_vi.po @@ -8721,24 +8721,24 @@ msgid "Replaced with 3D files from directory:\n" msgstr "Đã thay thế bằng file 3D từ thư mục:\n" # AI Translated -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ Đã bỏ qua %1%: cùng một file.\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ Đã bỏ qua %s: cùng một file.\n" # AI Translated -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ Đã bỏ qua %1%: file không tồn tại.\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ Đã bỏ qua %s: file không tồn tại.\n" # AI Translated -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ Đã bỏ qua %1%: thay thế thất bại.\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ Đã bỏ qua %s: thay thế thất bại.\n" # AI Translated -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ Đã thay thế %1%.\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ Đã thay thế %s.\n" # AI Translated msgid "Replaced volumes" diff --git a/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po b/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po index f7ca502c9e..345891f250 100644 --- a/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po +++ b/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po @@ -8028,21 +8028,21 @@ msgstr "未选择替换目录" msgid "Replaced with 3D files from directory:\n" msgstr "替换为目录中的 3D 文件:\n" -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ 跳过 %1%:同一文件。\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ 跳过 %s:同一文件。\n" -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ 跳过%1%:文件不存在。\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ 跳过%s:文件不存在。\n" -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ 跳过%1%:替换失败。\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ 跳过%s:替换失败。\n" -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ 替换了 %1%。\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ 替换了 %s。\n" msgid "Replaced volumes" msgstr "替换的卷" diff --git a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po index 912396eea8..9b37009978 100644 --- a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po +++ b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po @@ -8193,21 +8193,21 @@ msgstr "未選擇替換的目錄" msgid "Replaced with 3D files from directory:\n" msgstr "已從目錄替換為 3D 檔案:\n" -#, boost-format -msgid "✖ Skipped %1%: same file.\n" -msgstr "✖ 已跳過 %1%:相同檔案。\n" +#, c-format +msgid "✖ Skipped %s: same file.\n" +msgstr "✖ 已跳過 %s:相同檔案。\n" -#, boost-format -msgid "✖ Skipped %1%: file does not exist.\n" -msgstr "✖ 已跳過 %1%:檔案不存在。\n" +#, c-format +msgid "✖ Skipped %s: file does not exist.\n" +msgstr "✖ 已跳過 %s:檔案不存在。\n" -#, boost-format -msgid "✖ Skipped %1%: failed to replace.\n" -msgstr "✖ 已跳過 %1%:無法替換。\n" +#, c-format +msgid "✖ Skipped %s: failed to replace.\n" +msgstr "✖ 已跳過 %s:無法替換。\n" -#, boost-format -msgid "✔ Replaced %1%.\n" -msgstr "✔ 已替換 %1%。\n" +#, c-format +msgid "✔ Replaced %s.\n" +msgstr "✔ 已替換 %s。\n" msgid "Replaced volumes" msgstr "已替換體積" diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 3ee09fed06..8299125353 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -9501,7 +9501,7 @@ void Plater::priv::replace_all_with_stl() return; } - std::string status = _L("Replaced with 3D files from directory:\n").ToStdString() + out_path.string() + "\n\n"; + wxString status = _L("Replaced with 3D files from directory:\n") + from_u8(out_path.string()) + "\n\n"; for (unsigned int idx : volume_idxs) { const GLVolume* v = selection.get_volume(idx); @@ -9521,13 +9521,13 @@ void Plater::priv::replace_all_with_stl() std::string volume_name = volume->name; if (new_path == input_path) { - status += boost::str(boost::format(_L("✖ Skipped %1%: same file.\n").ToStdString()) % volume_name); + status += wxString::Format(_L("✖ Skipped %s: same file.\n"), from_u8(volume_name)); BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " skipping replace volume : same filename " << new_path; continue; } if (!fs::exists(new_path)) { - status += boost::str(boost::format(_L("✖ Skipped %1%: file does not exist.\n").ToStdString()) % volume_name); + status += wxString::Format(_L("✖ Skipped %s: file does not exist.\n"), from_u8(volume_name)); BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " cannot replace volume : filen does not exist " << new_path; continue; } @@ -9535,12 +9535,12 @@ void Plater::priv::replace_all_with_stl() BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " replacing volume : " << input_path << " with " << new_path; if (!replace_volume_with_stl(object_idx, volume_idx, new_path, _u8L("Replace with 3D file"))) { - status += boost::str(boost::format(_L("✖ Skipped %1%: failed to replace.\n").ToStdString()) % volume_name); + status += wxString::Format(_L("✖ Skipped %s: failed to replace.\n"), from_u8(volume_name)); BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " cannot replace volume : failed to replace with " << new_path; continue; } - status += boost::str(boost::format(_L("✔ Replaced %1%.\n").ToStdString()) % volume_name); + status += wxString::Format(_L("✔ Replaced %s.\n"), from_u8(volume_name)); } // update 3D scene From b5412221b6c051d88dc50c2f4f37716a78dcea99 Mon Sep 17 00:00:00 2001 From: Alexandre Folle de Menezes Date: Fri, 7 Aug 2026 09:22:42 -0300 Subject: [PATCH 081/106] Verify and improve AI pt_BR translations (#15080) --- localization/i18n/pt_BR/OrcaSlicer_pt_BR.po | 96 +++------------------ 1 file changed, 13 insertions(+), 83 deletions(-) diff --git a/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po b/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po index 14a479881f..0d777ec32e 100644 --- a/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po +++ b/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po @@ -17130,15 +17130,12 @@ msgstr "Quando este valor de retração for modificado, ele será usado como a q msgid "Support fast purge mode" msgstr "Suporte ao modo de purga rápida" -# AI Translated msgid "Whether this printer supports fast purge mode with optimized temperature and multiplier." msgstr "Se esta impressora suporta o modo de purga rápida com temperatura e multiplicador otimizados." -# AI Translated msgid "Filament change" msgstr "Troca de filamento" -# AI Translated msgid "The volume of material required to prime the extruder on the tower, excluding a hotend change." msgstr "O volume de material necessário para preparar a extrusora na torre, excluindo uma troca de hotend." @@ -18323,11 +18320,9 @@ msgstr "" "Há vários endereços IP resolvendo para o nome do host %1%.\n" "Por favor, selecione um que deve ser usado." -# AI Translated msgid "Auto-scale for nozzle" msgstr "Escala automática para o bico" -# AI Translated msgid "" "This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" "When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" @@ -18473,11 +18468,9 @@ msgstr "Velocidade Inicial: " msgid "End speed: " msgstr "Velocidade Final: " -# AI Translated msgid "Auto-adjust to max volumetric speed" msgstr "Ajuste automático à velocidade volumétrica máxima" -# AI Translated msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." msgstr "Se a velocidade final ultrapassar a velocidade volumétrica máxima do filamento, reduz automaticamente a altura de camada (mantendo valores padrão e respeitando os limites da máquina) para alcançá-la. Se nem mesmo a altura de camada mínima for suficiente, reduz a velocidade final." @@ -18492,7 +18485,6 @@ msgstr "" "passo >= 0\n" "fim > início + passo" -# AI Translated #, c-format, boost-format msgid "" "The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" @@ -18500,12 +18492,11 @@ msgid "" "\n" "%s" msgstr "" -"A velocidade final (%.0f mm/s) ultrapassa a velocidade volumétrica máxima do filamento (%.1f mm³/s), o que limita a parede externa a cerca de %.0f mm/s com esta largura de linha e altura de camada.\n" +"A velocidade final (%.0f mm/s) excede a velocidade volumétrica máxima do filamento (%.1f mm³/s), o que limita a parede externa a cerca de %.0f mm/s com esta largura de linha e altura de camada.\n" " Velocidades acima disso serão limitadas, portanto os blocos superiores da torre não serão impressos na velocidade solicitada.\n" "\n" "%s" -# AI Translated #, c-format, boost-format msgid "" "The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" @@ -18516,7 +18507,6 @@ msgstr "" "\n" "A altura de camada foi reduzida para %.2f mm (um valor usado pelos perfis desta impressora) para que a torre possa atingir a velocidade solicitada." -# AI Translated #, c-format, boost-format msgid "" "Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" @@ -18531,15 +18521,12 @@ msgstr "" "\n" "Continuar?" -# AI Translated msgid "Continue anyway?" msgstr "Continuar mesmo assim?" -# AI Translated msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" msgstr "Ativar \"Ajuste automático\" para corrigir isso automaticamente ou continuar mesmo assim?" -# AI Translated msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" msgstr "Ativar \"Escala automática para o bico\" e \"Ajuste automático\" para corrigir isso automaticamente ou continuar mesmo assim?" @@ -19644,9 +19631,8 @@ msgstr "Não foi possível decifrar a resposta do servidor." msgid "Error saving session to file" msgstr "Erro salvando sessão para arquivo" -# AI Translated msgid "Error session check" -msgstr "Verificação de sessão de erro" +msgstr "Erro na verificação de sessão" msgid "Error during file upload" msgstr "Erro durante a subida do arquivo" @@ -20079,9 +20065,8 @@ msgstr "Impressão Falhou" msgid "Removed" msgstr "Removido" -# AI Translated msgid "Enable smart filament assign: Assign one filament to multiple nozzles to maximize savings" -msgstr "Ativar atribuição inteligente de filamento: atribui um filamento a vários bicos para maximizar a economia" +msgstr "Ativar atribuição inteligente de filamento: Atribui um filamento a vários bicos para maximizar a economia" msgid "Fila Saving" msgstr "Econo Filamento" @@ -20119,7 +20104,6 @@ msgstr "Tutorial em vídeo" msgid "(Sync with printer)" msgstr "(Sinc. com impressora)" -# AI Translated #, c-format, boost-format msgid "Error: %s extruder has no available %s nozzle, current group result is invalid." msgstr "Erro: a extrusora %s não tem nenhum bico %s disponível, o resultado do grupo atual é inválido." @@ -20130,17 +20114,14 @@ msgstr "Vamos fatiar de acordo com este método de agrupamento:" msgid "Tip: You can drag the filaments to reassign them to different nozzles." msgstr "Dica: Você pode arrastar os filamentos para reatribuí-los a diferentes bicos." -# AI Translated msgid "Please adjust your grouping or click " msgstr "Por favor, ajuste seu agrupamento ou clique em " -# AI Translated msgid " to set nozzle count" msgstr " para definir o número de bicos" -# AI Translated msgid "Set the physical nozzle count..." -msgstr "Definir o número físico de bicos..." +msgstr "Definir o número de bicos físicos…" msgid "The filament grouping method for current plate is determined by the dropdown option at the slicing plate button." msgstr "O método de agrupamento de filamentos para a placa atual é determinado pela opção no botão de fatiamento da placa." @@ -20480,99 +20461,75 @@ msgstr "Numero de facetas triangulares" msgid "Calculating, please wait..." msgstr "Calculando, por favor aguarde…" -# AI Translated msgid "Save these settings as default" msgstr "Salvar estas configurações como padrão" -# AI Translated msgid "If enabled, the values above are stored as the defaults used for future STEP imports (and shown in Preferences)." msgstr "Se ativado, os valores acima são armazenados como os padrões usados para futuras importações STEP (e mostrados nas Preferências)." -# AI Translated msgid "PresetBundle" msgstr "PresetBundle" -# AI Translated msgid "Bundle folder does not exist." msgstr "A pasta do pacote não existe." -# AI Translated msgid "Failed to open folder." msgstr "Falha ao abrir a pasta." -# AI Translated msgid "Delete selected bundle from folder and all presets loaded from it?" msgstr "Excluir o pacote selecionado da pasta e todas as predefinições carregadas a partir dele?" -# AI Translated msgid "Delete Bundle" -msgstr "Excluir pacote" +msgstr "Excluir Pacote" -# AI Translated msgid "Failed to remove bundle." msgstr "Falha ao remover o pacote." -# AI Translated msgid "Remove Bundle" msgstr "Remover pacote" -# AI Translated msgid "Unsubscribe bundle?" msgstr "Cancelar a inscrição do pacote?" -# AI Translated msgid "UnsubscribeBundle" msgstr "UnsubscribeBundle" -# AI Translated msgid "Failed to unsubscribe bundle." msgstr "Falha ao cancelar a inscrição do pacote." -# AI Translated msgid "Unsubscribe Bundle" -msgstr "Cancelar inscrição do pacote" +msgstr "Cancelar inscrição do Pacote" -# AI Translated msgid "ExportPresetBundle" msgstr "ExportPresetBundle" -# AI Translated msgid "Save preset bundle" msgstr "Salvar pacote de predefinições" -# AI Translated msgid "Performing desktop integration failed - boost::filesystem::canonical did not return appimage path." msgstr "Falha ao realizar a integração com a área de trabalho - boost::filesystem::canonical não retornou o caminho do appimage." -# AI Translated msgid "Performing desktop integration failed - Could not find executable." msgstr "Falha ao realizar a integração com a área de trabalho - não foi possível encontrar o executável." -# AI Translated msgid "Performing desktop integration failed because the application directory was not found." msgstr "Falha ao realizar a integração com a área de trabalho porque o diretório do aplicativo não foi encontrado." -# AI Translated msgid "Performing desktop integration failed - could not create Gcodeviewer desktop file. OrcaSlicer desktop file was probably created successfully." msgstr "Falha ao realizar a integração com a área de trabalho - não foi possível criar o arquivo desktop do Gcodeviewer. O arquivo desktop do OrcaSlicer provavelmente foi criado com sucesso." -# AI Translated msgid "Performing downloader desktop integration failed - boost::filesystem::canonical did not return appimage path." msgstr "Falha ao realizar a integração do downloader com a área de trabalho - boost::filesystem::canonical não retornou o caminho do appimage." -# AI Translated msgid "Performing downloader desktop integration failed - Could not find executable." msgstr "Falha ao realizar a integração do downloader com a área de trabalho - não foi possível encontrar o executável." -# AI Translated msgid "Performing downloader desktop integration failed because the application directory was not found." msgstr "Falha ao realizar a integração do downloader com a área de trabalho porque o diretório do aplicativo não foi encontrado." -# AI Translated msgid "Desktop Integration" -msgstr "Integração com a área de trabalho" +msgstr "Integração com a Área de Trabalho" -# AI Translated msgid "" "Desktop Integration sets this binary to be searchable by the system.\n" "\n" @@ -20596,40 +20553,33 @@ msgstr "Arquivar pré-visualização" msgid "Open File" msgstr "Abrir Arquivo" -# AI Translated msgid "AMS Dryness Control" -msgstr "Controle de secura do AMS" +msgstr "Controle de Secura do AMS" -# AI Translated msgid "Filament Drying Settings" -msgstr "Configurações de secagem de filamento" +msgstr "Configurações de Secagem de Filamento" msgid "Stopping" msgstr "Parando" -# AI Translated msgid "Unable to dry temporarily due to ..." -msgstr "Não é possível secar temporariamente devido a ..." +msgstr "Não é possível secar temporariamente devido a…" msgid "Drying Error" msgstr "Erro de Secagem" -# AI Translated msgid "Please check the Assistant for troubleshooting" msgstr "Por favor, verifique o Assistente para solução de problemas" -# AI Translated msgid "Please remove and store the filament (as shown)." msgstr "Por favor, remova e guarde o filamento (como mostrado)." -# AI Translated msgid "The AMS can rotate the filament which is properly stored, providing better drying results." msgstr "O AMS pode girar o filamento que está corretamente armazenado, proporcionando melhores resultados de secagem." msgid "Rotate spool when drying" msgstr "Girar o carretel durante a secagem" -# AI Translated msgctxt "amsdrying" msgid "Back" msgstr "Voltar" @@ -20649,11 +20599,9 @@ msgstr " temperatura mínima de secagem é " msgid "This filament may not be completely dried." msgstr "Este filamento pode não estar completamente seco." -# AI Translated msgid "This AMS is currently printing. To ensure print quality, the drying temperature cannot exceed the recommended drying temperature." msgstr "Este AMS está imprimindo no momento. Para garantir a qualidade da impressão, a temperatura de secagem não pode exceder a temperatura de secagem recomendada." -# AI Translated msgid "The temperature shall not exceed the filament's heat distortion temperature" msgstr "A temperatura não deve exceder a temperatura de distorção térmica do filamento" @@ -20666,22 +20614,18 @@ msgstr "O valor máximo de tempo não pode ser superior a 24." msgid "Insufficient power" msgstr "Potência insuficiente" -# AI Translated msgid " Too many AMS drying simultaneously. Please plug in the power or stop other drying processes before starting." msgstr " Muitos AMS secando simultaneamente. Por favor, conecte à energia ou pare outros processos de secagem antes de iniciar." msgid "AMS is busy" msgstr "O AMS está ocupado" -# AI Translated msgid " AMS is calibrating | reading RFID | loading/unloading material, please wait." msgstr " O AMS está calibrando | lendo RFID | carregando/descarregando material, por favor aguarde." -# AI Translated msgid "Filament in AMS outlet" msgstr "Filamento na saída do AMS" -# AI Translated msgid " The high drying temperature may cause AMS blockage, please unload first." msgstr " A alta temperatura de secagem pode causar bloqueio do AMS, por favor descarregue primeiro." @@ -20694,18 +20638,15 @@ msgstr "Não suportado no modo 2D" msgid "Task in progress" msgstr "Tarefa em progresso" -# AI Translated msgid " The AMS might be in use during Task." msgstr " O AMS pode estar em uso durante a Tarefa." msgid " Firmware update in progress, please wait..." -msgstr " Atualização de firmware em progresso, por favor aguarde..." +msgstr " Atualização de firmware em progresso, por favor aguarde…" -# AI Translated msgid " Please plug in the power and then use the drying function." -msgstr " Por favor, conecte à energia e depois use a função de secagem." +msgstr " Por favor, conecte à energia e então use a função de secagem." -# AI Translated msgid " The high drying temperature may cause AMS blockage. Please unload the filament manually before proceeding." msgstr " A alta temperatura de secagem pode causar bloqueio do AMS. Por favor, descarregue o filamento manualmente antes de prosseguir." @@ -20713,7 +20654,7 @@ msgid "System is busy" msgstr "O sistema está ocupado" msgid " Initiating other drying processes, please wait a few seconds..." -msgstr " Iniciando outros processos de secagem, por favor aguarde alguns segundos..." +msgstr " Iniciando outros processos de secagem, por favor aguarde alguns segundos…" msgid "For better drying results, remove the filament and allow it to rotate." msgstr "Para obter melhores resultados de secagem, remova o filamento e permita que ele gire." @@ -21078,17 +21019,6 @@ msgstr "" #~ msgid "Rear" #~ msgstr "Traseira" -# AI Translated -#, boost-format -#~ msgid "" -#~ "Objects(%1%) have duplicated connectors. Some connectors may be missing in slicing result.\n" -#~ "Please report to PrusaSlicer team in which scenario this issue happened.\n" -#~ "Thank you." -#~ msgstr "" -#~ "Os objetos(%1%) têm conectores duplicados. Alguns conectores podem estar faltando no resultado do fatiamento.\n" -#~ "Por favor, informe à equipe do PrusaSlicer em qual cenário esse problema ocorreu.\n" -#~ "Obrigado." - #~ msgid "Skip for Now" #~ msgstr "Pular por Enquanto" From 8e243faa3a27a50baf12abafd567584222ef7d43 Mon Sep 17 00:00:00 2001 From: Clifford Date: Fri, 7 Aug 2026 08:26:18 -0400 Subject: [PATCH 082/106] Fix Linux unit test failure in the wipe tower temperature trace comparison (#15161) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Problem `Toolchange temperature commands are unchanged when the wipe tower wait is off` (added in #15144) fails on both Linux runners and passes on Windows and macOS. It is the only failing test in the suite, and it has been failing on main since that PR merged. | Job | Result | | --- | --- | | Windows x64 / Unit Tests | pass | | Windows arm64 / Unit Tests | pass | | macOS arm64 / Unit Tests | pass | | Linux x86_64 / Unit Tests | **fail** | | Linux aarch64 / Unit Tests | **fail** | From the merge commit ([Linux x86_64](https://github.com/OrcaSlicer/OrcaSlicer/actions/runs/31072382258/job/92531704095), [Linux aarch64](https://github.com/OrcaSlicer/OrcaSlicer/actions/runs/31072382258/job/92531704075)), still reproducing on current main: ``` first difference at trace entry 29 main: M104 S240 T0 ; preheat T0 time: 31s lead 30.9s branch: M104 S240 T0 ; preheat T0 time: 30s lead 30.3s ``` ## Cause Each preheat entry records the same quantity twice: `lead` at one decimal, and `time:` inside the command text as that value rounded to a whole second. `split_lead` already compares `lead` with a 0.5s tolerance and explains why the estimate moves. `time:` sits in the exactly-compared command text, so it never got that tolerance — and being rounded, it flips on a drift far below 0.5s (30.4 and 30.6 render as `30s` and `31s`). Entry 29 is the only entry in the 163-entry golden whose lead rounds up; every other preheat sits at 30.0–30.4 and rounds down, which is why it is the only one that fails. The variation is per-toolchain, not run to run. Both Linux arches produce exactly `lead 30.3s`; Windows x64/arm64 and macOS arm64 all produce exactly `30.9s`. Repeated local runs are byte-identical. macOS arm64 passing while Linux aarch64 fails rules out the ISA — it is floating-point accumulation over a few thousand move durations under GCC vs Clang vs MSVC. The mechanism makes it discrete rather than gradual: the backtrace parks the preheat at the first exported line at least `preheat_time` before the tool change, so `lead` is `preheat_time` plus the leftover of whichever move that landed on. A sub-tenth difference selects the neighbouring move and `lead` steps by that move's whole duration. Entries 1–28 match exactly, including five earlier preheats whose leads fall inside the existing tolerance, so the toolpaths themselves are identical. I also reverted the two prime-tower commits that landed between the golden's capture point and now, rebuilt, and got a byte-identical trace — this is not behavioural drift. That also rules out regenerating the golden: no single capture satisfies all three toolchains, and recapturing on Linux would turn the three currently-green runners red. ## Fix Test-only. - `lead` keeps a tolerance, widened to 1.5s (measured drift 0.6s; a preheat actually leaving its backtrace position would move by tens of seconds). - `time:` is **not** compared across runs at all. Being a rounding of `lead`, it carries nothing the tolerance does not already cover, and comparing it across runs can only reproduce the flake. It is instead checked against its own entry's `lead` — a correct rounding keeps `|time - lead| <= 0.5`. That second point matters: simply tolerating `time:` numerically would have made the test blind to a real change, because drift and a wrong rounding both move it by 1. The self-consistency check keeps that coverage. I verified it by changing `(int) std::round(time_diffs[0])` to `(int) time_diffs[0]` in `GCodeProcessor::export_lines` — the test fails with `"time:" is not its entry's "lead" rounded to a whole second`, where a plain tolerance would have passed silently. Everything else is still compared exactly: all M104/M109 values, tool ids, block markers, ordering, entry count, and the annotation text including its trailing `s`. The other 138 entries remain byte-exact. No production code, no golden regeneration. The golden file and these helpers are used by this one test and nothing else, and the tolerance only widens, so Windows and macOS keep passing unchanged. A note is added to the golden's header so the next mismatch in those fields is not "fixed" by recapturing. ## How to verify Before, on Linux: ```bash git checkout main && ./build_linux.sh -t ctest --test-dir build/tests -R "Toolchange temperature commands are unchanged" --output-on-failure # fails at trace entry 29 ``` After: ```bash cmake --build build --config Release --target fff_print_tests ctest --test-dir build/tests --output-on-failure # 463/463 ``` --- .../wipe_tower_temperature_trace_main.txt | 5 + tests/fff_print/test_multifilament.cpp | 95 ++++++++++++++++--- 2 files changed, 85 insertions(+), 15 deletions(-) diff --git a/tests/data/wipe_tower_temperature_trace_main.txt b/tests/data/wipe_tower_temperature_trace_main.txt index b7453bdc93..f755008c26 100644 --- a/tests/data/wipe_tower_temperature_trace_main.txt +++ b/tests/data/wipe_tower_temperature_trace_main.txt @@ -2,6 +2,11 @@ # captured from the main branch at a10d9e77cf. Regeneration is described # at the test that reads this file: "Toolchange temperature commands are unchanged # when the wipe tower wait is off" in tests/fff_print/test_multifilament.cpp. +# +# The "time:" and "lead" values are toolchain-specific -- GCC, Clang and MSVC each produce +# slightly different estimates from an identical toolpath -- so they are compared with a +# tolerance, not exactly. Do not regenerate this file to resolve a mismatch in them: no single +# capture satisfies all three, and recapturing just moves the failure to other platforms. M104 S215 T0 ; set nozzle temperature M104 S215 T1 ; set nozzle temperature ; CP PRIMING START diff --git a/tests/fff_print/test_multifilament.cpp b/tests/fff_print/test_multifilament.cpp index 081c0fa2ba..484b7fb68a 100644 --- a/tests/fff_print/test_multifilament.cpp +++ b/tests/fff_print/test_multifilament.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -165,28 +166,82 @@ static std::vector temperature_trace(const std::string& gcode) return trace; } -// Splits a trace entry into its command text and the lead time appended after a tab, if any. -static std::pair> split_lead(const std::string& entry) +// "M104 S240 T0 ; preheat T0 time: 31slead 30.9s" carries the same quantity twice, and both +// vary by toolchain: the backtrace picks the first line at least preheat_time out, so a sub-tenth +// difference in the estimate selects a neighbouring move and "lead" steps by that move's duration. +// Tolerate "lead", still far below the tens of seconds a displaced preheat would shift it. Check +// "time:" against its own entry's "lead" instead of across runs -- being a rounding of it, that +// still catches a change in how it is derived without tracking the absolute estimate. +static constexpr double TRACE_TIME_TOLERANCE_S = 1.5; +static constexpr double TRACE_ROUNDING_SLACK_S = 0.05; // correct rounding keeps |time - lead| <= 0.5 + +struct TraceEntry { - const size_t tab = entry.find('\t'); - if (tab == std::string::npos) - return { entry, std::nullopt }; - const std::string tail = entry.substr(tab + 1); // "lead 30.2s" - return { entry.substr(0, tab), std::stod(tail.substr(tail.find(' ') + 1)) }; + std::string text; // timing values replaced by a placeholder + std::optional time_s; + std::optional lead_s; +}; + +static TraceEntry parse_trace_entry(const std::string& entry) +{ + TraceEntry out; + std::string text = entry; + + // Split off the tail only when it really is a "lead s", so an unexpected one still compares. + const size_t tab = text.find('\t'); + if (tab != std::string::npos) { + const std::string tail = text.substr(tab + 1); // "lead 30.2s" + const size_t sp = tail.find(' '); + if (sp != std::string::npos && sp + 1 < tail.size() + && std::isdigit(static_cast(tail[sp + 1]))) { + out.lead_s = std::stod(tail.substr(sp + 1)); + text.erase(tab); + } + } + + static constexpr std::string_view k_time = "time: "; + const size_t at = text.find(k_time); + // Require a digit first: a dots-only run would otherwise reach std::stod and throw. + if (at != std::string::npos && at + k_time.size() < text.size() + && std::isdigit(static_cast(text[at + k_time.size()]))) { + const size_t first = at + k_time.size(); + size_t last = first; + while (last < text.size() && (std::isdigit(static_cast(text[last])) || text[last] == '.')) + ++last; + out.time_s = std::stod(text.substr(first, last - first)); + text.replace(first, last - first, ""); // surrounding text, incl. the "s", still compared + } + + out.text = std::move(text); + return out; } -// Same command, and a lead time within half a second. The lead is an estimate summed over every -// move before it, so it drifts slightly with unrelated changes to travel or tower geometry; half a -// second is far below the tens of seconds a preheat leaving its backtrace position would shift it. +static bool timings_match(const std::optional& a, const std::optional& b) +{ + if (a.has_value() != b.has_value()) + return false; + return !a.has_value() || std::abs(*a - *b) <= TRACE_TIME_TOLERANCE_S; +} + +// "time:" must be its own entry's "lead" rounded to a whole second. +static bool time_is_rounded_lead(const TraceEntry& e) +{ + if (!e.time_s.has_value() || !e.lead_s.has_value()) + return true; // nothing to cross-check + return std::abs(*e.time_s - *e.lead_s) <= 0.5 + TRACE_ROUNDING_SLACK_S; +} + +// `a` is the slice under test, `b` the recorded golden. static bool trace_entries_match(const std::string& a, const std::string& b) { - const auto x = split_lead(a); - const auto y = split_lead(b); - if (x.first != y.first) + const auto x = parse_trace_entry(a); + const auto y = parse_trace_entry(b); + if (x.text != y.text) return false; - if (x.second.has_value() != y.second.has_value()) + // A field appearing or disappearing is a real change even though the values are tolerated. + if (x.time_s.has_value() != y.time_s.has_value()) return false; - return !x.second.has_value() || std::abs(*x.second - *y.second) <= 0.5; + return timings_match(x.lead_s, y.lead_s) && time_is_rounded_lead(x); } // Tool index = filament id - 1; brim and skirt follow the wall filament. @@ -617,6 +672,16 @@ TEST_CASE("Toolchange temperature commands are unchanged when the wipe tower wai } REQUIRE(!golden.empty()); + // Reported separately from the golden comparison below: it is a different failure. + for (size_t i = 0; i < trace.size(); ++i) { + const auto entry = parse_trace_entry(trace[i]); + if (time_is_rounded_lead(entry)) + continue; + INFO("at trace entry " << i + 1); + INFO(" " << trace[i]); + FAIL("\"time:\" is not its entry's \"lead\" rounded to a whole second"); + } + const size_t common = std::min(trace.size(), golden.size()); for (size_t i = 0; i < common; ++i) { if (trace_entries_match(trace[i], golden[i])) From 6d9a9eeb04fea66ac6adcaf1a588a10a8c478342 Mon Sep 17 00:00:00 2001 From: Surfoo Date: Fri, 7 Aug 2026 14:31:57 +0200 Subject: [PATCH 083/106] i18n(fr): improve French localization quality and consistency. (#15106) --- localization/i18n/fr/OrcaSlicer_fr.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/localization/i18n/fr/OrcaSlicer_fr.po b/localization/i18n/fr/OrcaSlicer_fr.po index 82f0239d0a..1257994f16 100644 --- a/localization/i18n/fr/OrcaSlicer_fr.po +++ b/localization/i18n/fr/OrcaSlicer_fr.po @@ -9283,22 +9283,22 @@ msgid "DEV host: api-dev.bambu-lab.com/v1" msgstr "Hôte DEV : api-dev.bambu-lab.com/v1" msgid "QA host: api-qa.bambu-lab.com/v1" -msgstr "Hôte AQ : api-qa.bambu-lab.com/v1" +msgstr "Hôte QA : api-qa.bambu-lab.com/v1" msgid "PRE host: api-pre.bambu-lab.com/v1" -msgstr "Hébergeur PRE : api-pre.bambu-lab.com/v1" +msgstr "Hôte PRE : api-pre.bambu-lab.com/v1" msgid "Product host" msgstr "Hôte du produit" msgid "Debug save button" -msgstr "bouton d'enregistrement de débogage" +msgstr "Bouton d'enregistrement de debugage" msgid "Save debug settings" -msgstr "enregistrer les paramètres de débogage" +msgstr "Enregistrer les paramètres de debugage" msgid "Debug settings have been saved successfully!" -msgstr "Les paramètres DEBUG ont été enregistrés avec succès !" +msgstr "Les paramètres de debug ont été enregistrés avec succès !" msgid "Cloud environment switched; please login again!" msgstr "L'environnement Cloud a changé, veuillez vous reconnecter !" From b3296fa1996cae595f478d027bad8e1d7f1951a5 Mon Sep 17 00:00:00 2001 From: Felix14_v2 <75726196+Felix14-v2@users.noreply.github.com> Date: Fri, 7 Aug 2026 18:03:53 +0300 Subject: [PATCH 084/106] Review AI changes in Russian localization (#15092) * Review AI changes * Part 2 * Part 3 * Part 4 God bless Ian Alexis * Part 5 * Final part! * Catches by Gemma This 6-minute check probably saved me a week * Tweak * Update OrcaSlicer_ru.po --- localization/i18n/ru/OrcaSlicer_ru.po | 1330 ++++++++++--------------- 1 file changed, 508 insertions(+), 822 deletions(-) diff --git a/localization/i18n/ru/OrcaSlicer_ru.po b/localization/i18n/ru/OrcaSlicer_ru.po index 607890b047..c2fbcb54be 100644 --- a/localization/i18n/ru/OrcaSlicer_ru.po +++ b/localization/i18n/ru/OrcaSlicer_ru.po @@ -27,15 +27,12 @@ msgstr "Основной экструдер" msgid "main extruder" msgstr "основной экструдер" -# AI Translated msgid "Auxiliary Extruder" msgstr "Вспомогательный экструдер" -# AI Translated msgid "Auxiliary extruder" msgstr "Вспомогательный экструдер" -# AI Translated msgid "auxiliary extruder" msgstr "вспомогательный экструдер" @@ -57,27 +54,21 @@ msgstr "Правый экструдер" msgid "right extruder" msgstr "правый экструдер" -# AI Translated msgid "Main Nozzle" msgstr "Основное сопло" -# AI Translated msgid "Main nozzle" msgstr "Основное сопло" -# AI Translated msgid "main nozzle" msgstr "основное сопло" -# AI Translated msgid "Auxiliary Nozzle" msgstr "Вспомогательное сопло" -# AI Translated msgid "Auxiliary nozzle" msgstr "Вспомогательное сопло" -# AI Translated msgid "auxiliary nozzle" msgstr "вспомогательное сопло" @@ -99,67 +90,51 @@ msgstr "Правый экструдер" msgid "right nozzle" msgstr "правого сопла" -# AI Translated msgid "Main Hotend" msgstr "Основной хотэнд" -# AI Translated msgid "Main hotend" msgstr "Основной хотэнд" -# AI Translated msgid "main hotend" msgstr "основной хотэнд" -# AI Translated msgid "Auxiliary Hotend" msgstr "Вспомогательный хотэнд" -# AI Translated msgid "Auxiliary hotend" msgstr "Вспомогательный хотэнд" -# AI Translated msgid "auxiliary hotend" msgstr "вспомогательный хотэнд" -# AI Translated msgid "Left Hotend" msgstr "Левый хотэнд" -# AI Translated msgid "Left hotend" msgstr "Левый хотэнд" -# AI Translated msgid "left hotend" msgstr "левый хотэнд" -# AI Translated msgid "Right Hotend" msgstr "Правый хотэнд" -# AI Translated msgid "Right hotend" msgstr "Правый хотэнд" -# AI Translated msgid "right hotend" msgstr "правый хотэнд" -# AI Translated msgid "main" msgstr "основной" -# AI Translated msgid "auxiliary" msgstr "вспомогательный" -# AI Translated msgid "Main" msgstr "Основной" -# AI Translated msgid "Auxiliary" msgstr "Вспомогательный" @@ -279,7 +254,7 @@ msgstr "Высокий расход" msgid "Standard" msgstr "Обычный" -# AI Translated +# На бамбувики просто "хотэнд ТПУ". Очевидно, машинный перевод. Оставляю оригинальное. msgid "TPU High Flow" msgstr "TPU High Flow" @@ -295,7 +270,6 @@ msgstr "Нержавеющая сталь" msgid "Tungsten Carbide" msgstr "Карбид вольфрама" -# AI Translated msgid "The toolhead and hotend rack may move. Please keep your hands away from the chamber." msgstr "Печатающая голова и стойка хотэндов могут смещаться. Держите руки подальше от камеры." @@ -350,15 +324,12 @@ msgstr "Версия:" msgid "Latest version" msgstr "Последняя версия" -# AI Translated msgid "Row A" msgstr "Ряд A" -# AI Translated msgid "Row B" -msgstr "Ряд B" +msgstr "Ряд Б" -# AI Translated msgid "Toolhead" msgstr "Печатающая голова" @@ -368,9 +339,8 @@ msgstr "Пусто" msgid "Error" msgstr "Ошибка" -# AI Translated msgid "Induction Hotend Rack" -msgstr "Индукционная стойка хотэндов" +msgstr "Стойка индукционных хотэндов" msgid "Hotends Info" msgstr "Информация о хотэндах" @@ -384,30 +354,25 @@ msgstr "Чтение " msgid "Please wait" msgstr "Подождите" -# AI Translated msgid "Reading" msgstr "Чтение" -# AI Translated msgid "Running..." msgstr "Выполнение..." -# AI Translated +# Ряд msgid "Raised" -msgstr "Поднято" +msgstr "Поднят" -# AI Translated msgid "The hotend is in an abnormal state and currently unavailable. Please go to 'Device -> Upgrade' to upgrade firmware." -msgstr "Хотэнд находится в нештатном состоянии и сейчас недоступен. Перейдите в «Устройство -> Обновление», чтобы обновить прошивку." +msgstr "Хотэнд находится в нештатном состоянии и сейчас недоступен. Перейдите в «Принтер» → «Обновление», чтобы обновить прошивку." -# AI Translated msgid "Abnormal Hotend" msgstr "Нештатное состояние хотэнда" msgid "Cancel" msgstr "Отмена" -# AI Translated msgid "Jump to the upgrade page" msgstr "Перейти на страницу обновления" @@ -417,9 +382,8 @@ msgstr "Обновить" msgid "Refreshing" msgstr "Обновление" -# AI Translated msgid "Hotend status abnormal, unavailable at present. Please upgrade the firmware and try again." -msgstr "Состояние хотэнда нештатное, сейчас недоступно. Обновите прошивку и повторите попытку." +msgstr "Хотэнд находится в нештатном состоянии и сейчас недоступен. Обновите прошивку и попробуйте ещё раз." msgid "SN" msgstr "Серийный номер" @@ -431,19 +395,16 @@ msgstr "Версия" msgid "Used Time: %s" msgstr "Время использования: %s" -# AI Translated +# Полагаю, речь об этом https://wiki.bambulab.com/ru/software/bambu-studio/filament-track-switch-dynamic-mapping msgid "Dynamic nozzles are allocated on the current plate. Picking hotend is not supported." msgstr "На текущем столе назначены динамические сопла. Выбор хотэнда не поддерживается." -# AI Translated msgid "Hotend Rack" msgstr "Стойка хотэндов" -# AI Translated msgid "ToolHead" msgstr "Печатающая голова" -# AI Translated msgid "Nozzle information needs to be read" msgstr "Необходимо считать информацию о сопле" @@ -948,7 +909,6 @@ msgstr "Снять выбор" msgid "Select all connectors" msgstr "Выбрать все соединения" -# AI Translated msgctxt "Cut tool" msgid "Cut" msgstr "Разрезать" @@ -1885,14 +1845,14 @@ msgid "" "Select 2 faces on objects and \n" " make objects assemble together." msgstr "" -"Выберите две грани на моделях и\n" -"соберите объекты вместе." +"Выберите две грани на моделях и соберите\n" +"объекты вместе." msgid "" "Select 2 points or circles on objects and \n" " specify distance between them." msgstr "" -"Выберите 2 точки или окружности на моделях \n" +"Выберите 2 точки или окружности на моделях\n" "и укажите расстояние между ними." msgid "Face" @@ -1954,7 +1914,6 @@ msgstr "Запуск режима измерения" msgid "Leaving Measure gizmo" msgstr "Выход из режима измерения" -# AI Translated msgctxt "Assembly tool" msgid "Assemble" msgstr "Собрать" @@ -1968,8 +1927,9 @@ msgstr "Выберите минимум две модели." msgid "(Moving)" msgstr "(подвижная)" +# Пробел в конце, чтобы не срезалась часть msgid "Point and point assembly" -msgstr "Сборка по точкам" +msgstr "Сборка по точкам " # Зачем здесь "внимание"? Это просто руководство к действию msgid "Warning: please select two different meshes." @@ -1992,8 +1952,9 @@ msgstr "" "для получения возможности поднимать их\n" "над столом." +# Пробел в конце, чтобы не срезалась часть msgid "Face and face assembly" -msgstr "Сборка по граням" +msgstr "Сборка по граням " msgid "Entering Assembly gizmo" msgstr "Запуск режима сборки" @@ -2133,7 +2094,7 @@ msgstr "" "\n" "Для автоматического переноса существующих профилей войдите в Orca Cloud. Посетите нашу Вики, чтобы узнать подробнее о ручном переносе, хранении и синхронизации профилей.\n" "\n" -"Можно спокойно игнорировать это сообщение, если вы ранее не использовали Bambu Cloud для синхронизации." +"Можно спокойно игнорировать это сообщение, если вы ранее не использовали Bambu Cloud для синхронизации. " msgid "Profile syncing change" msgstr "Изменения в синхронизации профилей" @@ -2214,7 +2175,6 @@ msgstr "Загрузка плагинов" msgid "Plugin %s is no longer available." msgstr "Плагин «%s» больше недоступен." -# AI Translated #, c-format, boost-format msgid "Plugin %s access is unauthorized." msgstr "Доступ к плагину %s не авторизован." @@ -3661,10 +3621,9 @@ msgid "Left(Aux)" msgstr "Левый (вспом.)" # FAN_HEAT_BREAK_0_IDX - охлаждение термобарьера в первом хотэнде -# AI Translated msgctxt "Hotend Heat Breaker Fan" msgid "Hotend" -msgstr "Хотэнд" +msgstr "1 термобарьер" msgid "Parts" msgstr "Основной" @@ -3713,29 +3672,23 @@ msgstr "Подтверждение экструзии" msgid "Check filament location" msgstr "Проверка расположения прутка" -# AI Translated msgid "Switch" msgstr "Переключить" -# AI Translated msgid "hotend" msgstr "хотэнд" -# AI Translated msgid "Wait for AMS cooling" msgstr "Дождитесь охлаждения AMS" -# AI Translated msgid "Switch current filament at Filament Track Switch" msgstr "Переключить текущий материал на Filament Track Switch" -# AI Translated msgid "Pull back current filament at Filament Track Switch" msgstr "Втянуть текущий материал на Filament Track Switch" -# AI Translated msgid "Switch track at Filament Track Switch" -msgstr "Переключить дорожку на Filament Track Switch" +msgstr "Переключить подачу на Filament Track Switch" msgid "The maximum temperature cannot exceed " msgstr "Температура не должна превышать " @@ -3743,45 +3696,37 @@ msgstr "Температура не должна превышать " msgid "The minmum temperature should not be less than " msgstr "Температура не должна быть ниже " -# AI Translated msgid "Type to filter..." -msgstr "Введите текст для фильтрации..." +msgstr "Поиск..." # в Сохранение толщины вертикальной оболочки. # было Везде, но из-за условия совместимости изменено.... как тогда быть? msgid "All" msgstr "Все" -# AI Translated msgid "No selected items..." -msgstr "Нет выбранных элементов..." +msgstr "Ничего не выбрано..." -# AI Translated msgid "All items selected..." -msgstr "Выбраны все элементы..." +msgstr "Выбраны все..." -# AI Translated msgid "No matching items..." -msgstr "Нет подходящих элементов..." +msgstr "Ничего не найдено..." msgid "Deselect All" msgstr "Снять выбор со всего" -# AI Translated msgid "Select visible" msgstr "Выбрать видимые" -# AI Translated msgid "Deselect visible" msgstr "Снять выбор с видимых" -# AI Translated msgid "Filter selected" -msgstr "Отфильтровать выбранные" +msgstr "Фильтровать выбранные" -# AI Translated msgid "Filter nonSelected" -msgstr "Отфильтровать невыбранные" +msgstr "Фильтровать невыбранные" msgid "Simple settings" msgstr "Простые настройки" @@ -3799,18 +3744,15 @@ msgstr "Режим разработчика" msgid "Launch troubleshoot center" msgstr "Запустить экран отладки" -# AI Translated msgid "Set nozzle count" msgstr "Задать количество сопел" -# AI Translated msgid "Please set nozzle count" -msgstr "Задайте количество сопел" +msgstr "Укажите количество сопел" msgid "Error: Can not set both nozzle count to zero." msgstr "Ошибка: оба значения не могут быть нулевыми." -# AI Translated #, c-format, boost-format msgid "Error: Nozzle count can not exceed %d." msgstr "Ошибка: количество сопел не может превышать %d." @@ -3821,45 +3763,36 @@ msgstr "Подтвердить" msgid "Extruder" msgstr "Экструдер" -# AI Translated msgid "Nozzle Selection" msgstr "Выбор сопла" -# AI Translated msgid "Available Nozzles" msgstr "Доступные сопла" msgid "Nozzle Info" msgstr "Информация о сопле" -# AI Translated msgid "Sync Nozzle status" msgstr "Синхронизировать состояние сопла" -# AI Translated msgid "Caution: Mixing nozzle diameters in one print is not supported. If the selected size is only on one extruder, single-extruder printing will be enforced." -msgstr "Внимание: смешивание диаметров сопел в одной печати не поддерживается. Если выбранный размер есть только на одном экструдере, будет принудительно применена печать одним экструдером." +msgstr "Внимание: смешивание диаметров сопел в одной печати не поддерживается. Печать будет производиться одним соплом, если выбранный диаметр есть только на одном экструдере." -# AI Translated #, c-format, boost-format msgid "Refresh %d/%d..." -msgstr "Обновление %d/%d..." +msgstr "Обновить %d/%d..." -# AI Translated msgid "Unknown nozzle detected. Refresh to update info (unrefreshed nozzles will be excluded during slicing). Verify nozzle diameter & flow rate against displayed values." -msgstr "Обнаружено неизвестное сопло. Обновите, чтобы получить сведения (необновлённые сопла будут исключены при нарезке). Сверьте диаметр сопла и расход с отображаемыми значениями." +msgstr "Обнаружено неизвестное сопло. Обновите для получения сведений (неизвестные сопла будут исключены при нарезке). Сверьте диаметр сопла и расход с отображаемыми значениями." -# AI Translated msgid "Unknown nozzle detected. Refresh to update (unrefreshed nozzles will be skipped in slicing)." -msgstr "Обнаружено неизвестное сопло. Обновите для получения сведений (необновлённые сопла будут пропущены при нарезке)." +msgstr "Обнаружено неизвестное сопло. Обновите для получения сведений (неизвестные сопла будут пропущены при нарезке)." -# AI Translated msgid "Please confirm whether the required nozzle diameter and flow rate match the currently displayed values." msgstr "Убедитесь, что требуемый диаметр сопла и расход соответствуют отображаемым значениям." -# AI Translated msgid "Your printer has different nozzles installed. Please select a nozzle for this print." -msgstr "На вашем принтере установлены разные сопла. Выберите сопло для этой печати." +msgstr "В принтере установлены разные сопла. Выберите сопло для этой печати." msgid "Ignore" msgstr "Игнорировать" @@ -3888,15 +3821,14 @@ msgstr "Расстановка..." msgid "Arranging" msgstr "Расстановка" -# AI Translated msgid "Arranging " -msgstr "Расстановка " +msgstr "Расстановка: " msgid "Arranging canceled." msgstr "Расстановка отменена." msgid "Arranging complete, but some items were not able to be arranged. Reduce spacing and try again." -msgstr "Расстановка завершена, но не всё удалось уместить на столе. Уменьшите отступ расстановки и повторите попытку." +msgstr "Расстановка завершена, но не всё удалось уместить на столе. Уменьшите отступ и повторите попытку." msgid "Arranging done." msgstr "Расстановка выполнена." @@ -4346,8 +4278,8 @@ msgid "" "Lower half area: The filament from original project will be used when unmapped.\n" "And you can click it to modify" msgstr "" -"Верхняя половина: Исходный\n" -"Нижняя половина: При отсутствии назначения будет использоваться филамент из исходного проекта.\n" +"Сверху: оригинальный материал\n" +"Снизу: материал исходного проекта (если не назначен).\n" "Нажмите для изменения" msgid "" @@ -4357,7 +4289,7 @@ msgid "" msgstr "" "Сверху: оригинальный материал\n" "Снизу: материал из AMS\n" -"Нажмите, чтобы изменить" +"Нажмите для изменения" msgid "" "Upper half area: Original\n" @@ -4371,45 +4303,41 @@ msgid "AMS Slots" msgstr "Слоты AMS" msgid "Please select from the following filaments" -msgstr "Пожалуйста, выберите из следующих филаментов" +msgstr "Выберите из следующих материалов" -# AI Translated #, c-format, boost-format msgid "Select filament that installed to the %s" msgstr "Выберите материал, установленный в %s" msgid "Left AMS" -msgstr "Левый AMS" +msgstr "Левая AMS" +# Оверюзиниг: внешние мосты/внешняя катушка msgid "External" msgstr "Внешние" msgid "Reset current filament mapping" -msgstr "Сбросить текущее назначение филамента" +msgstr "Сбросить переназначенные материалы" msgid "Right AMS" -msgstr "Правый AMS" +msgstr "Правая AMS" #, c-format, boost-format msgid "Printing with the current nozzle may produce an extra %0.2f g of waste." msgstr "Печать текущим соплом может привести к дополнительным затратам %0.2f г материала." -# AI Translated #, c-format, boost-format msgid "Tips: the filament type(%s) does not match with the filament type(%s) in the slicing file. If you want to use this slot, you can install %s instead of %s and change slot information on the 'Device' page." -msgstr "Совет: тип материала (%s) не совпадает с типом материала (%s) в файле нарезки. Если вы хотите использовать этот слот, установите %s вместо %s и измените информацию о слоте на странице «Устройство»." +msgstr "Совет: тип материала (%s) не совпадает с типом материала (%s) в файле нарезки. Если вы хотите использовать этот слот, установите %s вместо %s и измените информацию о слоте на странице «Принтер»." -# AI Translated #, c-format, boost-format msgid "Cannot select: the filament type(%s) does not match with the filament type(%s) in the slicing file. If you want to use this slot, you can install %s instead of %s and change slot information on the 'Device' page." -msgstr "Невозможно выбрать: тип материала (%s) не совпадает с типом материала (%s) в файле нарезки. Если вы хотите использовать этот слот, установите %s вместо %s и измените информацию о слоте на странице «Устройство»." +msgstr "Невозможно выбрать: тип материала (%s) не совпадает с типом материала (%s) в файле нарезки. Если вы хотите использовать этот слот, установите %s вместо %s и измените информацию о слоте на странице «Принтер»." -# AI Translated #, c-format, boost-format msgid "Cannot select: the slot is empty or undefined. If you want to use this slot, you can install %s and change slot information on the 'Device' page." -msgstr "Невозможно выбрать: слот пуст или не определён. Если вы хотите использовать этот слот, установите %s и измените информацию о слоте на странице «Устройство»." +msgstr "Невозможно выбрать: слот пуст или не определён. Если вы хотите использовать этот слот, установите %s и измените информацию о слоте на странице «Принтер»." -# AI Translated msgid "Cannot select: No filament loaded in current slot." msgstr "Невозможно выбрать: в текущий слот не загружен материал." @@ -4451,12 +4379,10 @@ msgstr "Использовать для печати материал с вне msgid "Print with filament in AMS" msgstr "Печать материалом из AMS" -# AI Translated msgctxt "Nozzle position" msgid "Left" msgstr "Левое" -# AI Translated msgctxt "Nozzle position" msgid "Right" msgstr "Правое" @@ -4526,7 +4452,7 @@ msgid "Update remaining capacity" msgstr "Обновлять оставшуюся ёмкость катушки" msgid "AMS will attempt to estimate the remaining capacity of the Bambu Lab filaments." -msgstr "AMS попытается оценить оставшееся количество филаментов Bambu Lab." +msgstr "AMS будет пытаться оценивать оставшееся количество материалов Bambu Lab." msgid "AMS filament backup" msgstr "Резервирование материала AMS" @@ -4808,9 +4734,9 @@ msgid "" "\n" "The first layer height will be reset to 0.2." msgstr "" -"Нулевая высота начального слоя недопустима.\n" +"Нулевая высота первого слоя недопустима.\n" "\n" -"Высота первого слоя будет сброшена до 0.2." +"Значение будет сброшено до 0,2." # Оба первых предложения легко объединяются в одно. msgid "" @@ -5050,9 +4976,9 @@ msgstr "Измерение точности движений" msgid "Enhancing motion precision" msgstr "Улучшение точности движений" -# ??? Измерение точности позиционирования +# Относится к motion accuracy points – точкам фактического положения головы на сетке с эталонными координатами msgid "Measure motion accuracy" -msgstr "Измерение точности перемещения" +msgstr "Измерение точности позиционирования" msgid "Nozzle offset calibration" msgstr "Калибровка смещения сопла" @@ -5061,30 +4987,30 @@ msgid "High temperature auto bed leveling" msgstr "Измерение кривизны разогретого стола" msgid "Auto Check: Quick Release Lever" -msgstr "Автопроверка: быстросъёмный рычаг" +msgstr "Проверка: быстросъёмный модуль" msgid "Auto Check: Door and Upper Cover" -msgstr "Автопроверка: дверца и верхняя крышка" +msgstr "Проверка: дверца и верхняя крышка" msgid "Laser Calibration" msgstr "Калибровка лазера" msgid "Auto Check: Platform" -msgstr "Автопроверка: платформа" +msgstr "Проверка: стол" -# ??? Подтверждение положения камеры msgid "Confirming BirdsEye Camera location" -msgstr "Подтверждение расположения камеры BirdsEye" +msgstr "Подтверждение положения камеры" # ??? Калибровка ракурса камеры msgid "Calibrating BirdsEye Camera" msgstr "Калибровка камеры BirdsEye" +# Нет здесь никакого выравнивания, у бамбуков даже крутилок нет. Это просто снятие карты высот. msgid "Auto bed leveling -phase 1" -msgstr "Автоматическое выравнивание стола — фаза 1" +msgstr "Измерение кривизны стола — фаза 1" msgid "Auto bed leveling -phase 2" -msgstr "Автоматическое выравнивание стола — фаза 2" +msgstr "Измерение кривизны стола — фаза 2" msgid "Heating chamber" msgstr "Нагрев камеры" @@ -5096,19 +5022,22 @@ msgid "Printing calibration lines" msgstr "Печать калибровочных линий" msgid "Auto Check: Material" -msgstr "Автопроверка: материал" +msgstr "Проверка: материал" +# https://wiki.bambulab.com/ru/h2/troubleshooting/hmscode/0C00_0300_0002_0014#:~:text=калибровку%20камеры%20реального%20времени,-: msgid "Live View Camera Calibration" -msgstr "Калибровка камеры Live View" +msgstr "Калибровка камеры реального времени" msgid "Waiting for heatbed to reach target temperature" msgstr "Ожидание нагрева стола" +# у H2D система определяет, где лежит обрезок листа. Но может также относиться и к 3D-гравировке, где определяется расстояние до поверхности. msgid "Auto Check: Material Position" -msgstr "Автопроверка: положение материала" +msgstr "Проверка: положение заготовки" +# https://wiki.bambulab.com/ru/h2/troubleshooting/hmscode/0500_0400_0002_0037 msgid "Cutting Module Offset Calibration" -msgstr "Калибровка смещения режущего модуля" +msgstr "Калибровка смещения модуля резки" msgid "Measuring Surface" msgstr "Измерение поверхности" @@ -5141,7 +5070,7 @@ msgid "Timelapse is not supported while the storage is readonly." msgstr "Запись таймлапсов невозможна на защищённый от записи накопитель." msgid "To ensure your safety, certain processing tasks (such as laser) can only be resumed on printer." -msgstr "В целях безопасности некоторые задачи обработки (например, лазерная) могут быть возобновлены только на принтере." +msgstr "В целях безопасности некоторые виды обработки (например, лазерная) можно возобновить только вручную на принтере." #, c-format, boost-format msgid "The chamber temperature is too high, which may cause the filament to soften. Please wait until the chamber temperature drops below %d℃. You may open the front door or enable fans to cool down." @@ -5178,7 +5107,6 @@ msgstr "Не удалось сгенерировать калибровочны msgid "Calibration error" msgstr "Ошибка калибровки" -# AI Translated msgid "Network unavailable" msgstr "Сеть недоступна" @@ -5194,9 +5122,9 @@ msgstr "Продолжить (проблема решена)" msgid "Stop Printing" msgstr "Остановить печать" -# ??? Перейти к помощнику, Помощник по проверке +# "Ассистент" плохо ложится в "обратитесь к ассистенту", когда речь о руководстве. msgid "Check Assistant" -msgstr "Ассистент проверки" +msgstr "Помощник проверки" msgid "Filament Extruded, Continue" msgstr "Пруток выдавлен, продолжить" @@ -5217,9 +5145,9 @@ msgstr "Просмотр трансляции" msgid "No Reminder Next Time" msgstr "Больше не спрашивать" -# AI Translated +# Перепроверить msgid "Recheck" -msgstr "Проверить снова" +msgstr "Перепроверить" msgid "Ignore. Don't Remind Next Time" msgstr "Игнорировать и больше не спрашивать" @@ -5231,7 +5159,7 @@ msgid "Problem Solved and Resume" msgstr "Проблема решена, продолжить" msgid "Got it, Turn off the Fire Alarm." -msgstr "Понятно, выключить пожарную сигнализацию." +msgstr "Ясно, выключить пожарную сигнализацию." msgid "Retry (problem solved)" msgstr "Повторить (проблема решена)" @@ -5242,15 +5170,12 @@ msgstr "Остановить сушку" msgid "Proceed" msgstr "Продолжить" -# AI Translated msgid "Abort" msgstr "Прервать" -# AI Translated msgid "Disable Purification for This Print" msgstr "Отключить очистку воздуха для этой печати" -# AI Translated msgid "Don't Remind Me" msgstr "Не напоминать" @@ -5263,7 +5188,6 @@ msgstr "Продолжить" msgid "Unknown error." msgstr "Неизвестная ошибка." -# AI Translated msgid "Loading ..." msgstr "Загрузка ..." @@ -5344,8 +5268,9 @@ msgstr "слой(-я)" msgid "Range" msgstr "Диапазон" +# Подставляется в "По умолчанию" в подсказке к параметрам. Не уверен, нужно ли здесь "строка", может просто "пусто"? msgid "Empty string" -msgstr "Пустая строка" +msgstr "пустая строка" msgid "Value is out of range." msgstr "Введённое значение вне диапазона." @@ -5731,7 +5656,7 @@ msgid "Fan speed (%)" msgstr "Скорость вентилятора (%)" msgid "Temperature (℃)" -msgstr "Температура (°C)" +msgstr "Температура (℃)" msgid "Volumetric flow rate (mm³/s)" msgstr "Объёмный расход (мм³/с)" @@ -5815,9 +5740,8 @@ msgid "Adaptive" msgstr "Адаптировать" msgid "Quality / Speed" -msgstr "Качество/Скорость" +msgstr "Качество/скорость" -# AI Translated msgctxt "Mesh action" msgid "Smooth" msgstr "Сгладить" @@ -5919,7 +5843,6 @@ msgstr "Избегать зону калибровки экструзии" msgid "Align to Y axis" msgstr "Выравнивать по оси Y" -# AI Translated msgctxt "Camera View" msgid "Front" msgstr "Спереди" @@ -5928,13 +5851,11 @@ msgctxt "Camera View" msgid "Back" msgstr "Сзади" -# AI Translated #. TRN To be shown in the main menu View->Top msgctxt "Camera View" msgid "Top" msgstr "Сверху" -# AI Translated #. TRN To be shown in the main menu View->Bottom msgctxt "Camera View" msgid "Bottom" @@ -6007,7 +5928,7 @@ msgstr "Назад" # 2026). Похоже, это внутреннее название кнопки с панелью управления визуалом # пространства моделей. msgid "Canvas Toolbar" -msgstr "Панель инструментов холста" +msgstr "Панель инструментов рабочей области" # Тут баг с переносом строк, каждое слово переносится. Чем короче – тем лучше. msgid "Fit camera to scene or selected object." @@ -6138,7 +6059,7 @@ msgid "PLA and PETG filaments detected in the mixture. Adjust parameters accordi msgstr "Обнаружено совместное использование PLA и PETG. Для повышения качества рекомендуется настроить печать в соответствии с" msgid "The prime tower extends beyond the plate boundary." -msgstr "Башня очистки выходит за пределы области печати." +msgstr "Черновая башня выходит за пределы области печати." # После строки подставляется кнопка настройки msgid "Partial flushing volume set to 0. Multi-color printing may cause color mixing in models. Please readjust flushing settings." @@ -6231,15 +6152,16 @@ msgid "" "You can find it in \"Settings > Network > Access code\"\n" "on the printer, as shown in the figure:" msgstr "" -"Вы можете найти его на принтере в разделе \n" -"Настройки > Сеть > Код подключения, как показано на рисунке:" +"Его можно найти на принтере в разделе\n" +"«Настройки» > «Сеть» > «Код подключения», как показано на рисунке:" msgid "" "You can find it in \"Setting > Setting > LAN only > Access Code\"\n" "on the printer, as shown in the figure:" msgstr "" -"Вы можете найти его в «Настройки > Настройки > Только LAN > Код доступа»\n" -"на принтере, как показано на рисунке:" +"Его можно найти на принтере в разделе\n" +"«Настройки» > «Настройки» > «Только LAN» > «Код доступа»,\n" +"как показано на рисунке:" msgid "Invalid input" msgstr "Неверный ввод" @@ -6283,7 +6205,7 @@ msgid "No" msgstr "Нет" msgid "will be closed before creating a new model. Do you want to continue?" -msgstr "будет закрыт перед созданием новой модели. Продолжить?" +msgstr "будет закрыт перед созданием нового проекта. Продолжить?" # Возможно, имеет смысл убрать тут "стол". Подавляющее большинство проектов – # это размещение моделей и их печать на одном столе, поэтому намёк на работу с @@ -6372,7 +6294,6 @@ msgstr "Вид снизу" msgid "Front View" msgstr "Вид спереди" -# AI Translated msgctxt "Camera View" msgid "Rear" msgstr "Сзади" @@ -6589,7 +6510,6 @@ msgstr "Отображение контура вокруг выбранных м msgid "Preferences" msgstr "Настройки" -# AI Translated msgctxt "Menu" msgid "Edit" msgstr "Правка" @@ -7009,7 +6929,7 @@ msgstr "" "Если накопитель не определяется, попробуйте отформатировать его." msgid "The firmware version of the printer is too low. Please update the firmware and try again." -msgstr "Версия прошивки принтера слишком старая. Пожалуйста, обновите прошивку и попробуйте снова." +msgstr "Слишком старая версия прошивки принтера. Пожалуйста, обновите прошивку и попробуйте снова." msgid "The file already exists, do you want to replace it?" msgstr "Файл уже существует, заменить?" @@ -7217,7 +7137,6 @@ msgstr "Настройки печати" msgid "Safety Options" msgstr "Настройки защиты" -# AI Translated msgid "Hotends" msgstr "Хотэнды" @@ -7254,11 +7173,9 @@ msgstr "Во время паузы смена материала поддерж msgid "Current extruder is busy changing filament." msgstr "В экструдере производится смена материала." -# AI Translated msgid "\"Load\" or \"Unload\" is not supported for external spool while using Filament Track Switch." msgstr "«Загрузка» и «Выгрузка» не поддерживаются для внешней катушки при использовании Filament Track Switch." -# AI Translated msgid "The Filament Track Switch has not been setup. Please setup on printer." msgstr "Filament Track Switch не настроен. Выполните настройку на принтере." @@ -7268,10 +7185,9 @@ msgstr "Слот уже занят." msgid "The selected slot is empty." msgstr "Выбранный слот пуст." -# Так и не нашёл, что это за 2D-режим такой. Выводится в пояснении к -# отключённой функции. +# Так и не нашёл, что это за 2D-режим такой. Выводится в пояснении к отключённой кнопке калибровки. Вероятно, блокировка калибровок печати у H2D при работе с лазерной (и не только) резкой msgid "Printer 2D mode does not support 3D calibration" -msgstr "2D-режим принтера не поддерживает 3D-калибровку" +msgstr "3D-калиброка недоступна в 2D-режиме" msgid "Downloading..." msgstr "Загрузка..." @@ -7298,7 +7214,7 @@ msgid "Chamber temperature cannot be changed in cooling mode while printing." msgstr "Температуру камеры нельзя изменить при печати в режиме «Охлаждение»." msgid "If the chamber temperature exceeds 40℃, the system will automatically switch to heating mode. Please confirm whether to switch." -msgstr "Если температура камеры превысит 40℃, система автоматически переключится в режим нагрева. Подтвердите переключение." +msgstr "Если температура камеры превышает 40℃, система автоматически переключится в режим нагрева. Подтвердите переключение." msgid "Please select an AMS slot before calibration" msgstr "Пожалуйста, выберите слот AMS перед калибровкой" @@ -7440,6 +7356,7 @@ msgctxt "Firmware" msgid "Update" msgstr "Обновление" +# https://wiki.bambulab.com/ru/hms/home msgid "Assistant(HMS)" msgstr "Помощник (HMS)" @@ -7653,7 +7570,7 @@ msgid "Serious warning:" msgstr "Серьёзное предупреждение:" msgid " (Repair)" -msgstr " (Восстановить)" +msgstr "(Восстановить)" msgid " Click here to install it." msgstr " Нажмите здесь, чтобы установить." @@ -7701,33 +7618,27 @@ msgctxt "Layers" msgid "Bottom" msgstr "Снизу" -# AI Translated msgid "Plugin Selection" -msgstr "Выбор плагина" +msgstr "Выбор плагинов" -# AI Translated msgid "" "No plugins capabilities available for this type.\n" "Enable or install some to use." msgstr "" -"Для этого типа нет доступных возможностей плагинов.\n" +"Плагины с требуемым функционалом отсутствуют для этого типа.\n" "Включите или установите их для использования." -# AI Translated msgid "There is stringing-prone filament in the current print job. Enabling nozzle clumping detection now may degrade print quality. Are you sure you want to enable it?" -msgstr "В текущем задании печати есть материал, склонный к образованию волос. Включение обнаружения налипания на сопло сейчас может ухудшить качество печати. Вы уверены, что хотите включить его?" +msgstr "В текущем проекте есть материал, склонный к образованию паутины. Работа проверки налипаний на сопле сейчас может ухудшить качество печати. Вы действительно хотите включить её?" -# AI Translated msgid "Enable Nozzle Clumping Detection" msgstr "Включить обнаружение налипания на сопло" -# AI Translated msgid "When enabled, the printer will automatically capture photos of printed parts and upload them to the cloud. Would you like to enable this option?" -msgstr "Когда включено, принтер будет автоматически делать фотографии печатаемых деталей и загружать их в облако. Хотите включить эту опцию?" +msgstr "Принтер будет автоматически делать фотографии печатаемых деталей и загружать их в облако. Включить эту настройку?" -# AI Translated msgid "Confirm Enable Print Status Snapshot" -msgstr "Подтвердите включение снимков состояния печати" +msgstr "Подтверждение активации снимков состояния печати" msgid "Enable detection of build plate position" msgstr "Определение положения покрытия" @@ -7741,28 +7652,23 @@ msgstr "Обнаружение покрытия стола" msgid "Identifies the type and position of the build plate on the heatbed. Pausing printing if a mismatch is detected." msgstr "Определение типа и положения покрытия стола. В случае обнаружения смещения печать приостанавливается." -# AI Translated msgid "Purifies the chamber air as the print finishes, based on the selected mode." msgstr "Очищает воздух в камере по завершении печати в соответствии с выбранным режимом." -# AI Translated msgid "Purifies the chamber air through internal circulation as each print finishes." msgstr "Очищает воздух в камере за счёт внутренней циркуляции по завершении каждой печати." -# AI Translated msgid "Automatically match the corresponding switch strategy for leak-prone filaments (disable blob detection) and regular filaments (enable blob detection)." -msgstr "Автоматически подбирает соответствующую стратегию переключения для склонных к вытеканию материалов (отключает обнаружение налипаний) и обычных материалов (включает обнаружение налипаний)." +msgstr "Автоматически подбирает соответствующую стратегию для склонных к подтёкам материалов (отключает обнаружение налипаний) и обычных материалов (включает обнаружение налипаний)." -# AI Translated msgid "Detect whether the nozzle is wrapped by filament or other foreign matter." -msgstr "Определяет, обмотано ли сопло материалом или иными посторонними частицами." +msgstr "Определяет налипший на сопло пластик или иные объекты." -# AI Translated msgid "After disabling, nozzle wrapping cannot be detected, which may lead to print failure or nozzle damage." -msgstr "После отключения обмотку сопла нельзя будет обнаружить, что может привести к сбою печати или повреждению сопла." +msgstr "После отключения налипший пластик на сопле нельзя будет обнаружить, что может привести к сбою печати или повреждению сопла." msgid "AI Detections" -msgstr "ИИ-обнаружение" +msgstr "ИИ-мониторинг" msgid "Printer will send assistant message or pause printing if any of the following problem is detected." msgstr "Принтер отправит сообщение помощника или приостановит печать, если обнаружит одну из следующих проблем." @@ -7774,27 +7680,27 @@ msgstr "Контроль печати с помощью ИИ" msgid "Pausing Sensitivity:" msgstr "Чувствительность:" +# Печать воздухом/в воздухе – другой частный случай при перехлёсте прутка или заторе msgid "Spaghetti Detection" -msgstr "Обнаружение «спагетти»" +msgstr "Обнаружение слетевших моделей" msgid "Detect spaghetti failures (scattered lose filament)." -msgstr "Обнаружение дефектов типа «спагетти» (разбросанная нить)." +msgstr "Обнаружение «спагетти» при печати в воздухе." msgid "Purge Chute Pile-Up Detection" -msgstr "Обнаружение скопления в лотке очистки" +msgstr "Обнаружение заполнения лотка прочистки" msgid "Monitor if the waste is piled up in the purge chute." -msgstr "Контроль скопления отходов в лотке очистки." +msgstr "Контроль скопления отходов в лотке прочистки." -# ???протечки, засорения msgid "Nozzle Clumping Detection" msgstr "Обнаружение пластика на сопле" msgid "Check if the nozzle is clumping by filaments or other foreign objects." -msgstr "Определение налипшего на сопле пластика или иных объектов." +msgstr "Определение налипшего на сопло пластика или иных объектов." msgid "Detects air printing caused by nozzle clogging or filament grinding." -msgstr "Определение холостой печати из-за затора или перетирания прутка." +msgstr "Определение холостой печати из-за затора или перехлёста/перетирания прутка." msgid "First Layer Inspection" msgstr "Проверка первого слоя" @@ -7805,9 +7711,8 @@ msgstr "Автовосстановление после смещения сло msgid "Store Sent Files on External Storage" msgstr "Сохранять файлы печати на внешнем накопителе" -# AI Translated msgid "Save the printing files sent from the slicer and other apps on External Storage" -msgstr "Сохранять файлы печати, отправленные из слайсера и других приложений, на внешнем накопителе" +msgstr "Сохранять на внешнем накопителе файлы печати, отправленные из слайсера и других приложений" msgid "Allow Prompt Sound" msgstr "Разрешить звуковые уведомления" @@ -7818,41 +7723,32 @@ msgstr "Обнаружение запутывания прутка" msgid "Check if the nozzle is clumping by filament or other foreign objects." msgstr "Обнаружение скапливания на сопле материала в результате засорения/протечки сопла или других причин." -# AI Translated msgid "Purify Air at Print End" msgstr "Очищать воздух по завершении печати" -# AI Translated msgid "Internal Circulation" msgstr "Внутренняя циркуляция" -# AI Translated msgid "Alignment Detection" msgstr "Обнаружение смещения" -# AI Translated msgid "Pauses printing when build plate misalignment is detected." msgstr "Приостанавливает печать при обнаружении смещения стола." -# AI Translated msgid "Foreign Object Detection" msgstr "Обнаружение посторонних предметов" -# AI Translated msgid "Checks for any objects on the build plate at the start of a print to avoid collisions." msgstr "Проверяет наличие любых предметов на столе в начале печати во избежание столкновений." -# AI Translated msgid "Printed Part Displacement Detection" msgstr "Обнаружение смещения печатаемой детали" -# AI Translated msgid "Monitors the printed part during printing and alerts immediately if it shifts or collapses." -msgstr "Отслеживает печатаемую деталь во время печати и немедленно предупреждает, если она сместилась или обрушилась." +msgstr "Отслеживает положение детали во время печати и немедленно предупреждает, если она сместилась или обрушилась." -# AI Translated msgid "Checks if the nozzle is clumping by filament or other foreign objects." -msgstr "Проверяет, не залипло ли сопло материалом или иными посторонними предметами." +msgstr "Проверяет присутствие пластика или инородных объектов на сопле." msgid "On" msgstr "Вкл" @@ -7866,13 +7762,11 @@ msgstr "Уведомление" msgid "Pause printing" msgstr "Пауза печати" -# AI Translated msgid "Print Status Snapshot" msgstr "Снимок состояния печати" -# AI Translated msgid "Automatically capture and upload print photos, showing defects during printing and the final result for remote viewing." -msgstr "Автоматически делает и загружает фотографии печати, показывая дефекты во время печати и итоговый результат для удалённого просмотра." +msgstr "Автоматически снимает и загружает в облако фотографии печати, показывая дефекты во время печати и итоговый результат для удалённого просмотра." msgctxt "Nozzle Type" msgid "Type" @@ -7887,7 +7781,7 @@ msgid "Flow" msgstr "Расход" msgid "Please change the nozzle settings on the printer." -msgstr "Пожалуйста, измените настройки сопла на принтере." +msgstr "Измените настройки сопла на принтере." msgid "Brass" msgstr "Латунь" @@ -7895,7 +7789,6 @@ msgstr "Латунь" msgid "High flow" msgstr "Высокий расход" -# AI Translated msgid "TPU High flow" msgstr "TPU High flow" @@ -7918,9 +7811,8 @@ msgstr "Общие" msgid "Objects" msgstr "Модели" -# AI Translated msgid "Cycle settings visibility" -msgstr "Переключать видимость настроек" +msgstr "Переключить видимость настроек" msgid "Compare presets" msgstr "Сравнить профили" @@ -8033,11 +7925,9 @@ msgstr "Переключение диаметра" msgid "Configuration incompatible" msgstr "Несовместимый профиль" -# AI Translated msgid "Filament switcher detected. All AMS filaments are now available for both extruders. The slicer will auto-assign for optimal printing." -msgstr "Обнаружен переключатель материалов. Все материалы AMS теперь доступны для обоих экструдеров. Слайсер автоматически распределит их для оптимальной печати." +msgstr "Обнаружен переключатель материалов. Все материалы из AMS теперь доступны для обоих экструдеров. Слайсер автоматически распределит их для оптимальной печати." -# AI Translated msgid "A filament switcher is detected but not calibrated and thus currently unavailable. Please calibrate it on the printer and synchronize before use." msgstr "Обнаружен переключатель материалов, но он не откалиброван и потому сейчас недоступен. Откалибруйте его на принтере и синхронизируйте перед использованием." @@ -8052,12 +7942,13 @@ msgid "" "The currently selected machine preset is inconsistent with the connected printer type.\n" "Are you sure to continue syncing?" msgstr "" -"Текущий выбранный профиль принтера не соответствует типу подключённого принтера.\n" +"Выбранный профиль принтера не соответствует типу подключённого принтера.\n" "Продолжить синхронизацию?" msgid "There are unset nozzle types. Please set the nozzle types of all extruders before synchronizing." msgstr "Типы сопел не заданы. Перед синхронизацией необходимо указать типы всех установленных сопел." +# О сопле/соплах? msgid "Sync extruder infomation" msgstr "Синхронизировать информацию об экструдере" @@ -8071,12 +7962,11 @@ msgid "Click to edit preset" msgstr "Изменить профиль" msgid "Nozzle" -msgstr "Экструдер" +msgstr "Сопло" msgid "Project Filaments" msgstr "Материалы проекта" -# AI Translated msgid "Purge mode" msgstr "Режим прочистки" @@ -8101,9 +7991,10 @@ msgstr "Поиск стола, модели или части..." msgid "Pellets" msgstr "Гранулы" +# Порядок слов сильно зависит от контекста; не могу воспроизвести в интерфейсе. По идее, выводится при bool Sidebar::is_new_project_in_gcode3mf(), но что-либо менять в нарезанном .gcode.3mf вообще нельзя #, c-format, boost-format msgid "After completing your operation, %s project will be closed and create a new project." -msgstr "После завершения операции проект %s будет закрыт и создан новый проект." +msgstr "После завершения операции и закрытия текущего проекта %s будет создан новый проект." msgid "There are no compatible filaments, and sync is not performed." msgstr "Синхронизация не выполнена ввиду отсутствия совместимых материалов." @@ -8120,7 +8011,7 @@ msgid "Only filament color information has been synchronized from printer." msgstr "Синхронизирована только информация о цвете материала." msgid "Filament type and color information have been synchronized, but slot information is not included." -msgstr "Информация о типе и цвете филамента синхронизирована, но информация о слотах не включена." +msgstr "Синхронизирована информация о типе и цвете материала, но не о слотах." #, boost-format msgid "Do you want to save changes to \"%1%\"?" @@ -8355,22 +8246,18 @@ msgstr "" "Это действие приведёт к удалению информации о разрезе.\n" "Целостность модели после этого не гарантируется." -# AI Translated msgid "Delete Object" msgstr "Удалить модель" -# AI Translated msgid "Delete All Objects" msgstr "Удалить все модели" -# AI Translated msgid "Reset Project" msgstr "Сбросить проект" msgid "The selected object couldn't be split." msgstr "Невозможно разделить выбранную модель." -# AI Translated msgid "Split to Objects" msgstr "Разделить на модели" @@ -8399,9 +8286,8 @@ msgstr "Выбор нового файла" msgid "File for the replacement wasn't selected" msgstr "Файл для замены не выбран" -# AI Translated msgid "Replace with 3D file" -msgstr "Заменить 3D-файлом" +msgstr "Замена файла модели" # В заголовке окна выбора папки и ошибки "папка не найдена" msgid "Select folder to replace from" @@ -8450,7 +8336,6 @@ msgstr "Не удалось перезагрузить:" msgid "Error during reload" msgstr "Ошибка во время перезагрузки" -# AI Translated msgid "Reload all" msgstr "Перезагрузить всё" @@ -8497,9 +8382,9 @@ msgid "" "After syncing, software can optimize printing time and filament usage when slicing.\n" "Would you like to sync now?" msgstr "" -"Информация о типе сопла и количестве AMS не синхронизирована с подключённого принтера.\n" -"После синхронизации программа сможет оптимизировать время печати и расход филамента при нарезке.\n" -"Хотите синхронизировать сейчас?" +"Синхронизация информации о типе сопла и количестве AMS подключённого принтера не выполнена.\n" +"После синхронизации программа сможет оптимизировать время печати и расход материала при нарезке.\n" +"Выполнить синхронизацию?" msgid "Sync now" msgstr "Синхронизировать" @@ -8549,10 +8434,10 @@ msgid "INFO:" msgstr "Информация:" msgid "No accelerations provided for calibration. Use default acceleration value " -msgstr "Не заданы ускорения для калибровки. Использовать значение ускорения по умолчанию " +msgstr "Не заданы ускорения для калибровки. Используется значение по умолчанию: " msgid "No speeds provided for calibration. Use default optimal speed " -msgstr "Не заданы скорости для калибровки. Использовать оптимальную скорость по умолчанию " +msgstr "Не заданы скорости для калибровки. Используется значение по умолчанию: " msgid "Import SLA archive" msgstr "Импорт SLA архива" @@ -8664,17 +8549,15 @@ msgstr "Причина: «%1%» не имеет пересечений с дру msgid "Unable to perform boolean operation on model meshes. Only positive parts will be exported." msgstr "Невозможно выполнить булеву операцию над сетками модели. Будут экспортированы только положительные части." -# AI Translated msgid "Flashforge host is not available." msgstr "Хост Flashforge недоступен." # Авторизация принтера Flashforge не удалась. -# AI Translated msgid "Unable to log in to the Flashforge printer." -msgstr "Не удалось войти в принтер Flashforge." +msgstr "Не удалось авторизоваться в панели управления Flashforge." msgid "Is the printer ready? Is the print sheet in place, empty and clean?" -msgstr "Готов ли Принтер? Печатная пластина на месте, пустая и чистая?" +msgstr "Готов ли принтер? Проверьте установку и состояние покрытия стола." msgid "Upload and Print" msgstr "Загрузить и напечатать" @@ -8729,47 +8612,36 @@ msgstr "«Принтер»" msgid "Synchronize AMS Filament Information" msgstr "Синхронизировать материалы в AMS" -# AI Translated msgid "OrcaCloud plugins required by the current preset are not installed:" -msgstr "Плагины OrcaCloud, необходимые для текущего профиля, не установлены:" +msgstr "Для текущего профиля требуется установка плагинов OrcaCloud:" -# AI Translated msgid "Install Plugins" msgstr "Установить плагины" -# AI Translated msgid "Local plugins required by the current preset are missing:" -msgstr "Отсутствуют локальные плагины, необходимые для текущего профиля:" +msgstr "Для текущего профиля требуются локальные плагины:" -# AI Translated msgid "Find on OrcaCloud" msgstr "Найти в OrcaCloud" -# AI Translated msgid "Plugins required by the current preset are not activated:" -msgstr "Плагины, необходимые для текущего профиля, не активированы:" +msgstr "Для текущего профиля требуются неактивные плагины:" -# AI Translated msgid "Activate Now" -msgstr "Активировать сейчас" +msgstr "Активировать" -# AI Translated msgid "The installed plugin does not provide the required capability — it may be outdated:" -msgstr "Установленный плагин не предоставляет требуемую возможность — возможно, он устарел:" +msgstr "В установленном плагине отсутствует нужный функционал (устаревшая версия?):" -# AI Translated msgid "Preparing to install plugins..." msgstr "Подготовка к установке плагинов..." -# AI Translated msgid "Installing plugins" msgstr "Установка плагинов" -# AI Translated msgid "Cancelling — finishing the current plugin..." msgstr "Отмена — завершение текущего плагина..." -# AI Translated #, boost-format msgid "Installing %1%..." msgstr "Установка %1%..." @@ -8813,9 +8685,8 @@ msgstr "Объём: %1% мм³\n" msgid "Triangles: %1%\n" msgstr "Треугольников: %1%\n" -# AI Translated msgid "Use \"Fix Model\" to repair the mesh." -msgstr "Используйте «Исправить модель» для восстановления сетки." +msgstr "Используйте «Восстановить» для исправления сетки. " #, c-format, boost-format msgid "Plate %d: %s is not suggested for use printing filament %s (%s). If you still want to do this print job, please set this filament's bed temperature to a number that is not zero." @@ -9167,7 +9038,7 @@ msgstr "Если включено, вы сможете управлять нес # Запрашивать выбор режима группировки? msgid "Pop up to select filament grouping mode" -msgstr "Всплывающее окно для выбора режима группировки филаментов" +msgstr "Всплывающее окно для выбора режима группировки материалов" msgid "Behaviour" msgstr "Автоматизация" @@ -9290,15 +9161,14 @@ msgstr "Графика" msgid "Smooth normals" msgstr "Сглаживание бликов" -# AI Translated msgid "" "Applies smooth normals to the model.\n" "\n" "Requires manual scene reload to take effect (right-click on 3D view → \"Reload All\")." msgstr "" -"Применяет сглаженные нормали к модели.\n" +"Применять сглаживание нормалей моделей.\n" "\n" -"Для вступления в силу требуется ручная перезагрузка сцены (правый клик в 3D-виде → «Перезагрузить всё»)." +"Для применения изменений требуется ручная перезагрузка сцены (контекстное меню стола → «Перезагрузить всё»)." msgid "Phong shading" msgstr "Затенение по Фонгу" @@ -9315,9 +9185,9 @@ msgstr "Применять фоновое затенение в простран msgid "Shadows" msgstr "Тени" -# AI Translated +# Опять переусложнили техническим нюансом. Изначально тени рисовались только на столе, потом это исправили и решили отметить здесь. msgid "Renders cast shadows on the plate, other objects, and each object onto itself in realistic view." -msgstr "Отображает отбрасываемые тени на столе, других моделях и на самой модели в режиме продвинутой графики." +msgstr "Отрисовывать тени в режиме продвинутой графики." msgid "Anti-aliasing" msgstr "Сглаживание" @@ -9379,32 +9249,28 @@ msgstr "Отображать частоту кадров" msgid "Displays current viewport FPS in the top-right corner." msgstr "Выводить частоту кадров рабочего пространства в правом верхнем углу." -# AI Translated msgid "G-code Preview" -msgstr "Предпросмотр G-code" +msgstr "Просмотр нарезки" -# AI Translated msgid "Dim lower layers" -msgstr "Затемнять нижние слои" +msgstr "Затемнять предыдущие слои" -# AI Translated msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness." -msgstr "При перемещении ползунка слоёв в предпросмотре нарезки слои ниже текущего отображаются затемнёнными, так что на полной яркости показан только просматриваемый слой." +msgstr "Затемнять слои, находящиеся ниже текущего. Просматриваемый слой отображается на полной яркости." -# AI Translated msgid "Dimmed layer brightness" msgstr "Яркость затемнённых слоёв" msgid "%" msgstr "%" -# AI Translated msgid "" "How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n" "99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option." msgstr "" -"Насколько ярко отображаются затемнённые слои, когда включена опция «Затемнять нижние слои».\n" -"99% — затемнение почти незаметно, 0% — слои становятся чёрными. Максимум ограничен 99%, так как 100% равносильно отключению опции." +"Процент яркости предыдущих слоёв при включении их затемнения.\n" +"99% — почти полная яркость.\n" +"0% — полное затенение." msgid "Login region" msgstr "Регион входа" @@ -9639,7 +9505,6 @@ msgstr "Несовместимые профили" msgid "My Printer" msgstr "Мой принтер" -# AI Translated msgid "AMS filaments" msgstr "Материалы AMS" @@ -9650,7 +9515,7 @@ msgid "AMS filament" msgstr "Материал AMS" msgid "Right filaments" -msgstr "Филаменты правого экструдера" +msgstr "Материалы правого экструдера" msgid "Click to select filament color" msgstr "Изменить цвет" @@ -9661,7 +9526,6 @@ msgstr "Добавить/удалить профиль" msgid "Edit preset" msgstr "Изменить профиль" -# AI Translated msgid "Change extruder color" msgstr "Изменить цвет экструдера" @@ -9705,10 +9569,9 @@ msgstr "Несовместимы" msgid "The selected preset is null!" msgstr "Выбранный профиль пуст!" -# AI Translated msgctxt "Layer range" msgid "End" -msgstr "до конца" +msgstr "конца" msgid "Customize" msgstr "Настроить" @@ -9818,10 +9681,12 @@ msgstr "Профиль «%1%» уже существует." #, boost-format msgid "Preset \"%1%\" already exists and is incompatible with the current printer." -msgstr "Профиль «%1%» уже существует и несовместим с текущим принтером." +msgstr "" +"Профиль «%1%» уже существует и\n" +"несовместим с текущим принтером." msgid "Please note that saving will overwrite the current preset." -msgstr "Обратите внимание, что при сохранении произойдёт перезапись текущего профиля." +msgstr "Обратите внимание: при сохранении произойдёт\nперезапись текущего профиля." msgid "The name cannot be the same as a preset alias name." msgstr "Имя не должно совпадать с именем предустановленного профиля." @@ -9883,8 +9748,9 @@ msgstr "Отправка задания на печать" msgid "Not satisfied with the grouping of filaments? Regroup and slice ->" msgstr "Не нравится текущая группировка материалов? Нажмите сюда, чтобы изменить и нарезать заново." +# Подсказка msgid "Manually change external spool during printing for multi-color printing" -msgstr "Ручная смена внешней катушки во время печати для многоцветной печати" +msgstr "Смена внешней катушки вручную во время многоцветной печати" msgid "Multi-color with external" msgstr "Многоцветная печать с внешней катушкой" @@ -9892,23 +9758,23 @@ msgstr "Многоцветная печать с внешней катушкой msgid "Your filament grouping method in the sliced file is not optimal." msgstr "Группировка материалов в файле печати не оптимальна." -# AI Translated msgid "To ensure print quality, the drying temperature will be lowered during printing." -msgstr "Для обеспечения качества печати температура сушки будет снижена во время печати." +msgstr "Температура сушки будет снижена на время печати во избежание проблем с качеством." -# AI Translated msgid "Select timelapse storage location" msgstr "Выберите место хранения таймлапсов" +# Ничего тут не выравнивается, банбуки чисто карту снимают msgid "Auto Bed Leveling" -msgstr "Автоматическое выравнивание стола" +msgstr "Измерение кривизны стола" +# "Пропуск" – это пояснение логики работы режима или призыв к действию? msgid "" "This checks the flatness of heatbed. Leveling makes extruded height uniform.\n" "*Automatic mode: Run a leveling check(about 10 seconds). Skip if surface is fine." msgstr "" -"Проверка ровности нагревательного стола. Выравнивание обеспечивает равномерную высоту экструзии.\n" -"*Автоматический режим: выполнить проверку (около 10 секунд). Пропустить, если поверхность в порядке." +"Снятие карты высот стола. Позволяет обеспечить равномерность высоты слоя.\n" +"*Автоматический режим: выполнить проверку (около 10 секунд). Пропуск, если поверхность в порядке." msgid "Flow Dynamics Calibration" msgstr "Калибровка динамики потока" @@ -9917,24 +9783,22 @@ msgid "" "This process determines the dynamic flow values to improve overall print quality.\n" "*Automatic mode: Skip if the filament was calibrated recently." msgstr "" -"Этот процесс определяет значения динамического потока для улучшения общего качества печати.\n" -"*Автоматический режим: пропустить, если филамент был откалиброван недавно." +"Анализ инертности системы подачи материала для улучшения общего качества печати.\n" +"*Автоматический режим: пропуск, если материал был недавно откалиброван." msgid "Nozzle Offset Calibration" -msgstr "Калибровка смещения сопла" +msgstr "Калибровка смещения сопел" msgid "" "Calibrate nozzle offsets to enhance print quality.\n" "*Automatic mode: Check for calibration before printing. Skip if unnecessary." msgstr "" -"Калибровка смещений сопел для улучшения качества печати.\n" -"*Автоматический режим: проверять калибровку перед печатью. Пропустить, если не требуется." +"Калибровка смещения сопел для улучшения качества печати.\n" +"*Автоматический режим: выполнять калибровку перед печатью по необходимости." -# AI Translated msgid "Shared PA Profile" msgstr "Общий профиль PA" -# AI Translated msgid "Nozzles and filaments of the same type share the same PA profile." msgstr "Сопла и материалы одного типа используют общий профиль PA." @@ -9950,50 +9814,40 @@ msgstr "Описание ошибки" msgid "Extra info" msgstr "Доп. информация" -# AI Translated msgid "The Filament Track Switch installed on the printer does not match the slicing file. Please re-slice to avoid print quality issues." -msgstr "Filament Track Switch, установленный на принтере, не соответствует файлу нарезки. Выполните повторную нарезку во избежание проблем с качеством печати." +msgstr "Filament Track Switch в принтере не соответствует файлу нарезки. Выполните повторную нарезку во избежание проблем с качеством печати." -# AI Translated msgid "This print requires a Filament Track Switch. Please install it first." -msgstr "Для этой печати требуется Filament Track Switch. Сначала установите его." +msgstr "Для печати этого файла требуется Filament Track Switch. Сначала установите его." -# AI Translated msgid "The Filament Track Switch has not been setup. Please setup it first." msgstr "Filament Track Switch не настроен. Сначала выполните его настройку." -# AI Translated #, c-format, boost-format msgid "Failed to send nozzle auto-mapping request to printer { code: %d }. Please try to refresh the printer information. If it still does not recover, you can try to rebind the printer and check the network connection." -msgstr "Не удалось отправить запрос на авто-сопоставление сопел принтеру { code: %d }. Попробуйте обновить информацию о принтере. Если это не помогает, попробуйте перепривязать принтер и проверить сетевое соединение." +msgstr "Не удалось отправить принтеру запрос на сопоставление сопел { код: %d }. Попробуйте обновить информацию о принтере. Если это не помогает, попробуйте проверить соединение и перепривязать принтер." -# AI Translated msgid "The printer is calculating nozzle mapping." -msgstr "Принтер вычисляет сопоставление сопел." +msgstr "Принтер выполняет сопоставление сопел." -# AI Translated msgid "Please wait a moment..." msgstr "Пожалуйста, подождите..." -# AI Translated #, c-format, boost-format msgid "Failed to receive nozzle auto-mapping table from printer { msg: %s }. Please refresh the printer information." -msgstr "Не удалось получить таблицу авто-сопоставления сопел от принтера { msg: %s }. Обновите информацию о принтере." +msgstr "Не удалось получить от принтера таблицу сопоставления сопел { ответ: %s }. Обновите информацию о принтере." -# AI Translated #, c-format, boost-format msgid "The printer failed to build the nozzle auto-mapping table { code: %d }. Please refresh nozzle information." -msgstr "Принтеру не удалось построить таблицу авто-сопоставления сопел { code: %d }. Обновите информацию о соплах." +msgstr "Принтеру не удалось составить таблицу сопоставления сопел { код: %d }. Обновите информацию о соплах." -# AI Translated #, c-format, boost-format msgid "The current nozzle mapping may produce an extra %0.2f g of waste." -msgstr "Текущее сопоставление сопел может привести к дополнительным %0.2f г отходов." +msgstr "Текущее сопоставление сопел может привести к дополнительным затратам %0.2fг материала." -# AI Translated #, c-format, boost-format msgid "Recommended filament arrangement saves %s->" -msgstr "Рекомендуемое расположение материалов экономит %s->" +msgstr "Рекомендуемое расположение материалов экономит %s→" #, c-format, boost-format msgid "Filament %s does not match the filament in AMS slot %s. Please update the printer firmware to support AMS slot assignment." @@ -10012,18 +9866,17 @@ msgstr "При включении режима вазы принтеры с ки msgid "The current printer does not support timelapse in Traditional Mode when printing By-Object." msgstr "Принтер не поддерживает таймлапс в режиме по умолчанию при печати моделей по очереди." -# AI Translated msgid "I have checked the installed nozzle and want to print anyway." -msgstr "Я проверил установленное сопло и всё равно хочу печатать." +msgstr "Установленное сопло проверено, продолжить в любом случае." msgid "Errors" msgstr "Ошибок" msgid "More than one filament types have been mapped to the same external spool, which may cause printing issues. The printer won't pause during printing." -msgstr "Несколько типов филамента назначены на одну внешнюю катушку, что может вызвать проблемы при печати. Принтер не будет приостанавливаться во время печати." +msgstr "На одну внешнюю катушку назначено несколько типов материала, что может вызвать проблемы при печати. Принтер не будет приостанавливаться во время печати." msgid "The filament type setting of external spool is different from the filament in the slicing file." -msgstr "Тип филамента на внешней катушке отличается от филамента в файле нарезки." +msgstr "Тип материала на внешней катушке отличается от материала в файле нарезки." msgid "The printer type selected when generating G-code is not consistent with the currently selected printer. It is recommended that you use the same printer type for slicing." msgstr "Выбранный профиль принтера в настройках слайсера не совпадает с фактическим принтером. Для нарезки рекомендуется использовать тот же профиль принтера." @@ -10041,48 +9894,40 @@ msgid "Please click the confirm button if you still want to proceed with printin msgstr "Нажмите кнопку подтверждения, если всё ещё хотите продолжить печать." msgid "This checks the flatness of heatbed. Leveling makes extruded height uniform." -msgstr "Проверка ровности нагревательного стола. Выравнивание обеспечивает равномерную высоту экструзии." +msgstr "Проверка кривизны стола. Обеспечивает равномерную высоту слоя." msgid "This process determines the dynamic flow values to improve overall print quality." -msgstr "Этот процесс определяет значения динамического потока для улучшения общего качества печати." +msgstr "Определение коэффициента динамического потока для улучшения общего качества печати." msgid "Internal" msgstr "Внутренние" -# AI Translated +# Подставляется storage_name #, c-format, boost-format msgid "%s space less than 20MB. Timelapse may not save properly. You can turn it off or" -msgstr "%s: свободного места меньше 20 МБ. Таймлапс может сохраниться некорректно. Вы можете отключить его или" +msgstr "%s: свободного места меньше 20 МБ. Таймлапс может сохраниться некорректно. Рекомендуется отключить его или " -# AI Translated msgid "Clean up files" -msgstr "Очистить файлы" +msgstr "очистить файлы" -# AI Translated msgid "Low internal storage. This timelapse will overwrite the oldest video files." msgstr "Мало внутренней памяти. Этот таймлапс перезапишет самые старые видеофайлы." -# AI Translated msgid "Low external storage. This timelapse will overwrite the oldest video files." msgstr "Мало внешней памяти. Этот таймлапс перезапишет самые старые видеофайлы." -# AI Translated msgid "Insufficient external storage for time-lapse photography. Connect to computer to delete files, or use a larger memory card." msgstr "Недостаточно внешней памяти для съёмки таймлапса. Подключитесь к компьютеру для удаления файлов или используйте карту памяти большего объёма." -# AI Translated msgid "Storage Space Not Enough" msgstr "Недостаточно места в хранилище" -# AI Translated msgid "Confirm & Print" -msgstr "Подтвердить и печатать" +msgstr "Подтвердить и продолжить" -# AI Translated msgid "Cancel Timelapse & Print" -msgstr "Отменить таймлапс и печатать" +msgstr "Отключить таймлапс и продолжить" -# AI Translated msgid "Clean Up" msgstr "Очистить" @@ -10100,47 +9945,38 @@ msgstr "Будет затрачено на %d г материала и на %d msgid "nozzle" msgstr "сопло" -# AI Translated #, c-format, boost-format msgid "Refreshing information of hotends(%d/%d)." msgstr "Обновление информации о хотэндах (%d/%d)." -# AI Translated msgid "There are not enough available hotends currently." -msgstr "Сейчас недостаточно доступных хотэндов." +msgstr "Доступных хотэндов сейчас недостаточно." -# AI Translated msgid "Please complete the hotend rack setup and try again." msgstr "Завершите настройку стойки хотэндов и повторите попытку." -# AI Translated msgid "Please refresh the nozzle information and try again." msgstr "Обновите информацию о соплах и повторите попытку." -# AI Translated msgid "Please re-slice to avoid filament waste." -msgstr "Выполните повторную нарезку во избежание расхода материала впустую." +msgstr "Выполните повторную нарезку во избежание излишнего расхода материала." -# AI Translated msgid "The reported hotend information may be unreliable." msgstr "Переданная информация о хотэнде может быть недостоверной." -# AI Translated #, c-format, boost-format msgid "The printer has no nozzle matching the slicing file (%s)." msgstr "На принтере нет сопла, соответствующего файлу нарезки (%s)." -# AI Translated msgid "Please install a matching nozzle in the hotend rack, or set the corresponding printer preset while slicing." msgstr "Установите подходящее сопло в стойку хотэндов или задайте соответствующий профиль принтера при нарезке." -# AI Translated msgid "The toolhead and hotend rack are full. Please remove at least one hotend before printing." -msgstr "Печатающая голова и стойка хотэндов заполнены. Перед печатью снимите хотя бы один хотэнд." +msgstr "Все места в печатающей голове и стойке хотэндов заняты. Перед печатью снимите хотя бы один хотэнд." #, c-format, boost-format msgid "The nozzle flow setting of %s(%s) doesn't match with the slicing file(%s). Please make sure the nozzle installed matches with settings in printer, then set the corresponding printer preset while slicing." -msgstr "Настройка потока сопла %s(%s) не совпадает с файлом нарезки (%s). Убедитесь, что настройки принтера соответствуют установленному соплу, затем выберите соответствующий профиль принтера при нарезке." +msgstr "Настройка расхода сопла %s(%s) не совпадает с файлом нарезки (%s). Убедитесь, что настройки принтера соответствуют установленному соплу, затем выберите соответствующий профиль принтера при нарезке." msgid "Tips: If you changed your nozzle of your printer lately, please go to 'Device -> Printer parts' to change your nozzle setting." msgstr "Совет: после замены сопла в принтере необходимо обновить его настройки («Принтер» → «Части принтера»)." @@ -10158,28 +9994,23 @@ msgstr "обоих экструдерах" #, c-format, boost-format msgid "The hardness of current material (%s) exceeds the hardness of %s(%s). Please verify the nozzle or material settings and try again." -msgstr "Требования к твёрдости у выбранного материала (%s) превышают возможности %s(%s). Проверьте настройки профиля принтера или материала и попробуйте ещё раз." +msgstr "Требования к твёрдости у выбранного материала (%s) превышают возможности %s (%s). Проверьте настройки профиля принтера или материала и попробуйте ещё раз." -# AI Translated msgid "Your current firmware version cannot start this print job. Please update to the latest version and try again." -msgstr "Текущая версия прошивки не может запустить это задание печати. Обновите до последней версии и повторите попытку." +msgstr "Текущая версия прошивки не может обработать этот файл. Обновитесь до последней версии и повторите попытку." -# AI Translated #, c-format, boost-format msgid "The hardness of current material (%s) exceeds the hardness of %s(%s). It may cause nozzle wear, leading to material leakage and unstable flow. Please exercise caution when using it." -msgstr "Твёрдость текущего материала (%s) превышает твёрдость %s(%s). Это может вызвать износ сопла, приводящий к утечке материала и нестабильному потоку. Соблюдайте осторожность при использовании." +msgstr "Требования к твёрдости у выбранного материала (%s) превышают возможности %s (%s). Это может привести к износу сопла и утечкам материала/нестабильному потоку в будущем. Используйте материал с осторожностью." -# AI Translated msgid "Some filaments may switch between extruders during printing. Manual K-value calibration cannot be applied throughout the entire print, which may affect print quality. Enabling Flow Dynamics Calibration is recommended." -msgstr "Некоторые материалы могут переключаться между экструдерами во время печати. Ручную калибровку K-value нельзя применить на протяжении всей печати, что может повлиять на её качество. Рекомендуется включить калибровку динамики потока (Flow Dynamics Calibration)." +msgstr "Некоторые материалы могут переключаться между экструдерами во время печати. Ручная калибровка K-фактора не применима для всей печати, что может повлиять на её качество. Рекомендуется включить калибровку динамики потока (Flow Dynamics Calibration)." -# AI Translated msgid "There is stringing-prone filament in this file. For best print quality, we recommend switching nozzle clumping detection to Auto mode." -msgstr "В этом файле есть материал, склонный к образованию волос. Для наилучшего качества печати рекомендуем переключить обнаружение налипания на сопло в режим «Авто»." +msgstr "В текущем проекте есть материал, склонный к образованию паутины. Во избежание проблем с качеством рекомендуется включить автоматический режим обнаружения налипаний на сопло." -# AI Translated msgid "If 'Dynamic Flow Calibration' is set to Auto/On, the system will use the manual calibration value or the default value and skip the flow calibration process. You can perform a manual flow calibration for TPU filament on the 'Calibration' page." -msgstr "Если «Динамическая калибровка потока» установлена в «Авто/Вкл», система будет использовать значение ручной калибровки или значение по умолчанию и пропустит процесс калибровки потока. Вы можете выполнить ручную калибровку потока для материала TPU на странице «Калибровка»." +msgstr "Если «Калибровка динамики потока» установлена в «Авто/Вкл», система будет использовать значение ручной калибровки или значение по умолчанию и пропустит процесс калибровки. Ручную калибровку TPU можно выполнить на странице «Калибровка»." #, c-format, boost-format msgid "[ %s ] requires printing in a high-temperature environment. Please close the door." @@ -10250,16 +10081,16 @@ msgid "The printer is executing instructions. Please restart printing after it e msgstr "Принтер выполняет команды. Перезапустите печать после их завершения." msgid "AMS is setting up. Please try again later." -msgstr "AMS настраивается. Пожалуйста, попробуйте позже." +msgstr "AMS настраивается. Попробуйте позднее." msgid "Not all filaments used in slicing are mapped to the printer. Please check the mapping of filaments." -msgstr "Не все филаменты, использованные при нарезке, назначены на принтер. Проверьте назначение филаментов." +msgstr "Не все материалы, использованные при нарезке, сопоставлены с принтером. Проверьте назначение материалов." msgid "Please do not mix-use the Ext with AMS." -msgstr "Пожалуйста, не используйте одновременно внешнюю катушку и AMS." +msgstr "Не стоит использовать AMS и внешние катушки совместно." msgid "Invalid nozzle information, please refresh or manually set nozzle information." -msgstr "Недопустимая информация о сопле. Обновите или вручную задайте информацию о сопле." +msgstr "Недопустимая информация о сопле. Обновите или задайте её вручную." msgid "Storage needs to be inserted before printing via LAN." msgstr "Перед печатью по локальной сети необходимо вставить хранилище данных." @@ -10286,24 +10117,21 @@ msgid "TPU 90A/TPU 85A is too soft and does not support automatic Flow Dynamics msgstr "TPU 85A/90A слишком мягкий для автоматической калибровки." msgid "Set dynamic flow calibration to 'OFF' to enable custom dynamic flow value." -msgstr "Установите калибровку динамического потока в «ВЫКЛ.», чтобы задать пользовательское значение динамического потока." +msgstr "Отключите калибровку динамики потока, чтобы задать пользовательское значение." msgid "This printer does not support printing all plates." msgstr "Принтер не поддерживает печать нескольких столов." -# AI Translated #, c-format, boost-format msgid "The current firmware supports a maximum of %s materials. You can either reduce the number of materials to %s or fewer on the Preparation Page, or try updating the firmware. If you are still restricted after the update, please wait for subsequent firmware support." -msgstr "Текущая прошивка поддерживает не более %s материалов. Вы можете либо уменьшить количество материалов до %s или менее на странице подготовки, либо попробовать обновить прошивку. Если после обновления ограничение сохраняется, дождитесь поддержки в последующих версиях прошивки." +msgstr "Текущая прошивка поддерживает не более %s материалов. Попробуйте обновить прошивку или уменьшить количество материалов до %s (или менее) на странице подготовки. Если после обновления ограничение сохраняется, ожидайте добавления поддержки в последующих версиях." msgid "The type of external filament is unknown or does not match with the filament type in the slicing file. Please make sure you have installed the correct filament in the external spool." msgstr "Тип материала на внешней катушке неизвестен или не соответствует материалу в файле печати. Убедитесь, что установлена внешняя катушка с требуемым материалом." -# AI Translated msgid "TPU 90A/TPU 85A are too soft. It is recommended to perform manual flow calibration on the 'Calibration' page. If 'Dynamic Flow Calibration' is set to auto/on, the system will use the previous calibration value and skip the flow calibration process." -msgstr "TPU 90A/TPU 85A слишком мягкие. Рекомендуется выполнить ручную калибровку потока на странице «Калибровка». Если «Динамическая калибровка потока» установлена в «авто/вкл», система будет использовать предыдущее значение калибровки и пропустит процесс калибровки потока." +msgstr "TPU 90A/TPU 85A слишком мягкий. Рекомендуется выполнить ручную калибровку потока на странице «Калибровка». Если «Калибровка динамики потока» установлена в «Авто/Вкл», система будет использовать предыдущие результаты и пропустит процесс калибровки." -# AI Translated msgid "The filament in the AMS may be insufficient for this print. Please refill or replace it." msgstr "Материала в AMS может быть недостаточно для этой печати. Пополните или замените его." @@ -10475,7 +10303,6 @@ msgstr "Удалить этот профиль" msgid "Search in preset" msgstr "Поиск в профиле" -# AI Translated msgid "Synchronization of different extruder drives or nozzle volume types is not supported." msgstr "Синхронизация разных приводов экструдера или типов объёма сопла не поддерживается." @@ -10485,9 +10312,8 @@ msgstr "Перенести изменения в настройки другог msgid "Click to reset all settings to the last saved preset." msgstr "Сбросить все изменения" -# AI Translated msgid "Prime tower is required for nozzle changing. There may be flaws on the model without prime tower. Are you sure you want to disable prime tower?" -msgstr "Для смены сопла требуется черновая башня. Без черновой башни на модели могут появиться дефекты. Вы уверены, что хотите отключить черновую башню?" +msgstr "Для смены сопла требуется черновая башня. Без черновой башни на модели могут появиться дефекты. Вы действительно хотите отключить черновую башню?" msgid "A prime tower is required for smooth timelapse mode. There may be flaws on the model without a prime tower. Are you sure you want to disable the prime tower?" msgstr "Для сглаженного таймлапса требуется черновая башня, без неё на модели могут возникнуть дефекты. Вы действительно хотите отключить черновую башню?" @@ -10503,7 +10329,7 @@ msgid "A prime tower is required for clumping detection. There may be flaws on t msgstr "Для обнаружения налипаний на сопле требуется черновая башня, без неё на модели могут образоваться дефекты. Включить обнаружение налипаний?" msgid "Enabling both precise Z height and the prime tower may cause slicing errors. Do you still want to enable precise Z height?" -msgstr "Включение «Точной высоты по Z» вместе с черновой башней может привести к ошибкам нарезки. Продолжить?" +msgstr "Включение «Точной высоты по Z» совместно с черновой башней может привести к ошибкам нарезки. Продолжить?" msgid "A prime tower is required for smooth timelapse mode. There may be flaws on the model without prime tower. Do you want to enable the prime tower?" msgstr "Для сглаженного таймлапса требуется черновая башня, без неё на модели могут возникнуть дефекты. Включить черновую башню?" @@ -10715,6 +10541,7 @@ msgstr "Материал поддержки" msgid "Support ironing" msgstr "Разглаживание поддержки" +# Технически точной локализацией было бы "фрактальные поддержки", т.к. сама структура представляет собой фрактал, а не дерево. Но у всех уже на слуху, так что менять нет смысла. Хотя звучало бы прям круто :3 msgid "Tree supports" msgstr "Древовидная поддержка" @@ -10741,13 +10568,12 @@ msgstr "G-код при смене типа линии" msgid "Post-processing Scripts" msgstr "Скрипты постобработки" -# AI Translated msgid "Slicing Pipeline Plugin" msgstr "Плагин конвейера нарезки" -# AI Translated +# В данном контексте можно, наверное, "конфигурация", т.к. тут именно управление набором плагинов, а не просто их настройками msgid "Plugin Configuration" -msgstr "Настройка плагина" +msgstr "Настройка плагинов" msgid "Notes" msgstr "Заметки" @@ -10904,7 +10730,7 @@ msgid "Multi Filament" msgstr "Печать несколькими материалами" msgid "Tool change parameters with single extruder MM printers" -msgstr "Смена материала при комбинированной печати одним экструдером" +msgstr "Смена материала при печати одним экструдером" msgid "Set" msgstr "Выбор" @@ -11069,10 +10895,8 @@ msgstr "" msgid "Firmware Retraction" msgstr "Откат из прошивки" -# Изменения в настройках ... будут сброшены при переключении на принтер с -# другим типом или количеством сопел. msgid "Switching to a printer with different extruder types or numbers will discard or reset changes to extruder or multi-nozzle-related parameters." -msgstr "Переключение на принтер с другим типом или количеством экструдеров приведёт к сбросу или удалению изменений параметров, связанных с экструдерами и многосопельной конфигурацией." +msgstr "Изменения в настройках экструдера и параметрах сопел не будут перенесены в профиль принтера с другим типом или количеством сопел." msgid "Use Modified Value" msgstr "Использовать изменённое значение" @@ -11087,7 +10911,7 @@ msgstr "" "• профили материалов: %d\n" "• профили настроек: %d\n" "\n" -"Эти профили будут удалены при удалении принтера." +"Эти профили будут удалены вместе с принтером." # ??? Профили, наследуемые от других профилей, не могут быть удалены. msgid "Presets inherited by other presets cannot be deleted!" @@ -11115,8 +10939,8 @@ msgid "" "If the preset corresponds to a filament currently in use on your printer, please reset the filament information for that slot." msgstr "" "Вы действительно хотите удалить выбранный профиль? \n" -"Если материал из этого профиля сейчас используется в вашем принтере,\n" -"необходимо сбросить информацию о материале для этого слота." +"Если вы используете его в принтере, сбросьте информацию\n" +"о нём у соответствующего слота." #, boost-format msgid "Are you sure you want to %1% the selected preset?" @@ -11173,7 +10997,6 @@ msgstr "Продолжить" msgid "Don't warn again for this preset" msgstr "Больше не спрашивать для этого профиля" -# AI Translated #, c-format, boost-format msgid "%s: %s" msgstr "%s: %s" @@ -11326,16 +11149,15 @@ msgstr "" msgid "Extruder count" msgstr "Количество экструдеров" +# Какая-то древняя строка. Ранее – "Характеристики принтера", сейчас используется ещё и в конфигурации плагинов в профиле материала (вкладка "Расширенные") msgid "Capabilities" -msgstr "Характеристики принтера" +msgstr "Возможности" -# AI Translated msgid "Left: " -msgstr "Слева: " +msgstr "Левый: " -# AI Translated msgid "Right: " -msgstr "Справа: " +msgstr "Правый: " msgid "Show all presets (including incompatible)" msgstr "Показать все профили (включая несовместимые)" @@ -11488,7 +11310,7 @@ msgid "Color match" msgstr "Подбор цвета" msgid "Approximate color matching." -msgstr "Приблизительный подбор по цвету ваших прутков." +msgstr "Приблизительный подбор по цвету ваших материалов." msgid "Append" msgstr "Добавить" @@ -11510,7 +11332,7 @@ msgid "" msgstr "выбор цветов можно изменить вручную." msgid "—> " -msgstr "—> " +msgstr "→ " msgid "" "Synchronizing AMS filaments will discard your modified but unsaved filament presets.\n" @@ -11534,7 +11356,7 @@ msgid "Plate" msgstr "Стол" msgid "The connected printer does not match the currently selected printer. Please change the selected printer." -msgstr "Подключённый принтер не соответствует текущему выбранному принтеру. Пожалуйста, измените выбранный принтер." +msgstr "Подключённый принтер не соответствует текущему выбранному. Пожалуйста, измените выбранный принтер." msgid "Mapping" msgstr "Назначение" @@ -11543,7 +11365,7 @@ msgid "Overwriting" msgstr "Переназначение" msgid "Reset all filament mapping" -msgstr "Сбросить все назначения филаментов" +msgstr "Сбросить назначения всех материалов" msgid "(Recommended filament)" msgstr "(рекомендуется)" @@ -11555,8 +11377,8 @@ msgid "" "Check heatbed flatness. Leveling makes extruded height uniform.\n" "*Automatic mode: Level first (about 10 seconds). Skip if surface is fine." msgstr "" -"Проверка ровности стола. Выравнивание обеспечивает равномерную высоту экструзии.\n" -"*Автоматический режим: сначала выполнить выравнивание (около 10 секунд). Пропустить, если поверхность в порядке." +"Снятие карты высот стола. Обеспечивает равномерную высоту слоя.\n" +"*Автоматический режим: выполнить проверку (около 10 секунд). Пропуск, если поверхность в порядке." msgid "" "Calibrate nozzle offsets to enhance print quality.\n" @@ -11572,43 +11394,43 @@ msgid "Tip" msgstr "Совет" msgid "Only synchronize filament type and color, not including AMS slot information." -msgstr "Синхронизировать только тип и цвет филамента, без информации о слотах AMS." +msgstr "Синхронизировать только тип и цвет материала, без информации о слотах AMS." msgid "Replace the project filaments list sequentially based on printer filaments. And unused printer filaments will be automatically added to the end of the list." -msgstr "Заменить список филаментов проекта последовательно на основе филаментов принтера. Неиспользуемые филаменты принтера будут автоматически добавлены в конец списка." +msgstr "Заменить список материалов проекта последовательно на основе материалов принтера. Свободные материалы будут автоматически добавлены в конец списка." msgid "Add unused AMS filaments to filaments list." msgstr "Добавить незадействованные материалы из AMS в список" msgid "Automatically merge the same colors in the model after mapping." -msgstr "Автоматически объединять одинаковые цвета в модели после назначения." +msgstr "Автоматически объединять одинаковые цвета в модели после их назначения." msgid "After being synced, this action cannot be undone." msgstr "После синхронизации это действие нельзя отменить." msgid "After being synced, the project's filament presets and colors will be replaced with the mapped filament types and colors. This action cannot be undone." -msgstr "После синхронизации профили филаментов и цвета проекта будут заменены назначенными типами и цветами филаментов. Это действие нельзя отменить." +msgstr "После синхронизации профили и цвета материалов проекта будут заменены назначенными им типами и цветами материалов. Это действие нельзя отменить." msgid "Are you sure to synchronize the filaments?" -msgstr "Вы уверены, что хотите синхронизировать филаменты?" +msgstr "Вы уверены, что хотите синхронизировать материалы?" msgid "Synchronize now" msgstr "Синхронизировать" msgid "Synchronize Filament Information" -msgstr "Синхронизация информации о филаменте" +msgstr "Синхронизация информации о материале" msgid "Add unused filaments to filaments list." -msgstr "Добавить неиспользуемые филаменты в список." +msgstr "Добавить неиспользуемые материалы в список." msgid "Only synchronize filament type and color, not including slot information." -msgstr "Синхронизировать только тип и цвет филамента, без информации о слотах." +msgstr "Синхронизировать только тип и цвет материала, без информации о слотах." msgid "Ext spool" msgstr "Внешняя катушка" msgid "Please check whether the nozzle type of the device is the same as the preset nozzle type." -msgstr "Проверьте, совпадает ли тип сопла устройства с типом сопла в профиле." +msgstr "Проверьте, совпадает ли тип сопла в принтере с типом сопла в профиле." msgid "Storage is not available or is in read-only mode." msgstr "Хранилище недоступно или защищено от записи." @@ -11621,7 +11443,7 @@ msgid "Timelapse is not supported because Print sequence is set to \"By object\" msgstr "Таймлапс не поддерживается, поскольку для последовательности печати установлено значение «Печать по очереди»." msgid "You selected external and AMS filament at the same time in an extruder, you will need manually change external filament." -msgstr "Вы выбрали одновременно внешний филамент и филамент из AMS в одном экструдере. Вам нужно будет вручную менять внешний филамент." +msgstr "Для одного экструдера одновременно выбраны внешняя катушка и катушка из AMS. Потребуется ручная смена прутка." msgid "Successfully synchronized nozzle information." msgstr "Информация о сопле успешно синхронизирована." @@ -11629,9 +11451,8 @@ msgstr "Информация о сопле успешно синхронизир msgid "Successfully synchronized nozzle and AMS number information." msgstr "Информация о сопле и количестве AMS успешно синхронизирована." -# AI Translated msgid "Do you want to continue to sync filaments?" -msgstr "Хотите продолжить синхронизацию материалов?" +msgstr "Продолжить синхронизацию материалов?" msgid "Successfully synchronized filament color from printer." msgstr "Цвет материала успешно синхронизирован с принтером." @@ -11657,7 +11478,7 @@ msgstr "" #, boost-format msgid "For constant flow rate, hold %1% while dragging." -msgstr "Для постоянного объёмного расхода удерживайте нажатой клавишу %1% при перетаскивании." +msgstr "Для выравнивания значений расхода удерживайте клавишу %1% при перетаскивании." msgid "ms" msgstr "мс" @@ -11710,7 +11531,7 @@ msgid "BambuSource has not correctly been registered for media playing! Press Ye msgstr "Компонент BambuSource неправильно зарегистрирован для воспроизведения медиафайлов! Нажмите «Да», чтобы повторно зарегистрировать его" msgid "Missing BambuSource component registered for media playing! Please re-install OrcaSlicer or seek community help." -msgstr "Отсутствует компонент BambuSource для воспроизведения медиа! Пожалуйста, переустановите OrcaSlicer или обратитесь за помощью к сообществу." +msgstr "Отсутствует компонент BambuSource для воспроизведения медиа. Переустановите OrcaSlicer или обратитесь за помощью к сообществу." msgid "Using a BambuSource from a different install, video play may not work correctly! Press Yes to fix it." msgstr "При использовании компонентов BambuSource из другого инсталлятора, воспроизведение видео может работать некорректно! Нажмите «Да», чтобы исправить это." @@ -11718,7 +11539,6 @@ msgstr "При использовании компонентов BambuSource и msgid "Your system is missing H.264 codecs for GStreamer, which are required to play video. (Try installing the gstreamer1.0-plugins-bad or gstreamer1.0-libav packages, then restart Orca Slicer?)" msgstr "В вашей системе отсутствуют кодеки H.264 для GStreamer, которые необходимы для воспроизведения видео (попробуйте установить пакеты gstreamer1.0-plugins-bad или gstreamer1.0-libav, а затем перезапустить Orca Slicer)." -# AI Translated msgid "Cloud agent is not available. Please restart OrcaSlicer and try again." msgstr "Облачный агент недоступен. Перезапустите OrcaSlicer и повторите попытку." @@ -11734,9 +11554,8 @@ msgstr "Войти" msgid "Login failed. Please try again." msgstr "Ошибка входа. Попробуйте ещё раз." -# AI Translated msgid "parse json failed" -msgstr "не удалось разобрать JSON" +msgstr "не удалось обработать JSON" msgid "[Action Required] " msgstr "[Требуется действие] " @@ -11928,12 +11747,10 @@ msgctxt "Keyboard Shortcut" msgid "Space" msgstr "Пробел" -# AI Translated msgid "Open actions speed dial" -msgstr "Открыть панель быстрых действий" +msgstr "Открыть строку быстрых действий" # Plater – это название библиотеки. Используется в меню горячих клавиш в качестве заголовка сочетаний клавиш, которые работают внутри пространства Plater. Как минимум на Windows не отображается. -# AI Translated msgid "Plater" msgstr "Рабочая область" @@ -12012,17 +11829,15 @@ msgstr "Информация об изменениях в версии %s:" msgid "Network plug-in update" msgstr "Обновление сетевого плагина" -# AI Translated msgid "Click OK to update the Network plug-in now. If a file is in use, the update will be applied the next time Orca Slicer launches." -msgstr "Нажмите OK, чтобы обновить сетевой плагин сейчас. Если файл используется, обновление будет применено при следующем запуске Orca Slicer." +msgstr "Нажмите OK для обновления сетевого плагина. Если файл занят, обновление будет завершено при следующем запуске Orca Slicer." -# AI Translated msgid "A new Network plug-in is available. Do you want to install it?" -msgstr "Доступен новый сетевой плагин. Хотите установить его?" +msgstr "Доступна новая версия сетевого плагина. Выполнить установку?" #, c-format, boost-format msgid "A new Network plug-in (%s) is available. Do you want to install it?" -msgstr "Доступен новый сетевой плагин (%s). Хотите установить?" +msgstr "Доступна новая версия сетевого плагина: %s. Выполнить установку?" msgid "New version of Orca Slicer" msgstr "Доступна новая версия Orca Slicer" @@ -12077,9 +11892,8 @@ msgstr "Имя принтера" msgid "Where to find your printer's IP and Access Code?" msgstr "Где найти IP-адрес и код доступа к вашему принтеру?" -# AI Translated msgid "How to trouble shooting" -msgstr "Как устранить неполадки" +msgstr "Помощь в устранении неполадок" msgid "Connect" msgstr "Подключить" @@ -12140,13 +11954,13 @@ msgid "Laser 40W" msgstr "40 Вт лазер" msgid "Cutting Module" -msgstr "Модуль обрезки" +msgstr "Модуль резки" # система пожаротушения? msgid "Auto Fire Extinguishing System" msgstr "Автоматическая система пожаротушения" -# AI Translated +# По сути, локализовывается как "Переключатель AMS". Но сами бамбуки используют кривой машинный перевод в русскоязычной документации, и там переводится от случая к случаю. Поэтому имеет полный смысл оставить брендированное название. msgid "Filament Track Switch" msgstr "Filament Track Switch" @@ -12168,7 +11982,6 @@ msgstr "Сбой обновления" msgid "Update successful" msgstr "Обновление успешно завершено" -# AI Translated msgid "Hotends on Rack" msgstr "Хотэнды на стойке" @@ -12266,9 +12079,8 @@ msgstr "" "Input Shaping поддерживается только в Marlin 2.1.2 и новее.\n" "Обновите прошивку и установите тип G-кода на «Marlin 2»." -# AI Translated msgid "Input shaping is only supported by Klipper, RepRapFirmware and Marlin 2." -msgstr "Input shaping поддерживается только Klipper, RepRapFirmware и Marlin 2." +msgstr "Input shaping поддерживается только в Klipper, RepRapFirmware и Marlin 2." msgid "Grouping error: " msgstr "Ошибка группировки: " @@ -12277,9 +12089,8 @@ msgstr "Ошибка группировки: " msgid " can not be placed in the " msgstr " нельзя заправить в " -# AI Translated msgid "Group error in manual mode. Please check nozzle count or regroup." -msgstr "Ошибка группировки в ручном режиме. Проверьте количество сопел или перегруппируйте." +msgstr "Ошибка группировки в ручном режиме. Проверьте количество сопел или измените группировку." msgid "Internal Bridge" msgstr "Внутренний мост" @@ -12427,10 +12238,10 @@ msgid "Clumping detection is not supported when \"by object\" sequence is enable msgstr "Обнаружение налипаний не поддерживается при печати моделей по очереди." msgid "Enabling both precise Z height and the prime tower may cause slicing errors." -msgstr "Одновременное включение точной высоты Z и башни очистки может вызвать ошибки нарезки." +msgstr "Совместное использование точной высоты Z и черновой башни может вызвать ошибки нарезки." msgid "A prime tower is required for clumping detection; otherwise, there may be flaws on the model." -msgstr "Для обнаружения налипаний требуется башня очистки; в противном случае на модели могут быть дефекты." +msgstr "Для обнаружения налипаний требуется черновая башня; в противном случае на модели могут возникнуть дефекты." msgid "Please select \"By object\" print sequence to print multiple objects in spiral vase mode." msgstr "Выберите последовательность печати «По очереди» для поддержки печати несколько моделей в режиме вазы." @@ -12529,10 +12340,10 @@ msgid "Organic support branch diameter must not be smaller than support tree tip msgstr "Диаметр ветвей органической поддержки не может быть меньше диаметра их кончиков." msgid "The Hollow base pattern is not supported by this support type; Rectilinear will be used instead." -msgstr "Шаблон полого основания не поддерживается этим типом поддержки; вместо него будет использоваться прямолинейный." +msgstr "Шаблон «Полость» не поддерживается этим типом поддержек и будет заменён на «Зигзаг»." msgid "Support enforcers are used but support is not enabled. Please enable support." -msgstr "Используется принудительная поддержка, но её генерация не включена. Пожалуйста, включите генерацию поддержки в настройках слайсера." +msgstr "Используется принудительная поддержка, но её генерация не включена. Включите генерацию поддержек в настройках слайсера." msgid "Layer height cannot exceed nozzle diameter." msgstr "Высота слоя не может быть больше диаметра сопла." @@ -12540,24 +12351,21 @@ msgstr "Высота слоя не может быть больше диамет msgid "Bridge line width must not exceed nozzle diameter" msgstr "Ширина линии моста не может превышать диаметр сопла" -# AI Translated msgid "\"G92 E0\" was found in before_layer_change_gcode, but the G or E are not uppercase. Please change them to the exact uppercase \"G92 E0\"." -msgstr "«G92 E0» обнаружено в before_layer_change_gcode, но G или E не в верхнем регистре. Измените их на точное «G92 E0» в верхнем регистре." +msgstr "В G-коде перед сменой слоя обнаружена команда «G92 E0» с неправильным регистром. Измените регистр «G92 E0» на заглавные буквы." -# AI Translated msgid "\"G92 E0\" was found in layer_change_gcode, but the G or E are not uppercase. Please change them to the exact uppercase \"G92 E0\"." -msgstr "«G92 E0» обнаружено в layer_change_gcode, но G или E не в верхнем регистре. Измените их на точное «G92 E0» в верхнем регистре." +msgstr "В G-коде после смены слоя обнаружена команда «G92 E0» с неправильным регистром. Измените регистр «G92 E0» на заглавные буквы." msgid "Relative extruder addressing requires resetting the extruder position at each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to layer_gcode." msgstr "При относительной адресации экструдера его положение необходимо корректировать на каждом слое, чтобы предотвратить потерю точности с плавающей запятой. Добавьте \"G92 E0\" в G-код выполняемый при смене слоя (layer_gcode)." -# AI Translated +# на самом деле, вполне совместима и часто используется в самих прошивках при сбросе координат msgid "\"G92 E0\" was found in before_layer_change_gcode, which is incompatible with absolute extruder addressing." -msgstr "«G92 E0» обнаружено в before_layer_change_gcode, что несовместимо с абсолютной адресацией экструдера." +msgstr "В G-коде перед сменой слоя обнаружена команда «G92 E0», которая несовместима с абсолютными координатами экструдера." -# AI Translated msgid "\"G92 E0\" was found in layer_change_gcode, which is incompatible with absolute extruder addressing." -msgstr "«G92 E0» обнаружено в layer_change_gcode, что несовместимо с абсолютной адресацией экструдера." +msgstr "В G-коде после смены слоя обнаружена команда «G92 E0», которая несовместима с абсолютными координатами экструдера." #, c-format, boost-format msgid "Plate %d: %s does not support filament %s" @@ -12614,15 +12422,14 @@ msgstr "Компенсация усадки материала не будет msgid "Generating skirt & brim" msgstr "Генерация юбки и каймы" -# AI Translated msgid "" "Per-object skirts cannot fit between the objects in By object print sequence.\n" "\n" "Move the objects farther apart, reduce brim/skirt size, switch Skirt type to Combined, or switch Print sequence to By layer." msgstr "" -"Пообъектные юбки не помещаются между моделями при последовательности печати «По объектам».\n" +"Независимые юбки не помещаются между моделями при печати моделей по очереди.\n" "\n" -"Раздвиньте модели дальше друг от друга, уменьшите размер каймы/юбки, переключите тип юбки на «Комбинированная» или измените последовательность печати на «По слоям»." +"Попробуйте увеличить отступ между моделями, уменьшить размер юбки/каймы, использовать совместный тип юбки или печатать модели послойно." msgid "Exporting G-code" msgstr "Экспорт в G-код" @@ -12642,29 +12449,23 @@ msgstr "Область печати" msgid "Extruder printable area" msgstr "Область печати экструдера" -# AI Translated msgid "Support parallel printheads" -msgstr "Поддержка параллельных печатающих головок" +msgstr "Поддержка параллельных печатающих голов" -# AI Translated msgid "Enable printer settings for machines that can use multiple printheads in parallel." -msgstr "Включает настройки принтера для машин, способных использовать несколько печатающих головок параллельно." +msgstr "Отобразить настройки для принтеров, способных параллельно использовать несколько зависимых печатающих голов." -# AI Translated msgid "Parallel printheads count" -msgstr "Количество параллельных печатающих головок" +msgstr "Количество зависимых голов" -# AI Translated msgid "Set the number of parallel printheads for machines like OrangeStorm Giga printer." -msgstr "Задаёт количество параллельных печатающих головок для машин вроде принтера OrangeStorm Giga." +msgstr "Задаёт количество зависимых печатающих голов для принтеров вроде OrangeStorm Giga." -# AI Translated msgid "Parallel printheads bed exclude areas" -msgstr "Исключаемые зоны стола для параллельных печатающих головок" +msgstr "Области исключения для зависимых голов" -# AI Translated msgid "Ordered list of bed exclude areas by parallel printhead count. Item 1 applies to one printhead, item 2 to two printheads, and so on. Leave an item empty for no excluded area." -msgstr "Упорядоченный список исключаемых зон стола по количеству параллельных печатающих голов. Поле 1 применяется к одной голове, поле 2 — к двум, и так далее. Оставьте поле пустым, если исключаемые зоны отсутствуют." +msgstr "Список исключаемых областей стола, упорядоченный по количеству зависимых голов. 1 – область для одной головы, 2 — область для двух, и т.д. Оставьте пустым, если исключаемые области отсутствуют." msgid "Excluded bed area" msgstr "Область исключения" @@ -12685,23 +12486,21 @@ msgid "This shrinks the first layer on the build plate to compensate for elephan msgstr "Сужает контур первого слоя на заданное значение для компенсации дефекта слоновьей ноги." msgid "Elephant foot compensation layers" -msgstr "Компенсирующих слоёв «слоновьей ноги»" +msgstr "Слои компенсации" msgid "The number of layers on which the elephant foot compensation will be active. The first layer will be shrunk by the elephant foot compensation value, then the next layers will be linearly shrunk less, up to the layer indicated by this value." -msgstr "Количество слоёв, на которые будет распространяться компенсация слоновьей ноги. Первый слой будет уменьшен на величину компенсации слоновьей ноги с последующим линейным уменьшением до слоя, указанного здесь." +msgstr "Количество слоёв для компенсации избытка материала. Сужение контура первого слоя управляется настройкой выше, последующие слои линейно расширяются до нормального размера." msgid "Elephant foot layers density" -msgstr "Плотность слоёв компенсации" +msgstr "Плотность слоя компенсации" -# AI Translated msgid "" "Density of internal solid infill for Elephant foot layers compensation.\n" "The initial value for the second layer is set.\n" "Subsequent layers become linearly denser by the height specified in elefant_foot_compensation_layers." msgstr "" -"Плотность внутреннего сплошного заполнения для компенсации слоёв «слоновьей ноги».\n" -"Задаётся начальное значение для второго слоя.\n" -"Последующие слои линейно уплотняются на высоту, заданную в elefant_foot_compensation_layers." +"Начальное значение плотности сплошного заполнения для компенсации дефекта «слоновьей ноги».\n" +"Позволяет компенсировать избыток материала за счёт снижения плотности первых слоёв с постепенным её восстановлением к слою, указанному выше." msgid "This is the height for each layer. Smaller layer heights give greater accuracy but longer printing time." msgstr "Высота каждого слоя. Чем меньше, тем выше качество поверхности и затраты времени (и наоборот)." @@ -12735,7 +12534,7 @@ msgid "Allow controlling BambuLab's printer through 3rd party print hosts." msgstr "Позволяет управлять принтером BambuLab через сторонние хосты печати." msgid "Use 3MF instead of G-code" -msgstr "Сжимать G-код перед отправкой" +msgstr "Сжатие G-кода перед отправкой" msgid "Enable this if the printer accepts a 3MF file as the print job. When enabled, Orca Slicer sends the sliced file as a .gcode.3mf, instead of a plain .gcode file." msgstr "Рекомендуется для принтеров, поддерживающих печать из архивов 3MF. Файлы печати будут отправляться с расширением \".gcode.3mf\"." @@ -12803,9 +12602,8 @@ msgstr "API-ключ" msgid "HTTP digest" msgstr "HTTP digest-авторизация" -# AI Translated msgid "Configuration for the plugin capabilities this preset uses, overriding the global Capabilities configuration. Stored as a raw JSON array and edited through the dialog behind the button, never typed in directly." -msgstr "Конфигурация возможностей плагинов, используемых этим профилем, переопределяющая глобальную конфигурацию возможностей. Хранится как необработанный массив JSON и редактируется через диалоговое окно за кнопкой, а не вводится напрямую." +msgstr "Настройки функционала плагинов, используемого этим профилем. Переопределяет глобальные настройки функционала. Хранится как необработанный массив JSON и редактируется через диалоговое окно по кнопке." # Логическая ошибка; пересекаются не периметры, а траектория холостого # перемещения со стенкой модели @@ -13255,7 +13053,7 @@ msgstr "" "Фактический поток для поддержек рассчитывается путём умножения этого значения на поток материала и общий поток модели (если он задан)." msgid "Support interface flow ratio" -msgstr "Интерфейс поддержек" +msgstr "Связующие слои" msgid "" "This factor affects the amount of material for the support interface.\n" @@ -13302,6 +13100,7 @@ msgstr "Дополнительные периметры на нависания msgid "Create additional perimeter paths over steep overhangs and areas where bridges cannot be anchored." msgstr "" "Создание дополнительных периметров над крутыми нависаниями и участками, где невозможно закрепить мосты.\n" +"\n" "Внимание: включение этой настройки может повлиять на корректность генерации мостов!" # ??? Реверс на чётных слоях нависаний @@ -13384,7 +13183,7 @@ msgstr "Включение динамического управления ск msgid "Slow down for curled perimeters" msgstr "Замедляться на изогнутых периметрах" -# AI Translated +# Обновил, отформатировал и провёл семантическую оптимизацию #, no-c-format, no-boost-format msgid "" "Enable this option to slow down printing in areas where perimeters may have curled upwards.\n" @@ -13402,20 +13201,20 @@ msgid "" "Note: When this option is enabled, overhang perimeters are treated like overhangs, meaning the overhang speed is applied even if the overhanging perimeter is part of a bridge.\n" "For example, when the perimeters are 100% overhanging, with no wall supporting them from underneath, the 100% overhang speed will be applied." msgstr "" -"Включите эту опцию, чтобы замедлять печать в областях, где периметры могли загнуться вверх.\n" -"Например, дополнительное замедление будет применяться при печати нависаний на острых углах, таких как нос корпуса Benchy, уменьшая загибание, которое накапливается на нескольких слоях.\n" +"Позволяет автоматически замедлять печать в областях, где выступающие периметры могут деформироваться из-за усадки.\n" +"Например, форштевень Benchy, который сильнее подвержен накоплению усадочной деформации.\n" "\n" -"Обычно рекомендуется держать эту опцию включённой, если только охлаждение вашего принтера не достаточно мощное или скорость печати не достаточно низкая, чтобы загибание периметров не происходило. \n" -"При печати с высокой скоростью внешнего периметра этот параметр может вносить артефакты на стенках при замедлении из-за потенциально большого разброса скоростей печати, из-за которого экструдер не успевает за требуемым изменением потока.\n" -"Коренная причина этих артефактов, скорее всего, — слегка неточная настройка PA, особенно в сочетании с большим временем сглаживания PA.\n" +"Рекомендуется использовать в случаях, если скоростной режим, конструкция принтера или его система охлаждения не способны обеспечить качественного сопротивления усадке материала.\n" "\n" -"Рекомендации при включении этой опции:\n" -"1. Уменьшите время сглаживания Pressure Advance до 0,015 - 0,02, чтобы экструдер быстро реагировал на изменения скорости.\n" -"2. Увеличьте минимальные скорости печати, чтобы ограничить величину замедления и уменьшить разброс между быстрыми и медленными участками.\n" -"3. Если артефакты всё ещё появляются, включите сглаживание скорости экструзии (ERS) для дальнейшего сглаживания переходов потока.\n" +"Примечание: отключает скоростной режим мостов для нависающих периметров (передаёт его в управление настройкам нависаний ниже).\n" "\n" -"Примечание: когда эта опция включена, нависающие периметры рассматриваются как нависания, то есть скорость нависания применяется, даже если нависающий периметр является частью моста.\n" -"Например, когда периметры нависают на 100%, без стенки, поддерживающей их снизу, будет применена скорость нависания 100%." +"Внимание: требуется крайне точная настройка коррекции давления. В противном случае при быстрой печати стенок в местах перепада скоростей будут возникать заметные артефакты поверхности.\n" +"\n" +"Рекомендации по настройке:\n" +"1. Уменьшите время сглаживания Pressure Advance до 0.015-0.02, чтобы\n" +"    повысить реактивность экструдера на изменения скорости.\n" +"2. Повысьте ограничения скоростей нависаний.\n" +"3. Если это не помогло, воспользуйтесь сглаживанием расхода." msgid "mm/s or %" msgstr "мм/с или %" @@ -13546,11 +13345,12 @@ msgstr "Послойно" msgid "By object" msgstr "По очереди" -# ???Внутрислойный порядок печати msgid "Intra-layer order" msgstr "Очерёдность моделей" -# AI Translated +# До 2.5.0 было легко и просто, теперь взяли и кучу подкапотных алгоритмов на пользователя вывалили... Упростил, насколько это возможно без потери смысла, чтобы всем угодить. Контекст: в 2.5.0 настройку переработали, чтобы все алгоритмы создавали цикличный маршрут, при котором конечная точка была бы максимально близко к началу (предположительно, следующего слоя). Цикличный маршрут позволяет избежать перемещений над уже напечатанным на слое, что убирает необходимость в Z-hop для простых моделей. PR: https://github.com/OrcaSlicer/OrcaSlicer/pull/13578 +# +# Примечания: Default использует алгоритм Greedy, 2-opt – алгоритм устранения самопересечений. Кратчайший путь проверяет всего 2 стратегии, остальные уже удалены как неэффективные и медленные. msgid "" "Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" "\n" @@ -13561,23 +13361,26 @@ msgid "" "\n" "With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate." msgstr "" -"Порядок обхода экземпляров моделей в пределах одного слоя; определяет, сколько перемещений тратится на переходы между ними.\n" +"Последовательность печати моделей в пределах одного слоя. Влияет на суммарное время перемещений от модели к модели.\n" "\n" -"По умолчанию: построение цепочки методом ближайшего соседа с последующим улучшением алгоритмом 2-opt и устранением пересечений. Хороший универсальный вариант.\n" -"По списку: экземпляры печатаются в том же порядке, что и в списке моделей, без какой-либо оптимизации пути. Используйте, когда нужен предсказуемый, задаваемый вручную порядок.\n" -"Лучший из всех (кратчайший путь): оцениваются все стратегии и применяется та, что даёт кратчайший путь. Порядок экземпляров моделей определяется один раз для всей печати, а порядок отдельных островков — для каждого слоя, поэтому на разных слоях могут использоваться разные стратегии. Нарезка идёт немного медленнее.\n" -"Змейкой: змеевидный обход ряд за рядом с улучшением алгоритмом 2-opt. Хорошо подходит для регулярных сеток из множества мелких деталей.\n" +"• По умолчанию: поиск ближайших моделей с оптимизацией пути\n" +"   и устранением пересечений. Быстрый универсальный вариант.\n" +"• По списку: сохранять тот же порядок, что и в списке моделей, без\n" +"   какой-либо оптимизации. Полезно для ручной настройки очерёдности.\n" +"• Кратчайший путь: выбор кратчайшего маршрута из всех стратегий.\n" +"   Маршрут может меняться от слоя к слою из-за изменения числа\n" +"   отдельных контуров. Требует больше времени.\n" +"• Змейкой: зигзагообразный маршрут с оптимизацией. Хорошо\n" +"   подходит для массивов из множества мелких деталей.\n" "\n" -"Если в одном слое используется несколько материалов или инструментов, приоритет отдаётся минимизации смен инструмента: модели сначала группируются по материалу, и эта настройка упорядочивает только экземпляры внутри каждой группы, поэтому общая последовательность может не выглядеть как кратчайший путь по столу." +"Примечание: при использовании нескольких материалов приоритет отдаётся минимизации числа их смен. Очерёдность определяется для каждого материала отдельно, и визуально маршрут может казаться неоптимальным." msgid "As object list" msgstr "По списку" -# AI Translated msgid "Best of all (shortest path)" -msgstr "Лучший из всех (кратчайший путь)" +msgstr "Кратчайший путь" -# AI Translated msgid "Snake" msgstr "Змейкой" @@ -13632,17 +13435,17 @@ msgstr "" "Включение вытяжного вентилятора для лучшего охлаждения внутренней области принтера.\n" "Команда G-кода: M106 P3 S(0-255)" -# AI Translated +# Сломано и не отображается, портировано для X2D msgid "Enable this to override the fan speed set in custom G-code during print." -msgstr "Включите, чтобы переопределить скорость вентилятора, заданную в пользовательском G-code во время печати." +msgstr "Заменять процент скорости вентилятора во время печати, указанную через пользовательский G-код." -# AI Translated +# Сломано и не отображается, портировано для X2D msgid "On completion" msgstr "По завершении" -# AI Translated +# Сломано и не отображается, портировано для X2D msgid "Enable this to override the fan speed set in custom G-code after print completion." -msgstr "Включите, чтобы переопределить скорость вентилятора, заданную в пользовательском G-code после завершения печати." +msgstr "Заменить процент скорости вентилятора после завершения печати, указанную через пользовательский G-код." msgid "Speed of exhaust fan during printing. This speed will override the speed in filament custom G-code." msgstr "Скорость вытяжного вентилятора во время печати. Эта скорость переопределяет скорость в пользовательском G-коде материала." @@ -14134,7 +13937,7 @@ msgid "Extruder Color" msgstr "Цвет экструдера" msgid "Only used as a visual help on UI." -msgstr "Используется только в качестве визуальной помощи в пользовательском интерфейсе." +msgstr "Используется для визуализации в интерфейсе слайсера." msgid "Extruder offset" msgstr "Смещение координат экструдера" @@ -14211,11 +14014,11 @@ msgstr "" " • наиболее высокий расход при печати (обычно, заполнения).\n" "Выбор тестируемых ускорений:\n" " • наиболее низкое ускорение из настроек печати\n" -" • наиболее высокое ускорение (не должно превышать\n" -"    рекомендуемый предел калибровщика Input Shaper в Klipper)\n" +" • наиболее высокое ускорение (не должно превышать предел\n" +"    рекомендуемого шейпера в Klipper)\n" "\n" -"2. Выпишите коэффициенты PA по примеру выше для каждой пары расхода/ускорения. Удельный расход можно посмотреть в «Просмотре нарезки», выбрав режим отображения «Объёмный расход». Значение отображается над горизонтальной шкалой печати слоя. Особенности:\n" -"• Как правило, значение PA должно снижаться с повышением расхода.\n" +"2. Выпишите коэффициенты PA по примеру выше для каждой пары расхода/ускорения. Значения расхода можно посмотреть в «Просмотре нарезки», выбрав режим отображения «Объёмный расход». Значение отображается над горизонтальной шкалой печати слоя. Особенности:\n" +"• Как правило, коэффициент должен снижаться с повышением расхода.\n" "   Если это не так, проверьте экструдер и корректность тестов.\n" "• Диапазон PA растёт со снижением скоростей и ускорений.\n" "• Если разницы между тестами не наблюдается, выбирайте PA из\n" @@ -14226,7 +14029,6 @@ msgstr "" msgid "Enable adaptive pressure advance within features (beta)" msgstr "Адаптироваться к изменениям линии" -# AI Translated msgid "" "Enable adaptive PA whenever there are flow changes in a feature, such as line width changes in a corner or overhangs.\n" "\n" @@ -14234,11 +14036,11 @@ msgid "" "\n" "This is an experimental option, as if the PA profile is not set accurately, it will cause uniformity issues." msgstr "" -"Включает адаптивный PA всякий раз, когда в элементе есть изменения потока, например изменение ширины линии на углу или нависаниях.\n" +"Экспериментальный режим смены коэффициента РА прямо посреди печати линии для адаптации к изменениям расхода на ней (например, на нависаниях или периметрах переменной ширины).\n" "\n" -"Несовместимо с принтерами Prusa, так как они делают паузу для обработки изменений PA, что вызывает задержки и дефекты.\n" +"Предупреждение: неточный подбор значений РА может привести к дефектам при работе этой настройки.\n" "\n" -"Это экспериментальная опция: если профиль PA задан неточно, это вызовет проблемы с однородностью." +"Внимание: несовместимо с принтерами Prusa, поскольку им требуется остановка для изменения коэффициента РА." msgid "Static pressure advance for bridges" msgstr "Фиксированный PA на мостах" @@ -14309,18 +14111,18 @@ msgid "Minimum HRC of nozzle required to print the filament. A value of 0 means msgstr "Минимальная твёрдость материала сопла (HRC), необходимая для печати материалом. 0 – отключение проверки твёрдости сопел." msgid "Filament map to extruder" -msgstr "Назначение филамента на экструдер" +msgstr "Назначение материала на экструдер" msgid "Filament map to extruder." -msgstr "Назначение филамента на экструдер." +msgstr "Назначение материала на экструдер." msgid "Auto For Flush" msgstr "Авто для прочистки" +# Не смог найти в интерфейсе msgid "Auto For Match" msgstr "Авто для сопоставления" -# AI Translated msgid "Nozzle Manual" msgstr "Ручная настройка сопел" @@ -14330,9 +14132,8 @@ msgstr "Температура прочистки" msgid "Temperature when flushing filament. 0 indicates the upper bound of the recommended nozzle temperature range." msgstr "Температура при прочистке. 0 – использовать максимально допустимую температуру." -# AI Translated msgid "Flush temperature used in fast purge mode." -msgstr "Температура прочистки, используемая в режиме быстрой прочистки." +msgstr "Температура в режиме быстрой прочистки." msgid "Flush volumetric speed" msgstr "Расход при прочистке" @@ -14402,9 +14203,9 @@ msgid "" "\n" "Note: Experimental and incomplete feature imported from BBS. Functional for some profiles that already have the variable saved." msgstr "" -"При включении поток экструзии ограничивается меньшим из расчётного значения (вычисленного по ширине линии и высоте слоя) и заданного пользователем максимального потока. При отключении применяется только заданный пользователем максимальный поток.\n" +"Регулирует значение максимального расхода при печати тонких и узких линий для достижения оптимальной линейной скорости. По сути, ограничивает расход материала в случаях, когда завышенная скорость движения сопла не позволяет материалу надёжно спекаться с предыдущим слоем.\n" "\n" -"Примечание: экспериментальная и неполная функция, перенесённая из BBS. Работает для некоторых профилей, в которых уже сохранена эта переменная." +"Внимание: требует настройки модели расхода и пока работает только у преднастроенных производителем профилей материалов." msgid "Max volumetric speed multinomial coefficients" msgstr "Коэффициенты расчёта максимального расхода" @@ -14496,28 +14297,27 @@ msgstr "Мин. объём прочистки на черновой башне" msgid "After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and the filament pressure is likely not yet stable. Before purging the print head into an infill or a sacrificial object, Orca Slicer will always prime this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably." msgstr "После смены инструмента, точное положение вновь загруженного прутка внутри него может быть неизвестно, и давление прутка, вероятно, ещё не стабильно. Перед тем, как очистить печатающую головку в заполнение или в «жертвенную» модель Orca Slicer всегда будет выдавливать это количество материала на черновую башню, чтобы обеспечить надёжную печать заполнения или «жертвенной» модели." -# AI Translated +# Не реализовано msgid "Wipe tower cooling" -msgstr "Охлаждение черновой башни" +msgstr "Охлаждение на черновой башне" -# AI Translated msgid "Temperature drop before entering filament tower" -msgstr "Снижение температуры перед входом в башню материала" +msgstr "Снижение температуры перед входом в башню" msgid "Interface layer pre-extrusion distance" -msgstr "Расстояние предэкструзии слоя интерфейса" +msgstr "Дистанция избыточной подачи при смене" msgid "Pre-extrusion distance for prime tower interface layer (where different materials meet)." -msgstr "Расстояние предэкструзии слоя интерфейса башни очистки (где соприкасаются разные материалы)." +msgstr "Протяжённость первичного движения прочистки после смены материала. Позволяет быстро набрать давление в сопле и сбросить перегретый материал.\n\nПримечание: фактическая длина может быть ограничена шириной башни." msgid "Interface layer pre-extrusion length" -msgstr "Длина предэкструзии слоя интерфейса" +msgstr "Длина прутка для избыточной подачи" msgid "Pre-extrusion length for prime tower interface layer (where different materials meet)." -msgstr "Длина предэкструзии слоя интерфейса башни очистки (где соприкасаются разные материалы)." +msgstr "Длина прутка, которую необходимо продавить на этапе избыточной подачи.\n\n0 – отключить этот этап." msgid "Tower ironing area" -msgstr "Разглаживание черновой башни" +msgstr "Разглаживание кончиков" # У H2D не требует, на Вики при этом написано, что требует... В баганном порте # "улучшений" башни вообще не работает ни при каких обстоятельствах. @@ -14530,15 +14330,18 @@ msgstr "" msgid "mm²" msgstr "мм²" +# Сломано и ни на что не влияет, даже на H2D и даже в Bambu Studio. msgid "Interface layer purge length" msgstr "Прочистка на слое интерфейса" +# Из ченжлогов Bambu: Studio will do nozzle wiping before flushing rather than after flushing, and print the prime tower directly, reducing extrusion volume fluctuations and improving layer height consistency. Added a new parameter for interface-layer flushing length. msgid "Purge length for prime tower interface layer (where different materials meet)." -msgstr "Длина прочистки на слое интерфейса башни (где соприкасаются разные материалы)." +msgstr "В настоящее время ничего не делает. Задумывалось как настройка расстояния внешней очистки сопла перед основной процедурой его прочистки." msgid "Interface layer print temperature" msgstr "Температура при прочистке" +# Не используется, настройка сломана. Перевёл на случай, если починят в будущем. msgid "Print temperature for prime tower interface layer (where different materials meet). If set to -1, use max recommended nozzle temperature." msgstr "" "Целевая температура при печати слоёв прочистки в черновой башне (место контакта разных материалов).\n" @@ -14613,11 +14416,9 @@ msgstr "Пригодный для печати" msgid "The filament is printable in extruder." msgstr "Материалом можно печатать через экструдер." -# AI Translated msgid "Filament-extruder compatibility" msgstr "Совместимость материала и экструдера" -# AI Translated msgid "A single 32-bit int encoding the compatibility level of a filament across all extruders (up to 10). Every 3 bits represent one extruder (bits [3*i, 3*i+2] for extruder i). 0: printable, 1: error, 2: critical warning, 3: warning, 4-7: reserved." msgstr "Одно 32-битное целое число, кодирующее уровень совместимости материала со всеми экструдерами (до 10). Каждые 3 бита представляют один экструдер (биты [3*i, 3*i+2] для экструдера i). 0: пригоден для печати, 1: ошибка, 2: критическое предупреждение, 3: предупреждение, 4-7: зарезервировано." @@ -14863,36 +14664,35 @@ msgstr "" "Внимание: параметр является устаревшим и в новых версиях Klipper был переименован в \"minimum_cruise_ratio\"." msgid "Default jerk." -msgstr "Рывок по умолчанию." +msgstr "Рывки по умолчанию." msgid "Marlin Firmware Junction Deviation (replaces the traditional XY Jerk setting)." msgstr "Junction Deviation для прошивки Marlin (заменяет традиционную настройку рывка XY)." msgid "Jerk of outer walls." -msgstr "Рывок для внешних периметров." +msgstr "Рывки на внешних периметрах." msgid "Jerk of inner walls." -msgstr "Рывок для внутренних периметров." +msgstr "Рывки на внутренних периметрах." msgid "Jerk for top surface." -msgstr "Рывок для верхней поверхности." +msgstr "Рывки на верхней поверхности." msgid "Jerk for infill." -msgstr "Рывок для заполнения." +msgstr "Рывки на заполнении." msgid "Jerk for the first layer." -msgstr "Рывок для первого слоя." +msgstr "Рывки на первом слое." msgid "Jerk for travel." -msgstr "Рывок при перемещении." +msgstr "Рывки при перемещениях." -# AI Translated msgid "" "Travel jerk of first layer.\n" "The percentage value is relative to Travel Jerk." msgstr "" -"Рывок перемещения первого слоя.\n" -"Процентное значение задаётся относительно рывка перемещения." +"Рывки при перемещениях на первом слое.\n" +"Можно указать процент от рывков при обычных перемещениях." msgid "Line width of the first layer. If expressed as a %, it will be computed over the nozzle diameter." msgstr "Ширина линий первого слоя. Можно указать процент от диаметра сопла." @@ -15015,7 +14815,7 @@ msgid "Ironing line spacing" msgstr "Интервал линий" msgid "Filament-specific override for ironing line spacing. This allows you to customize the spacing between ironing lines for each filament type." -msgstr "Индивидуальная настройка расстояния между линиями разглаживания для каждого типа филамента." +msgstr "Замещение интервала между линиями разглаживания. Позволяет настроить интервал отдельно для каждого материала." # "Разглаживание" явно задано в заголовке раздела msgid "Ironing inset" @@ -15115,7 +14915,7 @@ msgid "" msgstr "" "Тип шума, используемый для генерации нечёткой оболочки.\n" "\n" -"• Случайный: равномерно резкий шум.\n" +"• Классический: равномерно резкий шум.\n" "• Шум Перлина: согласованный однородный шум.\n" "• Волновой: более резкий вариант шума Перлина.\n" "• Ребристый: резкий сглаженный шум с мраморной текстурой.\n" @@ -15124,9 +14924,9 @@ msgstr "" "\n" "Примечание: для разных алгоритмов оптимальны разные масштабы." -# Поменял на "случайный" из-за нехватки места. +# Поменял на "случайный" из-за нехватки места. UPD: Вернул из-за конфликта с генератором периметров msgid "Classic" -msgstr "Случайный" +msgstr "Классический" msgid "Perlin" msgstr "Шум Перлина" @@ -15312,31 +15112,28 @@ msgstr "Наилучшее расположение модели при авто msgid "Enable this option if machine has auxiliary part cooling fan. G-code command: M106 P2 S(0-255)." msgstr "" -"Если в принтере имеется вспомогательный вентилятор для охлаждения моделей (обычно это боковой вентилятор), можете включить эту опцию.\n" +"Включить управление вспомогательным вентилятором из настроек материала.\n" "Команда G-кода: M106 P2 S(0-255)." -# AI Translated msgid "Fan direction" msgstr "Направление вентилятора" -# AI Translated msgid "Cooling fan direction of the printer" -msgstr "Направление вентилятора охлаждения принтера" +msgstr "Направление потока охлаждения вспомогательного вентилятора" -# AI Translated msgid "Both" -msgstr "Оба" +msgstr "Обе стороны" +# "only custom start G-code" в Орке не существует. Вероятно, забыли стереть при портировании из SuperSlicer. msgid "" "Start the fan this number of seconds earlier than its target start time (you can use fractional seconds). It assumes infinite acceleration for this time estimation, and will only take into account G1 and G0 moves (arc fitting is unsupported).\n" "It won't move fan commands from custom G-code (they act as a sort of 'barrier').\n" "It won't move fan commands into the start G-code if the 'only custom start G-code' is activated.\n" "Use 0 to deactivate." msgstr "" -"Запуск вентилятора на указанное количество секунд раньше целевого времени запуска (поддерживаются доли секунды). При этом предполагается бесконечное ускорение для оценки этого времени, и учёт только перемещений G1 и G0 (Аппроксимация дугами).\n" -"Это не приведёт к сдвигу команд вентилятора из пользовательских G-кодов (они действуют как своего рода барьер).\n" -"Это не приведёт к сдвигу команд вентилятора в стартовом G-коде, если активировано «только пользовательский стартовый G-код».\n" -"Установите 0 для отключения." +"Сместить управление вентилятором на заданное время для его запуска заранее. Можно указать дробное количество секунд.\n" +"\n" +"Примечание: расчёт смещения не учитывает ускорения, команды движения по дуге (аппроксимацию дугами) и пользовательский G-код." msgid "Only overhangs" msgstr "Только на нависаниях" @@ -15352,7 +15149,8 @@ msgid "" "This is useful for fans where a low PWM/power may be insufficient to get the fan started spinning from a stop, or to get the fan up to speed faster.\n" "Set to 0 to deactivate." msgstr "" -"Время принудительного запуска (kick-start) вентилятора на максимальной скорости, после чего скорость снижается до целевой. Это необходимо для вентиляторов у которых низкое значение уровня ШИМ/мощности может быть недостаточен для запуска вентилятора после остановки или для более быстрого увеличения скорости его вращения.\n" +"Время принудительного запуска на максимальных оборотах перед выходом на заданный процент скорости. Полезно для повышения отзывчивости вентиляторов с инертным ротором (а также в случаях, когда для его страгивания требуется дополнительное усилие).\n" +"\n" "Установите 0 для отключения." msgid "Minimum non-zero part cooling fan speed" @@ -15396,16 +15194,15 @@ msgid "" "Enable this if printer support air filtration\n" "G-code command: M106 P3 S(0-255)" msgstr "" -"Если в принтере имеется вытяжной вентилятор и вам требуется дополнительное охлаждение внутренней области принтера, включите эту опцию.\n" +"Включить управление вытяжным вентилятором из настроек материала.\n" "Команда G-кода: M106 P3 S(0-255)" -# AI Translated +# Из ченжлогов Bambu: Added a filtering option with cooling mode for the adaptive air circulation system. This option can be enabled via the slicer or the printer UI, and it's mainly used to filter the air when exhausting the air for low-temperature filaments msgid "Use cooling filter" -msgstr "Использовать фильтр охлаждения" +msgstr "Охлаждать через фильтр" -# AI Translated msgid "Enable this if printer support cooling filter" -msgstr "Включите, если принтер поддерживает фильтр охлаждения" +msgstr "Включить управление вытяжным вентилятором." msgid "G-code flavor" msgstr "Тип G-кода" @@ -15586,33 +15383,29 @@ msgstr "Угол нависания заполнения" msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb." msgstr "Угол нависания линий заполнения. При 60° получаются правильные соты." -# AI Translated msgid "Lightning overhang angle" -msgstr "Угол нависания для «Молнии»" +msgstr "Наклон поверхности для поддержки молнией" -# AI Translated msgid "Maximum overhang angle for Lightning infill support propagation." -msgstr "Максимальный угол нависания для распространения поддержки заполнения «Молния»." +msgstr "Максимальный угол наклона внутренних поверхностей для их поддержки отдельными ветвями молнии." -# AI Translated msgid "Prune angle" -msgstr "Угол обрезки" +msgstr "Наклон опор" -# AI Translated +# Оооочень технично. Самая главная проблема в понимании – шаблон генерируется "сверху вниз" (а не наоборот, как можно бы подумать), из-за чего и возникает вся эта техничность в содержании подсказок. На Вики чуть понятнее, но всё равно чрезвычайно технично. Убрал описание тонкостей фильтрации алгоритма и заменил на то, что по сути делает настройка. msgid "" "Controls how aggressively short or unsupported Lightning branches are pruned.\n" "This angle is converted internally to a per-layer distance." msgstr "" -"Определяет, насколько агрессивно обрезаются короткие или неподдерживаемые ветви «Молнии».\n" -"Внутренне этот угол преобразуется в расстояние на слой." +"Допустимый наклон опор молнии. Чем выше, тем быстрее и экономичнее распространяются её ветви." -# AI Translated +# "Выпрямление" здесь, вопреки первой мысли – это как раз-таки наоборот искажение шаблона по ходу печати для сокращения количества ветвей. Короче, опять путаница из-за того, что генерация ветвей происходит сверху вниз. При печати снизу вверх шаблон именно что искажается. msgid "Straightening angle" -msgstr "Угол выпрямления" +msgstr "Наклон локальных искажений" -# AI Translated +# При минимальном значении сразу понятно, что делает. Может стоит это указать, чтобы людям было проще осваивать настройку. msgid "Maximum straightening angle used to simplify Lightning branches." -msgstr "Максимальный угол выпрямления, используемый для упрощения ветвей «Молнии»." +msgstr "Дополнительные искажения позволяют эффективнее объединять опоры для ветвей. Чем больше наклон, тем сильнее может искажаться контур молнии." msgid "Sparse infill anchor length" msgstr "Длина привязок шаблона заполнения" @@ -15983,37 +15776,30 @@ msgstr "Минимальная скорость холостых перемещ msgid "Minimum travel speed (M205 T)" msgstr "Минимальная скорость перемещения без печати (M205 T)" -# AI Translated msgid "Maximum force of the Y axis" msgstr "Максимальное усилие оси Y" -# AI Translated +# По сути, перемножение массы на ускорение msgid "The allowed maximum output force of Y axis" -msgstr "Допустимое максимальное выходное усилие оси Y" +msgstr "Максимально допустимое усилие по оси Y." -# AI Translated msgid "N" msgstr "Н" -# AI Translated msgid "Bed mass of the Y axis" -msgstr "Масса стола по оси Y" +msgstr "Масса стола (оси Y)" -# AI Translated msgid "The machine bed mass load of Y axis" -msgstr "Массовая нагрузка стола машины по оси Y" +msgstr "Пассивная нагрузка механики оси Y массой стола." -# AI Translated msgid "g" msgstr "г" -# AI Translated msgid "The allowed max printed mass" -msgstr "Допустимая максимальная масса печати" +msgstr "Максимально допустимая масса печати" -# AI Translated msgid "The allowed max printed mass on a plate" -msgstr "Допустимая максимальная масса печати на столе" +msgstr "Максимально допустимая масса деталей на столе." msgid "Maximum acceleration for extruding" msgstr "Максимальное ускорение при печати" @@ -16171,8 +15957,9 @@ msgid "The highest printable layer height for the extruder. Used to limit the ma msgstr "Максимальная высота слоя для печати этим экструдером. Используется в качестве ограничения при использовании адаптивной высоты слоя." msgid "Extrusion rate smoothing" -msgstr "Сглаживание подачи" +msgstr "Сглаживание расхода" +# Провёл семантическую оптимизацию, очень уж длинно расписано. Плюс убрал про PrusaSlicer, т.к. в локализациях одинаково. + пояснения про скорость/ширину, т.к. Орка теперь умеет напрямую раскрашивать расход без необходимости считать его ручками. msgid "" "This parameter smooths out sudden extrusion rate changes that happen when the printer transitions from printing a high flow (high speed/larger width) extrusion to a lower flow (lower speed/smaller width) extrusion and vice versa.\n" "\n" @@ -16188,16 +15975,15 @@ msgid "" "\n" "Note: this parameter disables arc fitting." msgstr "" -"Сглаживает резкие изменения скорости подачи материала, которые происходят при переходе от печати с большим расходом (высокая скорость/большая ширина линии) к печати с меньшим расходом (меньшая скорость/меньшая ширина) и наоборот.\n" +"Сглаживает резкие изменения скорости подачи материала, которые происходят при переходе от печати с бóльшим расходом к печати с меньшим (и наоборот).\n" +"\n" +"По сути, ограничение производной от расхода: ограничивает скорость, с которой расход материала может меняться за единицу времени. Чем выше лимит, тем быстрее может меняться расход.\n" "\n" -"Параметр задаёт максимальную скорость, с которой расход материала может измениться за единицу времени. Чем выше лимит, тем быстрее может меняться расход материала. \n" "Установите 0 для отключения.\n" "\n" -"Для скоростных принтеров с прямой системой подачи и производительным экструдером (например, Bambu lab или Voron) сглаживание подачи обычно не требуется. Однако в некоторых случаях, когда скорость печати сильно различается, это может принести дополнительную пользу. Например, когда происходят резкие замедления из-за нависаний. В этих случаях рекомендуется использовать высокое значение, составляющее около 300-350 мм³/с², при оптимально настроенном Pressure Advance (коррекции давления) это поможет достичь более плавного перехода.\n" +"Для скоростных принтеров с производительным экструдером сглаживание обычно не требуется, но может быть полезным в местах с высоким перепадом скоростей. Например, для сглаживания замедлений при печати нависаний. При точно настроенной коррекции давления (коэффициент PA и время сглаживания) значения около 300-350 мм³/с² помогут дополнительно сгладить такие места.\n" "\n" -"У более медленных принтеров с внешней системой подачи или прошивкой без коррекции давления значение должно быть значительно ниже. 10-15 мм³/с² является хорошей отправной точкой для экструдеров с прямой подачей и 5-10 мм³/с² для внешней.\n" -"\n" -"В Prusa Slicer эта функция известна как «Сглаживание расхода» (Pressure equalizer).\n" +"Для более медленных принтеров с внешней системой подачи или прошивкой без коррекции давления значение должно быть гораздо ниже: 10-15 мм³/с² при прямой подаче и 5-10 мм³/с² при внешней.\n" "\n" "Примечание: при ненулевом значении отключает аппроксимацию дугами." @@ -16205,7 +15991,7 @@ msgid "mm³/s²" msgstr "мм³/с²" msgid "Smoothing segment length" -msgstr "Длина сглаживающего сегмента" +msgstr "Протяжённость сглаживания" msgid "" "A lower value results in smoother extrusion rate transitions. However, this results in a significantly larger G-code file and more instructions for the printer to process.\n" @@ -16220,14 +16006,13 @@ msgstr "" "\n" "Допустимые значения: 0,5–5" -# ??? msgid "Apply only on external features" -msgstr "Применять только к видимым элементам" +msgstr "Применять только к видимым элементам" msgid "Applies extrusion rate smoothing only on external perimeters and overhangs. This can help reduce artefacts due to sharp speed transitions on externally visible overhangs without impacting the print speed of features that will not be visible to the user." msgstr "" -"Сглаживание скорости экструзии будет применяться только к внешним периметрам и нависаниям.\n" -"Это помогает уменьшить количество артефактов, вызванные резкими перепадами скорости на видимых внешних участках, без влияния на скорость печати внутренних элементов, которые не видны пользователю." +"Применять сглаживание расхода только к внешним периметрам и нависаниям.\n" +"Помогает компенсировать видимые артефакты перепада скоростей без влияния на скорость печати внутренних элементов." msgid "Minimum speed for part cooling fan." msgstr "Минимальная скорость вентилятора обдува модели." @@ -16236,29 +16021,28 @@ msgid "" "Speed of auxiliary part cooling fan. Auxiliary fan will run at this speed during printing except the first several layers which is defined by no cooling layers.\n" "Please enable auxiliary_fan in printer settings to use this feature. G-code command: M106 P2 S(0-255)" msgstr "" -"Скорость вращения вспомогательного вентилятора для охлаждения моделей. Обычно это боковой вентилятор. Он всегда будет работать с этой скоростью, за исключением первых нескольких слоёв, которые обычно настроены на работу без охлаждения.\n" -"Пожалуйста, включите вспомогательный вентилятор для охлаждения моделей (auxiliary_fan) в настройках принтера, чтобы использовать эту функцию.\n" +"Процент скорости вспомогательного вентилятора для охлаждения моделей. Используется на протяжении всей печати (кроме слоёв, указанных в разделе «Охлаждение начала печати»).\n" +"Для работы этой настройки необходимо включить поддержку вспомогательного вентилятора на стороне принтера в его профиле.\n" "Команда G-кода: M106 P2 S(0-255)." -# AI Translated msgid "For the first" msgstr "Для первых" -# AI Translated msgid "Set special auxiliary cooling fan for the first certain layers." -msgstr "Задаёт особую скорость вспомогательного вентилятора обдува для первых нескольких слоёв." +msgstr "Особая скорость вспомогательного вентилятора для первых нескольких слоёв." -# AI Translated msgid "" "Auxiliary fan speed will be ramped up linearly from layer \"For the first\" to maximum at layer \"Full fan speed at layer\".\n" "\"Full fan speed at layer\" will be ignored if lower than \"For the first\", in which case the fan will run at maximum allowed speed at layer \"For the first\" + 1." msgstr "" -"Скорость вспомогательного вентилятора будет линейно увеличиваться от слоя «Для первых» до максимума на слое «Полная скорость вентилятора на слое».\n" -"«Полная скорость вентилятора на слое» будет проигнорирована, если она меньше «Для первых»; в этом случае вентилятор будет работать на максимально допустимой скорости на слое «Для первых» + 1." +"Начиная с указанного слоя, интенсивность охлаждения будет равномерно меняться для перехода к требуемым условиям обдува детали.\n" +"\n" +"Если активна настройка «Не обдувать первые N слоёв» – с учётом этих слоёв.\n" +"\n" +"Примечание: если слоёв с заблокированным обдувом больше, чем указано здесь, то восстановление происходит моментально на первом доступном слое." -# AI Translated msgid "Special auxiliary cooling fan speed, effective only for the first x layers." -msgstr "Особая скорость вспомогательного вентилятора обдува, действует только для первых x слоёв." +msgstr "Особая скорость вспомогательного вентилятора для первых N слоёв." msgid "The lowest printable layer height for the extruder. Used to limit the minimum layer height when enable adaptive layer height." msgstr "Минимальная высота слоя для печати этим экструдером. Используется в качестве ограничения при использовании адаптивной высоты слоя." @@ -16380,9 +16164,9 @@ msgstr "Глухие отверстия в основании модели ра msgid "Detect overhang walls" msgstr "Обнаруживать нависающие периметры" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "This detects the overhang percentage relative to line width and uses a different speed to print. For 100%% overhang, bridging speed is used." -msgstr "Определяет процент нависания относительно ширины линии и использует разную скорость печати. Для 100%-го нависания используется скорость печати мостов." +msgstr "Использовать разную скорость печати в зависимости от выноса линии относительно её опоры. Для нависаний без опоры используется скорость печати мостов." # В секции "Материал для линий" msgid "Outer walls" @@ -16440,17 +16224,15 @@ msgstr "G-код при смене типа линии (настройки пе msgid "This G-code is inserted when the extrusion role is changed. It runs after the machine and filament extrusion role G-code." msgstr "Команды в G-коде, которые выполняются между печатью разных элементов структуры (например, при переходе от периметра к заполнению). Выполняются после команд смены типа линии из настроек принтера и материала." -# AI Translated msgid "Plugins Used" msgstr "Используемые плагины" -# AI Translated +# Функционал плагинов для этого прояиля, указывается... msgid "Plugin capabilities referenced by this preset, stored as name;uuid;capability." -msgstr "Возможности плагинов, на которые ссылается этот профиль, хранятся как name;uuid;capability." +msgstr "Функционал плагинов, на который ссылается этот профиль, указывается как name;uuid;capability." -# AI Translated msgid "Python plugin(s) invoked at each slicing pipeline step to read and modify intermediate slicing data, including a final G-code post-processing step. Research/experimental." -msgstr "Плагины Python, вызываемые на каждом шаге конвейера нарезки для чтения и изменения промежуточных данных нарезки, включая финальный шаг постобработки G-code. Исследовательская/экспериментальная функция." +msgstr "Python-плагины, вызываемые на каждом этапе нарезки для чтения и изменения промежуточных её данных (включая финальную постобработку G-кода). Тестовая/экспериментальная функция." msgid "Printer type" msgstr "Тип принтера" @@ -16519,18 +16301,17 @@ msgstr "" "\n" "Примечание: значение не может быть меньше 25% или больше 100% и будет скорректировано автоматически при нарезке." -# AI Translated msgid "Retract amount after wipe" -msgstr "Величина отката после обтирания" +msgstr "Вторичный откат" -# AI Translated #, no-c-format, no-boost-format msgid "" "The length of fast retraction after wipe, relative to retraction length.\n" "The value will be clamped by 100% minus the retract amount before the wipe value." msgstr "" -"Длина быстрого отката после обтирания относительно длины отката.\n" -"Значение будет ограничено 100% минус величина отката до обтирания." +"Быстрый откат после очистки, выраженный в процентах от общей длины отката. В некоторых случаях позволяет значительно снизить количество «паутины»." +"\n" +"Примечание: суммарное значение не должно превышать 100% и будет скорректировано автоматически." msgid "Retract on layer change" msgstr "Откат при смене слоя" @@ -16657,18 +16438,16 @@ msgstr "Прямой (Direct)" msgid "Bowden" msgstr "Внешний (Bowden)" -# AI Translated +# https://wiki.bambulab.com/ru/h2c/manual/bambu-studio-h2c-operation#:~:text=Гибридный msgid "Hybrid" msgstr "Гибридный" -# Разобраться позже: wiki.bambulab.com/en/software/bambu-studio/filament-track-switch-dynamic-mapping -# AI Translated +# https://wiki.bambulab.com/ru/software/bambu-studio/filament-track-switch-dynamic-mapping msgid "Enable filament dynamic map" -msgstr "Включить динамическое сопоставление материалов" +msgstr "Динамическое сопоставление материалов" -# AI Translated msgid "Enable dynamic filament mapping during print." -msgstr "Включает динамическое сопоставление материалов во время печати." +msgstr "Включить динамическое сопоставление материалов во время печати." msgid "Has filament switcher" msgstr "Автосмена материала" @@ -16695,15 +16474,13 @@ msgid "Deretraction speed" msgstr "Скорость возврата" msgid "Speed for reloading filament into the nozzle. Zero means same speed of retraction." -msgstr "Скорость возврата материала в экструдер после отката. При значении 0 используется скорость отката." +msgstr "Скорость возврата материала в сопло после отката.\n0 – использовать скорость отката." -# AI Translated msgid "Deretraction speed (extruder change)" -msgstr "Скорость подачи (смена экструдера)" +msgstr "Скорость возврата (смена экструдера)" -# AI Translated msgid "Speed for reloading filament into the nozzle when switching extruder." -msgstr "Скорость возврата материала в сопло при смене экструдера." +msgstr "Скорость возврата материала в сопло после смены экструдера." msgid "Use firmware retraction" msgstr "Откат на уровне прошивки" @@ -16964,13 +16741,13 @@ msgstr "Тип юбки" # Про расширенное описание см. в комментарии к перевод подсказки настройки "Skirt minimum extrusion length" msgid "Combined - single skirt for all objects, Per object - individual object skirt." msgstr "" -"Выбор типа печатаемой юбки – одна общая для всех моделей или отдельные юбки для каждой модели.\n" +"Выбор типа печатаемой юбки – одна общая для всех моделей или независимые юбки для каждой модели.\n" "\n" "Внимание: при создании индивидуальных юбок проверка пересечения не совершается, из-за чего при близком расположении моделей они могут накладываться друг на друга. В таких случаях рекомендуется понизить количество контуров." # Отдельный (антоним к "совместный") msgid "Per object" -msgstr "Для каждой модели" +msgstr "Независимый" msgid "Skirt loops" msgstr "Контуров юбки" @@ -17076,21 +16853,20 @@ msgstr "" "Можно указать своё конечное значение потока, чтобы избежать подобных проблем." msgid "If smooth or traditional mode is selected, a timelapse video will be generated for each print. After each layer is printed, a snapshot is taken with the chamber camera. All of these snapshots are composed into a timelapse video when printing completes. If smooth mode is selected, the toolhead will move to the excess chute after each layer is printed and then take a snapshot. Since the melt filament may leak from the nozzle during the process of taking a snapshot, a prime tower is required for smooth mode to wipe the nozzle." -msgstr "На протяжении всей печати встроенная камера делает снимки, которые затем объединяются в ускоренное видео. Избыточные резкие движения в кадре можно сгладить при помощи соответствующего режима; после печати каждого слоя для создания снимка экструдер будет отводиться к лотку для удаления излишков. В этом режиме необходима черновая башня для устранения возможных подтёков во время создания снимка." +msgstr "На протяжении всей печати в конце слоя встроенная камера делает снимки, которые затем объединяются в ускоренное видео. Избыточные резкие движения в кадре можно сгладить при помощи «Плавного» режима, в котором для создания снимка экструдер будет отводиться к лотку для сброса материала. В этом режиме необходима черновая башня для устранения возможных подтёков во время создания снимка." msgid "Traditional" -msgstr "По умолчанию" +msgstr "Обычный" +# Для кнопки "Сгладить" добавили контекст, теперь их можно разделить. msgid "Smooth" -msgstr "Сгладить" +msgstr "Плавный" -# AI Translated msgid "Farthest point timelapse" -msgstr "Таймлапс из дальней точки" +msgstr "Съёмка из дальней точки" -# AI Translated msgid "When enabled, the timelapse snapshot is taken at the farthest point from camera instead of traveling to the wipe tower or excess chute. Only effective in traditional timelapse mode on non-I3 printers." -msgstr "Когда включено, снимок таймлапса делается из наиболее удалённой от камеры точки вместо перемещения к черновой башне или лотку сброса излишков. Действует только в традиционном режиме таймлапса на принтерах, отличных от I3." +msgstr "Делать снимки из наиболее удалённой от камеры точки вместо перемещения к черновой башне или лотку для сброса материала. Работает только в обычном режиме таймлапса на принтерах с кинематикой, отличной от I3." msgid "Temperature variation" msgstr "Разница температур" @@ -17140,10 +16916,10 @@ msgid "Enable this option to omit the custom Change filament G-code only at the msgstr "Полезно для смены материала вручную при совместной печати через общий экструдер, где для этого используются команды M600/PAUSE. Отключает выполнение «G-кода смены материала» в самом начале печати (обычно это не требуется, так как пруток уже заправлен). Команда смены инструмента (например, T0) будет пропускаться на протяжении всей печати." msgid "Wipe tower type" -msgstr "Тип башни очистки" +msgstr "Тип черновой башни" msgid "Choose the wipe tower implementation for multi-material prints. Type 1 is recommended for Bambu and Qidi printers with a filament cutter. Type 2 offers better compatibility with multi-tool and MMU printers and provide overall better compatibility." -msgstr "Выберите реализацию башни очистки для многоматериальной печати. Тип 1 рекомендуется для принтеров Bambu и Qidi с обрезчиком филамента. Тип 2 обеспечивает лучшую совместимость с многоинструментальными и MMU-принтерами и в целом более универсален." +msgstr "Выбор реализации черновой башни при печати несколькими материалами. Тип 1 рекомендуется для принтеров Bambu и Qidi с обрезкой прутка. Тип 2 – универсальный вариант с поддержкой широкого спектра принтеров (в т.ч. с системами смены материала и инструментов)." msgid "Type 1" msgstr "Тип 1" @@ -17780,24 +17556,22 @@ msgstr "" "\n" "Примечание: влияет только на принтеры Bambu, в остальных случаях башня автоматически сужается по необходимости." -# ??? настройка отключена в коде +# настройка отключена в коде msgid "Purging volumes" msgstr "Объём прочистки" -# ??? настройка отключена в коде +# настройка отключена в коде msgid "Flush multiplier" msgstr "Множитель прочистки" msgid "The actual flushing volumes is equal to the flush multiplier value multiplied by the flushing volumes in the table." msgstr "Реальные объёмы прочистки равны произведению множителя и значений, указанных в таблице." -# AI Translated msgid "Flush multiplier (Fast mode)" msgstr "Множитель прочистки (быстрый режим)" -# AI Translated msgid "The flush multiplier used in fast purge mode." -msgstr "Множитель прочистки, используемый в режиме быстрой прочистки." +msgstr "Множитель для режима быстрой прочистки." msgid "Prime volume" msgstr "Объём сброса материала на черновой башне" @@ -17805,24 +17579,20 @@ msgstr "Объём сброса материала на черновой баш msgid "This is the volume of material to prime the extruder with on the tower." msgstr "Объём материала, который необходимо выдавить для подготовки экструдера на черновой башне." -# AI Translated msgid "Prime volume mode" -msgstr "Режим объёма подготовки" +msgstr "Режим прочистки" -# AI Translated msgid "Selects how the wipe-tower prime and flush volumes are computed on multi-extruder printers." -msgstr "Определяет, как вычисляются объёмы подготовки и прочистки черновой башни на многоэкструдерных принтерах." +msgstr "Режим расчёта прочистки на черновой башне для многоэкструдерных принтеров." -# AI Translated msgid "Saving" msgstr "Экономия" -# AI Translated msgid "Fast" msgstr "Быстрый" msgid "This is the width of prime towers." -msgstr "Размер черновой башни по оси X. Размер по оси Y будет автоматически вычислен исходя из необходимого объёма очистки и ширины башни. Таким образом, увеличивая ширину башни вы уменьшаете её длину и наоборот." +msgstr "Размер черновой башни по оси X. Размер по оси Y будет автоматически вычислен исходя из необходимого объёма прочистки и ширины башни. Таким образом, увеличивая ширину башни вы уменьшаете её длину и наоборот." msgid "Wipe tower rotation angle" msgstr "Угол поворота черновой башни" @@ -17854,7 +17624,7 @@ msgid "" "For the wipe tower external perimeters the internal perimeter speed is used regardless of this setting." msgstr "" "Максимальная скорость печати при очистке в черновую башню и печати её разреженных слоёв.\n" -"Во время очистки программа сопоставляет скорость разреженного заполнения и скорость, рассчитанную по 'максимальному объёмному расходу', и использует наименьшую.\n" +"Во время прочистки программа сопоставляет скорость разреженного заполнения и скорость, рассчитанную по 'максимальному объёмному расходу', и использует наименьшую.\n" "При печати разреженных слоёв программа сопоставляет скорость внутренних периметров и скорость, рассчитанную по 'максимальному объёмному расходу', и также использует наименьшую.\n" "\n" "Увеличение этой скорости может повлиять на устойчивость башни, а также увеличить силу, с которой сопло сталкивается с любыми наплывами, которые могли образоваться на черновой башне.\n" @@ -17888,7 +17658,7 @@ msgid "Extra rib length" msgstr "Вынос основания ребра" msgid "Positive values can increase the size of the rib wall, while negative values can reduce the size. However, the size of the rib wall can not be smaller than that determined by the cleaning volume." -msgstr "Положительное значение может увеличить длину ребра, а отрицательное - уменьшить. Однако она не может быть меньше размера, определяемого объёмом очистки." +msgstr "Положительное значение может увеличить длину ребра, а отрицательное - уменьшить. Однако она не может быть меньше размера, определяемого объёмом прочистки." msgid "Rib width" msgstr "Ширина ребра" @@ -18150,79 +17920,62 @@ msgstr "" "\n" "Примечание: периметр может расширяться до ширины элемента." -# AI Translated msgid "Hotend change time" msgstr "Время смены хотэнда" -# AI Translated msgid "Time to change hotend." -msgstr "Время смены хотэнда." +msgstr "Время, затрачиваемое на смену хотэнда." -# AI Translated msgid "Hotend change" msgstr "Смена хотэнда" -# AI Translated msgid "When changing the hotend, it is recommended to extrude a certain length of filament from the original nozzle. This helps minimize nozzle oozing." -msgstr "При смене хотэнда рекомендуется выдавить определённую длину материала из исходного сопла. Это помогает минимизировать вытекание из сопла." +msgstr "При смене хотэнда рекомендуется выдавить немного материала из прежнего сопла. Помогает минимизировать последующие подтёки." -# AI Translated msgid "Extruder change" msgstr "Смена экструдера" msgid "To prevent oozing, the nozzle will perform a reverse travel movement for a certain period after the ramming is complete. The setting define the travel time." -msgstr "Чтобы материал не подтекал, материал после рэмминга немного отъезжает назад. Этот параметр задаёт время движения в обратном направлении." +msgstr "Время движения сопла в обратном направлении во избежание подтёков из него. Выполняется по завершении рэмминга." msgid "To prevent oozing, the nozzle temperature will be cooled during ramming. Therefore, the ramming time must be greater than the cooldown time. 0 means disabled." -msgstr "Для предотвращения подтекания материала, температура сопла будет снижена во время рэмминга. Поэтому время рэмминга должно быть больше времени охлаждения. 0 значит отключено." +msgstr "Во избежание подтёков температура сопла будет снижена на время рэмминга. Поэтому время рэмминга должно быть больше времени охлаждения. 0 значит отключено." -# AI Translated msgid "The maximum volumetric speed for ramming before extruder change, where -1 means using the maximum volumetric speed." -msgstr "Максимальный объёмный расход при рэмминге перед сменой экструдера, где -1 означает использование максимального объёмного расхода." +msgstr "Максимальный объёмный расход для рэмминга перед сменой экструдера.\n-1 – использовать максимальный расход." -# AI Translated msgid "To prevent oozing, the nozzle temperature will be cooled during ramming. Note: only a cooldown command and fan activation are triggered, reaching the target temperature is not guaranteed. 0 means disabled." -msgstr "Во избежание вытекания температура сопла будет снижена во время рэмминга. Примечание: срабатывают только команда охлаждения и включение вентилятора; достижение целевой температуры не гарантируется. 0 означает отключено." +msgstr "Во избежание подтёков температура сопла будет снижена на время рэмминга.\n0 – не менять температуру.\n\nПримечание: срабатывают только команда охлаждения и включение вентилятора; достижение целевой температуры не гарантируется." -# AI Translated msgid "The maximum volumetric speed for ramming before a hotend change, where -1 means using the maximum volumetric speed." -msgstr "Максимальный объёмный расход при рэмминге перед сменой хотэнда, где -1 означает использование максимального объёмного расхода." +msgstr "Максимальный объёмный расход для рэмминга перед сменой хотэнда.\n-1 – использовать максимальный расход." -# AI Translated msgid "length when change hotend" -msgstr "длина при смене хотэнда" +msgstr "Откат при смене хотэнда" -# AI Translated msgid "When this retraction value is modified, it will be used as the amount of filament retracted inside the hotend before changing hotends." -msgstr "При изменении этого значения отката оно будет использоваться как величина отката материала внутри хотэнда перед сменой хотэндов." +msgstr "Величина отката материала внутри хотэнда перед его сменой." -# AI Translated msgid "Support fast purge mode" -msgstr "Поддержка режима быстрой прочистки" +msgstr "Режим быстрой прочистки" -# AI Translated msgid "Whether this printer supports fast purge mode with optimized temperature and multiplier." -msgstr "Поддерживает ли этот принтер режим быстрой прочистки с оптимизированной температурой и множителем." +msgstr "Поддерживает ли принтер режим быстрой прочистки с оптимизированной температурой и множителем." -# AI Translated msgid "Filament change" msgstr "Смена материала" -# AI Translated msgid "The volume of material required to prime the extruder on the tower, excluding a hotend change." -msgstr "Объём материала, необходимый для подготовки экструдера на башне, исключая смену хотэнда." +msgstr "Объём материала, необходимый для прочистки экструдера на башне, не считая смены хотэнда." -# AI Translated msgid "The volume of material required to prime the extruder for a hotend change on the tower." -msgstr "Объём материала, необходимый для подготовки экструдера при смене хотэнда на башне." +msgstr "Объём материала, необходимый для прочистки экструдера на башне при смене хотэнда." -# AI Translated msgid "Preheat temperature delta" -msgstr "Дельта температуры предварительного нагрева" +msgstr "Дельта преднагрева" -# AI Translated msgid "Temperature delta applied during pre-heating before tool change." -msgstr "Дельта температуры, применяемая при предварительном нагреве перед сменой инструмента." +msgstr "Разница температуры для предварительного нагрева перед сменой инструмента." msgid "Detect narrow internal solid infills" msgstr "Оптимизация заполнения узких мест" @@ -18345,11 +18098,11 @@ msgstr "Экспорт настроек в файл." # командная строка? нужен ли пеевод? msgid "Send progress to pipe" -msgstr "Отправлять прогресс в канал" +msgstr "Send progress to pipe" # ??? это относится к командной строке msgid "Send progress to pipe." -msgstr "Отправлять прогресс в канал." +msgstr "Send progress to pipe." msgid "Arrange Options" msgstr "Параметры расстановки" @@ -18499,15 +18252,14 @@ msgstr "" msgid "Log file" msgstr "Файл журнала" -# AI Translated msgid "Redirects debug logging to file.\n" -msgstr "Перенаправляет отладочный журнал в файл.\n" +msgstr "Направляет отладочные записи в файл.\n" msgid "Enable timelapse for print" msgstr "Вкл. таймлапс для печати" msgid "If enabled, this slicing will be considered using timelapse." -msgstr "Если включено, текущая нарезка будет выполнена с учётом функции таймлапса." +msgstr "Выполнять нарезку с учётом записи таймлапса." msgid "Load custom G-code" msgstr "Загрузить пользовательский G-код" @@ -18515,7 +18267,7 @@ msgstr "Загрузить пользовательский G-код" msgid "Load custom G-code from json." msgstr "Загрузить G-код из json." -# ??? назначить идентификаторы +# назначить идентификаторы msgid "Load filament IDs" msgstr "Загрузить идентификаторы материалов" @@ -18525,7 +18277,6 @@ msgstr "Загрузить идентификаторы материалов д msgid "Allow multiple colors on one plate" msgstr "Игнорировать разницу в цвете" -# ???? msgid "If enabled, Arrange will allow multiple colors on one plate." msgstr "Если включено, модели разных цветов не будут разделяться на разные столы." @@ -18574,9 +18325,8 @@ msgstr "Список значений метаданных, добавляемы msgid "Allow 3MF with newer version to be sliced" msgstr "Разрешить нарезку 3MF более новой версии" -# ??? msgid "Allow 3MF with newer version to be sliced." -msgstr "Разрешить нарезку новых версий 3MF-файлов." +msgstr "Разрешить нарезку проектов из более новых версий." msgid "Current Z-hop" msgstr "Подъём оси Z" @@ -18921,13 +18671,13 @@ msgid "" "An object's XY size compensation will not be used because it is also color-painted.\n" "XY Size compensation cannot be combined with color-painting." msgstr "" -"Коррекция горизонтальных размеров модели не будет действовать, поскольку для этой модели была выполнена операция окрашивания.\n" -"Коррекция горизонтальных размеров модели не может использоваться в сочетании с функцией раскрашивания." +"Функция «Расширение контура/пустот слоя» игнорируется.\n" +"Коррекцию невозможно выполнить для нескольких материалов в окрашенной модели." msgid "" "An object has enabled XY Size compensation which will not be used because it is also fuzzy skin painted.\n" "XY Size compensation cannot be combined with fuzzy skin painting." -msgstr "Функция «Расширение контура слоя» игнорируется. Коррекцию контура слоя невозможно выполнить, если его часть принадлежит нечёткой оболочке." +msgstr "Функция «Расширение контура/пустот слоя» игнорируется. Коррекцию невозможно выполнить, если часть слоя принадлежит нечёткой оболочке." msgid "Object name" msgstr "Имя модели" @@ -19078,7 +18828,7 @@ msgstr "" #, c-format, boost-format msgid "Only one of the results with the same name: %s will be saved. Are you sure you want to override the other results?" -msgstr "Будет сохранён только один из одноимённых результатов (%s). Вы действительно хотите перезаписать остальные?" +msgstr "Будет сохранён только один из одноимённых результатов (%s). Перезаписать остальные?" #, c-format, boost-format msgid "There is already a previous calibration result with the same name: %s. Only one result with a name is saved. Are you sure you want to overwrite the previous result?" @@ -19089,7 +18839,7 @@ msgid "" "Within the same extruder, the name(%s) must be unique when the filament type, nozzle diameter, and nozzle flow are the same.\n" "Are you sure you want to override the historical result?" msgstr "" -"Для одного экструдера имя (%s) должно быть уникальным, если тип материала, диаметр сопла и поток одинаковы.\n" +"В рамках одного экструдера имя (%s) должно быть уникальным, если тип материала, диаметр сопла и поток одинаковы.\n" "Перезаписать прошлый результат?" #, c-format, boost-format @@ -19221,13 +18971,11 @@ msgstr "Введите имя для сохранения на принтере. msgid "The name cannot exceed 40 characters." msgstr "Максимальная длина имени 40 символов." -# AI Translated msgid "Nozzle ID" msgstr "ID сопла" -# AI Translated msgid "Standard Flow" -msgstr "Стандартный расход" +msgstr "Обычный расход" msgid "Please find the best line on your plate" msgstr "Пожалуйста, найдите лучшую линию на столе" @@ -19394,7 +19142,7 @@ msgstr "История успешных результатов калибров msgid "Refreshing the previous Flow Dynamics Calibration records" msgstr "Обновление записей прошлых калибровок динамики потока" -# AI Translated +# Подставляется toolhead_display_name #, c-format, boost-format msgid "Note: The hotend number on the %s is tied to the holder. When the hotend is moved to a new holder, its number will update automatically." msgstr "Примечание: номер хотэнда на %s привязан к держателю. При перемещении хотэнда в новый держатель его номер обновится автоматически." @@ -19411,7 +19159,7 @@ msgstr "Редактировать калибровку динамики пот #, c-format, boost-format msgid "Within the same extruder, the name '%s' must be unique when the filament type, nozzle diameter, and nozzle flow are identical. Please choose a different name." -msgstr "Для одного экструдера имя «%s» должно быть уникальным при одинаковых типе филамента, диаметре и потоке сопла. Пожалуйста, выберите другое имя." +msgstr "В рамках одного экструдера имя (%s) должно быть уникальным, если тип материала, диаметр сопла и поток одинаковы. Укажите другое имя." msgid "New Flow Dynamic Calibration" msgstr "Новая калибровка динамики потока" @@ -19457,19 +19205,19 @@ msgstr "" "По имени хоста %1% обнаружено несколько IP-адресов.\n" "Выберите адрес для использования." -# AI Translated +# В калибровке температуры и расхода msgid "Auto-scale for nozzle" -msgstr "Автомасштабирование под сопло" +msgstr "Адаптация к соплу" -# AI Translated +# Речь о температурной башне msgid "" "This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n" "When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n" "Turn scaling off only if you wish to print the reference model exactly as-is." msgstr "" -"Эта модель рассчитана на сопло 0,4 мм и высоту слоя 0,2 мм. \n" -"Если включено масштабирование (рекомендуется), размер модели динамически подстраивается под диаметр вашего текущего сопла и подходящую высоту слоя, благодаря чему тест получается и точным, и легко читаемым.\n" -"Отключайте масштабирование, только если хотите напечатать эталонную модель ровно в исходном виде." +"Тестовая модель рассчитана на сопло 0,4 мм и высоту слоя 0,2 мм.\n" +"При включении адаптации (рекомендуется) её размер динамически подстраивается под диаметр текущего сопла и подходящую высоту слоя, благодаря чему тест получается более точным и читаемым.\n" +"Отключать имееет смысл для печати эталонной модели ровно в исходном виде." # В заголовке окна куча места msgid "PA Calibration" @@ -19607,13 +19355,14 @@ msgstr "Начальная скорость: " msgid "End speed: " msgstr "Конечная скорость: " -# AI Translated msgid "Auto-adjust to max volumetric speed" -msgstr "Автоподстройка под предел объёмного расхода" +msgstr "Адаптация к расходу" -# AI Translated msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead." -msgstr "Если конечная скорость превысит предел объёмного расхода материала, автоматически уменьшать высоту слоя (сохраняя стандартные значения и оставаясь в пределах ограничений принтера), чтобы её достичь. Если даже минимальной высоты слоя недостаточно, вместо этого снижается конечная скорость." +msgstr "" +"Автоматически уменьшать высоту слоя для обеспечения требуемой скорости. Позволяет не упираться в предел объёмного расхода материала.\n" +"\n" +"Примечание: скорость всё равно может снижаться в случае упора в минимальную высоту слоя из заданных ограничений принтера." msgid "" "Please input valid values:\n" @@ -19626,7 +19375,6 @@ msgstr "" "Шаг ≥ 0\n" "Конечное > начальное + шаг" -# AI Translated #, c-format, boost-format msgid "" "The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n" @@ -19634,23 +19382,20 @@ msgid "" "\n" "%s" msgstr "" -"Конечная скорость (%.0f мм/с) превышает предел объёмного расхода материала (%.1f мм³/с), который при такой ширине линии и высоте слоя ограничивает скорость внешних периметров примерно до %.0f мм/с.\n" -" Более высокие скорости будут ограничены, поэтому верхние блоки башни не напечатаются с заданной скоростью.\n" +"Конечная скорость (%.0f мм/с) приводит к превышению предела объёмного расхода материала (%.1f мм³/с). При такой ширине линии периметров и высоте слоя расход ограничивает линейную скорость примерно до %.0f мм/с, и верхние сегменты башни не смогут достичь заданной скорости.\n" "\n" "%s" -# AI Translated #, c-format, boost-format msgid "" "The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n" "\n" "The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed." msgstr "" -"Конечная скорость (%.0f мм/с) превышает предел объёмного расхода материала (%.1f мм³/с) при высоте слоя по умолчанию (%.2f мм).\n" +"Конечная скорость (%.0f мм/с) приводит к превышению предела объёмного расхода материала (%.1f мм³/с) при высоте слоя по умолчанию (%.2f мм).\n" "\n" -"Высота слоя уменьшена до %.2f мм (значение, используемое профилями этого принтера), чтобы башня могла достичь заданной скорости." +"Высота слоя уменьшена до %.2f мм (минимально значение из профиля принтера), чтобы башня могла достичь заданной скорости." -# AI Translated #, c-format, boost-format msgid "" "Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n" @@ -19659,23 +19404,20 @@ msgid "" "\n" "Continue?" msgstr "" -"Даже при наименьшей высоте слоя, используемой профилями этого принтера (%.2f мм), конечная скорость (%.0f мм/с) превышает предел объёмного расхода материала (%.1f мм³/с).\n" +"Конечная скорость (%.0f мм/с) приводит к превышению предела объёмного расхода материала (%.1f мм³/с) даже при минимально допустимой высоте слоя (в соответствии с профилем принтера, %.2f мм).\n" "\n" -"Высота слоя будет установлена в %.2f мм, а конечная скорость снижена до %.0f мм/с.\n" +"Высота слоя будет установлена на %.2f мм, а конечная скорость снижена до %.0f мм/с.\n" "\n" "Продолжить?" -# AI Translated msgid "Continue anyway?" msgstr "Всё равно продолжить?" -# AI Translated msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?" -msgstr "Включить «Автоподстройку» для автоматического исправления или всё равно продолжить?" +msgstr "Включить адаптацию к расходу для автоматического исправления?\nНет – игнорировать предупреждение." -# AI Translated msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?" -msgstr "Включить «Автомасштабирование под сопло» и «Автоподстройку» для автоматического исправления или всё равно продолжить?" +msgstr "Включить адаптацию к соплу и расходу для автоматического исправления?\nНет – игнорировать предупреждение." msgid "Start retraction length: " msgstr "Начальная длина отката: " @@ -20173,10 +19915,10 @@ msgid "Create Nozzle for Existing Printer" msgstr "Сопло для принтера" msgid "Create from Template" -msgstr "Создать из шаблона" +msgstr "Создать из общих шаблонов" msgid "Create Based on Current Printer" -msgstr "Создать на основе профиля выбранного принтера" +msgstr "Создать из профилей производителя" msgid "Import Preset" msgstr "Импорт профиля" @@ -20305,8 +20047,8 @@ msgid "" "The system preset does not allow creation. \n" "Please re-enter the printer model or nozzle diameter." msgstr "" -"Системный профиль не допускает создания.\n" -"Пожалуйста, повторно введите модель принтера или диаметр сопла." +"Имя совпадает с системным профилем.\n" +"Назовите модель принтера или диаметр сопла иначе." msgid "" "\n" @@ -20500,11 +20242,12 @@ msgid "" "All the filament presets belong to this filament would be deleted.\n" "If you are using this filament on your printer, please reset the filament information for that slot." msgstr "" -"Все профили прутка, относящиеся к этому материалу, будут удалены.\n" -"Если вы используете этот пруток в принтере, пожалуйста, сбросьте информацию о прутке для этого слота." +"Все профили, относящиеся к этому материалу, будут удалены.\n" +"Если вы используете его в принтере, сбросьте информацию о\n" +"нём у соответствующего слота." msgid "Delete filament" -msgstr "Удаление прутка" +msgstr "Удаление материала" msgid "Add Preset" msgstr "Добавить профиль" @@ -20513,13 +20256,13 @@ msgid "Add preset for new printer" msgstr "Добавление профиля для нового принтера" msgid "Copy preset from filament" -msgstr "Копировать профиль из прутка" +msgstr "Копировать профиль из материала" msgid "The filament choice not find filament preset, please reselect it" -msgstr "Не удалось найти профиль прутка. Выберите его повторно" +msgstr "Не удалось найти профиль материала. Выберите его повторно" msgid "[Delete Required]" -msgstr "[Необходимо удалить]" +msgstr "[Требуется удаление]" msgid "Edit Preset" msgstr "Изменить профиль" @@ -20586,8 +20329,8 @@ msgid "" "The currently selected nozzle type of %s extruder does not match the actual printer nozzle type.\n" "Please click the Sync button above and restart the calibration." msgstr "" -"Выбранный тип сопла экструдера %s не соответствует фактическому типу сопла принтера.\n" -"Нажмите кнопку «Синхронизация» выше и перезапустите калибровку." +"Выбранный тип сопла экструдера (%s) не соответствует фактическому типу сопла принтера.\n" +"Нажмите кнопку синхронизации выше и перезапустите калибровку." msgid "Unable to calibrate: maybe because the set calibration value range is too large, or the step is too small" msgstr "Невозможно выполнить калибровку: возможно, установленный диапазон значений калибровки слишком велик или шаг слишком мал" @@ -21249,11 +20992,9 @@ msgstr "Ошибка печати" msgid "Removed" msgstr "Удалено" -# AI Translated msgid "Enable smart filament assign: Assign one filament to multiple nozzles to maximize savings" -msgstr "Включить умное назначение материалов: назначайте один материал нескольким соплам для максимальной экономии" +msgstr "Включить умное назначение материалов: назначить один материал нескольким соплам для максимальной экономии" -# AI Translated msgid "Fila Saving" msgstr "Экономия материала" @@ -21292,10 +21033,10 @@ msgstr "Видеоурок" msgid "(Sync with printer)" msgstr " (состояние принтера)" -# AI Translated +# Отвратительная подстановка левое/правое и тип расхода сопла #, c-format, boost-format msgid "Error: %s extruder has no available %s nozzle, current group result is invalid." -msgstr "Ошибка: у экструдера %s нет доступного сопла %s, текущий результат группировки недействителен." +msgstr "Ошибка: %s сопло не поддерживает требуемый расход (%s), результат текущей группировки недействителен." msgid "We will slice according to this grouping method:" msgstr "Осуществлять нарезку в соответствии с этой группировкой:" @@ -21303,15 +21044,12 @@ msgstr "Осуществлять нарезку в соответствии с msgid "Tip: You can drag the filaments to reassign them to different nozzles." msgstr "Совет: для назначения материала перетащите его в нужное поле." -# AI Translated msgid "Please adjust your grouping or click " -msgstr "Отрегулируйте группировку или нажмите " +msgstr "Измените группировку или нажмите " -# AI Translated msgid " to set nozzle count" msgstr " для задания количества сопел" -# AI Translated msgid "Set the physical nozzle count..." msgstr "Задать физическое количество сопел..." @@ -21548,7 +21286,7 @@ msgid "Skipping objects." msgstr "Исключение объектов." msgid "Select Filament" -msgstr "Выбрать филамент" +msgstr "Выбрать материал" msgid "Null Color" msgstr "Цвет не задан" @@ -21581,7 +21319,7 @@ msgstr "Ошибка: %s" msgid "Show details" msgstr "Подробнее" -# AI Translated +# В информации о сетевом плагине msgid "Hide details" msgstr "Скрыть подробности" @@ -21610,9 +21348,8 @@ msgstr "Установить обновление" msgid "(Latest)" msgstr "(новейшая)" -# AI Translated msgid "(installed)" -msgstr "(установлено)" +msgstr "(установлена)" msgid "The Bambu Network Plug-in has been installed successfully." msgstr "Сетевой плагин Bambu успешно установлен." @@ -21664,7 +21401,6 @@ msgstr "Сохранить как настройки по умолчанию" msgid "If enabled, the values above are stored as the defaults used for future STEP imports (and shown in Preferences)." msgstr "Активируйте для сохранения настроек импорта после его завершения." -# AI Translated msgid "PresetBundle" msgstr "PresetBundle" @@ -21691,7 +21427,6 @@ msgstr "Удаление пакета" msgid "Unsubscribe bundle?" msgstr "Отписаться от пакета?" -# AI Translated msgid "UnsubscribeBundle" msgstr "UnsubscribeBundle" @@ -21702,11 +21437,9 @@ msgstr "Не удалось отписаться от пакета." msgid "Unsubscribe Bundle" msgstr "Ошибка" -# AI Translated msgid "ExportPresetBundle" msgstr "ExportPresetBundle" -# AI Translated msgid "Save preset bundle" msgstr "Сохранить пакет профилей" @@ -21760,190 +21493,146 @@ msgstr "Просмотр архива" msgid "Open File" msgstr "Открыть файл" -# AI Translated msgid "AMS Dryness Control" msgstr "Управление сушкой AMS" -# AI Translated msgid "Filament Drying Settings" msgstr "Настройки сушки материала" -# AI Translated msgid "Stopping" msgstr "Остановка" -# AI Translated msgid "Unable to dry temporarily due to ..." msgstr "Временно невозможно выполнить сушку из-за ..." -# AI Translated msgid "Drying Error" msgstr "Ошибка сушки" -# AI Translated msgid "Please check the Assistant for troubleshooting" msgstr "Обратитесь к Помощнику для устранения неполадок" -# AI Translated msgid "Please remove and store the filament (as shown)." msgstr "Извлеките и уберите материал на хранение (как показано)." -# AI Translated msgid "The AMS can rotate the filament which is properly stored, providing better drying results." -msgstr "AMS может вращать правильно уложенный на хранение материал, обеспечивая лучший результат сушки." +msgstr "AMS может вращать правильно уложенный на хранение материал, тем самым улучшая эффективность сушки." -# AI Translated msgid "Rotate spool when drying" msgstr "Вращать катушку при сушке" -# AI Translated msgctxt "amsdrying" msgid "Back" msgstr "Назад" -# AI Translated msgid "Drying-Heating" msgstr "Сушка — нагрев" -# AI Translated msgid "Drying-Dehumidifying" -msgstr "Сушка — осушение" +msgstr "Сушка — вывод влаги" -# AI Translated msgid " maximum drying temperature is " msgstr " максимальная температура сушки — " -# AI Translated msgid " minimum drying temperature is " msgstr " минимальная температура сушки — " -# AI Translated msgid "This filament may not be completely dried." -msgstr "Этот материал может быть высушен не полностью." +msgstr "Сушка этого материала может не быть эффективной." -# AI Translated msgid "This AMS is currently printing. To ensure print quality, the drying temperature cannot exceed the recommended drying temperature." -msgstr "Этот AMS сейчас печатает. Для обеспечения качества печати температура сушки не может превышать рекомендованную температуру сушки." +msgstr "AMS сейчас печатает. Во избежание проблем с печатью температура сушки не должна превышать рекомендованную." -# AI Translated msgid "The temperature shall not exceed the filament's heat distortion temperature" -msgstr "Температура не должна превышать температуру тепловой деформации материала" +msgstr "Температура сушки не должна превышать температуру размягчения материала." -# AI Translated msgid "Minimum time value cannot be less than 1." -msgstr "Минимальное значение времени не может быть меньше 1." +msgstr "Минимальное время не может быть меньше 1." -# AI Translated msgid "Maximum time value cannot be greater than 24." -msgstr "Максимальное значение времени не может быть больше 24." +msgstr "Максимальное время не может быть больше 24." -# AI Translated msgid "Insufficient power" -msgstr "Недостаточно питания" +msgstr "Нехватка мощности" -# AI Translated msgid " Too many AMS drying simultaneously. Please plug in the power or stop other drying processes before starting." -msgstr " Слишком много AMS сушат одновременно. Подключите питание или остановите другие процессы сушки перед началом." +msgstr " Слишком много AMS выполняют сушку. Подключите питание или остановите другие сеансы сушки перед началом." -# AI Translated msgid "AMS is busy" -msgstr "AMS занят" +msgstr "AMS занята" -# AI Translated msgid " AMS is calibrating | reading RFID | loading/unloading material, please wait." -msgstr " AMS калибруется | считывает RFID | загружает/выгружает материал, подождите." +msgstr " AMS калибруется | считывает RFID | меняет материал, подождите." -# AI Translated +# на Вики бамбу есть упоминание: https://wiki.bambulab.com/ru/h2/troubleshooting/hmscode/0700_2000_0002_0025#:~:text=выходного%20отверстия%20AMS msgid "Filament in AMS outlet" msgstr "Материал в выходном отверстии AMS" -# AI Translated msgid " The high drying temperature may cause AMS blockage, please unload first." -msgstr " Высокая температура сушки может вызвать засорение AMS, сначала выгрузите материал." +msgstr " Из-за высокой температуры сушки пруток может застрять в AMS, сначала выгрузите материал." -# AI Translated msgid "Initiating AMS drying" msgstr "Запуск сушки AMS" -# AI Translated msgid "Not supported in 2D mode" -msgstr "Не поддерживается в режиме 2D" +msgstr "Не поддерживается в 2D-режиме" -# AI Translated msgid "Task in progress" msgstr "Выполняется задача" -# AI Translated +# CannotDryReason: DryingInProgress msgid " The AMS might be in use during Task." -msgstr " AMS может использоваться во время задачи." +msgstr " AMS может иметь задачи в процессе." -# AI Translated msgid " Firmware update in progress, please wait..." msgstr " Выполняется обновление прошивки, подождите..." -# AI Translated msgid " Please plug in the power and then use the drying function." msgstr " Подключите питание, а затем используйте функцию сушки." -# AI Translated msgid " The high drying temperature may cause AMS blockage. Please unload the filament manually before proceeding." -msgstr " Высокая температура сушки может вызвать засорение AMS. Перед продолжением выгрузите материал вручную." +msgstr " Из-за высокой температуры сушки пруток может застрять в AMS. Перед продолжением выгрузите материал вручную." -# AI Translated msgid "System is busy" msgstr "Система занята" -# AI Translated msgid " Initiating other drying processes, please wait a few seconds..." msgstr " Запускаются другие процессы сушки, подождите несколько секунд..." -# AI Translated msgid "For better drying results, remove the filament and allow it to rotate." -msgstr "Для лучшего результата сушки извлеките материал и дайте ему вращаться." +msgstr "Для лучшего результата сушки извлеките материал и включите вращение катушки." -# AI Translated msgid "The AMS will automatically rotate the stored filament slots to enhance the drying performance." -msgstr "AMS будет автоматически вращать слоты с уложенным на хранение материалом для повышения эффективности сушки." +msgstr "AMS будет автоматически вращать слоты с хранящимися катушками для повышения эффективности сушки." -# AI Translated msgid "Alternatively, you can dry the filament without removing it." -msgstr "Кроме того, вы можете сушить материал, не извлекая его." +msgstr "Кроме того, сушить материал можно без его извлечения." -# AI Translated msgid "Unknown filaments will be treated as PLA." msgstr "Неизвестные материалы будут рассматриваться как PLA." -# AI Translated msgid "Please store the filament marked with an exclamation mark." msgstr "Уберите на хранение материал, отмеченный восклицательным знаком." -# AI Translated msgid "Filament left in the feeder during drying may soften because the drying temperature exceeds the softening point of materials like PLA and TPU." -msgstr "Материал, оставленный в подающем механизме во время сушки, может размягчиться, поскольку температура сушки превышает точку размягчения таких материалов, как PLA и TPU." +msgstr "Заправленный материал может размягчиться во время сушки, поскольку её сушки превышает точку размягчения материалов вроде PLA и TPU." -# AI Translated msgid "Starting: Checking adapter connection" msgstr "Запуск: проверка подключения адаптера" -# AI Translated msgid "Starting: Checking filament status" msgstr "Запуск: проверка состояния материала" -# AI Translated msgid "Starting: Checking drying presets" msgstr "Запуск: проверка профилей сушки" -# AI Translated msgid "Starting: Checking filament location" msgstr "Запуск: проверка расположения материала" -# AI Translated msgid "Starting: Checking air intake" msgstr "Запуск: проверка забора воздуха" -# AI Translated msgid "Starting: Checking air vent" -msgstr "Запуск: проверка вентиляционного отверстия" +msgstr "Запуск: проверка вентиляции" msgid "The filament may not be compatible with the current machine settings. Generic filament presets will be used." msgstr "Материал может быть несовместим с текущими настройками принтера. Будет использоваться базовый профиль материала." @@ -21953,14 +21642,14 @@ msgstr "Материал может быть несовместим с теку # подобных). Она задаётся вручную в файле профиля (производителем) и # отсутствует у большинства системных профилей. msgid "The filament model is unknown. Still using the previous filament preset." -msgstr "Модель филамента неизвестна. Используется предыдущий профиль филамента." +msgstr "Модель материала неизвестна. Используется предыдущий профиль материала." # Не знаю, что за "модель" материала, пропускаю. Возможно, имеется ввиду # модель коррекции объёмного расхода для функции адаптивного расхода у TPU (и # подобных). Она задаётся вручную в файле профиля (производителем) и # отсутствует у большинства системных профилей. msgid "The filament model is unknown. Generic filament presets will be used." -msgstr "Модель филамента неизвестна. Будут использованы стандартные профили филамента." +msgstr "Модель материала неизвестна. Будут использованы стандартные профили материала." msgid "The filament may not be compatible with the current machine settings. A random filament preset will be used." msgstr "Материал может быть несовместим с текущими настройками принтера. Будет использоваться случайный профиль материала." @@ -21970,7 +21659,7 @@ msgstr "Материал может быть несовместим с теку # подобных). Она задаётся вручную в файле профиля (производителем) и # отсутствует у большинства системных профилей. msgid "The filament model is unknown. A random filament preset will be used." -msgstr "Модель филамента неизвестна. Будет использован случайный профиль филамента." +msgstr "Модель материала неизвестна. Будет использован случайный профиль материала." #: resources/data/hints.ini: [hint:Precise wall] msgid "" @@ -22372,9 +22061,6 @@ msgstr "" #~ "\n" #~ "Внимание: несовместимо с принтерами Prusa, поскольку им требуется остановка для изменения коэффициента PA." -#~ msgid "Continue to sync filaments" -#~ msgstr "Продолжить синхронизацию филаментов" - #~ msgctxt "Sync_Nozzle_AMS" #~ msgid "Cancel" #~ msgstr "Отмена" From b216813bf0221a50a82b1fc112e82855d924abcf Mon Sep 17 00:00:00 2001 From: TheLegendTubaGuy <95944177+thelegendtubaguy@users.noreply.github.com> Date: Fri, 7 Aug 2026 11:07:27 -0500 Subject: [PATCH 085/106] Add the Qidi Plus 5 (#15163) * Add the Qidi Plus 5 * Remove ignored profiles Qidi didn't register these, so they are essentially dead weight. * Set Qidi profile version to 02.04.00.10 --- resources/profiles/Qidi.json | 1078 ++++++++++++++++- .../profiles/Qidi/Qidi X-Plus 5_cover.png | Bin 0 -> 33441 bytes .../Bambu ABS @Qidi X-Plus 5 0.2 nozzle.json | 20 + .../Bambu ABS @Qidi X-Plus 5 0.4 nozzle.json | 14 + .../Bambu ABS @Qidi X-Plus 5 0.6 nozzle.json | 17 + .../Bambu ABS @Qidi X-Plus 5 0.8 nozzle.json | 20 + .../Qidi/filament/X5/Bambu ABS @X-Plus 5.json | 105 ++ .../Bambu PETG @Qidi X-Plus 5 0.2 nozzle.json | 17 + .../Bambu PETG @Qidi X-Plus 5 0.4 nozzle.json | 14 + .../Bambu PETG @Qidi X-Plus 5 0.6 nozzle.json | 14 + .../Bambu PETG @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../filament/X5/Bambu PETG @X-Plus 5.json | 102 ++ .../Bambu PLA @Qidi X-Plus 5 0.2 nozzle.json | 17 + .../Bambu PLA @Qidi X-Plus 5 0.4 nozzle.json | 14 + .../Bambu PLA @Qidi X-Plus 5 0.6 nozzle.json | 14 + .../Bambu PLA @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../Qidi/filament/X5/Bambu PLA @X-Plus 5.json | 54 + ...Generic ABS @Qidi X-Plus 5 0.2 nozzle.json | 17 + ...Generic ABS @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...Generic ABS @Qidi X-Plus 5 0.6 nozzle.json | 17 + ...Generic ABS @Qidi X-Plus 5 0.8 nozzle.json | 17 + .../filament/X5/Generic ABS @X-Plus 5.json | 108 ++ .../Generic PC @Qidi X-Plus 5 0.2 nozzle.json | 23 + .../Generic PC @Qidi X-Plus 5 0.4 nozzle.json | 20 + .../Generic PC @Qidi X-Plus 5 0.6 nozzle.json | 20 + .../Generic PC @Qidi X-Plus 5 0.8 nozzle.json | 20 + .../filament/X5/Generic PC @X-Plus 5.json | 108 ++ ...eneric PETG @Qidi X-Plus 5 0.2 nozzle.json | 17 + ...eneric PETG @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...eneric PETG @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...eneric PETG @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../filament/X5/Generic PETG @X-Plus 5.json | 105 ++ ...Generic PLA @Qidi X-Plus 5 0.2 nozzle.json | 17 + ...Generic PLA @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...Generic PLA @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...Generic PLA @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../filament/X5/Generic PLA @X-Plus 5.json | 66 + ...ic PLA Silk @Qidi X-Plus 5 0.4 nozzle.json | 11 + ...ic PLA Silk @Qidi X-Plus 5 0.6 nozzle.json | 14 + .../X5/Generic PLA Silk @X-Plus 5.json | 90 ++ ...eneric PLA+ @Qidi X-Plus 5 0.2 nozzle.json | 17 + ...eneric PLA+ @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...eneric PLA+ @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...eneric PLA+ @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../filament/X5/Generic PLA+ @X-Plus 5.json | 60 + ...ric TPU 95A @Qidi X-Plus 5 0.4 nozzle.json | 11 + ...ric TPU 95A @Qidi X-Plus 5 0.6 nozzle.json | 11 + ...ric TPU 95A @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../X5/Generic TPU 95A @X-Plus 5.json | 81 ++ ...ATCHBOX ABS @Qidi X-Plus 5 0.2 nozzle.json | 20 + ...ATCHBOX ABS @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...ATCHBOX ABS @Qidi X-Plus 5 0.6 nozzle.json | 17 + ...ATCHBOX ABS @Qidi X-Plus 5 0.8 nozzle.json | 20 + .../filament/X5/HATCHBOX ABS @X-Plus 5.json | 105 ++ ...TCHBOX PETG @Qidi X-Plus 5 0.2 nozzle.json | 17 + ...TCHBOX PETG @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...TCHBOX PETG @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...TCHBOX PETG @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../filament/X5/HATCHBOX PETG @X-Plus 5.json | 102 ++ ...ATCHBOX PLA @Qidi X-Plus 5 0.2 nozzle.json | 17 + ...ATCHBOX PLA @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...ATCHBOX PLA @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...ATCHBOX PLA @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../filament/X5/HATCHBOX PLA @X-Plus 5.json | 54 + ...verture ABS @Qidi X-Plus 5 0.2 nozzle.json | 20 + ...verture ABS @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...verture ABS @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...verture ABS @Qidi X-Plus 5 0.8 nozzle.json | 17 + .../filament/X5/Overture ABS @X-Plus 5.json | 108 ++ ...verture PLA @Qidi X-Plus 5 0.2 nozzle.json | 17 + ...verture PLA @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...verture PLA @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...verture PLA @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../filament/X5/Overture PLA @X-Plus 5.json | 66 + ...olyLite ABS @Qidi X-Plus 5 0.2 nozzle.json | 20 + ...olyLite ABS @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...olyLite ABS @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...olyLite ABS @Qidi X-Plus 5 0.8 nozzle.json | 17 + .../filament/X5/PolyLite ABS @X-Plus 5.json | 108 ++ ...olyLite PLA @Qidi X-Plus 5 0.2 nozzle.json | 17 + ...olyLite PLA @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...olyLite PLA @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...olyLite PLA @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../filament/X5/PolyLite PLA @X-Plus 5.json | 66 + ...aker PLA-HT @Qidi X-Plus 5 0.2 nozzle.json | 17 + ...aker PLA-HT @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...aker PLA-HT @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...aker PLA-HT @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../X5/Polymaker PLA-HT @X-Plus 5.json | 66 + ...BS Odorless @Qidi X-Plus 5 0.2 nozzle.json | 20 + ...BS Odorless @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...BS Odorless @Qidi X-Plus 5 0.6 nozzle.json | 20 + ...BS Odorless @Qidi X-Plus 5 0.8 nozzle.json | 23 + .../X5/QIDI ABS Odorless @X-Plus 5.json | 108 ++ ... ABS Rapido @Qidi X-Plus 5 0.2 nozzle.json | 20 + ... ABS Rapido @Qidi X-Plus 5 0.4 nozzle.json | 14 + ... ABS Rapido @Qidi X-Plus 5 0.6 nozzle.json | 17 + ... ABS Rapido @Qidi X-Plus 5 0.8 nozzle.json | 20 + .../X5/QIDI ABS Rapido @X-Plus 5.json | 105 ++ ...apido Metal @Qidi X-Plus 5 0.2 nozzle.json | 20 + ...apido Metal @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...apido Metal @Qidi X-Plus 5 0.6 nozzle.json | 17 + ...apido Metal @Qidi X-Plus 5 0.8 nozzle.json | 20 + .../X5/QIDI ABS Rapido Metal @X-Plus 5.json | 105 ++ ...QIDI ABS-GF @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...QIDI ABS-GF @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...QIDI ABS-GF @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../filament/X5/QIDI ABS-GF @X-Plus 5.json | 114 ++ .../QIDI ASA @Qidi X-Plus 5 0.2 nozzle.json | 20 + .../QIDI ASA @Qidi X-Plus 5 0.4 nozzle.json | 14 + .../QIDI ASA @Qidi X-Plus 5 0.6 nozzle.json | 17 + .../QIDI ASA @Qidi X-Plus 5 0.8 nozzle.json | 20 + .../Qidi/filament/X5/QIDI ASA @X-Plus 5.json | 111 ++ ...DI ASA-Aero @Qidi X-Plus 5 0.4 nozzle.json | 11 + .../filament/X5/QIDI ASA-Aero @X-Plus 5.json | 126 ++ ...QIDI ASA-CF @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...QIDI ASA-CF @Qidi X-Plus 5 0.6 nozzle.json | 17 + ...QIDI ASA-CF @Qidi X-Plus 5 0.8 nozzle.json | 20 + .../filament/X5/QIDI ASA-CF @X-Plus 5.json | 111 ++ ...IDI PA12-CF @Qidi X-Plus 5 0.4 nozzle.json | 11 + ...IDI PA12-CF @Qidi X-Plus 5 0.6 nozzle.json | 11 + ...IDI PA12-CF @Qidi X-Plus 5 0.8 nozzle.json | 11 + .../filament/X5/QIDI PA12-CF @X-Plus 5.json | 111 ++ ...QIDI PA6-CF @Qidi X-Plus 5 0.4 nozzle.json | 11 + ...QIDI PA6-CF @Qidi X-Plus 5 0.6 nozzle.json | 11 + ...QIDI PA6-CF @Qidi X-Plus 5 0.8 nozzle.json | 11 + .../filament/X5/QIDI PA6-CF @X-Plus 5.json | 111 ++ ...IDI PAHT-CF @Qidi X-Plus 5 0.4 nozzle.json | 11 + ...IDI PAHT-CF @Qidi X-Plus 5 0.6 nozzle.json | 11 + ...IDI PAHT-CF @Qidi X-Plus 5 0.8 nozzle.json | 11 + .../filament/X5/QIDI PAHT-CF @X-Plus 5.json | 111 ++ ...IDI PAHT-GF @Qidi X-Plus 5 0.4 nozzle.json | 11 + ...IDI PAHT-GF @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...IDI PAHT-GF @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../filament/X5/QIDI PAHT-GF @X-Plus 5.json | 111 ++ ...I PC-ABS-FR @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...I PC-ABS-FR @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...I PC-ABS-FR @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../filament/X5/QIDI PC-ABS-FR @X-Plus 5.json | 111 ++ ...DI PEBA 95A @Qidi X-Plus 5 0.4 nozzle.json | 11 + ...DI PEBA 95A @Qidi X-Plus 5 0.6 nozzle.json | 11 + .../filament/X5/QIDI PEBA 95A @X-Plus 5.json | 96 ++ ...QIDI PET-CF @Qidi X-Plus 5 0.4 nozzle.json | 11 + ...QIDI PET-CF @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...QIDI PET-CF @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../filament/X5/QIDI PET-CF @X-Plus 5.json | 111 ++ ...QIDI PET-GF @Qidi X-Plus 5 0.4 nozzle.json | 11 + ...QIDI PET-GF @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...QIDI PET-GF @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../filament/X5/QIDI PET-GF @X-Plus 5.json | 111 ++ ... PETG Basic @Qidi X-Plus 5 0.2 nozzle.json | 17 + ... PETG Basic @Qidi X-Plus 5 0.4 nozzle.json | 11 + ... PETG Basic @Qidi X-Plus 5 0.6 nozzle.json | 14 + ... PETG Basic @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../X5/QIDI PETG Basic @X-Plus 5.json | 102 ++ ...PETG Rapido @Qidi X-Plus 5 0.2 nozzle.json | 17 + ...PETG Rapido @Qidi X-Plus 5 0.4 nozzle.json | 11 + ...PETG Rapido @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...PETG Rapido @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../X5/QIDI PETG Rapido @X-Plus 5.json | 102 ++ ... PETG Tough @Qidi X-Plus 5 0.2 nozzle.json | 17 + ... PETG Tough @Qidi X-Plus 5 0.4 nozzle.json | 11 + ... PETG Tough @Qidi X-Plus 5 0.6 nozzle.json | 14 + ... PETG Tough @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../X5/QIDI PETG Tough @X-Plus 5.json | 102 ++ ...Translucent @Qidi X-Plus 5 0.2 nozzle.json | 17 + ...Translucent @Qidi X-Plus 5 0.4 nozzle.json | 11 + ...Translucent @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...Translucent @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../X5/QIDI PETG Translucent @X-Plus 5.json | 102 ++ ...IDI PETG-CF @Qidi X-Plus 5 0.4 nozzle.json | 11 + ...IDI PETG-CF @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...IDI PETG-CF @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../filament/X5/QIDI PETG-CF @X-Plus 5.json | 102 ++ ...IDI PETG-GF @Qidi X-Plus 5 0.4 nozzle.json | 11 + ...IDI PETG-GF @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...IDI PETG-GF @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../filament/X5/QIDI PETG-GF @X-Plus 5.json | 102 ++ ...I PLA Basic @Qidi X-Plus 5 0.2 nozzle.json | 17 + ...I PLA Basic @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...I PLA Basic @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...I PLA Basic @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../filament/X5/QIDI PLA Basic @X-Plus 5.json | 63 + ...Matte Basic @Qidi X-Plus 5 0.2 nozzle.json | 17 + ...Matte Basic @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...Matte Basic @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...Matte Basic @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../X5/QIDI PLA Matte Basic @X-Plus 5.json | 63 + ... PLA Rapido @Qidi X-Plus 5 0.2 nozzle.json | 17 + ... PLA Rapido @Qidi X-Plus 5 0.4 nozzle.json | 14 + ... PLA Rapido @Qidi X-Plus 5 0.6 nozzle.json | 14 + ... PLA Rapido @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../X5/QIDI PLA Rapido @X-Plus 5.json | 60 + ...apido Matte @Qidi X-Plus 5 0.2 nozzle.json | 17 + ...apido Matte @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...apido Matte @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...apido Matte @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../X5/QIDI PLA Rapido Matte @X-Plus 5.json | 57 + ...apido Metal @Qidi X-Plus 5 0.2 nozzle.json | 17 + ...apido Metal @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...apido Metal @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...apido Metal @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../X5/QIDI PLA Rapido Metal @X-Plus 5.json | 57 + ...DI PLA Silk @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...DI PLA Silk @Qidi X-Plus 5 0.6 nozzle.json | 14 + .../filament/X5/QIDI PLA Silk @X-Plus 5.json | 84 ++ ...QIDI PLA-CF @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...QIDI PLA-CF @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...QIDI PLA-CF @Qidi X-Plus 5 0.8 nozzle.json | 17 + .../filament/X5/QIDI PLA-CF @X-Plus 5.json | 75 ++ ...QIDI PPS-CF @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...QIDI PPS-CF @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...QIDI PPS-CF @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../filament/X5/QIDI PPS-CF @X-Plus 5.json | 117 ++ ...QIDI PPS-GF @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...QIDI PPS-GF @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...QIDI PPS-GF @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../filament/X5/QIDI PPS-GF @X-Plus 5.json | 117 ++ ...rt For PAHT @Qidi X-Plus 5 0.4 nozzle.json | 11 + ...rt For PAHT @Qidi X-Plus 5 0.6 nozzle.json | 11 + ...rt For PAHT @Qidi X-Plus 5 0.8 nozzle.json | 11 + .../X5/QIDI Support For PAHT @X-Plus 5.json | 114 ++ ... For PET-PA @Qidi X-Plus 5 0.4 nozzle.json | 11 + ... For PET-PA @Qidi X-Plus 5 0.6 nozzle.json | 11 + ... For PET-PA @Qidi X-Plus 5 0.8 nozzle.json | 11 + .../X5/QIDI Support For PET-PA @X-Plus 5.json | 114 ++ ... TPU 95A-HF @Qidi X-Plus 5 0.4 nozzle.json | 11 + ... TPU 95A-HF @Qidi X-Plus 5 0.6 nozzle.json | 11 + ... TPU 95A-HF @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../X5/QIDI TPU 95A-HF @X-Plus 5.json | 84 ++ ...DI TPU-Aero @Qidi X-Plus 5 0.4 nozzle.json | 11 + ...DI TPU-Aero @Qidi X-Plus 5 0.6 nozzle.json | 11 + .../filament/X5/QIDI TPU-Aero @X-Plus 5.json | 93 ++ ...QIDI TPU-GF @Qidi X-Plus 5 0.4 nozzle.json | 11 + ...QIDI TPU-GF @Qidi X-Plus 5 0.6 nozzle.json | 11 + ...QIDI TPU-GF @Qidi X-Plus 5 0.8 nozzle.json | 11 + .../filament/X5/QIDI TPU-GF @X-Plus 5.json | 84 ++ ...IDI UltraPA @Qidi X-Plus 5 0.4 nozzle.json | 11 + ...IDI UltraPA @Qidi X-Plus 5 0.6 nozzle.json | 11 + ...IDI UltraPA @Qidi X-Plus 5 0.8 nozzle.json | 11 + .../filament/X5/QIDI UltraPA @X-Plus 5.json | 99 ++ ...ltraPA-CF25 @Qidi X-Plus 5 0.4 nozzle.json | 11 + ...ltraPA-CF25 @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...ltraPA-CF25 @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../X5/QIDI UltraPA-CF25 @X-Plus 5.json | 114 ++ ...WOOD Rapido @Qidi X-Plus 5 0.4 nozzle.json | 14 + ...WOOD Rapido @Qidi X-Plus 5 0.6 nozzle.json | 14 + ...WOOD Rapido @Qidi X-Plus 5 0.8 nozzle.json | 14 + .../X5/QIDI WOOD Rapido @X-Plus 5.json | 66 + .../filament/X5/fdm_filament_x5_common.json | 255 ++++ .../machine/Qidi X-Plus 5 0.2 nozzle.json | 28 + .../machine/Qidi X-Plus 5 0.4 nozzle.json | 88 ++ .../machine/Qidi X-Plus 5 0.6 nozzle.json | 31 + .../machine/Qidi X-Plus 5 0.8 nozzle.json | 31 + .../profiles/Qidi/machine/Qidi X-Plus 5.json | 12 + ...8mm High Quality @X-Plus 5 0.2 nozzle.json | 70 ++ .../0.08mm High Quality @X-Plus 5.json | 73 ++ .../0.10mm Standard @X-Plus 5 0.2 nozzle.json | 63 + ...Balanced Quality @X-Plus 5 0.2 nozzle.json | 66 + .../0.12mm High Quality @X-Plus 5.json | 73 ++ .../0.16mm High Quality @X-Plus 5.json | 65 + .../process/0.16mm Standard @X-Plus 5.json | 62 + ...Balanced Quality @X-Plus 5 0.6 nozzle.json | 73 ++ .../0.20mm High Quality @X-Plus 5.json | 63 + .../process/0.20mm Standard @X-Plus 5.json | 47 + ...Balanced Quality @X-Plus 5 0.6 nozzle.json | 71 ++ ...Balanced Quality @X-Plus 5 0.8 nozzle.json | 63 + .../process/0.24mm Standard @X-Plus 5.json | 50 + .../0.30mm Standard @X-Plus 5 0.6 nozzle.json | 65 + ...Balanced Quality @X-Plus 5 0.8 nozzle.json | 72 ++ .../0.40mm Standard @X-Plus 5 0.8 nozzle.json | 60 + .../Qidi/qidi_xplus5_buildplate_model.stl | Bin 0 -> 28284 bytes .../Qidi/qidi_xplus5_buildplate_texture.svg | 1 + 273 files changed, 10609 insertions(+), 1 deletion(-) create mode 100644 resources/profiles/Qidi/Qidi X-Plus 5_cover.png create mode 100644 resources/profiles/Qidi/filament/X5/Bambu ABS @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Bambu ABS @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Bambu ABS @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Bambu ABS @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Bambu ABS @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/Bambu PETG @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Bambu PETG @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Bambu PETG @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Bambu PETG @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Bambu PETG @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/Bambu PLA @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Bambu PLA @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Bambu PLA @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Bambu PLA @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Bambu PLA @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic ABS @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic ABS @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic ABS @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic ABS @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic ABS @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PC @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PC @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PC @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PC @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PC @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PETG @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PETG @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PETG @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PETG @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PETG @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PLA @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PLA @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PLA @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PLA @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PLA @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PLA Silk @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PLA Silk @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PLA Silk @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PLA+ @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PLA+ @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PLA+ @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PLA+ @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic PLA+ @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic TPU 95A @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic TPU 95A @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic TPU 95A @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Generic TPU 95A @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/HATCHBOX ABS @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/HATCHBOX PETG @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/HATCHBOX PLA @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/Overture ABS @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Overture ABS @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Overture ABS @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Overture ABS @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Overture ABS @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/Overture PLA @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Overture PLA @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Overture PLA @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Overture PLA @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Overture PLA @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/PolyLite ABS @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/PolyLite ABS @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/PolyLite ABS @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/PolyLite ABS @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/PolyLite ABS @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/PolyLite PLA @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/PolyLite PLA @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/PolyLite PLA @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/PolyLite PLA @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/PolyLite PLA @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS-GF @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS-GF @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS-GF @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ABS-GF @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ASA @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ASA @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ASA @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ASA @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ASA @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ASA-Aero @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ASA-Aero @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ASA-CF @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ASA-CF @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ASA-CF @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI ASA-CF @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PA12-CF @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PA12-CF @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PA12-CF @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PA12-CF @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PA6-CF @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PA6-CF @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PA6-CF @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PA6-CF @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PAHT-CF @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PAHT-CF @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PAHT-CF @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PAHT-CF @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PAHT-GF @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PAHT-GF @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PAHT-GF @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PAHT-GF @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PC-ABS-FR @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PC-ABS-FR @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PC-ABS-FR @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PC-ABS-FR @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PEBA 95A @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PEBA 95A @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PEBA 95A @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PET-CF @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PET-CF @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PET-CF @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PET-CF @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PET-GF @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PET-GF @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PET-GF @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PET-GF @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Basic @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Tough @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG-CF @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG-CF @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG-CF @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG-CF @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG-GF @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG-GF @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG-GF @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PETG-GF @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Basic @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Silk @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Silk @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA Silk @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA-CF @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA-CF @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA-CF @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PLA-CF @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PPS-CF @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PPS-CF @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PPS-CF @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PPS-CF @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PPS-GF @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PPS-GF @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PPS-GF @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI PPS-GF @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI Support For PAHT @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI Support For PAHT @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI Support For PAHT @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI Support For PAHT @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI Support For PET-PA @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI Support For PET-PA @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI Support For PET-PA @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI Support For PET-PA @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI TPU 95A-HF @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI TPU 95A-HF @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI TPU 95A-HF @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI TPU 95A-HF @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI TPU-Aero @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI TPU-Aero @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI TPU-Aero @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI TPU-GF @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI TPU-GF @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI TPU-GF @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI TPU-GF @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI UltraPA @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI UltraPA @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI UltraPA @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI UltraPA @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI UltraPA-CF25 @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI UltraPA-CF25 @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI UltraPA-CF25 @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI UltraPA-CF25 @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI WOOD Rapido @Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI WOOD Rapido @Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI WOOD Rapido @Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/filament/X5/QIDI WOOD Rapido @X-Plus 5.json create mode 100644 resources/profiles/Qidi/filament/X5/fdm_filament_x5_common.json create mode 100644 resources/profiles/Qidi/machine/Qidi X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/machine/Qidi X-Plus 5 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/machine/Qidi X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/machine/Qidi X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/machine/Qidi X-Plus 5.json create mode 100644 resources/profiles/Qidi/process/0.08mm High Quality @X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/process/0.08mm High Quality @X-Plus 5.json create mode 100644 resources/profiles/Qidi/process/0.10mm Standard @X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/process/0.12mm Balanced Quality @X-Plus 5 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/process/0.12mm High Quality @X-Plus 5.json create mode 100644 resources/profiles/Qidi/process/0.16mm High Quality @X-Plus 5.json create mode 100644 resources/profiles/Qidi/process/0.16mm Standard @X-Plus 5.json create mode 100644 resources/profiles/Qidi/process/0.18mm Balanced Quality @X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/process/0.20mm High Quality @X-Plus 5.json create mode 100644 resources/profiles/Qidi/process/0.20mm Standard @X-Plus 5.json create mode 100644 resources/profiles/Qidi/process/0.24mm Balanced Quality @X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/process/0.24mm Balanced Quality @X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/process/0.24mm Standard @X-Plus 5.json create mode 100644 resources/profiles/Qidi/process/0.30mm Standard @X-Plus 5 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/process/0.32mm Balanced Quality @X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/process/0.40mm Standard @X-Plus 5 0.8 nozzle.json create mode 100644 resources/profiles/Qidi/qidi_xplus5_buildplate_model.stl create mode 100644 resources/profiles/Qidi/qidi_xplus5_buildplate_texture.svg diff --git a/resources/profiles/Qidi.json b/resources/profiles/Qidi.json index 0cf0c6bb7d..08a2d6a230 100644 --- a/resources/profiles/Qidi.json +++ b/resources/profiles/Qidi.json @@ -1,6 +1,6 @@ { "name": "Qidi", - "version": "02.04.00.09", + "version": "02.04.00.10", "force_update": "0", "description": "Qidi configurations", "machine_model_list": [ @@ -47,6 +47,10 @@ { "name": "Qidi X-Smart 3", "sub_path": "machine/Qidi X-Smart 3.json" + }, + { + "name": "Qidi X-Plus 5", + "sub_path": "machine/Qidi X-Plus 5.json" } ], "process_list": [ @@ -885,6 +889,70 @@ { "name": "0.56mm Standard @Qidi XSmart3 0.8 nozzle", "sub_path": "process/0.56mm Standard @Qidi XSmart3 0.8 nozzle.json" + }, + { + "name": "0.08mm High Quality @X-Plus 5", + "sub_path": "process/0.08mm High Quality @X-Plus 5.json" + }, + { + "name": "0.12mm High Quality @X-Plus 5", + "sub_path": "process/0.12mm High Quality @X-Plus 5.json" + }, + { + "name": "0.16mm High Quality @X-Plus 5", + "sub_path": "process/0.16mm High Quality @X-Plus 5.json" + }, + { + "name": "0.16mm Standard @X-Plus 5", + "sub_path": "process/0.16mm Standard @X-Plus 5.json" + }, + { + "name": "0.20mm High Quality @X-Plus 5", + "sub_path": "process/0.20mm High Quality @X-Plus 5.json" + }, + { + "name": "0.20mm Standard @X-Plus 5", + "sub_path": "process/0.20mm Standard @X-Plus 5.json" + }, + { + "name": "0.24mm Standard @X-Plus 5", + "sub_path": "process/0.24mm Standard @X-Plus 5.json" + }, + { + "name": "0.08mm High Quality @X-Plus 5 0.2 nozzle", + "sub_path": "process/0.08mm High Quality @X-Plus 5 0.2 nozzle.json" + }, + { + "name": "0.10mm Standard @X-Plus 5 0.2 nozzle", + "sub_path": "process/0.10mm Standard @X-Plus 5 0.2 nozzle.json" + }, + { + "name": "0.12mm Balanced Quality @X-Plus 5 0.2 nozzle", + "sub_path": "process/0.12mm Balanced Quality @X-Plus 5 0.2 nozzle.json" + }, + { + "name": "0.18mm Balanced Quality @X-Plus 5 0.6 nozzle", + "sub_path": "process/0.18mm Balanced Quality @X-Plus 5 0.6 nozzle.json" + }, + { + "name": "0.24mm Balanced Quality @X-Plus 5 0.6 nozzle", + "sub_path": "process/0.24mm Balanced Quality @X-Plus 5 0.6 nozzle.json" + }, + { + "name": "0.30mm Standard @X-Plus 5 0.6 nozzle", + "sub_path": "process/0.30mm Standard @X-Plus 5 0.6 nozzle.json" + }, + { + "name": "0.24mm Balanced Quality @X-Plus 5 0.8 nozzle", + "sub_path": "process/0.24mm Balanced Quality @X-Plus 5 0.8 nozzle.json" + }, + { + "name": "0.32mm Balanced Quality @X-Plus 5 0.8 nozzle", + "sub_path": "process/0.32mm Balanced Quality @X-Plus 5 0.8 nozzle.json" + }, + { + "name": "0.40mm Standard @X-Plus 5 0.8 nozzle", + "sub_path": "process/0.40mm Standard @X-Plus 5 0.8 nozzle.json" } ], "filament_list": [ @@ -6035,6 +6103,998 @@ { "name": "Qidi Generic PLA High Speed @Qidi X-Plus 4 0.8 nozzle", "sub_path": "filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.8 nozzle.json" + }, + { + "name": "fdm_filament_x5_common", + "sub_path": "filament/X5/fdm_filament_x5_common.json" + }, + { + "name": "Generic ABS@X-Plus 5-Series", + "sub_path": "filament/X5/Generic ABS @X-Plus 5.json" + }, + { + "name": "QIDI ASA@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI ASA @X-Plus 5.json" + }, + { + "name": "Generic PETG@X-Plus 5-Series", + "sub_path": "filament/X5/Generic PETG @X-Plus 5.json" + }, + { + "name": "Generic PLA Silk@X-Plus 5-Series", + "sub_path": "filament/X5/Generic PLA Silk @X-Plus 5.json" + }, + { + "name": "Generic PLA@X-Plus 5-Series", + "sub_path": "filament/X5/Generic PLA @X-Plus 5.json" + }, + { + "name": "Generic PLA+@X-Plus 5-Series", + "sub_path": "filament/X5/Generic PLA+ @X-Plus 5.json" + }, + { + "name": "PolyLite PLA@X-Plus 5-Series", + "sub_path": "filament/X5/PolyLite PLA @X-Plus 5.json" + }, + { + "name": "Polymaker PLA-HT@X-Plus 5-Series", + "sub_path": "filament/X5/Polymaker PLA-HT @X-Plus 5.json" + }, + { + "name": "QIDI PLA-CF@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PLA-CF @X-Plus 5.json" + }, + { + "name": "QIDI PLA-CF @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PLA-CF @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PLA-CF @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PLA-CF @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PLA-CF @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PLA-CF @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI ABS Rapido@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI ABS Rapido @X-Plus 5.json" + }, + { + "name": "QIDI ABS Rapido @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "QIDI ABS Rapido @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI ABS Rapido @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI ABS Rapido @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI ABS Rapido Metal@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI ABS Rapido Metal @X-Plus 5.json" + }, + { + "name": "QIDI ABS Rapido Metal @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "QIDI ABS Rapido Metal @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI ABS Rapido Metal @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI ABS Rapido Metal @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI ABS Odorless@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI ABS Odorless @X-Plus 5.json" + }, + { + "name": "QIDI ABS Odorless @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "QIDI ABS Odorless @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI ABS Odorless @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI ABS Odorless @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PLA Rapido@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PLA Rapido @X-Plus 5.json" + }, + { + "name": "QIDI PLA Rapido @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "QIDI PLA Rapido @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PLA Rapido @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PLA Rapido @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PLA Rapido Matte@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PLA Rapido Matte @X-Plus 5.json" + }, + { + "name": "QIDI PLA Rapido Matte @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "QIDI PLA Rapido Matte @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PLA Rapido Matte @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PLA Rapido Matte @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PLA Silk@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PLA Silk @X-Plus 5.json" + }, + { + "name": "QIDI PLA Silk @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PLA Silk @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PLA Silk @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PLA Silk @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PLA Rapido Metal@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PLA Rapido Metal @X-Plus 5.json" + }, + { + "name": "QIDI PLA Rapido Metal @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "QIDI PLA Rapido Metal @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PLA Rapido Metal @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PLA Rapido Metal @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PETG Tough@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PETG Tough @X-Plus 5.json" + }, + { + "name": "QIDI PETG Tough @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "QIDI PETG Tough @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PETG Tough @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PETG Tough @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PET-CF@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PET-CF @X-Plus 5.json" + }, + { + "name": "QIDI PET-CF @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PET-CF @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PET-CF @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PET-CF @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PET-CF @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PET-CF @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PA12-CF@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PA12-CF @X-Plus 5.json" + }, + { + "name": "QIDI PA12-CF @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PA12-CF @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PA12-CF @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PA12-CF @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PA12-CF @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PA12-CF @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PA6-CF@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PA6-CF @X-Plus 5.json" + }, + { + "name": "QIDI PA6-CF @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PA6-CF @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PA6-CF @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PA6-CF @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PA6-CF @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PA6-CF @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PAHT-CF@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PAHT-CF @X-Plus 5.json" + }, + { + "name": "QIDI PAHT-CF @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PAHT-CF @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PAHT-CF @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PAHT-CF @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PAHT-CF @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PAHT-CF @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PPS-CF@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PPS-CF @X-Plus 5.json" + }, + { + "name": "QIDI PPS-CF @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PPS-CF @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PPS-CF @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PPS-CF @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PPS-CF @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PPS-CF @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI ABS-GF@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI ABS-GF @X-Plus 5.json" + }, + { + "name": "QIDI ABS-GF @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI ABS-GF @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI ABS-GF @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI ABS-GF @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI ABS-GF @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI ABS-GF @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI UltraPA@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI UltraPA @X-Plus 5.json" + }, + { + "name": "QIDI UltraPA @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI UltraPA @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI UltraPA @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI UltraPA @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI UltraPA @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI UltraPA @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "Generic TPU 95A@X-Plus 5-Series", + "sub_path": "filament/X5/Generic TPU 95A @X-Plus 5.json" + }, + { + "name": "QIDI PC/ABS-FR@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PC-ABS-FR @X-Plus 5.json" + }, + { + "name": "QIDI PC/ABS-FR @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PC-ABS-FR @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PC/ABS-FR @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PC-ABS-FR @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PC/ABS-FR @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PC-ABS-FR @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI ASA-Aero@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI ASA-Aero @X-Plus 5.json" + }, + { + "name": "QIDI ASA-Aero @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI ASA-Aero @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "Generic ABS @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/Generic ABS @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "Generic ABS @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/Generic ABS @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "Generic ABS @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/Generic ABS @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "Generic ABS @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/Generic ABS @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI ASA @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/QIDI ASA @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "QIDI ASA @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI ASA @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI ASA @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI ASA @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI ASA @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI ASA @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "Generic PETG @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/Generic PETG @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "Generic PETG @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/Generic PETG @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "Generic PETG @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/Generic PETG @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "Generic PETG @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/Generic PETG @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "Generic PLA @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/Generic PLA @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "Generic PLA @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/Generic PLA @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "Generic PLA @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/Generic PLA @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "Generic PLA @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/Generic PLA @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "Generic PLA+ @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/Generic PLA+ @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "Generic PLA+ @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/Generic PLA+ @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "Generic PLA+ @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/Generic PLA+ @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "Generic PLA+ @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/Generic PLA+ @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "Generic PLA Silk @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/Generic PLA Silk @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "Generic PLA Silk @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/Generic PLA Silk @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "Generic TPU 95A @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/Generic TPU 95A @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "Generic TPU 95A @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/Generic TPU 95A @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "Generic TPU 95A @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/Generic TPU 95A @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI TPU 95A-HF@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI TPU 95A-HF @X-Plus 5.json" + }, + { + "name": "QIDI TPU 95A-HF @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI TPU 95A-HF @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI TPU 95A-HF @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI TPU 95A-HF @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI TPU 95A-HF @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI TPU 95A-HF @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "PolyLite PLA @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/PolyLite PLA @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "PolyLite PLA @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/PolyLite PLA @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "PolyLite PLA @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/PolyLite PLA @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "PolyLite PLA @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/PolyLite PLA @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "Polymaker PLA-HT @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "Polymaker PLA-HT @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "Polymaker PLA-HT @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "Polymaker PLA-HT @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "PolyLite ABS@X-Plus 5-Series", + "sub_path": "filament/X5/PolyLite ABS @X-Plus 5.json" + }, + { + "name": "PolyLite ABS @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/PolyLite ABS @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "PolyLite ABS @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/PolyLite ABS @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "PolyLite ABS @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/PolyLite ABS @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "PolyLite ABS @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/PolyLite ABS @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "Overture PLA@X-Plus 5-Series", + "sub_path": "filament/X5/Overture PLA @X-Plus 5.json" + }, + { + "name": "Overture PLA @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/Overture PLA @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "Overture PLA @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/Overture PLA @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "Overture PLA @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/Overture PLA @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "Overture PLA @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/Overture PLA @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "Overture ABS@X-Plus 5-Series", + "sub_path": "filament/X5/Overture ABS @X-Plus 5.json" + }, + { + "name": "Overture ABS @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/Overture ABS @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "Overture ABS @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/Overture ABS @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "Overture ABS @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/Overture ABS @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "Overture ABS @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/Overture ABS @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "Bambu PLA@X-Plus 5-Series", + "sub_path": "filament/X5/Bambu PLA @X-Plus 5.json" + }, + { + "name": "Bambu PLA @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/Bambu PLA @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "Bambu PLA @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/Bambu PLA @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "Bambu PLA @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/Bambu PLA @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "Bambu PLA @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/Bambu PLA @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "Bambu ABS@X-Plus 5-Series", + "sub_path": "filament/X5/Bambu ABS @X-Plus 5.json" + }, + { + "name": "Bambu ABS @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/Bambu ABS @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "Bambu ABS @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/Bambu ABS @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "Bambu ABS @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/Bambu ABS @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "Bambu ABS @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/Bambu ABS @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "Bambu PETG@X-Plus 5-Series", + "sub_path": "filament/X5/Bambu PETG @X-Plus 5.json" + }, + { + "name": "Bambu PETG @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/Bambu PETG @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "Bambu PETG @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/Bambu PETG @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "Bambu PETG @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/Bambu PETG @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "Bambu PETG @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/Bambu PETG @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "HATCHBOX PLA@X-Plus 5-Series", + "sub_path": "filament/X5/HATCHBOX PLA @X-Plus 5.json" + }, + { + "name": "HATCHBOX PLA @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "HATCHBOX PLA @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "HATCHBOX PLA @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "HATCHBOX PLA @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "HATCHBOX ABS@X-Plus 5-Series", + "sub_path": "filament/X5/HATCHBOX ABS @X-Plus 5.json" + }, + { + "name": "HATCHBOX ABS @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "HATCHBOX ABS @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "HATCHBOX ABS @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "HATCHBOX ABS @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "HATCHBOX PETG@X-Plus 5-Series", + "sub_path": "filament/X5/HATCHBOX PETG @X-Plus 5.json" + }, + { + "name": "HATCHBOX PETG @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "HATCHBOX PETG @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "HATCHBOX PETG @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "HATCHBOX PETG @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PAHT-GF@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PAHT-GF @X-Plus 5.json" + }, + { + "name": "QIDI PAHT-GF @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PAHT-GF @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PAHT-GF @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PAHT-GF @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PAHT-GF @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PAHT-GF @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PET-GF@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PET-GF @X-Plus 5.json" + }, + { + "name": "QIDI PET-GF @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PET-GF @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PET-GF @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PET-GF @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PET-GF @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PET-GF @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI UltraPA-CF25@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI UltraPA-CF25 @X-Plus 5.json" + }, + { + "name": "QIDI UltraPA-CF25 @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI UltraPA-CF25 @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI UltraPA-CF25 @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI UltraPA-CF25 @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI UltraPA-CF25 @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI UltraPA-CF25 @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI WOOD Rapido@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI WOOD Rapido @X-Plus 5.json" + }, + { + "name": "QIDI WOOD Rapido @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI WOOD Rapido @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI WOOD Rapido @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI WOOD Rapido @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI WOOD Rapido @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI WOOD Rapido @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "Generic PC@X-Plus 5-Series", + "sub_path": "filament/X5/Generic PC @X-Plus 5.json" + }, + { + "name": "Generic PC @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/Generic PC @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "Generic PC @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/Generic PC @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "Generic PC @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/Generic PC @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "Generic PC @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/Generic PC @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI TPU-Aero@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI TPU-Aero @X-Plus 5.json" + }, + { + "name": "QIDI TPU-Aero @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI TPU-Aero @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI TPU-Aero @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI TPU-Aero @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI Support For PET/PA@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI Support For PET-PA @X-Plus 5.json" + }, + { + "name": "QIDI Support For PET/PA @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI Support For PET-PA @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI Support For PET/PA @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI Support For PET-PA @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI Support For PET/PA @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI Support For PET-PA @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI Support For PAHT@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI Support For PAHT @X-Plus 5.json" + }, + { + "name": "QIDI Support For PAHT @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI Support For PAHT @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI Support For PAHT @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI Support For PAHT @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI Support For PAHT @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI Support For PAHT @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PLA Basic@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PLA Basic @X-Plus 5.json" + }, + { + "name": "QIDI PLA Basic @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "QIDI PLA Basic @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PLA Basic @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PLA Basic @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PLA Matte Basic@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PLA Matte Basic @X-Plus 5.json" + }, + { + "name": "QIDI PLA Matte Basic @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "QIDI PLA Matte Basic @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PLA Matte Basic @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PLA Matte Basic @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PETG Rapido@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PETG Rapido @X-Plus 5.json" + }, + { + "name": "QIDI PETG Rapido @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "QIDI PETG Rapido @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PETG Rapido @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PETG Rapido @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PETG Basic@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PETG Basic @X-Plus 5.json" + }, + { + "name": "QIDI PETG Basic @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "QIDI PETG Basic @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PETG Basic @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PETG Basic @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PETG Translucent@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PETG Translucent @X-Plus 5.json" + }, + { + "name": "QIDI PETG Translucent @Qidi X-Plus 5 0.2 nozzle", + "sub_path": "filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.2 nozzle.json" + }, + { + "name": "QIDI PETG Translucent @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PETG Translucent @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PETG Translucent @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PETG-CF@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PETG-CF @X-Plus 5.json" + }, + { + "name": "QIDI PETG-CF @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PETG-CF @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PETG-CF @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PETG-CF @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PETG-CF @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PETG-CF @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PETG-GF@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PETG-GF @X-Plus 5.json" + }, + { + "name": "QIDI PETG-GF @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PETG-GF @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PETG-GF @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PETG-GF @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PETG-GF @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PETG-GF @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PPS-GF@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PPS-GF @X-Plus 5.json" + }, + { + "name": "QIDI PPS-GF @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PPS-GF @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PPS-GF @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PPS-GF @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI PPS-GF @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI PPS-GF @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI PEBA 95A@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI PEBA 95A @X-Plus 5.json" + }, + { + "name": "QIDI PEBA 95A @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI PEBA 95A @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI PEBA 95A @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI PEBA 95A @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI ASA-CF@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI ASA-CF @X-Plus 5.json" + }, + { + "name": "QIDI ASA-CF @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI ASA-CF @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI ASA-CF @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI ASA-CF @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI ASA-CF @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI ASA-CF @Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "QIDI TPU-GF@X-Plus 5-Series", + "sub_path": "filament/X5/QIDI TPU-GF @X-Plus 5.json" + }, + { + "name": "QIDI TPU-GF @Qidi X-Plus 5 0.4 nozzle", + "sub_path": "filament/X5/QIDI TPU-GF @Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "QIDI TPU-GF @Qidi X-Plus 5 0.6 nozzle", + "sub_path": "filament/X5/QIDI TPU-GF @Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "QIDI TPU-GF @Qidi X-Plus 5 0.8 nozzle", + "sub_path": "filament/X5/QIDI TPU-GF @Qidi X-Plus 5 0.8 nozzle.json" } ], "machine_list": [ @@ -6197,6 +7257,22 @@ { "name": "Qidi Q2C 0.8 nozzle", "sub_path": "machine/Qidi Q2C 0.8 nozzle.json" + }, + { + "name": "Qidi X-Plus 5 0.4 nozzle", + "sub_path": "machine/Qidi X-Plus 5 0.4 nozzle.json" + }, + { + "name": "Qidi X-Plus 5 0.6 nozzle", + "sub_path": "machine/Qidi X-Plus 5 0.6 nozzle.json" + }, + { + "name": "Qidi X-Plus 5 0.8 nozzle", + "sub_path": "machine/Qidi X-Plus 5 0.8 nozzle.json" + }, + { + "name": "Qidi X-Plus 5 0.2 nozzle", + "sub_path": "machine/Qidi X-Plus 5 0.2 nozzle.json" } ] } diff --git a/resources/profiles/Qidi/Qidi X-Plus 5_cover.png b/resources/profiles/Qidi/Qidi X-Plus 5_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..06f5c5858df019a00fa26f45fa34f8bf8e618064 GIT binary patch literal 33441 zcmbqa)3Pwku3WZl+qP}nwr%5Ewr$(CZQHhW{{0N+BGZ+*OC?iDb!Q?JedY0O=s1=?nk>jr>0Y1jx+B`0oh@ z!WGZ$are#YqH;HF;|+`ffN{_OjD#Wri6CehY_l1+P&jb}Leoh@O#@n1^gWFj$3%i( zX0lNT>Nmf*o-z{!U7=C9lvcSB254Krp?(G+9koeb{_S~JRd>q!&5UdAF=zT~_o{+u z0WQHvH@~cMw@Z3=I*GjRDTg!yE;jgRpM&H71s-q2^LKGYKe=}wxhHLOdOi*);)c$R zlK%G-_V_(bj;0x<9mt=2w({=sGUQ7oF*7yK$4PPQS?uaWpk8H@Zkrh{S4k7M3+dQP&9Yv{2ja2zH#YRL zZe`oO>#}b0cQR!@v^#J8z@A8S_<3?<5#-wJInkY#Jl#D_IZP~v*6??7WX(-oGiM8Z zAL@T=v%GKo9>jGFX?uQ0+o50h?PoX6_PO3y>kmctcXFlZb-H`)KHtj;*!JD;hod>} zyB$CGL-2Qgm&$pU7jNecX<>GAxj*NdMRB=&-5nce&TUWPRU*`u$%1DWN#ybimkGqp zO-&2i+uN4!K?@em-90UyXGi#6JTh*jE~ZajUCvKtSxOMTmuX*iUUy%6f4^jJz8+UK zZKc?2b?k3@?)pp7S!V8BxUOAE-GgmDHy37Xg#4vVsBjQ}jf=CGcVTa zpy=iW`EJWn`YQRre-)K$$rJvpJ>1q&V| zXS8SLCruWcvM0ShdEcxx)i{q|_dmqKnK`-_A0-bOe8%<6vwdURrDSBGv(&1SZ@SvrQ?}7A$KwkZudA=e(;3X{_S@}lNAD5H*w}0KIvRSME|#9j zyWJiqk6Ulsu6rN$-QSBJ;I|z|pE20%wcQ@S->+Y{z1~m8_+RVC;eO}gL_gdduOT>p zLwjG~d+*=&yf612EM#c4>0TEew;-eW+a24UJn4+^vUx4I_|+dK6|=ZI;{jq93Z52d zvDFdBT&p2W8r{=pvB!Cjo_zGub>GLv$)It0b3o&7DSb_;C(iC}txru&403MHTZO+z zXCrdCoHK9cw(K)PTqn+tFS>Z+)f2Xi0(-+Vw@HAiI~Kilx%d>rrFj=3bBi<1#v zae5%#Q$iK@l~u$i%RDU4HKjKkI+b#Lwr(@{`_eWY;`?MLfCZ_I_mkV?U!e z$9Enphi>O{4bQ-DQE~xdd}}LJ32h4#ys3WsS7~W!?Kw$4b98YlEh{T4H&bbJ`ki05 z+;!dGk5lN*_`Pl)hb2=}*3xx!3+J2G_I-{Iz1+9!KBpPxY@SHI??d>vb`471Rf@gj z#~PY^F3-1Jcc~{Caid%T+zFu7h&PBQ&MP=p8kS{bU)^bYAEqBTtj#JIBJZ{e&%H6( zRlp%ni7=}c#l)jI5VRw~U7jC_7T9PozhiG#Ox%bk=JY{xK{HtY?)ulvz=-|#B)2^B zl|=SPfBY9AE0EI~UeoRDcJs^no>f-${G(T!$bv^zW@(iZ^SJu^cZ_zSLzzdHTf$M zCf_`b@^dN{Ajy7)&Q5;wj@>coV@@*K`)bjM6^*_zq3Pun5*-&`K^7TL_)bu1`p%T> zu9Wb~gx6~I&-(B`Mycygug0E7v(Ad~TOYd~hqd(iCDH3_mp0&e=;nN1woN}@<9yvG zs|;6pcV-`q#o5KArxopMV2b)+$%2{ z5t`U0)?&tNd(EiUCcUG$6m>_=Tv}xs(NqsqW5)h4sOioI%xM$66 z;|ZZz_`NNwH=|jRrD^l~UJDuW;~ZN^oRUmKlnGR?*&iK(UkJz@&Oj=a_kf#|6Q zF*3pk=Wl#)->Toj-x}vq*mpmKStuvC5aG9xQTQaL5J1;ZfCcl$P!^PY(|y}0>M<2y zSvofs1UDYM-mgzcEwZphWSo+y%Y9a#&*@GkB^s_d;W6us?LD!W?Xd2 zT=*tJfbC&p1%d{G3r91Dv3Non!%|3lsn|kh+HyiKpHQpA;>(FLHwDOi?5P-z3Z!ec z%Q80+G^MH;s>M_X;pjS7F;u3aRcCCqHFj3tOq|t+ov=}x*&S~P8jRO==TQJlEu#6g z_P2-~1X2Z5eABgOy1e`s*GpuFDuQ<~!L}UQ`*g;Yxzn3Tl0NFdOcwja;z$(P@d`o{ zf?JPbO3YB4MWnD-GAfvSvl=19hSeZLP#=DbYJ-IS{jp4EBa2h+fnyUaLxw8$=J25Z z$-rpTX;A(Y<~>`URyO)EgJ^?8V;WUD7H&w%GWcAGF5#StS5V8_%QcB%foVJQ zjKaT`G^>*e3u8tY+4hGvt5XZ0Y^c;zI2K~LEyE;gx5ZV}q1jJ)bu8bpeFkX;ugKNk z)xB^>TNaMNySjVof1|)S@q(6E>I9p$M#?0?Zu7nABphcOb-pohrn5S!&S)2vHEKd4?&=nYD-?&SfJqM(CJ|olV118c&S6ZQ=3Sj&~ z{o0=+y0v)|Y3dp^o_s9bZ`SZ)ZW-BeXL)}GB#<7#mVvH~NM-@P!*A6RIYqad7E zuH{vB3TRZM1zZ*f*}*TRKwZq)|3 zkfWT>zMVY{Uk zd+`rXnb-o2-AZ>=VwTzq=^pw*c^iN;b9uJ*cMx$jwrn?OGjf9Xj$4HNLY`rdJip&Y zqtohi`i#PL?B?;id0(}xe%MuH$xYRbt98}8LF<5?jdCv=4BP8&f#9kj9BjRj9Sn^? zOmw=njFn0hD#3&|>E!WBDWE|tp~UsVHjr5gBzO3_oV{BO^y7r1a(45dpP7$!fYQ3g zn-i%t7snP;6^F!_9!i@Ko0YjB=_~WIi{)ah`yM){*mE{I!Eg#S<h3o4A*R5rb*7y0Xryt7HsTOi`m`{qOQ6SFm;nxIt;kcp9OR?T@K3Awsx-v}Sz`P+c1{ z)EJqDqqTyt4A}2$?zKHT4~y=#KLiwT?E452l?5Ha@VHzg)PYVzX4RWk1JZo;Epm9Q zCZJc!4#HlZmK!lV77myq;SNw!A+s$16pWn=CCY<1KXBk^7ar0le=z76{-%BBF~~+i ztT(~xF2M*h_CcLZCcZY(U3-N13!r6>UPmQdmJatMz;I0u6&$oua2hd9sgoL-BzHE_ zsfz{?KhH=4szpxzsX<*7upj@E0G`lCRkjVY%8#W&6W69NR=GpWn!)y znodBwD_x`eL768tei5Yy-f|+{t1+S-4KOb9<+w+0l%30;FAtcrvjZ|}hH~HVa_DFD#1?78(AwH!%;M}Yy#LiZh*DXhVSD8-yCSXry5gBIV9bFs1|VzCQiifAV) zQO8q+#rTPa=Xl?I24+ej-J=r#S5A|4TD%NY0Yv~nEMU5zmJH*?U__9AclTjDUS~n- zQ&3qt)Yt%M-&R-LXoRYg8ede)+WZ38HR+ld06FqqUQShy*aYC>1nW1(RMvIfcMsl? zcKd_iUD1TALL-$HzbuP1Ef|pn4GV@42|$c`e`~8Dpd7W_$Q%L?gy9HZ3No7ZGfP4C zDzQ55r$6PygfkR`*L^dhNW+Y>$?vVq5QLN&90w96y(F}=1X%g=aB#@*DF#N(R3g>b z+nQSIJWL8Etfdg#CO)3fLA3hwSHD~~y1I07t&fCnhwJU9G3>5)RK79+?OQ{h`(AvN zF}pn66{3Ay4(%D%P1iu4h@PmZTR|X#H1eZ`l$`WK_x-5uw0UL^*cRNnj{{d3Z6|TP z-tRjdvoCS_4J^&mPJqrh+?oJGi9s{fz!t%x;8&Sw2$1>=5Q15Qyyjf$KR$1AaGf3H zN%JA>>{eF67-6Wbv&HYUI)??+lM|=(oG|*SLGf|ggTLw*w0H~*`xPjnFLt&nMpIq@ zQQi5<`83^3Pk?4akEASV86@8)#zsfMdY)#v!SYa$?QLx#K^)J|ViRUtw*~HQ z&(@XmlVVzfyiI{H+L%(q2q8KrjkzjGk;5RMQ*+C}V1cv|ppmMTH_ngSjB);va;zJ8 z&;%XGp*iIKAiGr(;55^-P;lNH-v|HK3&bp@9}_70-*14aY^hF7n}?np~VOrNuR z#gD`4f8V_GZG#1-&ax59adUL8oy}iXVu=%@Dij`C7_8NW5nH)ODX+(%PoDFW3eFOh4DdW9QfMU>4Mjjd4A_X*|y8sH3B zfG!_#Am8i>kwSGLqyz?>#++(IW>Vxwi%H43JN+?+&p6U7rhPO;l$70=Pe>XAzmzl90Q8Vp+;M+&HSitX;)kflL49eL=Sv(@9E1R2wFADVUm!j3!0nGxyE+*17LFJ%SJ~-ZPZ@HXIrr4y{V%gia zFTdaKj!AyWeCnvRM^Irw5ydIar|J3*@kmp4FMSYi#N%0pnxlThcw4VO2p}=YkOe?xhS2 zI|v!)(%8*cen*Vn!T74K#j8CpJ?ynb0oj6`NTWjw;VQ+zf}7&Rziu7*@c?LV!lc5{ zQU=tT(|W4=>xZ9L&+{WQzA(z3T*MVx@CmzGpzOCn;vn^CA{F_I5Vfs>wxAt-zMe4# zyvG0ya$E6$VN2|+fJ4zhv2!-(X?u>S5kVL=g3vaQk5=8g3TXZ4ecO2xP{XO4f&#;W z`&sRH_?0Xmy|Q?w}P4WQd} z?TBmrkD790lj5uh08I>TXQA^EVF&eBRbA}wOBMjf zh8PeLD|^VNa>o&!+IBt5d4|sW77YxI1IDB@ne%&DSyLGz6DN;_ zl|B@nXcW{=8C{gO0;UEi&2W_XEhduK7DwOpqqbg+n0K5A2_^@Yw`(bo1-|q!}Fcf)TCYUySO-=q3uim>*WF%{1<$%YDt+HI4mE!`dp!O7*+*$5Fb zHlvG+&EqMF59kThtlv6G==dUkjLi-jHD+Ng@-T74jxbE9#yh=XHg3LSXqa&DD4s&6 z?}@ZA@dx0>$695(29C7k=3`V14riSdFg{S7u?aP`mY zc(VIM&-*lg9xuW#bhNuK&Vs59E0I=Y#T!F?der4+B1#XyoVQ0_0!5XM(|!Y1l>n~c zL7Dq-z61`+96a=(qY3YKeqV}FI-2}o9$l^OSzTSVrNpP?*RDaT9`OX#7UZy`fP?lh zb*JqTZ)W#+lE`J~B5@=&UYX8dU7zGoasEi9Juq0qh^7$yuo-qFKo8$atdXgJ?Nu6N zr9-gToPdIvj4cAhoc(uTT@S&yk7MC-INb2vGbqby7BSoR)A|Keh}jYSQ?`@t_B7m{ z!OEN0K9od4xgDvwRc9gy9<#|3+6YS9xz^AoK<;FhaV=Q$Gvj5$d4xX_6&h@!_df7- zSG1<*9h3Ta9ctnPjPJRx=k;5Xwj((pcEW|tsSEBl<+MWO2qo$fYxbK3D#|P}xQ~O{ z?M0@&&xLxoBA^f~T?$ekeeX|iskWuf4W#-WX;1D^M-{CqLz!-nm3CNjyJq8qN?|5>lC;o;WAz#cZD?!-T2UT+;=1Q|+)av5h7Va_HlZtMm(<{ibK1H~Sf z4n0G2XY2FKjk+n5}Sl|bNL!x*{gguceBx`%!lx0F+>-$(bJnAg$J zA^CUc|Cjch_tU{I-S^wESNwI?HHQNi*xo#NRo5rze?jlZ|1&KA+iaoiaGUo&?CyoN z8VZemzQVp+Sd)XRoz1k0Vq4OTr6z?3?DoZOmTpPbret*c(j*CV9h=f34s@-;>sM7} z%}2=6DjeK^Vdl^^x9w=|H-`P#-J1nr3f;?}zQ+E#aG{Lm0*RF5BR%q|PN$pftkD#w z2Dd zJW#D(@cM~fu|J}9b+o&`G*+Y*6tC8Jbh11FKhNvA(&2PM<@^2sKOtW%-(cYXJ`}eU z_jmLc%JM&p`^|g)O8Q19A%MI z&h@aE;Mi4=jt=z16-cOnhh@jbN|T2w+e^+sH&$E!D&Bmsxk;!<@gJ*S0r157fv;Rv zJ#2OUZxL(|ASTfS>7i+CN*u)aX`mXS?P_ww{juxL109{XixqZf7cZ4KbJLtQS}x`J ztHQA^`Yd&MvNkjn)G$Tg!Js&SrVIn*mWDPQ0UQ{(H86$v-5LVt&+l`Y@*%yUVR779 zjrvTo90o$#ndk;%*n(Ylpi1L(1ltUU@pv~00YEb|h?A72X+?!$)!|z7dr>_XF=hs6 zhI(Pn_cCwk&2Nspq^_NJ+g<-_bB%fX9r<~Lo}c)6b!D2`x$k#8?l;bbq)yFzHha~J zOtVV2EXIfiYiSq@zG1u@W2D%eq1iAxk}(k`i-+zXY(s7fM#TOyejI%`*qSCrFnSd(OpmoWGH@fP~o*i%hy`}L}pFKS6zVXmtWh6!BeIBNr zbN}AsyK&SeIPm&jiRTuh>-lIle-y>>QOS%f5R03#a=1Q{?6|J!W-xZ9`CXd(=g#&y zM=Z-Is57e<3Sn#1cjWYlR@XS;ggeY#<_DR}?J72BhaDINJ@JaM31UbwOg|9N9R*As zE6j}Bs*2_#7}N42tL&}LWHn03R%^uVQCm?$noeL~qr+1>Q6fG$IXe#pCu&J|0OiG* zgxPE58=4Rr!9YWWKrn-EfEd*uqjM&NUPX}OrKMR$0|qRlKtSeM>C^|hGb2Am^Luuf zZnNcB)ps^h?59YVLU<>pBd^e8B*u*am5k=nHSr+E;c`}23vQ*~JL-g)^#kZRXxHlc zhu?M|$>4e8k@%6d`DW0W40!DaeoaTUktBr?@5JKs*XCFN3W+~5&HQ07|5orn>;V7b zYR>4-V0|8d;~VTD^gK>hd0y;}YkfrTeeHVR70i84)-7O>cP1hSEXM8IAQI0cdD`T; z4vJqLha1ucs-UG-N~<~0(}yYqU2v8_M}V6dlT;}p)o39NWke)%Y&pty=jM=4T8VJE zeW!0}6|!_nXnEUTCLPUxX3odbe6KxDl7QNWXi^5+R9TC=WP3B{4`ef6^1h#fX2!P^ zVq$zdRZp-W6K9lI(FDo@_|b%?{XWb8MeoxI06;hy(iS?m$)ct!VMKVEi!;Q8!p--m z8i7#8E`2>EmiU|xpI3*)vyGlLDp&LpnuRLUw9sT5OF$e{ z=OCYCBY~E(p1dz{*&wbhk77I6|FFx;>A^nRLz7Gb`5b-13RN?-o9apNe^vEWf@R1? zmXsuz7aB7`Z6$5Jo&5LOmA-ZNJ{&upSm(g3wu9d%t?Q<^p^)S2dJ@z#=*>I^rGi+W z?frhAGBSCD=J?)%&R#G-46cQf2kl^DJYEu_)63!LaM8QDF|dXiqXZ8XeI3H5j!!Lz zGIn9`pMr1OkKl?Pi3qPzRx1Bn4UnnxIWq0!t|PJUc_|ej@uRceHYS&ol7W>6GFdD- zh2++pJ$w4_(-GXa(Az-}0plM_i9(-dgFre**}kP*KG7TFBM67%aL2Qzu8B}&0YyGa zB+JwHc$x2{bN%41HEZthY{DRcY);r!DKJ2l85)%p%|SgACB1FU4(v9+MK1x0B$I!l zH&{E;+>AARg(h&q?X1{i4R#iBaOT%(cgVf%IMe%&`L_Kyl-@%Kj+o>1JOue!%KOCp zjO%;z=79_Qvi7#_GC~<=Bp;$NL%{Rd7u=kl3^+i?0u3b-vi3-9DdM0imCCX^xoWu; zmoL{IBvD{O$m8jW+P>FDGxpQA5SI;E9j{krSh6LR2=qF0O~tRujG-)}Ri+sk6Q zg`pnTz-Vz5E5V3?Hj)gA;+Q{^2YU!@>!e) zHswr4S$jW6iu0zy7Ucgy=9k<1^7Yp%nioQh-4s-UT3#nFKx-w69D&v_0KZjK7P>68 zt&Saz)P>HZP5$cS4WE>$EQ!}uf)Qm(YlMS?#{Okw9be@!mT0d(INtYu;8bs7^Ly<$ zdo<}4%JaXZr%l6RY8_LnbtB} z>aE)?*fA(ZMx@!+OOi1Z3$CqT^x7{N$`+)v4g*%HRTMQjhq30sXwqB^hT=mLzV=Jf z^ij{CDg2e7LR4aocMI z(ZOKHObJgRM>^%sCw*{yqLg5_>(lsR)P5 zyRlx)ZeGWn%F(WD#A0xufwPD_-8Le7?$5Ta2bkWdm166+w`^Tsm8le+3Q!o6$%~Jh z@nLyG_#J(SVD{xcx>sK(ldIdeGK>cqJt+Jj+=49` zIgm7>oVn-BGp`xKwN8Vrt?q}-AwmZk%N0WX_Sa)(vbc{w!bR}(XGW2ocr~GgjJ<=X z8%=12QNTJ1LEAH0u;Y)`u(OExY3&)Y$YUPIw)ymY(`}V7&%r=_ltyHsg9llR_ZC-2 zVK>`TZKG7Ia1Rm05t!AB@q}sZ4L0b%7@*$5a2(T72@mp?Dh{%CrMr#p&Eqx%3LZUw zq#yNt&D70Gp%S4CrJm*n-Gy&rm7&0BgLtM3Yqvr)%q{K_q_oY`oVJD4qN+3I_#W%W zr0xfPhW8lzU{GG*!nNqEnT9L6O`xyKIX-u{`&$&_kaRuLdXcn3)`?(i8?NtAlDH!o z9;9st&yOl_c%g>h@UjA8>LUY+XPNJ~bpv~vxg`;w>rgZ((pAdKTP@7oM{Ux~Ws+o5-> z7R&ns>t7XhdZ@pPS;H7_=Uwe8R8r7#Z$$LbglF>80gVy$+qguW&DQ(*``(iLGk+KU zzL8TqkT0ZG1^myq`efHbWSzMJI1O$_=R-n6b$7q{#$s`kNYi;k?en~|W^??*FL}Cm zE$B;aJUQ_|sg-7f*ICrk8{arAa*q~L5@J$3c@rQ>Nc-KmpTM+G)rv0lydFg99U>B~ zcp?;d660#OW>|J)cL`-W-#pAX)4f1!&ydNiL=L0$y|sS%98cxA93N%EOlW%^V$daQ z<8^DYdb}ja#Z>u%;2o#ucgOgc)D%4GpQ?AbszjKRq$SF2zVh;8h6>uqmOuO8Dzc>Dp=}c==ft&dr6Ufgu zTdvq7Iy)T)rrKt6ivCW)f5Ch|m+}zT`mhp78gQ`2vT-6vt;;OtOf*jo&xb8%P;rMB zgzR*rS1QOnFd2I*%yg(%$b|4V4|kg40YHcv0>`o$nf8%U%MzCP5ryq#H`!WA5Nbe` z661?NH7}kL4p$+t*@U*mf1mFckeMoK^*Ts=BYO0&O`kh`&(D8ICtky#VIhK)tZ1g2 zuAo&zAOn7WCvBvIT&)Xn29;}{#p&K{&P_qO0Y#7Vmst5=S^P6D3Nm3-$v6l#B(3$w z3DOm{FXd6rgNjn^>8|dH{qOF~XTC8H0{tKSzc|AgJt$9o{-XN6(=OEgU)DgwENH}t z3yRd4Wi<7*-3j{%3lkK4dI;OUu&Z!DZ?La**bor)Z>SL~8nDQ_S``z7;OLO@c=G>& z&BD90TmnceR%2jkwH9QdD`@nYf!u={x=d7u5h8+sjl@}ngTF6-8a2a! zV7?4Mk{QMFt-#bNe5UtTo5b~5BkxV}yYKtC zV`}C&0V+XRYnb-Zai>C&!`x7t(a1Z*RGnGJ2rgno^j+|<$<~y$j@1#-g`>cstXw~L z?k9V2E*xQy{!@G5Mt}(MK$PrEfh&h~F_y{PheP&I8<@8cbe&lgA9dFiF;4{>=C^}L zE;Gr=3e+}n3~XR^zOE=xB{sQRFE=pF^(3ZlE!>JL8H7=Z2_pmvq@5>J*-WZLFTuQ# zq6--jpdl{m-;V*4BY}MAp6wS zkkHZNDZ70yi&J{aI^zd0#s|{5O8_AheADkES!D&uZ6l9$fd(do13nn~6sa+1v<&h% z93wUFmQLU&OE4Bos_&Top-VP}AfIMFD_?IkjRvbI&jpu!MnEQ4WK?kEaW@kkrM(MP zyON1b(c=C14tZ3(wrrX$mDAz>Q}+kEspMR%B7>z_6KlgGMy+Sp-i2$Z z-mG+my^?V3mwI01p(Busbv+uX&~~*pQENd=yL$^2^2+yGQQ$feypT_+M1?9OoKcDr zW4QLf$-TwRcYpYHC;iHpXl)%>8QT3xn65y{Ny``-zZg^|%~3U~K#$F*c3`I7x`FDP zqa;jVVKfrZgo$J+*VQDTGu8g)ocC7XrRv>uVap_hsEj>4=@_>p$Y4T%jQ))-rRCm;_R zReKUP?OVX6c|#k*vc*5T1_5-i!YmeTMI7>4x}q2AL~)DwRwio2%GMTF(}eu;PtyMm zSmX{`I2@s}6U)SV$uf>!lhDQ9#FaK3Bo`&os;{`1ldV>9dxcBQ3g!-SZifZV{apaj zp+;z#t9A7Z$-#@fl58a&iHZYW+8PU{(CD5bdNhi@$K+wFQg%Jh zkr4XEPNUTMY!_+BD#-TY-%)Md)bQ~=fZHCu^g~(&2)W}k(P2srp;HW+x_wU=q<^PL zK{kVlX_v{uW-6f_WO?AYupF=zPJ7Z;yDL4l52>3pZ}cXH*KP(OgN*OCH}s>gsqYt(N*Z%L+!#Tp8ylhFWZ9}k%M`bY0wGL* z;>`**7_odNHhZfngU3B53o7Z@yZ1>kboTsJxI&Sf06{-|)_*%D|3(o+7GW~{M$>B= zyb?_o^8TAwEwHEm?c>Y){yIPI*#C~!Nq=!_>rSP&C{>R&!&R>V+Ig6J(&LaM_L3svBxZYPcG7X2uS3+`vU6oXquL5X|E1q^a3PEHbk&n*V$ah zfn+>XvS1vXzmwsXhdx?Be`9;qzW6d)7m^&Xg%ie>iiq39cutT2jg_GlWJ}L}k$5gC z+_8tA0t^IH9eX>If!!&TaWw1cfY%dqw`Rc*kZf_2LY*u9?oRTydBb*N$~iI$DN}yUm!S_$8RqQew^~g zxX!KfFm5$;0kyPPRo6pD083}{d;1@?lVWYZyYyXTTz@B_)o26ukTA_ZD zGnMMV?aNH zWrZfUKVMSMDBOU*PmfB2j5G(Qi4>=$`Dq9-dWk6;hzO|Bd+1_lQTjO(WE&@t2)w4) z639C<&#=-}%n~B<=oZ*~pKltUZ(HbiZN5P-Vh;&u0PFj^z14U!qAbr_;+^{z;80pn z-TAl7;$*y%pire18pi70C`e%wFV0DK-lu0|lxj(=9QLmpdc}$UI3JX&!XdGdtaJx- zlHpCp)SQ}cB8mk}p(?OmG}4ZHpbZ1ofKUqD8^^b?SA6H92ld%cXD^0azZDNoYg8k( z=VCdn?)Wc|7!n7Rx_Qp+`79quJpF$c)qq>XYz(eR@#G=dAk;GtcSyoe}q3%zdmU zQTKFy(_}_Ohr_v)LTEQDVLUzU>GtIVu6Daa6$BIoLrn>GXQY=L#5?#e&vI;8yec9A zj0vsLHgJsN8d}Y>k152;3_6b(w?@(=yKC2@El;auRS!qB(>m}5KoIvP{NJwn35g~W z=8(b$zP!GUG3P2gyULP23-h=NW}v9?V^lL57^fTT&03TK3LkQkK(`7?^|95>DBXLP zs6ry7a|Xc>8>hT%zh?kqlTSNq)nLdx-~6H+KPlF;sEp-2u7=vj_CjN)J8F2GkH0;L zUTEbP%ZlZ(YsJ;IeJ?rrt5kz9b9@48PIcYD-{ey!QdQwfYN9+xHC5oax{RqL7IpVh zs?zXh=nHJKyJ~vx2%GQ3kym|TKgBX^oQt<@&B6?pesG!q=934=mZU+QaUS=?Wn&^y zWW)ND$bZS#K*9xtH7nAvykshBAcVO@KH`IrSu^c&1$2tBK3n0)$X+W}3a1~Lq^QuZ zgfPua*aoaE)A|=a#X3vdH`Wmm>Rz|PF)IkusQsbBBvC)Ou524G-rQ5gINVYY>CFNL zT#u_ubaaZ$Su^(2*=)mFi%5*?tqg!srC{YfW=P4t{2V+0ephtF9#Xwpf?kw;LcNxN&N zkO6QX=-Usc|xmU{I&koFAM>7rxE2*kE?JcV|ep@zFYOU zv~_$2$7%#CSSTE;vYC5IDD{C3{;Y)K11`%C<3UteS_>-@k}5xO#5UQ59EdKq6_PZo zLIMq!rq)iZ?7pR>2&JXhpJB`@a{ z4GM=xb1g6dW`Ink`3Vqdv)Of&9pNA(XnRj0oZ};c#Fn zNhLxUzGJEVdz={Gn>%XO%d%TiCjF6xYUvpaMMTG)FDsASpuV6S^upRRU zj7lll`08C}D7mUYyyG(_+RXY##YQI3)jTI>ZCYhXAcUgkSYyc00)=%3Dr1wB*nZlg zL7L0(r$DN|dV8r>1kFDUo+wJOZS5n+`pXP&l;7JB^{D2_Pq&$Z64;jrcM`8Y!q- z9cGvVNX3okGMQ{aZJT)1DRg(o2&<}m8K74*N+KJQIP54eo0LVNOBLcRKMPws4%_0e z$OH2*ry3hKs58-s$m6p~DgZ%*Df25UTn{X}XQ5QW{y3&nuOzRA|01<|Q)2r8a|`Y^K8Uo^vWGbi~Ru zx0CoZRnT!gF+$ppDQpWR#x~oedwUP8k=gs51NkdJ?BBf*HjjZ%(}z+;M6?pD`X!`Q z-qU_;3<$QQ`BD(pu##Y=+YZdKQmWj~*)0CPuKpIb+hcuAq+a*k8crC5%gNdJm~;&V z+w>QW0yrF?MbR+=v>eP2eFN-i)7~+AV#P$SQ8fQ4(Mp>d;@XgfH+kpANQji^IqqVC zu6!=gXBFk(Wm}0o%0zWfgmdzs>QfvAu`HzFrLwG^uUxOI^N1LVp0bEmzw1oiEtez< z1mBHV|C$4=Dw_D}XD125v@j;-8E%7{pm8K#MEV8FJUtZr(Ue*|(#hPqb*zs7bafmU z$fBH^EVLnl*_5!b!ee^WjiqTrTD!9%815_SZCClerA&~AqRqU~(T;7MBc8yCtGFTR zNEs~dB}=}WNT4)`Xp=)4)ua+S`1?nJXryHG0Lctaf*pvWTVAoqm}5I+S<9;5=6#VG zp3sVZc2Nj6|7%3spX+0(D1n#Lx^Yphti=`4twKAXSchc=rF1O0zcln>p_P)N8dG~M z^GViK1+DZsEY$NJT9tWN($RFa!KKM{j2qJ9Qv9aC0ZXnP|J6 zpPKn?T2=b!H16<%S{l6KWcfNXd3j}eBj>iDc((l-8lJ3v+v|-3s7@)>Xp9`TcHXaw zmbpVH7iMaHHKy%Z+4)zh{OcyR_nPGz<%cQ9rGn<*o(cOG?ytq1f^wpopKr%|EAQ@V0%(?J2h8FA>P$9kiVc8~mnEX5t=0|6 zK1~xqxZ{@07H)Kn8fDyu@Xsc&mYWOvyA!E55vaUp-0n*i&`%KDni)gX+FZBC2x$!+ z$DYCk@hD;dMZw6Y6M?*wh1g9)5ISRd8S_n2TRj$y=Y7V3@EM;W>tkAzr z4Vob4{#K9yT6$$>oRdx_LaQTFw5f0g{tScAvJF(?)heKmyOV4N4|2G*?cH8U*L*bz z$9uc);GQ7Y2tdgAsWpfH@(<-8kX~$DVj{XfvDD6z%q}@nJYOjsjI3qKbTZe$_YW(K z7?N(Vbz+?U_~wA5Fs@?{AbSUaNkpaGRtQTs%q^M*b&ha&8tVGiyB=xv)hW-(Uvc%- zN2+1nxS$jYk*<-y$RY1xUY5~CDIzCcfe}paW-F!bG~mIhk4s@I&6FrJ9QL2% zE3@v^EVNAqPHe*wLod*cUU7~20n{w*8|Vv$IhnO3xKXpU#GxRMi1XR%mg+tGTJ2tZ zPW`&W(zei*dMq1r%u1}w9y%ljGMZ3Nd$mRgUP~jOakm2ni_V1uF8*E{Ns4Z1JyAOp zqYV5qf6LAO@x$AuZ|*x7I54p1SY<>3iUu zE&@XhJQ$UWO+v=>`e0bn3`iQvEy>INYw}lICNcdVhWv&_h%o(J<}ol|3G$W8#hiv~ zel%bkT{9jsg^%l=8bjiS6fOayN{?=BpMDQi$L&cpUF3h?_et`TQt#S%e>}b~Q+=dK zN4Z~krNSF0GkOE48z)k4xeqZE!JQq77b&1ALr$1Ok6@3L7nwm(${PrHlVMu`5GHk% zxnk~3PcNeN2JveHDhM_zZbErO2rr#D5!u0N36zmScQr{4+EDG*HAulm+GUC!k}MG|YiYGD|9xw)i7ifAFw~igv8F7dvB5OyVNaW*!c{WV!omuDk?+7; z#$i=)UZJ}e2|m;8<8EGJOO{&=qz=c9X0eI-Aw_R%DP2mPFZ3*m7CI8-A(ziX^A7QR z&#B33Es!gAw(pj?`{+M9gwoRkMN|Jr6vk;S>E=6C3l)Q&bW!aGhCit&uVb;?l^&fK zHL6amK;bE3x}&!9TF9#I8G#w-rrNFdff{YECftDgjO!*J)j$HWOr7Ngm8MhiPB-$U zu<#XmA|U3-1T2y^xqAN$q6V)>%JPj4egtof)9k22fl~ruLBLdSIZRZ~noaQ64FU;E z2+@2PT~8lhd0d$XCd57kul%C+twfprLadl+6#3Lh>b*Tk*_M4^-%tQ z0ER$$zf2Z>R-;0SHX=@%4-|WB+SZe00Uhuv!D1$m8s+SoozvSyfh!%+ZtbXOXfP5A zSsHH(96&5LBTKDYkJ(3tVge>6hMj7Qf5^NuyQ+qz1+#hJcd44|)WN zBfbl+ud>m-qkA2DYiOA@t-l0!0;kpjzB=f`?GWsn zf$-pZf`HS!aaKQT7All`&;pHHmOZL$g)-qPCZM`@XzeGcsOxz;*GF7x;8T>jBMn5a5O9PKwDwJHB;h-IQSSO*{JQll} zov4L&5frH>kXY*GHN$skFOJ#!@b9|6_qb?AA_AS~wKWjGP!&)KgTAxR8Vwa)J8X5V z8`Rw}$Y2G@S5{ZNA{E;#yfJ1|(_dt9BK3qJun);K=WIb25Ae6XP{7QS! zQw0SIW-VLkPSwJ;H>_(z#F^`cRZH=VXxF7m(-&A#ph-^yXhRDiP9pb^!RU-}QM%Po zpgk@lX<8B{X$@_#Hw^3oyk8g$oPOVqpb>RX6@Qj3{mhg|btV&X-R}nbsn~Nx*))Y0 zrXto7v~RK2RJQ>uL{k;241h?{`y9{*iVgQx?%TL92yz2v!}=|hu~6nQn4ww{ZV{2U z*YVpbr;F(mst75qrdb9T9W+bL&6Uwgvp84(m8}eH%Y}iU&X=C@d;0RM+Na?5Qlw-U zM_oe+8Vnwu<tI12zi~R-J{i^ zQ}{70o<0*^HRO$Y3&D0?=v*;TC}9mv#Z=VfCcK!wBI#w`2016_Zne5uslAi+IgCAM z_@-@KIh9Ej9M*^open1ujJnwVUdP@V+FoYGT-;(U{&gPIs+Y31^^rtxv91hr(E(z^n(cd_Svk9p9yjnlD=LZX;R?s&g?MvEM<6)e2NUiplFZ0$Y zOh8ObXw;GhywWh}JT9!bED4N?98XFJ>OMYL$hI%=z zm-Bk!pi^Rm#vMW*+-G*RpfrEp&@Eq2keTH$RT(p>VD`Fwp&3$|+I_mD@9u8feaKhC z&bAwt{+f1A{aV(5c;GBJU)NdZfe zvofA6Ysv@SLG4G?)ZAV@Pd{_p$!mwCB61Fu$io5l6X3ru4b3cvBxI6e9j*97RKf|R zhe}(hh7vw11L3HJ8U?vg^>P3~JoBMI3<$|U1E+aGo5%1&;Y%}ZLc9GQG-OBW`_G<> z0jNJ;WGv!y`Fo&oRQvTkf`|NL$MCHQCc-sQq>^tpv1(SjQKi=BQ1qa%ptbUA9ETGq zd43@V4C!wWyl4SMfPi)ENs1*Jk5XmuRd&Q60|lX|3@w`0R{^gpVh|8eM#rw~qUBrF zrM;_g_~5n5(vifO=o>etD^B!9;)a^4Uf&I1^HFv2J<(u&Ey z$Hak#nAPC52G$Or7iJ?arN_+-lrY&l(ZcnVV=GeGw>=jrCEj4W^Z5%=gUsVw> z3Qx!c+vLbfdx4V{4esF$C5{?nggETttI&72E%l-K;hmBCijRtL`(UQBtlR41ME$G~ zU{;f3V%@m?J3sLWdhOL$^%*S$0#KpE8>k|f70^_z2IPujk-++AGqfANEAKHBT2O1X z)jfFkSSIJdIa58Sb~c$R^u}Vj_LU}8%Wr~1q-4LyekP_>*?}>&IvryZ`lhOZ0YO0d zuwagJDQ-W z>YMWU$j$5Bm<0dKAFy#Qu@9gFEmqoB08cNVgRF*`M|D?{YG8U131dK%nNG zF9kjf*^#2Ti&0ezd?;EcC7a@vchx3UnxO@Qt+$DS2XpbD@Lnq;+n3N|BJ3LZoXA5i zYnav8HgK*9BNAv!_EE_cX-d08H7LfO7GDja7wq3Q13Rg;T^Vr1R74h= z67h3=U-!M`d4J)fQqesr^}`Fq)N0Z3!4+<_J_EQYZKHNnJJ60brB!QO&fqBZqKB=n z>pqtj6?R~eAP?K01`uR6Zln%hEHM;mp!Km7go?olX^5dg=jjtw6bRSabILho7}a55 zdn6j4SL5iUs#_?USgnZQZIOe=*(g#GiG$?3Qm}`w*XYPzav#0QD$yXtiE6_x3}c`} zDk)+%qwF1uz}7}1CcAc)b^fD#{!LWe5)9V+ZwT|A{2WTiw*$J92AukfGMwZP=k zVZui9^#entiNSGWGgEhTRbi>Uuh?KL^h$8bL`7H)S9yQKnCD06Zn*FkLbggf_Jg0L zKlVDoZ=@q+o5=J&-?VPD{#7YH>qltglH#x0Hu`|gW8M-><60612!)w*@tim#bmST} zRc*oYyFii82=MT8TsI3@^sTGaqlPM!=AaXqCQoU&I;i4qXb5>yb+2ZSlZW&sFZgs_Z7Dxq8Aam7GF6AJ1q| z9xahOXNGMkG_CgK?O-|j z{!dfh#8_$@!@}CfrLJ}338#uZ$AVc$qp?4)gp}&}zGsV1INL|YAf-c~N=t)-US3-E zBAcFmX37T|8U|tA-*q3zd5Y-V3+it2rg3+-Ow!w86t~m@Xot==bu;Y*o z8MMQ(yngr2`M1@pm;b!@&ZX=q*%5l}^j#0g^~?Yb}=J;dlnu6QY}R6;G_F#H6XRE0XR z3dN-GisP&I13UJ;t=m}QY|EzZAk#Xt2R5QSs-TW%6sk@+)-rJ@?Wl zzWa~UQ(yd&8%x|5Y<%xdx)O&SN;OeFP(0pu5dds+ZkYEcEd2um4>dZFIN;ExdiSQO zYU8D3X?dk^jR*444AcP!fh%AM#e8n%DZJh zXz)vMO$M`0%N688HPBx6Uv03yI)Bx5MYHJOEC~FmTQnowb54#l&oj^d?(GVT?`_1! z;^)rYb6$9HKzRA^36Aq>e3-A{0I=nyQD%KM z&$n0%@cV8orsRBbUsVxB>@wQgJ9A+HL!t5U3y=pZLEr{0X@(6Trq-rY2qKYm7EbF4 z0@_j^_gTduE7CqT-IVt2c}7s~8M$FvS9poAZ$@JYmOg|q_EMtcREzyfHOMbU3*VOm z)9X#r`Lj+O2FrsR*IIwDY|R|?dFZm)$x%~h_2ek$E}l$j;B28eW5(NH?F-Ftvio_V zv`n|5&yxTcS)FmV@5-obKcf8>sRVZwLmu^5__Y1Fz4_QXmIGDu z?S;mst(#`CcJ&T$*Ed!FhQi24Uxh^0RY!SHx$sKy@z+{!F$9@~9|bEehAXq@l}Uo< z%o?M^&+Tfzwg^BPOr#R`Qaq{&okBJ#pxt80;ge?(*c$yrd;lY>m?Q#*}QU(>`bvblR*1br|={eE%ySxWCZY5W|T=asP%%xY?M@W5b+ z>6QYG_pa|-)ILrkhaAyT#_&(kPIBP@>`+d*q;F~LgW}N6n1&`)^jA|@Cf$@1u^`c% zCZYiix#1{Mt`DsPaORhCO0$Da1A+9Eo`&nZt;z;EMbpuM(lK=9*ZPYS zv}yT$?uBRpQ;`ZxxD}kJg<6(eJ8PEBsUI2BjMKvUAcZnXXlCNTbDFFP!6t4UaV7y{ zytjDP%46Nz!XcY(=oH-03#R>nsZp=POW1}+w6m{(mLnSN$;R6PrXnrY&z`Yyh^2z2|63C9OVMa4p8Jeb9c#pYzR#2;1 zU~uY}k`USf)tYQ2!fpV%EnOW?QxpvQImDe_B^3y5XK7^n z$iUj4hW5r8L5|cR7Gfz9Xj>LkbOJ3}?q}h^esC`>m<;?I;K>{mLA&4O8H3Lk7?`#7 zJ$vuLxih%Be(vC!1=nKb!}fSAkaymBr#ca`K%PEz$_HH`jtT|Weg-TMhN*UfAW+E| z2W6sKNnoXFX}5)TYopn&=C2s-LqG2`9=gLuG^EA?N`v)A_``+knn_3P78-dT-_{rz%l54H zt+lc{3y2)g;&=b760rI?i`p{y{T6NJfBj4~q}g+8XMkTv1!@f6!!lxe-4=p9fj76d zc&j7qA;3eGb=fYIS(1C`fQ>3g$Y#9%N-cN(BQ zkA2a0^759H$q(&q$>C1gG1oWQGL@(V17--u-3vhJxoB~OPZCteS=-)Fd3*G~t5kABF4PgXC+Ra_(VM^*PFwwN{MXA%Q)cAcmn7=`gr)pJsWhwagnl<00Am=-{^)xh`@qn;T>+Lzk#(eD%XdL8-cr7rAL}L$sY>r&uDY{6!3R35ZAi zXDSwZUEazulu1Bunjlufov2J0EL9M0uc*{@w}c{dD*@HeVE9HQ)oH9W7i2NEx z^c8=Jd(2+rOSZMiR}N_FMDy^VI*O3a<7A>)LDuh@3PRM{1k6N?apoP9Q;*(viOOUl zgEFL9+7p8iJSMzqD!XKSFmEK!(RlfPW2=5DfS|G6f1{Qpi@^#Z=6kJXYLv?#fYJjz z7~963qD(m6-2$Mn-J8NXasgLk&V)N@%@Eee^*9CNv=v@(n-ofntk7qVcQZ&e9+&V_ zue`L6V^0m;8j+3;;oHhqZba2iN3mYReW|J0f?4eeq0mdJK~D4E&j}UnLD>yXt~`Qu zr`$@L&pdYy&+qZPS%b0I0Yzwt=J9)~ekv6QoUcDwlMz+ib^ia7>=LWFhOAX}v(1q^ zV91O|e?Ap2AHqs!`#zWhMnWDE*$%?V1g&I+4-^dr-=+;^4j>~)c*c$cp1kW`Wk6S} zGHUcM3_{h;`xolHjY7j)49XjuiM;e-FqmSJ(y?ab=<-Z%9P$ApV0Ia=`CV`9E!tdL zzBRs*OWsA(&fdd+hIyBHJ+QOw90*{Vy&snL`6xfTF)r}_nVXPF)1>$i!_Ty}eP!i& z%Z{os_7+5>!n-2uhn~z!`^cc6=P43dzG3eQ2)oewYFfVoA=n=kM)ftY0VlG>Wuu?i z4;&-h2Hy9jpsI@63rbT;AM{n)S>69M9A`|H{V3_Zd1y-JvsdpG|6lg-h&lkAKF=A* z*wo(IA3J)f>mtj-EE4jyX zI>_}Kp&FL$IuPue`dSrI4LIU9_P)!n1~5T$*2;;mo88c}W-O3))moq%K$i!nCGu_Q zAlzU<_B!^l3zo7RoxuyKe-^-Y=u2X|3LoiExW#u{)@SkPt-hZ%O)uZ=uZElL$^@JV3WsH`5zwV!-#%fC}uCcuPvXKo{r6?rL} z$^&zV?ZLI7t%!`q75Bx3Y%Bnvhhp2tUoaXJXkY-^JE7n?+9TV=nIS8WZ>&5)Gqf3e z11SoF)fgobY7X0}$ENrU;C4p^C%_Y2i}2HGaog9iuY%`w)%Pi4qe-Kv_+>d2hbp5F z-o#ts%R!*e%y*QAaAo$|V1tKi)69K&fLL=OU8%E_e!X?!qiZb7$MGY_okdw+Umt98 z#0Q76UcP);wc3Ko=bKW^d{@I27i9aa#iXph6XBM78go=Rjaq|dom4e4WfIhR(p8&s zq9{xgh6c8-czw0v1Q|yNKHA?^We_kZv#C>>idf!@wLkOcnvSK6i}S`jrm`n>@Q6w^ zHnm(B%!DnRZWD{ZqiWC;o0aF_xl3lT&uaWx!P78RHCniR$Ck*( zm8Z~ z?LeD`F)_VSeZ&4XO<(nyrvK5N$36sFUyAF`v75WAW-33Ai^T9gA*D6iD^i!ZSHVL} zGe^%MZ;&U)eBgHR5Mh_C#yYbEs*GrJV?#Yhv+#hD8!>#Iy6A&52j$$Mb`IY5>aD}9 zp+XD4*XtE-m3Ax^aI&SBoL@GfpLt$mQF3xGdq-Z1r&*YoYJ;$8+(RqckvHp6G2x3Hi)@TbWfGWGkIc_CEZ%EjSix@e8Y@pw#n>Hs8~V>$fz%d8tR#iJ_(^Y zd!zMg=mL*iuobZ0rVX(jVubQIPCKL4NH-0Nr5rApi`JAx*&Bw(XG)=pgN~_eEL03d z^&|rBpst6ly$(-+zljR$!L}O48qhZ_&@yo2kq4CXa?ksBL<>ei*0%3AXU%Mo2|+{r ztAJmB=ZLa9?l?p1hgRhKqeqX@efQog9e(lRCB<94=9}>{3(W;99FT&UmJ&pxA&lH+ z#1$(f2$kUy-5UpI2u~zs3REx}a|!cGvdzwi%9>{lcK-YYS?=$=;|^L~Tb1kCL$`}M z%|T;-dBQP-k@#cl3tsKE^1sf4^Z6Y)if&szQ<(6%&;2HSn=;Kdv9bi6m6brO$H?~4DR862)Tl99Jcq40 zahg#n4W1^6z;Q&J*uFE8O;#D_2DT9(nj7IiGi%J$3RVefjC9GtAheGgL$*Z@!|D9@An1maK{@-#!*lmp&(B^2QRXqU zDuDVkXff_nh6-Do8}!mQUKUTEtSDy3!0^?LHiNSw0x$YP+v)jBJ`wD}7H_O86_kKF zLQ2I_q0Ov5bQ7vdqof#mRC^AqDxqo*70)tYQxWDkw_1bMh!*&y!TgO?Tf%mN{M|nA z2JI7az!DYXa8x#Tkr!=BfVVW1$abGqH|HWC4}n|Hg1D2l8pDCr)e+ru_uXPCvqn39 z{1}})c|u<5yZ+e66%(`e$v7SbNk-xoD>M=hWSTK1@w4W9$vR)OPGyWb&zY3tPR<3B zzgzVdq)=cnlk@JMDV7{CH`O_8ID06jEww0x#)rqwR5j*gWf5(!JHR%n1otO{g=$!i z2Cv{ot9>M^AHRDa9jd@`Z!8!oSq6Ds34o80O{zvy|Ho>j z*9L;isv+&W9eeNfO`2)UAYaR&b^<%Z((VfdR6K<`0j^))G~q51!5zDPuN^P7GN^i=kwcx{{~zV zBE#TM(>6s7gkqfXy-N88>pl(|+L=&YdO#)~Ye`|CCenTqmv-UQV_%BJH+2lT!9x_0 z2}b`RkgE3Xg3li<6#<65QAg>)J&$)lSZFCMsbLbb$2rrC*zp#8cmOMeu!^$DDE1@& zrUjY}GE_|pQIjG^wycQ&+1?$<=v681X#K={==%BJqJdt^ExmT_nsm@tzxwrT`rD+xEwDZ5|P#KYRw99C`{FR*-s>8zhT-?jJAn;xEj%d z+zC_1lez~uNpVSpSqkPOrND$8G3Nv7yJ;~(WnG|gf@L&^ihGYXs4xa~b+V;6kmq7r z)nwVvTUT-zq$=#vzWmJRpZ&TQa^bW2zdX?=lU-pkz>vs<&wa7FvZ@KR9GZ~N(>RUB zp&={CdLth#eK7F|Jm1yI`XE}Ci%uL{1^UjgI52Z^rlNLA0k&uyhrM_8Y&pLwv>wQI z(v5|pEf58josv(;Z%&}2W+bE7wop25aFK07W9p^SGLx+3tHa^^Tow4ycr~|ao3F@}*6D04 zZRBh6(z<+@(sYBGr6c)XJDmGNODjidx_gznG|tQV8trUd&G*jSc)s7(&5X?_TXK(` zo&21XwN0}|yIU7?+m~fx^wTX$%~;Nh*zZp!42eO=%dN05T(2*7@^d@CU)N1k;PQkM zuOw5J-Hr~Wz=_T#XeaN>aT`~zUM|96KVaa63KKh{VIj7ne9Xlynhx}w*Iiaj&7ZR& zs9~cFeS<@rNCh)v50{#e(U4E_i4aVQKv|0@G$o{=aV5ZAQW&2)&+0Cjjce!fvR;fo9=OAY4~r!)njv@i*Pi)`Xx=Y< z{#jZ%v_{8{9m}7uC^X0#ac%9e84aopSfj439g-Qnxp`A~*<+a*IV#ujD)N@3F0HR0 z$?)a6bi`zGEuS|P=y3cvW9E)_Z*I{J-H;H)BS$jBk|#&l&3LoR?9KKD9bZ2xkmO2U zO}ey}@3oep(jjpPzjNs--ApUAerzp2_h^2>o-XCjc9wSOP;T3a_^2#?ahnQ-S^x_THT6;EDuQ1SeMn+LzZvZ%e9QHnO1w{g|Eo_96fR(3tA&=&Sdi% zz45}=^I#@109mW`)v%Q5mlC|2-0RQ=7R6moA%iLRU zzx|vjO~G_w@WM3fT@0b*&%K%I;QmrKL)u>zSp?qS-kIpVeM!y`VP$y`)DN$1XAFYY zgPuxAZ{v0G3ZW{bO%;TN>QC;BfgmS%_Nr8|m>f6bGtt(SCQg7uNvXQV4NH9uNvy{6 z2eBX}#JIOw90>MD``U4Pdmx8oB3L0naX@4b9%mKn-xlm|5nF|1NrE4fV5T%+LTbaH zXx;f(3kbwKEhaj7f#4_aP;XB~iw(KvTIkBN>^J|cp~9Ji+Cl+tP2(G~2E+FViO$k%OXPt6J%n-AH*v-)o3@H z2&gZptccNTT@{aP@yoq!d!bdBlH2=WK^o)Hd7MW^B*+RpYGslIDp~zr&9u=B7`z+2 zl^UyU1@%eGA80({yB~X(F=&Dl>TvP0At*0sI0svVDKAUbnSEhBaHOGd(E=z^AGJW1 z_B4yn3&jo0Ou*E)HX|AaK83-`ajQA+hE6I%Ieg~u`GZ)DI_xnHC+ebis^1^|gA5bV zY<$0@xqb`{u*Ji!*&@9egGy=YzU**NNF-jTbuBRAq2a*@1Lx|*gIl`9(V$-?t0Z7Q z7o=jvp-+I43ofo@kE*nfv`&a-j+d?J@Hx;G?6Z+&m{&+?&tvb571Iz>>!EUYOGntt zOEPBzPBpn!tB+Z48CqIvtNN#XJ-A+PKcnTTXvn$~7eN;{Y^$$Q{p>KKafy6Y(P+Xr z-=6y31PZU5*UYQ{dhf-8J%lV_U`qfO2csKVxR)(lllf-}{1+qLJcmn525VYEnq1Qa zPdE-{;FEE_Iu@m@0W>_yBA1L5^7|!kw>jQQhx&@6p%Y`bcZ#8BwG6F;5X?`31{F@> zh|%Y?wAZn(U9kA3SOQvellBqy*Q%`}>}^2W>wuOtbwt<|C{Zodj`V8vSztmrPX{7Y z#?7F;6&4=eDhwdZz)MHBNS&&#O*5XVTY0Vq*M=}x$`_Ew?_0lHDy0HULA%xhTLEXu z$ijJrZ7>ZOE#rgxSiPp?S`-t+3nZrEJRyS>C_e@&&EX)ROEBdHjcv&V!Gy4#Nv(<& zEr-6+_eMWN3;0*~;c0lOaNA^)AH+jSw*his5L)91VE`Z!N+3s!0|71Vu}-W84gB@2 z0M!_`ey*HL#c+WDCYsl9bAN~OV<5n3@8nmXJpOlD41Llq`i!rs_}kK?dAvQ>7le>f zavVODE!a>ynY=a%VyJgA9g23b1Ey{2y|l|Fn~0AfKOEOzGRQ4`B$yDo6^6%BG#xv8J)fVFv^p6QbBfdmnpi=vXij*-|8+T>@Oxv9e_O zXawzpj+t3jYwdI^%{nKbq|wG01ga*CPnHGu8Qgp3??rH={(RQBqg17r&0REvQ~uK= zvKCsbXnSGm(grI1&fZNfjA+b6Co#t(FYK~<=#XL4Adz@vLebQPWT1JeRP-kkW^83l z)#_@}<$t>8F6cHFVoO;ksL=Ml!stZPTa_f};Lje)ghG?vk}S%~kV@^meQ0Ms_O(x8 zjajE%=Px1Lqqs!-DvhUFCyB~u<&N`%e+vPVYpJAZ5i~xPfFlS^H4L{tQX2l8`+5;P zNVi-Ca9*7RTm*D@9~aC}W5(fo*6oOc6-9&GDaHXmovOB!tnFUv+&2@E8!+ZAP0<@+K6xkkWv2uJJP%oY2%s(ol$T;DL-)3RW;K8ip^bI}L-D zZhh>dj6u|F-%fK0!5!&=Jq=ehWVWa_QyXS#`>ONN__D67 ziU#~lz0GVWs^@QP_c15Zxa?WTY!H|XXhQ6fg5Uk!61hf~VKs*gDxE6y>|L1o@SSH7 zC!Mt2Iu3@5EAOD>Bl;G9z2_PtXLWCJ-iJW<7HrKgBgUXrfyeU0kzK%N)D-?VI3}Yx zZCz7ui-e>8ZvMcAljNPPov7dWHDUffw_4u)&S6+E5`6b8?w-9zEv&Q73j8gG^9?}92zX%M9*3AE)KnZD}`Ig!|>Rf zho&G{Y1Ec*O}IOI^ArLvp~_?hyL9jt4C3suX#U+2ilj6{?^V_x%?n!%ZEp2^w6Ce* zL@Lm!XwrGeQ8#@6f4GkZT6Y%C3})Tn{xA&XV}?Dc&}i6m-M2`KT0j#Tn*{|s{Blbg zgDo(wT*F!$u`S!6aAYj)DJ2d{2r4wOyS@V%b(g#yj;YNjq0St{a9fSNLH|eJSX8m} z5U%a#*caqr-jhjueoot#S!G&qI?a2Y<025Qy&YJPTd!Y(Zq^j*EfEs7r z8spSk+=U7`D)vj-7*`pMCD#+skiTb`A@?Patom;^sb$hTRu_mc33l)QgJ)p4L? zqrnPHDD(vqp|zdSqw`Q#q!_8nbL+-OMq7GG-Te#ozC4A!cJ(TK z-=F`_>6d=-pVRjC7GW%1xYA++a1qoP(r&}0zSfKyt{5u3N&fQny=I?L3uOIS`I+x# z7PST-RnC-Vn2C-1AP!<4h7`yWs%M~G9)yo)q~t;&YjUbMYbhC^&I?dqq4K72kQ28U zDN(@!;(fDtYxBr3v_!gDMtDl5F{!`^btI7qU+IJ1$}7nA6^7>n0sr+L?4EdGYzyK+ z;B=|kkH)rH2E3?ik_3yx-s{*q+OD%A*sWqJL`b;-U;_qi<5;KC&bKPo_&Yh~?tvwl zDlF~NlZHRh!dpQZB7#TF->sS~&?4_SdzRJ@uS-lf=POTl83-HLDHoEC58)>DsbfTKN?CX-cfe4#;BC-(<9ME}0#knGtp( zYZ$B$(9~m=fs^GO0(o}0K$AF8XGW-3(co@%MDt1fx@qm*3|Yn&Fw|M9mrVAmZgf3P zPy{H&D;tN}sv&P^b^g>*q?0hzqnCjD_qS=#K5E-p{KlyDIF7BGTk^vEqEdRRZGCCh z4LIXMfmx)X3oO}7@KZ5tNMBluo(v%dIu}CB$1HsYUUU}91R4r_Js|j;56-gTdLkDu zUZ#KYPyP}8SO4W-p}+n&{|4Q0#~t*kPyGVD?|tv1@A||i=zsmGpOpUi{_p>O(d1kp z=SP0@N9m`2>Zj=Z+vn;0g?H!={lSmYum8s9=-zwpp-+DDPt(u-?9bDowN(mJ*5n;j ztG^?tGfA_u6sq0}X$BE=c3j#?8+>ek2;uE`2bwjST1aD+T7+;lbVb?jr06{!1C&8KP0 zMlyowqK1m{(b?ehGCUf!&JnBN*gq#)=CHTHgS`LW$-aV{{p2TBn+W=1-m{*DqE`=jmlRcJ<2usY`%6;^1c z2qlz%+1lK+Rw;e6cK8V0*w`jb=2gMi+Md|5qN(!yg5yy$r!5D@70t5;iRQyd-O#eh zQ5&$hF3e0CJrBcJbyg~W%|aEf8}jjw{n4yde_hUFjQj^a^aTCLkNjOZXIvF?jFyq| z!$15(qEVlI`f2*~r$0@{jvc2z`6u5?Pd)Wio&euP&prPBN zH)~A<)XNHJ+d1$n@q6-fn0pRkBsq+A);3izs#GwFj&EUP;@x==Sy`Zzm{0y-k#NWq za##1zlL$M@LYc~*i+1#>cjGXG0!uE1=}s}5C&QlpVbGyFfZM+5XPyrnP8wr z_wmjrgm+3kD@mGKC*XZbx!}RQPFNp9loOtlT2c@(F7j%^JV)?owhYyQT z{P>Umxb(&0^}|x-iQjK4vq29({4h^zdi2rv(aDo1>BoNT$K-nKGKL9?szrshX*9xa zsg&$OqJ{E2CH4jaQu+vD|_5HU>yZ7YNNS)RydKBl~HP3_(ecKEN*N(qX|O? z6$C>myT(@-xX+a_Qvuhq3kZZVmdD$F8*&PDpN=r7^{|t*ln8k4c+nvmB11$ zWQGQGAy4QmNbH#lVItK)5v_LR%9UHRLGN7i*Y(8Z(>Ug0Jx>4>m^3{?&awyc)Hg8% ztwfe+b>7h4${TlmsH+MGiZjlc%1Ve>=NPMqKZ5WgVb!2aDqi1M#q;z% z5^}5ZY&NlKjm*i^*vC+y35qhNQ1*67$=H%e`*D8nor0A#jzbebOPWly$~s)5&EsnA z;0`@>_!ymk=OV4F9`aesz+XF78^{`l>&6`u4%Kjy;o}BIoOZig;E2num(&52xW#An zfzKM$k*z+T706;R2DiWm-xF4`nbpK_c`eklE`PXr^}6Mv6jFg!$$ppm%S$UF_$kuN zy`sPk#BcC*lRQ>Oj~)|65@)KsihW_5@(c{%rVbd2UUf;@Xd0Ar`&=OLy>a5)*xv9j zCmy5l4BY6lL#!Eu>X0dkxk#YkcV~^y`IA$tGpHLGjcFh9ypPIBLH+)kg05ESl!IEh z;*d~yMutOxEOP6O*I&!a>#7Y>kXjFXuUB4sQ$iiFH9?!P;f>8Ls#y$L03DiYk8$o8 z6fRL*huRH_?b`<17uck5w_jm8DAmhtQXy%BV>S`twg|Gm967#*unzhdLKBK0hDuw` z_Ur85$#6X$CYsysi&$i?%Gy|L4YEp{6DGA^q!Lt6x(xyOXgAImCDk_8Cl-XH4e=GA ztLWHhoVV0~=GuBj-Fh;s=?3InYCw_RZ))!B5}~ItA;9n0w?)Q03vVBK>UON!Qlq>& z8_DU&QQGU+N9CkwyO7$$xztpC_}E;Y{N1tR$LQ%Ve~}(}-($3#H8R)UXswz&QQ;xE z^Q5?=736l$o>}rC)Jt+5gUp|Yg1gvI4JEQGhRU;-jn}Rgz*z&6yq|Rt=-t!f-ScIu zMJ*ht(p0lHew{<4d|oU|ZQ;8E)+Fx-I9Q~Qx1;|pg2>mVWHp#eZ9#QrlyoRnGOEo` zxieWq9Ok6t)nWU-l>J3So@mStLH9HG*b)j*n;I*%{%hP}6q>S%x0aoczfp5fUER8k zGtXQ%7E|(yR*mh-#r3aevxXKOdkb`*EaWh`MLn|W{Ua-t_0&^epet9eXN^3j)s-qmGQ7M}FppYr;dHHM0_V%GN|p(N12z{J zbT+i7>0gHo$+XpAGKFMNBiRHf*CBUML^_qKMh1MW2bDjCK$nJAOiBvQL<}JhT**n7 z<5;+HTh9D%R2AieS5VF+oK6c4MP|45yM|~21`rj`Ao{D0xu}IYcqWPV52#V;cM85q z(j+T2o@l%p^Si;Q1-ucw+?GvSeYLR(6+<$iH<~qt+k>Imnq?v6MUn#{Eau> zpy!`|!MEI%8p|8H0XsWAb|yP!Q1lKX3TDbLkzb0j)}b{e>tP^ZO9X!Icxhz(q|RCx z2fU<>tyV}KC@zzNnUi*812g@L;7ip@+n!g|{` z#)Z-*Rc*u(ft?suC#okHCNn5g?hB6F+1buMPhTvEf^cFPM&FoUY|Gs-E`Q2CzmMuk`@qoT+KO-d>Z`BOE3drlg=fml&r4mL`ckMr6IN)`;&wwK7lP0fD#^8k z7eJ}CZ;3n;Z&rujv;bti6e=X@Y$;Y~G8(mRDC*>hR&deM_)VWqElidR@r%G`Au8pq z$e-ag=F*U&gJ3I6AP*iYkR!MuTj(qn^yr>HE{2&5qw;gtGk^W!i!aKmc;x6&xlSkh zwrVx=9*V+n#=_F8#HkS+8%wWYQeycJ^U2G@cPfq-&4L;2Da<&oUb&QQtdkV0EjD0t z0NeMeIK=p1MWMk;9eY?)Hu5*}_`SZe)ILvpa2@;F1&cM?jqJ>L?%A(o*X%X-R;3VT zn23VM5U=^Nv7c{wT{(fgiVGY`gNsUQR@G>%%qi2;w)9%U&l)eGHDRdd% zrxlFMtC1E9pOo(n8i=zhPcGS{DQjjfPzh+neX8)x_V~8R79;jT=}TAHD%Rm$tbbEq zilaNvEwD(HQ_cNvZEetgj~iDn(TP)M6cROM)k$#P=n9{a;AG4(^}D$b*#6qt-b(L# z-~0aM(@%ZzKbpB^ZQIWsdplNgXTOlO!<%ouDMG^sFYzdLBFl-rv}iXfmVdNh7=a-i zernDco$)#&yDCi4Plulzm%`ni35-VffURz4qjKF?fnbY*D8f=cQ8mR#(8*aWrT> zj^<;*K9YH6=4+YyMCmOURj4iP_2ps-$U*|D&~gHks2FS2>LX)`I?;BIeBX5a%4J0j zjRvMIudM9$T!lWR+>E6rk3q-=X-JlK#htQtc>TumX!QDIcl*oRyVK9axckK`=g)oP z>eZ{)bKj>7p`g57a5FCdYYPPUo72!&uU>ia`qgW9tSseLr`_fC!|P4{>`?BU-1?>9 zyFT$!DSY8>%pKckA@mV#Wc2}`XTBetA+=`b-mqYGj2o+$^;6k)-|Ho+i>mJH#OrP4?cmfBm$ zM+Yv~UB%4d?n;1BU1ikwfeeL_xN+kerRyXbn?q8m;=QLGynpW3={U_b55Mb=fAX(>_E$dp zW7FNOFes1JH1V!G?|kv-(W4*9Zs1c_uWpSW|F#dUzVX^?hp%71zWU@7PaHb;*7>8C z-g)Qfw>F|l+;h)rH|>|MT)lGS#EBEj+4^1G zxUso%1W%JA+rDi9#g!AuRg$KnDMMR#t zg4LlgvEqu#p-SFdMH^xX2IWO*88KOKmw&a-k_q zN#jDU(B$xuBZ9M)cGCdfGIO+j z{P?lgp8Ac?yq|9GaVr?{uJGbkH~MWq{QJJ|`x~ zmoC0@{C)3z^w^av*YZTVaOCWJ-g_diHftLj8!M+ypE)+!ovhs4+FHtkx0VHRoN2Lf z7W0)hOHmf;HV^JdcWBb!Arx9+0pegI-G@dEyp+mb*DQ20afm!4MR95i7R{OI#_o^2 zLFH$A*QRn9g@$5`EjD^jig|e>)HO*WSfa0f<%@!05ylCqqfQjvNQmzv0sWE>nz`eZ zm1%|&S62_Md^Jz+znPWOxePh4Q}IGARCK=^j^Bwu^U*x{?ced&p8M)o{yuB7UYCh@ z^vKcY&Yyq#gY@tJ!D@2+@x?(Cg@TVPt5`sAf+jv9NL zAgu0x>9oGheR->zkfx_U?l`xHl^aXcCw>>Rb5c| zpC>29Up%m|sOy(~c=3DvY5j>#%_09!ANr^9cJrw>`}vQ*7jc%C*}t3b;Li7z=d100 zoqKxP{l*H(-mpV=%kTfbW_-Tpq3bQ}B_Duh@bxu6CWrc0Z}HDwZ>!*6?_mBw1|aZs L^>bP0l+XkKq6c&u literal 0 HcmV?d00001 diff --git a/resources/profiles/Qidi/filament/X5/Bambu ABS @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/Bambu ABS @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..32352a70c8 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Bambu ABS @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "setting_id": "v4Of6ePWz1oGVLqU", + "name": "Bambu ABS @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Bambu ABS@X-Plus 5-Series", + "chamber_temperatures": [ + "0" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.03" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Bambu ABS @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/Bambu ABS @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..8b6bc2ebb6 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Bambu ABS @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "K3KqxJ3z6lSKoCsQ", + "name": "Bambu ABS @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Bambu ABS@X-Plus 5-Series", + "pressure_advance": [ + "0.03" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Bambu ABS @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/Bambu ABS @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..3fa0dfca1f --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Bambu ABS @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "D3OOS6ShJDdn4dlU", + "name": "Bambu ABS @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Bambu ABS@X-Plus 5-Series", + "nozzle_temperature": [ + "250" + ], + "pressure_advance": [ + "0.014" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Bambu ABS @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/Bambu ABS @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..833774ecff --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Bambu ABS @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "setting_id": "8zWM4mqGjwjy2yJb", + "name": "Bambu ABS @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Bambu ABS@X-Plus 5-Series", + "nozzle_temperature": [ + "250" + ], + "pressure_advance": [ + "0.011" + ], + "slow_down_min_speed": [ + "10" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Bambu ABS @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/Bambu ABS @X-Plus 5.json new file mode 100644 index 0000000000..1464576f61 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Bambu ABS @X-Plus 5.json @@ -0,0 +1,105 @@ +{ + "type": "filament", + "filament_id": "GFB99", + "name": "Bambu ABS@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "chamber_temperatures": [ + "55" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "80" + ], + "cool_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "eng_plate_temp": [ + "90" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "20" + ], + "filament_adhesiveness_category": [ + "200" + ], + "filament_density": [ + "1.05" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_type": [ + "ABS" + ], + "filament_vendor": [ + "Bambu Lab" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "hot_plate_temp": [ + "90" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature": [ + "260" + ], + "overhang_fan_speed": [ + "80" + ], + "overhang_fan_threshold": [ + "25%" + ], + "pressure_advance": [ + "0.035" + ], + "slow_down_layer_time": [ + "4" + ], + "supertack_plate_temp_initial_layer": [ + "80" + ], + "supertack_plate_temp": [ + "80" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "textured_plate_temp": [ + "90" + ], + "textured_cool_plate_temp_initial_layer": [ + "80" + ], + "textured_cool_plate_temp": [ + "80" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/Bambu PETG @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/Bambu PETG @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..67725a5ee4 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Bambu PETG @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "ed9ZVS66ll61akjK", + "name": "Bambu PETG @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Bambu PETG@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "1" + ], + "pressure_advance": [ + "0.056" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Bambu PETG @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/Bambu PETG @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..953359bb36 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Bambu PETG @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "mPLqTb7smgIDOZTg", + "name": "Bambu PETG @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Bambu PETG@X-Plus 5-Series", + "pressure_advance": [ + "0.056" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Bambu PETG @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/Bambu PETG @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..77014127cd --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Bambu PETG @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "A3K4JfwyqUnciD2e", + "name": "Bambu PETG @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Bambu PETG@X-Plus 5-Series", + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Bambu PETG @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/Bambu PETG @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..3e95da1618 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Bambu PETG @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "4qjG4MYXmLPJ5Qjm", + "name": "Bambu PETG @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Bambu PETG@X-Plus 5-Series", + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Bambu PETG @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/Bambu PETG @X-Plus 5.json new file mode 100644 index 0000000000..0a4d2ce22c --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Bambu PETG @X-Plus 5.json @@ -0,0 +1,102 @@ +{ + "type": "filament", + "filament_id": "GFG99", + "name": "Bambu PETG@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "10" + ], + "filament_adhesiveness_category": [ + "300" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "13" + ], + "filament_type": [ + "PETG" + ], + "filament_vendor": [ + "Bambu Lab" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "nozzle_temperature_initial_layer": [ + "240" + ], + "nozzle_temperature_range_high": [ + "270" + ], + "nozzle_temperature_range_low": [ + "220" + ], + "nozzle_temperature": [ + "250" + ], + "overhang_fan_speed": [ + "90" + ], + "overhang_fan_threshold": [ + "10%" + ], + "pressure_advance": [ + "0.056" + ], + "slow_down_layer_time": [ + "8" + ], + "supertack_plate_temp_initial_layer": [ + "60" + ], + "supertack_plate_temp": [ + "60" + ], + "temperature_vitrification": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "textured_cool_plate_temp_initial_layer": [ + "60" + ], + "textured_cool_plate_temp": [ + "60" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/Bambu PLA @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/Bambu PLA @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..8cebbd7581 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Bambu PLA @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "cI5eJwzwoecS97SU", + "name": "Bambu PLA @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Bambu PLA@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.034" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Bambu PLA @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/Bambu PLA @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..3e7d24cf85 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Bambu PLA @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "UP5ST3BYA3nWaT5i", + "name": "Bambu PLA @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Bambu PLA@X-Plus 5-Series", + "pressure_advance": [ + "0.034" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Bambu PLA @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/Bambu PLA @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..e3e192d1e8 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Bambu PLA @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "jSFJn0WmV76aBwPt", + "name": "Bambu PLA @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Bambu PLA@X-Plus 5-Series", + "pressure_advance": [ + "0.016" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Bambu PLA @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/Bambu PLA @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..2390355042 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Bambu PLA @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "MYCn1SS32p63RzX0", + "name": "Bambu PLA @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Bambu PLA@X-Plus 5-Series", + "pressure_advance": [ + "0.008" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Bambu PLA @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/Bambu PLA @X-Plus 5.json new file mode 100644 index 0000000000..7660c8174d --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Bambu PLA @X-Plus 5.json @@ -0,0 +1,54 @@ +{ + "type": "filament", + "filament_id": "GFL99", + "name": "Bambu PLA@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "filament_adhesiveness_category": [ + "100" + ], + "filament_type": [ + "PLA" + ], + "filament_vendor": [ + "Bambu Lab" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_initial_layer": [ + "210" + ], + "nozzle_temperature": [ + "210" + ], + "overhang_fan_threshold": [ + "50%" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "supertack_plate_temp": [ + "45" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_cool_plate_temp": [ + "45" + ], + "compatible_printers": [], + "close_additional_fan_first_x_layers": [ + "1" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic ABS @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic ABS @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..c12bcc6687 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic ABS @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "xxRxeoAbiYJcH1P4", + "name": "Generic ABS @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic ABS@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.03" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic ABS @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic ABS @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..7807bc8420 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic ABS @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "MM6yfNPfpCtbsm2M", + "name": "Generic ABS @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic ABS@X-Plus 5-Series", + "pressure_advance": [ + "0.03" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic ABS @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic ABS @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..6de2b02613 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic ABS @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "BIiPt2AExUkASm2F", + "name": "Generic ABS @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic ABS@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "24.5" + ], + "pressure_advance": [ + "0.014" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic ABS @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic ABS @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..6e7bda8441 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic ABS @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "VzKqGnik79qlJ1bA", + "name": "Generic ABS @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic ABS@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "24.5" + ], + "pressure_advance": [ + "0.011" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic ABS @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/Generic ABS @X-Plus 5.json new file mode 100644 index 0000000000..4bb0cbe387 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic ABS @X-Plus 5.json @@ -0,0 +1,108 @@ +{ + "type": "filament", + "filament_id": "QD_4_0_11", + "name": "Generic ABS@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "80" + ], + "cool_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "eng_plate_temp": [ + "90" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "10" + ], + "filament_adhesiveness_category": [ + "200" + ], + "filament_density": [ + "1.04" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "17" + ], + "filament_type": [ + "ABS" + ], + "filament_vendor": [ + "Generic" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "hot_plate_temp": [ + "90" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature": [ + "250" + ], + "overhang_fan_speed": [ + "80" + ], + "overhang_fan_threshold": [ + "25%" + ], + "pressure_advance": [ + "0.021" + ], + "slow_down_layer_time": [ + "4" + ], + "supertack_plate_temp_initial_layer": [ + "80" + ], + "supertack_plate_temp": [ + "80" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "textured_plate_temp": [ + "90" + ], + "textured_cool_plate_temp_initial_layer": [ + "80" + ], + "textured_cool_plate_temp": [ + "80" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PC @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic PC @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..da5c50af1a --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PC @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,23 @@ +{ + "type": "filament", + "setting_id": "ERbh7DQQfK7A623W", + "name": "Generic PC @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic PC@X-Plus 5-Series", + "filament_flow_ratio": [ + "0.94" + ], + "filament_max_volumetric_speed": [ + "1" + ], + "pressure_advance": [ + "0.04" + ], + "chamber_temperatures": [ + "0" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PC @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic PC @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..487d8dd31d --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PC @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "setting_id": "MK8OyxUEziAeEbXk", + "name": "Generic PC @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic PC@X-Plus 5-Series", + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "10" + ], + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PC @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic PC @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..90829d6463 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PC @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "setting_id": "EQIfBmyVNumOKVWU", + "name": "Generic PC @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic PC@X-Plus 5-Series", + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "10" + ], + "pressure_advance": [ + "0.03" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PC @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic PC @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..514715f8a2 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PC @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "setting_id": "FsTuQT5hxmfjHyVZ", + "name": "Generic PC @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic PC@X-Plus 5-Series", + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "10" + ], + "pressure_advance": [ + "0.008" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PC @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/Generic PC @X-Plus 5.json new file mode 100644 index 0000000000..360f0ee803 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PC @X-Plus 5.json @@ -0,0 +1,108 @@ +{ + "type": "filament", + "filament_id": "QD_4_0_23", + "name": "Generic PC@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "65" + ], + "chamber_temperatures": [ + "60" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "cool_plate_temp": [ + "0" + ], + "eng_plate_temp_initial_layer": [ + "110" + ], + "eng_plate_temp": [ + "110" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "60" + ], + "fan_min_speed": [ + "10" + ], + "filament_adhesiveness_category": [ + "500" + ], + "filament_density": [ + "1.04" + ], + "filament_max_volumetric_speed": [ + "10" + ], + "filament_type": [ + "PC" + ], + "filament_vendor": [ + "Generic" + ], + "hot_plate_temp_initial_layer": [ + "110" + ], + "hot_plate_temp": [ + "110" + ], + "nozzle_temperature_initial_layer": [ + "270" + ], + "nozzle_temperature_range_high": [ + "290" + ], + "nozzle_temperature_range_low": [ + "260" + ], + "nozzle_temperature": [ + "280" + ], + "overhang_fan_speed": [ + "60" + ], + "overhang_fan_threshold": [ + "25%" + ], + "pressure_advance": [ + "0.021" + ], + "slow_down_layer_time": [ + "2" + ], + "supertack_plate_temp_initial_layer": [ + "0" + ], + "supertack_plate_temp": [ + "0" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "110" + ], + "textured_plate_temp": [ + "110" + ], + "textured_cool_plate_temp_initial_layer": [ + "0" + ], + "textured_cool_plate_temp": [ + "0" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PETG @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic PETG @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..2b4e220a54 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PETG @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "KaxkabCgu6EWZBzj", + "name": "Generic PETG @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic PETG@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "1" + ], + "pressure_advance": [ + "0.056" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PETG @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic PETG @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..4da60c3c48 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PETG @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "ckqzES7LsTgYKKhb", + "name": "Generic PETG @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic PETG@X-Plus 5-Series", + "pressure_advance": [ + "0.056" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PETG @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic PETG @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..6f1b9667ab --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PETG @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "1ID4LaQVZN4WjJ4v", + "name": "Generic PETG @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic PETG@X-Plus 5-Series", + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PETG @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic PETG @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..764e313efe --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PETG @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "yzkFoRA3R01K3lCa", + "name": "Generic PETG @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic PETG@X-Plus 5-Series", + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PETG @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/Generic PETG @X-Plus 5.json new file mode 100644 index 0000000000..ab1b23bb60 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PETG @X-Plus 5.json @@ -0,0 +1,105 @@ +{ + "type": "filament", + "filament_id": "QD_4_0_41", + "name": "Generic PETG@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "90" + ], + "fan_min_speed": [ + "40" + ], + "filament_adhesiveness_category": [ + "300" + ], + "filament_density": [ + "1.27" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "filament_type": [ + "PETG" + ], + "filament_vendor": [ + "Generic" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "nozzle_temperature_initial_layer": [ + "245" + ], + "nozzle_temperature_range_high": [ + "270" + ], + "nozzle_temperature_range_low": [ + "220" + ], + "nozzle_temperature": [ + "250" + ], + "overhang_fan_speed": [ + "90" + ], + "overhang_fan_threshold": [ + "10%" + ], + "pressure_advance": [ + "0.056" + ], + "slow_down_layer_time": [ + "12" + ], + "supertack_plate_temp_initial_layer": [ + "60" + ], + "supertack_plate_temp": [ + "60" + ], + "temperature_vitrification": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "textured_cool_plate_temp_initial_layer": [ + "60" + ], + "textured_cool_plate_temp": [ + "60" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PLA @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic PLA @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..218b407d21 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PLA @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "m5zUk3OpAayCbBwF", + "name": "Generic PLA @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic PLA@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.034" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PLA @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic PLA @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..c8dd22aba5 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PLA @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "5Eorr9nKVhLbnYAZ", + "name": "Generic PLA @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic PLA@X-Plus 5-Series", + "pressure_advance": [ + "0.034" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PLA @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic PLA @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..ee352a5667 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PLA @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "nqOawjrkU2lp3P0K", + "name": "Generic PLA @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic PLA@X-Plus 5-Series", + "pressure_advance": [ + "0.016" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PLA @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic PLA @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..14a7fa59c1 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PLA @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "nA20S71nTMCso0Bn", + "name": "Generic PLA @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic PLA@X-Plus 5-Series", + "pressure_advance": [ + "0.008" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PLA @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/Generic PLA @X-Plus 5.json new file mode 100644 index 0000000000..e3939b7796 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PLA @X-Plus 5.json @@ -0,0 +1,66 @@ +{ + "type": "filament", + "filament_id": "QD_4_0_1", + "name": "Generic PLA@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "additional_cooling_fan_speed": [ + "100" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "cool_plate_temp": [ + "45" + ], + "filament_adhesiveness_category": [ + "100" + ], + "filament_density": [ + "1.2" + ], + "filament_max_volumetric_speed": [ + "14" + ], + "filament_type": [ + "PLA" + ], + "filament_vendor": [ + "Generic" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature": [ + "220" + ], + "overhang_fan_threshold": [ + "50%" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "supertack_plate_temp": [ + "45" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_cool_plate_temp": [ + "45" + ], + "compatible_printers": [], + "close_additional_fan_first_x_layers": [ + "1" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PLA Silk @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic PLA Silk @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..f701cf5b50 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PLA Silk @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "42feLKkUTBQTPNDm", + "name": "Generic PLA Silk @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic PLA Silk@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PLA Silk @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic PLA Silk @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..b898df762a --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PLA Silk @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "uyCmwBkoRNNRbG5R", + "name": "Generic PLA Silk @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic PLA Silk@X-Plus 5-Series", + "pressure_advance": [ + "0.014" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PLA Silk @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/Generic PLA Silk @X-Plus 5.json new file mode 100644 index 0000000000..1c0d325a37 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PLA Silk @X-Plus 5.json @@ -0,0 +1,90 @@ +{ + "type": "filament", + "filament_id": "QD_4_0_4", + "name": "Generic PLA Silk@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "additional_cooling_fan_speed": [ + "100" + ], + "filament_adhesiveness_category": [ + "100" + ], + "filament_density": [ + "1.2" + ], + "filament_max_volumetric_speed": [ + "7.5" + ], + "filament_retraction_length": [ + "0.5" + ], + "filament_type": [ + "PLA" + ], + "filament_vendor": [ + "Generic" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature": [ + "220" + ], + "overhang_fan_threshold": [ + "50%" + ], + "pressure_advance": [ + "0.032" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "supertack_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "cool_plate_temp": [ + "45" + ], + "eng_plate_temp_initial_layer": [ + "55" + ], + "eng_plate_temp": [ + "55" + ], + "hot_plate_temp_initial_layer": [ + "55" + ], + "hot_plate_temp": [ + "55" + ], + "textured_plate_temp_initial_layer": [ + "55" + ], + "textured_plate_temp": [ + "55" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_cool_plate_temp": [ + "45" + ], + "compatible_printers": [], + "close_additional_fan_first_x_layers": [ + "1" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PLA+ @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic PLA+ @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..a7a736a95a --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PLA+ @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "aD9SNuHAOxVFczNM", + "name": "Generic PLA+ @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic PLA+@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.034" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PLA+ @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic PLA+ @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..e10196f45c --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PLA+ @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "QDAKF2VaO4MkiYZ7", + "name": "Generic PLA+ @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic PLA+@X-Plus 5-Series", + "pressure_advance": [ + "0.034" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PLA+ @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic PLA+ @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..62c8ce9de1 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PLA+ @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "kNONALYQIZ8hkU2f", + "name": "Generic PLA+ @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic PLA+@X-Plus 5-Series", + "pressure_advance": [ + "0.016" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PLA+ @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic PLA+ @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..78599cb326 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PLA+ @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "ehm8mY40hPq6Bjby", + "name": "Generic PLA+ @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic PLA+@X-Plus 5-Series", + "pressure_advance": [ + "0.008" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic PLA+ @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/Generic PLA+ @X-Plus 5.json new file mode 100644 index 0000000000..e1d40b179f --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic PLA+ @X-Plus 5.json @@ -0,0 +1,60 @@ +{ + "type": "filament", + "filament_id": "GFL99", + "name": "Generic PLA+@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "additional_cooling_fan_speed": [ + "100" + ], + "filament_adhesiveness_category": [ + "100" + ], + "filament_density": [ + "1.2" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "filament_type": [ + "PLA" + ], + "filament_vendor": [ + "Generic" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature": [ + "230" + ], + "overhang_fan_threshold": [ + "50%" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "supertack_plate_temp": [ + "45" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_cool_plate_temp": [ + "45" + ], + "compatible_printers": [], + "close_additional_fan_first_x_layers": [ + "1" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic TPU 95A @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic TPU 95A @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..525652742c --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic TPU 95A @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "blCxzXDeplxz7FrS", + "name": "Generic TPU 95A @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic TPU 95A@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic TPU 95A @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic TPU 95A @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..f17a6e91e5 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic TPU 95A @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "mXwJpelMKlY7SQR8", + "name": "Generic TPU 95A @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic TPU 95A@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic TPU 95A @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/Generic TPU 95A @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..072983e488 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic TPU 95A @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "o9NLhClfpsJFEE3P", + "name": "Generic TPU 95A @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Generic TPU 95A@X-Plus 5-Series", + "nozzle_temperature": [ + "220" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Generic TPU 95A @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/Generic TPU 95A @X-Plus 5.json new file mode 100644 index 0000000000..d5f56d408b --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Generic TPU 95A @X-Plus 5.json @@ -0,0 +1,81 @@ +{ + "type": "filament", + "filament_id": "QD_4_0_50", + "name": "Generic TPU 95A@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "cool_plate_temp_initial_layer": [ + "30" + ], + "cool_plate_temp": [ + "30" + ], + "eng_plate_temp_initial_layer": [ + "35" + ], + "eng_plate_temp": [ + "35" + ], + "filament_adhesiveness_category": [ + "600" + ], + "filament_density": [ + "1.21" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_max_volumetric_speed": [ + "4" + ], + "filament_type": [ + "TPU" + ], + "filament_vendor": [ + "Generic" + ], + "hot_plate_temp_initial_layer": [ + "35" + ], + "hot_plate_temp": [ + "35" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "nozzle_temperature_range_high": [ + "250" + ], + "nozzle_temperature_range_low": [ + "200" + ], + "nozzle_temperature": [ + "230" + ], + "pressure_advance": [ + "0.1" + ], + "supertack_plate_temp_initial_layer": [ + "30" + ], + "supertack_plate_temp": [ + "30" + ], + "temperature_vitrification": [ + "30" + ], + "textured_plate_temp_initial_layer": [ + "35" + ], + "textured_plate_temp": [ + "35" + ], + "textured_cool_plate_temp_initial_layer": [ + "30" + ], + "textured_cool_plate_temp": [ + "30" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..2346539b73 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "setting_id": "uarx8NrJerlKsoA8", + "name": "HATCHBOX ABS @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "HATCHBOX ABS@X-Plus 5-Series", + "chamber_temperatures": [ + "0" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.03" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..4566ece152 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "T52l6W0u1uoiXrAx", + "name": "HATCHBOX ABS @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "HATCHBOX ABS@X-Plus 5-Series", + "pressure_advance": [ + "0.03" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..bb16d32b06 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "krTIEBmeK9q2R60M", + "name": "HATCHBOX ABS @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "HATCHBOX ABS@X-Plus 5-Series", + "nozzle_temperature": [ + "250" + ], + "pressure_advance": [ + "0.014" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..19b4ce995f --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/HATCHBOX ABS @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "setting_id": "B99z7PiwClkWtyqv", + "name": "HATCHBOX ABS @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "HATCHBOX ABS@X-Plus 5-Series", + "nozzle_temperature": [ + "250" + ], + "pressure_advance": [ + "0.011" + ], + "slow_down_min_speed": [ + "10" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/HATCHBOX ABS @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/HATCHBOX ABS @X-Plus 5.json new file mode 100644 index 0000000000..3f5987240c --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/HATCHBOX ABS @X-Plus 5.json @@ -0,0 +1,105 @@ +{ + "type": "filament", + "filament_id": "GFB99", + "name": "HATCHBOX ABS@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "chamber_temperatures": [ + "55" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "80" + ], + "cool_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "eng_plate_temp": [ + "90" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "20" + ], + "filament_adhesiveness_category": [ + "200" + ], + "filament_density": [ + "1.05" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_type": [ + "ABS" + ], + "filament_vendor": [ + "HATCHBOX" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "hot_plate_temp": [ + "90" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature": [ + "260" + ], + "overhang_fan_speed": [ + "80" + ], + "overhang_fan_threshold": [ + "25%" + ], + "pressure_advance": [ + "0.035" + ], + "slow_down_layer_time": [ + "4" + ], + "supertack_plate_temp_initial_layer": [ + "80" + ], + "supertack_plate_temp": [ + "80" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "textured_plate_temp": [ + "90" + ], + "textured_cool_plate_temp_initial_layer": [ + "80" + ], + "textured_cool_plate_temp": [ + "80" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..dc87553374 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "2y03Jbrd8epf06MW", + "name": "HATCHBOX PETG @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "HATCHBOX PETG@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "1" + ], + "pressure_advance": [ + "0.056" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..21441a8d3e --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "KHbEUzPhVICXYhTs", + "name": "HATCHBOX PETG @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "HATCHBOX PETG@X-Plus 5-Series", + "pressure_advance": [ + "0.056" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..85219cea79 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "3HPxSQqEM8XGZqgU", + "name": "HATCHBOX PETG @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "HATCHBOX PETG@X-Plus 5-Series", + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..c6b4b699cd --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/HATCHBOX PETG @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "eZnTfUmPGkeoEP87", + "name": "HATCHBOX PETG @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "HATCHBOX PETG@X-Plus 5-Series", + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/HATCHBOX PETG @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/HATCHBOX PETG @X-Plus 5.json new file mode 100644 index 0000000000..5f794e561c --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/HATCHBOX PETG @X-Plus 5.json @@ -0,0 +1,102 @@ +{ + "type": "filament", + "filament_id": "GFG99", + "name": "HATCHBOX PETG@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "10" + ], + "filament_adhesiveness_category": [ + "300" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "13" + ], + "filament_type": [ + "PETG" + ], + "filament_vendor": [ + "HATCHBOX" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "nozzle_temperature_initial_layer": [ + "240" + ], + "nozzle_temperature_range_high": [ + "270" + ], + "nozzle_temperature_range_low": [ + "220" + ], + "nozzle_temperature": [ + "250" + ], + "overhang_fan_speed": [ + "90" + ], + "overhang_fan_threshold": [ + "10%" + ], + "pressure_advance": [ + "0.056" + ], + "slow_down_layer_time": [ + "8" + ], + "supertack_plate_temp_initial_layer": [ + "60" + ], + "supertack_plate_temp": [ + "60" + ], + "temperature_vitrification": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "textured_cool_plate_temp_initial_layer": [ + "60" + ], + "textured_cool_plate_temp": [ + "60" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..a1838c2041 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "Sn0LAKII01kQONZS", + "name": "HATCHBOX PLA @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "HATCHBOX PLA@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.034" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..82e54e389e --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "HWmejqWfehK4LG6C", + "name": "HATCHBOX PLA @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "HATCHBOX PLA@X-Plus 5-Series", + "pressure_advance": [ + "0.034" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..d6ac4c9a7e --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "zjIVoA34wN8AT6cp", + "name": "HATCHBOX PLA @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "HATCHBOX PLA@X-Plus 5-Series", + "pressure_advance": [ + "0.016" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..5b89e541e3 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/HATCHBOX PLA @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "sTjweBRTvE0P6YtE", + "name": "HATCHBOX PLA @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "HATCHBOX PLA@X-Plus 5-Series", + "pressure_advance": [ + "0.008" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/HATCHBOX PLA @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/HATCHBOX PLA @X-Plus 5.json new file mode 100644 index 0000000000..094e540793 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/HATCHBOX PLA @X-Plus 5.json @@ -0,0 +1,54 @@ +{ + "type": "filament", + "filament_id": "GFL99", + "name": "HATCHBOX PLA@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "filament_adhesiveness_category": [ + "100" + ], + "filament_type": [ + "PLA" + ], + "filament_vendor": [ + "HATCHBOX" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_initial_layer": [ + "210" + ], + "nozzle_temperature": [ + "210" + ], + "overhang_fan_threshold": [ + "50%" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "supertack_plate_temp": [ + "45" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_cool_plate_temp": [ + "45" + ], + "compatible_printers": [], + "close_additional_fan_first_x_layers": [ + "1" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Overture ABS @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/Overture ABS @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..7194b54b7f --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Overture ABS @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "setting_id": "tLj2E2dWAdLKpC4K", + "name": "Overture ABS @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Overture ABS@X-Plus 5-Series", + "chamber_temperatures": [ + "0" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.054" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Overture ABS @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/Overture ABS @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..5e50aa5dbc --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Overture ABS @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "1IkBG0ywAkk3VhOd", + "name": "Overture ABS @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Overture ABS@X-Plus 5-Series", + "pressure_advance": [ + "0.033" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Overture ABS @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/Overture ABS @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..9bacef9d3a --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Overture ABS @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "4SXA27uTG5kcbnAq", + "name": "Overture ABS @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Overture ABS@X-Plus 5-Series", + "pressure_advance": [ + "0.02" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Overture ABS @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/Overture ABS @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..a53148ed26 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Overture ABS @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "AzC8XjbkzsxEPDMG", + "name": "Overture ABS @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Overture ABS@X-Plus 5-Series", + "pressure_advance": [ + "0.01" + ], + "slow_down_min_speed": [ + "10" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Overture ABS @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/Overture ABS @X-Plus 5.json new file mode 100644 index 0000000000..ea12b78ead --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Overture ABS @X-Plus 5.json @@ -0,0 +1,108 @@ +{ + "type": "filament", + "filament_id": "GFB99", + "name": "Overture ABS@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "chamber_temperatures": [ + "60" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "80" + ], + "cool_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "eng_plate_temp": [ + "90" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "20" + ], + "filament_adhesiveness_category": [ + "200" + ], + "filament_density": [ + "1.12" + ], + "filament_flow_ratio": [ + "0.96" + ], + "filament_max_volumetric_speed": [ + "17" + ], + "filament_type": [ + "ABS" + ], + "filament_vendor": [ + "Overture" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "hot_plate_temp": [ + "90" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature": [ + "255" + ], + "overhang_fan_speed": [ + "80" + ], + "overhang_fan_threshold": [ + "25%" + ], + "pressure_advance": [ + "0.033" + ], + "slow_down_layer_time": [ + "6" + ], + "supertack_plate_temp_initial_layer": [ + "80" + ], + "supertack_plate_temp": [ + "80" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "textured_plate_temp": [ + "90" + ], + "textured_cool_plate_temp_initial_layer": [ + "80" + ], + "textured_cool_plate_temp": [ + "80" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/Overture PLA @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/Overture PLA @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..f209b21a6e --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Overture PLA @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "2TAd2Dlk6KPvvmMg", + "name": "Overture PLA @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Overture PLA@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.062" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Overture PLA @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/Overture PLA @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..a625953f60 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Overture PLA @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "1rKASIobH0DqQUeH", + "name": "Overture PLA @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Overture PLA@X-Plus 5-Series", + "pressure_advance": [ + "0.037" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Overture PLA @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/Overture PLA @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..5a3dfdee8f --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Overture PLA @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "UWQ7bLf74AxEPDdc", + "name": "Overture PLA @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Overture PLA@X-Plus 5-Series", + "pressure_advance": [ + "0.019" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Overture PLA @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/Overture PLA @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..86d8605933 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Overture PLA @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "bIg1NW0EwTlmRNAF", + "name": "Overture PLA @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Overture PLA@X-Plus 5-Series", + "pressure_advance": [ + "0.012" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Overture PLA @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/Overture PLA @X-Plus 5.json new file mode 100644 index 0000000000..571eb2bbeb --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Overture PLA @X-Plus 5.json @@ -0,0 +1,66 @@ +{ + "type": "filament", + "filament_id": "GFL99", + "name": "Overture PLA@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "filament_adhesiveness_category": [ + "100" + ], + "filament_density": [ + "1.2" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_max_volumetric_speed": [ + "11" + ], + "filament_type": [ + "PLA" + ], + "filament_vendor": [ + "Overture" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_initial_layer": [ + "210" + ], + "nozzle_temperature": [ + "210" + ], + "overhang_fan_threshold": [ + "50%" + ], + "slow_down_layer_time": [ + "10" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "supertack_plate_temp": [ + "45" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_cool_plate_temp": [ + "45" + ], + "compatible_printers": [], + "close_additional_fan_first_x_layers": [ + "1" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/PolyLite ABS @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/PolyLite ABS @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..0618d3c36f --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/PolyLite ABS @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "setting_id": "AJYooe7fIzg43McT", + "name": "PolyLite ABS @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "PolyLite ABS@X-Plus 5-Series", + "chamber_temperatures": [ + "0" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.054" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/PolyLite ABS @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/PolyLite ABS @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..36e012b0d6 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/PolyLite ABS @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "S0uCyMruXw5waEYf", + "name": "PolyLite ABS @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "PolyLite ABS@X-Plus 5-Series", + "pressure_advance": [ + "0.033" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/PolyLite ABS @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/PolyLite ABS @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..1bf7cdf030 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/PolyLite ABS @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "oYlfF3MMF5DEeJpK", + "name": "PolyLite ABS @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "PolyLite ABS@X-Plus 5-Series", + "pressure_advance": [ + "0.02" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/PolyLite ABS @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/PolyLite ABS @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..9d1f541dfc --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/PolyLite ABS @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "hHXz74Ps9x4T7kZl", + "name": "PolyLite ABS @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "PolyLite ABS@X-Plus 5-Series", + "pressure_advance": [ + "0.01" + ], + "slow_down_min_speed": [ + "10" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/PolyLite ABS @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/PolyLite ABS @X-Plus 5.json new file mode 100644 index 0000000000..48b6caa32b --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/PolyLite ABS @X-Plus 5.json @@ -0,0 +1,108 @@ +{ + "type": "filament", + "filament_id": "GFB99", + "name": "PolyLite ABS@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "chamber_temperatures": [ + "60" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "80" + ], + "cool_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "eng_plate_temp": [ + "90" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "20" + ], + "filament_adhesiveness_category": [ + "200" + ], + "filament_density": [ + "1.12" + ], + "filament_flow_ratio": [ + "0.96" + ], + "filament_max_volumetric_speed": [ + "17" + ], + "filament_type": [ + "ABS" + ], + "filament_vendor": [ + "Polymaker" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "hot_plate_temp": [ + "90" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature": [ + "255" + ], + "overhang_fan_speed": [ + "80" + ], + "overhang_fan_threshold": [ + "25%" + ], + "pressure_advance": [ + "0.033" + ], + "slow_down_layer_time": [ + "6" + ], + "supertack_plate_temp_initial_layer": [ + "80" + ], + "supertack_plate_temp": [ + "80" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "textured_plate_temp": [ + "90" + ], + "textured_cool_plate_temp_initial_layer": [ + "80" + ], + "textured_cool_plate_temp": [ + "80" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/PolyLite PLA @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/PolyLite PLA @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..f823b38e67 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/PolyLite PLA @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "kKfybaeH6Llb3Vdc", + "name": "PolyLite PLA @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "PolyLite PLA@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.062" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/PolyLite PLA @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/PolyLite PLA @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..b7f3ef07f6 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/PolyLite PLA @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "hzEsCxIKwuV2ubrz", + "name": "PolyLite PLA @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "PolyLite PLA@X-Plus 5-Series", + "pressure_advance": [ + "0.037" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/PolyLite PLA @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/PolyLite PLA @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..8b98d3842a --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/PolyLite PLA @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "PODs7XKIgMiJZI5x", + "name": "PolyLite PLA @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "PolyLite PLA@X-Plus 5-Series", + "pressure_advance": [ + "0.019" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/PolyLite PLA @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/PolyLite PLA @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..f4b6b8c2ee --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/PolyLite PLA @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "LQ1rP7NSTjw2moHk", + "name": "PolyLite PLA @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "PolyLite PLA@X-Plus 5-Series", + "pressure_advance": [ + "0.012" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/PolyLite PLA @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/PolyLite PLA @X-Plus 5.json new file mode 100644 index 0000000000..5b37f7ae8a --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/PolyLite PLA @X-Plus 5.json @@ -0,0 +1,66 @@ +{ + "type": "filament", + "filament_id": "GFL99", + "name": "PolyLite PLA@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "filament_adhesiveness_category": [ + "100" + ], + "filament_density": [ + "1.2" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_max_volumetric_speed": [ + "11" + ], + "filament_type": [ + "PLA" + ], + "filament_vendor": [ + "Polymaker" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_initial_layer": [ + "210" + ], + "nozzle_temperature": [ + "210" + ], + "overhang_fan_threshold": [ + "50%" + ], + "slow_down_layer_time": [ + "10" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "supertack_plate_temp": [ + "45" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_cool_plate_temp": [ + "45" + ], + "compatible_printers": [], + "close_additional_fan_first_x_layers": [ + "1" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..78389ceeb5 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "p9cDXBgbjwjOX5me", + "name": "Polymaker PLA-HT @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Polymaker PLA-HT@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.062" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..9f77b41119 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "TpI2jqmcVygyTO8N", + "name": "Polymaker PLA-HT @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Polymaker PLA-HT@X-Plus 5-Series", + "pressure_advance": [ + "0.037" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..3c46385369 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "69AgpjCCTxF5ffW1", + "name": "Polymaker PLA-HT @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Polymaker PLA-HT@X-Plus 5-Series", + "pressure_advance": [ + "0.019" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..788db83504 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "tcoQNICpWYGdE24e", + "name": "Polymaker PLA-HT @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Polymaker PLA-HT@X-Plus 5-Series", + "pressure_advance": [ + "0.012" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @X-Plus 5.json new file mode 100644 index 0000000000..f3c54e81f1 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/Polymaker PLA-HT @X-Plus 5.json @@ -0,0 +1,66 @@ +{ + "type": "filament", + "filament_id": "GFL99", + "name": "Polymaker PLA-HT@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "filament_adhesiveness_category": [ + "100" + ], + "filament_density": [ + "1.2" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_max_volumetric_speed": [ + "11" + ], + "filament_type": [ + "PLA" + ], + "filament_vendor": [ + "Polymaker" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature": [ + "215" + ], + "overhang_fan_threshold": [ + "50%" + ], + "slow_down_layer_time": [ + "10" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "supertack_plate_temp": [ + "45" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_cool_plate_temp": [ + "45" + ], + "compatible_printers": [], + "close_additional_fan_first_x_layers": [ + "1" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..254422bb19 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "setting_id": "8SvrXXv743rCyyeN", + "name": "QIDI ABS Odorless @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ABS Odorless@X-Plus 5-Series", + "chamber_temperatures": [ + "0" + ], + "pressure_advance": [ + "0.03" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..1bd37ac08a --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "YviPsfkGYv6Q3r3T", + "name": "QIDI ABS Odorless @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ABS Odorless@X-Plus 5-Series", + "pressure_advance": [ + "0.03" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..cbb361fb9c --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "setting_id": "YLOcbaCppSmQ1twv", + "name": "QIDI ABS Odorless @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ABS Odorless@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "24.5" + ], + "nozzle_temperature": [ + "250" + ], + "pressure_advance": [ + "0.014" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..912dc04ed7 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,23 @@ +{ + "type": "filament", + "setting_id": "Klsu6iALsWgbg3vK", + "name": "QIDI ABS Odorless @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ABS Odorless@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "24.5" + ], + "nozzle_temperature": [ + "250" + ], + "pressure_advance": [ + "0.011" + ], + "slow_down_min_speed": [ + "10" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @X-Plus 5.json new file mode 100644 index 0000000000..a2f14984a0 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS Odorless @X-Plus 5.json @@ -0,0 +1,108 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_14", + "name": "QIDI ABS Odorless@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "chamber_temperatures": [ + "55" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "80" + ], + "cool_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "eng_plate_temp": [ + "90" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "10" + ], + "filament_adhesiveness_category": [ + "200" + ], + "filament_density": [ + "1.02" + ], + "filament_flow_ratio": [ + "0.92" + ], + "filament_max_volumetric_speed": [ + "22" + ], + "filament_type": [ + "ABS" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "hot_plate_temp": [ + "90" + ], + "impact_strength_z": [ + "7.4" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature": [ + "260" + ], + "overhang_fan_speed": [ + "80" + ], + "overhang_fan_threshold": [ + "25%" + ], + "pressure_advance": [ + "0.035" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "100" + ], + "supertack_plate_temp_initial_layer": [ + "80" + ], + "supertack_plate_temp": [ + "80" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "textured_plate_temp": [ + "90" + ], + "textured_cool_plate_temp_initial_layer": [ + "80" + ], + "textured_cool_plate_temp": [ + "80" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..99a9e16c08 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "setting_id": "bTwNiMSHwex0gxrd", + "name": "QIDI ABS Rapido @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ABS Rapido@X-Plus 5-Series", + "chamber_temperatures": [ + "0" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.03" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..30086f5dce --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "mcPlHcr33zPv3aIf", + "name": "QIDI ABS Rapido @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ABS Rapido@X-Plus 5-Series", + "pressure_advance": [ + "0.03" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..47278a61b1 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "0np334pRpl3qa8Uq", + "name": "QIDI ABS Rapido @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ABS Rapido@X-Plus 5-Series", + "nozzle_temperature": [ + "250" + ], + "pressure_advance": [ + "0.014" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..f79fcfdfac --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "setting_id": "Vp2bJxFhsPvW6K0P", + "name": "QIDI ABS Rapido @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ABS Rapido@X-Plus 5-Series", + "nozzle_temperature": [ + "250" + ], + "pressure_advance": [ + "0.011" + ], + "slow_down_min_speed": [ + "10" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @X-Plus 5.json new file mode 100644 index 0000000000..0ecb9c656c --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido @X-Plus 5.json @@ -0,0 +1,105 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_11", + "name": "QIDI ABS Rapido@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "chamber_temperatures": [ + "55" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "80" + ], + "cool_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "eng_plate_temp": [ + "90" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "20" + ], + "filament_adhesiveness_category": [ + "200" + ], + "filament_density": [ + "1.05" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_type": [ + "ABS" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "hot_plate_temp": [ + "90" + ], + "impact_strength_z": [ + "7.4" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature": [ + "260" + ], + "overhang_fan_speed": [ + "80" + ], + "overhang_fan_threshold": [ + "25%" + ], + "pressure_advance": [ + "0.035" + ], + "slow_down_layer_time": [ + "4" + ], + "supertack_plate_temp_initial_layer": [ + "80" + ], + "supertack_plate_temp": [ + "80" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "textured_plate_temp": [ + "90" + ], + "textured_cool_plate_temp_initial_layer": [ + "80" + ], + "textured_cool_plate_temp": [ + "80" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..34632b393f --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "setting_id": "U69dFGlkEk9twDF6", + "name": "QIDI ABS Rapido Metal @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ABS Rapido Metal@X-Plus 5-Series", + "chamber_temperatures": [ + "0" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.03" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..59492201a5 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "XaJbATawtVrUsXpz", + "name": "QIDI ABS Rapido Metal @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ABS Rapido Metal@X-Plus 5-Series", + "pressure_advance": [ + "0.03" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..93b4cb3aba --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "Xb0A7YqmqP2peSM3", + "name": "QIDI ABS Rapido Metal @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ABS Rapido Metal@X-Plus 5-Series", + "nozzle_temperature": [ + "250" + ], + "pressure_advance": [ + "0.016" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..c4edce73be --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "setting_id": "4AA9wGDNebbTHf4X", + "name": "QIDI ABS Rapido Metal @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ABS Rapido Metal@X-Plus 5-Series", + "nozzle_temperature": [ + "250" + ], + "pressure_advance": [ + "0.008" + ], + "slow_down_min_speed": [ + "10" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @X-Plus 5.json new file mode 100644 index 0000000000..f3603eda99 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS Rapido Metal @X-Plus 5.json @@ -0,0 +1,105 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_13", + "name": "QIDI ABS Rapido Metal@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "chamber_temperatures": [ + "55" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "80" + ], + "cool_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "eng_plate_temp": [ + "90" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "20" + ], + "filament_adhesiveness_category": [ + "200" + ], + "filament_density": [ + "1.06" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_type": [ + "ABS" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "hot_plate_temp": [ + "90" + ], + "impact_strength_z": [ + "7.4" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature": [ + "260" + ], + "overhang_fan_speed": [ + "80" + ], + "overhang_fan_threshold": [ + "25%" + ], + "pressure_advance": [ + "0.035" + ], + "slow_down_layer_time": [ + "4" + ], + "supertack_plate_temp_initial_layer": [ + "80" + ], + "supertack_plate_temp": [ + "80" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "textured_plate_temp": [ + "90" + ], + "textured_cool_plate_temp_initial_layer": [ + "80" + ], + "textured_cool_plate_temp": [ + "80" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS-GF @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ABS-GF @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..d81d623d33 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS-GF @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "V9h7YWcaTejmFCh0", + "name": "QIDI ABS-GF @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ABS-GF@X-Plus 5-Series", + "pressure_advance": [ + "0.03" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS-GF @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ABS-GF @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..88ee5f2146 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS-GF @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "hO8H1GUCzMkwFtQH", + "name": "QIDI ABS-GF @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ABS-GF@X-Plus 5-Series", + "pressure_advance": [ + "0.01" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS-GF @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ABS-GF @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..997e67a0f0 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS-GF @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "LskHdeEngKlRCSmg", + "name": "QIDI ABS-GF @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ABS-GF@X-Plus 5-Series", + "pressure_advance": [ + "0.01" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ABS-GF @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI ABS-GF @X-Plus 5.json new file mode 100644 index 0000000000..2ab2fbfc84 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ABS-GF @X-Plus 5.json @@ -0,0 +1,114 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_12", + "name": "QIDI ABS-GF@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "box_temperature_range_low": [ + "0" + ], + "box_temperature": [ + "45" + ], + "chamber_temperatures": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "80" + ], + "cool_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "eng_plate_temp": [ + "90" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "fan_max_speed": [ + "20" + ], + "fan_min_speed": [ + "20" + ], + "filament_adhesiveness_category": [ + "200" + ], + "filament_density": [ + "1.15" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "filament_type": [ + "ABS-GF" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "hot_plate_temp": [ + "90" + ], + "impact_strength_z": [ + "5.3" + ], + "nozzle_temperature_initial_layer": [ + "260" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature": [ + "270" + ], + "overhang_fan_speed": [ + "80" + ], + "overhang_fan_threshold": [ + "25%" + ], + "pressure_advance": [ + "0.035" + ], + "slow_down_layer_time": [ + "5" + ], + "supertack_plate_temp_initial_layer": [ + "80" + ], + "supertack_plate_temp": [ + "80" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "textured_plate_temp": [ + "90" + ], + "textured_cool_plate_temp_initial_layer": [ + "80" + ], + "textured_cool_plate_temp": [ + "80" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ASA @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ASA @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..d417265f5a --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ASA @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "setting_id": "FgeIGgT8xZCm4UO8", + "name": "QIDI ASA @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ASA@X-Plus 5-Series", + "chamber_temperatures": [ + "0" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.03" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ASA @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ASA @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..ed86d714a1 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ASA @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "VRicNQizOCKkgLBJ", + "name": "QIDI ASA @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ASA@X-Plus 5-Series", + "pressure_advance": [ + "0.03" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ASA @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ASA @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..a7870accce --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ASA @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "KDjln7WdhhbSztX3", + "name": "QIDI ASA @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ASA@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "13" + ], + "pressure_advance": [ + "0.014" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ASA @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ASA @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..30496917d1 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ASA @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "setting_id": "X9TOBuOKBbJIoF7y", + "name": "QIDI ASA @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ASA@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "13" + ], + "pressure_advance": [ + "0.011" + ], + "slow_down_min_speed": [ + "10" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ASA @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI ASA @X-Plus 5.json new file mode 100644 index 0000000000..97127fe57b --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ASA @X-Plus 5.json @@ -0,0 +1,111 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_18", + "name": "QIDI ASA@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "chamber_temperatures": [ + "55" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "80" + ], + "cool_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "eng_plate_temp": [ + "90" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "fan_cooling_layer_time": [ + "40" + ], + "fan_max_speed": [ + "50" + ], + "fan_min_speed": [ + "10" + ], + "filament_adhesiveness_category": [ + "200" + ], + "filament_density": [ + "1.07" + ], + "filament_flow_ratio": [ + "0.92" + ], + "filament_max_volumetric_speed": [ + "16" + ], + "filament_type": [ + "ASA" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "hot_plate_temp": [ + "90" + ], + "impact_strength_z": [ + "4.9" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature": [ + "255" + ], + "overhang_fan_speed": [ + "80" + ], + "overhang_fan_threshold": [ + "25%" + ], + "pressure_advance": [ + "0.035" + ], + "slow_down_layer_time": [ + "4" + ], + "supertack_plate_temp_initial_layer": [ + "80" + ], + "supertack_plate_temp": [ + "80" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "textured_plate_temp": [ + "90" + ], + "textured_cool_plate_temp_initial_layer": [ + "80" + ], + "textured_cool_plate_temp": [ + "80" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ASA-Aero @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ASA-Aero @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..08a4ed22a9 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ASA-Aero @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "g5F7NP83yx0Iub4c", + "name": "QIDI ASA-Aero @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ASA-Aero@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ASA-Aero @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI ASA-Aero @X-Plus 5.json new file mode 100644 index 0000000000..14423fd58c --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ASA-Aero @X-Plus 5.json @@ -0,0 +1,126 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_19", + "name": "QIDI ASA-Aero@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "chamber_temperatures": [ + "60" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "80" + ], + "cool_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "eng_plate_temp": [ + "90" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "fan_cooling_layer_time": [ + "40" + ], + "fan_max_speed": [ + "50" + ], + "fan_min_speed": [ + "10" + ], + "filament_adhesiveness_category": [ + "200" + ], + "filament_density": [ + "1.03" + ], + "filament_flow_ratio": [ + "0.7" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "filament_retract_when_changing_layer": [ + "0" + ], + "filament_retraction_length": [ + "0.01" + ], + "filament_retraction_minimum_travel": [ + "0" + ], + "filament_type": [ + "ASA-AERO" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "hot_plate_temp": [ + "90" + ], + "filament_wipe": [ + "0" + ], + "filament_z_hop": [ + "0" + ], + "impact_strength_z": [ + "3.4" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature": [ + "260" + ], + "overhang_fan_speed": [ + "80" + ], + "overhang_fan_threshold": [ + "25%" + ], + "pressure_advance": [ + "0.021" + ], + "slow_down_layer_time": [ + "4" + ], + "supertack_plate_temp_initial_layer": [ + "80" + ], + "supertack_plate_temp": [ + "80" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "textured_plate_temp": [ + "90" + ], + "textured_cool_plate_temp_initial_layer": [ + "80" + ], + "textured_cool_plate_temp": [ + "80" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ASA-CF @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ASA-CF @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..be97fdfd58 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ASA-CF @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "Aqh00EJ8ZaiPCU6F", + "name": "QIDI ASA-CF @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ASA-CF@X-Plus 5-Series", + "pressure_advance": [ + "0.03" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ASA-CF @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ASA-CF @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..cd8bbc98bd --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ASA-CF @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "fgwkL5igRvM0leJf", + "name": "QIDI ASA-CF @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ASA-CF@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "13" + ], + "pressure_advance": [ + "0.014" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ASA-CF @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI ASA-CF @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..3095a16138 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ASA-CF @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "setting_id": "bDAcTzwdiXT4fFnT", + "name": "QIDI ASA-CF @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI ASA-CF@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "13" + ], + "pressure_advance": [ + "0.011" + ], + "slow_down_min_speed": [ + "10" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI ASA-CF @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI ASA-CF @X-Plus 5.json new file mode 100644 index 0000000000..9a8958c860 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI ASA-CF @X-Plus 5.json @@ -0,0 +1,111 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_20", + "name": "QIDI ASA-CF@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "chamber_temperatures": [ + "55" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "80" + ], + "cool_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "eng_plate_temp": [ + "90" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "fan_cooling_layer_time": [ + "35" + ], + "fan_max_speed": [ + "25" + ], + "fan_min_speed": [ + "10" + ], + "filament_adhesiveness_category": [ + "200" + ], + "filament_density": [ + "1.07" + ], + "filament_flow_ratio": [ + "0.9" + ], + "filament_max_volumetric_speed": [ + "18" + ], + "filament_type": [ + "ASA-CF" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "hot_plate_temp": [ + "90" + ], + "impact_strength_z": [ + "4.9" + ], + "nozzle_temperature_initial_layer": [ + "275" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "260" + ], + "nozzle_temperature": [ + "275" + ], + "overhang_fan_speed": [ + "80" + ], + "overhang_fan_threshold": [ + "25%" + ], + "pressure_advance": [ + "0.03" + ], + "slow_down_layer_time": [ + "12" + ], + "supertack_plate_temp_initial_layer": [ + "80" + ], + "supertack_plate_temp": [ + "80" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "textured_plate_temp": [ + "90" + ], + "textured_cool_plate_temp_initial_layer": [ + "80" + ], + "textured_cool_plate_temp": [ + "80" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PA12-CF @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PA12-CF @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..165c5cfb62 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PA12-CF @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "vDXAb7Kkj7nFc8go", + "name": "QIDI PA12-CF @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PA12-CF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PA12-CF @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PA12-CF @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..ad26af1f86 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PA12-CF @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "KjZ3jgo2Zoklkk0F", + "name": "QIDI PA12-CF @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PA12-CF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PA12-CF @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PA12-CF @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..5324f0c183 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PA12-CF @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "Xcl3UPe7tmXw9hXa", + "name": "QIDI PA12-CF @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PA12-CF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PA12-CF @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PA12-CF @X-Plus 5.json new file mode 100644 index 0000000000..3464bed9a3 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PA12-CF @X-Plus 5.json @@ -0,0 +1,111 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_27", + "name": "QIDI PA12-CF@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "65" + ], + "box_temperature_range_low": [ + "0" + ], + "box_temperature": [ + "55" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "fan_cooling_layer_time": [ + "10" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "20" + ], + "filament_adhesiveness_category": [ + "400" + ], + "filament_density": [ + "1.09" + ], + "filament_flow_ratio": [ + "0.96" + ], + "filament_max_volumetric_speed": [ + "8" + ], + "filament_type": [ + "PA12-CF" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "impact_strength_z": [ + "5.7" + ], + "nozzle_temperature_initial_layer": [ + "280" + ], + "nozzle_temperature_range_high": [ + "300" + ], + "nozzle_temperature_range_low": [ + "280" + ], + "nozzle_temperature": [ + "280" + ], + "overhang_fan_speed": [ + "40" + ], + "overhang_fan_threshold": [ + "0%" + ], + "pressure_advance": [ + "0.035" + ], + "slow_down_layer_time": [ + "5" + ], + "supertack_plate_temp_initial_layer": [ + "60" + ], + "supertack_plate_temp": [ + "60" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "textured_cool_plate_temp_initial_layer": [ + "60" + ], + "textured_cool_plate_temp": [ + "60" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PA6-CF @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PA6-CF @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..fbe5870078 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PA6-CF @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "qTjsP8oR1sbh56Gh", + "name": "QIDI PA6-CF @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PA6-CF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PA6-CF @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PA6-CF @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..016f9bb2e4 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PA6-CF @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "4kzkdzJmDYGic0aa", + "name": "QIDI PA6-CF @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PA6-CF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PA6-CF @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PA6-CF @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..ba0d981c29 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PA6-CF @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "97peVPSildpjdDQj", + "name": "QIDI PA6-CF @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PA6-CF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PA6-CF @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PA6-CF @X-Plus 5.json new file mode 100644 index 0000000000..9b6a66f61b --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PA6-CF @X-Plus 5.json @@ -0,0 +1,111 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_25", + "name": "QIDI PA6-CF@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "65" + ], + "box_temperature_range_low": [ + "0" + ], + "box_temperature": [ + "55" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "fan_cooling_layer_time": [ + "10" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "20" + ], + "filament_adhesiveness_category": [ + "400" + ], + "filament_density": [ + "1.09" + ], + "filament_flow_ratio": [ + "0.96" + ], + "filament_max_volumetric_speed": [ + "8" + ], + "filament_type": [ + "PA6-CF" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "impact_strength_z": [ + "5.7" + ], + "nozzle_temperature_initial_layer": [ + "280" + ], + "nozzle_temperature_range_high": [ + "300" + ], + "nozzle_temperature_range_low": [ + "280" + ], + "nozzle_temperature": [ + "280" + ], + "overhang_fan_speed": [ + "40" + ], + "overhang_fan_threshold": [ + "0%" + ], + "pressure_advance": [ + "0.035" + ], + "slow_down_layer_time": [ + "5" + ], + "supertack_plate_temp_initial_layer": [ + "60" + ], + "supertack_plate_temp": [ + "60" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "textured_cool_plate_temp_initial_layer": [ + "60" + ], + "textured_cool_plate_temp": [ + "60" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PAHT-CF @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PAHT-CF @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..68d604414d --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PAHT-CF @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "3iw5hq0KFa9NU4b3", + "name": "QIDI PAHT-CF @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PAHT-CF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PAHT-CF @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PAHT-CF @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..0ca7290e39 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PAHT-CF @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "7eBDjJbetxOC3aNT", + "name": "QIDI PAHT-CF @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PAHT-CF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PAHT-CF @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PAHT-CF @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..b3b88d5f28 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PAHT-CF @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "hkIpB0QZOGZpoYFX", + "name": "QIDI PAHT-CF @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PAHT-CF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PAHT-CF @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PAHT-CF @X-Plus 5.json new file mode 100644 index 0000000000..fcfccfe0f6 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PAHT-CF @X-Plus 5.json @@ -0,0 +1,111 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_30", + "name": "QIDI PAHT-CF@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "65" + ], + "box_temperature_range_low": [ + "0" + ], + "box_temperature": [ + "60" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "80" + ], + "cool_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "fan_cooling_layer_time": [ + "10" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "20" + ], + "filament_adhesiveness_category": [ + "400" + ], + "filament_density": [ + "1.2" + ], + "filament_flow_ratio": [ + "0.96" + ], + "filament_max_volumetric_speed": [ + "8" + ], + "filament_type": [ + "PAHT-CF" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "impact_strength_z": [ + "13.3" + ], + "nozzle_temperature_initial_layer": [ + "300" + ], + "nozzle_temperature_range_high": [ + "320" + ], + "nozzle_temperature_range_low": [ + "300" + ], + "nozzle_temperature": [ + "300" + ], + "overhang_fan_speed": [ + "40" + ], + "overhang_fan_threshold": [ + "0%" + ], + "pressure_advance": [ + "0.032" + ], + "slow_down_layer_time": [ + "5" + ], + "supertack_plate_temp_initial_layer": [ + "80" + ], + "supertack_plate_temp": [ + "80" + ], + "temperature_vitrification": [ + "180" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "textured_cool_plate_temp_initial_layer": [ + "80" + ], + "textured_cool_plate_temp": [ + "80" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PAHT-GF @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PAHT-GF @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..9638d33afc --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PAHT-GF @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "R7cctkITobdKgMkY", + "name": "QIDI PAHT-GF @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PAHT-GF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PAHT-GF @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PAHT-GF @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..4d926ff370 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PAHT-GF @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "cVzpHjaSzsDm0bwG", + "name": "QIDI PAHT-GF @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PAHT-GF@X-Plus 5-Series", + "pressure_advance": [ + "0.015" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PAHT-GF @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PAHT-GF @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..ce49e3ef04 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PAHT-GF @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "N0aUkpcJD6CvODci", + "name": "QIDI PAHT-GF @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PAHT-GF@X-Plus 5-Series", + "pressure_advance": [ + "0.01" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PAHT-GF @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PAHT-GF @X-Plus 5.json new file mode 100644 index 0000000000..3c0f1056ed --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PAHT-GF @X-Plus 5.json @@ -0,0 +1,111 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_31", + "name": "QIDI PAHT-GF@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "65" + ], + "box_temperature_range_low": [ + "0" + ], + "box_temperature": [ + "60" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "80" + ], + "cool_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "fan_cooling_layer_time": [ + "10" + ], + "fan_max_speed": [ + "20" + ], + "fan_min_speed": [ + "20" + ], + "filament_adhesiveness_category": [ + "400" + ], + "filament_density": [ + "1.27" + ], + "filament_flow_ratio": [ + "0.96" + ], + "filament_max_volumetric_speed": [ + "10" + ], + "filament_type": [ + "PAHT-GF" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "impact_strength_z": [ + "13.3" + ], + "nozzle_temperature_initial_layer": [ + "300" + ], + "nozzle_temperature_range_high": [ + "320" + ], + "nozzle_temperature_range_low": [ + "300" + ], + "nozzle_temperature": [ + "300" + ], + "overhang_fan_speed": [ + "40" + ], + "overhang_fan_threshold": [ + "0%" + ], + "pressure_advance": [ + "0.027" + ], + "slow_down_layer_time": [ + "5" + ], + "supertack_plate_temp_initial_layer": [ + "80" + ], + "supertack_plate_temp": [ + "80" + ], + "temperature_vitrification": [ + "180" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "textured_cool_plate_temp_initial_layer": [ + "80" + ], + "textured_cool_plate_temp": [ + "80" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PC-ABS-FR @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PC-ABS-FR @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..e4842206ed --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PC-ABS-FR @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "uYwbMiemSo7LxiqR", + "name": "QIDI PC/ABS-FR @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PC/ABS-FR@X-Plus 5-Series", + "pressure_advance": [ + "0.042" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PC-ABS-FR @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PC-ABS-FR @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..35c317e8d3 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PC-ABS-FR @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "Fxkv0PN8RU17fkB0", + "name": "QIDI PC/ABS-FR @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PC/ABS-FR@X-Plus 5-Series", + "pressure_advance": [ + "0.031" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PC-ABS-FR @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PC-ABS-FR @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..456a93a6d0 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PC-ABS-FR @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "oKNGzYqymTnWQsBB", + "name": "QIDI PC/ABS-FR @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PC/ABS-FR@X-Plus 5-Series", + "pressure_advance": [ + "0.024" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PC-ABS-FR @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PC-ABS-FR @X-Plus 5.json new file mode 100644 index 0000000000..b6c6fb3b64 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PC-ABS-FR @X-Plus 5.json @@ -0,0 +1,111 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_34", + "name": "QIDI PC/ABS-FR@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "50" + ], + "chamber_temperatures": [ + "55" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "65" + ], + "cool_plate_temp": [ + "65" + ], + "eng_plate_temp_initial_layer": [ + "100" + ], + "eng_plate_temp": [ + "100" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "10" + ], + "filament_adhesiveness_category": [ + "200" + ], + "filament_density": [ + "1.19" + ], + "filament_flow_ratio": [ + "0.92" + ], + "filament_max_volumetric_speed": [ + "8" + ], + "filament_type": [ + "PC-ABS-FR" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "hot_plate_temp": [ + "100" + ], + "impact_strength_z": [ + "8" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature": [ + "250" + ], + "overhang_fan_speed": [ + "90" + ], + "overhang_fan_threshold": [ + "75%" + ], + "pressure_advance": [ + "0.082" + ], + "slow_down_layer_time": [ + "4" + ], + "supertack_plate_temp_initial_layer": [ + "65" + ], + "supertack_plate_temp": [ + "65" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "100" + ], + "textured_plate_temp": [ + "100" + ], + "textured_cool_plate_temp_initial_layer": [ + "65" + ], + "textured_cool_plate_temp": [ + "65" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PEBA 95A @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PEBA 95A @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..5fa07706a9 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PEBA 95A @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "hgdi1oL4EFzh0h7h", + "name": "QIDI PEBA 95A @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PEBA 95A@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PEBA 95A @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PEBA 95A @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..f44261951e --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PEBA 95A @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "iNZpBz1iklW3sJlj", + "name": "QIDI PEBA 95A @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PEBA 95A@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PEBA 95A @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PEBA 95A @X-Plus 5.json new file mode 100644 index 0000000000..43410eabe1 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PEBA 95A @X-Plus 5.json @@ -0,0 +1,96 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_36", + "name": "QIDI PEBA 95A@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "cool_plate_temp_initial_layer": [ + "30" + ], + "cool_plate_temp": [ + "30" + ], + "eng_plate_temp_initial_layer": [ + "35" + ], + "eng_plate_temp": [ + "35" + ], + "fan_cooling_layer_time": [ + "100" + ], + "filament_adhesiveness_category": [ + "600" + ], + "filament_density": [ + "1.15" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_max_volumetric_speed": [ + "6" + ], + "filament_retraction_length": [ + "0.8" + ], + "filament_type": [ + "PEBA" + ], + "filament_vendor": [ + "QIDI" + ], + "filament_z_hop": [ + "0" + ], + "hot_plate_temp_initial_layer": [ + "35" + ], + "hot_plate_temp": [ + "35" + ], + "impact_strength_z": [ + "88.7" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_high": [ + "260" + ], + "nozzle_temperature_range_low": [ + "230" + ], + "nozzle_temperature": [ + "250" + ], + "pressure_advance": [ + "0.04" + ], + "slow_down_layer_time": [ + "14" + ], + "supertack_plate_temp_initial_layer": [ + "30" + ], + "supertack_plate_temp": [ + "30" + ], + "temperature_vitrification": [ + "30" + ], + "textured_plate_temp_initial_layer": [ + "35" + ], + "textured_plate_temp": [ + "35" + ], + "textured_cool_plate_temp_initial_layer": [ + "30" + ], + "textured_cool_plate_temp": [ + "30" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PET-CF @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PET-CF @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..bfdd1aed31 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PET-CF @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "bILtWMlzBPi4Ft8a", + "name": "QIDI PET-CF @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PET-CF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PET-CF @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PET-CF @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..cb78cf3afc --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PET-CF @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "E0Y6g3qpoERrgSUH", + "name": "QIDI PET-CF @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PET-CF@X-Plus 5-Series", + "pressure_advance": [ + "0.025" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PET-CF @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PET-CF @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..ae40d594ff --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PET-CF @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "e2HuHVJZck2nKANa", + "name": "QIDI PET-CF @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PET-CF@X-Plus 5-Series", + "pressure_advance": [ + "0.025" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PET-CF @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PET-CF @X-Plus 5.json new file mode 100644 index 0000000000..162cbec691 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PET-CF @X-Plus 5.json @@ -0,0 +1,111 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_37", + "name": "QIDI PET-CF@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "65" + ], + "box_temperature_range_low": [ + "0" + ], + "box_temperature": [ + "55" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "70" + ], + "cool_plate_temp": [ + "70" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "fan_cooling_layer_time": [ + "10" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "20" + ], + "filament_adhesiveness_category": [ + "800" + ], + "filament_density": [ + "1.3" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_max_volumetric_speed": [ + "8" + ], + "filament_type": [ + "PET-CF" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "impact_strength_z": [ + "4.5" + ], + "nozzle_temperature_initial_layer": [ + "280" + ], + "nozzle_temperature_range_high": [ + "320" + ], + "nozzle_temperature_range_low": [ + "280" + ], + "nozzle_temperature": [ + "280" + ], + "overhang_fan_speed": [ + "40" + ], + "overhang_fan_threshold": [ + "0%" + ], + "pressure_advance": [ + "0.032" + ], + "slow_down_layer_time": [ + "5" + ], + "temperature_vitrification": [ + "185" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "supertack_plate_temp_initial_layer": [ + "70" + ], + "supertack_plate_temp": [ + "70" + ], + "textured_cool_plate_temp_initial_layer": [ + "70" + ], + "textured_cool_plate_temp": [ + "70" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PET-GF @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PET-GF @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..97029aeb25 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PET-GF @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "2NHbKFmgDoN1oHlo", + "name": "QIDI PET-GF @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PET-GF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PET-GF @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PET-GF @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..480d13bb65 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PET-GF @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "cMlzOMKIIIro4H62", + "name": "QIDI PET-GF @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PET-GF@X-Plus 5-Series", + "pressure_advance": [ + "0.014" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PET-GF @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PET-GF @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..2cc0cfe2cb --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PET-GF @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "evxG7nCDQx2Y5UV5", + "name": "QIDI PET-GF @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PET-GF@X-Plus 5-Series", + "pressure_advance": [ + "0.01" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PET-GF @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PET-GF @X-Plus 5.json new file mode 100644 index 0000000000..84310856cc --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PET-GF @X-Plus 5.json @@ -0,0 +1,111 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_38", + "name": "QIDI PET-GF@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "50" + ], + "box_temperature_range_low": [ + "0" + ], + "box_temperature": [ + "50" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "70" + ], + "cool_plate_temp": [ + "70" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "fan_cooling_layer_time": [ + "10" + ], + "fan_max_speed": [ + "20" + ], + "fan_min_speed": [ + "20" + ], + "filament_adhesiveness_category": [ + "800" + ], + "filament_density": [ + "1.38" + ], + "filament_flow_ratio": [ + "0.97" + ], + "filament_max_volumetric_speed": [ + "10" + ], + "filament_type": [ + "PET-GF" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "impact_strength_z": [ + "4.5" + ], + "nozzle_temperature_initial_layer": [ + "300" + ], + "nozzle_temperature_range_high": [ + "320" + ], + "nozzle_temperature_range_low": [ + "280" + ], + "nozzle_temperature": [ + "300" + ], + "overhang_fan_speed": [ + "40" + ], + "overhang_fan_threshold": [ + "0%" + ], + "pressure_advance": [ + "0.022" + ], + "slow_down_layer_time": [ + "5" + ], + "supertack_plate_temp_initial_layer": [ + "70" + ], + "supertack_plate_temp": [ + "70" + ], + "temperature_vitrification": [ + "185" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "textured_cool_plate_temp_initial_layer": [ + "70" + ], + "textured_cool_plate_temp": [ + "70" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..6689cca71a --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "k4jOZFY5QV2bMKHK", + "name": "QIDI PETG Basic @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG Basic@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "1" + ], + "pressure_advance": [ + "0.054" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..c1b29f1b75 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "b55sLpGKCrWLiDPf", + "name": "QIDI PETG Basic @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG Basic@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..3be97a337f --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "XcxbsZ4d8Dh21WX0", + "name": "QIDI PETG Basic @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG Basic@X-Plus 5-Series", + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..92a57fb1b8 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Basic @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "9MEoOjLU7AOCvb9X", + "name": "QIDI PETG Basic @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG Basic@X-Plus 5-Series", + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Basic @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Basic @X-Plus 5.json new file mode 100644 index 0000000000..46810f49c3 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Basic @X-Plus 5.json @@ -0,0 +1,102 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_39", + "name": "QIDI PETG Basic@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "10" + ], + "filament_adhesiveness_category": [ + "300" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_type": [ + "PETG" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "impact_strength_z": [ + "10.6" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature": [ + "250" + ], + "overhang_fan_speed": [ + "90" + ], + "overhang_fan_threshold": [ + "10%" + ], + "pressure_advance": [ + "0.054" + ], + "slow_down_layer_time": [ + "12" + ], + "temperature_vitrification": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "supertack_plate_temp_initial_layer": [ + "60" + ], + "supertack_plate_temp": [ + "60" + ], + "textured_cool_plate_temp_initial_layer": [ + "60" + ], + "textured_cool_plate_temp": [ + "60" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..220a6ce55a --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "oi5JKM4fwEYHefs0", + "name": "QIDI PETG Rapido @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG Rapido@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "1" + ], + "pressure_advance": [ + "0.054" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..9fe3affac2 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "SZOwb16vrcdtaDzJ", + "name": "QIDI PETG Rapido @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG Rapido@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..a550919113 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "4LKxL4N0ccD6vZ60", + "name": "QIDI PETG Rapido @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG Rapido@X-Plus 5-Series", + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..b56b55d1ff --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "rsNDDt3IFUOMYV3O", + "name": "QIDI PETG Rapido @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG Rapido@X-Plus 5-Series", + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @X-Plus 5.json new file mode 100644 index 0000000000..fd506d8e74 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Rapido @X-Plus 5.json @@ -0,0 +1,102 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_41", + "name": "QIDI PETG Rapido@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "fan_cooling_layer_time": [ + "20" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "20" + ], + "filament_adhesiveness_category": [ + "300" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "18" + ], + "filament_type": [ + "PETG" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "impact_strength_z": [ + "10.6" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_high": [ + "275" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature": [ + "250" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "10%" + ], + "pressure_advance": [ + "0.054" + ], + "slow_down_layer_time": [ + "8" + ], + "temperature_vitrification": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "supertack_plate_temp_initial_layer": [ + "60" + ], + "supertack_plate_temp": [ + "60" + ], + "textured_cool_plate_temp_initial_layer": [ + "60" + ], + "textured_cool_plate_temp": [ + "60" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..7708ebba0d --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "k4kLQheLeWOw8bwp", + "name": "QIDI PETG Tough @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG Tough@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "1" + ], + "pressure_advance": [ + "0.056" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..5c8c182a2b --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "WEyrSDtW2CJeLQmg", + "name": "QIDI PETG Tough @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG Tough@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..ad75cc5722 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "Morgo6GIzU3Voc0Q", + "name": "QIDI PETG Tough @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG Tough@X-Plus 5-Series", + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..37c0beddb9 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Tough @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "DsoxBXKOjsENLEZf", + "name": "QIDI PETG Tough @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG Tough@X-Plus 5-Series", + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Tough @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Tough @X-Plus 5.json new file mode 100644 index 0000000000..3e9f0a1cdf --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Tough @X-Plus 5.json @@ -0,0 +1,102 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_40", + "name": "QIDI PETG Tough@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "10" + ], + "filament_adhesiveness_category": [ + "300" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "13" + ], + "filament_type": [ + "PETG" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "impact_strength_z": [ + "10.6" + ], + "nozzle_temperature_initial_layer": [ + "240" + ], + "nozzle_temperature_range_high": [ + "270" + ], + "nozzle_temperature_range_low": [ + "220" + ], + "nozzle_temperature": [ + "250" + ], + "overhang_fan_speed": [ + "90" + ], + "overhang_fan_threshold": [ + "10%" + ], + "pressure_advance": [ + "0.056" + ], + "slow_down_layer_time": [ + "8" + ], + "temperature_vitrification": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "supertack_plate_temp_initial_layer": [ + "60" + ], + "supertack_plate_temp": [ + "60" + ], + "textured_cool_plate_temp_initial_layer": [ + "60" + ], + "textured_cool_plate_temp": [ + "60" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..03e72feba9 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "2UJnG0rXeU2nCIQL", + "name": "QIDI PETG Translucent @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG Translucent@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "1" + ], + "pressure_advance": [ + "0.054" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..545bd42538 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "S2DQ7jy5KqbiVNnV", + "name": "QIDI PETG Translucent @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG Translucent@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..963916f76e --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "G33dlk73weGNFNwg", + "name": "QIDI PETG Translucent @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG Translucent@X-Plus 5-Series", + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..42bf38bde4 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "zqI9F8vplNFfm2pa", + "name": "QIDI PETG Translucent @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG Translucent@X-Plus 5-Series", + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @X-Plus 5.json new file mode 100644 index 0000000000..62ea937028 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG Translucent @X-Plus 5.json @@ -0,0 +1,102 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_45", + "name": "QIDI PETG Translucent@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "30" + ], + "fan_min_speed": [ + "10" + ], + "filament_adhesiveness_category": [ + "300" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "8" + ], + "filament_type": [ + "PETG" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "impact_strength_z": [ + "10.6" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature": [ + "250" + ], + "overhang_fan_speed": [ + "90" + ], + "overhang_fan_threshold": [ + "10%" + ], + "pressure_advance": [ + "0.054" + ], + "slow_down_layer_time": [ + "8" + ], + "temperature_vitrification": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "supertack_plate_temp_initial_layer": [ + "60" + ], + "supertack_plate_temp": [ + "60" + ], + "textured_cool_plate_temp_initial_layer": [ + "60" + ], + "textured_cool_plate_temp": [ + "60" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG-CF @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG-CF @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..04176974f5 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG-CF @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "cXbQtMQKmAFqwmqK", + "name": "QIDI PETG-CF @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG-CF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG-CF @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG-CF @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..ce16a13acf --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG-CF @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "YNIWSLXvW6kSPRFG", + "name": "QIDI PETG-CF @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG-CF@X-Plus 5-Series", + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG-CF @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG-CF @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..e1ce42ee0a --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG-CF @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "O0lwfGXO3BdPCask", + "name": "QIDI PETG-CF @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG-CF@X-Plus 5-Series", + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG-CF @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PETG-CF @X-Plus 5.json new file mode 100644 index 0000000000..fcddc636a8 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG-CF @X-Plus 5.json @@ -0,0 +1,102 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_42", + "name": "QIDI PETG-CF@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "5" + ], + "filament_adhesiveness_category": [ + "300" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "11.5" + ], + "filament_type": [ + "PETG-CF" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "impact_strength_z": [ + "10.6" + ], + "nozzle_temperature_initial_layer": [ + "255" + ], + "nozzle_temperature_range_high": [ + "270" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature": [ + "255" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "10%" + ], + "pressure_advance": [ + "0.048" + ], + "slow_down_layer_time": [ + "6" + ], + "temperature_vitrification": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "supertack_plate_temp_initial_layer": [ + "60" + ], + "supertack_plate_temp": [ + "60" + ], + "textured_cool_plate_temp_initial_layer": [ + "60" + ], + "textured_cool_plate_temp": [ + "60" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG-GF @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG-GF @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..46b3b1176a --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG-GF @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "zfI1VXQ7E0re78CC", + "name": "QIDI PETG-GF @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG-GF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG-GF @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG-GF @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..4af6b7db02 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG-GF @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "zYEbjZPipK4BgHRO", + "name": "QIDI PETG-GF @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG-GF@X-Plus 5-Series", + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG-GF @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PETG-GF @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..bf819e04a9 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG-GF @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "5ef246YwGEK0eVCr", + "name": "QIDI PETG-GF @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PETG-GF@X-Plus 5-Series", + "pressure_advance": [ + "0.04" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PETG-GF @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PETG-GF @X-Plus 5.json new file mode 100644 index 0000000000..fa65907d3d --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PETG-GF @X-Plus 5.json @@ -0,0 +1,102 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_43", + "name": "QIDI PETG-GF@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "45" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "50" + ], + "fan_min_speed": [ + "20" + ], + "filament_adhesiveness_category": [ + "300" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "8" + ], + "filament_type": [ + "PETG-GF" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "impact_strength_z": [ + "10.6" + ], + "nozzle_temperature_initial_layer": [ + "255" + ], + "nozzle_temperature_range_high": [ + "270" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature": [ + "255" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "10%" + ], + "pressure_advance": [ + "0.056" + ], + "slow_down_layer_time": [ + "8" + ], + "temperature_vitrification": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "supertack_plate_temp_initial_layer": [ + "60" + ], + "supertack_plate_temp": [ + "60" + ], + "textured_cool_plate_temp_initial_layer": [ + "60" + ], + "textured_cool_plate_temp": [ + "60" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..4ec7f05eb9 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "sfrpgBzPufKwgBCT", + "name": "QIDI PLA Basic @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Basic@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.034" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..20dd378bd2 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "6ZscfuWENwCkdSYE", + "name": "QIDI PLA Basic @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Basic@X-Plus 5-Series", + "pressure_advance": [ + "0.038" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..574e748c98 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "pEry2GMq8UJEw7c7", + "name": "QIDI PLA Basic @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Basic@X-Plus 5-Series", + "pressure_advance": [ + "0.016" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..527eb00054 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Basic @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "MTq8xcAKCWABLI2k", + "name": "QIDI PLA Basic @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Basic@X-Plus 5-Series", + "pressure_advance": [ + "0.008" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Basic @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Basic @X-Plus 5.json new file mode 100644 index 0000000000..0ee194dfb3 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Basic @X-Plus 5.json @@ -0,0 +1,63 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_7", + "name": "QIDI PLA Basic@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "cool_plate_temp_initial_layer": [ + "45" + ], + "cool_plate_temp": [ + "45" + ], + "filament_adhesiveness_category": [ + "100" + ], + "filament_max_volumetric_speed": [ + "18" + ], + "filament_type": [ + "PLA" + ], + "impact_strength_z": [ + "13.8" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_initial_layer": [ + "210" + ], + "nozzle_temperature": [ + "210" + ], + "overhang_fan_threshold": [ + "50%" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "supertack_plate_temp": [ + "45" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_cool_plate_temp": [ + "45" + ], + "compatible_printers": [], + "close_additional_fan_first_x_layers": [ + "1" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..0078600f36 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "54iiCCwizthHtT1v", + "name": "QIDI PLA Matte Basic @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Matte Basic@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.034" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..d67aa77dc4 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "ojnl8sBbBL4QBL8q", + "name": "QIDI PLA Matte Basic @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Matte Basic@X-Plus 5-Series", + "pressure_advance": [ + "0.038" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..6575396e45 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "XtZarwF2HIipdHjN", + "name": "QIDI PLA Matte Basic @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Matte Basic@X-Plus 5-Series", + "pressure_advance": [ + "0.016" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..8c4584a70b --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "TRkCNQeoDvLBaJMt", + "name": "QIDI PLA Matte Basic @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Matte Basic@X-Plus 5-Series", + "pressure_advance": [ + "0.008" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @X-Plus 5.json new file mode 100644 index 0000000000..7796bf1faa --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Matte Basic @X-Plus 5.json @@ -0,0 +1,63 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_8", + "name": "QIDI PLA Matte Basic@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "cool_plate_temp_initial_layer": [ + "45" + ], + "cool_plate_temp": [ + "45" + ], + "filament_adhesiveness_category": [ + "100" + ], + "filament_max_volumetric_speed": [ + "18" + ], + "filament_type": [ + "PLA" + ], + "impact_strength_z": [ + "13.8" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_initial_layer": [ + "210" + ], + "nozzle_temperature": [ + "210" + ], + "overhang_fan_threshold": [ + "50%" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "supertack_plate_temp": [ + "45" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_cool_plate_temp": [ + "45" + ], + "compatible_printers": [], + "close_additional_fan_first_x_layers": [ + "1" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..3ea3dac12f --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "S56TixVPmXr4uFut", + "name": "QIDI PLA Rapido @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Rapido@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.034" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..178fcfd08d --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "KATHrxoL84i7MiVJ", + "name": "QIDI PLA Rapido @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Rapido@X-Plus 5-Series", + "pressure_advance": [ + "0.038" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..2ad1d18a60 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "YE6WmGAG5Ua6bbap", + "name": "QIDI PLA Rapido @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Rapido@X-Plus 5-Series", + "pressure_advance": [ + "0.016" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..ffc9edfb78 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "KPqnbBv0Np93O02u", + "name": "QIDI PLA Rapido @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Rapido@X-Plus 5-Series", + "pressure_advance": [ + "0.008" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @X-Plus 5.json new file mode 100644 index 0000000000..1aa1803258 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido @X-Plus 5.json @@ -0,0 +1,60 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_1", + "name": "QIDI PLA Rapido@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "cool_plate_temp_initial_layer": [ + "45" + ], + "cool_plate_temp": [ + "45" + ], + "filament_adhesiveness_category": [ + "100" + ], + "filament_type": [ + "PLA" + ], + "impact_strength_z": [ + "13.8" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_initial_layer": [ + "210" + ], + "nozzle_temperature": [ + "210" + ], + "overhang_fan_threshold": [ + "50%" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "supertack_plate_temp": [ + "45" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_cool_plate_temp": [ + "45" + ], + "compatible_printers": [], + "close_additional_fan_first_x_layers": [ + "1" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..e469cf1fd1 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "jlUpp5oaYSWwaNn1", + "name": "QIDI PLA Rapido Matte @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Rapido Matte@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.034" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..3f74323770 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "E0gYAZUksoFlebuH", + "name": "QIDI PLA Rapido Matte @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Rapido Matte@X-Plus 5-Series", + "pressure_advance": [ + "0.034" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..f45479c37f --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "juxpaK6EosaHj2ok", + "name": "QIDI PLA Rapido Matte @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Rapido Matte@X-Plus 5-Series", + "pressure_advance": [ + "0.016" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..7e4ec99248 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "OlgI3WQA3QLhPsdw", + "name": "QIDI PLA Rapido Matte @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Rapido Matte@X-Plus 5-Series", + "pressure_advance": [ + "0.008" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @X-Plus 5.json new file mode 100644 index 0000000000..d8cbd06ea1 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Matte @X-Plus 5.json @@ -0,0 +1,57 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_2", + "name": "QIDI PLA Rapido Matte@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "additional_cooling_fan_speed": [ + "100" + ], + "filament_adhesiveness_category": [ + "100" + ], + "filament_density": [ + "1.42" + ], + "filament_type": [ + "PLA" + ], + "impact_strength_z": [ + "6.6" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_initial_layer": [ + "210" + ], + "nozzle_temperature": [ + "210" + ], + "overhang_fan_threshold": [ + "50%" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "supertack_plate_temp": [ + "45" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_cool_plate_temp": [ + "45" + ], + "compatible_printers": [], + "close_additional_fan_first_x_layers": [ + "1" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..7506c80541 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "t9qUv1IlI5VJ8LoV", + "name": "QIDI PLA Rapido Metal @Qidi X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Rapido Metal@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.038" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..e2be1216f3 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "ARcrUoVsGSM0RB1a", + "name": "QIDI PLA Rapido Metal @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Rapido Metal@X-Plus 5-Series", + "pressure_advance": [ + "0.038" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..2b3fae0a1e --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "A23HjUFAyt4GeHAW", + "name": "QIDI PLA Rapido Metal @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Rapido Metal@X-Plus 5-Series", + "pressure_advance": [ + "0.020" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..e6868b6772 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "nMpSP1jmsQIUjGPb", + "name": "QIDI PLA Rapido Metal @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Rapido Metal@X-Plus 5-Series", + "pressure_advance": [ + "0.01" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @X-Plus 5.json new file mode 100644 index 0000000000..404b7cd1e8 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Rapido Metal @X-Plus 5.json @@ -0,0 +1,57 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_3", + "name": "QIDI PLA Rapido Metal@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "filament_type": [ + "PLA" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "filament_adhesiveness_category": [ + "100" + ], + "filament_density": [ + "1.20" + ], + "impact_strength_z": [ + "16.8" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_initial_layer": [ + "210" + ], + "nozzle_temperature": [ + "210" + ], + "overhang_fan_threshold": [ + "50%" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "supertack_plate_temp": [ + "45" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_cool_plate_temp": [ + "45" + ], + "compatible_printers": [], + "close_additional_fan_first_x_layers": [ + "1" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Silk @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Silk @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..dfd789a216 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Silk @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "IUU7TApRivYtrrt0", + "name": "QIDI PLA Silk @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Silk@X-Plus 5-Series", + "pressure_advance": [ + "0.034" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Silk @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Silk @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..286c1d3a36 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Silk @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "lx9Dqv6EMmZ0C2SD", + "name": "QIDI PLA Silk @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA Silk@X-Plus 5-Series", + "pressure_advance": [ + "0.021" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA Silk @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PLA Silk @X-Plus 5.json new file mode 100644 index 0000000000..57c0c3e1dc --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA Silk @X-Plus 5.json @@ -0,0 +1,84 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_4", + "name": "QIDI PLA Silk@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "additional_cooling_fan_speed": [ + "100" + ], + "filament_adhesiveness_category": [ + "100" + ], + "filament_density": [ + "1.24" + ], + "filament_max_volumetric_speed": [ + "7.5" + ], + "filament_type": [ + "PLA" + ], + "impact_strength_z": [ + "4.6" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature": [ + "220" + ], + "overhang_fan_threshold": [ + "50%" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "supertack_plate_temp": [ + "45" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "cool_plate_temp": [ + "45" + ], + "eng_plate_temp_initial_layer": [ + "55" + ], + "eng_plate_temp": [ + "55" + ], + "hot_plate_temp_initial_layer": [ + "55" + ], + "hot_plate_temp": [ + "55" + ], + "textured_plate_temp_initial_layer": [ + "55" + ], + "textured_plate_temp": [ + "55" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_cool_plate_temp": [ + "45" + ], + "compatible_printers": [], + "close_additional_fan_first_x_layers": [ + "1" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA-CF @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA-CF @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..c341f7c71d --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA-CF @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "5PocTwpY0SnNzcdc", + "name": "QIDI PLA-CF @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA-CF@X-Plus 5-Series", + "pressure_advance": [ + "0.034" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA-CF @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA-CF @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..5c08e7f67f --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA-CF @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "5NETSLSQlaoR2MYD", + "name": "QIDI PLA-CF @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA-CF@X-Plus 5-Series", + "pressure_advance": [ + "0.012" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA-CF @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PLA-CF @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..7435222e8b --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA-CF @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "setting_id": "AUO7iSMEa6GDvM7Y", + "name": "QIDI PLA-CF @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PLA-CF@X-Plus 5-Series", + "filament_max_volumetric_speed": [ + "18" + ], + "pressure_advance": [ + "0.008" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PLA-CF @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PLA-CF @X-Plus 5.json new file mode 100644 index 0000000000..1c4d8c99e3 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PLA-CF @X-Plus 5.json @@ -0,0 +1,75 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_5", + "name": "QIDI PLA-CF@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "additional_cooling_fan_speed": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "cool_plate_temp": [ + "45" + ], + "filament_adhesiveness_category": [ + "100" + ], + "filament_density": [ + "1.25" + ], + "filament_flow_ratio": [ + "0.93" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_type": [ + "PLA-CF" + ], + "impact_strength_z": [ + "7.8" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "250" + ], + "nozzle_temperature_range_low": [ + "210" + ], + "nozzle_temperature": [ + "220" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "pressure_advance": [ + "0.042" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "supertack_plate_temp": [ + "45" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_cool_plate_temp": [ + "45" + ], + "compatible_printers": [], + "close_additional_fan_first_x_layers": [ + "1" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PPS-CF @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PPS-CF @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..2c2d573713 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PPS-CF @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "FwWut7sJIMbe87XC", + "name": "QIDI PPS-CF @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PPS-CF@X-Plus 5-Series", + "pressure_advance": [ + "0.03" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PPS-CF @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PPS-CF @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..9cc0556490 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PPS-CF @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "gDIuKCdgoP59Xc0G", + "name": "QIDI PPS-CF @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PPS-CF@X-Plus 5-Series", + "pressure_advance": [ + "0.021" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PPS-CF @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PPS-CF @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..573f8e17f8 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PPS-CF @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "D29sGCB9OI4cTn0S", + "name": "QIDI PPS-CF @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PPS-CF@X-Plus 5-Series", + "pressure_advance": [ + "0.008" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PPS-CF @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PPS-CF @X-Plus 5.json new file mode 100644 index 0000000000..c6be7046f6 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PPS-CF @X-Plus 5.json @@ -0,0 +1,117 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_44", + "name": "QIDI PPS-CF@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "65" + ], + "box_temperature_range_low": [ + "0" + ], + "box_temperature": [ + "65" + ], + "chamber_temperatures": [ + "60" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "80" + ], + "cool_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "110" + ], + "eng_plate_temp": [ + "110" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "fan_cooling_layer_time": [ + "5" + ], + "fan_max_speed": [ + "30" + ], + "fan_min_speed": [ + "0" + ], + "filament_adhesiveness_category": [ + "801" + ], + "filament_density": [ + "1.3" + ], + "filament_flow_ratio": [ + "0.97" + ], + "filament_max_volumetric_speed": [ + "6" + ], + "filament_type": [ + "PPS-CF" + ], + "hot_plate_temp_initial_layer": [ + "110" + ], + "hot_plate_temp": [ + "110" + ], + "impact_strength_z": [ + "2.8" + ], + "nozzle_temperature_initial_layer": [ + "320" + ], + "nozzle_temperature_range_high": [ + "350" + ], + "nozzle_temperature_range_low": [ + "300" + ], + "nozzle_temperature": [ + "320" + ], + "overhang_fan_speed": [ + "40" + ], + "overhang_fan_threshold": [ + "0%" + ], + "pressure_advance": [ + "0.032" + ], + "slow_down_layer_time": [ + "2" + ], + "supertack_plate_temp_initial_layer": [ + "80" + ], + "supertack_plate_temp": [ + "80" + ], + "temperature_vitrification": [ + "180" + ], + "textured_plate_temp_initial_layer": [ + "110" + ], + "textured_plate_temp": [ + "110" + ], + "textured_cool_plate_temp_initial_layer": [ + "80" + ], + "textured_cool_plate_temp": [ + "80" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PPS-GF @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PPS-GF @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..de96ad5f7a --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PPS-GF @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "5C6dIIgQOt4NiTu0", + "name": "QIDI PPS-GF @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PPS-GF@X-Plus 5-Series", + "pressure_advance": [ + "0.03" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PPS-GF @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PPS-GF @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..470839ef59 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PPS-GF @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "aSd6UW4Mrlxpa15E", + "name": "QIDI PPS-GF @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PPS-GF@X-Plus 5-Series", + "pressure_advance": [ + "0.021" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PPS-GF @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI PPS-GF @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..6cc49dbd68 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PPS-GF @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "7JC2zAUgtGu5zSGo", + "name": "QIDI PPS-GF @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI PPS-GF@X-Plus 5-Series", + "pressure_advance": [ + "0.008" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI PPS-GF @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI PPS-GF @X-Plus 5.json new file mode 100644 index 0000000000..757d4dbf3d --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI PPS-GF @X-Plus 5.json @@ -0,0 +1,117 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_46", + "name": "QIDI PPS-GF@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "65" + ], + "box_temperature_range_low": [ + "0" + ], + "box_temperature": [ + "65" + ], + "chamber_temperatures": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "80" + ], + "cool_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "eng_plate_temp": [ + "90" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "90" + ], + "fan_min_speed": [ + "10" + ], + "filament_adhesiveness_category": [ + "801" + ], + "filament_density": [ + "1.3" + ], + "filament_flow_ratio": [ + "0.97" + ], + "filament_max_volumetric_speed": [ + "10" + ], + "filament_type": [ + "PPS-GF" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "hot_plate_temp": [ + "90" + ], + "impact_strength_z": [ + "2.8" + ], + "nozzle_temperature_initial_layer": [ + "320" + ], + "nozzle_temperature_range_high": [ + "350" + ], + "nozzle_temperature_range_low": [ + "300" + ], + "nozzle_temperature": [ + "320" + ], + "overhang_fan_speed": [ + "50" + ], + "overhang_fan_threshold": [ + "0%" + ], + "pressure_advance": [ + "0.03" + ], + "slow_down_layer_time": [ + "6" + ], + "supertack_plate_temp_initial_layer": [ + "80" + ], + "supertack_plate_temp": [ + "80" + ], + "temperature_vitrification": [ + "180" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "textured_plate_temp": [ + "90" + ], + "textured_cool_plate_temp_initial_layer": [ + "80" + ], + "textured_cool_plate_temp": [ + "80" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI Support For PAHT @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI Support For PAHT @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..5bd3b85fb9 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI Support For PAHT @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "oMvDD9rKJGcezwpq", + "name": "QIDI Support For PAHT @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI Support For PAHT@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI Support For PAHT @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI Support For PAHT @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..37f474533e --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI Support For PAHT @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "6BhbbuUP6HCVScDd", + "name": "QIDI Support For PAHT @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI Support For PAHT@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI Support For PAHT @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI Support For PAHT @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..f28e56c5b1 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI Support For PAHT @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "kA4fvvj6xZEhArXv", + "name": "QIDI Support For PAHT @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI Support For PAHT@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI Support For PAHT @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI Support For PAHT @X-Plus 5.json new file mode 100644 index 0000000000..ed1222daa9 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI Support For PAHT @X-Plus 5.json @@ -0,0 +1,114 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_32", + "name": "QIDI Support For PAHT@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "65" + ], + "box_temperature_range_low": [ + "0" + ], + "box_temperature": [ + "60" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "80" + ], + "cool_plate_temp": [ + "80" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "fan_cooling_layer_time": [ + "10" + ], + "fan_max_speed": [ + "60" + ], + "fan_min_speed": [ + "0" + ], + "filament_adhesiveness_category": [ + "800" + ], + "filament_density": [ + "1.26" + ], + "filament_flow_ratio": [ + "0.94" + ], + "filament_is_support": [ + "1" + ], + "filament_max_volumetric_speed": [ + "8" + ], + "filament_type": [ + "PAHT-S" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "impact_strength_z": [ + "4.5" + ], + "nozzle_temperature_initial_layer": [ + "280" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "260" + ], + "nozzle_temperature": [ + "280" + ], + "overhang_fan_speed": [ + "30" + ], + "overhang_fan_threshold": [ + "95%" + ], + "pressure_advance": [ + "0.02" + ], + "slow_down_layer_time": [ + "6" + ], + "temperature_vitrification": [ + "218" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "supertack_plate_temp_initial_layer": [ + "80" + ], + "supertack_plate_temp": [ + "80" + ], + "textured_cool_plate_temp_initial_layer": [ + "80" + ], + "textured_cool_plate_temp": [ + "80" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI Support For PET-PA @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI Support For PET-PA @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..615d9af041 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI Support For PET-PA @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "0xy82KbAJD5uBara", + "name": "QIDI Support For PET/PA @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI Support For PET/PA@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI Support For PET-PA @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI Support For PET-PA @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..1e0c81424c --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI Support For PET-PA @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "2oCGYFdC4dfpNUw4", + "name": "QIDI Support For PET/PA @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI Support For PET/PA@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI Support For PET-PA @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI Support For PET-PA @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..2d47d18707 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI Support For PET-PA @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "hFYahJkYIgmjcuPb", + "name": "QIDI Support For PET/PA @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI Support For PET/PA@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI Support For PET-PA @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI Support For PET-PA @X-Plus 5.json new file mode 100644 index 0000000000..346c3cc3eb --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI Support For PET-PA @X-Plus 5.json @@ -0,0 +1,114 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_33", + "name": "QIDI Support For PET/PA@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "65" + ], + "box_temperature_range_low": [ + "0" + ], + "box_temperature": [ + "55" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "70" + ], + "cool_plate_temp": [ + "70" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "fan_cooling_layer_time": [ + "10" + ], + "fan_max_speed": [ + "60" + ], + "fan_min_speed": [ + "0" + ], + "filament_adhesiveness_category": [ + "800" + ], + "filament_density": [ + "1.16" + ], + "filament_flow_ratio": [ + "0.91" + ], + "filament_is_support": [ + "1" + ], + "filament_max_volumetric_speed": [ + "8" + ], + "filament_type": [ + "PA-S" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "impact_strength_z": [ + "4.5" + ], + "nozzle_temperature_initial_layer": [ + "280" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "260" + ], + "nozzle_temperature": [ + "280" + ], + "overhang_fan_speed": [ + "30" + ], + "overhang_fan_threshold": [ + "95%" + ], + "pressure_advance": [ + "0.02" + ], + "slow_down_layer_time": [ + "6" + ], + "temperature_vitrification": [ + "168" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "supertack_plate_temp_initial_layer": [ + "70" + ], + "supertack_plate_temp": [ + "70" + ], + "textured_cool_plate_temp_initial_layer": [ + "70" + ], + "textured_cool_plate_temp": [ + "70" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI TPU 95A-HF @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI TPU 95A-HF @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..1f2db1eb25 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI TPU 95A-HF @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "ygLg4KVojo7YoG5K", + "name": "QIDI TPU 95A-HF @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI TPU 95A-HF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI TPU 95A-HF @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI TPU 95A-HF @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..94e992d0e9 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI TPU 95A-HF @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "K98nPXclatc5HnIx", + "name": "QIDI TPU 95A-HF @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI TPU 95A-HF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI TPU 95A-HF @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI TPU 95A-HF @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..e05faeed65 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI TPU 95A-HF @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "pTxBir6QC9KhWrLU", + "name": "QIDI TPU 95A-HF @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI TPU 95A-HF@X-Plus 5-Series", + "nozzle_temperature": [ + "220" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI TPU 95A-HF @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI TPU 95A-HF @X-Plus 5.json new file mode 100644 index 0000000000..4721ab171c --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI TPU 95A-HF @X-Plus 5.json @@ -0,0 +1,84 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_50", + "name": "QIDI TPU 95A-HF@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "cool_plate_temp_initial_layer": [ + "30" + ], + "cool_plate_temp": [ + "30" + ], + "eng_plate_temp_initial_layer": [ + "35" + ], + "eng_plate_temp": [ + "35" + ], + "filament_adhesiveness_category": [ + "600" + ], + "filament_density": [ + "1.15" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_max_volumetric_speed": [ + "4" + ], + "filament_type": [ + "TPU" + ], + "filament_vendor": [ + "QIDI" + ], + "hot_plate_temp_initial_layer": [ + "35" + ], + "hot_plate_temp": [ + "35" + ], + "impact_strength_z": [ + "88.7" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "nozzle_temperature_range_high": [ + "250" + ], + "nozzle_temperature_range_low": [ + "200" + ], + "nozzle_temperature": [ + "230" + ], + "pressure_advance": [ + "0.1" + ], + "supertack_plate_temp_initial_layer": [ + "30" + ], + "supertack_plate_temp": [ + "30" + ], + "temperature_vitrification": [ + "30" + ], + "textured_plate_temp_initial_layer": [ + "35" + ], + "textured_plate_temp": [ + "35" + ], + "textured_cool_plate_temp_initial_layer": [ + "30" + ], + "textured_cool_plate_temp": [ + "30" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI TPU-Aero @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI TPU-Aero @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..592ad5a51c --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI TPU-Aero @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "KIIwoI87n5MkT83b", + "name": "QIDI TPU-Aero @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI TPU-Aero@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI TPU-Aero @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI TPU-Aero @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..f18b67f608 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI TPU-Aero @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "eUNygrv7weqgX7e0", + "name": "QIDI TPU-Aero @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI TPU-Aero@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI TPU-Aero @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI TPU-Aero @X-Plus 5.json new file mode 100644 index 0000000000..b6eee90916 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI TPU-Aero @X-Plus 5.json @@ -0,0 +1,93 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_49", + "name": "QIDI TPU-Aero@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "cool_plate_temp_initial_layer": [ + "30" + ], + "cool_plate_temp": [ + "30" + ], + "eng_plate_temp_initial_layer": [ + "35" + ], + "eng_plate_temp": [ + "35" + ], + "fan_cooling_layer_time": [ + "100" + ], + "filament_adhesiveness_category": [ + "600" + ], + "filament_density": [ + "1.15" + ], + "filament_flow_ratio": [ + "0.5" + ], + "filament_max_volumetric_speed": [ + "6" + ], + "filament_retraction_length": [ + "0" + ], + "filament_type": [ + "TPU-AERO" + ], + "filament_vendor": [ + "QIDI" + ], + "hot_plate_temp_initial_layer": [ + "35" + ], + "hot_plate_temp": [ + "35" + ], + "impact_strength_z": [ + "88.7" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_high": [ + "270" + ], + "nozzle_temperature_range_low": [ + "230" + ], + "nozzle_temperature": [ + "250" + ], + "pressure_advance": [ + "0.03" + ], + "slow_down_layer_time": [ + "14" + ], + "supertack_plate_temp_initial_layer": [ + "30" + ], + "supertack_plate_temp": [ + "30" + ], + "temperature_vitrification": [ + "30" + ], + "textured_plate_temp_initial_layer": [ + "35" + ], + "textured_plate_temp": [ + "35" + ], + "textured_cool_plate_temp_initial_layer": [ + "30" + ], + "textured_cool_plate_temp": [ + "30" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI TPU-GF @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI TPU-GF @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..8e88b23151 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI TPU-GF @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "AtsowCGhOIw4GeRJ", + "name": "QIDI TPU-GF @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI TPU-GF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI TPU-GF @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI TPU-GF @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..5a7687b51c --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI TPU-GF @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "wqk4I1KaRyLEm12W", + "name": "QIDI TPU-GF @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI TPU-GF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI TPU-GF @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI TPU-GF @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..2fe800d6ab --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI TPU-GF @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "o2JjRsoi03ST3Wh2", + "name": "QIDI TPU-GF @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI TPU-GF@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI TPU-GF @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI TPU-GF @X-Plus 5.json new file mode 100644 index 0000000000..b3f2f71866 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI TPU-GF @X-Plus 5.json @@ -0,0 +1,84 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_15", + "name": "QIDI TPU-GF@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "cool_plate_temp_initial_layer": [ + "30" + ], + "cool_plate_temp": [ + "30" + ], + "eng_plate_temp_initial_layer": [ + "35" + ], + "eng_plate_temp": [ + "35" + ], + "filament_adhesiveness_category": [ + "600" + ], + "filament_density": [ + "1.15" + ], + "filament_flow_ratio": [ + "1" + ], + "filament_max_volumetric_speed": [ + "6" + ], + "filament_type": [ + "TPU-GF" + ], + "filament_vendor": [ + "QIDI" + ], + "hot_plate_temp_initial_layer": [ + "35" + ], + "hot_plate_temp": [ + "35" + ], + "impact_strength_z": [ + "88.7" + ], + "nozzle_temperature_initial_layer": [ + "240" + ], + "nozzle_temperature_range_high": [ + "270" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature": [ + "240" + ], + "pressure_advance": [ + "0.1" + ], + "supertack_plate_temp_initial_layer": [ + "30" + ], + "supertack_plate_temp": [ + "30" + ], + "temperature_vitrification": [ + "30" + ], + "textured_plate_temp_initial_layer": [ + "35" + ], + "textured_plate_temp": [ + "35" + ], + "textured_cool_plate_temp_initial_layer": [ + "30" + ], + "textured_cool_plate_temp": [ + "30" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI UltraPA @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI UltraPA @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..ae7b99531e --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI UltraPA @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "RzZGtHGu2xKASwwu", + "name": "QIDI UltraPA @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI UltraPA@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI UltraPA @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI UltraPA @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..e9bfbe4362 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI UltraPA @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "0seF33ojhYF6lNM4", + "name": "QIDI UltraPA @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI UltraPA@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI UltraPA @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI UltraPA @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..6f03ff7b5a --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI UltraPA @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "vfr7Lv94OHi4KOCw", + "name": "QIDI UltraPA @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI UltraPA@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI UltraPA @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI UltraPA @X-Plus 5.json new file mode 100644 index 0000000000..9d86c06f95 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI UltraPA @X-Plus 5.json @@ -0,0 +1,99 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_24", + "name": "QIDI UltraPA@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "55" + ], + "box_temperature_range_low": [ + "0" + ], + "box_temperature": [ + "55" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "20" + ], + "filament_adhesiveness_category": [ + "400" + ], + "filament_density": [ + "1.21" + ], + "filament_flow_ratio": [ + "0.96" + ], + "filament_max_volumetric_speed": [ + "4" + ], + "filament_type": [ + "UltraPA" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "impact_strength_z": [ + "15.5" + ], + "nozzle_temperature_initial_layer": [ + "280" + ], + "nozzle_temperature_range_high": [ + "290" + ], + "nozzle_temperature_range_low": [ + "250" + ], + "nozzle_temperature": [ + "280" + ], + "pressure_advance": [ + "0.03" + ], + "slow_down_layer_time": [ + "15" + ], + "supertack_plate_temp_initial_layer": [ + "60" + ], + "supertack_plate_temp": [ + "60" + ], + "temperature_vitrification": [ + "170" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "textured_cool_plate_temp_initial_layer": [ + "60" + ], + "textured_cool_plate_temp": [ + "60" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI UltraPA-CF25 @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI UltraPA-CF25 @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..c88635f447 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI UltraPA-CF25 @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "setting_id": "8h1ITuLzHYf0J4NA", + "name": "QIDI UltraPA-CF25 @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI UltraPA-CF25@X-Plus 5-Series", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI UltraPA-CF25 @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI UltraPA-CF25 @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..66ac797bb8 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI UltraPA-CF25 @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "WK63qDyLkG4fznPW", + "name": "QIDI UltraPA-CF25 @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI UltraPA-CF25@X-Plus 5-Series", + "pressure_advance": [ + "0.022" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI UltraPA-CF25 @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI UltraPA-CF25 @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..282fed912a --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI UltraPA-CF25 @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "53sirpAAiDOx0c8P", + "name": "QIDI UltraPA-CF25 @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI UltraPA-CF25@X-Plus 5-Series", + "pressure_advance": [ + "0.02" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI UltraPA-CF25 @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI UltraPA-CF25 @X-Plus 5.json new file mode 100644 index 0000000000..73379541b3 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI UltraPA-CF25 @X-Plus 5.json @@ -0,0 +1,114 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_26", + "name": "QIDI UltraPA-CF25@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "box_temperature_range_high": [ + "65" + ], + "box_temperature_range_low": [ + "0" + ], + "box_temperature": [ + "60" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "80" + ], + "eng_plate_temp": [ + "80" + ], + "during_print_exhaust_fan_speed": [ + "0" + ], + "fan_cooling_layer_time": [ + "5" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "20" + ], + "filament_adhesiveness_category": [ + "400" + ], + "filament_density": [ + "1.23" + ], + "filament_flow_ratio": [ + "0.94" + ], + "filament_max_volumetric_speed": [ + "8" + ], + "filament_type": [ + "UltraPA-CF25" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "hot_plate_temp": [ + "80" + ], + "impact_strength_z": [ + "15.5" + ], + "nozzle_temperature_initial_layer": [ + "300" + ], + "nozzle_temperature_range_high": [ + "320" + ], + "nozzle_temperature_range_low": [ + "300" + ], + "nozzle_temperature": [ + "300" + ], + "overhang_fan_speed": [ + "40" + ], + "overhang_fan_threshold": [ + "0%" + ], + "pressure_advance": [ + "0.026" + ], + "slow_down_layer_time": [ + "2" + ], + "supertack_plate_temp_initial_layer": [ + "60" + ], + "supertack_plate_temp": [ + "60" + ], + "temperature_vitrification": [ + "230" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "textured_cool_plate_temp_initial_layer": [ + "60" + ], + "textured_cool_plate_temp": [ + "60" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI WOOD Rapido @Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI WOOD Rapido @Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..2232226b78 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI WOOD Rapido @Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "gIumq0YfeZrNDTZt", + "name": "QIDI WOOD Rapido @Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI WOOD Rapido@X-Plus 5-Series", + "pressure_advance": [ + "0.044" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI WOOD Rapido @Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI WOOD Rapido @Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..b9ecf201ba --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI WOOD Rapido @Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "qUjZ8AUjivOk8uCf", + "name": "QIDI WOOD Rapido @Qidi X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI WOOD Rapido@X-Plus 5-Series", + "pressure_advance": [ + "0.024" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI WOOD Rapido @Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/filament/X5/QIDI WOOD Rapido @Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..fc15698443 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI WOOD Rapido @Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "A2kztfG9PA7Qxh7r", + "name": "QIDI WOOD Rapido @Qidi X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "QIDI WOOD Rapido@X-Plus 5-Series", + "pressure_advance": [ + "0.012" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/X5/QIDI WOOD Rapido @X-Plus 5.json b/resources/profiles/Qidi/filament/X5/QIDI WOOD Rapido @X-Plus 5.json new file mode 100644 index 0000000000..30428c7422 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/QIDI WOOD Rapido @X-Plus 5.json @@ -0,0 +1,66 @@ +{ + "type": "filament", + "filament_id": "QD_4_1_6", + "name": "QIDI WOOD Rapido@X-Plus 5-Series", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_x5_common", + "additional_cooling_fan_speed": [ + "100" + ], + "box_temperature_range_high": [ + "45" + ], + "filament_adhesiveness_category": [ + "100" + ], + "filament_density": [ + "1.23" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "18" + ], + "filament_type": [ + "PLA" + ], + "impact_strength_z": [ + "5.6" + ], + "nozzle_temperature_range_high": [ + "220" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_initial_layer": [ + "210" + ], + "nozzle_temperature": [ + "210" + ], + "overhang_fan_threshold": [ + "50%" + ], + "pressure_advance": [ + "0.044" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "supertack_plate_temp": [ + "45" + ], + "temperature_vitrification": [ + "45" + ], + "textured_cool_plate_temp_initial_layer": [ + "45" + ], + "textured_cool_plate_temp": [ + "45" + ], + "compatible_printers": [] +} diff --git a/resources/profiles/Qidi/filament/X5/fdm_filament_x5_common.json b/resources/profiles/Qidi/filament/X5/fdm_filament_x5_common.json new file mode 100644 index 0000000000..a161158dc4 --- /dev/null +++ b/resources/profiles/Qidi/filament/X5/fdm_filament_x5_common.json @@ -0,0 +1,255 @@ +{ + "type": "filament", + "name": "fdm_filament_x5_common", + "from": "system", + "instantiation": "false", + "activate_air_filtration": [ + "1" + ], + "additional_cooling_fan_speed": [ + "0" + ], + "additional_fan_full_speed_layer": [ + "0" + ], + "bed_type": [ + "Cool Plate" + ], + "box_temperature_range_high": [ + "0" + ], + "box_temperature_range_low": [ + "0" + ], + "box_temperature": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "close_additional_fan_first_x_layers": [ + "3" + ], + "complete_print_exhaust_fan_speed": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "45" + ], + "cool_plate_temp": [ + "45" + ], + "during_print_exhaust_fan_speed": [ + "100" + ], + "enable_pressure_advance": [ + "1" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "eng_plate_temp": [ + "60" + ], + "fan_cooling_layer_time": [ + "60" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cost": [ + "0" + ], + "filament_cooling_before_tower": [ + "0" + ], + "filament_tower_interface_pre_extrusion_dist": [ + "10" + ], + "filament_tower_interface_pre_extrusion_length": [ + "0" + ], + "filament_tower_ironing_area": [ + "4" + ], + "filament_tower_interface_purge_volume": [ + "20" + ], + "filament_tower_interface_print_temp": [ + "-1" + ], + "filament_density": [ + "1.24" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_dev_ams_drying_ams_limitations": [ + "1" + ], + "filament_dev_ams_drying_temperature": [ + "40.0", + "40.0", + "40.0", + "40.0" + ], + "filament_dev_ams_drying_time": [ + "8.0", + "8.0", + "8.0", + "8.0" + ], + "filament_dev_drying_softening_temperature": [ + "40.0" + ], + "filament_dev_ams_drying_heat_distortion_temperature": [ + "45.0" + ], + "filament_dev_drying_cooling_temperature": [ + "35.0" + ], + "filament_dev_chamber_drying_bed_temperature": [ + "90.0" + ], + "filament_dev_chamber_drying_time": [ + "12.0" + ], + "filament_diameter": [ + "1.75" + ], + "filament_end_gcode": [ + "; Filament-specific end gcode \n;END gcode for filament" + ], + "filament_extruder_compatibility": [ + "0" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_flush_temp": [ + "0" + ], + "filament_flush_volumetric_speed": [ + "0" + ], + "filament_max_volumetric_speed": [ + "24.5" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_settings_id": [ + "" + ], + "filament_soluble": [ + "0" + ], + "filament_start_gcode": [ + "; Filament start gcode" + ], + "filament_type": [ + "PLA" + ], + "filament_vendor": [ + "QIDI" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_wipe": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_ramming_travel_time": [ + "0" + ], + "filament_pre_cooling_temperature": [ + "0" + ], + "filament_ramming_volumetric_speed": [ + "-1" + ], + "filament_prime_volume": [ + "30" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "hot_plate_temp": [ + "60" + ], + "nozzle_temperature_initial_layer": [ + "210" + ], + "nozzle_temperature": [ + "210" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "95%" + ], + "pressure_advance": [ + "0.042" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "8" + ], + "slow_down_min_speed": [ + "20" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "supertack_plate_temp": [ + "45" + ], + "temperature_vitrification": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp": [ + "60" + ] +} diff --git a/resources/profiles/Qidi/machine/Qidi X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/machine/Qidi X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..54fed33aea --- /dev/null +++ b/resources/profiles/Qidi/machine/Qidi X-Plus 5 0.2 nozzle.json @@ -0,0 +1,28 @@ +{ + "type": "machine", + "name": "Qidi X-Plus 5 0.2 nozzle", + "inherits": "Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "setting_id": "prjWhtWxCsXqcrHr", + "instantiation": "true", + "printer_model": "Qidi X-Plus 5", + "printer_variant": "0.2", + "default_filament_profile": [ + "QIDI PLA Rapido @Qidi X-Plus 5 0.2 nozzle" + ], + "default_print_profile": "0.10mm Standard @X-Plus 5 0.2 nozzle", + "max_layer_height": [ + "0.14" + ], + "min_layer_height": [ + "0.04" + ], + "nozzle_diameter": [ + "0.2" + ], + "printer_agent": "qidi", + "retraction_length": [ + "0.4" + ], + "support_box_temp_control": "1" +} diff --git a/resources/profiles/Qidi/machine/Qidi X-Plus 5 0.4 nozzle.json b/resources/profiles/Qidi/machine/Qidi X-Plus 5 0.4 nozzle.json new file mode 100644 index 0000000000..f23f86af2a --- /dev/null +++ b/resources/profiles/Qidi/machine/Qidi X-Plus 5 0.4 nozzle.json @@ -0,0 +1,88 @@ +{ + "type": "machine", + "name": "Qidi X-Plus 5 0.4 nozzle", + "inherits": "fdm_machine_x_common", + "from": "system", + "setting_id": "exeoc5LTdCkPeWLD", + "instantiation": "true", + "printer_model": "Qidi X-Plus 5", + "auxiliary_fan": "1", + "bed_exclude_area": [ + "0x0,9x0,9x13,0x13" + ], + "box_id": "4", + "change_filament_gcode": "{if current_extruder != next_extruder}\n{if max_layer_z + 3 > max_print_height}\nG0 Z{max_print_height} F1200\n{else}\nG0 Z{max_layer_z + 3} F1200\n{endif}\nTOOL_CHANGE_START F=[current_extruder] T=[next_extruder]\nDISABLE_ALL_SENSOR\nM104 S{old_filament_temp - 10}\nM106 S255\n{if long_retractions_when_cut[previous_extruder]}\nG1 E-{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{else}\nG1 E-5 F{old_filament_e_feedrate}\n{endif}\nM400\nCUT_FILAMENT T=[current_extruder]\nMOVE_TO_TRASH\nM106 P2 S0\nUNLOAD_T[current_extruder]\nT[next_extruder]\nM106 S0\n{if nozzle_temperature_range_high[current_extruder] >= nozzle_temperature_range_high[next_extruder]}\nM104 S{nozzle_temperature_range_high[current_extruder]}\nM109.0 S{(nozzle_temperature_range_high[current_extruder])-25}\n{else}\nM104 S{nozzle_temperature_range_high[next_extruder]}\nM109.0 S{(nozzle_temperature_range_high[next_extruder])-25}\n{endif}\n{if long_retractions_when_cut[previous_extruder]}\nG1 E{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{endif}\n{if flush_length_1 > 1}\n; FLUSH_START\nG1 E{flush_length_1} F{old_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\n{if flush_length_2 > 1}\n; FLUSH_START\nG1 E{flush_length_2} F{new_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\n{if flush_length_3 > 1}\n; FLUSH_START\nG1 E{flush_length_3} F{new_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\n{if flush_length_4 > 1}\n; FLUSH_START\nG1 E{flush_length_4} F{new_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\nM400\nM106 S180\nM104 S{new_filament_temp - 10}\nG1 E1 F10\nM109.1 S{new_filament_temp - 10}\nG1 E-4 F1000\nG4 P2000\nM204 S5000\nG1 X109 F8000\nG1 X95 F5000\nG1 X109 F8000\nG1 X95 F5000\nG1 X140 F10000\nG1 Y319\nG1 X110\nG4 P2000\nG1 Y339 F2000\nG1 X123 F6000\nG1 X110\nG1 X123\nG1 X110\nG1 X123\nG1 X110\nG1 X123\nG1 X95\nG1 Y319 F10000\nM104 S[new_filament_temp]\nTOOL_CHANGE_END\nG1 E{new_retract_length_toolchange} F{new_filament_e_feedrate}\nENABLE_ALL_SENSOR\n{endif}", + "default_bed_type": "Textured PEI Plate", + "default_filament_profile": [ + "QIDI PLA Rapido @Qidi X-Plus 5 0.4 nozzle" + ], + "default_print_profile": "0.20mm Standard @X-Plus 5", + "enable_long_retraction_when_cut": "2", + "extruder_clearance_dist_to_rod": "42", + "extruder_clearance_height_to_lid": "168", + "extruder_clearance_height_to_rod": "42", + "extruder_clearance_max_radius": "75", + "fan_direction": "left", + "gcode_flavor": "klipper", + "is_support_3mf": "1", + "is_support_mqtt": "1", + "is_support_multi_box": "1", + "is_support_polar_cooler": "1", + "is_support_timelapse": "1", + "layer_change_gcode": "{if timelapse_type == 1} ; timelapse with wipe tower\nG92 E0\nG1 E-[retraction_length] F1800\n{if layer_z + 0.4 > max_print_height}\nG2 Z{max_print_height} I0.86 J0.86 P1 F20000 ; spiral lift a little\n{else}\nG2 Z{layer_z + 0.4} I0.86 J0.86 P1 F20000 ; spiral lift a little\n{endif}\nMOVE_TO_TRASH\n{if layer_z <=25}\nG1 Z25\n{endif}\nG92 E0\nM400\nTIMELAPSE_TAKE_FRAME\nG1 E[retraction_length] F300\nG1 X140 F8000\nG1 Y319\n{if layer_z <=25}\nG1 Z[layer_z]\n{endif}\n{elsif timelapse_type == 0} ; timelapse without wipe tower\nTIMELAPSE_TAKE_FRAME\n{endif}\nG92 E0\nSET_PRINT_STATS_INFO CURRENT_LAYER={layer_num + 1}", + "machine_end_gcode": "SET_PRINT_MAIN_STATUS MAIN_STATUS=print_end\nDISABLE_BOX_HEATER\nM141 S0\nM140 S0\nDISABLE_ALL_SENSOR\nG1 E-3 F1800\n{if max_layer_z + 3 > max_print_height}\nG0 Z{max_print_height} F600\n{else}\nG0 Z{max_layer_z + 3} F600\n{endif}\nUNLOAD_FILAMENT T=[current_extruder]\nG0 Y320 F12000\nG0 X105 Y320 F12000\n{if max_layer_z < max_print_height / 2}G1 Z{max_print_height / 2 + 10} F600{else}G1 Z{min(max_print_height, max_layer_z + 3)}{endif}\nM104 S0\nPRINT_END", + "machine_max_acceleration_x": [ + "20000" + ], + "machine_max_acceleration_y": [ + "20000" + ], + "machine_max_jerk_e": [ + "4" + ], + "machine_max_jerk_x": [ + "9" + ], + "machine_max_jerk_y": [ + "9" + ], + "machine_max_jerk_z": [ + "4" + ], + "machine_max_speed_x": [ + "600" + ], + "machine_max_speed_y": [ + "600" + ], + "machine_max_speed_z": [ + "20" + ], + "machine_pause_gcode": "PAUSE", + "machine_start_gcode": ";===== PRINT_PHASE_INIT =====\nSET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count]\nSET_PRINT_MAIN_STATUS MAIN_STATUS=print_start\nM220 S100\nM221 S100\nDISABLE_ALL_SENSOR\nM1002 R1\nM107\nCLEAR_PAUSE\nM140 S[bed_temperature_initial_layer_single]\nM141 S[chamber_temperature]\nG29.0\nSET_PRINT_SUB_STATUS SUB_STATUS=tool_head_reset\nG28\n\n;===== BOX_PREPAR =====\nSET_PRINT_SUB_STATUS SUB_STATUS=change_filament\nBOX_PRINT_START EXTRUDER=[initial_no_support_extruder] HOTENDTEMP={nozzle_temperature_range_high[initial_tool]}\nM400\nEXTRUSION_AND_FLUSH HOTEND=[nozzle_temperature_initial_layer]\n\n;===== CLEAR_NOZZLE =====\nSET_PRINT_SUB_STATUS SUB_STATUS=flush_filament\nG1 Z20 F480\nMOVE_TO_TRASH\n{if chamber_temperature[0] == 0}\nM106 P3 S[during_print_exhaust_fan_speed]\n{else}\nM106 P3 S0\n{endif}\nM1004\nM106 S0\nM109 S[nozzle_temperature_initial_layer]\nG92 E0\nM83\nG1 E5 F80\nG1 E200 F300\nM400\nM106 S255\nG1 E-3 F1000\nM104 S140\nSET_PRINT_SUB_STATUS SUB_STATUS=clear_nozzle\nM109.1 S{nozzle_temperature_initial_layer[0]-30}\nM204 S10000\nG1 X109 F10000\nG1 X95 F6000\nG1 X109 F10000\nG1 X95 F6000\nG1 X109 F10000\nG1 X95 F6000\nG1 Y318\nG1 X151 F15000\nG1 Y327\nG1 Z5 F480\nM400\nprobe samples=1\nG91\nG1 Z0.1\nG90\nM106 S255\nM109.1 S150\nG91\nG1 X20 F200\nG1 Y3\nG1 X-20\nG1 Y-3\nG1 X20\nG90\nG2 I0.5 J0.5 F480\nG2 I0.5 J0.5\nG2 I0.5 J0.5\nG1 Z10\nG1 Y318 F12000\nG1 X77\nG1 Y338 F2000\nG1 X95 F12000\nG1 X123\nG1 X110\nG1 X123\nG1 X110\nG1 X123\nG1 X110\nG1 X123\nG1 X110\nG1 X140\nG1 X160 Y160\nM106 S0\nSET_PRINT_SUB_STATUS SUB_STATUS=wait_bed_temp\nM190 S[bed_temperature_initial_layer_single]\nSET_PRINT_SUB_STATUS SUB_STATUS=wait_chamber_temp\nM191 S[chamber_temperature]\nG1 Y-2 F15000\nG1 X15\nG1 X-2 F5000\nG4 P1000\nG1 X-1 F1000\nG1 X-2 F5000\nG4 P1000\nG1 E-4 F1800\nG1 X15 F3000\nG1 X20 Y20 F15000\nSET_PRINT_SUB_STATUS SUB_STATUS=z_tilt_adjust\nZ_TILT_ADJUST\nSET_PRINT_SUB_STATUS SUB_STATUS=auto_bed_adjust\nG29\nM1002 A1\nG1 X160 Y160 Z10 F20000\nM1006 Z{10 - ((nozzle_temperature_initial_layer[initial_tool] - 130) / 14 - 5.0) / 100}\nG0 Y-1\nM109 S[nozzle_temperature_initial_layer]\nENABLE_ALL_SENSOR\n\n;===== PRINT_START =====\n; LAYER_HEIGHT: 0.2\nT[initial_tool]\nM140 S[bed_temperature_initial_layer_single]\nM104 S[nozzle_temperature_initial_layer]\nM141 S[chamber_temperature]\nG4 P3000\nprobe samples=1\nG91\nG0 Z0.6 F480\nG90\nG1 X140 Y1 F20000\nG1 E5 F{filament_max_volumetric_speed[initial_no_support_extruder]/2/2.4053*60}\nG1 X180 E20 F{filament_max_volumetric_speed[initial_no_support_extruder]/2/2.4053*60}\nG1 Z1 F480\nSET_PRINT_MAIN_STATUS MAIN_STATUS=printing", + "nozzle_diameter": [ + "0.4" + ], + "nozzle_volume": [ + "125" + ], + "printable_area": [ + "0x0", + "320x0", + "320x320", + "0x320", + "0x0" + ], + "printable_height": "300", + "printer_agent": "qidi", + "printer_settings_id": "Qidi", + "retract_lift_below": [ + "299" + ], + "support_box_temp_control": "1", + "support_multi_bed_types": "1", + "thumbnail_size": [ + "50x50" + ], + "use_3mf": "1" +} diff --git a/resources/profiles/Qidi/machine/Qidi X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/machine/Qidi X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..649462eab9 --- /dev/null +++ b/resources/profiles/Qidi/machine/Qidi X-Plus 5 0.6 nozzle.json @@ -0,0 +1,31 @@ +{ + "type": "machine", + "name": "Qidi X-Plus 5 0.6 nozzle", + "inherits": "Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "setting_id": "C4EIoDQYYzDGANJA", + "instantiation": "true", + "printer_model": "Qidi X-Plus 5", + "printer_variant": "0.6", + "default_filament_profile": [ + "QIDI PLA Rapido @Qidi X-Plus 5 0.6 nozzle" + ], + "default_print_profile": "0.30mm Standard @X-Plus 5 0.6 nozzle", + "max_layer_height": [ + "0.42" + ], + "min_layer_height": [ + "0.12" + ], + "nozzle_diameter": [ + "0.6" + ], + "printer_agent": "qidi", + "retraction_length": [ + "1.4" + ], + "retraction_minimum_travel": [ + "3" + ], + "support_box_temp_control": "1" +} diff --git a/resources/profiles/Qidi/machine/Qidi X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/machine/Qidi X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..ed932902f9 --- /dev/null +++ b/resources/profiles/Qidi/machine/Qidi X-Plus 5 0.8 nozzle.json @@ -0,0 +1,31 @@ +{ + "type": "machine", + "name": "Qidi X-Plus 5 0.8 nozzle", + "inherits": "Qidi X-Plus 5 0.4 nozzle", + "from": "system", + "setting_id": "5eqkluxp0SrRzhV7", + "instantiation": "true", + "printer_model": "Qidi X-Plus 5", + "printer_variant": "0.8", + "default_filament_profile": [ + "QIDI PLA Rapido @Qidi X-Plus 5 0.8 nozzle" + ], + "default_print_profile": "0.40mm Standard @X-Plus 5 0.8 nozzle", + "max_layer_height": [ + "0.56" + ], + "min_layer_height": [ + "0.16" + ], + "nozzle_diameter": [ + "0.8" + ], + "printer_agent": "qidi", + "retract_length_toolchange": [ + "3" + ], + "retraction_length": [ + "3" + ], + "support_box_temp_control": "1" +} diff --git a/resources/profiles/Qidi/machine/Qidi X-Plus 5.json b/resources/profiles/Qidi/machine/Qidi X-Plus 5.json new file mode 100644 index 0000000000..afc1d9af54 --- /dev/null +++ b/resources/profiles/Qidi/machine/Qidi X-Plus 5.json @@ -0,0 +1,12 @@ +{ + "type": "machine_model", + "name": "Qidi X-Plus 5", + "model_id": "Qidi-XPlus-5", + "nozzle_diameter": "0.4;0.2;0.6;0.8", + "machine_tech": "FFF", + "family": "Qidi", + "bed_model": "qidi_xplus5_buildplate_model.stl", + "bed_texture": "qidi_xplus5_buildplate_texture.svg", + "hotend_model": "qidi_xseries_gen3_hotend.stl", + "default_materials": "Generic ABS @Qidi X-Plus 5 0.4 nozzle;Generic PLA @Qidi X-Plus 5 0.4 nozzle;QIDI ABS Odorless @Qidi X-Plus 5 0.4 nozzle;QIDI ABS Rapido @Qidi X-Plus 5 0.4 nozzle;QIDI PLA Rapido @Qidi X-Plus 5 0.2 nozzle;QIDI PLA Rapido @Qidi X-Plus 5 0.4 nozzle;QIDI PLA Rapido @Qidi X-Plus 5 0.6 nozzle;QIDI PLA Rapido @Qidi X-Plus 5 0.8 nozzle;QIDI PLA Rapido Matte @Qidi X-Plus 5 0.4 nozzle;QIDI PLA-CF @Qidi X-Plus 5 0.4 nozzle;Generic PLA Silk @Qidi X-Plus 5 0.4 nozzle;QIDI PLA Silk @Qidi X-Plus 5 0.4 nozzle;QIDI ASA @Qidi X-Plus 5 0.4 nozzle;QIDI PETG Basic @Qidi X-Plus 5 0.4 nozzle;QIDI PETG Rapido @Qidi X-Plus 5 0.4 nozzle;QIDI PETG Tough @Qidi X-Plus 5 0.4 nozzle;QIDI PETG Translucent @Qidi X-Plus 5 0.4 nozzle;QIDI PLA Basic @Qidi X-Plus 5 0.4 nozzle;QIDI PLA Matte Basic @Qidi X-Plus 5 0.4 nozzle;Generic PETG @Qidi X-Plus 5 0.4 nozzle" +} diff --git a/resources/profiles/Qidi/process/0.08mm High Quality @X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/process/0.08mm High Quality @X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..6ef2deee1a --- /dev/null +++ b/resources/profiles/Qidi/process/0.08mm High Quality @X-Plus 5 0.2 nozzle.json @@ -0,0 +1,70 @@ +{ + "type": "process", + "setting_id": "ojwggKwtZ95dDdGn", + "name": "0.08mm High Quality @X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_process_n_common", + "bottom_color_penetration_layers": "5", + "bottom_shell_layers": "5", + "bridge_flow": "1", + "default_acceleration": [ + "10000" + ], + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "0", + "initial_layer_infill_speed": [ + "70" + ], + "initial_layer_line_width": "0.25", + "initial_layer_print_height": "0.1", + "initial_layer_speed": [ + "40" + ], + "inner_wall_acceleration": [ + "0" + ], + "inner_wall_line_width": "0.22", + "inner_wall_speed": [ + "150" + ], + "internal_solid_infill_line_width": "0.22", + "layer_height": "0.08", + "line_width": "0.22", + "outer_wall_acceleration": [ + "5000" + ], + "outer_wall_line_width": "0.22", + "outer_wall_speed": [ + "100" + ], + "overhang_1_4_speed": [ + "60" + ], + "prime_tower_width": "60", + "prime_tower_brim_width": "-1", + "prime_tower_flat_ironing": "1", + "skin_infill_line_width": "0.22", + "skeleton_infill_line_width": "0.22", + "sparse_infill_line_width": "0.22", + "sparse_infill_pattern": "gyroid", + "sparse_infill_speed": [ + "100" + ], + "support_bottom_z_distance": "0.08", + "support_line_width": "0.22", + "support_top_z_distance": "0.08", + "top_color_penetration_layers": "7", + "top_shell_layers": "7", + "top_surface_line_width": "0.22", + "top_surface_speed": [ + "150" + ], + "travel_speed": [ + "500" + ], + "wall_loops": "4", + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/process/0.08mm High Quality @X-Plus 5.json b/resources/profiles/Qidi/process/0.08mm High Quality @X-Plus 5.json new file mode 100644 index 0000000000..5b76c79ef4 --- /dev/null +++ b/resources/profiles/Qidi/process/0.08mm High Quality @X-Plus 5.json @@ -0,0 +1,73 @@ +{ + "type": "process", + "setting_id": "pdbmnAHtrlkeD1D6", + "name": "0.08mm High Quality @X-Plus 5", + "from": "system", + "instantiation": "true", + "inherits": "fdm_process_n_common", + "bottom_color_penetration_layers": "7", + "bottom_shell_layers": "7", + "bridge_flow": "1", + "default_acceleration": [ + "4000" + ], + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "0", + "gap_infill_speed": [ + "210" + ], + "initial_layer_infill_speed": [ + "105" + ], + "initial_layer_speed": [ + "50" + ], + "inner_wall_acceleration": [ + "0" + ], + "inner_wall_speed": [ + "120" + ], + "internal_solid_infill_speed": [ + "150" + ], + "ironing_flow": "8%", + "layer_height": "0.08", + "outer_wall_acceleration": [ + "2000" + ], + "outer_wall_speed": [ + "60" + ], + "overhang_1_4_speed": [ + "60" + ], + "overhang_2_4_speed": [ + "30" + ], + "overhang_3_4_speed": [ + "10" + ], + "prime_tower_width": "60", + "prime_tower_brim_width": "-1", + "prime_tower_flat_ironing": "0", + "sparse_infill_speed": [ + "150" + ], + "sparse_infill_pattern": "gyroid", + "support_bottom_z_distance": "0.08", + "support_threshold_angle": "15", + "support_top_z_distance": "0.08", + "top_color_penetration_layers": "9", + "top_shell_layers": "9", + "top_shell_thickness": "1", + "top_surface_speed": [ + "150" + ], + "travel_speed": [ + "350" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/process/0.10mm Standard @X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/process/0.10mm Standard @X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..a8a9aa5f37 --- /dev/null +++ b/resources/profiles/Qidi/process/0.10mm Standard @X-Plus 5 0.2 nozzle.json @@ -0,0 +1,63 @@ +{ + "type": "process", + "setting_id": "3k8N3voNC9Kp0Ov6", + "name": "0.10mm Standard @X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_process_n_common", + "bottom_color_penetration_layers": "5", + "bottom_shell_layers": "5", + "bridge_flow": "1", + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "0", + "initial_layer_infill_speed": [ + "70" + ], + "initial_layer_line_width": "0.25", + "initial_layer_print_height": "0.1", + "initial_layer_speed": [ + "40" + ], + "inner_wall_acceleration": [ + "0" + ], + "inner_wall_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "ironing_flow": "20%", + "ironing_speed": "20", + "layer_height": "0.1", + "line_width": "0.22", + "outer_wall_acceleration": [ + "5000" + ], + "outer_wall_line_width": "0.22", + "overhang_1_4_speed": [ + "60" + ], + "skin_infill_line_width": "0.22", + "outer_wall_speed": [ + "100" + ], + "prime_tower_width": "60", + "skeleton_infill_line_width": "0.22", + "sparse_infill_line_width": "0.22", + "sparse_infill_speed": [ + "100" + ], + "support_bottom_z_distance": "0.1", + "support_line_width": "0.22", + "support_top_z_distance": "0.1", + "top_color_penetration_layers": "7", + "top_shell_layers": "7", + "top_surface_line_width": "0.22", + "top_surface_speed": [ + "150" + ], + "travel_speed": [ + "500" + ], + "wall_loops": "4", + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/process/0.12mm Balanced Quality @X-Plus 5 0.2 nozzle.json b/resources/profiles/Qidi/process/0.12mm Balanced Quality @X-Plus 5 0.2 nozzle.json new file mode 100644 index 0000000000..1c1d304ccd --- /dev/null +++ b/resources/profiles/Qidi/process/0.12mm Balanced Quality @X-Plus 5 0.2 nozzle.json @@ -0,0 +1,66 @@ +{ + "type": "process", + "setting_id": "O20HfmdyTRg2xayA", + "name": "0.12mm Balanced Quality @X-Plus 5 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_process_n_common", + "bottom_color_penetration_layers": "5", + "bottom_shell_layers": "5", + "bridge_flow": "1", + "default_acceleration": [ + "10000" + ], + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "0", + "initial_layer_infill_speed": [ + "70" + ], + "initial_layer_line_width": "0.25", + "initial_layer_print_height": "0.1", + "initial_layer_speed": [ + "40" + ], + "inner_wall_acceleration": [ + "0" + ], + "inner_wall_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "layer_height": "0.12", + "line_width": "0.22", + "outer_wall_acceleration": [ + "5000" + ], + "outer_wall_line_width": "0.22", + "outer_wall_speed": [ + "100" + ], + "overhang_1_4_speed": [ + "60" + ], + "prime_tower_width": "60", + "prime_tower_brim_width": "-1", + "prime_tower_flat_ironing": "1", + "skin_infill_line_width": "0.22", + "skeleton_infill_line_width": "0.22", + "sparse_infill_line_width": "0.22", + "sparse_infill_speed": [ + "100" + ], + "support_bottom_z_distance": "0.12", + "support_line_width": "0.22", + "support_top_z_distance": "0.12", + "top_color_penetration_layers": "7", + "top_shell_layers": "7", + "top_surface_line_width": "0.22", + "top_surface_speed": [ + "150" + ], + "travel_speed": [ + "500" + ], + "wall_loops": "4", + "compatible_printers": [ + "Qidi X-Plus 5 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/process/0.12mm High Quality @X-Plus 5.json b/resources/profiles/Qidi/process/0.12mm High Quality @X-Plus 5.json new file mode 100644 index 0000000000..a74aecb369 --- /dev/null +++ b/resources/profiles/Qidi/process/0.12mm High Quality @X-Plus 5.json @@ -0,0 +1,73 @@ +{ + "type": "process", + "setting_id": "xWoxLO8XiKAOEvPO", + "name": "0.12mm High Quality @X-Plus 5", + "from": "system", + "instantiation": "true", + "inherits": "fdm_process_n_common", + "bottom_color_penetration_layers": "5", + "bottom_shell_layers": "5", + "bridge_flow": "1", + "default_acceleration": [ + "4000" + ], + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "0", + "gap_infill_speed": [ + "230" + ], + "initial_layer_infill_speed": [ + "105" + ], + "initial_layer_speed": [ + "50" + ], + "inner_wall_acceleration": [ + "0" + ], + "inner_wall_speed": [ + "150" + ], + "internal_solid_infill_speed": [ + "180" + ], + "layer_height": "0.12", + "outer_wall_acceleration": [ + "2000" + ], + "outer_wall_speed": [ + "60" + ], + "overhang_1_4_speed": [ + "60" + ], + "overhang_2_4_speed": [ + "30" + ], + "overhang_3_4_speed": [ + "10" + ], + "prime_tower_width": "60", + "prime_tower_brim_width": "-1", + "prime_tower_flat_ironing": "1", + "sparse_infill_pattern": "gyroid", + "sparse_infill_speed": [ + "180" + ], + "support_bottom_z_distance": "0.12", + "support_threshold_angle": "20", + "support_top_z_distance": "0.12", + "top_color_penetration_layers": "7", + "top_shell_layers": "5", + "top_shell_thickness": "0.6", + "top_surface_speed": [ + "150" + ], + "travel_speed": [ + "350" + ], + "wall_loops": "2", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/process/0.16mm High Quality @X-Plus 5.json b/resources/profiles/Qidi/process/0.16mm High Quality @X-Plus 5.json new file mode 100644 index 0000000000..54f20f7324 --- /dev/null +++ b/resources/profiles/Qidi/process/0.16mm High Quality @X-Plus 5.json @@ -0,0 +1,65 @@ +{ + "type": "process", + "setting_id": "7hYw7osV25Xu2yiu", + "name": "0.16mm High Quality @X-Plus 5", + "from": "system", + "instantiation": "true", + "inherits": "fdm_process_n_common", + "bottom_color_penetration_layers": "4", + "bottom_shell_layers": "4", + "bridge_flow": "1", + "default_acceleration": [ + "4000" + ], + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "0", + "gap_infill_speed": [ + "250" + ], + "inner_wall_acceleration": [ + "0" + ], + "internal_solid_infill_speed": [ + "200" + ], + "ironing_flow": "25%", + "ironing_speed": "20", + "layer_height": "0.16", + "outer_wall_acceleration": [ + "2000" + ], + "outer_wall_speed": [ + "60" + ], + "overhang_1_4_speed": [ + "60" + ], + "overhang_2_4_speed": [ + "30" + ], + "overhang_3_4_speed": [ + "10" + ], + "prime_tower_width": "60", + "prime_tower_brim_width": "-1", + "prime_tower_flat_ironing": "1", + "sparse_infill_pattern": "gyroid", + "sparse_infill_speed": [ + "200" + ], + "support_bottom_z_distance": "0.16", + "support_threshold_angle": "25", + "support_top_z_distance": "0.16", + "top_color_penetration_layers": "6", + "top_shell_layers": "6", + "top_shell_thickness": "1.0", + "top_surface_speed": [ + "150" + ], + "travel_speed": [ + "350" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/process/0.16mm Standard @X-Plus 5.json b/resources/profiles/Qidi/process/0.16mm Standard @X-Plus 5.json new file mode 100644 index 0000000000..5399e693aa --- /dev/null +++ b/resources/profiles/Qidi/process/0.16mm Standard @X-Plus 5.json @@ -0,0 +1,62 @@ +{ + "type": "process", + "setting_id": "xP7mco0WGscmPNoV", + "name": "0.16mm Standard @X-Plus 5", + "from": "system", + "instantiation": "true", + "inherits": "fdm_process_n_common", + "bottom_color_penetration_layers": "4", + "bottom_shell_layers": "4", + "bridge_flow": "1", + "default_acceleration": [ + "10000" + ], + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "0", + "gap_infill_speed": [ + "250" + ], + "inner_wall_acceleration": [ + "0" + ], + "inner_wall_speed": [ + "300" + ], + "internal_solid_infill_speed": [ + "250" + ], + "layer_height": "0.16", + "outer_wall_acceleration": [ + "5000" + ], + "outer_wall_speed": [ + "200" + ], + "overhang_1_4_speed": [ + "60" + ], + "overhang_2_4_speed": [ + "30" + ], + "overhang_3_4_speed": [ + "10" + ], + "prime_tower_width": "60", + "prime_tower_brim_width": "-1", + "prime_tower_flat_ironing": "1", + "sparse_infill_speed": [ + "350" + ], + "support_bottom_z_distance": "0.16", + "support_threshold_angle": "25", + "support_top_z_distance": "0.16", + "top_color_penetration_layers": "6", + "top_shell_layers": "6", + "top_shell_thickness": "1.0", + "travel_speed": [ + "500" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/process/0.18mm Balanced Quality @X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/process/0.18mm Balanced Quality @X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..85d94d49a7 --- /dev/null +++ b/resources/profiles/Qidi/process/0.18mm Balanced Quality @X-Plus 5 0.6 nozzle.json @@ -0,0 +1,73 @@ +{ + "type": "process", + "setting_id": "kj7YrKOrYowWXXrY", + "name": "0.18mm Balanced Quality @X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_process_n_common", + "bridge_flow": "1", + "bridge_speed": [ + "30" + ], + "default_acceleration": [ + "10000" + ], + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "0", + "gap_infill_speed": [ + "50" + ], + "initial_layer_line_width": "0.62", + "initial_layer_print_height": "0.3", + "initial_layer_speed": [ + "50" + ], + "inner_wall_acceleration": [ + "0" + ], + "inner_wall_line_width": "0.62", + "inner_wall_speed": [ + "300" + ], + "internal_solid_infill_line_width": "0.62", + "internal_solid_infill_speed": [ + "250" + ], + "layer_height": "0.18", + "line_width": "0.62", + "outer_wall_acceleration": [ + "5000" + ], + "outer_wall_line_width": "0.62", + "outer_wall_speed": [ + "200" + ], + "overhang_1_4_speed": [ + "0" + ], + "overhang_2_4_speed": [ + "50" + ], + "prime_tower_width": "60", + "prime_tower_brim_width": "-1", + "prime_tower_flat_ironing": "1", + "skin_infill_line_width": "0.62", + "skeleton_infill_line_width": "0.62", + "sparse_infill_line_width": "0.62", + "sparse_infill_speed": [ + "350" + ], + "support_bottom_z_distance": "0.18", + "support_line_width": "0.62", + "support_top_z_distance": "0.18", + "top_surface_line_width": "0.62", + "top_surface_speed": [ + "200" + ], + "travel_speed": [ + "500" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/process/0.20mm High Quality @X-Plus 5.json b/resources/profiles/Qidi/process/0.20mm High Quality @X-Plus 5.json new file mode 100644 index 0000000000..4f8c7b4ef4 --- /dev/null +++ b/resources/profiles/Qidi/process/0.20mm High Quality @X-Plus 5.json @@ -0,0 +1,63 @@ +{ + "type": "process", + "setting_id": "azERQAEOdeNEo2z7", + "name": "0.20mm High Quality @X-Plus 5", + "from": "system", + "inherits": "fdm_process_n_common", + "instantiation": "true", + "bottom_shell_layers": "3", + "bridge_flow": "1", + "default_acceleration": [ + "4000" + ], + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "0", + "gap_infill_speed": [ + "250" + ], + "inner_wall_acceleration": [ + "0" + ], + "inner_wall_speed": [ + "150" + ], + "internal_solid_infill_speed": [ + "200" + ], + "outer_wall_acceleration": [ + "2000" + ], + "outer_wall_speed": [ + "60" + ], + "overhang_1_4_speed": [ + "60" + ], + "overhang_2_4_speed": [ + "30" + ], + "overhang_3_4_speed": [ + "10" + ], + "prime_tower_width": "60", + "prime_tower_brim_width": "-1", + "prime_tower_flat_ironing": "1", + "sparse_infill_speed": [ + "200" + ], + "sparse_infill_density": "15%", + "sparse_infill_pattern": "gyroid", + "top_color_penetration_layers": "5", + "top_shell_layers": "5", + "top_shell_thickness": "1.0", + "top_surface_speed": [ + "150" + ], + "travel_speed": [ + "350" + ], + "wall_loops": "2", + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/process/0.20mm Standard @X-Plus 5.json b/resources/profiles/Qidi/process/0.20mm Standard @X-Plus 5.json new file mode 100644 index 0000000000..decaceecae --- /dev/null +++ b/resources/profiles/Qidi/process/0.20mm Standard @X-Plus 5.json @@ -0,0 +1,47 @@ +{ + "type": "process", + "setting_id": "ug7kxxCLKKE7MoJW", + "name": "0.20mm Standard @X-Plus 5", + "from": "system", + "inherits": "fdm_process_n_common", + "instantiation": "true", + "bridge_flow": "1", + "default_acceleration": [ + "10000" + ], + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "0", + "gap_infill_speed": [ + "250" + ], + "inner_wall_speed": [ + "300" + ], + "inner_wall_acceleration": [ + "0" + ], + "internal_solid_infill_speed": [ + "250" + ], + "ironing_flow": "15%", + "outer_wall_acceleration": [ + "5000" + ], + "outer_wall_speed": [ + "200" + ], + "prime_tower_width": "60", + "prime_tower_flat_ironing": "1", + "sparse_infill_speed": [ + "350" + ], + "top_color_penetration_layers": "5", + "top_shell_layers": "5", + "top_shell_thickness": "1.0", + "travel_speed": [ + "500" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/process/0.24mm Balanced Quality @X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/process/0.24mm Balanced Quality @X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..16e25dcef3 --- /dev/null +++ b/resources/profiles/Qidi/process/0.24mm Balanced Quality @X-Plus 5 0.6 nozzle.json @@ -0,0 +1,71 @@ +{ + "type": "process", + "setting_id": "BWwslzDWus0iHZM8", + "name": "0.24mm Balanced Quality @X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_process_n_common", + "bridge_flow": "1", + "bridge_speed": [ + "30" + ], + "default_acceleration": [ + "10000" + ], + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "0", + "gap_infill_speed": [ + "50" + ], + "initial_layer_infill_speed": [ + "105" + ], + "initial_layer_line_width": "0.62", + "initial_layer_print_height": "0.3", + "initial_layer_speed": [ + "50" + ], + "inner_wall_acceleration": [ + "0" + ], + "inner_wall_line_width": "0.62", + "inner_wall_speed": [ + "300" + ], + "internal_solid_infill_line_width": "0.62", + "internal_solid_infill_speed": [ + "250" + ], + "layer_height": "0.24", + "line_width": "0.62", + "outer_wall_acceleration": [ + "5000" + ], + "outer_wall_line_width": "0.62", + "outer_wall_speed": [ + "200" + ], + "overhang_3_4_speed": [ + "30" + ], + "prime_tower_width": "60", + "prime_tower_brim_width": "-1", + "prime_tower_flat_ironing": "1", + "skin_infill_line_width": "0.62", + "skeleton_infill_line_width": "0.62", + "sparse_infill_line_width": "0.62", + "sparse_infill_speed": [ + "350" + ], + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "top_surface_speed": [ + "200" + ], + "travel_speed": [ + "500" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/process/0.24mm Balanced Quality @X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/process/0.24mm Balanced Quality @X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..e7d69b3f09 --- /dev/null +++ b/resources/profiles/Qidi/process/0.24mm Balanced Quality @X-Plus 5 0.8 nozzle.json @@ -0,0 +1,63 @@ +{ + "type": "process", + "setting_id": "TdXf6dJK5dAiFtIW", + "name": "0.24mm Balanced Quality @X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_process_n_common", + "bridge_flow": "1", + "bridge_speed": [ + "30" + ], + "default_acceleration": [ + "10000" + ], + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "0", + "gap_infill_speed": [ + "50" + ], + "initial_layer_line_width": "0.82", + "initial_layer_print_height": "0.4", + "initial_layer_speed": [ + "50" + ], + "inner_wall_acceleration": [ + "0" + ], + "inner_wall_line_width": "0.82", + "inner_wall_speed": [ + "300" + ], + "internal_solid_infill_line_width": "0.82", + "internal_solid_infill_speed": [ + "250" + ], + "layer_height": "0.24", + "line_width": "0.82", + "outer_wall_acceleration": [ + "5000" + ], + "outer_wall_line_width": "0.82", + "outer_wall_speed": [ + "200" + ], + "prime_tower_width": "60", + "prime_tower_brim_width": "-1", + "prime_tower_flat_ironing": "1", + "skin_infill_line_width": "0.82", + "skeleton_infill_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "sparse_infill_speed": [ + "350" + ], + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "travel_speed": [ + "500" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/process/0.24mm Standard @X-Plus 5.json b/resources/profiles/Qidi/process/0.24mm Standard @X-Plus 5.json new file mode 100644 index 0000000000..8a435e69e7 --- /dev/null +++ b/resources/profiles/Qidi/process/0.24mm Standard @X-Plus 5.json @@ -0,0 +1,50 @@ +{ + "type": "process", + "setting_id": "fiMTwk6ObF3WNpi5", + "name": "0.24mm Standard @X-Plus 5", + "from": "system", + "inherits": "fdm_process_n_common", + "instantiation": "true", + "bridge_flow": "1", + "default_acceleration": [ + "10000" + ], + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "0", + "gap_infill_speed": [ + "250" + ], + "inner_wall_acceleration": [ + "0" + ], + "inner_wall_speed": [ + "300" + ], + "internal_solid_infill_speed": [ + "250" + ], + "layer_height": "0.24", + "outer_wall_acceleration": [ + "5000" + ], + "outer_wall_speed": [ + "200" + ], + "prime_tower_width": "60", + "prime_tower_brim_width": "-1", + "prime_tower_flat_ironing": "1", + "sparse_infill_speed": [ + "350" + ], + "support_threshold_angle": "35", + "top_color_penetration_layers": "4", + "top_shell_layers": "4", + "top_shell_thickness": "1.0", + "top_surface_line_width": "0.45", + "travel_speed": [ + "500" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.4 nozzle" + ] +} diff --git a/resources/profiles/Qidi/process/0.30mm Standard @X-Plus 5 0.6 nozzle.json b/resources/profiles/Qidi/process/0.30mm Standard @X-Plus 5 0.6 nozzle.json new file mode 100644 index 0000000000..a297f33bac --- /dev/null +++ b/resources/profiles/Qidi/process/0.30mm Standard @X-Plus 5 0.6 nozzle.json @@ -0,0 +1,65 @@ +{ + "type": "process", + "setting_id": "ZHUAMUGv0HI3h8fQ", + "name": "0.30mm Standard @X-Plus 5 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_process_n_common", + "bridge_flow": "1", + "bridge_speed": [ + "30" + ], + "default_acceleration": [ + "10000" + ], + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "0", + "gap_infill_speed": [ + "50" + ], + "initial_layer_line_width": "0.62", + "initial_layer_print_height": "0.3", + "initial_layer_speed": [ + "50" + ], + "inner_wall_acceleration": [ + "0" + ], + "inner_wall_line_width": "0.62", + "inner_wall_speed": [ + "300" + ], + "internal_solid_infill_line_width": "0.62", + "internal_solid_infill_speed": [ + "250" + ], + "layer_height": "0.3", + "line_width": "0.62", + "outer_wall_acceleration": [ + "5000" + ], + "outer_wall_line_width": "0.62", + "outer_wall_speed": [ + "120" + ], + "prime_tower_width": "60", + "prime_tower_flat_ironing": "1", + "skin_infill_line_width": "0.62", + "skeleton_infill_line_width": "0.62", + "sparse_infill_line_width": "0.62", + "sparse_infill_speed": [ + "350" + ], + "support_line_width": "0.62", + "top_shell_layers": "4", + "top_surface_line_width": "0.62", + "top_surface_speed": [ + "200" + ], + "travel_speed": [ + "500" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/process/0.32mm Balanced Quality @X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/process/0.32mm Balanced Quality @X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..be02d140d6 --- /dev/null +++ b/resources/profiles/Qidi/process/0.32mm Balanced Quality @X-Plus 5 0.8 nozzle.json @@ -0,0 +1,72 @@ +{ + "type": "process", + "setting_id": "Vl4hMKR69J1JcquX", + "name": "0.32mm Balanced Quality @X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_process_n_common", + "bridge_flow": "1", + "bridge_speed": [ + "30" + ], + "default_acceleration": [ + "10000" + ], + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "0", + "gap_infill_speed": [ + "50" + ], + "initial_layer_infill_speed": [ + "105" + ], + "initial_layer_line_width": "0.82", + "initial_layer_print_height": "0.4", + "initial_layer_speed": [ + "50" + ], + "inner_wall_acceleration": [ + "0" + ], + "inner_wall_line_width": "0.82", + "inner_wall_speed": [ + "300" + ], + "internal_solid_infill_line_width": "0.82", + "internal_solid_infill_speed": [ + "250" + ], + "layer_height": "0.32", + "line_width": "0.82", + "outer_wall_acceleration": [ + "5000" + ], + "outer_wall_line_width": "0.82", + "outer_wall_speed": [ + "200" + ], + "overhang_3_4_speed": [ + "30" + ], + "prime_tower_width": "60", + "prime_tower_brim_width": "-1", + "prime_tower_flat_ironing": "1", + "skin_infill_line_width": "0.82", + "skeleton_infill_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "sparse_infill_speed": [ + "350" + ], + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "top_surface_speed": [ + "200" + ], + "travel_speed": [ + "500" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/process/0.40mm Standard @X-Plus 5 0.8 nozzle.json b/resources/profiles/Qidi/process/0.40mm Standard @X-Plus 5 0.8 nozzle.json new file mode 100644 index 0000000000..cb3f30c20e --- /dev/null +++ b/resources/profiles/Qidi/process/0.40mm Standard @X-Plus 5 0.8 nozzle.json @@ -0,0 +1,60 @@ +{ + "type": "process", + "setting_id": "6EBzl1Pg5Px36Cu6", + "name": "0.40mm Standard @X-Plus 5 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_process_n_common", + "bridge_flow": "1", + "bridge_speed": [ + "30" + ], + "default_acceleration": [ + "10000" + ], + "elefant_foot_compensation": "0.15", + "enable_arc_fitting": "0", + "gap_infill_speed": [ + "50" + ], + "initial_layer_line_width": "0.82", + "initial_layer_print_height": "0.4", + "inner_wall_acceleration": [ + "0" + ], + "inner_wall_line_width": "0.82", + "inner_wall_speed": [ + "300" + ], + "internal_solid_infill_line_width": "0.82", + "internal_solid_infill_speed": [ + "250" + ], + "layer_height": "0.4", + "line_width": "0.82", + "outer_wall_acceleration": [ + "5000" + ], + "outer_wall_line_width": "0.82", + "prime_tower_width": "60", + "prime_tower_flat_ironing": "1", + "skin_infill_line_width": "0.82", + "skeleton_infill_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "sparse_infill_speed": [ + "350" + ], + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "top_surface_speed": [ + "200" + ], + "top_shell_layers": "4", + "travel_speed": [ + "500" + ], + "compatible_printers": [ + "Qidi X-Plus 5 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/qidi_xplus5_buildplate_model.stl b/resources/profiles/Qidi/qidi_xplus5_buildplate_model.stl new file mode 100644 index 0000000000000000000000000000000000000000..5e2d7ca48585ce2287c9981b73a28977b93c779b GIT binary patch literal 28284 zcmbtbfAD8zRlb@IBPHp&5Tvlne)xXXP^>|X1iv4bPq-;f6a6%kQ9+CxEDRka#jZ$N zMos@X6X@gwVrUgzjF=|0VX)`q<4z^|#4R)UMob$fVd++@$&h#DF zJ$ui2-shb2p7-ay-z(mF*+svx_f^mT*~{K`#oiaa_M%JPu=oG<^TH=~@zXC&=ubHP znftr`jMW$JzHV*uA(8$0-FM%8M}z1R0nG^EXd)hb`IYMj-*fE_uowN_D-Qkj%b({Q z5C74{hd%YfZI|=;W&|{fNVy=E!m%G5f!GfY$j0H%5ntDtR}%y@)^0(hOvK`*3wPf2 z&8y~eRq}JzTVJsM`_DSV`MORJC0A%mtx_h(kuN`UdHhM|JBMmgMjSg2FZbX4=H~~8 zAiA_dTWXauIZl1X#mfud^bPb!ubPxKSCG3-5M5fKt<0z*3dcG)nm*Tlww4anIE-T! zp;jrA!y;ctuHcoo1x?EE$})1O_QxiKTBS@5>%oK3=g6+N1x?D}$jWD~HX+n1WpZ41 z#o>; z_A5?{x>AH{<`CpK$?EEA)>Ws7lsyg^U0tV$9Batp9HMZnlS5~Klp~HqH4ft_2y3@! z<`Cqt$k&-GMWpO;T=Tv|wLcVL`6-$?1Uak+4`!b$B4t=vZ`v#>eO?f%nM07{nFp?1 zUwh592QkjAouTXZ4ql@n!|Kwr@%+?bf-p=)s8!0W_9IVv(Hj4QLp3RTyVgGbO%6eH zX+^KZDiGvA42Xqs&}xdcZj#Z7rI5r?otyVo{ za#-Zc$Q8VDtB9i@tbOCo{@8?2tCY!MF)X9ckzH>Knv@v_p6{)FK8vsnRI8914qwm1 zigO07d_507m%A>!njq9FWpYI1SO+r>=SVB*kKovZh)mOpS*N#M^q_O3m9vKxIlLBv zV>3dmSTU6YwHq8>agi&^5yybIT!vR05MIX_ha*a^Fa|S@s$u0j!rC7YBRR}^7NJ%t zmp;c_;ytLElo^N57{P(jG>5>*!U$6YIbQ#gn=b1wom6cSA=Tj5ajs4XAc}awEG>-p@@`Wb>$;(Jq$0ID@CYg4l(8U{bN?v*7Llr zlwq~_@PWhcKks?N(GhBuGQGO>Cyrac@;>HDH7TRr&%WpU!$0`p(}QCZLakCR9LwY| z&ADg`nv^4sb88&NF^e#-idD)byF1w*s!16fmbY_}!;-66gj%IM<***Kw%E5Rqh0IG zb8B5$pBE0*%pvHNRpK&hR}m@0%Bu3*tm&>(glgsx&Pzm+6_k! zuksWRO`f(P=M6%G@HkYXi1xINnEBJ=mdkH$g2QiaARD*euoRBo5ca=&RWy0~0V{2Z zt@F>8LlKrMzh|0qXj^JE8;5(P8bxgGj}c;W57&5Qq4?}$=Ycqx#OcMY^qe4}`z&gR zIA=77QJ-53_!%R_N=_Cu^*<|OT1&ADFL4ksk8rfjlZcNkg*E;vkt;{YeukStl@_2U*uHp>VHiw7JUwq8T>=X=hPIHcAY2+w+~ z$YqbC2+c^#F+!BRh z2qIU8M0opzMpe5eMv=&+uBHfj#q+r!2JLh1`huN%XL?1e{&=icv8N7qd}rCIMi9*^ z8lfjgZA-0EE|If+8&bIrhVSNyo(G>%yo&YaE1 z#W4u4azxR?IyM~vW8YIJ0(nIBEny1ZxOY6m{$9XZQ8#{7uH)?l| zLu#}^c-Cv=);@l+O7ebJtT39jN(gX-Xkwhxt2&y)*#82DBC6GRoF}SZ=KP9wbKZrV zYhn|5k2rEQfF{={$j$5u0<*?Xzf_GPn!cfNAXKA>9JP&C&Y_6LN@fh9@a#%e(`x1I z>YOi-c6`LV;s}e+PfJs;Y}}O*)mZ6TGRNWdqX>)7&zu`M9HCY^x}2gXQNL8p2;nF1 zDTg9VE>@f8#N3~wE!*jrH?FzAo^q&05xLi%B65cu9OW%yo=Xa%M6Md+^Y`4a(w3N| z%#~^sp{s=377j(Il|A>9Oz|p+`lV_Vu{paVM0p#oIgIA%+%k81V9z}xWE=B-YdH0) zSu=E{-n@ROMiDwI!JnT0+lXoqI(Nz11w{N{42nkDoy>4OAuU3!bXLmt@pn64DZ*wV zzdM=cO50K^on4)y2LU*Ae$5>++MOUA283!9p*`!y);@kF2)}g%hk8p}{@F&Z?QX6T zZA-0mmGIVkcm&B1b+(jwH=masnc21o*9ao#U?M*9hAaF%>KAW*`})%_wUxfZyNOR6 zqP*?$1sCkG=i5W~*vAfaT_CzKLait-0&(x(KF9Z=AAI}E)~Zp&&);y0bDaJ^A2E(V zbYp~CQCecfq@jLlLT(A{GM?k6z3;9GbI$qY;qP~Lz2esmxwZO>&+i%jyuaDn+FITHp}oTk zeh2-$zqp*bk*g<*CJQwqi2U-;owvN?{rg6_Qp95Q?=Rdlobc6~B3GLb z)oN>mc=u0VwY=rL zR+rv(%5cN=Ck2Nhszwou5#otYe$nz@{hgGyrB>iRW!Uqzrv`^2szwpuQ^c3-`^1Or zJ4Nr?qERbwoNRGCB{*6{Y7_xEpO312sMWqDvdy4ne7yRiKfe8|cO2L`d@SBpt40x9 z!_&{%JAB^@2VYv^AJ3ks^FQ7@8>}_a&PUMAPcquiCe| z{D!R=jz;62M7wvMy0RD_4VBn-!{&CYpHd}7_UE>q z&-6JEp|QFu2=qnPn{)Jt1G&;&D&?ppoGdNA84l4*5mJeT18YQS%jK}L5dhB`4)+Sa z7EOcLH{5)QR3bR+$8NV3ac8xfL{0$5V9kjjK6c4z_FN+G3Gq=|5Uo|sde>Q>FM&Xn zSl@c&b*I1WJAFOLvyDG8bxf45X9l!scos1?HO#`7mi*LRig;omnZ@NLy@Cus+INN%6fN(qt#S| z^^GC?hCU)s4n;IpoL4Fbys{tjN;EBE-wOXOk-PaA0WXRb=f@U74%JK$wvR782y^F9 zgv+#g;Pp>gp|2W*b2OR>A~{e~X5OK$6hWC*PkZpm&cS+9gleXUt*B5#?7$^(7y{$N zHI!*(Xn)Q)6rq|aBI7^|_R}L*il7`;oRwyBWmQ<%r-(TYMNkea&PpwZdlmB)HO`la zeM6}j#1KDTiI@|Ku=y&j>=|aImcvl}ve5{_kcJqIj|rl+^8Ne_hxH!L0Iq2fm=k4Y zsBs8_D_L4ChB_;SxqAhUs?m10WvU(%;&iej=BBt`O8ne z_l`T3&pyd_7KunJ^k94E^jF`$dFL62pK!;sf8{M})hMFfQ*ZJr5$YA|>cz*rcDd`- zk9r(w1x?C8iu!qV77?q>Og+>_d)C2(?O?96$HiFYO#S z|F@k(H7R?$UisStIW{3M&*BWI2y#4ZBkJpZOJsrgY@oaQK*Zjc92*g86*4(ue0UtT zs?`0tAhr|66edjKm@+L%{ofJV1OAuo~r#EBGMo~G% zL$3F5@f}Ve>dj_*FRFJkBaU)gGeTHj8di~o z;7~-PVI0np&&h#2nP)qQBQ=O4WqRec5FCm?26OhALy*IB6l;jya&jM3P8K#($H{_# zTy^x!5i<4(){?Diayw`!pWl1E-_`fd#^(sum3pNbMd+LHaB9Y@#>!^zjd2u>B24z@ ze5*h5N)g4%Jan0F^##%EHxrs^y~}LlP>mw8Zzj3w6`@vo!`g75KipscLO}8}iKCAm z?6e29Z;X3|?DC5gV=0J6BmKOwN;*ZTmF3Vm_$`i|g4a0JGa~NWxMNNEo;&kw$mfb^ zHFJnqYs>FcE27F~6=&Sw;4I3SK{WFSaLk?0y{&>atH>KU8iZ~lp_8CKkpF%I07 zBtkXw2%zn!&uTY>Ra~AL><*yFe4cx12eHosL5(6PPY}kXyGc8r83(QSoNtuDAYQpu zzH6=sqWL_koqGnJ)qMBjF zLQD`=C#unJnA-87=fM^s)oweS`o&g3I7iiJyE-1nUX2kkx}1Y^$sB?jZCAf%5`^cf z-T?rS=YEqdj_-v-5aYA6wT~Zd3mkdE);E~ql_TU%zd>Nt$z2BbZ%$zx4Wd}-8_eM7 z6Cv*=EZS@r-sYPPLvU<3MBga1ZyIJ1#?!v@5Ds}aAsmj7I0i-3yamFn@zZ)$t@Kt+ zI2=*?7PE8d54j0B8lv8p=yy3|ujDJ{pI9kyKZ>qamslBcHn+R1G38tEkJl z4z_&`f7uohv5FcZpN}K2cRlTwXLXjC#8KAQ7E$kmj)tgK@Nndn*GR0dHlBSif(nnZ zt=}LBM-N0DA9bz8^ID;TFdo&k2-GpT1>qdEEh1VEx%bg=uKTEzxxcC{8OJihhF3Dy zT14X&5atnnCW!D|-)06!?*Kzcu6)!+94>RcqGi-pb34@BGg;r9P;v!K+#~bcPfdF> z<%lvTV!rDAf4NnOlQ(D1IE7F8!*D#GyC%@yZahy8YdtgE+(z(bf(YKWB}ap>oaFt* z6p(JVxs?1CG!Zi3Yi?NMEr?r)P1|| zACR|t{zwcFRig;sKiDd9WS!QPLlGDku+r}iT12az4a-AoUP zrbY0pg`*?#+XlDNnNK>z>Pj^>ui$ItijW;ZPuK|IX#J97E^^EY$nd0Hf4+f35x$Z+ znzu&tx$^Ih4v!!;8uljV;E+s2XjT zJ-eE4z$-TK;&Cij+k6*EIYG#YQWMRWZ? z+sQG9fR#NTz*jgFQ8mHg?RwsF{cwtiqiIX5ns0dtsF6E|=R^>!n20G5Ub~jBoX`E# z=qq)cEKJ_r^dNwiVU7=Kq(5w~!fG&sXf%Ro-YBP6&e0EGwgJjg@=522UcrVueP^-uYTWS!hQAA|-aS)AF znfXu)^{0G+&9=(wqkHN=^h6cJDtZm8C}pDKxpH79fmp@}i^V*%TyA={LFhWD>lL53djI0_$C7G3G>AMGl7 \ No newline at end of file From e2fd46f82cc9692211c3a0b61758ef2939273a9c Mon Sep 17 00:00:00 2001 From: Kris Austin Date: Fri, 7 Aug 2026 11:22:26 -0500 Subject: [PATCH 086/106] fix: default-initialize WallToolPathsParams fields (#15138) min_length_factor and is_top_or_bottom_layer had no default initializers, and the FillConcentric/FillConcentricInternal callers never set them, so WallToolPaths::removeSmallLines() thresholded on stack garbage. Which short extrusion lines it dropped then depended on memory layout, so concentric solid-infill output was nondeterministic between runs and across machines. Give every member a default, matching the adjacent FillParams. The perimeter path was already fine because it builds the struct via make_paths_params(). --- src/libslic3r/Arachne/WallToolPaths.hpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/libslic3r/Arachne/WallToolPaths.hpp b/src/libslic3r/Arachne/WallToolPaths.hpp index dde3dc785f..d7120a088c 100644 --- a/src/libslic3r/Arachne/WallToolPaths.hpp +++ b/src/libslic3r/Arachne/WallToolPaths.hpp @@ -23,14 +23,14 @@ inline coord_t meshfix_maximum_extrusion_area_deviation() { return scaled Date: Fri, 7 Aug 2026 11:28:54 -0500 Subject: [PATCH 087/106] fix: Slice all crash on a multi-plate project with an uninitialized toolbar (#15117) _update_select_plate_toolbar_stats_item(true) runs from on_action_slice_all before the select-plate toolbar has necessarily been initialized. m_all_plates_stats_item is only assigned in _init_select_plate_toolbar, so slicing a multi-plate project shortly after startup (before the Preview tab has rendered) leaves the pointer null while show_stats_item is true, and the branch dereferences it, crashing with SIGSEGV. Every other dereference of this pointer already null-checks it. Add the same check here so the all-plates stats item is left unselected until the toolbar is initialized instead of crashing. Fixes #15116 --- src/slic3r/GUI/GLCanvas3D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 27fe44a867..303f9a2b76 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -6977,7 +6977,7 @@ void GLCanvas3D::_update_select_plate_toolbar_stats_item(bool force_selected) { else m_sel_plate_toolbar.show_stats_item = false; - if (force_selected && m_sel_plate_toolbar.show_stats_item) + if (force_selected && m_sel_plate_toolbar.show_stats_item && m_sel_plate_toolbar.m_all_plates_stats_item) m_sel_plate_toolbar.m_all_plates_stats_item->selected = true; } From 8bff9aaf32c00e01a2830987a9d6cf6488d76a77 Mon Sep 17 00:00:00 2001 From: Kris Austin Date: Fri, 7 Aug 2026 11:31:04 -0500 Subject: [PATCH 088/106] fix(GUI): honor "Ignore" when layer height exceeds the configured maximum (#14369) * fix(GUI): honor "Ignore" when layer height exceeds the configured maximum Entering a layer height above the printer's max_layer_height on the Print Settings tab fired two guards in sequence. Tab::on_value_change prompts "...Adjust to the set range automatically?" with an Adjust/Ignore choice, and ConfigManipulation::update_print_fff_config then showed an OK-only "Too large layer height. Reset to X" dialog whose result was never checked, so it always reset the value. The second guard overrode the user's "Ignore", resetting the layer height regardless. Changes: - Extract the shared Adjust/Ignore dialog into ConfigManipulation::layer_height_out_of_range_dialog, reused by the tab (Tab::on_value_change) and the per-object/part settings panels. The dialog now names the value it will clamp to and reads correctly for too-low as well as too-high. - The tab/plate path is already covered by Tab::on_value_change, so the duplicate reset is dropped from update_print_fff_config. - The per-object/part panels have no on_value_change hook, so add ConfigManipulation::check_object_layer_height and call it from the object settings update paths, gated on the edited option (changed_opt_key == "layer_height"). It prompts once per layer-height edit and does not re-prompt when unrelated object settings change after the user chose "Ignore". Fixes #14214 * refactor(GUI): unify the layer-height range check across tab and object panels Copilot review of #14369 noted that the per-object check only guarded the max at extruder 0 and skipped the too-low case, diverging from the tab. Move the whole range check into ConfigManipulation::check_layer_height, used by both Tab::on_value_change and the per-object/part panels. It takes the widest [min, max] window across the printer's extruders, offers Adjust/Ignore in both directions, and resets a near-zero value. The tab's inline block collapses to one call, dropping the duplicated limit logic. * fix(GUI): only enforce layer-height limits that are actually set max_layer_height defaults to 0 (unset), so the unconditional range check offered to clamp any layer height to 0 on presets that don't define it. Guard each branch (near-zero, too-high, too-low) so an unset limit disables that direction; the slice-time nozzle-diameter check still applies. Also run check_layer_height before update_print_fff_config in the object panels so a near-zero per-object value prompts the same way the tab does, with update_print_fff_config's fallback still covering the no-minimum case. --- src/slic3r/GUI/ConfigManipulation.cpp | 69 +++++++++++++++++----- src/slic3r/GUI/ConfigManipulation.hpp | 3 + src/slic3r/GUI/GUI_ObjectSettings.cpp | 8 ++- src/slic3r/GUI/GUI_ObjectSettings.hpp | 2 +- src/slic3r/GUI/GUI_ObjectTableSettings.cpp | 7 ++- src/slic3r/GUI/GUI_ObjectTableSettings.hpp | 2 +- src/slic3r/GUI/Tab.cpp | 38 +----------- 7 files changed, 72 insertions(+), 57 deletions(-) diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index e46faa803a..3885a391b8 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -12,6 +12,7 @@ #include "libslic3r/GCode/AdaptivePAProcessor.hpp" #include "Plater.hpp" +#include #include #include @@ -250,6 +251,59 @@ void ConfigManipulation::check_chamber_minimal_temperature(DynamicPrintConfig* c } } +void ConfigManipulation::layer_height_limits(double& min_layer_height, double& max_layer_height) const +{ + const DynamicPrintConfig& printer_config = GUI::wxGetApp().preset_bundle->printers.get_edited_preset().config; + const std::vector& min_limits = printer_config.option("min_layer_height")->values; + const std::vector& max_limits = printer_config.option("max_layer_height")->values; + min_layer_height = *std::min_element(min_limits.begin(), min_limits.end()); + max_layer_height = *std::max_element(max_limits.begin(), max_limits.end()); +} + +bool ConfigManipulation::check_layer_height(DynamicPrintConfig* config) +{ + double min_layer_height = 0., max_layer_height = 0.; + layer_height_limits(min_layer_height, max_layer_height); + const double layer_height = config->opt_float("layer_height"); + + if (min_layer_height > EPSILON && layer_height < EPSILON) { + const wxString msg_text = wxString::Format(_L("Layer height is too small. It will be set to the minimum (%g mm)."), min_layer_height); + MessageDialog dialog(wxGetApp().plater(), msg_text, "", wxICON_WARNING | wxOK); + dialog.SetButtonLabel(wxID_OK, _L("OK")); + is_msg_dlg_already_exist = true; + dialog.ShowModal(); + is_msg_dlg_already_exist = false; + DynamicPrintConfig new_conf = *config; + new_conf.set_key_value("layer_height", new ConfigOptionFloat(min_layer_height)); + apply(config, &new_conf); + return true; + } + if (max_layer_height > EPSILON && layer_height > max_layer_height + EPSILON) + return layer_height_out_of_range_dialog(config, max_layer_height); + if (min_layer_height > EPSILON && layer_height < min_layer_height - EPSILON) + return layer_height_out_of_range_dialog(config, min_layer_height); + return false; +} + +bool ConfigManipulation::layer_height_out_of_range_dialog(DynamicPrintConfig* config, double clamp_to) +{ + wxString msg_text = _(L("Layer height is outside the limits set in Printer Settings -> Extruder -> Layer height limits, " + "this may cause printing quality issues.")); + msg_text += "\n\n" + wxString::Format(_L("Adjust it to the limit (%g mm) automatically?"), clamp_to); + MessageDialog dialog(wxGetApp().plater(), msg_text, "", wxICON_WARNING | wxYES | wxNO); + dialog.SetButtonLabel(wxID_YES, _L("Adjust")); + dialog.SetButtonLabel(wxID_NO, _L("Ignore")); + is_msg_dlg_already_exist = true; + const bool adjust = dialog.ShowModal() == wxID_YES; + if (adjust) { + DynamicPrintConfig new_conf = *config; + new_conf.set_key_value("layer_height", new ConfigOptionFloat(clamp_to)); + apply(config, &new_conf); + } + is_msg_dlg_already_exist = false; + return adjust; +} + void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, const bool is_global_config, const bool is_plate_config) { // #ys_FIXME_to_delete @@ -264,7 +318,6 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con // layer_height shouldn't be equal to zero auto layer_height = config->opt_float("layer_height"); - auto gpreset = GUI::wxGetApp().preset_bundle->printers.get_edited_preset(); if (layer_height < EPSILON) { const wxString msg_text = _(L("Layer height too small\nIt has been reset to 0.2")); @@ -277,20 +330,6 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con is_msg_dlg_already_exist = false; } - //BBS: limite the max layer_herght - auto max_lh = gpreset.config.opt_float("max_layer_height",0); - if (max_lh > 0.2 && layer_height > max_lh+ EPSILON) - { - const wxString msg_text = wxString::Format(L"Too large layer height.\nReset to %0.3f.", max_lh); - MessageDialog dialog(nullptr, msg_text, "", wxICON_WARNING | wxOK); - DynamicPrintConfig new_conf = *config; - is_msg_dlg_already_exist = true; - dialog.ShowModal(); - new_conf.set_key_value("layer_height", new ConfigOptionFloat(max_lh)); - apply(config, &new_conf); - is_msg_dlg_already_exist = false; - } - //BBS: ironing_spacing shouldn't be too small or equal to zero if (config->opt_float("ironing_spacing") < 0.05) { diff --git a/src/slic3r/GUI/ConfigManipulation.hpp b/src/slic3r/GUI/ConfigManipulation.hpp index d191ef2c4f..ac53ffb4bb 100644 --- a/src/slic3r/GUI/ConfigManipulation.hpp +++ b/src/slic3r/GUI/ConfigManipulation.hpp @@ -86,6 +86,9 @@ public: void check_filament_max_volumetric_speed(DynamicPrintConfig *config); void check_chamber_temperature(DynamicPrintConfig* config); void check_chamber_minimal_temperature(DynamicPrintConfig* config); + bool check_layer_height(DynamicPrintConfig* config); + bool layer_height_out_of_range_dialog(DynamicPrintConfig* config, double clamp_to); + void layer_height_limits(double& min_layer_height, double& max_layer_height) const; void set_is_BBL_Printer(bool is_bbl_printer) { is_BBL_Printer = is_bbl_printer; }; bool get_is_BBL_Printer() { return is_BBL_Printer; }; // SLA print diff --git a/src/slic3r/GUI/GUI_ObjectSettings.cpp b/src/slic3r/GUI/GUI_ObjectSettings.cpp index 65cd99a2fa..25e6204a40 100644 --- a/src/slic3r/GUI/GUI_ObjectSettings.cpp +++ b/src/slic3r/GUI/GUI_ObjectSettings.cpp @@ -139,7 +139,7 @@ bool ObjectSettings::update_settings_list() optgroup->sidetext_width = 5; optgroup->m_on_change = [this, config](const t_config_option_key& opt_id, const boost::any& value) { - this->update_config_values(config); + this->update_config_values(config, opt_id); wxGetApp().obj_list()->changed_object(); }; // call back for rescaling of the extracolumn control @@ -325,7 +325,7 @@ bool ObjectSettings::add_missed_options(ModelConfig* config_to, const DynamicPri return is_added; } -void ObjectSettings::update_config_values(ModelConfig* config) +void ObjectSettings::update_config_values(ModelConfig* config, const std::string& changed_opt_key) { const auto objects_model = wxGetApp().obj_list()->GetModel(); const auto item = wxGetApp().obj_list()->GetSelection(); @@ -403,6 +403,10 @@ void ObjectSettings::update_config_values(ModelConfig* config) } main_config.apply(config->get(), true); + + if (printer_technology == ptFFF && changed_opt_key == "layer_height") + config_manipulation.check_layer_height(&main_config); + printer_technology == ptFFF ? config_manipulation.update_print_fff_config(&main_config) : config_manipulation.update_print_sla_config(&main_config) ; diff --git a/src/slic3r/GUI/GUI_ObjectSettings.hpp b/src/slic3r/GUI/GUI_ObjectSettings.hpp index 8903f8748b..21146425cc 100644 --- a/src/slic3r/GUI/GUI_ObjectSettings.hpp +++ b/src/slic3r/GUI/GUI_ObjectSettings.hpp @@ -66,7 +66,7 @@ public: * we should add sparse_infill_pattern to avoid endless loop in update */ bool add_missed_options(ModelConfig *config_to, const DynamicPrintConfig &config_from); - void update_config_values(ModelConfig *config); + void update_config_values(ModelConfig *config, const std::string& changed_opt_key = ""); void UpdateAndShow(const bool show); void msw_rescale(); void sys_color_changed(); diff --git a/src/slic3r/GUI/GUI_ObjectTableSettings.cpp b/src/slic3r/GUI/GUI_ObjectTableSettings.cpp index 37ccfb8e41..e72c421a08 100644 --- a/src/slic3r/GUI/GUI_ObjectTableSettings.cpp +++ b/src/slic3r/GUI/GUI_ObjectTableSettings.cpp @@ -223,7 +223,7 @@ bool ObjectTableSettings::update_settings_list(bool is_object, bool is_multiple_ std::weak_ptr weak_optgroup(optgroup); optgroup->m_on_change = [this, is_object, object, config, group_category](const t_config_option_key &opt_id, const boost::any &value) { this->m_parent->Freeze(); - this->update_config_values(is_object, object, config, group_category); + this->update_config_values(is_object, object, config, group_category, opt_id); wxGetApp().obj_list()->changed_object(); this->m_parent->Thaw(); //update_extra_column_visible_status(optgroup.get(), cat.second, config); @@ -369,7 +369,7 @@ int ObjectTableSettings::update_extra_column_visible_status(ConfigOptionsGroup* return count; } -void ObjectTableSettings::update_config_values(bool is_object, ModelObject* object, ModelConfig* config, const std::string& category) +void ObjectTableSettings::update_config_values(bool is_object, ModelObject* object, ModelConfig* config, const std::string& category, const std::string& changed_opt_key) { int different_count = 0; const auto printer_technology = wxGetApp().plater()->printer_technology(); @@ -403,6 +403,9 @@ void ObjectTableSettings::update_config_values(bool is_object, ModelObject* obje config_manipulation.set_is_BBL_Printer(wxGetApp().preset_bundle->is_bbl_vendor()); + if (printer_technology == ptFFF && changed_opt_key == "layer_height") + config_manipulation.check_layer_height(&main_config); + printer_technology == ptFFF ? config_manipulation.update_print_fff_config(&main_config) : config_manipulation.update_print_sla_config(&main_config) ; diff --git a/src/slic3r/GUI/GUI_ObjectTableSettings.hpp b/src/slic3r/GUI/GUI_ObjectTableSettings.hpp index 534426f554..39e7e514e2 100644 --- a/src/slic3r/GUI/GUI_ObjectTableSettings.hpp +++ b/src/slic3r/GUI/GUI_ObjectTableSettings.hpp @@ -70,7 +70,7 @@ public: bool add_missed_options(ModelConfig *config_to, const DynamicPrintConfig &config_from); //return visible count int update_extra_column_visible_status(ConfigOptionsGroup* option_group, const std::vector& option_keys, ModelConfig* config); - void update_config_values(bool is_object, ModelObject* object, ModelConfig* config, const std::string& category); + void update_config_values(bool is_object, ModelObject* object, ModelConfig* config, const std::string& category, const std::string& changed_opt_key = ""); void UpdateAndShow(int row, const bool show, bool is_object, bool is_multiple_selection, ModelObject* object, ModelConfig* config, const std::string& category); void ValueChanged(int row, bool is_object, ModelObject* object, ModelConfig* config, const std::string& category, const std::string& key); void resetAllValues(int row, bool is_object, ModelObject* object, ModelConfig* config, const std::string& category); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 64c2b586c8..1a31355d0e 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2136,43 +2136,9 @@ void Tab::on_value_change(const std::string& opt_key, const boost::any& value) m_last_sparse_infill_rotate_template_value = m_config->opt_string("sparse_infill_rotate_template"); } - if(opt_key=="layer_height"){ - auto min_layer_height_from_nozzle=m_preset_bundle->full_config().option("min_layer_height")->values; - auto max_layer_height_from_nozzle=m_preset_bundle->full_config().option("max_layer_height")->values; - auto layer_height_floor = *std::min_element(min_layer_height_from_nozzle.begin(), min_layer_height_from_nozzle.end()); - auto layer_height_ceil = *std::max_element(max_layer_height_from_nozzle.begin(), max_layer_height_from_nozzle.end()); - const auto lh = m_config->opt_float("layer_height"); - bool exceed_minimum_flag = lh < layer_height_floor; - bool exceed_maximum_flag = lh > layer_height_ceil; - - if (exceed_maximum_flag || exceed_minimum_flag) { - if (lh < EPSILON) { - auto msg_text = _(L("Layer height is too small.\nIt will set to min_layer_height\n")); - MessageDialog dialog(wxGetApp().plater(), msg_text, "", wxICON_WARNING | wxOK); - dialog.SetButtonLabel(wxID_OK, _L("OK")); - dialog.ShowModal(); - auto new_conf = *m_config; - new_conf.set_key_value("layer_height", new ConfigOptionFloat(layer_height_floor)); - m_config_manipulation.apply(m_config, &new_conf); - } else { - wxString msg_text = _(L("Layer height exceeds the limit in Printer Settings -> Extruder -> Layer height limits, " - "this may cause printing quality issues.")); - msg_text += "\n\n" + _(L("Adjust to the set range automatically?\n")); - MessageDialog dialog(wxGetApp().plater(), msg_text, "", wxICON_WARNING | wxYES | wxNO); - dialog.SetButtonLabel(wxID_YES, _L("Adjust")); - dialog.SetButtonLabel(wxID_NO, _L("Ignore")); - auto answer = dialog.ShowModal(); - auto new_conf = *m_config; - if (answer == wxID_YES) { - if (exceed_maximum_flag) - new_conf.set_key_value("layer_height", new ConfigOptionFloat(layer_height_ceil)); - if (exceed_minimum_flag) - new_conf.set_key_value("layer_height", new ConfigOptionFloat(layer_height_floor)); - m_config_manipulation.apply(m_config, &new_conf); - } - } + if (opt_key == "layer_height") { + if (m_config_manipulation.check_layer_height(m_config)) wxGetApp().plater()->update(); - } } string opt_key_without_idx = opt_key.substr(0, opt_key.find('#')); From 74aed7a2bb4bb2452ca0048ecfb658c55c503d72 Mon Sep 17 00:00:00 2001 From: Kris Austin Date: Fri, 7 Aug 2026 11:33:37 -0500 Subject: [PATCH 089/106] test: finish the temp-file cleanup (#14976) Follow-up to #14785. Routes the tests that still hand-rolled temp paths through the shared helpers and unifies the temp guards. - Add ScopedTemporaryDir and a shared ScopedTemporaryPath base under it and ScopedTemporaryFile. - Move test_3mf's round-trip .3mf output out of the TEST_DATA_DIR source tree (a fixed-name leak) and test_toolordering's fixed-name temp .gcode (a sharding collision) onto ScopedTemporaryFile. - Move test_config, test_slicing_pipeline_bindings, the test_3mf backup dirs, and test_preset_bundle_loading onto the guards. - Make slic3rutils ScopedDataDir compose ScopedTemporaryDir; dedupe test_network_versions' fixture and delete test_plugin_lifecycle's duplicate. --- tests/libslic3r/test_3mf.cpp | 36 +++----- tests/libslic3r/test_config.cpp | 7 +- .../libslic3r/test_preset_bundle_loading.cpp | 50 ++++------- .../test_toolordering_nozzle_group.cpp | 9 +- tests/slic3rutils/plugin_test_utils.hpp | 20 ++--- tests/slic3rutils/test_network_versions.cpp | 19 ++--- tests/slic3rutils/test_plugin_lifecycle.cpp | 28 +------ .../test_slicing_pipeline_bindings.cpp | 8 +- tests/test_utils.hpp | 82 +++++++++++-------- 9 files changed, 106 insertions(+), 153 deletions(-) diff --git a/tests/libslic3r/test_3mf.cpp b/tests/libslic3r/test_3mf.cpp index a6fe3ed460..c839149f5f 100644 --- a/tests/libslic3r/test_3mf.cpp +++ b/tests/libslic3r/test_3mf.cpp @@ -155,10 +155,8 @@ SCENARIO("H2C multi-nozzle .3mf round-trip", "[3mf][MultiNozzle]") { // store_bbs_3mf stages Metadata/project_settings.config through the model's backup path; // point it at a writable temp dir (the default lives under a read-only root in CI). - std::string backup_dir = - (boost::filesystem::temp_directory_path() / boost::filesystem::unique_path("orca_mn_%%%%%%%%")).string(); - boost::filesystem::create_directories(backup_dir); - model.set_backup_path(backup_dir); + ScopedTemporaryDir backup_dir("orca_mn"); + model.set_backup_path(backup_dir.string()); // Global (printer) config: give nozzle_volume_type a non-default value so the slice_info // read-back is a meaningful assertion (High Flow == 1). @@ -180,7 +178,8 @@ SCENARIO("H2C multi-nozzle .3mf round-trip", "[3mf][MultiNozzle]") { plate->config.set_key_value("enable_filament_dynamic_map", new ConfigOptionBool(true)); WHEN("stored to and reloaded from a .3mf") { - std::string test_file = std::string(TEST_DATA_DIR) + "/test_3mf/mn_roundtrip.3mf"; + ScopedTemporaryFile temp(".3mf"); + const std::string test_file = temp.string(); StoreParams store_params; store_params.path = test_file.c_str(); @@ -202,8 +201,6 @@ SCENARIO("H2C multi-nozzle .3mf round-trip", "[3mf][MultiNozzle]") { bool loaded = load_bbs_3mf(test_file.c_str(), &dst_config, &ctxt, &dst_model, &dst_plates, &project_presets, &is_bbl_3mf, &is_orca_3mf, &file_version, nullptr, LoadStrategy::LoadModel | LoadStrategy::LoadConfig); - boost::filesystem::remove(test_file); - THEN("every multi-nozzle key round-trips as expected") { REQUIRE(loaded); REQUIRE(dst_plates.size() >= 1); @@ -233,7 +230,6 @@ SCENARIO("H2C multi-nozzle .3mf round-trip", "[3mf][MultiNozzle]") { release_PlateData_list(dst_plates); } delete plate; // store_bbs_3mf does not take ownership of the source plate - boost::filesystem::remove_all(backup_dir); } } @@ -250,10 +246,8 @@ SCENARIO("Non-standard nozzle diameter survives .3mf save on a single-nozzle pri REQUIRE(load_stl(src_file.c_str(), &model)); model.add_default_instances(); - std::string backup_dir = - (boost::filesystem::temp_directory_path() / boost::filesystem::unique_path("orca_nd_%%%%%%%%")).string(); - boost::filesystem::create_directories(backup_dir); - model.set_backup_path(backup_dir); + ScopedTemporaryDir backup_dir("orca_nd"); + model.set_backup_path(backup_dir.string()); // Single extruder with a non-standard 0.5 mm nozzle; extruder_max_nozzle_count stays at its // default (no nozzle cluster), so the writer must emit the exact config diameter. @@ -276,7 +270,8 @@ SCENARIO("Non-standard nozzle diameter survives .3mf save on a single-nozzle pri plate->slice_filaments_info.push_back(fi); WHEN("stored to and reloaded from a .3mf") { - std::string test_file = std::string(TEST_DATA_DIR) + "/test_3mf/nd_roundtrip.3mf"; + ScopedTemporaryFile temp(".3mf"); + const std::string test_file = temp.string(); StoreParams store_params; store_params.path = test_file.c_str(); @@ -296,8 +291,6 @@ SCENARIO("Non-standard nozzle diameter survives .3mf save on a single-nozzle pri bool loaded = load_bbs_3mf(test_file.c_str(), &dst_config, &ctxt, &dst_model, &dst_plates, &project_presets, &is_bbl_3mf, &is_orca_3mf, &file_version, nullptr, LoadStrategy::LoadModel | LoadStrategy::LoadConfig); - boost::filesystem::remove(test_file); - THEN("the saved nozzle diameter is the exact 0.5, not the rounded 0.4") { REQUIRE(loaded); REQUIRE(dst_plates.size() >= 1); @@ -315,7 +308,6 @@ SCENARIO("Non-standard nozzle diameter survives .3mf save on a single-nozzle pri release_PlateData_list(dst_plates); } delete plate; // store_bbs_3mf does not take ownership of the source plate - boost::filesystem::remove_all(backup_dir); } } @@ -436,10 +428,8 @@ SCENARIO("Nozzle-group metadata .3mf round-trip", "[3mf][MultiNozzle]") { REQUIRE(load_stl(src_file.c_str(), &model)); model.add_default_instances(); - std::string backup_dir = - (boost::filesystem::temp_directory_path() / boost::filesystem::unique_path("orca_ng_%%%%%%%%")).string(); - boost::filesystem::create_directories(backup_dir); - model.set_backup_path(backup_dir); + ScopedTemporaryDir backup_dir("orca_ng"); + model.set_backup_path(backup_dir.string()); DynamicPrintConfig config = DynamicPrintConfig::full_print_config(); @@ -459,7 +449,8 @@ SCENARIO("Nozzle-group metadata .3mf round-trip", "[3mf][MultiNozzle]") { plate->config.set_key_value("filament_map", new ConfigOptionInts({ 1, 2, 1 })); WHEN("stored to and reloaded from a .3mf") { - std::string test_file = std::string(TEST_DATA_DIR) + "/test_3mf/ng_roundtrip.3mf"; + ScopedTemporaryFile temp(".3mf"); + const std::string test_file = temp.string(); StoreParams store_params; store_params.path = test_file.c_str(); @@ -479,8 +470,6 @@ SCENARIO("Nozzle-group metadata .3mf round-trip", "[3mf][MultiNozzle]") { bool loaded = load_bbs_3mf(test_file.c_str(), &dst_config, &ctxt, &dst_model, &dst_plates, &project_presets, &is_bbl_3mf, &is_orca_3mf, &file_version, nullptr, LoadStrategy::LoadModel | LoadStrategy::LoadConfig); - boost::filesystem::remove(test_file); - THEN("the tags round-trip into the loaded plate's nozzles_info") { REQUIRE(loaded); REQUIRE(dst_plates.size() >= 1); @@ -506,6 +495,5 @@ SCENARIO("Nozzle-group metadata .3mf round-trip", "[3mf][MultiNozzle]") { release_PlateData_list(dst_plates); } delete plate; - boost::filesystem::remove_all(backup_dir); } } diff --git a/tests/libslic3r/test_config.cpp b/tests/libslic3r/test_config.cpp index f256ae3442..5bc825c3b2 100644 --- a/tests/libslic3r/test_config.cpp +++ b/tests/libslic3r/test_config.cpp @@ -4,6 +4,8 @@ #include "libslic3r/PrintConfigConstants.hpp" #include "libslic3r/LocalesUtils.hpp" +#include "test_utils.hpp" + #include #include #include @@ -407,8 +409,7 @@ SCENARIO("update_diff_values_to_child_config tolerates legacy machine-limit vect // } TEST_CASE("save_to_json round-trips plugin capability references as strings", "[Config][plugins]") { - namespace fs = boost::filesystem; - const fs::path tmp = fs::temp_directory_path() / fs::unique_path("orca_plugins_%%%%-%%%%.json"); + ScopedTemporaryFile tmp(".json"); const std::vector refs = { "local_plugin;;inset", "cloud_plugin;550e8400-e29b-41d4-a716-446655440000;inset" @@ -435,8 +436,6 @@ TEST_CASE("save_to_json round-trips plugin capability references as strings", "[ REQUIRE(reloaded.load_from_json(tmp.string(), substitutions, true, key_values, reason) == 0); CHECK(reason.empty()); CHECK(reloaded.option("slicing_pipeline_plugin")->values == refs); - - fs::remove(tmp); } TEST_CASE("plugin capability references survive string-map serialization", "[Config][plugins]") { diff --git a/tests/libslic3r/test_preset_bundle_loading.cpp b/tests/libslic3r/test_preset_bundle_loading.cpp index c697c4461c..844ccb6a8b 100644 --- a/tests/libslic3r/test_preset_bundle_loading.cpp +++ b/tests/libslic3r/test_preset_bundle_loading.cpp @@ -5,28 +5,14 @@ #include "libslic3r/PresetBundle.hpp" #include "libslic3r/AppConfig.hpp" +#include "test_utils.hpp" + using namespace Slic3r; namespace { namespace fs = boost::filesystem; -struct TempPresetDir { - fs::path path; - - TempPresetDir() - { - path = fs::temp_directory_path() / fs::unique_path("orcaslicer-preset-%%%%-%%%%-%%%%"); - fs::create_directories(path); - } - - ~TempPresetDir() - { - boost::system::error_code ec; - fs::remove_all(path, ec); - } -}; - void write_print_preset(const DynamicPrintConfig &default_config, const fs::path &file, const std::string &name, const std::string &inherits = {}) { DynamicPrintConfig config(default_config); @@ -82,17 +68,17 @@ struct RenameTestCollection : public PresetCollection TEST_CASE("Preset identity is canonicalized from load path", "[Preset][Identity]") { - TempPresetDir temp_dir; + ScopedTemporaryDir temp_dir; PresetBundle bundle; PresetsConfigSubstitutions substitutions; - write_print_preset(bundle.prints.default_preset().config, temp_dir.path / PRESET_PRINT_NAME / "User.json", "User"); - write_print_preset(bundle.prints.default_preset().config, temp_dir.path / PRESET_LOCAL_DIR / "bundle-1" / PRESET_PRINT_NAME / "LocalBundle.json", "LocalBundle"); - write_print_preset(bundle.prints.default_preset().config, temp_dir.path / PRESET_SUBSCRIBED_DIR / "remote-1" / PRESET_PRINT_NAME / "Subscribed.json", "Subscribed"); + write_print_preset(bundle.prints.default_preset().config, temp_dir.path() / PRESET_PRINT_NAME / "User.json", "User"); + write_print_preset(bundle.prints.default_preset().config, temp_dir.path() / PRESET_LOCAL_DIR / "bundle-1" / PRESET_PRINT_NAME / "LocalBundle.json", "LocalBundle"); + write_print_preset(bundle.prints.default_preset().config, temp_dir.path() / PRESET_SUBSCRIBED_DIR / "remote-1" / PRESET_PRINT_NAME / "Subscribed.json", "Subscribed"); - bundle.prints.load_presets(temp_dir.path.string(), PRESET_PRINT_NAME, substitutions, ForwardCompatibilitySubstitutionRule::Disable); - bundle.prints.load_presets((temp_dir.path / PRESET_LOCAL_DIR / "bundle-1").string(), PRESET_PRINT_NAME, substitutions, ForwardCompatibilitySubstitutionRule::Disable); - bundle.prints.load_presets((temp_dir.path / PRESET_SUBSCRIBED_DIR / "remote-1").string(), PRESET_PRINT_NAME, substitutions, ForwardCompatibilitySubstitutionRule::Disable); + bundle.prints.load_presets(temp_dir.path().string(), PRESET_PRINT_NAME, substitutions, ForwardCompatibilitySubstitutionRule::Disable); + bundle.prints.load_presets((temp_dir.path() / PRESET_LOCAL_DIR / "bundle-1").string(), PRESET_PRINT_NAME, substitutions, ForwardCompatibilitySubstitutionRule::Disable); + bundle.prints.load_presets((temp_dir.path() / PRESET_SUBSCRIBED_DIR / "remote-1").string(), PRESET_PRINT_NAME, substitutions, ForwardCompatibilitySubstitutionRule::Disable); const Preset *root_user = bundle.prints.find_preset("User"); REQUIRE(root_user != nullptr); @@ -112,14 +98,14 @@ TEST_CASE("Preset identity is canonicalized from load path", "[Preset][Identity] TEST_CASE("Legacy bundle import without bundle metadata stays in the user preset directory", "[Preset][Identity]") { - TempPresetDir temp_dir; + ScopedTemporaryDir temp_dir; PresetBundle bundle; PresetsConfigSubstitutions substitutions; std::vector result; int overwrite = 0; - std::string file = (temp_dir.path / "legacy-bundle" / "Imported.json").string(); - const fs::path user_root = temp_dir.path / "user"; + std::string file = (temp_dir.path() / "legacy-bundle" / "Imported.json").string(); + const fs::path user_root = temp_dir.path() / "user"; write_print_preset(bundle.prints.default_preset().config, file, "Imported"); fs::create_directories(user_root); @@ -252,7 +238,7 @@ TEST_CASE("find_preset2 auto-matches removed Generic vendor profiles to the libr TEST_CASE("Renamed parent is normalized into a loaded preset's inherits", "[Preset][Rename]") { - TempPresetDir temp_dir; + ScopedTemporaryDir temp_dir; RenameTestCollection coll; // Current parent, renamed from "Old Process". @@ -262,10 +248,10 @@ TEST_CASE("Renamed parent is normalized into a loaded preset's inherits", "[Pres // A user preset on disk that still inherits the OLD name. write_preset_with_inherits(coll.default_preset().config, - temp_dir.path / PRESET_PRINT_NAME / "Child.json", "Child", "Old Process"); + temp_dir.path() / PRESET_PRINT_NAME / "Child.json", "Child", "Old Process"); PresetsConfigSubstitutions substitutions; - coll.load_presets(temp_dir.path.string(), PRESET_PRINT_NAME, substitutions, + coll.load_presets(temp_dir.path().string(), PRESET_PRINT_NAME, substitutions, ForwardCompatibilitySubstitutionRule::Disable); const Preset *child = coll.find_preset("Child"); @@ -279,17 +265,17 @@ TEST_CASE("Renamed parent is normalized into a loaded preset's inherits", "[Pres TEST_CASE("Removed Generic parent is normalized into a loaded filament's inherits", "[Preset][Rename]") { - TempPresetDir temp_dir; + ScopedTemporaryDir temp_dir; PresetBundle bundle; add_inmemory_preset(bundle.filaments, "Generic PLA @System"); // A user filament that still inherits a removed " Generic PLA" profile. write_preset_with_inherits(bundle.filaments.default_preset().config, - temp_dir.path / PRESET_FILAMENT_NAME / "MyPLA.json", "MyPLA", "Voron Generic PLA"); + temp_dir.path() / PRESET_FILAMENT_NAME / "MyPLA.json", "MyPLA", "Voron Generic PLA"); PresetsConfigSubstitutions substitutions; - bundle.filaments.load_presets(temp_dir.path.string(), PRESET_FILAMENT_NAME, substitutions, + bundle.filaments.load_presets(temp_dir.path().string(), PRESET_FILAMENT_NAME, substitutions, ForwardCompatibilitySubstitutionRule::Disable); const Preset *child = bundle.filaments.find_preset("MyPLA"); diff --git a/tests/libslic3r/test_toolordering_nozzle_group.cpp b/tests/libslic3r/test_toolordering_nozzle_group.cpp index dc54aae80a..26e36c0dbf 100644 --- a/tests/libslic3r/test_toolordering_nozzle_group.cpp +++ b/tests/libslic3r/test_toolordering_nozzle_group.cpp @@ -8,6 +8,8 @@ #include "libslic3r/Print.hpp" #include "libslic3r/TriangleMesh.hpp" +#include "test_utils.hpp" + #include #include #include @@ -708,10 +710,9 @@ TEST_CASE("Sequential selector prints publish a stitched result and cache the pl REQUIRE(print.config().filament_self_index.values.size() >= print.config().filament_map.values.size()); // Export must consume the cached plans and produce g-code without throwing. - boost::filesystem::path gcode_path = boost::filesystem::temp_directory_path() / "orca_seq_dynamic_publish_test.gcode"; - REQUIRE_NOTHROW(print.export_gcode(gcode_path.string(), nullptr, nullptr)); - REQUIRE(boost::filesystem::exists(gcode_path)); - boost::filesystem::remove(gcode_path); + ScopedTemporaryFile gcode(".gcode"); + REQUIRE_NOTHROW(print.export_gcode(gcode.string(), nullptr, nullptr)); + REQUIRE(boost::filesystem::exists(gcode.path())); } TEST_CASE("Per-variant expansion gives migrating filaments one slot per variant", "[PrintConfig][H2C][Dynamic]") diff --git a/tests/slic3rutils/plugin_test_utils.hpp b/tests/slic3rutils/plugin_test_utils.hpp index 52e503f6f4..d60b3441c8 100644 --- a/tests/slic3rutils/plugin_test_utils.hpp +++ b/tests/slic3rutils/plugin_test_utils.hpp @@ -6,6 +6,8 @@ #include +#include "test_utils.hpp" + namespace Slic3r { // Point data_dir() at a throwaway directory for the lifetime of a test and @@ -13,24 +15,20 @@ namespace Slic3r { // disposable tree and tests don't leak state into each other. struct ScopedDataDir { + ScopedTemporaryDir tmp; // owns the temp dir (create + recursive remove) + boost::filesystem::path dir; // = tmp.path(); kept as a member for callers std::string previous; - boost::filesystem::path dir; explicit ScopedDataDir(const std::string& tag) + : tmp("orca-" + tag), dir(tmp.path()), previous(data_dir()) { - namespace fs = boost::filesystem; - previous = data_dir(); - dir = fs::temp_directory_path() / fs::unique_path("orca-" + tag + "-%%%%-%%%%"); - fs::create_directories(dir); set_data_dir(dir.string()); } - ~ScopedDataDir() - { - set_data_dir(previous); - boost::system::error_code ec; - boost::filesystem::remove_all(dir, ec); - } + ~ScopedDataDir() { set_data_dir(previous); } // tmp removes the directory + + // The plugin manager scans {data_dir}/orca_plugins. + boost::filesystem::path plugins_dir() const { return dir / "orca_plugins"; } ScopedDataDir(const ScopedDataDir&) = delete; ScopedDataDir& operator=(const ScopedDataDir&) = delete; diff --git a/tests/slic3rutils/test_network_versions.cpp b/tests/slic3rutils/test_network_versions.cpp index efe8b5d831..349082a965 100644 --- a/tests/slic3rutils/test_network_versions.cpp +++ b/tests/slic3rutils/test_network_versions.cpp @@ -6,6 +6,8 @@ #include "libslic3r/Utils.hpp" #include "slic3r/Utils/bambu_networking.hpp" +#include "plugin_test_utils.hpp" + using namespace Slic3r; namespace fs = boost::filesystem; @@ -25,27 +27,16 @@ static const char* PLUGIN_EXT = ".so"; struct PluginFolderFixture { - fs::path root; - std::string previous_data_dir; + ScopedDataDir data{"netver"}; PluginFolderFixture() { - previous_data_dir = data_dir(); - root = fs::temp_directory_path() / fs::unique_path("orca-netver-%%%%%%%%"); - fs::create_directories(root / "plugins"); - set_data_dir(root.string()); - } - - ~PluginFolderFixture() - { - set_data_dir(previous_data_dir); - boost::system::error_code ec; - fs::remove_all(root, ec); + fs::create_directories(data.dir / "plugins"); } void add_plugin(const std::string& version) { - boost::nowide::ofstream f((root / "plugins" / (PLUGIN_PREFIX + version + PLUGIN_EXT)).string()); + boost::nowide::ofstream f((data.dir / "plugins" / (PLUGIN_PREFIX + version + PLUGIN_EXT)).string()); f << "stub"; } }; diff --git a/tests/slic3rutils/test_plugin_lifecycle.cpp b/tests/slic3rutils/test_plugin_lifecycle.cpp index c49471de28..63a4e6827b 100644 --- a/tests/slic3rutils/test_plugin_lifecycle.cpp +++ b/tests/slic3rutils/test_plugin_lifecycle.cpp @@ -6,6 +6,8 @@ #include #include +#include "plugin_test_utils.hpp" + #include #include @@ -25,32 +27,6 @@ namespace fs = boost::filesystem; namespace { -// Point data_dir() at a throwaway directory for the lifetime of a test and restore the previous -// value afterwards, so discovery scans a disposable {data_dir}/orca_plugins tree and tests don't -// leak state into each other. -struct ScopedDataDir -{ - std::string previous; - fs::path dir; - - explicit ScopedDataDir(const std::string& tag) - { - previous = data_dir(); - dir = fs::temp_directory_path() / fs::unique_path("orca-" + tag + "-%%%%-%%%%"); - fs::create_directories(dir); - set_data_dir(dir.string()); - } - - ~ScopedDataDir() - { - set_data_dir(previous); - boost::system::error_code ec; - fs::remove_all(dir, ec); - } - - fs::path plugins_dir() const { return dir / "orca_plugins"; } -}; - // Brings the plugin system up, and tears it down explicitly at the end of the test. // // Shutting the interpreter down here, rather than leaving it to PythonInterpreter's static diff --git a/tests/slic3rutils/test_slicing_pipeline_bindings.cpp b/tests/slic3rutils/test_slicing_pipeline_bindings.cpp index 8f00b6f31b..5e819c09e0 100644 --- a/tests/slic3rutils/test_slicing_pipeline_bindings.cpp +++ b/tests/slic3rutils/test_slicing_pipeline_bindings.cpp @@ -16,6 +16,8 @@ TEST_CASE("SlicingPipeline capability-type string maps round-trip", "[slicing_pi #include "libslic3r/Point.hpp" #include "libslic3r/ExPolygon.hpp" #include "libslic3r/Surface.hpp" + +#include "test_utils.hpp" #include "libslic3r/Layer.hpp" #include "libslic3r/ExtrusionEntity.hpp" #include "libslic3r/ExtrusionEntityCollection.hpp" @@ -142,7 +144,7 @@ TEST_CASE("orca.slicing psGCodePostProcess context: file edit in place + config import_orca_module(); py::gil_scoped_acquire gil; - const fs::path gpath = fs::temp_directory_path() / fs::unique_path("orca_pp_%%%%-%%%%.gcode"); + ScopedTemporaryFile gpath(".gcode"); { boost::nowide::ofstream ofs(gpath.string()); ofs << "; header\nG1 X0 Y0\n"; @@ -196,9 +198,7 @@ _pp_result = Stamp().execute(_pp_ctx) boost::nowide::ifstream ifs(gpath.string()); std::stringstream ss; ss << ifs.rdbuf(); contents = ss.str(); } - CHECK(contents.find("; stamped by File") != std::string::npos); - fs::remove(gpath); -} + CHECK(contents.find("; stamped by File") != std::string::npos);} // --------------------------------------------------------------------------- // Toolpath helpers for the raw-graph tests. diff --git a/tests/test_utils.hpp b/tests/test_utils.hpp index d928f2f41e..97e684fd6e 100644 --- a/tests/test_utils.hpp +++ b/tests/test_utils.hpp @@ -27,26 +27,47 @@ inline Slic3r::TriangleMesh load_model(const std::string &obj_filename) return mesh; } -// RAII holder for a unique temporary file path, removed when the guard goes out -// of scope so a failing assertion never leaks it. Uses the system temp dir with -// a unique name (parallel-safe, cross-platform). The file itself is created by -// whoever writes to path()/string(); this only reserves the name and cleans up. -class ScopedTemporaryFile +// --------------------------------------------------------------------------- +// Scoped temporary paths +// --------------------------------------------------------------------------- + +// Owns a unique path under the system temp dir, "-[]" +// (parallel-safe, cross-platform). Shared base for the two RAII temp guards below. +class ScopedTemporaryPath +{ +public: + const boost::filesystem::path &path() const { return m_path; } + std::string string() const { return m_path.string(); } + ScopedTemporaryPath(const ScopedTemporaryPath &) = delete; + ScopedTemporaryPath &operator=(const ScopedTemporaryPath &) = delete; + +protected: + ScopedTemporaryPath(const std::string &prefix, const std::string &extension) + : m_path(boost::filesystem::temp_directory_path() + / boost::filesystem::unique_path(prefix + "-%%%%-%%%%-%%%%" + extension)) + {} + ~ScopedTemporaryPath() = default; // non-virtual: never deleted through a base pointer + + boost::filesystem::path m_path; +}; + +// A temp file the caller creates by writing to path()/string(); the guard only +// reserves the name and removes the file on scope exit. +class ScopedTemporaryFile : public ScopedTemporaryPath { public: explicit ScopedTemporaryFile(const std::string &extension = ".tmp") - : m_path(boost::filesystem::temp_directory_path() - / boost::filesystem::unique_path("orca-%%%%-%%%%-%%%%" + extension)) - {} + : ScopedTemporaryPath("orca", extension) {} ~ScopedTemporaryFile() { boost::system::error_code ec; boost::filesystem::remove(m_path, ec); } - ScopedTemporaryFile(const ScopedTemporaryFile &) = delete; - ScopedTemporaryFile &operator=(const ScopedTemporaryFile &) = delete; +}; - const boost::filesystem::path &path() const { return m_path; } - std::string string() const { return m_path.string(); } - -private: - boost::filesystem::path m_path; +// A temp directory created on construction and removed recursively on scope exit. +class ScopedTemporaryDir : public ScopedTemporaryPath +{ +public: + explicit ScopedTemporaryDir(const std::string &prefix = "orca") + : ScopedTemporaryPath(prefix, "") { boost::filesystem::create_directories(m_path); } + ~ScopedTemporaryDir() { boost::system::error_code ec; boost::filesystem::remove_all(m_path, ec); } }; // --------------------------------------------------------------------------- @@ -66,7 +87,7 @@ inline std::string debug_artifact_path(const std::string &name) boost::filesystem::path dir = boost::filesystem::temp_directory_path() / boost::filesystem::unique_path("orca-test-artifacts-%%%%-%%%%"); boost::filesystem::create_directories(dir); - std::printf("Debug test artifacts will be written to %s\n", dir.string().c_str()); + std::fprintf(stderr, "Debug test artifacts will be written to %s\n", dir.string().c_str()); return dir; }(); boost::filesystem::path full = root / name; @@ -75,57 +96,52 @@ inline std::string debug_artifact_path(const std::string &name) } // Dump a mesh as OBJ. -inline void write_debug_obj(const std::string &name, const Slic3r::TriangleMesh &mesh) +inline void write_debug_obj([[maybe_unused]] const std::string &name, + [[maybe_unused]] const Slic3r::TriangleMesh &mesh) { #ifndef NDEBUG mesh.WriteOBJFile(debug_artifact_path(name).c_str()); -#else - (void) name; (void) mesh; #endif } -inline void write_debug_obj(const std::string &name, const indexed_triangle_set &its) +inline void write_debug_obj([[maybe_unused]] const std::string &name, + [[maybe_unused]] const indexed_triangle_set &its) { #ifndef NDEBUG its_write_obj(its, debug_artifact_path(name).c_str()); -#else - (void) name; (void) its; #endif } // Dump a mesh as ASCII STL. -inline void write_debug_stl(const std::string &name, const Slic3r::TriangleMesh &mesh) +inline void write_debug_stl([[maybe_unused]] const std::string &name, + [[maybe_unused]] const Slic3r::TriangleMesh &mesh) { #ifndef NDEBUG mesh.write_ascii(debug_artifact_path(name).c_str()); -#else - (void) name; (void) mesh; #endif } // Draw an SVG artifact through a callback that receives the open SVG. Second // overload takes a BoundingBox when the drawing needs one. template -inline void write_debug_svg(const std::string &name, Draw &&draw) +inline void write_debug_svg([[maybe_unused]] const std::string &name, [[maybe_unused]] Draw &&draw) { #ifndef NDEBUG Slic3r::SVG svg(debug_artifact_path(name)); draw(svg); svg.Close(); -#else - (void) name; (void) draw; #endif } template -inline void write_debug_svg(const std::string &name, const Slic3r::BoundingBox &bbox, Draw &&draw) +inline void write_debug_svg([[maybe_unused]] const std::string &name, + [[maybe_unused]] const Slic3r::BoundingBox &bbox, + [[maybe_unused]] Draw &&draw) { #ifndef NDEBUG Slic3r::SVG svg(debug_artifact_path(name), bbox); draw(svg); svg.Close(); -#else - (void) name; (void) bbox; (void) draw; #endif } @@ -133,13 +149,11 @@ inline void write_debug_svg(const std::string &name, const Slic3r::BoundingBox & // artifact. operator<< is resolved by ADL at the call site, so this header needn't // include the producer's headers. template -inline void write_debug_stream(const std::string &name, Produce &&produce) +inline void write_debug_stream([[maybe_unused]] const std::string &name, [[maybe_unused]] Produce &&produce) { #ifndef NDEBUG std::ofstream out(debug_artifact_path(name), std::ios::out | std::ios::binary); out << produce(); -#else - (void) name; (void) produce; #endif } From af9fd10d7ae5fd6c9eb54b65ff58f324bd91c301 Mon Sep 17 00:00:00 2001 From: Mitchell Mashburn <128167557+re3Dev@users.noreply.github.com> Date: Fri, 7 Aug 2026 12:07:03 -0500 Subject: [PATCH 090/106] re:3D profile updates. (#15169) * re:3D profile updates. - Replace vendor-specific "re3D Greengate rPETG" filament with a generic "re3D rPETG" (base + @0.8/@1.75 nozzle variants), matching the naming convention used for rPLA/rPETG elsewhere in the re:3D vendor pack. - Add fdm_filament_pp as a proper filament-type parent and switch re3D rPP to inherit from it instead of overriding filament_type on top of fdm_filament_pet. - Added filament_type to the specific printer JSON file and removed from the base printer JSON file [fixes Issue#14693] - Updates to speeds and accelerations for re:3D profiles, moved from common to machine processes [closed: PR#14259] - Updates to fdm profile filename format so that it lists the filename and extruder number in the sliced .gcode file * Fix setting IDs * Add rename from for changed material names. --- resources/profiles/re3D.json | 431 +++++++++--------- .../re3D/filament/fdm_filament_pp.json | 10 + .../re3D/filament/re3D PC @0.4 nozzle.json | 3 + .../re3D/filament/re3D PC @0.8 nozzle.json | 3 + .../re3D/filament/re3D PETG @0.4 nozzle.json | 3 + .../re3D/filament/re3D PETG @0.8 nozzle.json | 3 + .../re3D/filament/re3D PLA @0.4 nozzle.json | 3 + .../re3D/filament/re3D PLA @0.8 nozzle.json | 3 + ...ozzle.json => re3D rPETG @0.8 nozzle.json} | 11 +- ...zzle.json => re3D rPETG @1.75 nozzle.json} | 11 +- ...D Greengate rPETG.json => re3D rPETG.json} | 7 +- .../re3D/filament/re3D rPP @0.8 nozzle.json | 2 +- .../re3D/filament/re3D rPP @1.75 nozzle.json | 2 +- .../profiles/re3D/filament/re3D rPP.json | 5 +- .../machine/re3D Gigabot 4 0.4 nozzle.json | 2 +- .../machine/re3D Gigabot 4 0.8 nozzle.json | 2 +- .../re3D Gigabot 4 XLT 0.4 nozzle.json | 2 +- .../re3D Gigabot 4 XLT 0.8 nozzle.json | 2 +- .../machine/re3D GigabotX 2 0.8 nozzle.json | 4 +- .../machine/re3D GigabotX 2 1.75 nozzle.json | 4 +- .../re3D GigabotX 2 XLT 0.8 nozzle.json | 4 +- .../re3D GigabotX 2 XLT 1.75 nozzle.json | 4 +- .../re3D/machine/re3D GigabotX 2 XLT.json | 2 +- .../re3D/machine/re3D GigabotX 2.json | 2 +- .../machine/re3D Terabot 4 0.4 nozzle.json | 2 +- .../machine/re3D Terabot 4 0.8 nozzle.json | 2 +- .../machine/re3D TerabotX 2 0.8 nozzle.json | 4 +- .../machine/re3D TerabotX 2 1.75 nozzle.json | 4 +- .../re3D/machine/re3D TerabotX 2.json | 2 +- .../0.26mm Standard @re3D fdm 0.4.json | 34 +- .../process/0.2mm Fine @re3D fdm 0.4.json | 31 +- .../process/0.32mm Draft @re3D fdm 0.4.json | 31 +- .../process/0.3mm Fine @re3D fdm 0.8.json | 31 +- .../process/0.4mm Draft @re3D fdm 0.8.json | 31 +- .../re3D/process/fdm_process_common.json | 12 - .../re3D/process/fdm_process_re3D_common.json | 202 ++++---- 36 files changed, 527 insertions(+), 384 deletions(-) create mode 100644 resources/profiles/re3D/filament/fdm_filament_pp.json rename resources/profiles/re3D/filament/{re3D Greengate rPETG @0.8 nozzle.json => re3D rPETG @0.8 nozzle.json} (89%) rename resources/profiles/re3D/filament/{re3D Greengate rPETG @1.75 nozzle.json => re3D rPETG @1.75 nozzle.json} (89%) rename resources/profiles/re3D/filament/{re3D Greengate rPETG.json => re3D rPETG.json} (78%) diff --git a/resources/profiles/re3D.json b/resources/profiles/re3D.json index e0acc669d0..94cca3c2ef 100644 --- a/resources/profiles/re3D.json +++ b/resources/profiles/re3D.json @@ -1,214 +1,219 @@ { - "name": "re3D", - "version": "02.04.00.03", - "force_update": "0", - "description": "re3D configurations", - "machine_model_list": [ - { - "name": "re3D Gigabot 4", - "sub_path": "machine/re3D Gigabot 4.json" - }, - { - "name": "re3D Gigabot 4 XLT", - "sub_path": "machine/re3D Gigabot 4 XLT.json" - }, - { - "name": "re3D GigabotX 2", - "sub_path": "machine/re3D GigabotX 2.json" - }, - { - "name": "re3D GigabotX 2 XLT", - "sub_path": "machine/re3D GigabotX 2 XLT.json" - }, - { - "name": "re3D Terabot 4", - "sub_path": "machine/re3D Terabot 4.json" - }, - { - "name": "re3D TerabotX 2", - "sub_path": "machine/re3D TerabotX 2.json" - } - ], - "process_list": [ - { - "name": "fdm_process_common", - "sub_path": "process/fdm_process_common.json" - }, - { - "name": "fdm_process_re3D_common", - "sub_path": "process/fdm_process_re3D_common.json" - }, - { - "name": "fgf_process_re3D_common", - "sub_path": "process/fgf_process_re3D_common.json" - }, - { - "name": "0.2 Fine", - "sub_path": "process/0.2mm Fine @re3D fdm 0.4.json" - }, - { - "name": "0.26 Standard", - "sub_path": "process/0.26mm Standard @re3D fdm 0.4.json" - }, - { - "name": "0.3 Fine", - "sub_path": "process/0.3mm Fine @re3D fdm 0.8.json" - }, - { - "name": "0.32 Draft", - "sub_path": "process/0.32mm Draft @re3D fdm 0.4.json" - }, - { - "name": "0.4 Standard", - "sub_path": "process/0.4mm Draft @re3D fdm 0.8.json" - }, - { - "name": "0.6 Standard", - "sub_path": "process/0.6mm Standard @re3D fgf 0.8.json" - }, - { - "name": "1.0 Standard", - "sub_path": "process/1.0mm Standard @re3D fgf 1.75.json" - } - ], - "filament_list": [ - { - "name": "fdm_filament_common", - "sub_path": "filament/fdm_filament_common.json" - }, - { - "name": "fdm_filament_pc", - "sub_path": "filament/fdm_filament_pc.json" - }, - { - "name": "fdm_filament_pet", - "sub_path": "filament/fdm_filament_pet.json" - }, - { - "name": "fdm_filament_pla", - "sub_path": "filament/fdm_filament_pla.json" - }, - { - "name": "re3D PC", - "sub_path": "filament/re3D PC.json" - }, - { - "name": "re3D PC @0.4 nozzle", - "sub_path": "filament/re3D PC @0.4 nozzle.json" - }, - { - "name": "re3D PC @0.8 nozzle", - "sub_path": "filament/re3D PC @0.8 nozzle.json" - }, - { - "name": "re3D Greengate rPETG", - "sub_path": "filament/re3D Greengate rPETG.json" - }, - { - "name": "re3D Greengate rPETG @0.8 nozzle", - "sub_path": "filament/re3D Greengate rPETG @0.8 nozzle.json" - }, - { - "name": "re3D Greengate rPETG @1.75 nozzle", - "sub_path": "filament/re3D Greengate rPETG @1.75 nozzle.json" - }, - { - "name": "re3D PETG", - "sub_path": "filament/re3D PETG.json" - }, - { - "name": "re3D PETG @0.4 nozzle", - "sub_path": "filament/re3D PETG @0.4 nozzle.json" - }, - { - "name": "re3D PETG @0.8 nozzle", - "sub_path": "filament/re3D PETG @0.8 nozzle.json" - }, - { - "name": "re3D rPP", - "sub_path": "filament/re3D rPP.json" - }, - { - "name": "re3D rPP @0.8 nozzle", - "sub_path": "filament/re3D rPP @0.8 nozzle.json" - }, - { - "name": "re3D rPP @1.75 nozzle", - "sub_path": "filament/re3D rPP @1.75 nozzle.json" - }, - { - "name": "re3D PLA", - "sub_path": "filament/re3D PLA.json" - }, - { - "name": "re3D PLA @0.4 nozzle", - "sub_path": "filament/re3D PLA @0.4 nozzle.json" - }, - { - "name": "re3D PLA @0.8 nozzle", - "sub_path": "filament/re3D PLA @0.8 nozzle.json" - } - ], - "machine_list": [ - { - "name": "fdm_machine_common", - "sub_path": "machine/fdm_machine_common.json" - }, - { - "name": "fdm_re3D_common", - "sub_path": "machine/fdm_re3D_common.json" - }, - { - "name": "fgf_re3D_common", - "sub_path": "machine/fgf_re3D_common.json" - }, - { - "name": "re3D Gigabot 4 0.4 nozzle", - "sub_path": "machine/re3D Gigabot 4 0.4 nozzle.json" - }, - { - "name": "re3D Gigabot 4 0.8 nozzle", - "sub_path": "machine/re3D Gigabot 4 0.8 nozzle.json" - }, - { - "name": "re3D Gigabot 4 XLT 0.4 nozzle", - "sub_path": "machine/re3D Gigabot 4 XLT 0.4 nozzle.json" - }, - { - "name": "re3D Gigabot 4 XLT 0.8 nozzle", - "sub_path": "machine/re3D Gigabot 4 XLT 0.8 nozzle.json" - }, - { - "name": "re3D Terabot 4 0.4 nozzle", - "sub_path": "machine/re3D Terabot 4 0.4 nozzle.json" - }, - { - "name": "re3D Terabot 4 0.8 nozzle", - "sub_path": "machine/re3D Terabot 4 0.8 nozzle.json" - }, - { - "name": "re3D GigabotX 2 0.8 nozzle", - "sub_path": "machine/re3D GigabotX 2 0.8 nozzle.json" - }, - { - "name": "re3D GigabotX 2 1.75 nozzle", - "sub_path": "machine/re3D GigabotX 2 1.75 nozzle.json" - }, - { - "name": "re3D GigabotX 2 XLT 0.8 nozzle", - "sub_path": "machine/re3D GigabotX 2 XLT 0.8 nozzle.json" - }, - { - "name": "re3D GigabotX 2 XLT 1.75 nozzle", - "sub_path": "machine/re3D GigabotX 2 XLT 1.75 nozzle.json" - }, - { - "name": "re3D TerabotX 2 0.8 nozzle", - "sub_path": "machine/re3D TerabotX 2 0.8 nozzle.json" - }, - { - "name": "re3D TerabotX 2 1.75 nozzle", - "sub_path": "machine/re3D TerabotX 2 1.75 nozzle.json" - } - ] -} + "name": "re3D", + "url": "", + "version": "03.00.08", + "force_update": "0", + "description": "re3D configurations", + "machine_model_list": [ + { + "name": "re3D Gigabot 4", + "sub_path": "machine/re3D Gigabot 4.json" + }, + { + "name": "re3D Gigabot 4 XLT", + "sub_path": "machine/re3D Gigabot 4 XLT.json" + }, + { + "name": "re3D GigabotX 2", + "sub_path": "machine/re3D GigabotX 2.json" + }, + { + "name": "re3D GigabotX 2 XLT", + "sub_path": "machine/re3D GigabotX 2 XLT.json" + }, + { + "name": "re3D Terabot 4", + "sub_path": "machine/re3D Terabot 4.json" + }, + { + "name": "re3D TerabotX 2", + "sub_path": "machine/re3D TerabotX 2.json" + } + ], + "process_list": [ + { + "name": "fdm_process_common", + "sub_path": "process/fdm_process_common.json" + }, + { + "name": "fdm_process_re3D_common", + "sub_path": "process/fdm_process_re3D_common.json" + }, + { + "name": "fgf_process_re3D_common", + "sub_path": "process/fgf_process_re3D_common.json" + }, + { + "name": "0.2 Fine", + "sub_path": "process/0.2mm Fine @re3D fdm 0.4.json" + }, + { + "name": "0.26 Standard", + "sub_path": "process/0.26mm Standard @re3D fdm 0.4.json" + }, + { + "name": "0.32 Draft", + "sub_path": "process/0.32mm Draft @re3D fdm 0.4.json" + }, + { + "name": "0.3 Fine", + "sub_path": "process/0.3mm Fine @re3D fdm 0.8.json" + }, + { + "name": "0.4 Standard", + "sub_path": "process/0.4mm Draft @re3D fdm 0.8.json" + }, + { + "name": "1.0 Standard", + "sub_path": "process/1.0mm Standard @re3D fgf 1.75.json" + }, + { + "name": "0.6 Standard", + "sub_path": "process/0.6mm Standard @re3D fgf 0.8.json" + } + ], + "filament_list": [ + { + "name": "fdm_filament_common", + "sub_path": "filament/fdm_filament_common.json" + }, + { + "name": "fdm_filament_pla", + "sub_path": "filament/fdm_filament_pla.json" + }, + { + "name": "fdm_filament_pet", + "sub_path": "filament/fdm_filament_pet.json" + }, + { + "name": "fdm_filament_pp", + "sub_path": "filament/fdm_filament_pp.json" + }, + { + "name": "fdm_filament_pc", + "sub_path": "filament/fdm_filament_pc.json" + }, + { + "name": "re3D PLA", + "sub_path": "filament/re3D PLA.json" + }, + { + "name": "re3D PETG", + "sub_path": "filament/re3D PETG.json" + }, + { + "name": "re3D PC", + "sub_path": "filament/re3D PC.json" + }, + { + "name": "re3D rPETG", + "sub_path": "filament/re3D rPETG.json" + }, + { + "name": "re3D rPP", + "sub_path": "filament/re3D rPP.json" + }, + { + "name": "re3D PLA @0.4 nozzle", + "sub_path": "filament/re3D PLA @0.4 nozzle.json" + }, + { + "name": "re3D PLA @0.8 nozzle", + "sub_path": "filament/re3D PLA @0.8 nozzle.json" + }, + { + "name": "re3D PETG @0.4 nozzle", + "sub_path": "filament/re3D PETG @0.4 nozzle.json" + }, + { + "name": "re3D PETG @0.8 nozzle", + "sub_path": "filament/re3D PETG @0.8 nozzle.json" + }, + { + "name": "re3D PC @0.4 nozzle", + "sub_path": "filament/re3D PC @0.4 nozzle.json" + }, + { + "name": "re3D PC @0.8 nozzle", + "sub_path": "filament/re3D PC @0.8 nozzle.json" + }, + { + "name": "re3D rPETG @0.8 nozzle", + "sub_path": "filament/re3D rPETG @0.8 nozzle.json" + }, + { + "name": "re3D rPETG @1.75 nozzle", + "sub_path": "filament/re3D rPETG @1.75 nozzle.json" + }, + { + "name": "re3D rPP @0.8 nozzle", + "sub_path": "filament/re3D rPP @0.8 nozzle.json" + }, + { + "name": "re3D rPP @1.75 nozzle", + "sub_path": "filament/re3D rPP @1.75 nozzle.json" + } + ], + "machine_list": [ + { + "name": "fdm_machine_common", + "sub_path": "machine/fdm_machine_common.json" + }, + { + "name": "fdm_re3D_common", + "sub_path": "machine/fdm_re3D_common.json" + }, + { + "name": "fgf_re3D_common", + "sub_path": "machine/fgf_re3D_common.json" + }, + { + "name": "re3D Gigabot 4 0.4 nozzle", + "sub_path": "machine/re3D Gigabot 4 0.4 nozzle.json" + }, + { + "name": "re3D Gigabot 4 0.8 nozzle", + "sub_path": "machine/re3D Gigabot 4 0.8 nozzle.json" + }, + { + "name": "re3D Gigabot 4 XLT 0.4 nozzle", + "sub_path": "machine/re3D Gigabot 4 XLT 0.4 nozzle.json" + }, + { + "name": "re3D Gigabot 4 XLT 0.8 nozzle", + "sub_path": "machine/re3D Gigabot 4 XLT 0.8 nozzle.json" + }, + { + "name": "re3D GigabotX 2 0.8 nozzle", + "sub_path": "machine/re3D GigabotX 2 0.8 nozzle.json" + }, + { + "name": "re3D GigabotX 2 1.75 nozzle", + "sub_path": "machine/re3D GigabotX 2 1.75 nozzle.json" + }, + { + "name": "re3D GigabotX 2 XLT 0.8 nozzle", + "sub_path": "machine/re3D GigabotX 2 XLT 0.8 nozzle.json" + }, + { + "name": "re3D GigabotX 2 XLT 1.75 nozzle", + "sub_path": "machine/re3D GigabotX 2 XLT 1.75 nozzle.json" + }, + { + "name": "re3D Terabot 4 0.4 nozzle", + "sub_path": "machine/re3D Terabot 4 0.4 nozzle.json" + }, + { + "name": "re3D Terabot 4 0.8 nozzle", + "sub_path": "machine/re3D Terabot 4 0.8 nozzle.json" + }, + { + "name": "re3D TerabotX 2 0.8 nozzle", + "sub_path": "machine/re3D TerabotX 2 0.8 nozzle.json" + }, + { + "name": "re3D TerabotX 2 1.75 nozzle", + "sub_path": "machine/re3D TerabotX 2 1.75 nozzle.json" + } + ] +} \ No newline at end of file diff --git a/resources/profiles/re3D/filament/fdm_filament_pp.json b/resources/profiles/re3D/filament/fdm_filament_pp.json new file mode 100644 index 0000000000..16a1c9705d --- /dev/null +++ b/resources/profiles/re3D/filament/fdm_filament_pp.json @@ -0,0 +1,10 @@ +{ + "type": "filament", + "name": "fdm_filament_pp", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_common", + "filament_type": [ + "PP" + ] +} \ No newline at end of file diff --git a/resources/profiles/re3D/filament/re3D PC @0.4 nozzle.json b/resources/profiles/re3D/filament/re3D PC @0.4 nozzle.json index 47a3a44f34..d3ec58f07c 100644 --- a/resources/profiles/re3D/filament/re3D PC @0.4 nozzle.json +++ b/resources/profiles/re3D/filament/re3D PC @0.4 nozzle.json @@ -9,6 +9,9 @@ "filament_settings_id": [ "re3D PC @0.4 nozzle" ], + "filament_type": [ + "PC" + ], "compatible_printers": [ "re3D Gigabot 4 0.4 nozzle", "re3D Gigabot 4 XLT 0.4 nozzle", diff --git a/resources/profiles/re3D/filament/re3D PC @0.8 nozzle.json b/resources/profiles/re3D/filament/re3D PC @0.8 nozzle.json index c1f329f295..2f4f743d07 100644 --- a/resources/profiles/re3D/filament/re3D PC @0.8 nozzle.json +++ b/resources/profiles/re3D/filament/re3D PC @0.8 nozzle.json @@ -9,6 +9,9 @@ "filament_settings_id": [ "re3D PC @0.8 nozzle" ], + "filament_type": [ + "PC" + ], "compatible_printers": [ "re3D Gigabot 4 0.8 nozzle", "re3D Gigabot 4 XLT 0.8 nozzle", diff --git a/resources/profiles/re3D/filament/re3D PETG @0.4 nozzle.json b/resources/profiles/re3D/filament/re3D PETG @0.4 nozzle.json index c275a7517f..d85397a1c0 100644 --- a/resources/profiles/re3D/filament/re3D PETG @0.4 nozzle.json +++ b/resources/profiles/re3D/filament/re3D PETG @0.4 nozzle.json @@ -17,6 +17,9 @@ "filament_vendor": [ "re3D" ], + "filament_type": [ + "PETG" + ], "close_fan_the_first_x_layers": [ "2" ], diff --git a/resources/profiles/re3D/filament/re3D PETG @0.8 nozzle.json b/resources/profiles/re3D/filament/re3D PETG @0.8 nozzle.json index 148f6540fe..c45d4a84e5 100644 --- a/resources/profiles/re3D/filament/re3D PETG @0.8 nozzle.json +++ b/resources/profiles/re3D/filament/re3D PETG @0.8 nozzle.json @@ -14,6 +14,9 @@ "re3D Gigabot 4 XLT 0.8 nozzle", "re3D Terabot 4 0.8 nozzle" ], + "filament_type": [ + "PETG" + ], "filament_vendor": [ "re3D" ], diff --git a/resources/profiles/re3D/filament/re3D PLA @0.4 nozzle.json b/resources/profiles/re3D/filament/re3D PLA @0.4 nozzle.json index 1719807f7f..a3630d0111 100644 --- a/resources/profiles/re3D/filament/re3D PLA @0.4 nozzle.json +++ b/resources/profiles/re3D/filament/re3D PLA @0.4 nozzle.json @@ -9,6 +9,9 @@ "filament_settings_id": [ "re3D PLA @0.4 nozzle" ], + "filament_type": [ + "PLA" + ], "compatible_printers": [ "re3D Gigabot 4 0.4 nozzle", "re3D Gigabot 4 XLT 0.4 nozzle", diff --git a/resources/profiles/re3D/filament/re3D PLA @0.8 nozzle.json b/resources/profiles/re3D/filament/re3D PLA @0.8 nozzle.json index 01e7abbc9a..002e18f67c 100644 --- a/resources/profiles/re3D/filament/re3D PLA @0.8 nozzle.json +++ b/resources/profiles/re3D/filament/re3D PLA @0.8 nozzle.json @@ -9,6 +9,9 @@ "filament_settings_id": [ "re3D PLA @0.8 nozzle" ], + "filament_type": [ + "PLA" + ], "compatible_printers": [ "re3D Gigabot 4 0.8 nozzle", "re3D Gigabot 4 XLT 0.8 nozzle", diff --git a/resources/profiles/re3D/filament/re3D Greengate rPETG @0.8 nozzle.json b/resources/profiles/re3D/filament/re3D rPETG @0.8 nozzle.json similarity index 89% rename from resources/profiles/re3D/filament/re3D Greengate rPETG @0.8 nozzle.json rename to resources/profiles/re3D/filament/re3D rPETG @0.8 nozzle.json index 028bf042bb..0ac0d012f5 100644 --- a/resources/profiles/re3D/filament/re3D Greengate rPETG @0.8 nozzle.json +++ b/resources/profiles/re3D/filament/re3D rPETG @0.8 nozzle.json @@ -1,14 +1,21 @@ { "type": "filament", "filament_id": "GFG01", - "setting_id": "fRX555Prkdu5ESIp", - "name": "re3D Greengate rPETG @0.8 nozzle", + "setting_id": "WlELqPVnuL7DaTxs", + "name": "re3D rPETG @0.8 nozzle", "from": "system", + "renamed_from": "re3D Greengate rPETG @0.8 nozzle", "instantiation": "true", "inherits": "fdm_filament_pet", "nozzle_temperature_initial_layer": [ "0" ], + "filament_type": [ + "PETG" + ], + "filament_vendor": [ + "re3D" + ], "nozzle_temperature": [ "0" ], diff --git a/resources/profiles/re3D/filament/re3D Greengate rPETG @1.75 nozzle.json b/resources/profiles/re3D/filament/re3D rPETG @1.75 nozzle.json similarity index 89% rename from resources/profiles/re3D/filament/re3D Greengate rPETG @1.75 nozzle.json rename to resources/profiles/re3D/filament/re3D rPETG @1.75 nozzle.json index 5ae3d832ff..8cd090fc06 100644 --- a/resources/profiles/re3D/filament/re3D Greengate rPETG @1.75 nozzle.json +++ b/resources/profiles/re3D/filament/re3D rPETG @1.75 nozzle.json @@ -1,14 +1,21 @@ { "type": "filament", "filament_id": "GFG01", - "setting_id": "6aPU6CYS2cmODkok", - "name": "re3D Greengate rPETG @1.75 nozzle", + "setting_id": "sHzO2S3mmE6Iqs2O", + "name": "re3D rPETG @1.75 nozzle", "from": "system", + "renamed_from": "re3D Greengate rPETG @1.75 nozzle", "instantiation": "true", "inherits": "fdm_filament_pet", "nozzle_temperature_initial_layer": [ "0" ], + "filament_type": [ + "PETG" + ], + "filament_vendor": [ + "re3D" + ], "nozzle_temperature": [ "0" ], diff --git a/resources/profiles/re3D/filament/re3D Greengate rPETG.json b/resources/profiles/re3D/filament/re3D rPETG.json similarity index 78% rename from resources/profiles/re3D/filament/re3D Greengate rPETG.json rename to resources/profiles/re3D/filament/re3D rPETG.json index de56af4f02..fe19f12539 100644 --- a/resources/profiles/re3D/filament/re3D Greengate rPETG.json +++ b/resources/profiles/re3D/filament/re3D rPETG.json @@ -1,13 +1,14 @@ { "type": "filament", - "name": "re3D Greengate rPETG", + "name": "re3D rPETG", "from": "system", + "renamed_from": "re3D Greengate rPETG", "instantiation": "true", "inherits": "fdm_filament_pet", "filament_id": "GFG01", - "setting_id": "SdugLw5oy9GB7NID", + "setting_id": "6aESuJ2S2Kogd4Lq", "filament_settings_id": [ - "re3D Greengate rPETG" + "re3D rPETG" ], "compatible_printers": [ "re3D GigabotX 2 0.8 nozzle", diff --git a/resources/profiles/re3D/filament/re3D rPP @0.8 nozzle.json b/resources/profiles/re3D/filament/re3D rPP @0.8 nozzle.json index a49f19e128..5f5467e86d 100644 --- a/resources/profiles/re3D/filament/re3D rPP @0.8 nozzle.json +++ b/resources/profiles/re3D/filament/re3D rPP @0.8 nozzle.json @@ -5,7 +5,7 @@ "name": "re3D rPP @0.8 nozzle", "from": "system", "instantiation": "true", - "inherits": "fdm_filament_pet", + "inherits": "fdm_filament_pp", "filament_type": [ "PP" ], diff --git a/resources/profiles/re3D/filament/re3D rPP @1.75 nozzle.json b/resources/profiles/re3D/filament/re3D rPP @1.75 nozzle.json index 0bde56c596..2e5a3f4386 100644 --- a/resources/profiles/re3D/filament/re3D rPP @1.75 nozzle.json +++ b/resources/profiles/re3D/filament/re3D rPP @1.75 nozzle.json @@ -5,7 +5,7 @@ "name": "re3D rPP @1.75 nozzle", "from": "system", "instantiation": "true", - "inherits": "fdm_filament_pet", + "inherits": "fdm_filament_pp", "filament_type": [ "PP" ], diff --git a/resources/profiles/re3D/filament/re3D rPP.json b/resources/profiles/re3D/filament/re3D rPP.json index bf96aa51e6..f7244f5985 100644 --- a/resources/profiles/re3D/filament/re3D rPP.json +++ b/resources/profiles/re3D/filament/re3D rPP.json @@ -3,10 +3,7 @@ "name": "re3D rPP", "from": "system", "instantiation": "true", - "inherits": "fdm_filament_pet", - "filament_type": [ - "PP" - ], + "inherits": "fdm_filament_pp", "filament_id": "GFG02", "setting_id": "8PB62qm5Cd3SHLf4", "filament_settings_id": [ diff --git a/resources/profiles/re3D/machine/re3D Gigabot 4 0.4 nozzle.json b/resources/profiles/re3D/machine/re3D Gigabot 4 0.4 nozzle.json index a0cbd3c0e2..d14d3c260e 100644 --- a/resources/profiles/re3D/machine/re3D Gigabot 4 0.4 nozzle.json +++ b/resources/profiles/re3D/machine/re3D Gigabot 4 0.4 nozzle.json @@ -6,7 +6,7 @@ "machine_tech": "FFF", "model_id": "GB4", "printer_model": "re3D Gigabot 4", - "bed_texture": "Gigabot 4_buildplate_texture.png", + "bed_texture": "re3D Gigabot 4_buildplate_texture.svg", "default_materials": "re3D PETG;re3D PLA;re3D PC", "printable_area": [ "0x0", diff --git a/resources/profiles/re3D/machine/re3D Gigabot 4 0.8 nozzle.json b/resources/profiles/re3D/machine/re3D Gigabot 4 0.8 nozzle.json index e5d847e62c..9bc78b36ad 100644 --- a/resources/profiles/re3D/machine/re3D Gigabot 4 0.8 nozzle.json +++ b/resources/profiles/re3D/machine/re3D Gigabot 4 0.8 nozzle.json @@ -6,7 +6,7 @@ "machine_tech": "FFF", "model_id": "GB4", "printer_model": "re3D Gigabot 4", - "bed_texture": "Gigabot 4_buildplate_texture.png", + "bed_texture": "re3D Gigabot 4_buildplate_texture.svg", "default_materials": "re3D PETG;re3D PLA;re3D PC", "printable_area": [ "0x0", diff --git a/resources/profiles/re3D/machine/re3D Gigabot 4 XLT 0.4 nozzle.json b/resources/profiles/re3D/machine/re3D Gigabot 4 XLT 0.4 nozzle.json index 8a5e118bff..56b4030476 100644 --- a/resources/profiles/re3D/machine/re3D Gigabot 4 XLT 0.4 nozzle.json +++ b/resources/profiles/re3D/machine/re3D Gigabot 4 XLT 0.4 nozzle.json @@ -6,7 +6,7 @@ "machine_tech": "FFF", "model_id": "GB4", "printer_model": "re3D Gigabot 4 XLT", - "bed_texture": "Gigabot 4 XLT_buildplate_texture.png", + "bed_texture": "re3D Gigabot 4 XLT_buildplate_texture.svg", "default_materials": "re3D PETG;re3D PLA;re3D PC", "printable_area": [ "0x0", diff --git a/resources/profiles/re3D/machine/re3D Gigabot 4 XLT 0.8 nozzle.json b/resources/profiles/re3D/machine/re3D Gigabot 4 XLT 0.8 nozzle.json index a3fabc985d..a14e730b30 100644 --- a/resources/profiles/re3D/machine/re3D Gigabot 4 XLT 0.8 nozzle.json +++ b/resources/profiles/re3D/machine/re3D Gigabot 4 XLT 0.8 nozzle.json @@ -6,7 +6,7 @@ "machine_tech": "FFF", "model_id": "GB4", "printer_model": "re3D Gigabot 4 XLT", - "bed_texture": "Gigabot 4 XLT_buildplate_texture.png", + "bed_texture": "re3D Gigabot 4 XLT_buildplate_texture.svg", "default_materials": "re3D PETG;re3D PLA;re3D PC", "printable_area": [ "0x0", diff --git a/resources/profiles/re3D/machine/re3D GigabotX 2 0.8 nozzle.json b/resources/profiles/re3D/machine/re3D GigabotX 2 0.8 nozzle.json index 8260ee5a1d..f6bac17a0d 100644 --- a/resources/profiles/re3D/machine/re3D GigabotX 2 0.8 nozzle.json +++ b/resources/profiles/re3D/machine/re3D GigabotX 2 0.8 nozzle.json @@ -6,7 +6,7 @@ "machine_tech": "FGF", "model_id": "re3D GBX2", "printer_model": "re3D GigabotX 2", - "bed_texture": "Gigabot 4_buildplate_texture.png", + "bed_texture": "re3D GigabotX 2_buildplate_texture.svg", "printable_area": [ "0x0", "552x0", @@ -25,7 +25,7 @@ "0.3" ], "default_filament_profile": [ - "re3D Greengate rPETG @0.8 nozzle" + "re3D rPETG @0.8 nozzle" ], "default_print_profile": "0.6 Standard", "printer_settings_id": "re3d_gbx_08", diff --git a/resources/profiles/re3D/machine/re3D GigabotX 2 1.75 nozzle.json b/resources/profiles/re3D/machine/re3D GigabotX 2 1.75 nozzle.json index 8a89e9d858..585c219bc7 100644 --- a/resources/profiles/re3D/machine/re3D GigabotX 2 1.75 nozzle.json +++ b/resources/profiles/re3D/machine/re3D GigabotX 2 1.75 nozzle.json @@ -7,7 +7,7 @@ "machine_tech": "FGF", "model_id": "re3D GBX2", "printer_model": "re3D GigabotX 2", - "bed_texture": "Gigabot 4_buildplate_texture.png", + "bed_texture": "re3D GigabotX 2_buildplate_texture.svg", "printable_area": [ "0x0", "552x0", @@ -26,7 +26,7 @@ "0.6" ], "default_filament_profile": [ - "re3D Greengate rPETG @1.75 nozzle" + "re3D rPETG @1.75 nozzle" ], "default_print_profile": "1.0 Standard", "printer_settings_id": "re3d_gbx_175", diff --git a/resources/profiles/re3D/machine/re3D GigabotX 2 XLT 0.8 nozzle.json b/resources/profiles/re3D/machine/re3D GigabotX 2 XLT 0.8 nozzle.json index 2d81331c5c..863d8e6403 100644 --- a/resources/profiles/re3D/machine/re3D GigabotX 2 XLT 0.8 nozzle.json +++ b/resources/profiles/re3D/machine/re3D GigabotX 2 XLT 0.8 nozzle.json @@ -6,7 +6,7 @@ "machine_tech": "FGF", "model_id": "re3D GBX2 XLT", "printer_model": "re3D GigabotX 2 XLT", - "bed_texture": "GigabotX 2 XLT_buildplate_texture.png", + "bed_texture": "re3D GigabotX 2 XLT_buildplate_texture.svg", "printable_area": [ "0x0", "552x0", @@ -25,7 +25,7 @@ "0.3" ], "default_filament_profile": [ - "re3D Greengate rPETG @0.8 nozzle" + "re3D rPETG @0.8 nozzle" ], "default_print_profile": "0.6 Standard", "printer_settings_id": "re3d_gbx_xlt_08", diff --git a/resources/profiles/re3D/machine/re3D GigabotX 2 XLT 1.75 nozzle.json b/resources/profiles/re3D/machine/re3D GigabotX 2 XLT 1.75 nozzle.json index 63503c01d8..5784b4e673 100644 --- a/resources/profiles/re3D/machine/re3D GigabotX 2 XLT 1.75 nozzle.json +++ b/resources/profiles/re3D/machine/re3D GigabotX 2 XLT 1.75 nozzle.json @@ -7,7 +7,7 @@ "machine_tech": "FGF", "model_id": "re3D GBX2 XLT", "printer_model": "re3D GigabotX 2 XLT", - "bed_texture": "GigabotX 2 XLT_buildplate_texture.png", + "bed_texture": "re3D GigabotX 2 XLT_buildplate_texture.svg", "printable_area": [ "0x0", "552x0", @@ -26,7 +26,7 @@ "0.6" ], "default_filament_profile": [ - "re3D Greengate rPETG @1.75 nozzle" + "re3D rPETG @1.75 nozzle" ], "default_print_profile": "1.0 Standard", "printer_settings_id": "re3d_gbx_xlt_175", diff --git a/resources/profiles/re3D/machine/re3D GigabotX 2 XLT.json b/resources/profiles/re3D/machine/re3D GigabotX 2 XLT.json index 09a2702f3a..99800331d9 100644 --- a/resources/profiles/re3D/machine/re3D GigabotX 2 XLT.json +++ b/resources/profiles/re3D/machine/re3D GigabotX 2 XLT.json @@ -9,5 +9,5 @@ "bed_model": "", "bed_texture": "re3D GigabotX 2 XLT_buildplate_texture.svg", "hotend_model": "GBX-HOTEND.stl", - "default_materials": "re3D Greengate rPETG;re3D rPP;" + "default_materials": "re3D rPETG;re3D rPP;" } diff --git a/resources/profiles/re3D/machine/re3D GigabotX 2.json b/resources/profiles/re3D/machine/re3D GigabotX 2.json index cc1470ee05..3a1db130b0 100644 --- a/resources/profiles/re3D/machine/re3D GigabotX 2.json +++ b/resources/profiles/re3D/machine/re3D GigabotX 2.json @@ -9,5 +9,5 @@ "bed_model": "", "bed_texture": "re3D GigabotX 2_buildplate_texture.svg", "hotend_model": "GBX-HOTEND.stl", - "default_materials": "re3D Greengate rPETG;re3D rPP;" + "default_materials": "re3D rPETG;re3D rPP;" } diff --git a/resources/profiles/re3D/machine/re3D Terabot 4 0.4 nozzle.json b/resources/profiles/re3D/machine/re3D Terabot 4 0.4 nozzle.json index 105b0f2621..d24ba564a2 100644 --- a/resources/profiles/re3D/machine/re3D Terabot 4 0.4 nozzle.json +++ b/resources/profiles/re3D/machine/re3D Terabot 4 0.4 nozzle.json @@ -6,7 +6,7 @@ "machine_tech": "FFF", "model_id": "TB4", "printer_model": "re3D Terabot 4", - "bed_texture": "Gigabot 4_buildplate_texture.png", + "bed_texture": "re3D Terabot 4_buildplate_texture.svg", "default_materials": "re3D PETG;re3D PLA;re3D PC", "printable_area": [ "0x0", diff --git a/resources/profiles/re3D/machine/re3D Terabot 4 0.8 nozzle.json b/resources/profiles/re3D/machine/re3D Terabot 4 0.8 nozzle.json index bd83a5ef45..6255e84896 100644 --- a/resources/profiles/re3D/machine/re3D Terabot 4 0.8 nozzle.json +++ b/resources/profiles/re3D/machine/re3D Terabot 4 0.8 nozzle.json @@ -6,7 +6,7 @@ "machine_tech": "FFF", "model_id": "TB4", "printer_model": "re3D Terabot 4", - "bed_texture": "Gigabot 4_buildplate_texture.png", + "bed_texture": "re3D Terabot 4_buildplate_texture.svg", "default_materials": "re3D PETG;re3D PLA;re3D PC", "printable_area": [ "0x0", diff --git a/resources/profiles/re3D/machine/re3D TerabotX 2 0.8 nozzle.json b/resources/profiles/re3D/machine/re3D TerabotX 2 0.8 nozzle.json index daa97c2e88..5622a813c1 100644 --- a/resources/profiles/re3D/machine/re3D TerabotX 2 0.8 nozzle.json +++ b/resources/profiles/re3D/machine/re3D TerabotX 2 0.8 nozzle.json @@ -6,7 +6,7 @@ "machine_tech": "FGF", "model_id": "re3D TBX2", "printer_model": "re3D TerabotX 2", - "bed_texture": "Gigabot 4_buildplate_texture.png", + "bed_texture": "re3D TerabotX 2_buildplate_texture.svg", "printable_area": [ "0x0", "892x0", @@ -25,7 +25,7 @@ "0.3" ], "default_filament_profile": [ - "re3D Greengate rPETG @0.8 nozzle" + "re3D rPETG @0.8 nozzle" ], "default_print_profile": "0.6 Standard", "printer_settings_id": "re3d_tbx2_08", diff --git a/resources/profiles/re3D/machine/re3D TerabotX 2 1.75 nozzle.json b/resources/profiles/re3D/machine/re3D TerabotX 2 1.75 nozzle.json index 401833977a..398ab006bd 100644 --- a/resources/profiles/re3D/machine/re3D TerabotX 2 1.75 nozzle.json +++ b/resources/profiles/re3D/machine/re3D TerabotX 2 1.75 nozzle.json @@ -7,7 +7,7 @@ "machine_tech": "FGF", "model_id": "re3D TBX2", "printer_model": "re3D TerabotX 2", - "bed_texture": "Gigabot 4_buildplate_texture.png", + "bed_texture": "re3D TerabotX 2_buildplate_texture.svg", "printable_area": [ "0x0", "892x0", @@ -26,7 +26,7 @@ "0.6" ], "default_filament_profile": [ - "re3D Greengate rPETG @1.75 nozzle" + "re3D rPETG @1.75 nozzle" ], "default_print_profile": "1.0 Standard", "printer_settings_id": "re3d_tbx2_175", diff --git a/resources/profiles/re3D/machine/re3D TerabotX 2.json b/resources/profiles/re3D/machine/re3D TerabotX 2.json index 9d8d0b2cb4..f541a62ad7 100644 --- a/resources/profiles/re3D/machine/re3D TerabotX 2.json +++ b/resources/profiles/re3D/machine/re3D TerabotX 2.json @@ -9,5 +9,5 @@ "bed_model": "", "bed_texture": "re3D TerabotX 2_buildplate_texture.svg", "hotend_model": "GBX-HOTEND.stl", - "default_materials": "re3D Greengate rPETG;re3D rPP;" + "default_materials": "re3D rPETG;re3D rPP;" } diff --git a/resources/profiles/re3D/process/0.26mm Standard @re3D fdm 0.4.json b/resources/profiles/re3D/process/0.26mm Standard @re3D fdm 0.4.json index 7d443c9730..2ab80cdf26 100644 --- a/resources/profiles/re3D/process/0.26mm Standard @re3D fdm 0.4.json +++ b/resources/profiles/re3D/process/0.26mm Standard @re3D fdm 0.4.json @@ -22,5 +22,35 @@ "top_surface_line_width": "0.48", "support_line_width": "0.48", "support_top_z_distance": "0.2", - "support_bottom_z_distance": "0.2" -} \ No newline at end of file + "support_bottom_z_distance": "0.2", + "bridge_speed": "50", + "internal_bridge_speed": "150%", + "default_acceleration": "5000", + "outer_wall_speed": "60", + "initial_layer_speed": "50", + "gap_infill_speed": "60", + "sparse_infill_speed": "80", + "inner_wall_speed": "80", + "internal_solid_infill_speed": "80", + "support_interface_speed": "30", + "support_speed": "90", + "top_surface_speed": "50", + "travel_speed": "300", + "top_surface_acceleration": "2500", + "initial_layer_acceleration": "1000", + "travel_acceleration": "5000", + "inner_wall_acceleration": "5000", + "ironing_speed": "25", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "10", + "initial_layer_infill_speed": "50", + "outer_wall_acceleration": "2500", + "bridge_acceleration": "3500", + "sparse_infill_acceleration": "5000", + "internal_solid_infill_acceleration": "5000", + "initial_layer_travel_speed": "100%", + "small_perimeter_speed": "50%", + "filename_format": "{input_filename_base}_{\"E\"}{initial_tool}_{filament_type[initial_tool]}_{print_time}.gcode" +} diff --git a/resources/profiles/re3D/process/0.2mm Fine @re3D fdm 0.4.json b/resources/profiles/re3D/process/0.2mm Fine @re3D fdm 0.4.json index 2734cf3334..10013e9c36 100644 --- a/resources/profiles/re3D/process/0.2mm Fine @re3D fdm 0.4.json +++ b/resources/profiles/re3D/process/0.2mm Fine @re3D fdm 0.4.json @@ -22,5 +22,32 @@ "top_surface_line_width": "0.44", "support_line_width": "0.48", "support_top_z_distance": "0.2", - "support_bottom_z_distance": "0.2" -} \ No newline at end of file + "support_bottom_z_distance": "0.2", + "outer_wall_speed": "60", + "initial_layer_speed": "50", + "gap_infill_speed": "60", + "sparse_infill_speed": "80", + "inner_wall_speed": "80", + "internal_solid_infill_speed": "80", + "support_interface_speed": "30", + "support_speed": "90", + "top_surface_speed": "50", + "travel_speed": "300", + "top_surface_acceleration": "2500", + "initial_layer_acceleration": "1000", + "travel_acceleration": "5000", + "inner_wall_acceleration": "5000", + "ironing_speed": "25", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "10", + "initial_layer_infill_speed": "50", + "outer_wall_acceleration": "2500", + "bridge_acceleration": "3500", + "sparse_infill_acceleration": "5000", + "internal_solid_infill_acceleration": "5000", + "initial_layer_travel_speed": "100%", + "small_perimeter_speed": "50%", + "filename_format": "{input_filename_base}_{\"E\"}{initial_tool}_{filament_type[initial_tool]}_{print_time}.gcode" +} diff --git a/resources/profiles/re3D/process/0.32mm Draft @re3D fdm 0.4.json b/resources/profiles/re3D/process/0.32mm Draft @re3D fdm 0.4.json index 3ce98e2e7e..1b14349f81 100644 --- a/resources/profiles/re3D/process/0.32mm Draft @re3D fdm 0.4.json +++ b/resources/profiles/re3D/process/0.32mm Draft @re3D fdm 0.4.json @@ -22,5 +22,32 @@ "top_surface_line_width": "0.48", "support_line_width": "0.48", "support_top_z_distance": "0.35", - "support_bottom_z_distance": "0.35" -} \ No newline at end of file + "support_bottom_z_distance": "0.35", + "outer_wall_speed": "60", + "initial_layer_speed": "50", + "gap_infill_speed": "60", + "sparse_infill_speed": "80", + "inner_wall_speed": "80", + "internal_solid_infill_speed": "80", + "support_interface_speed": "30", + "support_speed": "90", + "top_surface_speed": "50", + "travel_speed": "300", + "top_surface_acceleration": "2500", + "initial_layer_acceleration": "1000", + "travel_acceleration": "5000", + "inner_wall_acceleration": "5000", + "ironing_speed": "25", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "10", + "initial_layer_infill_speed": "50", + "outer_wall_acceleration": "2500", + "bridge_acceleration": "3500", + "sparse_infill_acceleration": "5000", + "internal_solid_infill_acceleration": "5000", + "initial_layer_travel_speed": "100%", + "small_perimeter_speed": "50%", + "filename_format": "{input_filename_base}_{\"E\"}{initial_tool}_{filament_type[initial_tool]}_{print_time}.gcode" +} diff --git a/resources/profiles/re3D/process/0.3mm Fine @re3D fdm 0.8.json b/resources/profiles/re3D/process/0.3mm Fine @re3D fdm 0.8.json index 27c2452d19..2b35f2c1f8 100644 --- a/resources/profiles/re3D/process/0.3mm Fine @re3D fdm 0.8.json +++ b/resources/profiles/re3D/process/0.3mm Fine @re3D fdm 0.8.json @@ -22,5 +22,32 @@ "top_surface_line_width": "1", "support_line_width": "1", "support_top_z_distance": "0.24", - "support_bottom_z_distance": "0.24" -} \ No newline at end of file + "support_bottom_z_distance": "0.24", + "outer_wall_speed": "60", + "initial_layer_speed": "50", + "gap_infill_speed": "60", + "sparse_infill_speed": "80", + "inner_wall_speed": "80", + "internal_solid_infill_speed": "80", + "support_interface_speed": "30", + "support_speed": "90", + "top_surface_speed": "50", + "travel_speed": "300", + "top_surface_acceleration": "2500", + "initial_layer_acceleration": "1000", + "travel_acceleration": "5000", + "inner_wall_acceleration": "5000", + "ironing_speed": "25", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "10", + "initial_layer_infill_speed": "50", + "outer_wall_acceleration": "2500", + "bridge_acceleration": "3500", + "sparse_infill_acceleration": "5000", + "internal_solid_infill_acceleration": "5000", + "initial_layer_travel_speed": "100%", + "small_perimeter_speed": "50%", + "filename_format": "{input_filename_base}_{\"E\"}{initial_tool}_{filament_type[initial_tool]}_{print_time}.gcode" +} diff --git a/resources/profiles/re3D/process/0.4mm Draft @re3D fdm 0.8.json b/resources/profiles/re3D/process/0.4mm Draft @re3D fdm 0.8.json index d46316ef4e..d00f8bce44 100644 --- a/resources/profiles/re3D/process/0.4mm Draft @re3D fdm 0.8.json +++ b/resources/profiles/re3D/process/0.4mm Draft @re3D fdm 0.8.json @@ -22,5 +22,32 @@ "top_surface_line_width": "1", "support_line_width": "1", "support_top_z_distance": "0.42", - "support_bottom_z_distance": "0.42" -} \ No newline at end of file + "support_bottom_z_distance": "0.42", + "outer_wall_speed": "60", + "initial_layer_speed": "50", + "gap_infill_speed": "60", + "sparse_infill_speed": "80", + "inner_wall_speed": "80", + "internal_solid_infill_speed": "80", + "support_interface_speed": "30", + "support_speed": "90", + "top_surface_speed": "50", + "travel_speed": "300", + "top_surface_acceleration": "2500", + "initial_layer_acceleration": "1000", + "travel_acceleration": "5000", + "inner_wall_acceleration": "5000", + "ironing_speed": "25", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "10", + "initial_layer_infill_speed": "50", + "outer_wall_acceleration": "2500", + "bridge_acceleration": "3500", + "sparse_infill_acceleration": "5000", + "internal_solid_infill_acceleration": "5000", + "initial_layer_travel_speed": "100%", + "small_perimeter_speed": "50%", + "filename_format": "{input_filename_base}_{\"E\"}{initial_tool}_{filament_type[initial_tool]}_{print_time}.gcode" +} diff --git a/resources/profiles/re3D/process/fdm_process_common.json b/resources/profiles/re3D/process/fdm_process_common.json index 164ff9d58a..dcd5c826ae 100644 --- a/resources/profiles/re3D/process/fdm_process_common.json +++ b/resources/profiles/re3D/process/fdm_process_common.json @@ -6,34 +6,27 @@ "adaptive_layer_height": "0", "reduce_crossing_wall": "0", "bridge_flow": "0.95", - "bridge_speed": "10", "brim_width": "5", "compatible_printers": [], "print_sequence": "by layer", - "default_acceleration": "0", "bridge_no_support": "0", "elefant_foot_compensation": "0.1", "outer_wall_line_width": "0.4", - "outer_wall_speed": "25", "line_width": "0.4", "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "crosshatch", "initial_layer_line_width": "0.4", "initial_layer_print_height": "0.2", - "initial_layer_speed": "15", - "gap_infill_speed": "25", "infill_combination": "0", "sparse_infill_line_width": "0.4", "infill_wall_overlap": "25%", - "sparse_infill_speed": "70", "interface_shells": "0", "detect_overhang_wall": "0", "reduce_infill_retraction": "0", "filename_format": "{input_filename_base}.gcode", "wall_loops": "3", "inner_wall_line_width": "0.4", - "inner_wall_speed": "40", "print_settings_id": "", "raft_layers": "0", "seam_position": "nearest", @@ -41,7 +34,6 @@ "skirt_height": "2", "minimum_sparse_infill_area": "0", "internal_solid_infill_line_width": "0.4", - "internal_solid_infill_speed": "60", "spiral_mode": "0", "standby_temperature_delta": "-20", "enable_support": "0", @@ -53,16 +45,12 @@ "support_interface_loop_pattern": "0", "support_interface_top_layers": "2", "support_interface_spacing": "0", - "support_interface_speed": "80", "support_base_pattern": "rectilinear", "support_base_pattern_spacing": "2", - "support_speed": "40", "support_threshold_angle": "30", "support_object_xy_distance": "0.5", "detect_thin_wall": "0", "top_surface_line_width": "0.4", - "top_surface_speed": "35", - "travel_speed": "150", "enable_prime_tower": "1", "prime_tower_width": "60", "xy_hole_compensation": "0", diff --git a/resources/profiles/re3D/process/fdm_process_re3D_common.json b/resources/profiles/re3D/process/fdm_process_re3D_common.json index a1547448e3..ea169330f4 100644 --- a/resources/profiles/re3D/process/fdm_process_re3D_common.json +++ b/resources/profiles/re3D/process/fdm_process_re3D_common.json @@ -1,116 +1,88 @@ { - "type": "process", - "name": "fdm_process_re3D_common", - "from": "system", - "instantiation": "false", - "inherits": "fdm_process_common", - "adaptive_layer_height": "0", - "reduce_crossing_wall": "1", - "bridge_flow": "0.985", - "bridge_speed": "25", - "brim_width": "8", - "print_sequence": "by layer", - "default_acceleration": "5000", - "bridge_no_support": "0", - "elefant_foot_compensation": "0", - "outer_wall_speed": "120", - "sparse_infill_density": "15%", - "sparse_infill_pattern": "rectilinear", - "initial_layer_speed": "50", - "gap_infill_speed": "30", - "infill_combination": "0", - "infill_wall_overlap": "25%", - "sparse_infill_speed": "50", - "detect_overhang_wall": "1", - "reduce_infill_retraction": "0", - "filename_format": "{input_filename_base}.gcode", - "wall_loops": "3", - "inner_wall_speed": "40", - "wall_generator": "arachne", - "raft_layers": "0", - "seam_position": "nearest", - "skirt_distance": "8", - "skirt_height": "1", - "minimum_sparse_infill_area": "0", - "internal_solid_infill_speed": "40", - "spiral_mode": "0", - "standby_temperature_delta": "-75", - "enable_support": "1", - "support_filament": "0", - "support_interface_filament": "0", - "support_on_build_plate_only": "0", - "support_interface_loop_pattern": "0", - "support_interface_top_layers": "2", - "support_interface_spacing": "0.05", - "support_interface_speed": "80", - "support_base_pattern": "rectilinear", - "support_base_pattern_spacing": "2", - "support_speed": "40", - "support_threshold_angle": "30", - "support_object_xy_distance": "0.5", - "detect_thin_wall": "0", - "top_surface_speed": "30", - "travel_speed": "300", - "enable_prime_tower": "0", - "prime_tower_width": "60", - "xy_hole_compensation": "0", - "xy_contour_compensation": "0", - "max_travel_detour_distance": "0", - "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "3", - "bottom_shell_thickness": "0", - "brim_object_gap": "0.1", - "compatible_printers_condition": "", - "top_surface_acceleration": "500", - "draft_shield": "disabled", - "enable_arc_fitting": "1", - "wall_infill_order": "inner wall/outer wall/infill", - "infill_direction": "45", - "initial_layer_acceleration": "500", - "travel_acceleration": "5000", - "inner_wall_acceleration": "5000", - "interface_shells": "0", - "ironing_flow": "10%", - "ironing_spacing": "0.1", - "ironing_speed": "20", - "ironing_type": "no ironing", - "overhang_1_4_speed": "45", - "overhang_2_4_speed": "35", - "overhang_3_4_speed": "25", - "overhang_4_4_speed": "15", - "print_settings_id": "fdm_process_re3D_common", - "skirt_loops": "2", - "resolution": "0.0", - "support_type": "normal(auto)", - "support_style": "snug", - "support_interface_bottom_layers": "2", - "tree_support_branch_angle": "45", - "tree_support_wall_count": "0", - "top_surface_pattern": "monotonicline", - "top_shell_layers": "4", - "top_shell_thickness": "0.6", - "initial_layer_infill_speed": "50", - "wipe_tower_no_sparse_layers": "0", - "precise_outer_wall": "0", - "outer_wall_acceleration": "2500", - "bridge_acceleration": "5000", - "sparse_infill_acceleration": "5000", - "internal_solid_infill_acceleration": "5000", - "accel_to_decel_enable": "0", - "prime_volume": "200", - "ooze_prevention": "1", - "preheat_time": "30", - "initial_layer_travel_speed": "100", - "slow_down_layers": "2", - "small_perimeter_speed": "20", - "small_perimeter_threshold": "10", - "exclude_object": "1", - "compatible_printers": [ - "re3D Gigabot 4 0.4 nozzle", - "re3D Gigabot 4 0.8 nozzle", - "re3D Gigabot 4 XLT 0.4 nozzle", - "re3D Gigabot 4 XLT 0.8 nozzle", - "re3D Terabot 4 0.4 nozzle", - "re3D Terabot 4 0.8 nozzle" - ] -} \ No newline at end of file + "type": "process", + "name": "fdm_process_re3D_common", + "from": "system", + "instantiation": "false", + "inherits": "fdm_process_common", + "adaptive_layer_height": "0", + "reduce_crossing_wall": "1", + "bridge_flow": "0.985", + "brim_width": "8", + "print_sequence": "by layer", + "bridge_no_support": "0", + "elefant_foot_compensation": "0", + "sparse_infill_density": "15%", + "sparse_infill_pattern": "rectilinear", + "infill_combination": "0", + "infill_wall_overlap": "25%", + "detect_overhang_wall": "1", + "reduce_infill_retraction": "0", + "filename_format": "{input_filename_base}.gcode", + "wall_loops": "3", + "wall_generator": "arachne", + "raft_layers": "0", + "seam_position": "nearest", + "skirt_distance": "8", + "skirt_height": "1", + "minimum_sparse_infill_area": "0", + "spiral_mode": "0", + "standby_temperature_delta": "-75", + "enable_support": "1", + "support_filament": "0", + "support_interface_filament": "0", + "support_on_build_plate_only": "0", + "support_interface_loop_pattern": "0", + "support_interface_top_layers": "2", + "support_interface_spacing": "0.05", + "support_base_pattern": "rectilinear", + "support_base_pattern_spacing": "2", + "support_threshold_angle": "30", + "support_object_xy_distance": "0.5", + "detect_thin_wall": "0", + "enable_prime_tower": "0", + "prime_tower_width": "60", + "xy_hole_compensation": "0", + "xy_contour_compensation": "0", + "max_travel_detour_distance": "0", + "bottom_surface_pattern": "monotonic", + "bottom_shell_layers": "3", + "bottom_shell_thickness": "0", + "brim_object_gap": "0.1", + "compatible_printers_condition": "", + "draft_shield": "disabled", + "enable_arc_fitting": "1", + "wall_infill_order": "inner wall/outer wall/infill", + "infill_direction": "45", + "interface_shells": "0", + "ironing_flow": "10%", + "ironing_spacing": "0.1", + "ironing_type": "no ironing", + "print_settings_id": "fdm_process_re3D_common", + "skirt_loops": "2", + "resolution": "0.0", + "support_type": "normal(auto)", + "support_style": "snug", + "support_interface_bottom_layers": "2", + "tree_support_branch_angle": "45", + "tree_support_wall_count": "0", + "top_surface_pattern": "monotonicline", + "top_shell_layers": "4", + "top_shell_thickness": "0.6", + "wipe_tower_no_sparse_layers": "0", + "precise_outer_wall": "0", + "accel_to_decel_enable": "0", + "prime_volume": "200", + "ooze_prevention": "1", + "preheat_time": "30", + "slow_down_layers": "2", + "small_perimeter_threshold": "10", + "exclude_object": "1", + "compatible_printers": [ + "re3D Gigabot 4 0.4 nozzle", + "re3D Gigabot 4 0.8 nozzle", + "re3D Gigabot 4 XLT 0.4 nozzle", + "re3D Gigabot 4 XLT 0.8 nozzle", + "re3D Terabot 4 0.4 nozzle", + "re3D Terabot 4 0.8 nozzle" + ] +} From 9421e7fa9bb69767ead7b10e9b47570d94597ca6 Mon Sep 17 00:00:00 2001 From: TheLegendTubaGuy <95944177+thelegendtubaguy@users.noreply.github.com> Date: Sat, 8 Aug 2026 18:08:54 -0500 Subject: [PATCH 091/106] Fix detached copies of system presets (#15173) * Fix detached copies of system presets * Clarify detached preset compatibility * Show unique preset state in save dialog * Update SavePresetDialog.cpp --------- Co-authored-by: yw4z --- src/slic3r/GUI/SavePresetDialog.cpp | 47 ++++++++++++++++++----------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/src/slic3r/GUI/SavePresetDialog.cpp b/src/slic3r/GUI/SavePresetDialog.cpp index e24a2fc497..0b33e48ec4 100644 --- a/src/slic3r/GUI/SavePresetDialog.cpp +++ b/src/slic3r/GUI/SavePresetDialog.cpp @@ -111,18 +111,20 @@ SavePresetDialog::Item::Item(Preset::Type type, const std::string &suffix, wxBox sizer->Add(m_radio_group, 0, wxEXPAND | wxTOP | wxLEFT, BORDER_W); - std::string inherits_str = sel_preset.inherits(); - if (parent->m_mode == comDevelop && !inherits_str.empty()) { + if (parent->m_mode == comDevelop) { + // A new user copy of a system preset inherits from the selected system preset. + const std::string parent_name = sel_preset.is_system ? sel_preset.name : sel_preset.inherits(); + const bool can_detach = !parent_name.empty(); + wxBoxSizer *detach_sizer = new wxBoxSizer(wxHORIZONTAL); - auto detach_tooltip = _L("Copies all inherited values from the parent preset into this preset and removes the connection with the parent preset."); + auto detach_tooltip = _L("Copies all inherited values from the parent into this preset and removes the parent relationship. Presets compatible only with the parent may become unsupported."); auto detach_checkbox = new ::CheckBox(parent); detach_checkbox->SetToolTip(detach_tooltip); auto detach_label = new wxStaticText(parent, wxID_ANY, _L("Detach from parent")); detach_label->SetFont(::Label::Body_14); - detach_label->SetForegroundColour(wxColour("#363636")); detach_label->SetToolTip(detach_tooltip); detach_sizer->Add(detach_checkbox, 0, wxALIGN_LEFT | wxLEFT, BORDER_W); @@ -130,27 +132,36 @@ SavePresetDialog::Item::Item(Preset::Type type, const std::string &suffix, wxBox sizer->Add(detach_sizer, 0, wxEXPAND | wxTOP, BORDER_W); sizer->AddSpacer(FromDIP(5)); - auto parent_label = new wxStaticText(parent, wxID_ANY, inherits_str); + const wxString parent_text = can_detach ? from_u8(parent_name) : _L("Unique preset"); + auto parent_label = new wxStaticText(parent, wxID_ANY, parent_text); parent_label->SetFont(::Label::Body_12); parent_label->SetForegroundColour(wxColour("#6B6B6B")); - parent_label->SetToolTip(_L("Parent preset")); + parent_label->SetToolTip(can_detach ? _L("Parent preset") : _L("This preset does not inherit from another preset.")); sizer->Add(parent_label, 0, wxEXPAND | wxLEFT, BORDER_W + FromDIP(24)); sizer->AddSpacer(FromDIP(5)); - // Set initial state (unchecked by default) - detach_checkbox->SetValue(m_detach); - // Bind the checkbox event to update the detach state for this item - detach_checkbox->Bind(wxEVT_TOGGLEBUTTON, [this, detach_checkbox](wxCommandEvent&) { m_detach = detach_checkbox->GetValue(); }); + if (!can_detach) { + detach_checkbox->Disable(); + detach_label->SetForegroundColour(wxColour("#6B6B6B")); + } + else { + // Set initial state (unchecked by default) + detach_checkbox->SetValue(m_detach); + // Bind the checkbox event to update the detach state for this item + detach_checkbox->Bind(wxEVT_TOGGLEBUTTON, [this, detach_checkbox](wxCommandEvent&) { m_detach = detach_checkbox->GetValue(); }); - auto on_toggle = [this, detach_checkbox]() { - detach_checkbox->SetValue(!detach_checkbox->GetValue()); - wxCommandEvent ev(wxEVT_TOGGLEBUTTON, detach_checkbox->GetId()); - ev.SetEventObject(detach_checkbox); - detach_checkbox->GetEventHandler()->ProcessEvent(ev); - }; - detach_label->Bind(wxEVT_LEFT_DOWN, [on_toggle](wxMouseEvent& e) {if(!e.LeftDClick()) on_toggle();}); - detach_label->Bind(wxEVT_LEFT_DCLICK, [on_toggle](wxMouseEvent& e) {on_toggle();}); + detach_label->SetForegroundColour(wxColour("#363636")); + + auto on_toggle = [this, detach_checkbox]() { + detach_checkbox->SetValue(!detach_checkbox->GetValue()); + wxCommandEvent ev(wxEVT_TOGGLEBUTTON, detach_checkbox->GetId()); + ev.SetEventObject(detach_checkbox); + detach_checkbox->GetEventHandler()->ProcessEvent(ev); + }; + detach_label->Bind(wxEVT_LEFT_DOWN, [on_toggle](wxMouseEvent& e) {if(!e.LeftDClick()) on_toggle();}); + detach_label->Bind(wxEVT_LEFT_DCLICK, [on_toggle](wxMouseEvent& e) {on_toggle();}); + } } m_radio_group->Bind(wxEVT_COMMAND_RADIOBOX_SELECTED, [this](wxCommandEvent &e) { From 1a8f39c5f7322dc7d57343a511f9cf78a9c3a629 Mon Sep 17 00:00:00 2001 From: yw4z Date: Sun, 9 Aug 2026 08:24:04 +0300 Subject: [PATCH 092/106] Fix emboss gizmo font preview of style not rendering properly (#14612) --- .../GUI/Jobs/CreateFontStyleImagesJob.cpp | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/slic3r/GUI/Jobs/CreateFontStyleImagesJob.cpp b/src/slic3r/GUI/Jobs/CreateFontStyleImagesJob.cpp index f988f622ce..31bd6728b1 100644 --- a/src/slic3r/GUI/Jobs/CreateFontStyleImagesJob.cpp +++ b/src/slic3r/GUI/Jobs/CreateFontStyleImagesJob.cpp @@ -45,24 +45,26 @@ void CreateFontStyleImagesJob::process(Ctl &ctl) for (const ExPolygon &shape : shapes) bounding_box.merge(BoundingBox(shape.contour.points)); for (ExPolygon &shape : shapes) shape.translate(-bounding_box.min); - - // calculate conversion from FontPoint to screen pixels by size of font - double scale = get_text_shape_scale(item.prop, *item.font.font_file) * m_input.ppm; - scales[index] = scale; - //double scale = font_prop.size_in_mm * SCALING_FACTOR; - BoundingBoxf bb2(bounding_box.min.cast(), - bounding_box.max.cast()); + if (bounding_box.size().x() < 1 || bounding_box.size().y() < 1) + continue; // or however the font job's degenerate-box case is handled + + // Normalize to fit max_size, exactly like CreateFontImageJob does against m_input.size. + // Fit by height (matches row height), then clamp width if needed. + constexpr float preview_padding_px = 2.f; // margin for AA sampling, tune to your AA kernel radius + + double scale = m_input.max_size.y() / (double) bounding_box.size().y(); + BoundingBoxf bb2(bounding_box.min.cast(), bounding_box.max.cast()); bb2.scale(scale); - image.tex_size.x = std::ceil(bb2.max.x() - bb2.min.x()); - image.tex_size.y = std::ceil(bb2.max.y() - bb2.min.y()); - // crop image width - if (image.tex_size.x > m_input.max_size.x()) + // crop width only if the (now height-normalized) text is too wide + image.tex_size.x = std::ceil(bb2.max.x() - bb2.min.x()) + 2 * preview_padding_px; + image.tex_size.y = std::ceil(bb2.max.y() - bb2.min.y()) + 2 * preview_padding_px; + + if (image.tex_size.x > m_input.max_size.x()) image.tex_size.x = m_input.max_size.x(); - // crop image height - if (image.tex_size.y > m_input.max_size.y()) - image.tex_size.y = m_input.max_size.y(); + + scales[index] = scale; } // arrange bounding boxes From c806a09c7cfaaf4c0d19aca7f6cb505487c8ecc8 Mon Sep 17 00:00:00 2001 From: Anson Liu Date: Sun, 9 Aug 2026 20:04:17 -0700 Subject: [PATCH 093/106] Show current filaments at top of AMS filament dropdown (#11293) * Move currently active filaments added to the Prepare sidebar to the top of the AMS Material Selection combo box. It is likely the user wants to set the material to the currently active filament. * Reduce logging verbosity. * Refactor current active preset filament finding to find nested preset inheritance. * Initialize pointer to null before usage. * Remove old commit code * Remove new line --------- Co-authored-by: Ioannis Giannakas <59056762+igiannakas@users.noreply.github.com> Co-authored-by: yw4z --- src/slic3r/GUI/AMSMaterialsSetting.cpp | 53 +++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/AMSMaterialsSetting.cpp b/src/slic3r/GUI/AMSMaterialsSetting.cpp index 74165c20fe..35db1a3955 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.cpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.cpp @@ -1075,7 +1075,7 @@ void AMSMaterialsSetting::Popup(wxString filament, wxString sn, wxString temp_mi // Sort the filaments { - static std::unordered_map sorted_names + std::unordered_map sorted_names = { {"Bambu PLA Basic", 0}, {"Bambu PLA Matte", 1}, {"Bambu PETG HF", 2}, @@ -1090,9 +1090,58 @@ void AMSMaterialsSetting::Popup(wxString filament, wxString sn, wxString temp_mi {"Bambu ABS-GF", 11} }; + // Helper lambda to find a filament Preset by name. We can call this multiple times to walk the inheritance chain and find the base filament. + auto find_filament_by_name = [](const std::string& wanted, const PresetCollection& filaments) -> const Preset* { + for (auto it = filaments.begin(); it != filaments.end(); ++it) { + if (it->name == wanted) { + return &(*it); + } + } + return nullptr; + }; + + // For each active filament preset, find matching Preset in bundle->filaments and add the base filament alias to sorted_names in highest rank in extruder order + auto bundle = wxGetApp().preset_bundle; + const auto& preset_names = bundle->filament_presets; + for (size_t i = preset_names.size(); i-- > 0; ) { + std::string wanted = preset_names[i]; + const int sort_rank = -((int)preset_names.size() - i); + + const Preset* match = nullptr; + + do { + auto find_result = find_filament_by_name(wanted, bundle->filaments); + if (!find_result) { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << " No available filament name matches " << wanted; + break; + } + + match = find_result; + + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " Found available filament matching current preset name " << wanted + << " - Name: " << match->name << " - Alias: " << match->alias + << " - Inherits: " << match->inherits(); + + if (match->inherits().length() == 0) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " No more inherits so we reached the base filament"; + break; + } + + wanted = match->inherits(); + } while (1); // Or loop while (match->alias.length() == 0) because existence of alias and inherits on a Preset seem to be exclusive + + if (!match) { + continue; + } + + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " Update filament rank to " + std::to_string(sort_rank) + " for preset Name: " + << match->name << " - Alias: " << match->alias; + sorted_names.insert_or_assign(match->alias, sort_rank); + } + static std::vector sorted_vendors { "Bambu Lab", "Generic" }; static std::vector sorted_types { "PLA", "PETG", "ABS", "TPU" }; - auto _filament_sorter = [&query_filament_vendors, &query_filament_types](const wxString& left, const wxString& right) -> bool + auto _filament_sorter = [&query_filament_vendors, &query_filament_types, &sorted_names](const wxString& left, const wxString& right) -> bool { { // Compare name order const auto& iter1 = sorted_names.find(left); From b422636740623f5513692e103fc8af4433acdbf6 Mon Sep 17 00:00:00 2001 From: Anson Liu Date: Mon, 10 Aug 2026 23:51:25 -0700 Subject: [PATCH 094/106] Move Generic vendor above Bambu vendor in AMS material setting. (#11306) * Move Generic vendor above Bambu vendor in AMS material setting. * Remove hardcoded sorted_names. Alphabetically sort Bambu with all vendors * Fix sorting with case insensitive comparison * Use arithmetic to get rank distance because priorities are stored in a vector. This lets us remove the include. --- src/slic3r/GUI/AMSMaterialsSetting.cpp | 83 +++++++++++++------------- 1 file changed, 43 insertions(+), 40 deletions(-) diff --git a/src/slic3r/GUI/AMSMaterialsSetting.cpp b/src/slic3r/GUI/AMSMaterialsSetting.cpp index 35db1a3955..2e436e8462 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.cpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.cpp @@ -4,6 +4,7 @@ #include "GUI_App.hpp" #include "libslic3r/Preset.hpp" #include "I18N.hpp" +#include #include #include #include @@ -1075,20 +1076,7 @@ void AMSMaterialsSetting::Popup(wxString filament, wxString sn, wxString temp_mi // Sort the filaments { - std::unordered_map sorted_names = - { {"Bambu PLA Basic", 0}, - {"Bambu PLA Matte", 1}, - {"Bambu PETG HF", 2}, - {"Bambu ABS", 3}, - {"Bambu PLA Silk", 4}, - {"Bambu PLA-CF" , 5}, - {"Bambu PLA Galaxy", 6}, - {"Bambu PLA Metal", 7}, - {"Bambu PLA Marble", 8}, - {"Bambu PETG-CF", 9}, - {"Bambu PETG Translucent", 10}, - {"Bambu ABS-GF", 11} - }; + std::unordered_map selected_filament_ranks; // Helper lambda to find a filament Preset by name. We can call this multiple times to walk the inheritance chain and find the base filament. auto find_filament_by_name = [](const std::string& wanted, const PresetCollection& filaments) -> const Preset* { @@ -1100,12 +1088,12 @@ void AMSMaterialsSetting::Popup(wxString filament, wxString sn, wxString temp_mi return nullptr; }; - // For each active filament preset, find matching Preset in bundle->filaments and add the base filament alias to sorted_names in highest rank in extruder order + // For each active filament preset, find its base filament alias and promote it in extruder order. auto bundle = wxGetApp().preset_bundle; const auto& preset_names = bundle->filament_presets; for (size_t i = preset_names.size(); i-- > 0; ) { std::string wanted = preset_names[i]; - const int sort_rank = -((int)preset_names.size() - i); + const int sort_rank = -static_cast(preset_names.size() - i); const Preset* match = nullptr; @@ -1136,42 +1124,57 @@ void AMSMaterialsSetting::Popup(wxString filament, wxString sn, wxString temp_mi BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " Update filament rank to " + std::to_string(sort_rank) + " for preset Name: " << match->name << " - Alias: " << match->alias; - sorted_names.insert_or_assign(match->alias, sort_rank); + selected_filament_ranks.insert_or_assign(match->alias, sort_rank); } - static std::vector sorted_vendors { "Bambu Lab", "Generic" }; - static std::vector sorted_types { "PLA", "PETG", "ABS", "TPU" }; - auto _filament_sorter = [&query_filament_vendors, &query_filament_types, &sorted_names](const wxString& left, const wxString& right) -> bool + static const std::vector sorted_vendors { "Generic" }; + static const std::vector sorted_types { "PLA", "PETG", "ABS", "TPU" }; + auto priority_rank = [](const std::vector& priorities, const wxString& value) { + const auto iter = std::find_if(priorities.begin(), priorities.end(), [&value](const wxString& priority) { + return priority.CmpNoCase(value) == 0; + }); + return iter - priorities.begin(); + }; + auto _filament_sorter = [&query_filament_vendors, &query_filament_types, &selected_filament_ranks, &priority_rank](const wxString& left, const wxString& right) -> bool { - { // Compare name order - const auto& iter1 = sorted_names.find(left); - int name_order1 = (iter1 != sorted_names.end()) ? iter1->second : INT_MAX; + { // Compare selected filament order + const auto& iter1 = selected_filament_ranks.find(left); + int selected_order1 = (iter1 != selected_filament_ranks.end()) ? iter1->second : INT_MAX; - const auto& iter2 = sorted_names.find(right); - int name_order2 = (iter2 != sorted_names.end()) ? iter2->second : INT_MAX; - if (name_order1 != name_order2) + const auto& iter2 = selected_filament_ranks.find(right); + int selected_order2 = (iter2 != selected_filament_ranks.end()) ? iter2->second : INT_MAX; + if (selected_order1 != selected_order2) { - return name_order1 < name_order2; + return selected_order1 < selected_order2; } } { // Compare vendor - auto iter1 = std::find(sorted_vendors.begin(), sorted_vendors.end(), query_filament_vendors[left]); - auto iter2 = std::find(sorted_vendors.begin(), sorted_vendors.end(), query_filament_vendors[right]); - if (iter1 != iter2) - { - return iter1 < iter2; - }; + const wxString& vendor1 = query_filament_vendors.at(left); + const wxString& vendor2 = query_filament_vendors.at(right); + const auto rank1 = priority_rank(sorted_vendors, vendor1); + const auto rank2 = priority_rank(sorted_vendors, vendor2); + if (rank1 != rank2) + return rank1 < rank2; + + const int vendor_compare = vendor1.CmpNoCase(vendor2); + if (vendor_compare != 0) + return vendor_compare < 0; } { // Compare type - auto iter1 = std::find(sorted_types.begin(), sorted_types.end(), query_filament_types[left]); - auto iter2 = std::find(sorted_types.begin(), sorted_types.end(), query_filament_types[right]); - if (iter1 != iter2) - { - return iter1 < iter2; - } + const wxString& type1 = query_filament_types.at(left); + const wxString& type2 = query_filament_types.at(right); + const auto rank1 = priority_rank(sorted_types, type1); + const auto rank2 = priority_rank(sorted_types, type2); + if (rank1 != rank2) + return rank1 < rank2; + + const int type_compare = type1.CmpNoCase(type2); + if (type_compare != 0) + return type_compare < 0; } - return left < right; + const int name_compare = left.CmpNoCase(right); + return name_compare != 0 ? name_compare < 0 : left < right; }; std::sort(filament_items.begin(), filament_items.end(), _filament_sorter); From c5d2944ee06dab86e8f90807d7622c97f822df86 Mon Sep 17 00:00:00 2001 From: Ian Bassi Date: Tue, 11 Aug 2026 09:54:37 -0300 Subject: [PATCH 095/106] Euskera update (#15215) Based in https://github.com/OrcaSlicer/OrcaSlicer/pull/14970#issuecomment-5145928650 --- localization/i18n/eu/OrcaSlicer_eu.po | 28 +++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/localization/i18n/eu/OrcaSlicer_eu.po b/localization/i18n/eu/OrcaSlicer_eu.po index 430e4f5a60..fa10cc387f 100644 --- a/localization/i18n/eu/OrcaSlicer_eu.po +++ b/localization/i18n/eu/OrcaSlicer_eu.po @@ -12013,11 +12013,11 @@ msgstr "Purgatze-dorreak euskarriak objektuaren geruza-altuera bera izatea eskat # AI Translated msgid "For Organic supports, two walls are supported only with the Hollow/Default base pattern." -msgstr "Euskarri organikoetan, bi horma Hollow/Default oinarri-patroiarekin soilik onartzen dira." +msgstr "Euskarri organikoetan, bi horma Hutsa/Lehenetsia oinarri-patroiarekin soilik onartzen dira." # AI Translated msgid "The Lightning base pattern is not supported by this support type; Rectilinear will be used instead." -msgstr "Lightning oinarri-patroia ez du euskarri mota honek onartzen; Rectilinear erabiliko da horren ordez." +msgstr "Tximista oinarri-patroia ez du euskarri mota honek onartzen; Lerrozuzena erabiliko da horren ordez." msgid "Organic support tree tip diameter must not be smaller than support material extrusion width." msgstr "Euskarri organikoaren zuhaitz-muturraren diametroak ezin du izan euskarri-materialaren estrusio-zabalera baino txikiagoa." @@ -12030,7 +12030,7 @@ msgstr "Euskarri organikoaren adar-diametroak ezin du izan euskarri-zuhaitzaren # AI Translated msgid "The Hollow base pattern is not supported by this support type; Rectilinear will be used instead." -msgstr "Hollow oinarri-patroia ez du euskarri mota honek onartzen; Rectilinear erabiliko da horren ordez." +msgstr "Hutsa oinarri-patroia ez du euskarri mota honek onartzen; Lerrozuzena erabiliko da horren ordez." msgid "Support enforcers are used but support is not enabled. Please enable support." msgstr "Euskarri-behartzaileak erabiltzen dira, baina euskarria ez dago gaituta. Gaitu euskarriak." @@ -13252,7 +13252,7 @@ msgstr "Moderatua" # AI Translated msgid "Top surface pattern" -msgstr "Goiko gainazalaren patroia" +msgstr "Goiko gainazaleko patroia" # AI Translated msgid "This is the line pattern for top surface infill." @@ -13265,13 +13265,13 @@ msgid "Monotonic line" msgstr "Lerro monotonikoa" msgid "Rectilinear" -msgstr "Rectilinear" +msgstr "Lerrozuzena" msgid "Aligned Rectilinear" msgstr "Lerrozuzen lerrokatua" msgid "Concentric" -msgstr "Concentric" +msgstr "Kontzentrikoa" msgid "Hilbert Curve" msgstr "Hilbert kurba" @@ -13337,7 +13337,7 @@ msgstr "Kanporantz" # AI Translated msgid "Bottom surface pattern" -msgstr "Beheko gainazalaren patroia" +msgstr "Beheko gainazaleko patroia" # AI Translated msgid "This is the line pattern of bottom surface infill, not including bridge infill." @@ -13362,7 +13362,7 @@ msgid "" "Outward starts at the center of the surface, so any excess material is pushed towards the edge where it is least visible. Inward starts at the edge and ends with the tight curves at the center.\n" "Default uses shortest-path ordering, which may run in either direction." msgstr "" -"Gaineko gainazalak betetzen diren noranzkoa zentroan oinarritutako patroia erabiltzen denean (Konzentrikoa, Arkimedeen Akordeak, Oktograma Espirala).\n" +"Goiko gainazalak betetzen diren noranzkoa zentroan oinarritutako patroia erabiltzen denean (Kontzentrikoa, Arkimedesen kordak, Oktagrama-kiribila).\n" "Kanporanzkoa erdialdean hasten da, beraz, gehiegizko materiala gutxien ikusten den ertzera bultzatzen da. Barruranzkoa ertzean hasten da eta erdian kurba estuekin amaitzen da.\n" "Lehenetsiak bide laburreneko ordena erabiltzen du, zeina norabide batean zein bestean ibil daitekeen." @@ -13375,7 +13375,7 @@ msgid "" "Inward starts each surface with the wider outer curves, which improves first layer adhesion on build plates where the tight curves at the center may not stick. Outward starts at the center, pushing any excess material towards the edge.\n" "Default uses shortest-path ordering, which may run in either direction." msgstr "" -"Beheko gainazalak betetzen diren noranzkoa zentroan oinarritutako patroia erabiltzen denean (Konzentrikoa, Arkimedeen Akordeak, Oktograma Espirala).\n" +"Beheko gainazalak betetzen diren noranzkoa zentroan oinarritutako patroia erabiltzen denean (Kontzentrikoa, Arkimedesen kordak, Oktagrama-kiribila).\n" "Barruranzkoa hasten da gainazal bakoitza kanpoko kurba zabalagoekin, eta horrek lehen geruzaren atxikimendua hobetzen du erdiko kurba estuak itsatsi ez daitezkeen inprimatze-plaketan. Kanporanzkoa erdialdean hasten da, gehiegizko materiala ertzera bultzatuz.\n" "Lehenetsiak bide laburreneko ordena erabiltzen du, zeina norabide batean zein bestean ibil daitekeen." @@ -16431,9 +16431,9 @@ msgid "" msgstr "" "Euskarriaren lerro-patroia.\n" "\n" -"Zuhaitz-euskarrien aukera lehenetsia Hutsa da, hau da, ez dago oinarri-patroirik. Beste euskarri motetarako, aukera lehenetsia patroi zuzenekoa da.\n" +"Zuhaitz-euskarrien aukera lehenetsia Hutsa da, hau da, ez dago oinarri-patroirik. Beste euskarri motetarako, aukera lehenetsia patroi lerrozuzena da.\n" "\n" -"OHARRA: Euskarri organikoetan, bi hormak Hutsa/Lehenetsia oinarri-patroiarekin bakarrik onartzen dira. Tximistetan oinarritutako patroia Zuhaitz mehea/Indartsua/Hibridoa euskarriek bakarrik onartzen dute. Beste euskarri motetarako, Zuzenekoa erabiliko da Tximistenaren ordez." +"OHARRA: Euskarri organikoetan, bi hormak Hutsa/Lehenetsia oinarri-patroiarekin bakarrik onartzen dira. Tximista oinarri-patroia Zuhaitz mehea/Indartsua/Hibridoa euskarriek bakarrik onartzen dute. Beste euskarri motetarako, Lerrozuzena erabiliko da Tximistaren ordez." msgid "Rectilinear grid" msgstr "Sare lerrozuzena" @@ -16713,7 +16713,7 @@ msgid "" " - Each Model: centers the pattern on each connected body. Parts that touch or overlap share one center; parts detached from the rest each get their own.\n" " - Each Assembly: uses a single shared center for the whole object or assembly." msgstr "" -"Goiko eta beheko gainazaleko patroi zentratuen (Arkimedesen kordak, Oktagrama-espirala) zentroa non kokatzen den aukeratzen du.\n" +"Goiko eta beheko gainazaleko patroi zentratuen (Arkimedesen kordak, Oktagrama-kiribila) zentroa non kokatzen den aukeratzen du.\n" " - Gainazal bakoitza: patroia gainazal-eskualde bakoitzean zentratzen du, uharte bakoitza bere kabuz simetrikoa izan dadin.\n" " - Modelo bakoitza: patroia konektatutako gorputz bakoitzean zentratzen du. Elkar ukitzen edo gainjartzen diren piezek zentro bera partekatzen dute; gainerakoetatik bereizitako piezek beren zentroa dute.\n" " - Muntaketa bakoitza: zentro partekatu bakarra erabiltzen du objektu edo muntaketa osorako." @@ -17144,7 +17144,7 @@ msgid "Detect narrow internal solid infills" msgstr "Detektatu barruko betegarri solido estua" msgid "This option will auto-detect narrow internal solid infill areas. If enabled, the concentric pattern will be used for the area to speed up printing. Otherwise, the rectilinear pattern will be used by default." -msgstr "Aukera honek barruko betegarri solido estuko eremuak automatikoki detektatuko ditu. Gaituta badago, eremu horretan patroi zentrokidea erabiliko da inprimaketa azkartzeko. Bestela, patroi lerrozuzena erabiliko da lehenespenez." +msgstr "Aukera honek barruko betegarri solido estuko eremuak automatikoki detektatuko ditu. Gaituta badago, eremu horretan patroi kontzentrikoa erabiliko da inprimaketa azkartzeko. Bestela, patroi lerrozuzena erabiliko da lehenespenez." msgid "invalid value " msgstr "balio baliogabea " @@ -18703,7 +18703,7 @@ msgstr "YOLO (perfekzionista)" # AI Translated msgid "Top Surface Pattern" -msgstr "Goiko gainazalaren patroia" +msgstr "Goiko gainazaleko patroia" msgid "Choose a slot for the selected color" msgstr "Aukeratu zirrikitu bat hautatutako kolorearentzat" From 117ed0060d5ba6327cc993c9dcdd40de4b6c24a2 Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Tue, 11 Aug 2026 22:25:09 +0300 Subject: [PATCH 096/106] Fix Celsius symbol rendering in Preview (#15202) --- deps_src/imgui/imgui_draw.cpp | 1 + src/slic3r/GUI/ImGuiWrapper.cpp | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/deps_src/imgui/imgui_draw.cpp b/deps_src/imgui/imgui_draw.cpp index 913a551fa0..d88bc79904 100644 --- a/deps_src/imgui/imgui_draw.cpp +++ b/deps_src/imgui/imgui_draw.cpp @@ -2856,6 +2856,7 @@ const ImWchar* ImFontAtlas::GetGlyphRangesDefault() { 0x0020, 0x00FF, // Basic Latin + Latin Supplement 0x2000, 0x206F, // General Punctuation + 0x2103, 0x2103, // ℃ Celsius symbol 0x3000, 0x30FF, // CJK Symbols and Punctuations, Hiragana, Katakana 0x31F0, 0x31FF, // Katakana Phonetic Extensions 0xFF00, 0xFFEF, // Half-width characters diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index 8974a169d1..d46e8ed31b 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -2809,12 +2809,26 @@ void ImGuiWrapper::init_font(bool compress) } } + if (m_glyph_ranges == ImGui::GetIO().Fonts->GetGlyphRangesThai()) { + ImFontConfig fallback_cfg = cfg; + fallback_cfg.MergeMode = true; + static constexpr ImWchar celsius_range[] = { 0x2103, 0x2103, 0 }; + io.Fonts->AddFontFromFileTTF((Slic3r::resources_dir() + "/fonts/HarmonyOS_Sans_SC_Regular.ttf").c_str(), m_font_size, &fallback_cfg, celsius_range); + } + bold_font = io.Fonts->AddFontFromFileTTF((Slic3r::resources_dir() + "/fonts/" + font_name_bold).c_str(), m_font_size, &cfg, ranges.Data); if (bold_font == nullptr) { bold_font = io.Fonts->AddFontDefault(); if (bold_font == nullptr) { throw Slic3r::RuntimeError("ImGui: Could not load deafult font"); } } + if (m_glyph_ranges == ImGui::GetIO().Fonts->GetGlyphRangesThai()) { + ImFontConfig fallback_cfg = cfg; + fallback_cfg.MergeMode = true; + static constexpr ImWchar celsius_range[] = { 0x2103, 0x2103, 0 }; + io.Fonts->AddFontFromFileTTF((Slic3r::resources_dir() + "/fonts/HarmonyOS_Sans_SC_Bold.ttf").c_str(), m_font_size, &fallback_cfg, celsius_range); + } + if (m_glyph_ranges == ImGui::GetIO().Fonts->GetGlyphRangesThai()) { default_font->Scale *= 1.25f; bold_font->Scale *= 1.25f; From 6dbdb1d07e0448e0bcfc1c38451fc1d256d86c7a Mon Sep 17 00:00:00 2001 From: Terasit Juntarasombut <93132156+Icezaza2543@users.noreply.github.com> Date: Wed, 12 Aug 2026 02:56:59 +0700 Subject: [PATCH 097/106] l10n: Fix contextual and technical translation errors in Thai (th) (#15213) * l10n: Fix contextual and technical translation errors in Thai (th) * l10n(th): standardize technical terms and sync localization glossary (#15213) * l10n(th): remove localization_glossary.tsv from PR (#15213) --- localization/i18n/th/OrcaSlicer_th.po | 368 +++++++++++++------------- 1 file changed, 184 insertions(+), 184 deletions(-) diff --git a/localization/i18n/th/OrcaSlicer_th.po b/localization/i18n/th/OrcaSlicer_th.po index 6a4499d148..a419ba320e 100644 --- a/localization/i18n/th/OrcaSlicer_th.po +++ b/localization/i18n/th/OrcaSlicer_th.po @@ -843,7 +843,7 @@ msgid "Hexagon" msgstr "หกเหลี่ยม" msgid "Keep orientation" -msgstr "รักษาปฐมนิเทศ" +msgstr "คงการวางแนว" msgid "Place on cut" msgstr "วางบนการตัด" @@ -891,7 +891,7 @@ msgid "Cut position" msgstr "ตำแหน่งตัด" msgid "Build Volume" -msgstr "ปริมาตรพื้นที่พิมพ์" +msgstr "ปริมาตรการพิมพ์ (Build Volume)" msgid "Multiple" msgstr "หลายรายการ" @@ -1200,7 +1200,7 @@ msgid "Horizontal text" msgstr "ข้อความแนวนอน" msgid "Shift+" -msgstr "กะ+" +msgstr "Shift+" msgid "Mouse move up or down" msgstr "เมาส์เลื่อนขึ้นหรือลง" @@ -2592,7 +2592,7 @@ msgid "Ironing" msgstr "รีดผิว" msgid "Fuzzy skin" -msgstr "ผิวฟัซซี" +msgstr "ผิวฟัซซี (Fuzzy Skin)" msgid "Extruders" msgstr "ชุดดันเส้น" @@ -2817,10 +2817,10 @@ msgid "current" msgstr "ปัจจุบัน" msgid "Scale to build volume" -msgstr "ปรับขนาดเพื่อสร้างปริมาณ" +msgstr "ปรับขนาดให้พอดีกับปริมาตรการพิมพ์" msgid "Scale an object to fit the build volume" -msgstr "ปรับขนาดวัตถุให้พอดีกับปริมาณงานสร้าง" +msgstr "ปรับขนาดวัตถุให้พอดีกับปริมาตรการพิมพ์" msgid "Flush Options" msgstr "ตัวเลือกการไล่เส้น" @@ -2898,10 +2898,10 @@ msgid "Change SVG source file, projection, size, ..." msgstr "เปลี่ยนไฟล์ต้นฉบับ SVG, การฉายภาพ, ขนาด, ..." msgid "Invalidate cut info" -msgstr "ข้อมูลการตัดไม่ถูกต้อง" +msgstr "ยกเลิกข้อมูลการตัด" msgid "Add Primitive" -msgstr "เพิ่มดั้งเดิม" +msgstr "เพิ่มรูปทรงพื้นฐาน" msgid "Add Handy models" msgstr "เพิ่มรุ่นแฮนดี้" @@ -3027,7 +3027,7 @@ msgid "Center" msgstr "กึ่งกลาง" msgid "Drop" -msgstr "หยด" +msgstr "วางลงฐานพิมพ์" msgid "Edit Process Settings" msgstr "แก้ไขการตั้งค่ากระบวนการ" @@ -3182,7 +3182,7 @@ msgid "Switch to per-object setting mode to edit process settings of selected ob msgstr "สลับไปที่โหมดการตั้งค่าต่ออ็อบเจ็กต์เพื่อแก้ไขการตั้งค่ากระบวนการของอ็อบเจ็กต์ที่เลือก" msgid "Remove paint-on fuzzy skin" -msgstr "ลบสีบนผิวที่คลุมเครือ" +msgstr "ลบการระบายสีผิวฟัซซี" # AI Translated msgid "Delete Settings" @@ -3242,7 +3242,7 @@ msgid "Add layers" msgstr "เพิ่มเลเยอร์" msgid "Cut Connectors information" -msgstr "ตัดข้อมูลตัวเชื่อมต่อ" +msgstr "ข้อมูลตัวเชื่อมสำหรับการตัด" msgid "Object manipulation" msgstr "การจัดการวัตถุ" @@ -3279,7 +3279,7 @@ msgid "Layer" msgstr "เลเยอร์" msgid "Selection conflicts" -msgstr "ข้อขัดแย้งในการคัดเลือก" +msgstr "การเลือกขัดแย้งกัน" msgid "If the first selected item is an object, the second should also be an object." msgstr "หากรายการแรกที่เลือกเป็นวัตถุ รายการที่สองก็ควรเป็นวัตถุด้วย" @@ -3390,7 +3390,7 @@ msgid "Plate" msgstr "ฐานพิมพ์" msgid "Brim" -msgstr "ขอบยึดชิ้นงาน" +msgstr "ขอบยึดชิ้นงาน (Brim)" msgid "Object/Part Settings" msgstr "การตั้งค่าวัตถุ/ชิ้นส่วน" @@ -4786,7 +4786,7 @@ msgid "" "YES - Keep Prime Tower\n" "NO - Keep Adaptive Layer Height and Independent Support Layer Height" msgstr "" -"ไพรม์ทาวเวอร์ไม่ทำงานเมื่อเปิดใช้งาน Adaptive Layer Height หรือ Independent ส่วนรองรับ Layer Height\n" +"Prime Tower ไม่ทำงานเมื่อเปิดใช้งาน Adaptive Layer Height หรือ Independent ส่วนรองรับ Layer Height\n" "คุณต้องการเก็บอันไหน?\n" "ใช่ - เก็บ Prime Tower ไว้\n" "ไม่ - คงความสูงของเลเยอร์แบบปรับได้และความสูงของเลเยอร์รองรับที่เป็นอิสระ" @@ -4797,7 +4797,7 @@ msgid "" "YES - Keep Prime Tower\n" "NO - Keep Adaptive Layer Height" msgstr "" -"ไพรม์ทาวเวอร์ไม่ทำงานเมื่อเปิด Adaptive Layer Height\n" +"Prime Tower ไม่ทำงานเมื่อเปิด Adaptive Layer Height\n" "คุณต้องการเก็บอันไหน?\n" "ใช่ - เก็บ Prime Tower ไว้\n" "ไม่ - คงความสูงของเลเยอร์แบบปรับได้" @@ -4808,7 +4808,7 @@ msgid "" "YES - Keep Prime Tower\n" "NO - Keep Independent Support Layer Height" msgstr "" -"ไพร์มทาวเวอร์ไม่ทำงานเมื่อเปิดความสูงของเลเยอร์รองรับอิสระ\n" +"Prime Tower ไม่ทำงานเมื่อเปิดความสูงของเลเยอร์รองรับอิสระ\n" "คุณต้องการเก็บอันไหน?\n" "ใช่ - เก็บ Prime Tower ไว้\n" "ไม่ - รักษาความสูงของชั้นรองรับที่เป็นอิสระ" @@ -5381,7 +5381,7 @@ msgid "Pressure Advance" msgstr "แรงดันล่วงหน้า (Pressure Advance)" msgid "Noop" -msgstr "นะ" +msgstr "ไม่มีการดำเนินการ" msgid "Retract" msgstr "ดึงกลับ" @@ -5405,7 +5405,7 @@ msgid "Travel" msgstr "เดินหัวเปล่า" msgid "Wipe" -msgstr "เช็ดหัวฉีด" +msgstr "เช็ดหัวฉีด (Wipe)" msgid "Extrude" msgstr "ฉีดเส้น" @@ -5441,7 +5441,7 @@ msgid "Support interface" msgstr "ผิวสัมผัสส่วนรองรับ" msgid "Prime tower" -msgstr "ทาวเวอร์ไล่เส้น" +msgstr "Prime Tower" msgid "Bottom surface" msgstr "ผิวด้านล่าง" @@ -5486,7 +5486,7 @@ msgid "Jerk: " msgstr "เจิร์ก: " msgid "PA: " -msgstr "พ่อ:" +msgstr "PA: " msgid "mm/s" msgstr "มม./วินาที" @@ -5552,7 +5552,7 @@ msgid "Tips:" msgstr "เคล็ดลับ:" msgid "Current grouping of slice result is not optimal." -msgstr "การจัดกลุ่มผลลัพธ์การแบ่งส่วนในปัจจุบันไม่เหมาะสมที่สุด" +msgstr "การจัดกลุ่มผลการสไลซ์ปัจจุบันยังไม่เหมาะสม" #, boost-format msgid "Increase %1%g filament and %2% changes compared to optimal grouping." @@ -5585,7 +5585,7 @@ msgid "Regroup filament" msgstr "จัดกลุ่มเส้นพลาสติกใหม่" msgid "up to" -msgstr "ขึ้นไป" +msgstr "สูงสุด" msgid "above" msgstr "ข้างบน" @@ -5642,7 +5642,7 @@ msgid "Filament change times" msgstr "จำนวนครั้งที่เปลี่ยนเส้น" msgid "Tool changes" -msgstr "การเปลี่ยนแปลงเครื่องมือ" +msgstr "การเปลี่ยนเครื่องมือ" msgid "Color change" msgstr "เปลี่ยนสี" @@ -5673,7 +5673,7 @@ msgid "Model printing time" msgstr "ระยะเวลาในการพิมพ์โมเดล" msgid "Show stealth mode" -msgstr "แสดงโหมดซ่อนตัว" +msgstr "แสดงโหมดเงียบ" msgid "Show normal mode" msgstr "แสดงโหมดปกติ" @@ -5690,10 +5690,10 @@ msgid "" "Please solve the problem by moving it totally on or off the plate, and confirming that the height is within the build volume." msgstr "" "วัตถุวางอยู่เหนือขอบเขตของแผ่นหรือสูงเกินขีดจำกัดความสูง\n" -"โปรดแก้ไขปัญหาด้วยการเลื่อนเข้าหรือออกจากเพลตโดยสิ้นเชิง และยืนยันว่าความสูงอยู่ภายในปริมาตรงานประกอบ" +"โปรดแก้ไขปัญหาด้วยการเลื่อนเข้าหรือออกจากเพลตโดยสิ้นเชิง และยืนยันว่าความสูงอยู่ภายในปริมาตรการพิมพ์" msgid "Variable layer height" -msgstr "ความสูงของชั้นตัวแปร" +msgstr "ความสูงเลเยอร์แบบแปรผัน" msgid "Adaptive" msgstr "ปรับตัวได้" @@ -5743,7 +5743,7 @@ msgid "Following objects are laid over the boundary of plate or exceeds the heig msgstr "วัตถุต่อไปนี้วางอยู่เหนือขอบเขตของแผ่นหรือสูงเกินขีดจำกัดความสูง:\n" msgid "Please solve the problem by moving it totally on or off the plate, and confirming that the height is within the build volume.\n" -msgstr "โปรดแก้ไขปัญหาด้วยการเลื่อนเข้าหรือออกจากเพลตโดยสิ้นเชิง และยืนยันว่าความสูงอยู่ภายในปริมาตรงานประกอบ\n" +msgstr "โปรดแก้ไขปัญหาด้วยการเลื่อนเข้าหรือออกจากเพลตโดยสิ้นเชิง และยืนยันว่าความสูงอยู่ภายในปริมาตรการพิมพ์\n" #, c-format, boost-format msgid "The position or size of some models exceeds the %s's printable range." @@ -5783,7 +5783,7 @@ msgid "Optimize support interface area" msgstr "ปรับพื้นที่อินเทอร์เฟซส่วนรองรับให้เหมาะสม" msgid "Orient" -msgstr "ตะวันออก" +msgstr "จัดวางแนว" msgid "Arrange options" msgstr "ตัวเลือกจัดเรียง" @@ -5929,7 +5929,7 @@ msgid "Paint Toolbar" msgstr "แถบเครื่องมือสี" msgid "Explosion Ratio" -msgstr "อัตราส่วนการระเบิด" +msgstr "ระดับการแยกชิ้นส่วน" msgid "Section View" msgstr "มุมมองส่วน" @@ -6002,7 +6002,7 @@ msgid "PLA and PETG filaments detected in the mixture. Adjust parameters accordi msgstr "ตรวจพบเส้นพลาสติก PLA และ PETG ในส่วนผสม ปรับพารามิเตอร์ตาม Wiki เพื่อรับรองคุณภาพการพิมพ์" msgid "The prime tower extends beyond the plate boundary." -msgstr "หอคอยหลักขยายออกไปเกินขอบเขตแผ่นเปลือกโลก" +msgstr "Prime Tower ยื่นออกนอกขอบเขตของเพลตพิมพ์" msgid "Partial flushing volume set to 0. Multi-color printing may cause color mixing in models. Please readjust flushing settings." msgstr "ตั้งค่าปริมาณการไล่เส้นบางส่วนเป็น 0 การพิมพ์หลายสีอาจทำให้เกิดการผสมสีในรุ่นต่างๆ โปรดปรับการตั้งค่าการไล่เส้นใหม่" @@ -7953,7 +7953,7 @@ msgid "Enabling traditional timelapse photography may cause surface imperfection msgstr "การเปิดใช้งานการถ่ายภาพไทม์แลปส์แบบดั้งเดิมอาจทำให้เกิดความไม่สมบูรณ์ของพื้นผิวได้ ขอแนะนำให้เปลี่ยนเป็นโหมดราบรื่น" msgid "Smooth mode for timelapse is enabled, but the prime tower is off, which may cause print defects. Please enable the prime tower, re-slice and print again." -msgstr "เปิดใช้งานโหมด Smooth สำหรับไทม์แลปส์แล้ว แต่ไพรม์ทาวเวอร์ปิดอยู่ ซึ่งอาจทำให้เกิดข้อบกพร่องในการพิมพ์ โปรดเปิดใช้งานไพร์มทาวเวอร์ สไลซ์ใหม่และพิมพ์อีกครั้ง" +msgstr "เปิดใช้งานโหมด Smooth สำหรับไทม์แลปส์แล้ว แต่ Prime Tower ปิดอยู่ ซึ่งอาจทำให้เกิดข้อบกพร่องในการพิมพ์ โปรดเปิดใช้งาน Prime Tower สไลซ์ใหม่และพิมพ์อีกครั้ง" msgid "Expand sidebar" msgstr "ขยายแถบด้านข้าง" @@ -9311,7 +9311,7 @@ msgid "" "Attempt to keep painted features (color/seam/support/fuzzy etc.) after changing the object mesh (such as cut/reload from disk/simplify/fix etc.)\n" "Highly experimental! Slow and may create artifact." msgstr "" -"พยายามคงคุณสมบัติการทาสีไว้ (สี/รอยตะเข็บ/ส่วนรองรับ/คลุมเครือ ฯลฯ) หลังจากเปลี่ยนตาข่ายวัตถุ (เช่น ตัด/โหลดซ้ำจากดิสก์/ลดความซับซ้อน/แก้ไข ฯลฯ)\n" +"พยายามคงคุณสมบัติการทาสีไว้ (สี/รอยตะเข็บ/ส่วนรองรับ/ผิวฟัซซี ฯลฯ) หลังจากเปลี่ยนตาข่ายวัตถุ (เช่น ตัด/โหลดซ้ำจากดิสก์/ลดความซับซ้อน/แก้ไข ฯลฯ)\n" "น่าทดลองมาก! ช้าและอาจสร้างสิ่งประดิษฐ์" msgid "Allow Abnormal Storage" @@ -10241,25 +10241,25 @@ msgstr "คลิกเพื่อรีเซ็ตการตั้งค่ # AI Translated msgid "Prime tower is required for nozzle changing. There may be flaws on the model without prime tower. Are you sure you want to disable prime tower?" -msgstr "จำเป็นต้องใช้ทาวเวอร์ไล่เส้นสำหรับการเปลี่ยนหัวฉีด อาจเกิดข้อบกพร่องบนโมเดลหากไม่มีทาวเวอร์ไล่เส้น คุณแน่ใจหรือไม่ว่าต้องการปิดทาวเวอร์ไล่เส้น?" +msgstr "จำเป็นต้องใช้ Prime Tower สำหรับการเปลี่ยนหัวฉีด อาจเกิดข้อบกพร่องบนโมเดลหากไม่มี Prime Tower คุณแน่ใจหรือไม่ว่าต้องการปิด Prime Tower?" msgid "A prime tower is required for smooth timelapse mode. There may be flaws on the model without a prime tower. Are you sure you want to disable the prime tower?" -msgstr "โหมดไทม์แลปส์แบบราบรื่นต้องใช้ไพรม์ทาวเวอร์ หากไม่มีไพรม์ทาวเวอร์อาจเกิดตำหนิบนโมเดลได้ คุณแน่ใจหรือไม่ว่าต้องการปิดไพรม์ทาวเวอร์?" +msgstr "จำเป็นต้องใช้ Prime Tower สำหรับโหมดไทม์แลปส์แบบราบรื่น หากไม่มี Prime Tower อาจเกิดตำหนิบนโมเดลได้ คุณแน่ใจหรือไม่ว่าต้องการปิด Prime Tower?" msgid "A prime tower is required for clumping detection. There may be flaws on the model without prime tower. Are you sure you want to disable prime tower?" -msgstr "ต้องใช้ไพรม์ทาวเวอร์ในการตรวจจับการจับกันเป็นก้อน อาจมีตำหนิตรงรุ่นที่ไม่มีไพร์มทาวเวอร์ คุณแน่ใจหรือไม่ว่าต้องการปิดการใช้งานไพร์มทาวเวอร์?" +msgstr "จำเป็นต้องใช้ Prime Tower ในการตรวจจับการจับกันเป็นก้อน อาจมีตำหนิบนโมเดลที่ไม่มี Prime Tower คุณแน่ใจหรือไม่ว่าต้องการปิด Prime Tower?" msgid "Enabling both precise Z height and the prime tower may cause slicing errors. Do you still want to enable?" -msgstr "การเปิดใช้งานทั้งความสูง Z ที่แม่นยำและหอคอยหลักอาจทำให้เกิดข้อผิดพลาดในการแบ่งส่วน คุณยังต้องการเปิดใช้งานหรือไม่?" +msgstr "การเปิดใช้งานทั้งความสูง Z ที่แม่นยำและ Prime Tower อาจทำให้เกิดข้อผิดพลาดในการแบ่งส่วน คุณยังต้องการเปิดใช้งานหรือไม่?" msgid "A prime tower is required for clumping detection. There may be flaws on the model without prime tower. Do you still want to enable clumping detection?" -msgstr "ต้องใช้ไพรม์ทาวเวอร์ในการตรวจจับการจับกันเป็นก้อน อาจมีตำหนิตรงรุ่นที่ไม่มีไพร์มทาวเวอร์ คุณยังต้องการเปิดใช้งานการตรวจจับการจับกันเป็นก้อนหรือไม่" +msgstr "จำเป็นต้องใช้ Prime Tower ในการตรวจจับการจับกันเป็นก้อน อาจมีตำหนิบนโมเดลที่ไม่มี Prime Tower คุณยังต้องการเปิดใช้งานการตรวจจับการจับกันเป็นก้อนหรือไม่" msgid "Enabling both precise Z height and the prime tower may cause slicing errors. Do you still want to enable precise Z height?" -msgstr "การเปิดใช้งานทั้งความสูง Z ที่แม่นยำและหอคอยหลักอาจทำให้เกิดข้อผิดพลาดในการแบ่งส่วน คุณยังต้องการเปิดใช้งานความสูง Z ที่แม่นยำหรือไม่" +msgstr "การเปิดใช้งานทั้งความสูง Z ที่แม่นยำและ Prime Tower อาจทำให้เกิดข้อผิดพลาดในการแบ่งส่วน คุณยังต้องการเปิดใช้งานความสูง Z ที่แม่นยำหรือไม่" msgid "A prime tower is required for smooth timelapse mode. There may be flaws on the model without prime tower. Do you want to enable the prime tower?" -msgstr "โหมดไทม์แลปส์แบบราบรื่นต้องใช้ไพรม์ทาวเวอร์ หากไม่มีไพรม์ทาวเวอร์อาจเกิดตำหนิบนโมเดลได้ ต้องการเปิดใช้ไพรม์ทาวเวอร์หรือไม่?" +msgstr "จำเป็นต้องใช้ Prime Tower สำหรับโหมดไทม์แลปส์แบบราบรื่น หากไม่มี Prime Tower อาจเกิดตำหนิบนโมเดลได้ ต้องการเปิดใช้ Prime Tower หรือไม่?" msgid "Still print by object?" msgstr "ยังคงพิมพ์ตามวัตถุใช่ไหม" @@ -10411,7 +10411,7 @@ msgid "Z contouring" msgstr "รูปร่าง Z" msgid "Wall generator" -msgstr "เครื่องกำเนิดไฟฟ้าติดผนัง" +msgstr "ตัวสร้างผนัง" msgid "Walls and surfaces" msgstr "ผนังและพื้นผิว" @@ -10477,7 +10477,7 @@ msgid "G-code output" msgstr "เอาต์พุตรหัส G" msgid "Change extrusion role G-code" -msgstr "เปลี่ยนบทบาทการอัดขึ้นรูป G-code" +msgstr "เปลี่ยนประเภทการพิมพ์ G-code" msgid "Post-processing Scripts" msgstr "สคริปต์หลังการประมวลผล" @@ -10616,7 +10616,7 @@ msgid "Filament end G-code" msgstr "G-code สิ้นสุดของเส้นพลาสติก" msgid "Wipe tower parameters" -msgstr "พารามิเตอร์ทาวเวอร์เช็ดหัวฉีด" +msgstr "พารามิเตอร์ Wipe Tower" msgid "Multi Filament" msgstr "เส้นพลาสติกแบบหลากหลาย" @@ -10753,7 +10753,7 @@ msgid "Nozzle diameter" msgstr "เส้นผ่านศูนย์กลางหัวฉีด" msgid "Wipe tower" -msgstr "ทาวเวอร์เช็ดหัวฉีด" +msgstr "Wipe Tower" msgid "Single extruder multi-material parameters" msgstr "พารามิเตอร์วัสดุหลายชุดดันเส้นเดี่ยว" @@ -10780,7 +10780,7 @@ msgstr "" "ต้องการตั้งค่าเป็น 100% เพื่อเปิดใช้งาน Firmware Retraction หรือไม่?" msgid "Firmware Retraction" -msgstr "การเพิกถอนเฟิร์มแวร์" +msgstr "การดึงกลับด้วยเฟิร์มแวร์ (Firmware Retraction)" msgid "Switching to a printer with different extruder types or numbers will discard or reset changes to extruder or multi-nozzle-related parameters." msgstr "การเปลี่ยนไปใช้เครื่องพิมพ์ที่มีประเภทหรือหมายเลขชุดดันเส้นที่แตกต่างกันจะยกเลิกหรือรีเซ็ตการเปลี่ยนแปลงในชุดดันเส้นหรือพารามิเตอร์ที่เกี่ยวข้องกับหัวฉีดหลายตัว" @@ -11596,7 +11596,7 @@ msgid "Gizmo mesh boolean" msgstr "Gizmo mesh บูลีน" msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Gizmo FDM เพ้นท์บนผิวที่คลุมเครือ" +msgstr "Gizmo FDM เพ้นท์ผิวฟัซซี" msgid "Gizmo SLA support points" msgstr "จุดส่วนรองรับ Gizmo SLA" @@ -11614,7 +11614,7 @@ msgid "Gizmo assemble" msgstr "กิสโมประกอบ" msgid "Gizmo brim ears" -msgstr "กิสโม่ขอบหู" +msgstr "Gizmo หูขอบยึดชิ้นงาน (Brim Ears)" msgid "Zoom in" msgstr "ซูมเข้า" @@ -11936,10 +11936,10 @@ msgid "Parts of the object at these heights may be too thin or the object may ha msgstr "บางส่วนของวัตถุที่ความสูงเหล่านี้อาจบางเกินไป หรือวัตถุอาจมี mesh ผิดปกติ" msgid "Process change extrusion role G-code" -msgstr "กระบวนการเปลี่ยนบทบาทการอัดขึ้นรูป G-code" +msgstr "กระบวนการเปลี่ยนประเภทการพิมพ์ G-code" msgid "Filament change extrusion role G-code" -msgstr "เส้นพลาสติกเปลี่ยนบทบาทการอัดขึ้นรูป G-code" +msgstr "เส้นพลาสติกเปลี่ยนประเภทการพิมพ์ G-code" msgid "No object can be printed. It may be too small." msgstr "ไม่สามารถพิมพ์วัตถุได้ อาจจะเล็กเกินไป" @@ -12100,7 +12100,7 @@ msgid " is too close to clumping detection area, there may be collisions when pr msgstr "อยู่ใกล้พื้นที่การตรวจจับการจับตัวกันมากเกินไป อาจเกิดการชนกันเมื่อพิมพ์" msgid "Prime Tower" -msgstr "ทาวเวอร์ไล่เส้น" +msgstr "Prime Tower" msgid " is too close to others, and collisions may be caused.\n" msgstr "อยู่ใกล้ผู้อื่นมากเกินไปและอาจเกิดการชนได้\n" @@ -12130,10 +12130,10 @@ msgid "Clumping detection is not supported when \"by object\" sequence is enable msgstr "ไม่รองรับการตรวจจับการจับกันเป็นก้อนเมื่อเปิดใช้งานลำดับ \"ตามวัตถุ\"" msgid "Enabling both precise Z height and the prime tower may cause slicing errors." -msgstr "การเปิดใช้งานทั้งความสูง Z ที่แม่นยำและหอคอยหลักอาจทำให้เกิดข้อผิดพลาดในการแบ่งส่วน" +msgstr "การเปิดใช้งานทั้งความสูง Z ที่แม่นยำและ Prime Tower อาจทำให้เกิดข้อผิดพลาดในการแบ่งส่วน" msgid "A prime tower is required for clumping detection; otherwise, there may be flaws on the model." -msgstr "จำเป็นต้องใช้หอคอยหลักในการตรวจจับการจับกันเป็นก้อน มิฉะนั้นอาจมีข้อบกพร่องในแบบจำลอง" +msgstr "จำเป็นต้องใช้ Prime Tower ในการตรวจจับการจับกันเป็นก้อน มิฉะนั้นอาจมีข้อบกพร่องในแบบจำลอง" msgid "Please select \"By object\" print sequence to print multiple objects in spiral vase mode." msgstr "โปรดเลือกลำดับการพิมพ์ \"ตามวัตถุ\" เพื่อพิมพ์วัตถุหลายชิ้นในโหมดแจกันเกลียว" @@ -12143,15 +12143,15 @@ msgstr "โหมดแจกันเกลียวจะไม่ทำงา #, boost-format msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." -msgstr "แม้ว่าวัตถุ %1% จะพอดีกับปริมาตรการสร้าง แต่วัตถุนั้นเกินความสูงของปริมาตรการสร้างสูงสุดเนื่องจากการชดเชยการหดตัวของวัสดุ" +msgstr "แม้ว่าวัตถุ %1% จะพอดีกับปริมาตรการพิมพ์ แต่วัตถุนั้นเกินความสูงของปริมาตรการพิมพ์สูงสุดเนื่องจากการชดเชยการหดตัวของวัสดุ" #, boost-format msgid "The object %1% exceeds the maximum build volume height." -msgstr "วัตถุ %1% เกินความสูงของปริมาตรบิลด์สูงสุด" +msgstr "วัตถุ %1% เกินความสูงของปริมาตรการพิมพ์สูงสุด" #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." -msgstr "แม้ว่าออบเจ็กต์ %1% จะพอดีกับปริมาณการสร้าง แต่เลเยอร์สุดท้ายก็เกินความสูงของปริมาตรการสร้างสูงสุด" +msgstr "แม้ว่าวัตถุ %1% จะพอดีกับปริมาตรการพิมพ์ แต่วัตถุนั้นเกินความสูงของปริมาตรการพิมพ์สูงสุด" msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "คุณอาจต้องการลดขนาดแบบจำลองของคุณหรือเปลี่ยนการตั้งค่าการพิมพ์ปัจจุบันแล้วลองอีกครั้ง" @@ -12160,40 +12160,40 @@ msgid "Variable layer height is not supported with Organic supports." msgstr "ไม่รองรับความสูงของเลเยอร์ที่แปรผันได้ด้วยการรองรับแบบออร์แกนิก" msgid "Different nozzle diameters and different filament diameters may not work well when the prime tower is enabled. It's very experimental, so please proceed with caution." -msgstr "เส้นผ่านศูนย์กลางของหัวฉีดที่แตกต่างกันและเส้นผ่านศูนย์กลางของเส้นพลาสติกที่แตกต่างกันอาจทำงานได้ไม่ดีนักเมื่อเปิดใช้งานไพรม์ทาวเวอร์ ยังเป็นการทดลองอยู่มาก ดังนั้นโปรดดำเนินการด้วยความระมัดระวัง" +msgstr "เส้นผ่านศูนย์กลางของหัวฉีดที่แตกต่างกันและเส้นผ่านศูนย์กลางของเส้นพลาสติกที่แตกต่างกันอาจทำงานได้ไม่ดีนักเมื่อเปิดใช้งาน Prime Tower ยังเป็นการทดลองอยู่มาก ดังนั้นโปรดดำเนินการด้วยความระมัดระวัง" msgid "The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1)." msgstr "ขณะนี้ Wipe Tower รองรับการกำหนดที่อยู่ของชุดดันเส้นแบบสัมพันธ์เท่านั้น (use_relative_e_distances=1)" msgid "Ooze prevention is only supported with the wipe tower when 'single_extruder_multi_material' is off." -msgstr "รองรับการป้องกันน้ำซึมด้วยหอเช็ดเมื่อปิด 'single_extruder_multi_material' เท่านั้น" +msgstr "รองรับการป้องกันน้ำซึมด้วย Wipe Tower เมื่อปิด 'single_extruder_multi_material' เท่านั้น" msgid "The prime tower is currently only supported for the Marlin, RepRap/Sprinter, RepRapFirmware and Repetier G-code flavors." -msgstr "ขณะนี้ไพรม์ทาวเวอร์รองรับเฉพาะรสชาติ Marlin, RepRap/Sprinter, RepRapFirmware และ Repetier G-code เท่านั้น" +msgstr "ขณะนี้ Prime Tower รองรับเฉพาะรสชาติ Marlin, RepRap/Sprinter, RepRapFirmware และ Repetier G-code เท่านั้น" msgid "A prime tower is not supported in “By object” print." -msgstr "ไม่รองรับไพรม์ทาวเวอร์ในการพิมพ์ \"ตามวัตถุ\"" +msgstr "ไม่รองรับ Prime Tower ในการพิมพ์ \"ตามวัตถุ\"" msgid "A prime tower is not supported when adaptive layer height is on. It requires that all objects have the same layer height." -msgstr "ไม่รองรับไพรม์ทาวเวอร์เมื่อเปิดความสูงของเลเยอร์แบบปรับได้ กำหนดให้วัตถุทั้งหมดมีความสูงของชั้นเท่ากัน" +msgstr "ไม่รองรับ Prime Tower เมื่อเปิดความสูงของเลเยอร์แบบปรับได้ กำหนดให้วัตถุทั้งหมดมีความสูงของชั้นเท่ากัน" msgid "A prime tower requires any “support gap” to be a multiple of layer height." -msgstr "ไพรม์ทาวเวอร์ต้องการให้ “support gap” เป็นจำนวนเท่าของความสูงชั้น" +msgstr "Prime Tower ต้องการให้ “support gap” เป็นจำนวนเท่าของความสูงชั้น" msgid "A prime tower requires that all objects have the same layer height." -msgstr "ไพรม์ทาวเวอร์ต้องการให้วัตถุทั้งหมดมีความสูงชั้นเท่ากัน" +msgstr "Prime Tower ต้องการให้วัตถุทั้งหมดมีความสูงชั้นเท่ากัน" msgid "A prime tower requires that all objects are printed over the same number of raft layers." -msgstr "ไพรม์ทาวเวอร์ต้องการให้วัตถุทั้งหมดพิมพ์บนจำนวนชั้น raft เท่ากัน" +msgstr "Prime Tower ต้องการให้วัตถุทั้งหมดพิมพ์บนจำนวนชั้น raft เท่ากัน" msgid "The prime tower is only supported for multiple objects if they are printed with the same support_top_z_distance." -msgstr "ไพรม์ทาวเวอร์รองรับวัตถุหลายชิ้นเท่านั้นหากพิมพ์ด้วย support_top_z_distance เท่ากัน" +msgstr "Prime Tower รองรับวัตถุหลายชิ้นเท่านั้นหากพิมพ์ด้วย support_top_z_distance เท่ากัน" msgid "A prime tower requires that all objects are sliced with the same layer height." -msgstr "ไพรม์ทาวเวอร์ต้องการให้วัตถุทั้งหมดถูกสไลซ์ด้วยความสูงชั้นเท่ากัน" +msgstr "Prime Tower ต้องการให้วัตถุทั้งหมดถูกสไลซ์ด้วยความสูงชั้นเท่ากัน" msgid "The prime tower is only supported if all objects have the same variable layer height." -msgstr "ไพรม์ทาวเวอร์ได้รับส่วนรองรับก็ต่อเมื่อวัตถุทั้งหมดมีความสูงของเลเยอร์ที่แปรผันเท่ากัน" +msgstr "Prime Tower ได้รับส่วนรองรับก็ต่อเมื่อวัตถุทั้งหมดมีความสูงของเลเยอร์ที่แปรผันเท่ากัน" msgid "One or more object were assigned an extruder that the printer does not have." msgstr "วัตถุอย่างน้อยหนึ่งชิ้นถูกกำหนดให้เป็นชุดดันเส้นที่เครื่องพิมพ์ไม่มี" @@ -12208,7 +12208,7 @@ msgid "Printing with multiple extruders of differing nozzle diameters. If suppor msgstr "การพิมพ์ด้วยชุดดันเส้นหลายเครื่องที่มีเส้นผ่านศูนย์กลางหัวฉีดต่างกัน หากจะพิมพ์ส่วนรองรับด้วยฟิลาเมนต์ปัจจุบัน (support_filament == 0 หรือ support_interface_filament == 0) หัวฉีดทั้งหมดจะต้องมีเส้นผ่านศูนย์กลางเท่ากัน" msgid "A prime tower requires that support has the same layer height as the object." -msgstr "ไพรม์ทาวเวอร์ต้องการให้ส่วนรองรับมีความสูงชั้นเท่ากับวัตถุ" +msgstr "Prime Tower ต้องการให้ส่วนรองรับมีความสูงชั้นเท่ากับวัตถุ" msgid "For Organic supports, two walls are supported only with the Hollow/Default base pattern." msgstr "สำหรับการรองรับแบบออร์แกนิก ผนังทั้งสองได้รับการรองรับด้วยรูปแบบฐานกลวง/ค่าเริ่มต้นเท่านั้น" @@ -12845,9 +12845,9 @@ msgid "" "\n" "For the first layer, the actual flow ratio for each path role (does not affect brims and skirts) will be multiplied by this value." msgstr "" -"ปัจจัยนี้ส่งผลต่อปริมาณวัสดุในชั้นแรกสำหรับบทบาทเส้นทางการอัดขึ้นรูปที่แสดงอยู่ในส่วนนี้\n" +"ปัจจัยนี้ส่งผลต่อปริมาณวัสดุในชั้นแรกสำหรับประเภทการพิมพ์ที่แสดงอยู่ในส่วนนี้\n" "\n" -"สำหรับชั้นแรก อัตราการไหลตามจริงสำหรับแต่ละบทบาทของเส้นทาง (ไม่ส่งผลต่อขอบยึดชิ้นงานและเส้นล้อมชิ้นงาน) จะถูกคูณด้วยค่านี้" +"สำหรับชั้นแรก อัตราการไหลตามจริงสำหรับแต่ละประเภทการพิมพ์ (ไม่ส่งผลต่อขอบยึดชิ้นงานและเส้นล้อมชิ้นงาน) จะถูกคูณด้วยค่านี้" msgid "Outer wall flow ratio" msgstr "อัตราส่วนการไหลของผนังด้านนอก" @@ -13138,7 +13138,7 @@ msgstr "" "หมายเหตุ: ค่าผลลัพธ์จะไม่ได้รับผลกระทบจากอัตราส่วนการไหลของชั้นแรก" msgid "Brim follows compensated outline" -msgstr "ขอบยึดชิ้นงาน ปฏิบัติตามโครงร่างที่ได้รับการชดเชย" +msgstr "Brim ตามแนวที่ชดเชยแล้ว" msgid "" "When enabled, the brim is aligned with the first-layer perimeter geometry after Elephant Foot Compensation is applied.\n" @@ -13161,10 +13161,10 @@ msgid "Brim ears" msgstr "หู ขอบยึดชิ้นงาน" msgid "Only draw brim over the sharp edges of the model." -msgstr "วาดขอบยึดชิ้นงานไว้เหนือขอบคมของนางแบบเท่านั้น" +msgstr "วาดขอบยึดชิ้นงานไว้เหนือขอบคมของชิ้นงานเท่านั้น" msgid "Brim ear max angle" -msgstr "มุมสูงสุดของหูขอบยึดชิ้นงานนก" +msgstr "มุมสูงสุดของหูขอบยึดชิ้นงาน (Brim Ears)" msgid "" "Maximum angle to let a brim ear appear.\n" @@ -13753,7 +13753,7 @@ msgstr "" "อัตราการไหลของวัตถุขั้นสุดท้ายคือค่านี้คูณด้วยอัตราการไหลของเส้นพลาสติก" msgid "Enable pressure advance" -msgstr "เปิดใช้งานPressure Advance" +msgstr "เปิดใช้ Pressure Advance" msgid "Enable pressure advance, auto calibration result will be overwritten once enabled." msgstr "เปิดใช้งานการเลื่อนแรงดัน ผลลัพธ์การสอบเทียบอัตโนมัติจะถูกเขียนทับเมื่อเปิดใช้งาน" @@ -13762,7 +13762,7 @@ msgid "Pressure advance (Klipper) AKA Linear advance factor (Marlin)." msgstr "แรงดันล่วงหน้า (Pressure Advance) (Klipper) AKA Linear Advance Factor (Marlin)" msgid "Enable adaptive pressure advance (beta)" -msgstr "เปิดใช้งานการปรับPressure Advance (เบต้า)" +msgstr "เปิดใช้ Adaptive Pressure Advance (เบต้า)" #, no-c-format, no-boost-format msgid "" @@ -13780,7 +13780,7 @@ msgstr "" "เมื่อเปิดใช้งาน ค่าล่วงหน้าของแรงดันด้านบนจะถูกแทนที่ อย่างไรก็ตาม แนะนำให้ใช้ค่าเริ่มต้นที่สมเหตุสมผลด้านบนเพื่อเป็นทางเลือกและเมื่อมีการเปลี่ยนเครื่องมือ\n" msgid "Adaptive pressure advance measurements (beta)" -msgstr "การวัดล่วงหน้าด้วยแรงดันแบบปรับได้ (เบต้า)" +msgstr "ข้อมูลวัด Adaptive Pressure Advance (เบต้า)" #, no-c-format, no-boost-format msgid "" @@ -14021,7 +14021,7 @@ msgid "Loading speed" msgstr "ความเร็วกำลังโหลด" msgid "Speed used for loading the filament on the wipe tower." -msgstr "ความเร็วที่ใช้ในการโหลดเส้นพลาสติกบนไวด์ทาวเวอร์" +msgstr "ความเร็วที่ใช้ในการโหลดเส้นพลาสติกบน Wipe Tower" msgid "Loading speed at the start" msgstr "ความเร็วในการโหลดเมื่อเริ่มต้น" @@ -14033,7 +14033,7 @@ msgid "Unloading speed" msgstr "ความเร็วในการขนถ่าย" msgid "Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just after ramming)." -msgstr "ความเร็วที่ใช้ในการขนถ่ายเส้นพลาสติกบนไวด์ทาวเวอร์ (ไม่ส่งผลต่อส่วนเริ่มแรกของการขนถ่ายหลังจากการชน)" +msgstr "ความเร็วที่ใช้ในการขนถ่ายเส้นพลาสติกบน Wipe Tower (ไม่ส่งผลต่อส่วนเริ่มแรกของการขนถ่ายหลังจากการชน)" msgid "Unloading speed at the start" msgstr "ขนถ่ายความเร็วที่จุดเริ่มต้น" @@ -14075,10 +14075,10 @@ msgid "Minimal purge on wipe tower" msgstr "การล้างข้อมูลบน Wipe Tower น้อยที่สุด" msgid "After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and the filament pressure is likely not yet stable. Before purging the print head into an infill or a sacrificial object, Orca Slicer will always prime this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably." -msgstr "หลังจากเปลี่ยนเครื่องมือ อาจไม่ทราบตำแหน่งที่แน่นอนของเส้นพลาสติกที่เพิ่งโหลดใหม่ภายในหัวฉีด และความดันเส้นพลาสติกก็มีแนวโน้มว่ายังไม่เสถียร ก่อนที่จะล้างหัวพิมพ์ลงในวัสดุไส้ในหรือวัตถุบูชายัญ Orca Slicer จะเตรียมวัสดุจำนวนนี้ลงในหอเช็ดเสมอเพื่อสร้างการอัดขึ้นรูปวัตถุแบบไส้ในหรือบูชายัญต่อเนื่องกันอย่างน่าเชื่อถือ" +msgstr "หลังจากเปลี่ยนเครื่องมือ อาจไม่ทราบตำแหน่งที่แน่นอนของเส้นพลาสติกที่เพิ่งโหลดใหม่ภายในหัวฉีด และความดันเส้นพลาสติกก็มีแนวโน้มว่ายังไม่เสถียร ก่อนที่จะล้างหัวพิมพ์ลงในวัสดุไส้ในหรือวัตถุบูชายัญ Orca Slicer จะเตรียมวัสดุจำนวนนี้ลงใน Wipe Tower เสมอเพื่อสร้างการอัดขึ้นรูปวัตถุแบบไส้ในหรือบูชายัญต่อเนื่องกันอย่างน่าเชื่อถือ" msgid "Wipe tower cooling" -msgstr "เช็ดทาวเวอร์คูลลิ่ง" +msgstr "Wipe Tower คูลลิ่ง" msgid "Temperature drop before entering filament tower" msgstr "อุณหภูมิลดลงก่อนเข้าหอใย" @@ -14087,19 +14087,19 @@ msgid "Interface layer pre-extrusion distance" msgstr "ระยะการอัดรีดชั้นอินเตอร์เฟซ" msgid "Pre-extrusion distance for prime tower interface layer (where different materials meet)." -msgstr "ระยะก่อนการอัดขึ้นรูปสำหรับชั้นอินเทอร์เฟซของไพรม์ทาวเวอร์ (ที่วัสดุที่แตกต่างกันมาบรรจบกัน)" +msgstr "ระยะก่อนการอัดขึ้นรูปสำหรับชั้นอินเทอร์เฟซของ Prime Tower (ที่วัสดุที่แตกต่างกันมาบรรจบกัน)" msgid "Interface layer pre-extrusion length" msgstr "ความยาวชั้นอินเตอร์เฟซก่อนการอัดขึ้นรูป" msgid "Pre-extrusion length for prime tower interface layer (where different materials meet)." -msgstr "ความยาวก่อนการอัดขึ้นรูปสำหรับชั้นอินเทอร์เฟซของไพรม์ทาวเวอร์ (ที่วัสดุที่แตกต่างกันมาบรรจบกัน)" +msgstr "ความยาวก่อนการอัดขึ้นรูปสำหรับชั้นอินเทอร์เฟซของ Prime Tower (ที่วัสดุที่แตกต่างกันมาบรรจบกัน)" msgid "Tower ironing area" msgstr "พื้นที่รีดผิวแบบทาวเวอร์" msgid "Ironing area for prime tower interface layer (where different materials meet)." -msgstr "พื้นที่รีดผิวสำหรับชั้นอินเทอร์เฟซของไพร์มทาวเวอร์ (บริเวณที่วัสดุต่างกันมาบรรจบกัน)" +msgstr "พื้นที่รีดผิวสำหรับชั้นอินเทอร์เฟซของ Prime Tower (บริเวณที่วัสดุต่างกันมาบรรจบกัน)" msgid "mm²" msgstr "มม.²" @@ -14108,13 +14108,13 @@ msgid "Interface layer purge length" msgstr "ความยาวการล้างเลเยอร์อินเทอร์เฟซ" msgid "Purge length for prime tower interface layer (where different materials meet)." -msgstr "ความยาวในการไล่ล้างสำหรับชั้นอินเทอร์เฟซของไพรม์ทาวเวอร์ (เมื่อวัสดุต่างกันมาบรรจบกัน)" +msgstr "ความยาวในการไล่ล้างสำหรับชั้นอินเทอร์เฟซของ Prime Tower (เมื่อวัสดุต่างกันมาบรรจบกัน)" msgid "Interface layer print temperature" msgstr "อุณหภูมิการพิมพ์เลเยอร์อินเทอร์เฟซ" msgid "Print temperature for prime tower interface layer (where different materials meet). If set to -1, use max recommended nozzle temperature." -msgstr "อุณหภูมิการพิมพ์สำหรับชั้นอินเทอร์เฟซของไพรม์ทาวเวอร์ (เมื่อวัสดุต่างกันมาบรรจบกัน) หากตั้งค่าเป็น -1 ให้ใช้อุณหภูมิหัวฉีดสูงสุดที่แนะนำ" +msgstr "อุณหภูมิการพิมพ์สำหรับชั้นอินเทอร์เฟซของ Prime Tower (เมื่อวัสดุต่างกันมาบรรจบกัน) หากตั้งค่าเป็น -1 ให้ใช้อุณหภูมิหัวฉีดสูงสุดที่แนะนำ" msgid "Speed of the last cooling move" msgstr "ความเร็วของการทำความเย็นครั้งล่าสุด" @@ -14132,7 +14132,7 @@ msgid "Enable ramming for multi-tool setups" msgstr "เปิดใช้งานการกระแทกสำหรับการตั้งค่าหลายเครื่องมือ" msgid "Perform ramming when using multi-tool printer (i.e. when the 'Single Extruder Multimaterial' in Printer Settings is unchecked). When checked, a small amount of filament is rapidly extruded on the wipe tower just before the tool change. This option is only used when the wipe tower is enabled." -msgstr "ทำการกระแทกเมื่อใช้เครื่องพิมพ์แบบหลายเครื่องมือ (เช่น เมื่อไม่ได้เลือก 'Single ชุดดันเส้น Multimaterial' ในการตั้งค่าเครื่องพิมพ์) เมื่อตรวจสอบแล้ว เส้นพลาสติกจำนวนเล็กน้อยจะถูกอัดรีดอย่างรวดเร็วบนไวด์ทาวเวอร์ก่อนที่จะเปลี่ยนเครื่องมือ ตัวเลือกนี้ใช้เฉพาะเมื่อเปิดใช้งาน Wipe Tower เท่านั้น" +msgstr "ทำการกระแทกเมื่อใช้เครื่องพิมพ์แบบหลายเครื่องมือ (เช่น เมื่อไม่ได้เลือก 'Single ชุดดันเส้น Multimaterial' ในการตั้งค่าเครื่องพิมพ์) เมื่อตรวจสอบแล้ว เส้นพลาสติกจำนวนเล็กน้อยจะถูกอัดรีดอย่างรวดเร็วบน Wipe Tower ก่อนที่จะเปลี่ยนเครื่องมือ ตัวเลือกนี้ใช้เฉพาะเมื่อเปิดใช้งาน Wipe Tower เท่านั้น" msgid "Multi-tool ramming volume" msgstr "ปริมาณการกระแทกหลายเครื่องมือ" @@ -14517,13 +14517,13 @@ msgid "Filament-specific override for ironing flow. This allows you to customize msgstr "การแทนที่เส้นพลาสติกเฉพาะสำหรับกระแสการรีดผิว ซึ่งช่วยให้คุณปรับแต่งกระแสการรีดผิวสำหรับเส้นพลาสติกแต่ละประเภทได้ ค่าที่สูงเกินไปส่งผลให้เกิดการอัดขึ้นรูปมากเกินไปบนพื้นผิว" msgid "Ironing line spacing" -msgstr "ระยะห่างระหว่างสายรีดผิว" +msgstr "ระยะห่างระหว่างเส้นรีดผิว" msgid "Filament-specific override for ironing line spacing. This allows you to customize the spacing between ironing lines for each filament type." msgstr "การแทนที่เส้นพลาสติกเฉพาะสำหรับระยะห่างระหว่างรีดผิว ซึ่งช่วยให้คุณปรับแต่งระยะห่างระหว่างเส้นรีดผิวสำหรับเส้นพลาสติกแต่ละประเภทได้" msgid "Ironing inset" -msgstr "อุปกรณ์รีดผิว" +msgstr "ระยะเว้นขอบการรีดผิว" msgid "Filament-specific override for ironing inset. This allows you to customize the distance to keep from the edges when ironing for each filament type." msgstr "การแทนที่เส้นพลาสติกเฉพาะสำหรับส่วนเสริมการรีดผิว ซึ่งช่วยให้คุณปรับแต่งระยะห่างจากขอบเมื่อรีดผิวสำหรับเส้นพลาสติกแต่ละประเภทได้" @@ -14565,10 +14565,10 @@ msgid "The average distance between the random points introduced on each line se msgstr "ระยะห่างเฉลี่ยระหว่างจุดสุ่มที่แนะนำในแต่ละส่วนของเส้น" msgid "Apply fuzzy skin to first layer" -msgstr "ทาผิวที่คลุมเครือเป็นชั้นแรก" +msgstr "ใช้ Fuzzy Skin กับชั้นแรก" msgid "Whether to apply fuzzy skin on the first layer." -msgstr "ไม่ว่าจะทาผิวฟุ้งๆในชั้นแรกหรือไม่" +msgstr "กำหนดว่าจะใช้ Fuzzy Skin กับชั้นแรกหรือไม่" msgid "Fuzzy skin generator mode" msgstr "โหมดสร้างผิวฟัซซี" @@ -14599,7 +14599,7 @@ msgid "Combined" msgstr "รวม" msgid "Fuzzy skin noise type" -msgstr "ประเภทเสียงผิวเลือน" +msgstr "ประเภท Noise ของ Fuzzy Skin" msgid "" "Noise type to use for fuzzy skin generation:\n" @@ -14610,12 +14610,12 @@ msgid "" "Voronoi: Divides the surface into voronoi cells, and displaces each one by a random amount. Creates a patchwork texture.\n" "Ripple: Uniform ripple pattern that ripples left and right of the original path. Repeating pattern, woven appearance." msgstr "" -"ประเภทเสียงรบกวนที่ใช้สำหรับการสร้างผิวที่คลุมเครือ:\n" +"ประเภท Noise ที่ใช้สำหรับการสร้างผิวฟัซซี:\n" "คลาสสิก: เสียงสุ่มเครื่องแบบคลาสสิก\n" "Perlin: เสียง Perlin ซึ่งให้เนื้อสัมผัสที่สม่ำเสมอยิ่งขึ้น\n" "Billow: คล้ายกับเสียงเพอร์ลิน แต่เป็นกลุ่มมากกว่า\n" "Ridged Multifractal: สัญญาณรบกวนที่คมชัดพร้อมคุณสมบัติหยัก สร้างพื้นผิวเหมือนหินอ่อน\n" -"โวโรนอย: แบ่งพื้นผิวออกเป็นเซลล์โวโรนอย และแทนที่แต่ละเซลล์ด้วยจำนวนสุ่ม สร้างพื้นผิวแบบเย็บปะติดปะต่อกัน\n" +"Voronoi: แบ่งพื้นผิวออกเป็นเซลล์ Voronoi และแทนที่แต่ละเซลล์ด้วยจำนวนสุ่ม สร้างพื้นผิวแบบเย็บปะติดปะต่อกัน\n" "ระลอกคลื่น: รูปแบบระลอกคลื่นสม่ำเสมอที่กระเพื่อมไปทางซ้ายและขวาของเส้นทางเดิม ลายซ้ำ ลักษณะการทอ." msgid "Classic" @@ -14631,7 +14631,7 @@ msgid "Ridged Multifractal" msgstr "Multifractal แบบสัน" msgid "Voronoi" -msgstr "โวโรน้อย" +msgstr "Voronoi" msgid "Ripple" msgstr "ระลอกคลื่น" @@ -14643,13 +14643,13 @@ msgid "The base size of the coherent noise features, in mm. Higher values will r msgstr "ขนาดฐานของคุณสมบัติเสียงที่สอดคล้องกัน หน่วยเป็น มม. ค่าที่สูงกว่าจะส่งผลให้มีคุณลักษณะที่ใหญ่ขึ้น" msgid "Fuzzy Skin Noise Octaves" -msgstr "อ็อกเทฟเสียงผิวฟัซซี" +msgstr "จำนวน Octave ของ Noise ใน Fuzzy Skin" msgid "The number of octaves of coherent noise to use. Higher values increase the detail of the noise, but also increase computation time." msgstr "จำนวนอ็อกเทฟของสัญญาณรบกวนที่สอดคล้องกันที่จะใช้ ค่าที่สูงกว่าจะเพิ่มรายละเอียดของสัญญาณรบกวน แต่ยังเพิ่มเวลาในการคำนวณด้วย" msgid "Fuzzy skin noise persistence" -msgstr "ความคงอยู่ของเสียงผิวเลือน" +msgstr "ค่า Persistence ของ Noise ใน Fuzzy Skin" msgid "The decay rate for higher octaves of the coherent noise. Lower values will result in smoother noise." msgstr "อัตราการสลายตัวของอ็อกเทฟที่สูงขึ้นของสัญญาณรบกวนที่สอดคล้องกัน ค่าที่ต่ำกว่าจะส่งผลให้มีสัญญาณรบกวนที่นุ่มนวลขึ้น" @@ -15737,7 +15737,7 @@ msgid "The start and end points which are from the cutter area to the excess chu msgstr "จุดเริ่มต้นและจุดสิ้นสุดตั้งแต่บริเวณเครื่องตัดถึงถังขยะ" msgid "Reduce infill retraction" -msgstr "ลดการหดตัวของ ไส้ใน" +msgstr "ลดการดึงกลับในไส้ใน" msgid "Don't retract when the travel is entirely within an infill area. That means the oozing can't been seen. This can reduce times of retraction for complex model and save printing time, but make slicing and G-code generating slower. Note that z-hop is also not performed in areas where retraction is skipped." msgstr "อย่าถอยกลับเมื่อการเดินทางอยู่ภายในพื้นที่ที่ไส้ในเข้าไปทั้งหมด นั่นหมายความว่าไม่สามารถมองเห็นการรั่วไหลได้ วิธีนี้จะช่วยลดเวลาในการดึงกลับสำหรับโมเดลที่ซับซ้อนและประหยัดเวลาในการพิมพ์ แต่จะทำให้การแบ่งส่วนและการสร้าง G-code ช้าลง โปรดทราบว่า z-hop จะไม่ดำเนินการในพื้นที่ที่มีการข้ามการถอนกลับ" @@ -15825,10 +15825,10 @@ msgid "If you want to process the output G-code through custom scripts, just lis msgstr "หากคุณต้องการประมวลผลเอาต์พุต G-code ผ่านสคริปต์ที่กำหนดเอง เพียงระบุเส้นทางสัมบูรณ์ของสคริปต์ไว้ที่นี่ แยกสคริปต์หลายรายการด้วยเครื่องหมายอัฒภาค สคริปต์จะถูกส่งผ่านเส้นทางสัมบูรณ์ไปยังไฟล์ G-code เป็นอาร์กิวเมนต์แรก และสคริปต์เหล่านี้สามารถเข้าถึงการตั้งค่าการกำหนดค่า Orca Slicer ได้โดยการอ่านตัวแปรสภาพแวดล้อม" msgid "Change extrusion role G-code (process)" -msgstr "เปลี่ยนบทบาทการอัดขึ้นรูป G-code (กระบวนการ)" +msgstr "เปลี่ยนประเภทการพิมพ์ G-code (กระบวนการ)" msgid "This G-code is inserted when the extrusion role is changed. It runs after the machine and filament extrusion role G-code." -msgstr "G-code นี้จะถูกแทรกเมื่อบทบาทการอัดขึ้นรูปมีการเปลี่ยนแปลง มันทำงานหลังจากบทบาทการอัดขึ้นรูปของเครื่องจักรและการอัดขึ้นรูปเส้นพลาสติก G-code" +msgstr "G-code นี้จะถูกแทรกเมื่อประเภทการพิมพ์มีการเปลี่ยนแปลง มันทำงานหลังจากประเภทการพิมพ์ของเครื่องจักรและเส้นพลาสติก G-code" # AI Translated msgid "Plugins Used" @@ -15897,7 +15897,7 @@ msgid "Only trigger retraction when the travel distance is longer than this thre msgstr "ทริกเกอร์การถอนกลับเมื่อระยะการเดินทางยาวกว่าเกณฑ์นี้เท่านั้น" msgid "Retract amount before wipe" -msgstr "ถอนจำนวนก่อนเช็ด" +msgstr "สัดส่วนการดึงกลับก่อน Wipe" msgid "This is the length of fast retraction before a wipe, relative to retraction length." msgstr "ความยาวของการดึงกลับอย่างรวดเร็วก่อนเช็ด สัมพันธ์กับความยาวการดึงกลับ" @@ -15916,7 +15916,7 @@ msgstr "" "ค่าจะถูกจำกัดด้วย 100% ลบด้วยปริมาณการดึงกลับก่อนค่าเช็ดหัว" msgid "Retract on layer change" -msgstr "ถอนออกเมื่อเปลี่ยนเลเยอร์" +msgstr "ดึงเส้นกลับเมื่อเปลี่ยนเลเยอร์" msgid "This forces a retraction on layer changes." msgstr "บังคับให้ถอนกลับเมื่อเปลี่ยนเลเยอร์" @@ -15925,7 +15925,7 @@ msgid "Retraction Length" msgstr "ระยะดึงกลับ" msgid "Some amount of material in extruder is pulled back to avoid ooze during long travel. Set zero to disable retraction." -msgstr "วัสดุบางส่วนในชุดดันเส้นถูกดึงกลับเพื่อหลีกเลี่ยงไม่ให้ซึ่มในระหว่างการเดินทางระยะไกล ตั้งค่าเป็นศูนย์เพื่อปิดใช้งานการเพิกถอน" +msgstr "วัสดุบางส่วนในชุดดันเส้นถูกดึงกลับเพื่อหลีกเลี่ยงไม่ให้ซึ่มในระหว่างการเดินทางระยะไกล ตั้งเป็น 0 เพื่อปิดการดึงกลับ" msgid "Long retraction when cut (beta)" msgstr "การถอยกลับยาวเมื่อตัด (เบต้า)" @@ -16049,7 +16049,7 @@ msgid "Speed for retracting filament from the nozzle." msgstr "ความเร็วในการดึงเส้นพลาสติกออกจากหัวฉีด" msgid "Deretraction speed" -msgstr "ความเร็วในการถอนกลับ" +msgstr "ความเร็วคืนเส้นหลังดึงกลับ" msgid "Speed for reloading filament into the nozzle. Zero means same speed of retraction." msgstr "ความเร็วในการบรรจุเส้นพลาสติกลงในหัวฉีด ศูนย์หมายถึงความเร็วการถอยกลับเท่ากัน" @@ -16063,7 +16063,7 @@ msgid "Speed for reloading filament into the nozzle when switching extruder." msgstr "ความเร็วในการโหลดเส้นพลาสติกกลับเข้าหัวฉีดเมื่อเปลี่ยนชุดดันเส้น" msgid "Use firmware retraction" -msgstr "ใช้การเพิกถอนเฟิร์มแวร์" +msgstr "ใช้การดึงกลับด้วยเฟิร์มแวร์" msgid "This experimental setting uses G10 and G11 commands to have the firmware handle the retraction. This is only supported in recent Marlin." msgstr "การตั้งค่าทดลองนี้ใช้คำสั่ง G10 และ G11 เพื่อให้เฟิร์มแวร์จัดการกับการเพิกถอน สิ่งนี้รองรับใน Marlin ล่าสุดเท่านั้น" @@ -16115,16 +16115,16 @@ msgstr "" "ปริมาณนี้สามารถระบุได้ในหน่วยมิลลิเมตรหรือเป็นเปอร์เซ็นต์ของเส้นผ่านศูนย์กลางของชุดดันเส้นในปัจจุบัน ค่าเริ่มต้นสำหรับพารามิเตอร์นี้คือ 10%" msgid "Scarf joint seam (beta)" -msgstr "รอยต่อเฉียง (เบต้า)" +msgstr "รอยต่อ Scarf (เบต้า)" msgid "Use scarf joint to minimize seam visibility and increase seam strength." -msgstr "ใช้ข้อต่อเฉียงเพื่อลดการมองเห็นรอยตะเข็บและเพิ่มความแข็งแรงของรอยตะเข็บ" +msgstr "ใช้รอยต่อ Scarf เพื่อลดการมองเห็นรอยตะเข็บและเพิ่มความแข็งแรง" msgid "Conditional scarf joint" -msgstr "ข้อต่อเฉียงแบบมีเงื่อนไข" +msgstr "รอยต่อ Scarf แบบมีเงื่อนไข" msgid "Apply scarf joints only to smooth perimeters where traditional seams do not conceal the seams at sharp corners effectively." -msgstr "ใช้ข้อต่อเฉียงกับขอบเรียบเท่านั้น โดยที่รอยตะเข็บแบบเดิมไม่สามารถปกปิดรอยตะเข็บที่มุมแหลมคมได้อย่างมีประสิทธิภาพ" +msgstr "ใช้รอยต่อ Scarf กับขอบเรียบเท่านั้น โดยที่รอยตะเข็บแบบเดิมไม่สามารถปกปิดรอยตะเข็บที่มุมแหลมคมได้อย่างมีประสิทธิภาพ" msgid "Conditional angle threshold" msgstr "เกณฑ์มุมแบบมีเงื่อนไข" @@ -16133,67 +16133,67 @@ msgid "" "This option sets the threshold angle for applying a conditional scarf joint seam.\n" "If the maximum angle within the perimeter loop exceeds this value (indicating the absence of sharp corners), a scarf joint seam will be used. The default value is 155°." msgstr "" -"ตัวเลือกนี้จะกำหนดมุมเกณฑ์สำหรับการใช้รอยตะเข็บข้อต่อเฉียงแบบมีเงื่อนไข\n" -"หากมุมสูงสุดภายในวงรอบปริมณฑลเกินค่านี้ (แสดงว่าไม่มีมุมแหลมคม) จะใช้รอยตะเข็บข้อต่อเฉียง ค่าเริ่มต้นคือ 155°" +"ตัวเลือกนี้จะกำหนดมุมเกณฑ์สำหรับการใช้รอยต่อ Scarf แบบมีเงื่อนไข\n" +"หากมุมสูงสุดภายในวงรอบปริมณฑลเกินค่านี้ (แสดงว่าไม่มีมุมแหลมคม) จะใช้รอยต่อ Scarf ค่าเริ่มต้นคือ 155°" msgid "Conditional overhang threshold" msgstr "เกณฑ์ระยะยื่นแบบมีเงื่อนไข" #, no-c-format, no-boost-format msgid "This option determines the overhang threshold for the application of scarf joint seams. If the unsupported portion of the perimeter is less than this threshold, scarf joint seams will be applied. The default threshold is set at 40% of the external wall's width. Due to performance considerations, the degree of overhang is estimated." -msgstr "ตัวเลือกนี้จะกำหนดเกณฑ์ส่วนยื่นสำหรับการใช้รอยตะเข็บข้อต่อเฉียง หากส่วนที่ไม่ได้รับส่วนรองรับของเส้นรอบวงน้อยกว่าเกณฑ์นี้ จะมีการเย็บรอยตะเข็บเฉียง เกณฑ์เริ่มต้นตั้งไว้ที่ 40% ของความกว้างของผนังภายนอก เมื่อพิจารณาถึงประสิทธิภาพแล้ว ระดับของระยะยื่นจึงถูกประมาณไว้" +msgstr "ตัวเลือกนี้จะกำหนดเกณฑ์ส่วนยื่นสำหรับการใช้รอยต่อ Scarf หากส่วนที่ไม่ได้รับส่วนรองรับของเส้นรอบวงน้อยกว่าเกณฑ์นี้ จะใช้รอยต่อ Scarf เกณฑ์เริ่มต้นตั้งไว้ที่ 40% ของความกว้างของผนังภายนอก เมื่อพิจารณาถึงประสิทธิภาพแล้ว ระดับของระยะยื่นจึงถูกประมาณไว้" msgid "Scarf joint speed" -msgstr "ความเร็วของข้อต่อเฉียง" +msgstr "ความเร็วรอยต่อ Scarf" msgid "This option sets the printing speed for scarf joints. It is recommended to print scarf joints at a slow speed (less than 100 mm/s). It's also advisable to enable 'Extrusion rate smoothing' if the set speed varies significantly from the speed of the outer or inner walls. If the speed specified here is higher than the speed of the outer or inner walls, the printer will default to the slower of the two speeds. When specified as a percentage (e.g., 80%), the speed is calculated based on the respective outer or inner wall speed. The default value is set to 100%." -msgstr "ตัวเลือกนี้จะตั้งค่าความเร็วในการพิมพ์สำหรับข้อต่อเฉียง ขอแนะนำให้พิมพ์ข้อต่อเฉียงด้วยความเร็วต่ำ (น้อยกว่า 100 มม./วินาที) ขอแนะนำให้เปิดใช้งาน 'การปรับอัตราการอัดรีดให้เรียบ' หากความเร็วที่ตั้งไว้แตกต่างอย่างมากจากความเร็วของผนังด้านนอกหรือด้านใน หากความเร็วที่ระบุที่นี่สูงกว่าความเร็วของผนังด้านนอกหรือด้านใน เครื่องพิมพ์จะตั้งค่าเริ่มต้นไว้ที่ความเร็วที่ช้ากว่าทั้งสอง เมื่อระบุเป็นเปอร์เซ็นต์ (เช่น 80%) ความเร็วจะคำนวณตามความเร็วผนังด้านนอกหรือด้านในตามลำดับ ค่าเริ่มต้นตั้งไว้ที่ 100%" +msgstr "ตัวเลือกนี้จะตั้งค่าความเร็วในการพิมพ์สำหรับรอยต่อ Scarf ขอแนะนำให้พิมพ์รอยต่อ Scarfด้วยความเร็วต่ำ (น้อยกว่า 100 มม./วินาที) ขอแนะนำให้เปิดใช้งาน 'การปรับอัตราการอัดรีดให้เรียบ' หากความเร็วที่ตั้งไว้แตกต่างอย่างมากจากความเร็วของผนังด้านนอกหรือด้านใน หากความเร็วที่ระบุที่นี่สูงกว่าความเร็วของผนังด้านนอกหรือด้านใน เครื่องพิมพ์จะตั้งค่าเริ่มต้นไว้ที่ความเร็วที่ช้ากว่าทั้งสอง เมื่อระบุเป็นเปอร์เซ็นต์ (เช่น 80%) ความเร็วจะคำนวณตามความเร็วผนังด้านนอกหรือด้านในตามลำดับ ค่าเริ่มต้นตั้งไว้ที่ 100%" msgid "Scarf joint flow ratio" -msgstr "อัตราการไหลของข้อต่อเฉียง" +msgstr "อัตราส่วนการไหลของรอยต่อ Scarf" msgid "This factor affects the amount of material for scarf joints." -msgstr "ปัจจัยนี้ส่งผลต่อปริมาณวัสดุสำหรับข้อต่อเฉียง" +msgstr "ปัจจัยนี้ส่งผลต่อปริมาณวัสดุสำหรับรอยต่อ Scarf" msgid "Scarf start height" -msgstr "ความสูงเริ่มต้นของเฉียง" +msgstr "ความสูงเริ่มต้นของรอยต่อ Scarf" msgid "" "Start height of the scarf.\n" "This amount can be specified in millimeters or as a percentage of the current layer height. The default value for this parameter is 0." msgstr "" -"เริ่มต้นความสูงของเฉียง\n" +"ความสูงเริ่มต้นของรอยต่อ Scarf\n" "จำนวนนี้สามารถระบุได้ในหน่วยมิลลิเมตรหรือเป็นเปอร์เซ็นต์ของความสูงของเลเยอร์ปัจจุบัน ค่าเริ่มต้นสำหรับพารามิเตอร์นี้คือ 0" msgid "Scarf around entire wall" -msgstr "เฉียงพันรอบผนังทั้งหมด" +msgstr "ใช้รอยต่อ Scarf ตลอดทั้งผนัง" msgid "The scarf extends to the entire length of the wall." -msgstr "เฉียงยาวตลอดความยาวของผนัง" +msgstr "รอยต่อ Scarf ครอบคลุมตลอดความยาวผนัง" msgid "Scarf length" -msgstr "ความยาวเฉียง" +msgstr "ความยาวรอยต่อ Scarf" msgid "Length of the scarf. Setting this parameter to zero effectively disables the scarf." -msgstr "ความยาวของเฉียง. การตั้งค่าพารามิเตอร์นี้เป็นศูนย์จะปิดใช้เฉียงอย่างมีประสิทธิภาพ" +msgstr "ความยาวของรอยต่อ Scarf ตั้งเป็น 0 เพื่อปิดการใช้ Scarf" msgid "Scarf steps" -msgstr "ขั้นตอนเฉียง" +msgstr "จำนวนขั้นของรอยต่อ Scarf" msgid "Minimum number of segments of each scarf." -msgstr "จำนวนขั้นต่ำของส่วนเฉียงแต่ละอัน" +msgstr "จำนวนเซกเมนต์ขั้นต่ำของรอยต่อ Scarf" msgid "Scarf joint for inner walls" -msgstr "ข้อต่อเฉียงสำหรับผนังด้านใน" +msgstr "รอยต่อ Scarf สำหรับผนังด้านใน" msgid "Use scarf joint for inner walls as well." -msgstr "ใช้ข้อต่อเฉียงสำหรับผนังด้านในด้วย" +msgstr "ใช้รอยต่อ Scarf กับผนังด้านในด้วย" msgid "Role base wipe speed" -msgstr "ความเร็วในการล้างฐานบทบาท" +msgstr "ความเร็ว Wipe ตามประเภทการพิมพ์" msgid "The wipe speed is determined by the speed of the current extrusion role. e.g. if a wipe action is executed immediately following an outer wall extrusion, the speed of the outer wall extrusion will be utilized for the wipe action." -msgstr "ความเร็วในการเช็ดถูกกำหนดโดยความเร็วของบทบาทการอัดขึ้นรูปในปัจจุบัน เช่น หากการดำเนินการเช็ดถูกดำเนินการทันทีหลังจากการอัดขึ้นรูปผนังด้านนอก ความเร็วของการอัดขึ้นรูปผนังด้านนอกจะถูกใช้สำหรับการดำเนินการเช็ด" +msgstr "ความเร็ว Wipe จะอิงจากความเร็วของประเภทการพิมพ์ปัจจุบัน เช่น หากการ Wipe เกิดขึ้นทันทีหลังจากพิมพ์ผนังด้านนอก ความเร็วของผนังด้านนอกจะถูกใช้สำหรับการ Wipe" msgid "Wipe on loops" msgstr "เช็ดบนลูป" @@ -16241,10 +16241,10 @@ msgid "Single loop after first layer" msgstr "วนรอบเดียวหลังจากชั้นแรก" msgid "Limits the skirt/draft shield loops to one wall after the first layer. This is useful, on occasion, to conserve filament but may cause the draft shield/skirt to warp / crack." -msgstr "จำกัดห่วงสเกิร์ต/โล่ครอบไว้ที่ผนังด้านหนึ่งหลังจากชั้นแรก สิ่งนี้มีประโยชน์ในบางครั้งเพื่ออนุรักษ์เส้นพลาสติก แต่อาจทำให้โครง/เส้นล้อมชิ้นงานบิดเบี้ยว/แตกร้าวได้" +msgstr "จำกัดห่วงสเกิร์ต/แนวป้องกันลม (Draft Shield) ไว้ที่ผนังเดียวหลังจากชั้นแรก สิ่งนี้มีประโยชน์ในบางครั้งเพื่อประหยัดเส้นพลาสติก แต่อาจทำให้แนวป้องกันลม/เส้นล้อมชิ้นงานบิดเบี้ยว/แตกร้าวได้" msgid "Draft shield" -msgstr "โล่ร่าง" +msgstr "แนวป้องกันลม (Draft Shield)" msgid "" "A draft shield is useful to protect an ABS or ASA print from warping and detaching from print bed due to wind draft. It is usually needed only with open frame printers, i.e. without an enclosure.\n" @@ -16252,10 +16252,10 @@ msgid "" "Enabled = skirt is as tall as the highest printed object. Otherwise 'Skirt height' is used.\n" "Note: With the draft shield active, the skirt will be printed at skirt distance from the object. Therefore, if brims are active it may intersect with them. To avoid this, increase the skirt distance value.\n" msgstr "" -"แผงครอบมีประโยชน์ในการปกป้องงานพิมพ์ ABS หรือ ASA จากการบิดงอและการหลุดออกจากฐานพิมพ์เนื่องจากกระแสลม โดยทั่วไปจำเป็นต้องใช้กับเครื่องพิมพ์แบบเปิดเฟรมเท่านั้น กล่าวคือ ไม่มีกล่องหุ้ม\n" +"แนวป้องกันลม (Draft Shield) มีประโยชน์ในการปกป้องงานพิมพ์ ABS หรือ ASA จากการบิดงอและการหลุดออกจากฐานพิมพ์เนื่องจากกระแสลม โดยทั่วไปจำเป็นต้องใช้กับเครื่องพิมพ์แบบเปิดเฟรมเท่านั้น กล่าวคือ ไม่มีกล่องหุ้ม\n" "\n" "Enabled = เส้นล้อมชิ้นงานสูงเท่ากับวัตถุที่พิมพ์สูงสุด มิฉะนั้น จะใช้ 'ความสูงของเส้นล้อมชิ้นงาน'\n" -"หมายเหตุ: เมื่อใช้งานดราฟชีลด์ เส้นล้อมชิ้นงานจะถูกพิมพ์ที่ระยะห่างจากเส้นล้อมชิ้นงานจากวัตถุ ดังนั้นหากขอบยึดชิ้นงานยังทำงานอยู่ ขอบยึดชิ้นงานอาจตัดกัน เพื่อหลีกเลี่ยงปัญหานี้ ให้เพิ่มค่าระยะห่างของเส้นล้อมชิ้นงาน\n" +"หมายเหตุ: เมื่อใช้งานแนวป้องกันลม (Draft Shield) เส้นล้อมชิ้นงานจะถูกพิมพ์ที่ระยะห่างจากวัตถุ ดังนั้นหากขอบยึดชิ้นงานยังทำงานอยู่ ขอบยึดชิ้นงานอาจตัดกัน เพื่อหลีกเลี่ยงปัญหานี้ ให้เพิ่มค่าระยะห่างของเส้นล้อมชิ้นงาน\n" msgid "Enabled" msgstr "เปิดใช้" @@ -16362,7 +16362,7 @@ msgid "Sets the finishing flow ratio while ending the spiral. Normally the spira msgstr "ตั้งค่าอัตราส่วนการไหลขั้นสุดท้ายขณะสิ้นสุดเกลียว โดยปกติการเปลี่ยนผ่านของเกลียวจะปรับขนาดอัตราส่วนการไหลจาก 100% เป็น 0% ในระหว่างลูปสุดท้าย ซึ่งในบางกรณีอาจนำไปสู่การรีดขึ้นรูปที่ปลายเกลียว" msgid "If smooth or traditional mode is selected, a timelapse video will be generated for each print. After each layer is printed, a snapshot is taken with the chamber camera. All of these snapshots are composed into a timelapse video when printing completes. If smooth mode is selected, the toolhead will move to the excess chute after each layer is printed and then take a snapshot. Since the melt filament may leak from the nozzle during the process of taking a snapshot, a prime tower is required for smooth mode to wipe the nozzle." -msgstr "หากเลือกโหมดเรียบหรือโหมดดั้งเดิม วิดีโอไทม์แลปส์จะถูกสร้างขึ้นสำหรับการพิมพ์แต่ละครั้ง หลังจากพิมพ์แต่ละชั้นแล้ว กล้องจะถ่ายภาพสแนปช็อตด้วยกล้องแชมเบอร์ สแน็ปช็อตทั้งหมดนี้จะถูกประกอบเป็นวิดีโอไทม์แลปส์เมื่อการพิมพ์เสร็จสิ้น หากเลือกโหมดเรียบ หัวเครื่องมือจะย้ายไปยังรางส่วนเกินหลังจากพิมพ์แต่ละเลเยอร์แล้วจึงถ่ายภาพสแน็ปช็อต เนื่องจากเส้นพลาสติกที่หลอมละลายอาจรั่วไหลออกจากหัวฉีดในระหว่างขั้นตอนการถ่ายภาพ จึงจำเป็นต้องมีไพรม์ทาวเวอร์เพื่อให้โหมดราบรื่นในการเช็ดหัวฉีด" +msgstr "หากเลือกโหมดเรียบหรือโหมดดั้งเดิม วิดีโอไทม์แลปส์จะถูกสร้างขึ้นสำหรับการพิมพ์แต่ละครั้ง หลังจากพิมพ์แต่ละชั้นแล้ว กล้องจะถ่ายภาพสแนปช็อตด้วยกล้องแชมเบอร์ สแน็ปช็อตทั้งหมดนี้จะถูกประกอบเป็นวิดีโอไทม์แลปส์เมื่อการพิมพ์เสร็จสิ้น หากเลือกโหมดเรียบ หัวเครื่องมือจะย้ายไปยังรางส่วนเกินหลังจากพิมพ์แต่ละเลเยอร์แล้วจึงถ่ายภาพสแน็ปช็อต เนื่องจากเส้นพลาสติกที่หลอมละลายอาจรั่วไหลออกจากหัวฉีดในระหว่างขั้นตอนการถ่ายภาพ จึงจำเป็นต้องมี Prime Tower เพื่อให้โหมดราบรื่นในการเช็ดหัวฉีด" msgid "Traditional" msgstr "แบบดั้งเดิม" @@ -16376,7 +16376,7 @@ msgstr "ไทม์แลปส์จุดไกลสุด" # AI Translated msgid "When enabled, the timelapse snapshot is taken at the farthest point from camera instead of traveling to the wipe tower or excess chute. Only effective in traditional timelapse mode on non-I3 printers." -msgstr "เมื่อเปิดใช้งาน ภาพไทม์แลปส์จะถูกถ่ายที่จุดไกลสุดจากกล้องแทนที่จะเดินหัวไปยังทาวเวอร์เช็ดหัวฉีดหรือช่องทิ้งส่วนเกิน มีผลเฉพาะในโหมดไทม์แลปส์แบบดั้งเดิมบนเครื่องพิมพ์ที่ไม่ใช่ I3" +msgstr "เมื่อเปิดใช้งาน ภาพไทม์แลปส์จะถูกถ่ายที่จุดไกลสุดจากกล้องแทนที่จะเดินหัวไปยัง Wipe Tower หรือช่องทิ้งส่วนเกิน มีผลเฉพาะในโหมดไทม์แลปส์แบบดั้งเดิมบนเครื่องพิมพ์ที่ไม่ใช่ I3" msgid "Temperature variation" msgstr "การเปลี่ยนแปลงของอุณหภูมิ" @@ -16425,10 +16425,10 @@ msgid "Enable this option to omit the custom Change filament G-code only at the msgstr "เปิดใช้งานตัวเลือกนี้เพื่อละเว้น G-code เปลี่ยนฟิลาเมนต์แบบกำหนดเองเฉพาะตอนเริ่มต้นการพิมพ์เท่านั้น คำสั่งเปลี่ยนเครื่องมือ (เช่น T0) จะถูกข้ามไปตลอดการพิมพ์ทั้งหมด สิ่งนี้มีประโยชน์สำหรับการพิมพ์หลายวัสดุด้วยตนเอง โดยที่เราใช้ M600/PAUSE เพื่อกระตุ้นการดำเนินการเปลี่ยนเส้นพลาสติกด้วยตนเอง" msgid "Wipe tower type" -msgstr "ชนิดทาวเวอร์เช็ด" +msgstr "ชนิด Wipe Tower" msgid "Choose the wipe tower implementation for multi-material prints. Type 1 is recommended for Bambu and Qidi printers with a filament cutter. Type 2 offers better compatibility with multi-tool and MMU printers and provide overall better compatibility." -msgstr "เลือกการใช้งานไวด์ทาวเวอร์สำหรับการพิมพ์แบบหลายวัสดุ แนะนำให้ใช้ประเภท 1 สำหรับเครื่องพิมพ์ Bambu และ Qidi ที่มีเครื่องตัดเส้นพลาสติก Type 2 ให้ความเข้ากันได้ที่ดีกว่ากับเครื่องพิมพ์หลายเครื่องมือและ MMU และให้ความเข้ากันได้โดยรวมดีขึ้น" +msgstr "เลือกการใช้งาน Wipe Tower สำหรับการพิมพ์แบบหลายวัสดุ แนะนำให้ใช้ประเภท 1 สำหรับเครื่องพิมพ์ Bambu และ Qidi ที่มีเครื่องตัดเส้นพลาสติก Type 2 ให้ความเข้ากันได้ที่ดีกว่ากับเครื่องพิมพ์หลายเครื่องมือและ MMU และให้ความเข้ากันได้โดยรวมดีขึ้น" msgid "Type 1" msgstr "ประเภทที่ 1" @@ -16437,25 +16437,25 @@ msgid "Type 2" msgstr "ประเภทที่ 2" msgid "Purge in prime tower" -msgstr "ระยะเว้นในไพร์มทาวเวอร์" +msgstr "ระยะเว้นใน Prime Tower" msgid "Purge remaining filament into prime tower." -msgstr "ล้างเส้นพลาสติกที่เหลือลงในไพร์มทาวเวอร์" +msgstr "ล้างเส้นพลาสติกที่เหลือลงใน Prime Tower" msgid "Enable filament ramming" msgstr "เปิดใช้งานการอัดกระแทกเส้นเส้นพลาสติก" msgid "Tool change on wipe tower" -msgstr "การเปลี่ยนเครื่องมือบนไวด์ทาวเวอร์" +msgstr "การเปลี่ยนเครื่องมือบน Wipe Tower" msgid "Force the toolhead to travel to the wipe tower before issuing the tool change command (Tx). Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. By default Orca skips the travel on multi-toolhead machines because the firmware handles the head swap, which can result in the Tx command being issued above the printed part. Enable this option if you want the tool change to always be issued above the wipe tower instead." -msgstr "บังคับให้หัวเครื่องมือเคลื่อนที่ไปที่หอเช็ดก่อนที่จะออกคำสั่งเปลี่ยนเครื่องมือ (Tx) เกี่ยวข้องเฉพาะกับเครื่องพิมพ์ที่มีชุดดันเส้นหลายเครื่อง (หลายหัวเครื่องมือ) ที่ใช้แผ่นเช็ดแบบ Type 2 ตามค่าเริ่มต้น Orca จะข้ามการเดินทางบนเครื่องที่มีหัวเครื่องมือหลายหัวเนื่องจากเฟิร์มแวร์จัดการการสลับหัว ซึ่งอาจส่งผลให้มีการออกคำสั่ง Tx เหนือส่วนที่พิมพ์ เปิดใช้งานตัวเลือกนี้หากคุณต้องการให้ทำการเปลี่ยนแปลงเครื่องมือเหนือหอเช็ดแทนเสมอ" +msgstr "บังคับให้หัวเครื่องมือเคลื่อนที่ไปที่ Wipe Tower ก่อนที่จะออกคำสั่งเปลี่ยนเครื่องมือ (Tx) เกี่ยวข้องเฉพาะกับเครื่องพิมพ์ที่มีชุดดันเส้นหลายเครื่อง (หลายหัวเครื่องมือ) ที่ใช้แผ่นเช็ดแบบ Type 2 ตามค่าเริ่มต้น Orca จะข้ามการเดินทางบนเครื่องที่มีหัวเครื่องมือหลายหัวเนื่องจากเฟิร์มแวร์จัดการการสลับหัว ซึ่งอาจส่งผลให้มีการออกคำสั่ง Tx เหนือส่วนที่พิมพ์ เปิดใช้งานตัวเลือกนี้หากคุณต้องการให้ทำการเปลี่ยนแปลงเครื่องมือเหนือ Wipe Tower แทนเสมอ" msgid "No sparse layers (beta)" msgstr "ไม่มีชั้นกระจัดกระจาย (เบต้า)" msgid "If enabled, the wipe tower will not be printed on layers with no tool changes. On layers with a tool change, extruder will travel downward to print the wipe tower. User is responsible for ensuring there is no collision with the print." -msgstr "หากเปิดใช้งาน หอเช็ดจะไม่ถูกพิมพ์บนเลเยอร์โดยไม่มีการเปลี่ยนแปลงเครื่องมือ บนเลเยอร์ที่มีการเปลี่ยนเครื่องมือ ชุดดันเส้นจะเคลื่อนลงด้านล่างเพื่อพิมพ์ไวด์ทาวเวอร์ ผู้ใช้มีหน้าที่รับผิดชอบในการตรวจสอบให้แน่ใจว่าไม่มีการชนกันกับงานพิมพ์" +msgstr "หากเปิดใช้งาน Wipe Tower จะไม่ถูกพิมพ์บนเลเยอร์โดยไม่มีการเปลี่ยนแปลงเครื่องมือ บนเลเยอร์ที่มีการเปลี่ยนเครื่องมือ ชุดดันเส้นจะเคลื่อนลงด้านล่างเพื่อพิมพ์ Wipe Tower ผู้ใช้มีหน้าที่รับผิดชอบในการตรวจสอบให้แน่ใจว่าไม่มีการชนกันกับงานพิมพ์" msgid "Prime all printing extruders" msgstr "ใช้ชุดดันเส้นการพิมพ์ทั้งหมด" @@ -16720,7 +16720,7 @@ msgid "Independent support layer height" msgstr "ความสูงของชั้นรองรับอิสระ" msgid "Support layer uses layer height independent with object layer. This is to support customizing Z-gap and save print time. This option will be invalid when the prime tower is enabled." -msgstr "เลเยอร์ส่วนรองรับใช้ความสูงของเลเยอร์ที่เป็นอิสระจากเลเยอร์วัตถุ เพื่อรองรับการปรับแต่ง Z-gap และประหยัดเวลาในการพิมพ์ ตัวเลือกนี้จะไม่ถูกต้องเมื่อเปิดใช้งานไพรม์ทาวเวอร์" +msgstr "เลเยอร์ส่วนรองรับใช้ความสูงของเลเยอร์ที่เป็นอิสระจากเลเยอร์วัตถุ เพื่อรองรับการปรับแต่ง Z-gap และประหยัดเวลาในการพิมพ์ ตัวเลือกนี้จะไม่ถูกต้องเมื่อเปิดใช้งาน Prime Tower" msgid "Threshold angle" msgstr "มุมเกณฑ์" @@ -16885,13 +16885,13 @@ msgid "This G-code is inserted when filament is changed, including T commands to msgstr "รหัส G นี้จะถูกแทรกเมื่อมีการเปลี่ยนเส้นพลาสติก รวมถึงคำสั่ง T เพื่อกระตุ้นการเปลี่ยนเครื่องมือ" msgid "This G-code is inserted when the extrusion role is changed." -msgstr "G-code นี้จะถูกแทรกเมื่อบทบาทการอัดขึ้นรูปมีการเปลี่ยนแปลง" +msgstr "G-code นี้จะถูกแทรกเมื่อประเภทการพิมพ์มีการเปลี่ยนแปลง" msgid "Change extrusion role G-code (filament)" -msgstr "เปลี่ยนบทบาทการอัดขึ้นรูป G-code (เส้นพลาสติก)" +msgstr "เปลี่ยนประเภทการพิมพ์ G-code (เส้นพลาสติก)" msgid "This G-code is inserted when the extrusion role is changed for the active filament." -msgstr "รหัส G นี้จะถูกแทรกเมื่อมีการเปลี่ยนบทบาทการอัดขึ้นรูปสำหรับเส้นพลาสติกที่ใช้งานอยู่" +msgstr "รหัส G นี้จะถูกแทรกเมื่อมีการเปลี่ยนประเภทการพิมพ์สำหรับเส้นพลาสติกที่ใช้งานอยู่" msgid "Line width for top surfaces. If expressed as a %, it will be computed over the nozzle diameter." msgstr "ความกว้างของเส้นสำหรับพื้นผิวด้านบน หากแสดงเป็น % จะคำนวณตามเส้นผ่านศูนย์กลางของหัวฉีด" @@ -16981,13 +16981,13 @@ msgstr "" "การตั้งค่าในจำนวนการถอนก่อนการล้างการตั้งค่าด้านล่างจะทำการถอนส่วนที่เกินก่อนการล้าง มิฉะนั้นจะดำเนินการหลังจากนั้น" msgid "The wiping tower can be used to clean up residue on the nozzle and stabilize the chamber pressure inside the nozzle in order to avoid appearance defects when printing objects." -msgstr "หอเช็ดสามารถใช้เพื่อทำความสะอาดสิ่งตกค้างบนหัวฉีด และทำให้แรงดันในห้องภายในหัวฉีดคงที่ เพื่อหลีกเลี่ยงข้อบกพร่องในลักษณะที่ปรากฏเมื่อพิมพ์วัตถุ" +msgstr "Wipe Tower สามารถใช้เพื่อทำความสะอาดสิ่งตกค้างบนหัวฉีด และทำให้แรงดันในห้องภายในหัวฉีดคงที่ เพื่อหลีกเลี่ยงข้อบกพร่องในลักษณะที่ปรากฏเมื่อพิมพ์วัตถุ" msgid "Internal ribs" -msgstr "ซี่โครงภายใน" +msgstr "ครีบเสริมภายใน" msgid "Enable internal ribs to increase the stability of the prime tower." -msgstr "เปิดใช้งานซี่โครงภายในเพื่อเพิ่มความมั่นคงของหอคอยหลัก" +msgstr "เปิดใช้ครีบเสริมภายในเพื่อเพิ่มความมั่นคงของ Prime Tower" msgid "Purging volumes" msgstr "ปริมาตรการไล่เส้น" @@ -17007,10 +17007,10 @@ msgid "The flush multiplier used in fast purge mode." msgstr "ตัวคูณการไล่เส้นที่ใช้ในโหมดไล่เส้นเร็ว" msgid "Prime volume" -msgstr "ปริมาณเฉพาะ" +msgstr "ปริมาตร Prime" msgid "This is the volume of material to prime the extruder with on the tower." -msgstr "ปริมาตรวัสดุสำหรับเตรียมหัวฉีดบนไพรม์ทาวเวอร์" +msgstr "ปริมาตรวัสดุสำหรับเตรียมหัวฉีดบน Prime Tower" # AI Translated msgid "Prime volume mode" @@ -17018,7 +17018,7 @@ msgstr "โหมดปริมาณการไพรม์" # AI Translated msgid "Selects how the wipe-tower prime and flush volumes are computed on multi-extruder printers." -msgstr "เลือกวิธีการคำนวณปริมาณการไพรม์และการไล่เส้นของทาวเวอร์เช็ดหัวฉีดบนเครื่องพิมพ์แบบหลายชุดดันเส้น" +msgstr "เลือกวิธีการคำนวณปริมาณการไพรม์และการไล่เส้นของ Wipe Tower บนเครื่องพิมพ์แบบหลายชุดดันเส้น" # AI Translated msgid "Saving" @@ -17029,25 +17029,25 @@ msgid "Fast" msgstr "เร็ว" msgid "This is the width of prime towers." -msgstr "ความกว้างของไพรม์ทาวเวอร์" +msgstr "ความกว้างของ Prime Tower" msgid "Wipe tower rotation angle" -msgstr "เช็ดมุมการหมุนของทาวเวอร์" +msgstr "มุมหมุนของ Wipe Tower" msgid "Wipe tower rotation angle with respect to X axis." -msgstr "เช็ดมุมการหมุนของทาวเวอร์ตามแกน X" +msgstr "มุมหมุนของ Wipe Tower เทียบกับแกน X" msgid "Brim width of prime tower, negative number means auto calculated width based on the height of prime tower." -msgstr "ความกว้างขอบของหอคอยหลัก ตัวเลขติดลบหมายถึงความกว้างที่คำนวณโดยอัตโนมัติตามความสูงของหอคอยหลัก" +msgstr "ความกว้างขอบของ Prime Tower ตัวเลขติดลบหมายถึงความกว้างที่คำนวณโดยอัตโนมัติตามความสูงของ Prime Tower" msgid "Stabilization cone apex angle" msgstr "มุมเอเพ็กซ์ของกรวยป้องกันการสั่นไหว" msgid "Angle at the apex of the cone that is used to stabilize the wipe tower. Larger angle means wider base." -msgstr "มุมที่ปลายกรวยที่ใช้เพื่อรักษาเสถียรภาพของหอเช็ด มุมที่ใหญ่ขึ้นหมายถึงฐานที่กว้างขึ้น" +msgstr "มุมที่ปลายกรวยที่ใช้เพื่อรักษาเสถียรภาพของ Wipe Tower มุมที่ใหญ่ขึ้นหมายถึงฐานที่กว้างขึ้น" msgid "Maximum wipe tower print speed" -msgstr "ความเร็วการพิมพ์ไวต์ทาวเวอร์สูงสุด" +msgstr "ความเร็วการพิมพ์ Wipe Tower สูงสุด" msgid "" "The maximum print speed when purging in the wipe tower and printing the wipe tower sparse layers. When purging, if the sparse infill speed or calculated speed from the filament max volumetric speed is lower, the lowest will be used instead.\n" @@ -17064,11 +17064,11 @@ msgstr "" "\n" "เมื่อพิมพ์ชั้นเบาบาง หากความเร็วเส้นรอบวงภายในหรือความเร็วที่คำนวณจากความเร็วปริมาตรสูงสุดของเส้นพลาสติกต่ำกว่า ความเร็วต่ำสุดจะถูกนำมาใช้แทน\n" "\n" -"การเพิ่มความเร็วนี้อาจส่งผลต่อเสถียรภาพของทาวเวอร์ รวมทั้งเพิ่มแรงที่หัวฉีดชนกับหยดใดๆ ที่อาจก่อตัวบนทาวเวอร์เช็ด\n" +"การเพิ่มความเร็วนี้อาจส่งผลต่อเสถียรภาพของทาวเวอร์ รวมทั้งเพิ่มแรงที่หัวฉีดชนกับหยดใดๆ ที่อาจก่อตัวบน Wipe Tower\n" "\n" "ก่อนที่จะเพิ่มพารามิเตอร์นี้เกินกว่าค่าเริ่มต้นที่ 90 มม./วินาที ตรวจสอบให้แน่ใจว่าเครื่องพิมพ์ของคุณสามารถเชื่อมต่อที่ความเร็วที่เพิ่มขึ้นได้อย่างน่าเชื่อถือ และจะมีการควบคุมอย่างดีเมื่อเปลี่ยนเครื่องมือ\n" "\n" -"สำหรับปริมณฑลภายนอกของไวต์ทาวเวอร์ ความเร็วของปริมณฑลภายในจะถูกใช้โดยไม่คำนึงถึงการตั้งค่านี้" +"สำหรับปริมณฑลภายนอกของ Wipe Tower ความเร็วของปริมณฑลภายในจะถูกใช้โดยไม่คำนึงถึงการตั้งค่านี้" msgid "Wall type" msgstr "ชนิดติดผนัง" @@ -17079,10 +17079,10 @@ msgid "" "2. Cone: A cone with a fillet at the bottom to help stabilize the wipe tower.\n" "3. Rib: Adds four ribs to the tower wall for enhanced stability." msgstr "" -"เช็ดทาวเวอร์ชนิดผนังด้านนอก\n" +"Wipe Tower ชนิดผนังด้านนอก\n" "1. สี่เหลี่ยมผืนผ้า: ประเภทผนังเริ่มต้น ซึ่งเป็นสี่เหลี่ยมผืนผ้าที่มีความกว้างและความสูงคงที่\n" -"2. กรวย: กรวยที่มีเนื้ออยู่ด้านล่างเพื่อช่วยรักษาเสถียรภาพของหอเช็ด\n" -"3. ซี่โครง: เพิ่มสี่ซี่โครงเข้ากับผนังหอคอยเพื่อเพิ่มความมั่นคง" +"2. กรวย: กรวยที่มีเนื้ออยู่ด้านล่างเพื่อช่วยรักษาเสถียรภาพของ Wipe Tower\n" +"3. ซี่โครง: เพิ่มสี่ซี่โครงเข้ากับผนัง Wipe Tower เพื่อเพิ่มความมั่นคง" msgid "Rectangle" msgstr "สี่เหลี่ยมผืนผ้า" @@ -17100,40 +17100,40 @@ msgid "Rib width" msgstr "ความกว้างของซี่โครง" msgid "Rib width is always less than half the prime tower side length." -msgstr "ความกว้างของซี่โครงจะน้อยกว่าครึ่งหนึ่งของความยาวด้านของไพรม์ทาวเวอร์เสมอ" +msgstr "ความกว้างของซี่โครงจะน้อยกว่าครึ่งหนึ่งของความยาวด้านของ Prime Tower เสมอ" msgid "Fillet wall" msgstr "ผนังเนื้อ" msgid "The wall of prime tower will fillet." -msgstr "ผนังของไพร์มทาวเวอร์จะแล่เป็นเนื้อเดียวกัน" +msgstr "ผนังของ Prime Tower จะแล่เป็นเนื้อเดียวกัน" msgid "The extruder to use when printing perimeter of the wipe tower. Set to 0 to use the one that is available (non-soluble would be preferred)." -msgstr "ชุดดันเส้นที่จะใช้ในการพิมพ์ปริมณฑลของหอเช็ด ตั้งค่าเป็น 0 เพื่อใช้อันที่มีอยู่ (แนะนำให้ใช้แบบไม่ละลายน้ำ)" +msgstr "ชุดดันเส้นที่จะใช้ในการพิมพ์ปริมณฑลของ Wipe Tower ตั้งค่าเป็น 0 เพื่อใช้อันที่มีอยู่ (แนะนำให้ใช้แบบไม่ละลายน้ำ)" msgid "Purging volumes - load/unload volumes" msgstr "การล้างไดรฟ์ข้อมูล - โหลด/ยกเลิกการโหลดไดรฟ์ข้อมูล" msgid "This vector saves required volumes to change from/to each tool used on the wipe tower. These values are used to simplify creation of the full purging volumes below." -msgstr "เวกเตอร์นี้จะบันทึกปริมาณที่ต้องการเพื่อเปลี่ยนจาก/ไปยังแต่ละเครื่องมือที่ใช้บนไวด์ทาวเวอร์ ค่าเหล่านี้ใช้เพื่อทำให้การสร้างวอลุ่มการล้างข้อมูลทั้งหมดด้านล่างง่ายขึ้น" +msgstr "เวกเตอร์นี้จะบันทึกปริมาณที่ต้องการเพื่อเปลี่ยนจาก/ไปยังแต่ละเครื่องมือที่ใช้บน Wipe Tower ค่าเหล่านี้ใช้เพื่อทำให้การสร้างวอลุ่มการล้างข้อมูลทั้งหมดด้านล่างง่ายขึ้น" msgid "Skip points" msgstr "ข้ามจุด" msgid "The wall of prime tower will skip the start points of wipe path." -msgstr "ผนังของไพร์มทาวเวอร์จะข้ามจุดเริ่มต้นของเส้นทางการเช็ด" +msgstr "ผนังของ Prime Tower จะข้ามจุดเริ่มต้นของเส้นทางการเช็ด" msgid "Enable tower interface features" msgstr "เปิดใช้งานคุณสมบัติอินเทอร์เฟซแบบทาวเวอร์" msgid "Enable optimized prime tower interface behavior when different materials meet." -msgstr "เปิดใช้งานพฤติกรรมอินเทอร์เฟซของไพรม์ทาวเวอร์ที่ได้รับการปรับให้เหมาะสมเมื่อวัสดุที่แตกต่างกันมาบรรจบกัน" +msgstr "เปิดใช้งานพฤติกรรมอินเทอร์เฟซของ Prime Tower ที่ได้รับการปรับให้เหมาะสมเมื่อวัสดุที่แตกต่างกันมาบรรจบกัน" msgid "Cool down from interface boost during prime tower" -msgstr "เย็นลงจากการเพิ่มอินเทอร์เฟซระหว่างหอคอยหลัก" +msgstr "การระบายความร้อนที่เลเยอร์อินเทอร์เฟซของ Prime Tower" msgid "When interface-layer temperature boost is active, set the nozzle back to print temperature at the start of the prime tower so it cools down during the tower." -msgstr "เมื่อเปิดใช้งานการเพิ่มอุณหภูมิของชั้นอินเทอร์เฟซ ให้ตั้งค่าหัวฉีดกลับไปเป็นอุณหภูมิการพิมพ์ที่จุดเริ่มต้นของไพรม์ทาวเวอร์ เพื่อให้เย็นลงระหว่างทาวเวอร์" +msgstr "เมื่อเปิดใช้งานการเพิ่มอุณหภูมิของชั้นอินเทอร์เฟซ ให้ตั้งค่าหัวฉีดกลับไปเป็นอุณหภูมิการพิมพ์ที่จุดเริ่มต้นของ Prime Tower เพื่อให้เย็นลงระหว่าง Prime Tower" msgid "Infill gap" msgstr "การเติมช่องว่าง" @@ -17142,13 +17142,13 @@ msgid "Infill gap." msgstr "การเติมช่องว่าง." msgid "Purging after filament change will be done inside objects' infills. This may lower the amount of waste and decrease the print time. If the walls are printed with transparent filament, the mixed color infill will be visible. It will not take effect unless the prime tower is enabled." -msgstr "การล้างหลังจากเปลี่ยนเส้นพลาสติกจะดำเนินการภายในส่วนไส้ในของวัตถุ สิ่งนี้อาจลดปริมาณขยะและลดเวลาในการพิมพ์ หากผนังพิมพ์ด้วยเส้นพลาสติกโปร่งใส จะเห็นไส้ในสีผสมไว้ด้านนอก มันจะไม่มีผลเว้นแต่จะเปิดใช้งานไพรม์ทาวเวอร์" +msgstr "การล้างหลังจากเปลี่ยนเส้นพลาสติกจะดำเนินการภายในส่วนไส้ในของวัตถุ สิ่งนี้อาจลดปริมาณขยะและลดเวลาในการพิมพ์ หากผนังพิมพ์ด้วยเส้นพลาสติกโปร่งใส จะเห็นไส้ในสีผสมไว้ด้านนอก มันจะไม่มีผลเว้นแต่จะเปิดใช้งาน Prime Tower" msgid "Purging after filament change will be done inside objects' support. This may lower the amount of waste and decrease the print time. It will not take effect unless a prime tower is enabled." -msgstr "การล้างข้อมูลหลังจากเปลี่ยนเส้นพลาสติกจะดำเนินการภายในส่วนรองรับของวัตถุ สิ่งนี้อาจลดปริมาณขยะและลดเวลาในการพิมพ์ มันจะไม่มีผลเว้นแต่จะเปิดใช้งานไพรม์ทาวเวอร์" +msgstr "การล้างข้อมูลหลังจากเปลี่ยนเส้นพลาสติกจะดำเนินการภายในส่วนรองรับของวัตถุ สิ่งนี้อาจลดปริมาณขยะและลดเวลาในการพิมพ์ มันจะไม่มีผลเว้นแต่จะเปิดใช้งาน Prime Tower" msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." -msgstr "วัตถุนี้จะใช้ในการล้างหัวฉีดหลังจากเปลี่ยนเส้นพลาสติกเพื่อประหยัดเส้นพลาสติกและลดเวลาในการพิมพ์ สีของวัตถุจะผสมกัน มันจะไม่มีผลเว้นแต่จะเปิดใช้งานไพรม์ทาวเวอร์" +msgstr "วัตถุนี้จะใช้ในการล้างหัวฉีดหลังจากเปลี่ยนเส้นพลาสติกเพื่อประหยัดเส้นพลาสติกและลดเวลาในการพิมพ์ สีของวัตถุจะผสมกัน มันจะไม่มีผลเว้นแต่จะเปิดใช้งาน Prime Tower" msgid "Maximal bridging distance" msgstr "ระยะเชื่อมต่อสูงสุด" @@ -17157,16 +17157,16 @@ msgid "Maximal distance between supports on sparse infill sections." msgstr "ระยะห่างสูงสุดระหว่างส่วนรองรับในส่วน ไส้ใน แบบกระจัดกระจาย" msgid "Wipe tower purge lines spacing" -msgstr "เช็ดระยะห่างบรรทัดล้างทาวเวอร์" +msgstr "ระยะห่างเส้นไล่พลาสติกของ Wipe Tower" msgid "Spacing of purge lines on the wipe tower." -msgstr "ระยะห่างของเส้นไล่ล้างบนหอเช็ด" +msgstr "ระยะห่างของเส้นไล่ล้างบน Wipe Tower" msgid "Extra flow for purging" msgstr "กระแสพิเศษสำหรับการล้าง" msgid "Extra flow used for the purging lines on the wipe tower. This makes the purging lines thicker or narrower than they normally would be. The spacing is adjusted automatically." -msgstr "การไหลพิเศษที่ใช้สำหรับท่อไล่ล้างบนหอเช็ด ซึ่งจะทำให้เส้นการล้างหนาหรือแคบกว่าปกติ ระยะห่างจะถูกปรับโดยอัตโนมัติ" +msgstr "การไหลพิเศษที่ใช้สำหรับท่อไล่ล้างบน Wipe Tower ซึ่งจะทำให้เส้นการล้างหนาหรือแคบกว่าปกติ ระยะห่างจะถูกปรับโดยอัตโนมัติ" msgid "Idle temperature" msgstr "อุณหภูมิว่าง" @@ -17748,10 +17748,10 @@ msgid "Specific for sequential printing. Zero-based index of currently printed o msgstr "เฉพาะสำหรับการพิมพ์ตามลำดับ ดัชนีแบบศูนย์ของวัตถุที่พิมพ์ในปัจจุบัน" msgid "Has wipe tower" -msgstr "มีหอเช็ด" +msgstr "มี Wipe Tower" msgid "Whether or not wipe tower is being generated in the print." -msgstr "มีการสร้างเช็ดทาวเวอร์ในการพิมพ์หรือไม่" +msgstr "มีการสร้าง Wipe Tower ในการพิมพ์หรือไม่" msgid "Initial extruder" msgstr "ชุดดันเส้นเริ่มต้น" @@ -17838,16 +17838,16 @@ msgid "Total cost of all material used in the print. Calculated from filament_co msgstr "ต้นทุนรวมของวัสดุทั้งหมดที่ใช้ในการพิมพ์ คำนวณจากค่า fil_cost ในการตั้งค่า เส้นพลาสติก" msgid "Total wipe tower cost" -msgstr "ต้นทุนเช็ดทาวเวอร์ทั้งหมด" +msgstr "ต้นทุน Wipe Tower ทั้งหมด" msgid "Total cost of the material wasted on the wipe tower. Calculated from filament_cost value in Filament Settings." -msgstr "ต้นทุนรวมของวัสดุที่เสียไปบนไวด์ทาวเวอร์ คำนวณจากค่า fil_cost ในการตั้งค่า เส้นพลาสติก" +msgstr "ต้นทุนรวมของวัสดุที่เสียไปบน Wipe Tower คำนวณจากค่า fil_cost ในการตั้งค่า เส้นพลาสติก" msgid "Wipe tower volume" msgstr "เช็ดปริมาตรทาวเวอร์" msgid "Total filament volume extruded on the wipe tower." -msgstr "ปริมาตรเส้นพลาสติกทั้งหมดที่อัดบนไวด์ทาวเวอร์" +msgstr "ปริมาตรเส้นพลาสติกทั้งหมดที่อัดบน Wipe Tower" msgid "Used filament" msgstr "เส้นพลาสติกที่ใช้แล้ว" @@ -18045,8 +18045,8 @@ msgid "" "An object has enabled XY Size compensation which will not be used because it is also fuzzy skin painted.\n" "XY Size compensation cannot be combined with fuzzy skin painting." msgstr "" -"วัตถุได้เปิดใช้งานการชดเชยขนาด XY ซึ่งจะไม่ถูกใช้เนื่องจากเป็นสีที่ไม่ชัดเจนเช่นกัน\n" -"การชดเชยขนาด XY ไม่สามารถใช้ร่วมกับการลงสีผิวแบบคลุมเครือได้" +"วัตถุได้เปิดใช้งานการชดเชยขนาด XY ซึ่งจะไม่ถูกใช้เนื่องจากถูกระบายสีผิวฟัซซีไว้เช่นกัน\n" +"การชดเชยขนาด XY ไม่สามารถใช้ร่วมกับการระบายสีผิวฟัซซีได้" msgid "Object name" msgstr "ชื่อออบเจ็กต์" @@ -20591,7 +20591,7 @@ msgid "Auto-generate" msgstr "สร้างอัตโนมัติ" msgid "Generate brim ears using Max angle and Detection radius" -msgstr "สร้างหูขอบยึดชิ้นงานนกโดยใช้มุมสูงสุดและรัศมีการตรวจจับ" +msgstr "สร้างหูขอบยึดชิ้นงาน (Brim Ears) โดยใช้มุมสูงสุดและรัศมีการตรวจจับ" msgid "Add or Select" msgstr "เพิ่มหรือเลือก" @@ -20606,7 +20606,7 @@ msgid "invalid brim ears" msgstr "หูขอบยึดชิ้นงานไม่ถูกต้อง" msgid "Brim Ears" -msgstr "หูขอบยึดชิ้นงาน" +msgstr "หูขอบยึดชิ้นงาน (Brim Ears)" msgid "Please select single object." msgstr "กรุณาเลือกวัตถุเดียว" @@ -21572,7 +21572,7 @@ msgstr "" #~ msgstr "เนื้อหาที่ตั้งไว้ล่วงหน้ามีขนาดใหญ่เกินกว่าจะซิงค์กับระบบคลาวด์ (เกิน 1MB) โปรดลดขนาดที่กำหนดไว้ล่วงหน้าโดยการลบการกำหนดค่าที่กำหนดเองออกหรือใช้เฉพาะในเครื่องเท่านั้น" #~ msgid "Enable adaptive pressure advance for overhangs (beta)" -#~ msgstr "เปิดใช้งานการปรับPressure Advanceสำหรับระยะยื่น (เบต้า)" +#~ msgstr "เปิดใช้ Adaptive Pressure Advance สำหรับส่วนยื่น (เบต้า)" #~ msgid "" #~ "Enable adaptive PA for overhangs as well as when flow changes within the same feature. This is an experimental option, as if the PA profile is not set accurately, it will cause uniformity issues on the external surfaces before and after overhangs.\n" @@ -21582,7 +21582,7 @@ msgstr "" #~ "ไม่รองรับเครื่องพิมพ์ Prusa เพราะจะหยุดชั่วคราวเพื่อประมวลผลการเปลี่ยน PA ทำให้เกิดความล่าช้าและข้อบกพร่อง" #~ msgid "Pressure advance for bridges" -#~ msgstr "แรงดันล่วงหน้า (Pressure Advance)สำหรับสะพาน" +#~ msgstr "Pressure Advance สำหรับสะพาน" #~ msgid "" #~ "Pressure advance value for bridges. Set to 0 to disable.\n" From e9d421050e0eff618c0c2c5abb5869d91bfa4081 Mon Sep 17 00:00:00 2001 From: Ian Chua Date: Wed, 12 Aug 2026 18:50:49 +0800 Subject: [PATCH 098/106] refactor: access codes and device tab (#15134) --- src/slic3r/GUI/ConnectPrinter.cpp | 4 ++- src/slic3r/GUI/DeviceCore/DevManager.cpp | 19 +++++++++--- src/slic3r/GUI/DeviceManager.cpp | 36 +--------------------- src/slic3r/GUI/DeviceManager.hpp | 6 ---- src/slic3r/GUI/GUI_App.cpp | 4 +-- src/slic3r/GUI/MainFrame.cpp | 24 +++++++++++---- src/slic3r/GUI/Plater.cpp | 13 ++++++-- src/slic3r/GUI/ReleaseNote.cpp | 9 ++++-- src/slic3r/GUI/SelectMachinePop.cpp | 1 - src/slic3r/Utils/MoonrakerPrinterAgent.cpp | 1 - 10 files changed, 54 insertions(+), 63 deletions(-) diff --git a/src/slic3r/GUI/ConnectPrinter.cpp b/src/slic3r/GUI/ConnectPrinter.cpp index b4cd7f4f2f..3e78e7fe5c 100644 --- a/src/slic3r/GUI/ConnectPrinter.cpp +++ b/src/slic3r/GUI/ConnectPrinter.cpp @@ -156,6 +156,8 @@ void ConnectPrinterDialog::on_input_enter(wxCommandEvent& evt) void ConnectPrinterDialog::on_button_confirm(wxCommandEvent &event) { wxString code = m_textCtrl_code->GetTextCtrl()->GetValue(); + if (code.empty()) + code = "88888888"; for (char c : code) { if (!(('0' <= c && c <= '9') || ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'))) { show_error(this, _L("Invalid input")); @@ -163,7 +165,7 @@ void ConnectPrinterDialog::on_button_confirm(wxCommandEvent &event) } } if (m_obj) { - m_obj->set_user_access_code(code.ToStdString()); + m_obj->set_access_code(code.ToStdString()); } EndModal(wxID_OK); } diff --git a/src/slic3r/GUI/DeviceCore/DevManager.cpp b/src/slic3r/GUI/DeviceCore/DevManager.cpp index d13f8b7215..edc958ec53 100644 --- a/src/slic3r/GUI/DeviceCore/DevManager.cpp +++ b/src/slic3r/GUI/DeviceCore/DevManager.cpp @@ -15,6 +15,18 @@ using namespace nlohmann; +namespace { + // Orca: access_code and user_access_code used to be separate AppConfig keys before the two + // fields were merged; fall back to the legacy key so existing users' saved codes aren't lost. + std::string get_access_code_with_legacy_fallback(Slic3r::AppConfig* config, const std::string& dev_id) + { + std::string code = config->get("access_code", dev_id); + if (code.empty()) + code = config->get("user_access_code", dev_id); + return code; + } +} + namespace Slic3r { DeviceManager::DeviceManager(NetworkAgent* agent) @@ -48,8 +60,7 @@ namespace Slic3r obj->bind_sec_link = "secure"; obj->m_is_online = true; obj->last_alive = Slic3r::Utils::get_current_time_utc(); - obj->set_access_code(config->get("access_code", m.dev_id), false); - obj->set_user_access_code(config->get("user_access_code", m.dev_id), false); + obj->set_access_code(get_access_code_with_legacy_fallback(config, m.dev_id), false); if (obj->has_access_right()) { localMachineList.insert(std::make_pair(m.dev_id, obj)); } else { @@ -339,8 +350,7 @@ namespace Slic3r //load access code AppConfig* config = Slic3r::GUI::wxGetApp().app_config; if (config) { - obj->set_access_code(Slic3r::GUI::wxGetApp().app_config->get("access_code", dev_id), false); - obj->set_user_access_code(Slic3r::GUI::wxGetApp().app_config->get("user_access_code", dev_id), false); + obj->set_access_code(get_access_code_with_legacy_fallback(config, dev_id), false); } localMachineList.insert(std::make_pair(dev_id, obj)); @@ -382,7 +392,6 @@ namespace Slic3r obj->m_is_online = true; obj->last_alive = Slic3r::Utils::get_current_time_utc(); obj->set_access_code(access_code, false); - obj->set_user_access_code(access_code, false); update_local_machine(*obj); diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index ef85870461..f4befe78c1 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -449,9 +449,7 @@ bool MachineObject::HasRecentLanMessage() std::string MachineObject::get_access_code() const { - if (get_user_access_code().empty()) - return access_code; - return get_user_access_code(); + return access_code; } void MachineObject::set_access_code(std::string code, bool only_refresh) @@ -470,37 +468,6 @@ void MachineObject::set_access_code(std::string code, bool only_refresh) } } -void MachineObject::erase_user_access_code() -{ - this->user_access_code = ""; - AppConfig* config = GUI::wxGetApp().app_config; - if (config) { - GUI::wxGetApp().app_config->erase("user_access_code", get_dev_id()); - //GUI::wxGetApp().app_config->save(); - } -} - -void MachineObject::set_user_access_code(std::string code, bool only_refresh) -{ - this->user_access_code = code; - if (only_refresh && !code.empty()) { - AppConfig* config = GUI::wxGetApp().app_config; - if (config && !code.empty()) { - GUI::wxGetApp().app_config->set_str("user_access_code", get_dev_id(), code); - DeviceManager::update_local_machine(*this); - } - } -} - -std::string MachineObject::get_user_access_code() const -{ - AppConfig* config = GUI::wxGetApp().app_config; - if (config) { - return GUI::wxGetApp().app_config->get("user_access_code", get_dev_id()); - } - return ""; -} - std::string MachineObject::get_show_printer_type() const { std::string printer_type = this->printer_type; @@ -2907,7 +2874,6 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ std::string access_code = j_pre["system"]["access_code"].get(); if (!access_code.empty()) { set_access_code(access_code); - set_user_access_code(access_code); } } } diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index 2790e37cfa..33635fbe6e 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -113,7 +113,6 @@ private: std::string dev_name; std::string dev_ip; std::string access_code; - std::string user_access_code; // type, time stamp, delay std::vector> message_delay; @@ -228,11 +227,6 @@ public: std::string get_access_code() const; void set_access_code(std::string code, bool only_refresh = true); - /*user access code*/ - void set_user_access_code(std::string code, bool only_refresh = true); - void erase_user_access_code(); - std::string get_user_access_code() const; - //PRINTER_TYPE printer_type = PRINTER_3DPrinter_UKNOWN; std::string printer_type; /* model_id */ std::string get_show_printer_type() const; diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 14edeb8038..db51bd9d8e 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2166,7 +2166,6 @@ void GUI_App::init_networking_callbacks() obj->is_tunnel_mqtt = tunnel; obj->command_request_push_all(true); obj->command_get_version(); - obj->erase_user_access_code(); obj->command_get_access_code(); if (m_agent) m_agent->install_device_cert(obj->get_dev_id(), obj->is_lan_mode_printer()); @@ -2216,7 +2215,6 @@ void GUI_App::init_networking_callbacks() wxString text; if (msg == "5") { obj->set_access_code(""); - obj->erase_user_access_code(); text = wxString::Format(_L("Incorrect password")); wxGetApp().show_dialog(text); } else { @@ -8286,7 +8284,7 @@ bool GUI_App::show_modal_ip_address_enter_dialog(bool input_sn, wxString title) wxGetApp().app_config->save(); obj->set_dev_ip(ip_address.ToStdString()); - obj->set_user_access_code(access_code.ToStdString()); + obj->set_access_code(access_code.ToStdString()); } } }); diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 5ef81a32e1..5a0e70b74c 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -1373,8 +1373,8 @@ void MainFrame::show_device(bool should_use_native) { const bool use_printer_agents = wxGetApp().app_config->get_bool("use_printer_agents"); - // The legacy page is appended when printer agents are enabled. Remove that - // extra page before switching back to the normal native/legacy layout. + // The web page is appended when printer agents are enabled. Remove that + // extra page before switching back to the normal native/Web layout. if (!use_printer_agents) { if ((idx = m_tabpanel->FindPage(m_printer_view)) != wxNOT_FOUND && idx != tpMonitor) { m_printer_view->Show(false); @@ -1434,10 +1434,10 @@ void MainFrame::show_device(bool should_use_native) { if ((idx = m_tabpanel->FindPage(m_printer_view)) == wxNOT_FOUND) { m_printer_view->Show(false); - m_tabpanel->AddPage(m_printer_view, _L("Device (legacy)"), std::string("tab_monitor_active"), + m_tabpanel->AddPage(m_printer_view, _L("Device (Web)"), std::string("tab_monitor_active"), std::string("tab_monitor_active"), false); } else { - m_tabpanel->SetPageText(idx, _L("Device (legacy)")); + m_tabpanel->SetPageText(idx, _L("Device (Web)")); } #ifdef _MSW_DARK_MODE @@ -4333,14 +4333,26 @@ void MainFrame::load_printer_url(wxString url, wxString apikey) void MainFrame::load_printer_url() { PresetBundle &preset_bundle = *wxGetApp().preset_bundle; - if (preset_bundle.use_bbl_device_tab() || wxGetApp().app_config->get_bool("use_printer_agents")) + if (preset_bundle.use_bbl_device_tab() && !wxGetApp().app_config->get_bool("use_printer_agents")) return; auto cfg = preset_bundle.printers.get_edited_preset().config; + if (cfg.opt_string("print_host").empty()) { + if (auto *device_manager = wxGetApp().getDeviceManager()) { + auto *machine = device_manager->get_selected_machine(); + if (!machine) { + auto machines = device_manager->get_my_machine_list(); + if (machines.size() == 1) + machine = machines.begin()->second; + } + if (machine && !machine->get_dev_ip().empty()) + cfg.opt_string("print_host") = machine->get_dev_ip(); + } + } wxString url = from_u8(PrintHost::get_print_host_webui(&cfg)); wxString apikey; const auto host_type = cfg.option>("host_type")->value; - if (cfg.has("printhost_apikey") && (host_type == htPrusaLink || host_type == htPrusaConnect)) + if (cfg.has("printhost_apikey") && host_type != htSimplyPrint) apikey = cfg.opt_string("printhost_apikey"); if (!url.empty()) { load_printer_url(url, apikey); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 8299125353..5b06db9d3e 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3287,7 +3287,9 @@ void Sidebar::update_all_preset_comboboxes() : MainFrame::PrintSelectType::eSendGcode; } - if (!use_native_device_tab || use_printer_agents) + if (use_printer_agents) + p_mainframe->load_printer_url(); + else if (!use_native_device_tab) p_mainframe->load_printer_url(url, apikey); @@ -11236,9 +11238,14 @@ void Plater::priv::on_tab_selection_changing(wxBookCtrlEvent& e) } } } else { - if (new_sel == MainFrame::tpMonitor && wxGetApp().preset_bundle != nullptr) { + const bool selecting_web_device_tab = main_frame->m_printer_view && + main_frame->m_tabpanel->GetPage(new_sel) == main_frame->m_printer_view; + if (selecting_web_device_tab) { + // Use the selected discovered machine when the preset has no host. + main_frame->load_printer_url(); + } else if (new_sel == MainFrame::tpMonitor && wxGetApp().preset_bundle != nullptr) { auto cfg = wxGetApp().preset_bundle->printers.get_edited_preset().config; - wxString url = cfg.opt_string("print_host_webui").empty() ? cfg.opt_string("print_host") : cfg.opt_string("print_host_webui"); + wxString url = from_u8(PrintHost::get_print_host_webui(&cfg)); if (main_frame->m_printer_view && url.empty()) { // It's missing_connection page, reload so that we can replay the gif image main_frame->m_printer_view->reload(); diff --git a/src/slic3r/GUI/ReleaseNote.cpp b/src/slic3r/GUI/ReleaseNote.cpp index 22f65f4a60..7b2d091176 100644 --- a/src/slic3r/GUI/ReleaseNote.cpp +++ b/src/slic3r/GUI/ReleaseNote.cpp @@ -1991,7 +1991,7 @@ void InputIpAddressDialog::workerThreadFunc(std::string str_ip, std::string str_ if (w.expired()) return; if (m_obj) { - m_obj->set_user_access_code(str_access_code); + m_obj->set_access_code(str_access_code); wxGetApp().getDeviceManager()->set_selected_machine(m_obj->get_dev_id()); } @@ -2055,6 +2055,11 @@ void InputIpAddressDialog::on_text(wxCommandEvent &evt) { auto str_ip = m_input_ip->GetTextCtrl()->GetValue(); auto str_access_code = m_input_access_code->GetTextCtrl()->GetValue(); + + if (str_access_code.empty()) { + str_access_code = "88888888"; + } + auto str_name = m_input_printer_name->GetTextCtrl()->GetValue().Strip(wxString::both); auto str_sn = m_input_sn->GetTextCtrl()->GetValue().Strip(wxString::both); bool invalid_access_code = true; @@ -2062,7 +2067,7 @@ void InputIpAddressDialog::on_text(wxCommandEvent &evt) for (char c : str_access_code) { if (!(('0' <= c && c <= '9') || ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'))) { invalid_access_code = false; - return; + break; } } diff --git a/src/slic3r/GUI/SelectMachinePop.cpp b/src/slic3r/GUI/SelectMachinePop.cpp index 492199569e..96324fb4d8 100644 --- a/src/slic3r/GUI/SelectMachinePop.cpp +++ b/src/slic3r/GUI/SelectMachinePop.cpp @@ -704,7 +704,6 @@ void SelectMachinePopup::update_user_devices() } mobj->set_access_code(""); - mobj->erase_user_access_code(); } if (GUI::wxGetApp().plater()) diff --git a/src/slic3r/Utils/MoonrakerPrinterAgent.cpp b/src/slic3r/Utils/MoonrakerPrinterAgent.cpp index d21dce5070..cd3ef82b62 100644 --- a/src/slic3r/Utils/MoonrakerPrinterAgent.cpp +++ b/src/slic3r/Utils/MoonrakerPrinterAgent.cpp @@ -1359,7 +1359,6 @@ void MoonrakerPrinterAgent::announce_printhost_device() if (auto* app_config = GUI::wxGetApp().app_config) { const std::string access_code = device_info.api_key.empty() ? "88888888" : device_info.api_key; app_config->set_str("access_code", device_info.dev_id, access_code); - app_config->set_str("user_access_code", device_info.dev_id, access_code); } nlohmann::json payload; From ee6613a4b8b0720723518c823ef815c4be9d64d4 Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Wed, 12 Aug 2026 21:18:00 +0300 Subject: [PATCH 099/106] Fix stale flush matrix after enabling SEMM (#15223) --- src/libslic3r/PresetBundle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 01cbc43bc2..5557d36891 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -5378,7 +5378,7 @@ void PresetBundle::update_multi_material_filament_presets(size_t to_delete_filam f_multiplier.resize(nozzle_nums, 1.f); } - if ( (num_filaments * num_filaments) != size_t(old_matrix.size() / old_nozzle_nums) ) { + if (old_matrix.size() != num_filaments * num_filaments * nozzle_nums) { // First verify if purging volumes presets for each extruder matches number of extruders std::vector& filaments = this->project_config.option("flush_volumes_vector")->values; while (filaments.size() < 2* num_filaments) { From d322b1a156b9afb6ef412665594e374baf316a88 Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Wed, 12 Aug 2026 21:42:21 +0300 Subject: [PATCH 100/106] Fix assembly parts omitted by height range modifiers (#15225) --- src/libslic3r/PrintApply.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/PrintApply.cpp b/src/libslic3r/PrintApply.cpp index e2e9bc737d..6d5dbb05f5 100644 --- a/src/libslic3r/PrintApply.cpp +++ b/src/libslic3r/PrintApply.cpp @@ -559,9 +559,11 @@ static inline bool model_volume_solid_or_modifier(const ModelVolume &mv) static inline Transform3f trafo_for_bbox(const Transform3d &object_trafo, const Transform3d &volume_trafo) { - Transform3d m = object_trafo * volume_trafo; - m.translation().x() = 0.; - m.translation().y() = 0.; + // Orca: Keep the volume's local XY offset for multipart overlap checks, but remove the object's bed placement. + Transform3d object_trafo_local = object_trafo; + object_trafo_local.translation().x() = 0.; + object_trafo_local.translation().y() = 0.; + Transform3d m = object_trafo_local * volume_trafo; return m.cast(); } From fd23b74b99d95ef25e5b524f90a308538632afd9 Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Thu, 13 Aug 2026 23:09:10 +0300 Subject: [PATCH 101/106] Fix single-value object overrides on multi-nozzle printers (#15221) --- src/libslic3r/PrintConfig.cpp | 12 +++++++++++- src/libslic3r/PrintConfig.hpp | 3 +++ src/libslic3r/PrintObject.cpp | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index fdb20253d6..f9d895332a 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -10426,6 +10426,16 @@ int DynamicPrintConfig::update_values_from_multi_to_multi_2(const std::vector &variant_index, int stride) +{ + // A single-value object or region override applies to every nozzle variant. + std::vector indices = variant_index; + if (source.size() == 1 && !source.is_nil(0)) + std::fill(indices.begin(), indices.end(), 0); + target.set_to_index(&source, indices, stride); +} + //used for object/region config //use the smallest of multiple to single @@ -11503,7 +11513,7 @@ void update_static_print_config_from_dynamic(ConfigBase& config, const DynamicPr else { ConfigOptionVectorBase* opt_vec_src = static_cast(opt_src); const ConfigOptionVectorBase* opt_vec_dest = static_cast(opt_dest); - opt_vec_src->set_to_index(opt_vec_dest, variant_index, stride); + set_variant_override(*opt_vec_src, *opt_vec_dest, variant_index, stride); } } } diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 6029d5bd88..b6364c32c2 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -842,6 +842,9 @@ extern std::set printer_options_with_variant_1; extern std::set printer_options_with_variant_2; extern std::set empty_options; +void set_variant_override(ConfigOptionVectorBase &target, const ConfigOptionVectorBase &source, + const std::vector &variant_index, int stride = 1); + extern std::set filament_dev_options; extern void update_static_print_config_from_dynamic(ConfigBase& config, const DynamicPrintConfig& dest_config, std::vector variant_index, std::set& key_set1, int stride = 1); diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index b2a92f11a6..8368de1a4f 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -3812,7 +3812,7 @@ static void apply_to_print_region_config(PrintRegionConfig &out, const DynamicPr else { ConfigOptionVectorBase* opt_vec_src = static_cast(my_opt); const ConfigOptionVectorBase* opt_vec_dest = static_cast(it->second.get()); - opt_vec_src->set_to_index(opt_vec_dest, variant_index, 1); + set_variant_override(*opt_vec_src, *opt_vec_dest, variant_index); } } } From 56d2c527cbb0fe50afbb09c75bc74cf2cdeddda7 Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Thu, 13 Aug 2026 23:28:31 +0300 Subject: [PATCH 102/106] Fix crashes from object-level small perimeter speed overrides (#15232) --- src/libslic3r/Config.hpp | 2 ++ src/libslic3r/Model.cpp | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index 509095cbfc..ef93f0d509 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -2982,6 +2982,8 @@ public: const double & opt_float(const t_config_option_key &opt_key, unsigned int idx) const; double & opt_float_nullable(const t_config_option_key &opt_key, unsigned int idx) { return this->option(opt_key)->get_at(idx); } const double & opt_float_nullable(const t_config_option_key &opt_key, unsigned int idx) const { return dynamic_cast(this->option(opt_key))->get_at(idx); } + FloatOrPercent & opt_float_or_percent_nullable(const t_config_option_key &opt_key, unsigned int idx) { return this->option(opt_key)->get_at(idx); } + const FloatOrPercent & opt_float_or_percent_nullable(const t_config_option_key &opt_key, unsigned int idx) const { return dynamic_cast(this->option(opt_key))->get_at(idx); } int& opt_int(const t_config_option_key &opt_key) { return this->option(opt_key)->value; } int opt_int(const t_config_option_key &opt_key) const { return dynamic_cast(this->option(opt_key))->value; } diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 1177a5227d..c689c7ce78 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -3243,9 +3243,9 @@ double Model::findMaxSpeed(const ModelObject* object) { if (objectKey == "outer_wall_speed") externalPerimeterSpeedObj = object->config.get().opt_float_nullable(objectKey, 0); if (objectKey == "small_perimeter_speed") - smallPerimeterSpeedObj = object->config.get().opt_float_nullable(objectKey, 0); + smallPerimeterSpeedObj = object->config.get().opt_float_or_percent_nullable(objectKey, 0).get_abs_value(externalPerimeterSpeedObj); if (objectKey == "small_support_perimeter_speed") - smallSupportPerimeterSpeedObj = object->config.get().opt_float_nullable(objectKey, 0); + smallSupportPerimeterSpeedObj = object->config.get().opt_float_or_percent_nullable(objectKey, 0).get_abs_value(supportSpeedObj); } objMaxSpeed = std::max(perimeterSpeedObj, std::max(externalPerimeterSpeedObj, std::max(infillSpeedObj, std::max(solidInfillSpeedObj, std::max(topSolidInfillSpeedObj, std::max(supportSpeedObj, std::max(smallPerimeterSpeedObj, std::max(smallSupportPerimeterSpeedObj, objMaxSpeed)))))))); if (objMaxSpeed <= 0) objMaxSpeed = 250.; From 78eef79ffea599653c305b2461afa51b174ef72b Mon Sep 17 00:00:00 2001 From: Robert J Audas Date: Thu, 13 Aug 2026 14:50:55 -0600 Subject: [PATCH 103/106] Fix flushing-volume warning for single-filament plates (#14704) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com> --- src/libslic3r/PrintConfig.hpp | 49 ++++++++++++++++++++++++++++++++ src/slic3r/GUI/GLCanvas3D.cpp | 20 ++++--------- tests/libslic3r/test_config.cpp | 50 +++++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+), 15 deletions(-) diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index b6364c32c2..f51c1c6411 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -2397,6 +2397,55 @@ static void set_flush_volumes_matrix(std::vector &out_matrix, const std::vect } } +template +static bool has_zero_flush_volume_for_used_filaments(const std::vector &fv_matrix, + const std::vector &flush_multipliers, + const std::vector &used_filaments) +{ + if (used_filaments.size() < 2 || flush_multipliers.empty()) + return false; + + if (fv_matrix.size() % flush_multipliers.size() != 0) + return false; + + const size_t matrix_len = fv_matrix.size() / flush_multipliers.size(); + const size_t row_len = size_t(std::sqrt(double(matrix_len))); + if (row_len < 2 || row_len * row_len != matrix_len) + return false; + + std::vector filtered_filaments; + filtered_filaments.reserve(used_filaments.size()); + for (int filament_id : used_filaments) { + if (filament_id <= 0 || filament_id > int(row_len)) + continue; + if (std::find(filtered_filaments.begin(), filtered_filaments.end(), filament_id) == filtered_filaments.end()) + filtered_filaments.push_back(filament_id); + } + if (filtered_filaments.size() < 2) + return false; + + for (T multiplier : flush_multipliers) { + if (multiplier == 0) + return true; + } + + for (size_t nozzle_idx = 0; nozzle_idx < flush_multipliers.size(); nozzle_idx++) { + const size_t block_offset = nozzle_idx * matrix_len; + for (int from_id : filtered_filaments) { + for (int to_id : filtered_filaments) { + if (from_id == to_id) + continue; + + const size_t matrix_idx = block_offset + size_t(from_id - 1) * row_len + size_t(to_id - 1); + if (matrix_idx < fv_matrix.size() && fv_matrix[matrix_idx] == 0) + return true; + } + } + } + + return false; +} + size_t get_extruder_index(const GCodeConfig& config, unsigned int filament_id); } // namespace Slic3r diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 303f9a2b76..d0eb79881b 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -10738,24 +10738,14 @@ bool GLCanvas3D::is_flushing_matrix_error() { if (!Sidebar::should_show_SEMM_buttons()) return false; + std::vector plate_extruders = wxGetApp().plater()->get_partplate_list().get_curr_plate()->get_extruders(true); + if (plate_extruders.size() < 2) + return false; + const auto &project_config = wxGetApp().preset_bundle->project_config; const std::vector &config_matrix = (project_config.option("flush_volumes_matrix"))->values; const std::vector &config_multiplier = (project_config.option("flush_multiplier"))->values; - - for (auto multiplier : config_multiplier) { - if (multiplier == 0) return true; - } - - int matrix_len = config_matrix.size() / config_multiplier.size(); - int row_len = std::sqrt(matrix_len); - for (int i = 0; i < config_matrix.size(); i++) - { - int relative_id = i % matrix_len; - int row_id = relative_id / row_len; - int col_id = relative_id % row_len; - if (row_id != col_id && config_matrix[i] == 0) return true; - } - return false; + return has_zero_flush_volume_for_used_filaments(config_matrix, config_multiplier, plate_extruders); } bool GLCanvas3D::_is_any_volume_outside() const diff --git a/tests/libslic3r/test_config.cpp b/tests/libslic3r/test_config.cpp index 5bc825c3b2..12b161322d 100644 --- a/tests/libslic3r/test_config.cpp +++ b/tests/libslic3r/test_config.cpp @@ -235,6 +235,56 @@ SCENARIO("Config ini load/save interface", "[Config]") { } } +TEST_CASE("Flush-volume warning predicate respects used filament transitions", "[Config][Regression]") +{ + const std::vector multipliers = {1.0}; + + SECTION("Single used filament does not trigger warning with zero transition entries") + { + const std::vector matrix = { + 0.0, 0.0, + 0.0, 0.0 + }; + const std::vector used_filaments = {1}; + + REQUIRE_FALSE(has_zero_flush_volume_for_used_filaments(matrix, multipliers, used_filaments)); + } + + SECTION("Two used filaments trigger warning when transition flush entry is zero") + { + const std::vector matrix = { + 0.0, 0.0, + 0.0, 0.0 + }; + const std::vector used_filaments = {1, 2}; + + REQUIRE(has_zero_flush_volume_for_used_filaments(matrix, multipliers, used_filaments)); + } + + SECTION("Two used filaments do not trigger warning when transitions are non-zero") + { + const std::vector matrix = { + 0.0, 280.0, + 280.0, 0.0 + }; + const std::vector used_filaments = {1, 2}; + + REQUIRE_FALSE(has_zero_flush_volume_for_used_filaments(matrix, multipliers, used_filaments)); + } + + SECTION("Zero multiplier still triggers warning when multiple filaments are used") + { + const std::vector matrix = { + 0.0, 280.0, + 280.0, 0.0 + }; + const std::vector zero_multiplier = {0.0}; + const std::vector used_filaments = {1, 2}; + + REQUIRE(has_zero_flush_volume_for_used_filaments(matrix, zero_multiplier, used_filaments)); + } +} + // TODO: https://github.com/SoftFever/OrcaSlicer/issues/11269 - Is this test still relevant? Delete if not. // It was failing so at least "nozzle_type" and "extruder_printable_area" could not be serialized // and an exception was thrown, but "nozzle_type" has been around for at least 3 months now. From c5aedd1cea4b00b30b67749ad69781a563a07e8b Mon Sep 17 00:00:00 2001 From: TheLegendTubaGuy <95944177+thelegendtubaguy@users.noreply.github.com> Date: Thu, 13 Aug 2026 16:25:52 -0500 Subject: [PATCH 104/106] Enable Snapmaker U1 bed type selector (#15174) --- resources/profiles/Snapmaker.json | 2 +- .../profiles/Snapmaker/machine/Snapmaker U1 (0.2 nozzle).json | 1 - .../profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json | 1 - .../profiles/Snapmaker/machine/Snapmaker U1 (0.6 nozzle).json | 1 - .../profiles/Snapmaker/machine/Snapmaker U1 (0.8 nozzle).json | 1 - resources/profiles/Snapmaker/machine/fdm_U1.json | 3 ++- 6 files changed, 3 insertions(+), 6 deletions(-) diff --git a/resources/profiles/Snapmaker.json b/resources/profiles/Snapmaker.json index ab2433242e..9a6fab7942 100644 --- a/resources/profiles/Snapmaker.json +++ b/resources/profiles/Snapmaker.json @@ -1,6 +1,6 @@ { "name": "Snapmaker", - "version": "02.04.00.08", + "version": "02.04.00.09", "force_update": "0", "description": "Snapmaker configurations", "machine_model_list": [ diff --git a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.2 nozzle).json index aebc032855..183e125c73 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.2 nozzle).json +++ b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.2 nozzle).json @@ -186,7 +186,6 @@ "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\nTIMELAPSE_TAKE_FRAME\nDEFECT_DETECTION_DETECT", "machine_pause_gcode": "M600", "nozzle_volume": "143", - "support_multi_bed_types": "0", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} CURRENT_LAYER={layer_num+1}", "default_print_profile": "0.10 Standard @Snapmaker U1 (0.2 nozzle)" } diff --git a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json index 28ccfd0a29..6d2ec2cfe6 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json +++ b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json @@ -186,7 +186,6 @@ "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\nTIMELAPSE_TAKE_FRAME\nDEFECT_DETECTION_DETECT", "default_print_profile": "0.20 Standard @Snapmaker U1 (0.4 nozzle)", "machine_pause_gcode": "M600", - "default_bed_type": "Textured PEI Plate", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} CURRENT_LAYER={layer_num+1}", "nozzle_volume": "143", "resonance_avoidance": "1", diff --git a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.6 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.6 nozzle).json index f4dff2f357..a6cb0d0bd3 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.6 nozzle).json +++ b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.6 nozzle).json @@ -187,6 +187,5 @@ "machine_pause_gcode": "M600", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} CURRENT_LAYER={layer_num+1}", "nozzle_volume": "143", - "support_multi_bed_types": "0", "default_print_profile": "0.30 Standard @Snapmaker U1 (0.6 nozzle)" } diff --git a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.8 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.8 nozzle).json index e356f4264b..ef4da1a516 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.8 nozzle).json +++ b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.8 nozzle).json @@ -187,6 +187,5 @@ "machine_pause_gcode": "M600", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} CURRENT_LAYER={layer_num+1}", "nozzle_volume": "143", - "support_multi_bed_types": "0", "default_print_profile": "0.40 Standard @Snapmaker U1 (0.8 nozzle)" } diff --git a/resources/profiles/Snapmaker/machine/fdm_U1.json b/resources/profiles/Snapmaker/machine/fdm_U1.json index 7ee65878e6..717215b507 100644 --- a/resources/profiles/Snapmaker/machine/fdm_U1.json +++ b/resources/profiles/Snapmaker/machine/fdm_U1.json @@ -183,7 +183,8 @@ "scan_first_layer": "0", "nozzle_type": "undefine", "auxiliary_fan": "0", - "default_bed_type": "Textured PEI Plate", + "support_multi_bed_types": "1", + "default_bed_type": "4", "printable_area": [ "0.5x1", "270.5x1", From 0225cadff03e6750cfb505ca00aae37ce67b9a54 Mon Sep 17 00:00:00 2001 From: TheLegendTubaGuy <95944177+thelegendtubaguy@users.noreply.github.com> Date: Thu, 13 Aug 2026 16:57:08 -0500 Subject: [PATCH 105/106] Fix PLA/PETG warning wiki link (#15172) --- src/slic3r/GUI/GLCanvas3D.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index d0eb79881b..a51a10296c 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -10602,9 +10602,8 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state) wxString region = L"en"; if (language.find("zh") == 0) region = L"zh"; - // Use the generic dual-nozzle PLA+PETG guide rather than the H2D-specific page - // so the link is relevant for all dual-extrusion printers, not just Bambu H2D. (#12073) - wxGetApp().open_browser_with_warning_dialog(wxString::Format(L"https://wiki.bambulab.com/%s/filament-acc/filament/pla-and-petg-dual-extrusion", region)); + // Although this link looks like it's only for the H2D, its guidance is generic. + wxGetApp().open_browser_with_warning_dialog(wxString::Format(L"https://wiki.bambulab.com/%s/filament-acc/filament/h2d-pla-and-petg-mutual-support", region)); return false; }); } From d5dbd96dd64b830076c81053ed5fda26d5a1771b Mon Sep 17 00:00:00 2001 From: Manzari <22736528+manzari@users.noreply.github.com> Date: Fri, 14 Aug 2026 02:52:52 +0200 Subject: [PATCH 106/106] Skip filament_colour_type in G-code config block to fix Anycubic Kobra 3 parse crash (#13507) Co-authored-by: manzari Co-authored-by: Claude Opus 4.7 (1M context) Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com> --- src/libslic3r/GCode.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 8e2e9f713c..18d805936e 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -6726,6 +6726,7 @@ void GCode::append_full_config(const Print &print, std::string &str) "farthest_point_timelapse"sv, "compatible_printers"sv, "compatible_prints"sv, + "filament_colour_type"sv, "print_host"sv, "print_host_webui"sv, "printhost_apikey"sv,