From 3a43050ad109fdbe3be1f908ef555f1b6fe03c71 Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Sun, 22 Dec 2024 16:32:24 +0800 Subject: [PATCH 01/33] Remove some unused functions from Arachne perimeter generator. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cherry-picked from prusa3d/PrusaSlicer@e704d8216dc966db8889c0c6cefb10f6f60c19d8 Co-authored-by: Lukáš Hejl --- .../Arachne/SkeletalTrapezoidation.cpp | 14 ++++------ .../Arachne/SkeletalTrapezoidationGraph.cpp | 2 +- .../Arachne/SkeletalTrapezoidationGraph.hpp | 2 +- .../Arachne/utils/ExtrusionJunction.cpp | 18 ------------- .../Arachne/utils/ExtrusionJunction.hpp | 6 +++-- src/libslic3r/Arachne/utils/ExtrusionLine.cpp | 9 ------- src/libslic3r/Arachne/utils/ExtrusionLine.hpp | 5 ---- .../Arachne/utils/SparsePointGrid.hpp | 27 ------------------- src/libslic3r/Arachne/utils/SquareGrid.cpp | 5 +++- src/libslic3r/CMakeLists.txt | 1 - 10 files changed, 15 insertions(+), 74 deletions(-) delete mode 100644 src/libslic3r/Arachne/utils/ExtrusionJunction.cpp diff --git a/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp b/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp index 19d49c3e12f..0cbfedef697 100644 --- a/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp +++ b/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp @@ -152,8 +152,7 @@ void SkeletalTrapezoidation::transferEdge(Point from, Point to, const VD::edge_t assert(twin->prev->twin); // Back rib assert(twin->prev->twin->prev); // Prev segment along parabola - constexpr bool is_not_next_to_start_or_end = false; // Only ribs at the end of a cell should be skipped - graph.makeRib(prev_edge, start_source_point, end_source_point, is_not_next_to_start_or_end); + graph.makeRib(prev_edge, start_source_point, end_source_point); } assert(prev_edge); } @@ -203,10 +202,8 @@ void SkeletalTrapezoidation::transferEdge(Point from, Point to, const VD::edge_t p0 = p1; v0 = v1; - if (p1_idx < discretized.size() - 1) - { // Rib for last segment gets introduced outside this function! - constexpr bool is_not_next_to_start_or_end = false; // Only ribs at the end of a cell should be skipped - graph.makeRib(prev_edge, start_source_point, end_source_point, is_not_next_to_start_or_end); + if (p1_idx < discretized.size() - 1) { // Rib for last segment gets introduced outside this function! + graph.makeRib(prev_edge, start_source_point, end_source_point); } } assert(prev_edge); @@ -462,8 +459,7 @@ void SkeletalTrapezoidation::constructFromPolygons(const Polygons& polys) node_t *starting_node = vd_node_to_he_node[starting_voronoi_edge->vertex0()]; starting_node->data.distance_to_boundary = 0; - constexpr bool is_next_to_start_or_end = true; - graph.makeRib(prev_edge, start_source_point, end_source_point, is_next_to_start_or_end); + graph.makeRib(prev_edge, start_source_point, end_source_point); for (const VD::edge_type* vd_edge = starting_voronoi_edge->next(); vd_edge != ending_voronoi_edge; vd_edge = vd_edge->next()) { assert(vd_edge->is_finite()); assert(Geometry::VoronoiUtils::is_in_range(*vd_edge)); @@ -471,7 +467,7 @@ void SkeletalTrapezoidation::constructFromPolygons(const Polygons& polys) Point v1 = Geometry::VoronoiUtils::to_point(vd_edge->vertex0()).cast(); Point v2 = Geometry::VoronoiUtils::to_point(vd_edge->vertex1()).cast(); transferEdge(v1, v2, *vd_edge, prev_edge, start_source_point, end_source_point, segments); - graph.makeRib(prev_edge, start_source_point, end_source_point, vd_edge->next() == ending_voronoi_edge); + graph.makeRib(prev_edge, start_source_point, end_source_point); } transferEdge(Geometry::VoronoiUtils::to_point(ending_voronoi_edge->vertex0()).cast(), end_source_point, *ending_voronoi_edge, prev_edge, start_source_point, end_source_point, segments); diff --git a/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.cpp b/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.cpp index c49340ec596..dc0acd532ae 100644 --- a/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.cpp +++ b/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.cpp @@ -315,7 +315,7 @@ void SkeletalTrapezoidationGraph::collapseSmallEdges(coord_t snap_dist) } } -void SkeletalTrapezoidationGraph::makeRib(edge_t*& prev_edge, Point start_source_point, Point end_source_point, bool is_next_to_start_or_end) +void SkeletalTrapezoidationGraph::makeRib(edge_t*& prev_edge, Point start_source_point, Point end_source_point) { Point p; Line(start_source_point, end_source_point).distance_to_infinite_squared(prev_edge->to->p, &p); diff --git a/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.hpp b/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.hpp index cfdbfecdafc..bae84cb9553 100644 --- a/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.hpp +++ b/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.hpp @@ -83,7 +83,7 @@ class SkeletalTrapezoidationGraph: public HalfEdgeGraphw; -} - void ExtrusionLine::simplify(const int64_t smallest_line_segment_squared, const int64_t allowed_error_distance_squared, const int64_t maximum_extrusion_area_deviation) { const size_t min_path_size = is_closed ? 3 : 2; diff --git a/src/libslic3r/Arachne/utils/ExtrusionLine.hpp b/src/libslic3r/Arachne/utils/ExtrusionLine.hpp index 8438a4c0035..11b9d005bad 100644 --- a/src/libslic3r/Arachne/utils/ExtrusionLine.hpp +++ b/src/libslic3r/Arachne/utils/ExtrusionLine.hpp @@ -136,11 +136,6 @@ struct ExtrusionLine return ret; } - /*! - * Get the minimal width of this path - */ - coord_t getMinimalWidth() const; - /*! * Removes vertices of the ExtrusionLines to make sure that they are not too high * resolution. diff --git a/src/libslic3r/Arachne/utils/SparsePointGrid.hpp b/src/libslic3r/Arachne/utils/SparsePointGrid.hpp index 31c1965357b..127380b3eb9 100644 --- a/src/libslic3r/Arachne/utils/SparsePointGrid.hpp +++ b/src/libslic3r/Arachne/utils/SparsePointGrid.hpp @@ -6,7 +6,6 @@ #define UTILS_SPARSE_POINT_GRID_H #include -#include #include #include "SparseGrid.hpp" @@ -40,16 +39,6 @@ template class SparsePointGrid : public SparseGrid::GridPoint; @@ -69,22 +58,6 @@ void SparsePointGrid::insert(const Elem &elem) SparseGrid::m_grid.emplace(grid_loc, elem); } -template -const ElemT *SparsePointGrid::getAnyNearby(const Point &query_pt, coord_t radius) -{ - const ElemT *ret = nullptr; - const std::function &process_func = [&ret, query_pt, radius, this](const ElemT &maybe_nearby) { - if (shorter_then(m_locator(maybe_nearby) - query_pt, radius)) { - ret = &maybe_nearby; - return false; - } - return true; - }; - SparseGrid::processNearby(query_pt, radius, process_func); - - return ret; -} - } // namespace Slic3r::Arachne #endif // UTILS_SPARSE_POINT_GRID_H diff --git a/src/libslic3r/Arachne/utils/SquareGrid.cpp b/src/libslic3r/Arachne/utils/SquareGrid.cpp index ae899657954..1af99104262 100644 --- a/src/libslic3r/Arachne/utils/SquareGrid.cpp +++ b/src/libslic3r/Arachne/utils/SquareGrid.cpp @@ -2,7 +2,10 @@ //CuraEngine is released under the terms of the AGPLv3 or higher. #include "SquareGrid.hpp" -#include "../../Point.hpp" + +#include + +#include "libslic3r/Point.hpp" using namespace Slic3r::Arachne; diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 2c362dba23e..7781000f66b 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -420,7 +420,6 @@ set(lisbslic3r_sources Arachne/BeadingStrategy/WideningBeadingStrategy.hpp Arachne/BeadingStrategy/WideningBeadingStrategy.cpp Arachne/utils/ExtrusionJunction.hpp - Arachne/utils/ExtrusionJunction.cpp Arachne/utils/ExtrusionLine.hpp Arachne/utils/ExtrusionLine.cpp Arachne/utils/HalfEdge.hpp From 862acea2af4f29eb37e20ef4a757bd0708343bd5 Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Sun, 22 Dec 2024 16:44:36 +0800 Subject: [PATCH 02/33] SPE-2298: Fix crash caused by a numerical issue during testing if a Voronoi vertex is inside a corner of a polygon. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cherry-picked from prusa3d/PrusaSlicer@669c931b7743ef74dd005819449b27a1544018c3 Co-authored-by: Lukáš Hejl --- .../Arachne/SkeletalTrapezoidation.cpp | 60 ++++--------------- .../Arachne/SkeletalTrapezoidation.hpp | 28 +-------- .../Arachne/SkeletalTrapezoidationGraph.cpp | 3 +- .../Arachne/SkeletalTrapezoidationGraph.hpp | 2 +- src/libslic3r/Arachne/utils/linearAlg2D.hpp | 57 ------------------ src/libslic3r/Geometry.cpp | 46 ++++++++++++++ src/libslic3r/Geometry.hpp | 17 ++++++ src/libslic3r/Geometry/VoronoiUtils.cpp | 58 ++++++++++++++++++ src/libslic3r/Geometry/VoronoiUtils.hpp | 54 ++++++++++++++--- 9 files changed, 181 insertions(+), 144 deletions(-) diff --git a/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp b/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp index 0cbfedef697..f1e03d225ee 100644 --- a/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp +++ b/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp @@ -7,7 +7,6 @@ #include #include #include -#include #include #include "utils/linearAlg2D.hpp" @@ -104,7 +103,7 @@ SkeletalTrapezoidation::node_t &SkeletalTrapezoidation::makeNode(const VD::verte } } -void SkeletalTrapezoidation::transferEdge(Point from, Point to, const VD::edge_type &vd_edge, edge_t *&prev_edge, Point &start_source_point, Point &end_source_point, const std::vector &segments) { +void SkeletalTrapezoidation::transferEdge(const Point &from, const Point &to, const VD::edge_type &vd_edge, edge_t *&prev_edge, const Point &start_source_point, const Point &end_source_point, const std::vector &segments) { auto he_edge_it = vd_edge_to_he_edge.find(vd_edge.twin()); if (he_edge_it != vd_edge_to_he_edge.end()) { // Twin segment(s) have already been made @@ -323,50 +322,6 @@ Points SkeletalTrapezoidation::discretize(const VD::edge_type& vd_edge, const st } } -bool SkeletalTrapezoidation::computePointCellRange(const VD::cell_type &cell, Point &start_source_point, Point &end_source_point, const VD::edge_type *&starting_vd_edge, const VD::edge_type *&ending_vd_edge, const std::vector &segments) { - if (cell.incident_edge()->is_infinite()) - return false; //Infinite edges only occur outside of the polygon. Don't copy any part of this cell. - - // Check if any point of the cell is inside or outside polygon - // Copy whole cell into graph or not at all - - // If the cell.incident_edge()->vertex0() is far away so much that it doesn't even fit into Vec2i64, then there is no way that it will be inside the input polygon. - if (const VD::vertex_type &vert = *cell.incident_edge()->vertex0(); - vert.x() >= double(std::numeric_limits::max()) || vert.x() <= double(std::numeric_limits::lowest()) || - vert.y() >= double(std::numeric_limits::max()) || vert.y() <= double(std::numeric_limits::lowest())) - return false; // Don't copy any part of this cell - - const Point source_point = Geometry::VoronoiUtils::get_source_point(cell, segments.begin(), segments.end()); - const PolygonsPointIndex source_point_index = Geometry::VoronoiUtils::get_source_point_index(cell, segments.begin(), segments.end()); - Vec2i64 some_point = Geometry::VoronoiUtils::to_point(cell.incident_edge()->vertex0()); - if (some_point == source_point.cast()) - some_point = Geometry::VoronoiUtils::to_point(cell.incident_edge()->vertex1()); - - //Test if the some_point is even inside the polygon. - //The edge leading out of a polygon must have an endpoint that's not in the corner following the contour of the polygon at that vertex. - //So if it's inside the corner formed by the polygon vertex, it's all fine. - //But if it's outside of the corner, it must be a vertex of the Voronoi diagram that goes outside of the polygon towards infinity. - if (!LinearAlg2D::isInsideCorner(source_point_index.prev().p(), source_point_index.p(), source_point_index.next().p(), some_point)) - return false; // Don't copy any part of this cell - - const VD::edge_type* vd_edge = cell.incident_edge(); - do { - assert(vd_edge->is_finite()); - if (Vec2i64 p1 = Geometry::VoronoiUtils::to_point(vd_edge->vertex1()); p1 == source_point.cast()) { - start_source_point = source_point; - end_source_point = source_point; - starting_vd_edge = vd_edge->next(); - ending_vd_edge = vd_edge; - } else { - assert((Geometry::VoronoiUtils::to_point(vd_edge->vertex0()) == source_point.cast() || !vd_edge->is_secondary()) && "point cells must end in the point! They cannot cross the point with an edge, because collinear edges are not allowed in the input."); - } - } - while (vd_edge = vd_edge->next(), vd_edge != cell.incident_edge()); - assert(starting_vd_edge && ending_vd_edge); - assert(starting_vd_edge != ending_vd_edge); - return true; -} - SkeletalTrapezoidation::SkeletalTrapezoidation(const Polygons& polys, const BeadingStrategy& beading_strategy, double transitioning_angle, coord_t discretization_step_size, coord_t transition_filter_dist, coord_t allowed_filter_deviation, @@ -434,15 +389,20 @@ void SkeletalTrapezoidation::constructFromPolygons(const Polygons& polys) // Compute and store result in above variables if (cell.contains_point()) { - const bool keep_going = computePointCellRange(cell, start_source_point, end_source_point, starting_voronoi_edge, ending_voronoi_edge, segments); - if (!keep_going) + Geometry::PointCellRange cell_range = Geometry::VoronoiUtils::compute_point_cell_range(cell, segments.cbegin(), segments.cend()); + start_source_point = cell_range.source_point; + end_source_point = cell_range.source_point; + starting_voronoi_edge = cell_range.edge_begin; + ending_voronoi_edge = cell_range.edge_end; + + if (!cell_range.is_valid()) continue; } else { assert(cell.contains_segment()); Geometry::SegmentCellRange cell_range = Geometry::VoronoiUtils::compute_segment_cell_range(cell, segments.cbegin(), segments.cend()); assert(cell_range.is_valid()); - start_source_point = cell_range.segment_start_point; - end_source_point = cell_range.segment_end_point; + start_source_point = cell_range.source_segment_start_point; + end_source_point = cell_range.source_segment_end_point; starting_voronoi_edge = cell_range.edge_begin; ending_voronoi_edge = cell_range.edge_end; } diff --git a/src/libslic3r/Arachne/SkeletalTrapezoidation.hpp b/src/libslic3r/Arachne/SkeletalTrapezoidation.hpp index ca8e13473f5..3bd00f839bc 100644 --- a/src/libslic3r/Arachne/SkeletalTrapezoidation.hpp +++ b/src/libslic3r/Arachne/SkeletalTrapezoidation.hpp @@ -182,7 +182,7 @@ class SkeletalTrapezoidation * Transfer an edge from the VD to the HE and perform discretization of parabolic edges (and vertex-vertex edges) * \p prev_edge serves as input and output. May be null as input. */ - void transferEdge(Point from, Point to, const VD::edge_type &vd_edge, edge_t *&prev_edge, Point &start_source_point, Point &end_source_point, const std::vector &segments); + void transferEdge(const Point &from, const Point &to, const VD::edge_type &vd_edge, edge_t *&prev_edge, const Point &start_source_point, const Point &end_source_point, const std::vector &segments); /*! * Discretize a Voronoi edge that represents the medial axis of a vertex- @@ -211,32 +211,6 @@ class SkeletalTrapezoidation */ Points discretize(const VD::edge_type& segment, const std::vector& segments); - /*! - * Compute the range of line segments that surround a cell of the skeletal - * graph that belongs to a point on the medial axis. - * - * This should only be used on cells that belong to a corner in the skeletal - * graph, e.g. triangular cells, not trapezoid cells. - * - * The resulting line segments is just the first and the last segment. They - * are linked to the neighboring segments, so you can iterate over the - * segments until you reach the last segment. - * \param cell The cell to compute the range of line segments for. - * \param[out] start_source_point The start point of the source segment of - * this cell. - * \param[out] end_source_point The end point of the source segment of this - * cell. - * \param[out] starting_vd_edge The edge of the Voronoi diagram where the - * loop around the cell starts. - * \param[out] ending_vd_edge The edge of the Voronoi diagram where the loop - * around the cell ends. - * \param points All vertices of the input Polygons. - * \param segments All edges of the input Polygons. - * /return Whether the cell is inside of the polygon. If it's outside of the - * polygon we should skip processing it altogether. - */ - static bool computePointCellRange(const VD::cell_type &cell, Point &start_source_point, Point &end_source_point, const VD::edge_type *&starting_vd_edge, const VD::edge_type *&ending_vd_edge, const std::vector &segments); - /*! * For VD cells associated with an input polygon vertex, we need to separate the node at the end and start of the cell into two * That way we can reach both the quad_start and the quad_end from the [incident_edge] of the two new nodes diff --git a/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.cpp b/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.cpp index dc0acd532ae..686a6055f85 100644 --- a/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.cpp +++ b/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.cpp @@ -315,8 +315,7 @@ void SkeletalTrapezoidationGraph::collapseSmallEdges(coord_t snap_dist) } } -void SkeletalTrapezoidationGraph::makeRib(edge_t*& prev_edge, Point start_source_point, Point end_source_point) -{ +void SkeletalTrapezoidationGraph::makeRib(edge_t *&prev_edge, const Point &start_source_point, const Point &end_source_point) { Point p; Line(start_source_point, end_source_point).distance_to_infinite_squared(prev_edge->to->p, &p); coord_t dist = (prev_edge->to->p - p).cast().norm(); diff --git a/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.hpp b/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.hpp index bae84cb9553..33e43156ecb 100644 --- a/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.hpp +++ b/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.hpp @@ -83,7 +83,7 @@ class SkeletalTrapezoidationGraph: public HalfEdgeGraph Point { - int64_t _len = p0.norm(); - if (_len < 1) - return {len, 0}; - return (p0.cast() * int64_t(len) / _len).cast(); - }; - - auto rotate_90_degree_ccw = [](const Vec2d &p) -> Vec2d { - return {-p.y(), p.x()}; - }; - - constexpr coord_t normal_length = 10000; //Create a normal vector of reasonable length in order to reduce rounding error. - const Point ba = normal(a - b, normal_length); - const Point bc = normal(c - b, normal_length); - const Vec2d bq = query_point.cast() - b.cast(); - const Vec2d perpendicular = rotate_90_degree_ccw(bq); //The query projects to this perpendicular to coordinate 0. - - const double project_a_perpendicular = ba.cast().dot(perpendicular); //Project vertex A on the perpendicular line. - const double project_c_perpendicular = bc.cast().dot(perpendicular); //Project vertex C on the perpendicular line. - if ((project_a_perpendicular > 0.) != (project_c_perpendicular > 0.)) //Query is between A and C on the projection. - { - return project_a_perpendicular > 0.; //Due to the winding order of corner ABC, this means that the query is inside. - } - else //Beyond either A or C, but it could still be inside of the polygon. - { - const double project_a_parallel = ba.cast().dot(bq); //Project not on the perpendicular, but on the original. - const double project_c_parallel = bc.cast().dot(bq); - - //Either: - // * A is to the right of B (project_a_perpendicular > 0) and C is below A (project_c_parallel < project_a_parallel), or - // * A is to the left of B (project_a_perpendicular < 0) and C is above A (project_c_parallel > project_a_parallel). - return (project_c_parallel < project_a_parallel) == (project_a_perpendicular > 0.); - } -} - /*! * Returns the determinant of the 2D matrix defined by the the vectors ab and ap as rows. * diff --git a/src/libslic3r/Geometry.cpp b/src/libslic3r/Geometry.cpp index 3e67d4e1ba4..7c89a5c00ae 100644 --- a/src/libslic3r/Geometry.cpp +++ b/src/libslic3r/Geometry.cpp @@ -839,4 +839,50 @@ TransformationSVD::TransformationSVD(const Transform3d& trafo) return curMat; } +bool is_point_inside_polygon_corner(const Point &a, const Point &b, const Point &c, const Point &query_point) { + // Cast all input points into int64_t to prevent overflows when points are close to max values of coord_t. + const Vec2i64 a_i64 = a.cast(); + const Vec2i64 b_i64 = b.cast(); + const Vec2i64 c_i64 = c.cast(); + const Vec2i64 query_point_i64 = query_point.cast(); + + // Shift all points to have a base in vertex B. + // Then construct normalized vectors to ensure that we will work with vectors with endpoints on the unit circle. + const Vec2d ba = (a_i64 - b_i64).cast().normalized(); + const Vec2d bc = (c_i64 - b_i64).cast().normalized(); + const Vec2d bq = (query_point_i64 - b_i64).cast().normalized(); + + // Points A and C has to be different. + assert(ba != bc); + + // Construct a normal for the vector BQ that points to the left side of the vector BQ. + const Vec2d bq_left_normal = perp(bq); + + const double proj_a_on_bq_normal = ba.dot(bq_left_normal); // Project point A on the normal of BQ. + const double proj_c_on_bq_normal = bc.dot(bq_left_normal); // Project point C on the normal of BQ. + if ((proj_a_on_bq_normal > 0. && proj_c_on_bq_normal <= 0.) || (proj_a_on_bq_normal <= 0. && proj_c_on_bq_normal > 0.)) { + // Q is between points A and C or lies on one of those vectors (BA or BC). + + // Based on the CCW order of polygons (contours) and order of corner ABC, + // when this condition is met, the query point is inside the corner. + return proj_a_on_bq_normal > 0.; + } else { + // Q isn't between points A and C, but still it can be inside the corner. + + const double proj_a_on_bq = ba.dot(bq); // Project point A on BQ. + const double proj_c_on_bq = bc.dot(bq); // Project point C on BQ. + + // The value of proj_a_on_bq_normal is the same when we project the vector BA on the normal of BQ. + // So we can say that the Q is on the right side of the vector BA when proj_a_on_bq_normal > 0, and + // that the Q is on the left side of the vector BA proj_a_on_bq_normal < 0. + // Also, the Q is on the right side of the bisector of oriented angle ABC when proj_c_on_bq < proj_a_on_bq, and + // the Q is on the left side of the bisector of oriented angle ABC when proj_c_on_bq > proj_a_on_bq. + + // So the Q is inside the corner when one of the following conditions is met: + // * The Q is on the right side of the vector BA, and the Q is on the right side of the bisector of the oriented angle ABC. + // * The Q is on the left side of the vector BA, and the Q is on the left side of the bisector of the oriented angle ABC. + return (proj_a_on_bq_normal > 0. && proj_c_on_bq < proj_a_on_bq) || (proj_a_on_bq_normal <= 0. && proj_c_on_bq >= proj_a_on_bq); + } +} + }} // namespace Slic3r::Geometry diff --git a/src/libslic3r/Geometry.hpp b/src/libslic3r/Geometry.hpp index 8183dcb7e81..0383aadb07e 100644 --- a/src/libslic3r/Geometry.hpp +++ b/src/libslic3r/Geometry.hpp @@ -545,6 +545,23 @@ inline bool is_rotation_ninety_degrees(const Vec3d &rotation) } Transformation mat_around_a_point_rotate(const Transformation& innMat, const Vec3d &pt, const Vec3d &axis, float rotate_theta_radian); + +/** + * Checks if a given point is inside a corner of a polygon. + * + * The corner of a polygon is defined by three points A, B, C in counterclockwise order. + * + * Adapted from CuraEngine LinearAlg2D::isInsideCorner by Tim Kuipers @BagelOrb + * and @Ghostkeeper. + * + * @param a The first point of the corner. + * @param b The second point of the corner (the common vertex of the two edges forming the corner). + * @param c The third point of the corner. + * @param query_point The point to be checked if is inside the corner. + * @return True if the query point is inside the corner, false otherwise. + */ +bool is_point_inside_polygon_corner(const Point &a, const Point &b, const Point &c, const Point &query_point); + } } // namespace Slicer::Geometry #endif diff --git a/src/libslic3r/Geometry/VoronoiUtils.cpp b/src/libslic3r/Geometry/VoronoiUtils.cpp index f126258d280..33a68f8b19f 100644 --- a/src/libslic3r/Geometry/VoronoiUtils.cpp +++ b/src/libslic3r/Geometry/VoronoiUtils.cpp @@ -2,6 +2,7 @@ #include #include +#include #include "VoronoiUtils.hpp" #include "libslic3r.h" @@ -28,6 +29,7 @@ template SegmentCellRange VoronoiUtils::compute_segment_cell_range(const template SegmentCellRange VoronoiUtils::compute_segment_cell_range(const VoronoiDiagram::cell_type &, VD::SegmentIt, VD::SegmentIt); template SegmentCellRange VoronoiUtils::compute_segment_cell_range(const VoronoiDiagram::cell_type &, ColoredLinesConstIt, ColoredLinesConstIt); template SegmentCellRange VoronoiUtils::compute_segment_cell_range(const VoronoiDiagram::cell_type &, PolygonsSegmentIndexConstIt, PolygonsSegmentIndexConstIt); +template PointCellRange VoronoiUtils::compute_point_cell_range(const VoronoiDiagram::cell_type &, PolygonsSegmentIndexConstIt, PolygonsSegmentIndexConstIt); template Points VoronoiUtils::discretize_parabola(const Point &, const Arachne::PolygonsSegmentIndex &, const Point &, const Point &, coord_t, float); template Arachne::PolygonsPointIndex VoronoiUtils::get_source_point_index(const VoronoiDiagram::cell_type &, PolygonsSegmentIndexConstIt, PolygonsSegmentIndexConstIt); @@ -245,6 +247,62 @@ VoronoiUtils::compute_segment_cell_range(const VD::cell_type &cell, const Segmen return cell_range; } +template +typename boost::polygon::enable_if< + typename boost::polygon::gtl_if::value_type>::type>::type>::type, + Geometry::PointCellRange< + typename boost::polygon::segment_point_type::value_type>::type>>::type +VoronoiUtils::compute_point_cell_range(const VD::cell_type &cell, const SegmentIterator segment_begin, const SegmentIterator segment_end) +{ + using Segment = typename std::iterator_traits::value_type; + using Point = typename boost::polygon::segment_point_type::type; + using PointCellRange = PointCellRange; + using CoordType = typename Point::coord_type; + + const Point source_point = Geometry::VoronoiUtils::get_source_point(cell, segment_begin, segment_end); + + // We want to ignore (by returning PointCellRange without assigned edge_begin and edge_end) cells outside the input polygon. + PointCellRange cell_range(source_point); + + const VD::edge_type *edge = cell.incident_edge(); + if (edge->is_infinite() || !is_in_range(*edge)) { + // Ignore infinite edges, because they only occur outside the polygon. + // Also ignore edges with endpoints that don't fit into CoordType, because such edges are definitely outside the polygon. + return cell_range; + } + + const Arachne::PolygonsPointIndex source_point_idx = Geometry::VoronoiUtils::get_source_point_index(cell, segment_begin, segment_end); + const Point edge_v0 = Geometry::VoronoiUtils::to_point(edge->vertex0()).template cast(); + const Point edge_v1 = Geometry::VoronoiUtils::to_point(edge->vertex1()).template cast(); + const Point edge_query_point = (edge_v0 == source_point) ? edge_v1 : edge_v0; + + // Check if the edge has another endpoint inside the corner of the polygon. + if (!Geometry::is_point_inside_polygon_corner(source_point_idx.prev().p(), source_point_idx.p(), source_point_idx.next().p(), edge_query_point)) { + // If the endpoint isn't inside the corner of the polygon, it means that + // the whole cell isn't inside the polygons, and we will ignore such cells. + return cell_range; + } + + const Vec2i64 source_point_i64 = source_point.template cast(); + edge = cell.incident_edge(); + do { + assert(edge->is_finite()); + + if (Vec2i64 v1 = Geometry::VoronoiUtils::to_point(edge->vertex1()); v1 == source_point_i64) { + cell_range.edge_begin = edge->next(); + cell_range.edge_end = edge; + } else { + // FIXME @hejllukas: With Arachne, we don't support polygons with collinear edges, + // because with collinear edges we have to handle secondary edges. + // Such edges goes through the endpoints of the input segments. + assert((Geometry::VoronoiUtils::to_point(edge->vertex0()) == source_point_i64 || edge->is_primary()) && "Point cells must end in the point! They cannot cross the point with an edge, because collinear edges are not allowed in the input."); + } + } while (edge = edge->next(), edge != cell.incident_edge()); + + return cell_range; +} + Vec2i64 VoronoiUtils::to_point(const VD::vertex_type *vertex) { assert(vertex != nullptr); diff --git a/src/libslic3r/Geometry/VoronoiUtils.hpp b/src/libslic3r/Geometry/VoronoiUtils.hpp index bf63914677b..9c915e223b5 100644 --- a/src/libslic3r/Geometry/VoronoiUtils.hpp +++ b/src/libslic3r/Geometry/VoronoiUtils.hpp @@ -11,19 +11,32 @@ namespace Slic3r::Geometry { // Represent trapezoid Voronoi cell around segment. template struct SegmentCellRange { - const PT segment_start_point; // The start point of the source segment of this cell. - const PT segment_end_point; // The end point of the source segment of this cell. - const VD::edge_type *edge_begin = nullptr; // The edge of the Voronoi diagram where the loop around the cell starts. - const VD::edge_type *edge_end = nullptr; // The edge of the Voronoi diagram where the loop around the cell ends. + const PT source_segment_start_point; // The start point of the source segment of this cell. + const PT source_segment_end_point; // The end point of the source segment of this cell. + const VD::edge_type *edge_begin = nullptr; // The edge of the Voronoi diagram where the loop around the cell starts. + const VD::edge_type *edge_end = nullptr; // The edge of the Voronoi diagram where the loop around the cell ends. SegmentCellRange() = delete; - explicit SegmentCellRange(const PT &segment_start_point, const PT &segment_end_point) - : segment_start_point(segment_start_point), segment_end_point(segment_end_point) + explicit SegmentCellRange(const PT &source_segment_start_point, const PT &source_segment_end_point) + : source_segment_start_point(source_segment_start_point), source_segment_end_point(source_segment_end_point) {} bool is_valid() const { return edge_begin && edge_end && edge_begin != edge_end; } }; +// Represent trapezoid Voronoi cell around point. +template struct PointCellRange +{ + const PT source_point; // The source point of this cell. + const VD::edge_type *edge_begin = nullptr; // The edge of the Voronoi diagram where the loop around the cell starts. + const VD::edge_type *edge_end = nullptr; // The edge of the Voronoi diagram where the loop around the cell ends. + + PointCellRange() = delete; + explicit PointCellRange(const PT &source_point) : source_point(source_point) {} + + bool is_valid() const { return edge_begin && edge_end && edge_begin != edge_end; } +}; + class VoronoiUtils { public: @@ -80,7 +93,7 @@ class VoronoiUtils * are linked to the neighboring segments, so you can iterate over the * segments until you reach the last segment. * - * Adapted from CuraEngine VoronoiUtils::computePointCellRange by Tim Kuipers @BagelOrb, + * Adapted from CuraEngine VoronoiUtils::computeSegmentCellRange by Tim Kuipers @BagelOrb, * Jaime van Kessel @nallath, Remco Burema @rburema and @Ghostkeeper. * * @param cell The cell to compute the range of line segments for. @@ -96,6 +109,33 @@ class VoronoiUtils typename boost::polygon::segment_point_type::value_type>::type>>::type compute_segment_cell_range(const VD::cell_type &cell, SegmentIterator segment_begin, SegmentIterator segment_end); + /** + * Compute the range of line segments that surround a cell of the skeletal + * graph that belongs to a point on the medial axis. + * + * This should only be used on cells that belong to a corner in the skeletal + * graph, e.g. triangular cells, not trapezoid cells. + * + * The resulting line segments is just the first and the last segment. They + * are linked to the neighboring segments, so you can iterate over the + * segments until you reach the last segment. + * + * Adapted from CuraEngine VoronoiUtils::computePointCellRange by Tim Kuipers @BagelOrb + * Jaime van Kessel @nallath, Remco Burema @rburema and @Ghostkeeper. + * + * @param cell The cell to compute the range of line segments for. + * @param segment_begin Begin iterator for all edges of the input Polygons. + * @param segment_end End iterator for all edges of the input Polygons. + * @return Range of line segments that surround the cell. + */ + template + static typename boost::polygon::enable_if< + typename boost::polygon::gtl_if::value_type>::type>::type>::type, + Geometry::PointCellRange< + typename boost::polygon::segment_point_type::value_type>::type>>::type + compute_point_cell_range(const VD::cell_type &cell, SegmentIterator segment_begin, SegmentIterator segment_end); + template static bool is_in_range(double value) { return double(std::numeric_limits::lowest()) <= value && value <= double(std::numeric_limits::max()); From 44e53c90f061f589749b631316f6b2e9d4e30f8f Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Sun, 22 Dec 2024 16:45:37 +0800 Subject: [PATCH 03/33] Add missing header guards to VoronoiVisualUtils. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cherry-picked from prusa3d/PrusaSlicer@34d9b0678b5f0ce97dfb10a1de8ab48585fa2503 Co-authored-by: Lukáš Hejl --- src/libslic3r/Geometry/VoronoiVisualUtils.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/libslic3r/Geometry/VoronoiVisualUtils.hpp b/src/libslic3r/Geometry/VoronoiVisualUtils.hpp index 177f27293a2..c89d59bf9a0 100644 --- a/src/libslic3r/Geometry/VoronoiVisualUtils.hpp +++ b/src/libslic3r/Geometry/VoronoiVisualUtils.hpp @@ -1,3 +1,6 @@ +#ifndef slic3r_VoronoiVisualUtils_hpp_ +#define slic3r_VoronoiVisualUtils_hpp_ + #include #include @@ -451,3 +454,5 @@ static inline void dump_voronoi_to_svg( } } // namespace Slic3r + +#endif // slic3r_VoronoiVisualUtils_hpp_ From 4b739539a46c1ad30fff58edf2be5b3e7a068c30 Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Sun, 22 Dec 2024 17:01:54 +0800 Subject: [PATCH 04/33] SPE-2298: Add detection of Voronoi diagram with parabolic edge without a focus point. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cherry-picked from prusa3d/PrusaSlicer@c44ffed475f55f5203142c20005568b497e6362d Co-authored-by: Lukáš Hejl --- src/libslic3r/Geometry/Voronoi.cpp | 18 +++++++++++++----- src/libslic3r/Geometry/Voronoi.hpp | 8 ++++++-- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/libslic3r/Geometry/Voronoi.cpp b/src/libslic3r/Geometry/Voronoi.cpp index 58923b9ada6..32dc5f14889 100644 --- a/src/libslic3r/Geometry/Voronoi.cpp +++ b/src/libslic3r/Geometry/Voronoi.cpp @@ -35,6 +35,8 @@ VoronoiDiagram::construct_voronoi(const SegmentIterator segment_begin, const Seg BOOST_LOG_TRIVIAL(warning) << "Detected Voronoi edge intersecting input segment, input polygons will be rotated back and forth."; } else if (m_issue_type == IssueType::FINITE_EDGE_WITH_NON_FINITE_VERTEX) { BOOST_LOG_TRIVIAL(warning) << "Detected finite Voronoi vertex with non finite vertex, input polygons will be rotated back and forth."; + } else if (m_issue_type == IssueType::PARABOLIC_VORONOI_EDGE_WITHOUT_FOCUS_POINT) { + BOOST_LOG_TRIVIAL(warning) << "Detected parabolic Voronoi edges without focus point, input polygons will be rotated back and forth."; } else { BOOST_LOG_TRIVIAL(error) << "Detected unknown Voronoi diagram issue, input polygons will be rotated back and forth."; } @@ -48,6 +50,8 @@ VoronoiDiagram::construct_voronoi(const SegmentIterator segment_begin, const Seg BOOST_LOG_TRIVIAL(error) << "Detected Voronoi edge intersecting input segment even after the rotation of input."; } else if (m_issue_type == IssueType::FINITE_EDGE_WITH_NON_FINITE_VERTEX) { BOOST_LOG_TRIVIAL(error) << "Detected finite Voronoi vertex with non finite vertex even after the rotation of input."; + } else if (m_issue_type == IssueType::PARABOLIC_VORONOI_EDGE_WITHOUT_FOCUS_POINT) { + BOOST_LOG_TRIVIAL(error) << "Detected parabolic Voronoi edges without focus point even after the rotation of input."; } else { BOOST_LOG_TRIVIAL(error) << "Detected unknown Voronoi diagram issue even after the rotation of input."; } @@ -159,8 +163,8 @@ typename boost::polygon::enable_if< VoronoiDiagram::IssueType>::type VoronoiDiagram::detect_known_issues(const VoronoiDiagram &voronoi_diagram, SegmentIterator segment_begin, SegmentIterator segment_end) { - if (has_finite_edge_with_non_finite_vertex(voronoi_diagram)) { - return IssueType::FINITE_EDGE_WITH_NON_FINITE_VERTEX; + if (const IssueType edge_issue_type = detect_known_voronoi_edge_issues(voronoi_diagram); edge_issue_type != IssueType::NO_ISSUE_DETECTED) { + return edge_issue_type; } else if (const IssueType cell_issue_type = detect_known_voronoi_cell_issues(voronoi_diagram, segment_begin, segment_end); cell_issue_type != IssueType::NO_ISSUE_DETECTED) { return cell_issue_type; } @@ -220,16 +224,20 @@ VoronoiDiagram::detect_known_voronoi_cell_issues(const VoronoiDiagram &voronoi_d return IssueType::NO_ISSUE_DETECTED; } -bool VoronoiDiagram::has_finite_edge_with_non_finite_vertex(const VoronoiDiagram &voronoi_diagram) +VoronoiDiagram::IssueType VoronoiDiagram::detect_known_voronoi_edge_issues(const VoronoiDiagram &voronoi_diagram) { for (const voronoi_diagram_type::edge_type &edge : voronoi_diagram.edges()) { if (edge.is_finite()) { assert(edge.vertex0() != nullptr && edge.vertex1() != nullptr); if (edge.vertex0() == nullptr || edge.vertex1() == nullptr || !VoronoiUtils::is_finite(*edge.vertex0()) || !VoronoiUtils::is_finite(*edge.vertex1())) - return true; + return IssueType::FINITE_EDGE_WITH_NON_FINITE_VERTEX; + + if (edge.is_curved() && !edge.cell()->contains_point() && !edge.twin()->cell()->contains_point()) + return IssueType::PARABOLIC_VORONOI_EDGE_WITHOUT_FOCUS_POINT; } } - return false; + + return IssueType::NO_ISSUE_DETECTED; } template diff --git a/src/libslic3r/Geometry/Voronoi.hpp b/src/libslic3r/Geometry/Voronoi.hpp index ef1c622769f..fffc958b0ad 100644 --- a/src/libslic3r/Geometry/Voronoi.hpp +++ b/src/libslic3r/Geometry/Voronoi.hpp @@ -44,7 +44,8 @@ class VoronoiDiagram MISSING_VORONOI_VERTEX, NON_PLANAR_VORONOI_DIAGRAM, VORONOI_EDGE_INTERSECTING_INPUT_SEGMENT, - UNKNOWN // Repairs are disabled in the constructor. + PARABOLIC_VORONOI_EDGE_WITHOUT_FOCUS_POINT, + UNKNOWN // Repairs are disabled in the constructor. }; enum class State { @@ -158,7 +159,10 @@ class VoronoiDiagram IssueType>::type detect_known_voronoi_cell_issues(const VoronoiDiagram &voronoi_diagram, SegmentIterator segment_begin, SegmentIterator segment_end); - static bool has_finite_edge_with_non_finite_vertex(const VoronoiDiagram &voronoi_diagram); + // Detect issues related to Voronoi edges, or that can be detected by iterating over Voronoi edges. + // The first type of issue that can be detected is a finite Voronoi edge with a non-finite vertex. + // The second type of issue that can be detected is a parabolic Voronoi edge without a focus point (produced by two segments). + static IssueType detect_known_voronoi_edge_issues(const VoronoiDiagram &voronoi_diagram); voronoi_diagram_type m_voronoi_diagram; vertex_container_type m_vertices; From babb84c70ac855a037b9f6b20cacf0190a053aed Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Sun, 22 Dec 2024 17:49:08 +0800 Subject: [PATCH 05/33] SPE-1963: Improve ordering of perimeters with Arachne perimeter generator Especially in cases when the object is composed only of 2 external perimeters and 1 or 2 internal perimeters, the order of perimeters wasn't optimal and differed from the Classic perimeter generator. That caused unnecessary long travels before the external contour was printed. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The ordering of perimeters is slightly inspired by the latest changes in CuraEngine. Cherry-picked from prusa3d/PrusaSlicer@10875082de537793f6e62ce719b3e4defd57cfa1 Co-authored-by: Lukáš Hejl --- src/libslic3r/Arachne/PerimeterOrder.cpp | 276 ++ src/libslic3r/Arachne/PerimeterOrder.hpp | 44 + src/libslic3r/Arachne/WallToolPaths.cpp | 94 - src/libslic3r/Arachne/WallToolPaths.hpp | 10 - src/libslic3r/Arachne/utils/ExtrusionLine.cpp | 23 +- src/libslic3r/Arachne/utils/ExtrusionLine.hpp | 24 +- src/libslic3r/CMakeLists.txt | 2 + src/libslic3r/PerimeterGenerator.cpp | 2473 ++++++++--------- 8 files changed, 1540 insertions(+), 1406 deletions(-) create mode 100644 src/libslic3r/Arachne/PerimeterOrder.cpp create mode 100644 src/libslic3r/Arachne/PerimeterOrder.hpp diff --git a/src/libslic3r/Arachne/PerimeterOrder.cpp b/src/libslic3r/Arachne/PerimeterOrder.cpp new file mode 100644 index 00000000000..01d50feb1e1 --- /dev/null +++ b/src/libslic3r/Arachne/PerimeterOrder.cpp @@ -0,0 +1,276 @@ +#include "PerimeterOrder.hpp" + +namespace Slic3r::Arachne::PerimeterOrder { + +using namespace Arachne; + +static size_t get_extrusion_lines_count(const Perimeters &perimeters) { + size_t extrusion_lines_count = 0; + for (const Perimeter &perimeter : perimeters) + extrusion_lines_count += perimeter.size(); + + return extrusion_lines_count; +} + +static PerimeterExtrusions get_sorted_perimeter_extrusions_by_area(const Perimeters &perimeters) { + PerimeterExtrusions sorted_perimeter_extrusions; + sorted_perimeter_extrusions.reserve(get_extrusion_lines_count(perimeters)); + + for (const Perimeter &perimeter : perimeters) { + for (const ExtrusionLine &extrusion_line : perimeter) { + if (extrusion_line.empty()) + continue; // This shouldn't ever happen. + + const BoundingBox bbox = get_extents(extrusion_line); + // Be aware that Arachne produces contours with clockwise orientation and holes with counterclockwise orientation. + const double area = std::abs(extrusion_line.area()); + const Polygon polygon = extrusion_line.is_closed ? to_polygon(extrusion_line) : Polygon{}; + + sorted_perimeter_extrusions.emplace_back(extrusion_line, area, polygon, bbox); + } + } + + // Open extrusions have an area equal to zero, so sorting based on the area ensures that open extrusions will always be before closed ones. + std::sort(sorted_perimeter_extrusions.begin(), sorted_perimeter_extrusions.end(), + [](const PerimeterExtrusion &l, const PerimeterExtrusion &r) { return l.area < r.area; }); + + return sorted_perimeter_extrusions; +} + +// Functions fill adjacent_perimeter_extrusions field for every PerimeterExtrusion by pointers to PerimeterExtrusions that contain or are inside this PerimeterExtrusion. +static void construct_perimeter_extrusions_adjacency_graph(PerimeterExtrusions &sorted_perimeter_extrusions) { + // Construct a graph (defined using adjacent_perimeter_extrusions field) where two PerimeterExtrusion are adjacent when one is inside the other. + std::vector root_candidates(sorted_perimeter_extrusions.size(), false); + for (PerimeterExtrusion &perimeter_extrusion : sorted_perimeter_extrusions) { + const size_t perimeter_extrusion_idx = &perimeter_extrusion - sorted_perimeter_extrusions.data(); + + if (!perimeter_extrusion.is_closed()) { + root_candidates[perimeter_extrusion_idx] = true; + continue; + } + + for (PerimeterExtrusion &root_candidate : sorted_perimeter_extrusions) { + const size_t root_candidate_idx = &root_candidate - sorted_perimeter_extrusions.data(); + + if (!root_candidates[root_candidate_idx]) + continue; + + if (perimeter_extrusion.bbox.contains(root_candidate.bbox) && perimeter_extrusion.polygon.contains(root_candidate.extrusion.junctions.front().p)) { + perimeter_extrusion.adjacent_perimeter_extrusions.emplace_back(&root_candidate); + root_candidate.adjacent_perimeter_extrusions.emplace_back(&perimeter_extrusion); + root_candidates[root_candidate_idx] = false; + } + } + + root_candidates[perimeter_extrusion_idx] = true; + } +} + +// Perform the depth-first search to assign the nearest external perimeter for every PerimeterExtrusion. +// When some PerimeterExtrusion is achievable from more than one external perimeter, then we choose the +// one that comes from a contour. +static void assign_nearest_external_perimeter(PerimeterExtrusions &sorted_perimeter_extrusions) { + std::stack stack; + for (PerimeterExtrusion &perimeter_extrusion : sorted_perimeter_extrusions) { + if (perimeter_extrusion.is_external_perimeter()) { + perimeter_extrusion.depth = 0; + perimeter_extrusion.nearest_external_perimeter = &perimeter_extrusion; + stack.push(&perimeter_extrusion); + } + } + + while (!stack.empty()) { + PerimeterExtrusion *current_extrusion = stack.top(); + stack.pop(); + + for (PerimeterExtrusion *adjacent_extrusion : current_extrusion->adjacent_perimeter_extrusions) { + const size_t adjacent_extrusion_depth = current_extrusion->depth + 1; + // Update depth when the new depth is smaller or when we can achieve the same depth from a contour. + // This will ensure that the internal perimeter will be extruded before the outer external perimeter + // when there are two external perimeters and one internal. + if (adjacent_extrusion_depth < adjacent_extrusion->depth) { + adjacent_extrusion->nearest_external_perimeter = current_extrusion->nearest_external_perimeter; + adjacent_extrusion->depth = adjacent_extrusion_depth; + stack.push(adjacent_extrusion); + } else if (adjacent_extrusion_depth == adjacent_extrusion->depth && !adjacent_extrusion->nearest_external_perimeter->is_contour() && current_extrusion->is_contour()) { + adjacent_extrusion->nearest_external_perimeter = current_extrusion->nearest_external_perimeter; + stack.push(adjacent_extrusion); + } + } + } +} + +inline Point get_end_position(const ExtrusionLine &extrusion) { + if (extrusion.is_closed) + return extrusion.junctions[0].p; // We ended where we started. + else + return extrusion.junctions.back().p; // Pick the other end from where we started. +} + +// Returns ordered extrusions. +static std::vector ordered_perimeter_extrusions_to_minimize_distances(Point current_position, std::vector extrusions) { + // Ensure that open extrusions will be placed before the closed one. + std::sort(extrusions.begin(), extrusions.end(), + [](const PerimeterExtrusion *l, const PerimeterExtrusion *r) -> bool { return l->is_closed() < r->is_closed(); }); + + std::vector ordered_extrusions; + std::vector already_selected(extrusions.size(), false); + while (ordered_extrusions.size() < extrusions.size()) { + double nearest_distance_sqr = std::numeric_limits::max(); + size_t nearest_extrusion_idx = 0; + bool is_nearest_closed = false; + + for (size_t extrusion_idx = 0; extrusion_idx < extrusions.size(); ++extrusion_idx) { + if (already_selected[extrusion_idx]) + continue; + + const ExtrusionLine &extrusion_line = extrusions[extrusion_idx]->extrusion; + const Point &extrusion_start_position = extrusion_line.junctions.front().p; + const double distance_sqr = (current_position - extrusion_start_position).cast().squaredNorm(); + if (distance_sqr < nearest_distance_sqr) { + if (extrusion_line.is_closed || (!extrusion_line.is_closed && nearest_distance_sqr != std::numeric_limits::max()) || (!extrusion_line.is_closed && !is_nearest_closed)) { + nearest_extrusion_idx = extrusion_idx; + nearest_distance_sqr = distance_sqr; + is_nearest_closed = extrusion_line.is_closed; + } + } + } + + already_selected[nearest_extrusion_idx] = true; + const PerimeterExtrusion *nearest_extrusion = extrusions[nearest_extrusion_idx]; + current_position = get_end_position(nearest_extrusion->extrusion); + ordered_extrusions.emplace_back(nearest_extrusion); + } + + return ordered_extrusions; +} + +struct GroupedPerimeterExtrusions +{ + GroupedPerimeterExtrusions() = delete; + explicit GroupedPerimeterExtrusions(const PerimeterExtrusion *external_perimeter_extrusion) + : external_perimeter_extrusion(external_perimeter_extrusion) {} + + std::vector extrusions; + const PerimeterExtrusion *external_perimeter_extrusion = nullptr; +}; + +// Returns vector of indexes that represent the order of grouped extrusions in grouped_extrusions. +static std::vector order_of_grouped_perimeter_extrusions_to_minimize_distances(Point current_position, std::vector grouped_extrusions) { + // Ensure that holes will be placed before contour and open extrusions before the closed one. + std::sort(grouped_extrusions.begin(), grouped_extrusions.end(), [](const GroupedPerimeterExtrusions &l, const GroupedPerimeterExtrusions &r) -> bool { + return (l.external_perimeter_extrusion->is_contour() < r.external_perimeter_extrusion->is_contour()) || + (l.external_perimeter_extrusion->is_contour() == r.external_perimeter_extrusion->is_contour() && l.external_perimeter_extrusion->is_closed() < r.external_perimeter_extrusion->is_closed()); + }); + + const size_t holes_cnt = std::count_if(grouped_extrusions.begin(), grouped_extrusions.end(), [](const GroupedPerimeterExtrusions &grouped_extrusions) { + return !grouped_extrusions.external_perimeter_extrusion->is_contour(); + }); + + std::vector grouped_extrusions_order; + std::vector already_selected(grouped_extrusions.size(), false); + while (grouped_extrusions_order.size() < grouped_extrusions.size()) { + double nearest_distance_sqr = std::numeric_limits::max(); + size_t nearest_grouped_extrusions_idx = 0; + bool is_nearest_closed = false; + + // First we order all holes and then we start ordering contours. + const size_t grouped_extrusion_end = grouped_extrusions_order.size() < holes_cnt ? holes_cnt: grouped_extrusions.size(); + for (size_t grouped_extrusion_idx = 0; grouped_extrusion_idx < grouped_extrusion_end; ++grouped_extrusion_idx) { + if (already_selected[grouped_extrusion_idx]) + continue; + + const ExtrusionLine &external_perimeter_extrusion_line = grouped_extrusions[grouped_extrusion_idx].external_perimeter_extrusion->extrusion; + const Point &extrusion_start_position = external_perimeter_extrusion_line.junctions.front().p; + const double distance_sqr = (current_position - extrusion_start_position).cast().squaredNorm(); + if (distance_sqr < nearest_distance_sqr) { + if (external_perimeter_extrusion_line.is_closed || (!external_perimeter_extrusion_line.is_closed && nearest_distance_sqr != std::numeric_limits::max()) || (!external_perimeter_extrusion_line.is_closed && !is_nearest_closed)) { + nearest_grouped_extrusions_idx = grouped_extrusion_idx; + nearest_distance_sqr = distance_sqr; + is_nearest_closed = external_perimeter_extrusion_line.is_closed; + } + } + } + + grouped_extrusions_order.emplace_back(nearest_grouped_extrusions_idx); + already_selected[nearest_grouped_extrusions_idx] = true; + const GroupedPerimeterExtrusions &nearest_grouped_extrusions = grouped_extrusions[nearest_grouped_extrusions_idx]; + const ExtrusionLine &last_extrusion_line = nearest_grouped_extrusions.extrusions.back()->extrusion; + current_position = get_end_position(last_extrusion_line); + } + + return grouped_extrusions_order; +} + +static PerimeterExtrusions extract_ordered_perimeter_extrusions(const PerimeterExtrusions &sorted_perimeter_extrusions, const bool external_perimeters_first) { + // Extrusions are ordered inside each group. + std::vector grouped_extrusions; + + std::stack stack; + std::vector visited(sorted_perimeter_extrusions.size(), false); + for (const PerimeterExtrusion &perimeter_extrusion : sorted_perimeter_extrusions) { + if (!perimeter_extrusion.is_external_perimeter()) + continue; + + stack.push(&perimeter_extrusion); + visited.assign(sorted_perimeter_extrusions.size(), false); + + grouped_extrusions.emplace_back(&perimeter_extrusion); + while (!stack.empty()) { + const PerimeterExtrusion *current_extrusion = stack.top(); + const size_t current_extrusion_idx = current_extrusion - sorted_perimeter_extrusions.data(); + stack.pop(); + + if (visited[current_extrusion_idx]) + continue; + + if (current_extrusion->nearest_external_perimeter == &perimeter_extrusion) + grouped_extrusions.back().extrusions.emplace_back(current_extrusion); + + if (current_extrusion->adjacent_perimeter_extrusions.size() == 1) { + const PerimeterExtrusion *adjacent_extrusion = current_extrusion->adjacent_perimeter_extrusions.front(); + stack.push(adjacent_extrusion); + } else if (current_extrusion->adjacent_perimeter_extrusions.size() > 1) { + // When there is more than one available candidate, then order candidates to minimize distances between + // candidates and also to minimize the distance from the current_position. + std::vector available_candidates; + for (const PerimeterExtrusion *adjacent_extrusion : current_extrusion->adjacent_perimeter_extrusions) { + if (const size_t adjacent_extrusion_idx = adjacent_extrusion - sorted_perimeter_extrusions.data(); !visited[adjacent_extrusion_idx]) + available_candidates.emplace_back(adjacent_extrusion); + } + + std::vector adjacent_extrusions = ordered_perimeter_extrusions_to_minimize_distances(Point::Zero(), available_candidates); + std::reverse(adjacent_extrusions.begin(), adjacent_extrusions.end()); + for (const PerimeterExtrusion *adjacent_extrusion : adjacent_extrusions) + stack.push(adjacent_extrusion); + } + + visited[current_extrusion_idx] = true; + } + + if (!external_perimeters_first) + std::reverse(grouped_extrusions.back().extrusions.begin(), grouped_extrusions.back().extrusions.end()); + } + + const std::vector grouped_extrusion_order = order_of_grouped_perimeter_extrusions_to_minimize_distances(Point::Zero(), grouped_extrusions); + assert(grouped_extrusion_order.size() == grouped_ordered_extrusions.size()); + + PerimeterExtrusions ordered_extrusions; + for (size_t order_idx : grouped_extrusion_order) { + for (const PerimeterExtrusion *perimeter_extrusion : grouped_extrusions[order_idx].extrusions) + ordered_extrusions.emplace_back(*perimeter_extrusion); + } + + return ordered_extrusions; +} + +// FIXME: From the point of better patch planning, it should be better to do ordering when we have generated all extrusions (for now, when G-Code is exported). +// FIXME: It would be better to extract the adjacency graph of extrusions from the SkeletalTrapezoidation graph. +PerimeterExtrusions ordered_perimeter_extrusions(const Perimeters &perimeters, const bool external_perimeters_first) { + PerimeterExtrusions sorted_perimeter_extrusions = get_sorted_perimeter_extrusions_by_area(perimeters); + construct_perimeter_extrusions_adjacency_graph(sorted_perimeter_extrusions); + assign_nearest_external_perimeter(sorted_perimeter_extrusions); + return extract_ordered_perimeter_extrusions(sorted_perimeter_extrusions, external_perimeters_first); +} + +} // namespace Slic3r::Arachne::PerimeterOrder \ No newline at end of file diff --git a/src/libslic3r/Arachne/PerimeterOrder.hpp b/src/libslic3r/Arachne/PerimeterOrder.hpp new file mode 100644 index 00000000000..edb13094f95 --- /dev/null +++ b/src/libslic3r/Arachne/PerimeterOrder.hpp @@ -0,0 +1,44 @@ +#ifndef slic3r_GCode_PerimeterOrder_hpp_ +#define slic3r_GCode_PerimeterOrder_hpp_ + +#include + +namespace Slic3r::Arachne::PerimeterOrder { + +// Data structure stores ExtrusionLine (closed and open) together with additional data. +struct PerimeterExtrusion +{ + explicit PerimeterExtrusion(const Arachne::ExtrusionLine &extrusion, const double area, const Polygon &polygon, const BoundingBox &bbox) + : extrusion(extrusion), area(area), polygon(polygon), bbox(bbox) {} + + Arachne::ExtrusionLine extrusion; + // Absolute value of the area of the polygon. The value is always non-negative, even for holes. + double area = 0; + + // Polygon is non-empty only for closed extrusions. + Polygon polygon; + BoundingBox bbox; + + std::vector adjacent_perimeter_extrusions; + + // How far is this perimeter from the nearest external perimeter. Contour is always preferred over holes. + size_t depth = std::numeric_limits::max(); + PerimeterExtrusion *nearest_external_perimeter = nullptr; + + // Returns if ExtrusionLine is a contour or a hole. + bool is_contour() const { return extrusion.is_contour(); } + + // Returns if ExtrusionLine is closed or opened. + bool is_closed() const { return extrusion.is_closed; } + + // Returns if ExtrusionLine is an external or an internal perimeter. + bool is_external_perimeter() const { return extrusion.is_external_perimeter(); } +}; + +using PerimeterExtrusions = std::vector; + +PerimeterExtrusions ordered_perimeter_extrusions(const Perimeters &perimeters, bool external_perimeters_first); + +} // namespace Slic3r::Arachne::PerimeterOrder + +#endif // slic3r_GCode_Travels_hpp_ diff --git a/src/libslic3r/Arachne/WallToolPaths.cpp b/src/libslic3r/Arachne/WallToolPaths.cpp index 20e9a4f5970..55aabd9b022 100644 --- a/src/libslic3r/Arachne/WallToolPaths.cpp +++ b/src/libslic3r/Arachne/WallToolPaths.cpp @@ -782,98 +782,4 @@ bool WallToolPaths::removeEmptyToolPaths(std::vector &toolpa return toolpaths.empty(); } -/*! - * Get the order constraints of the insets when printing walls per region / hole. - * Each returned pair consists of adjacent wall lines where the left has an inset_idx one lower than the right. - * - * Odd walls should always go after their enclosing wall polygons. - * - * \param outer_to_inner Whether the wall polygons with a lower inset_idx should go before those with a higher one. - */ -WallToolPaths::ExtrusionLineSet WallToolPaths::getRegionOrder(const std::vector &input, const bool outer_to_inner) -{ - ExtrusionLineSet order_requirements; - // We build a grid where we map toolpath vertex locations to toolpaths, - // so that we can easily find which two toolpaths are next to each other, - // which is the requirement for there to be an order constraint. - // - // We use a PointGrid rather than a LineGrid to save on computation time. - // In very rare cases two insets might lie next to each other without having neighboring vertices, e.g. - // \ . - // | / . - // | / . - // || . - // | \ . - // | \ . - // / . - // However, because of how Arachne works this will likely never be the case for two consecutive insets. - // On the other hand one could imagine that two consecutive insets of a very large circle - // could be simplify()ed such that the remaining vertices of the two insets don't align. - // In those cases the order requirement is not captured, - // which means that the PathOrderOptimizer *might* result in a violation of the user set path order. - // This problem is expected to be not so severe and happen very sparsely. - - coord_t max_line_w = 0u; - for (const ExtrusionLine *line : input) // compute max_line_w - for (const ExtrusionJunction &junction : *line) - max_line_w = std::max(max_line_w, junction.w); - if (max_line_w == 0u) - return order_requirements; - - struct LineLoc - { - ExtrusionJunction j; - const ExtrusionLine *line; - }; - struct Locator - { - Point operator()(const LineLoc &elem) { return elem.j.p; } - }; - - // How much farther two verts may be apart due to corners. - // This distance must be smaller than 2, because otherwise - // we could create an order requirement between e.g. - // wall 2 of one region and wall 3 of another region, - // while another wall 3 of the first region would lie in between those two walls. - // However, higher values are better against the limitations of using a PointGrid rather than a LineGrid. - constexpr float diagonal_extension = 1.9f; - const auto searching_radius = coord_t(max_line_w * diagonal_extension); - using GridT = SparsePointGrid; - GridT grid(searching_radius); - - for (const ExtrusionLine *line : input) - for (const ExtrusionJunction &junction : *line) grid.insert(LineLoc{junction, line}); - for (const std::pair &pair : grid) { - const LineLoc &lineloc_here = pair.second; - const ExtrusionLine *here = lineloc_here.line; - Point loc_here = pair.second.j.p; - std::vector nearby_verts = grid.getNearby(loc_here, searching_radius); - for (const LineLoc &lineloc_nearby : nearby_verts) { - const ExtrusionLine *nearby = lineloc_nearby.line; - if (nearby == here) - continue; - if (nearby->inset_idx == here->inset_idx) - continue; - if (nearby->inset_idx > here->inset_idx + 1) - continue; // not directly adjacent - if (here->inset_idx > nearby->inset_idx + 1) - continue; // not directly adjacent - if (!shorter_then(loc_here - lineloc_nearby.j.p, (lineloc_here.j.w + lineloc_nearby.j.w) / 2 * diagonal_extension)) - continue; // points are too far away from each other - if (here->is_odd || nearby->is_odd) { - if (here->is_odd && !nearby->is_odd && nearby->inset_idx < here->inset_idx) - order_requirements.emplace(std::make_pair(nearby, here)); - if (nearby->is_odd && !here->is_odd && here->inset_idx < nearby->inset_idx) - order_requirements.emplace(std::make_pair(here, nearby)); - } else if ((nearby->inset_idx < here->inset_idx) == outer_to_inner) { - order_requirements.emplace(std::make_pair(nearby, here)); - } else { - assert((nearby->inset_idx > here->inset_idx) == outer_to_inner); - order_requirements.emplace(std::make_pair(here, nearby)); - } - } - } - return order_requirements; -} - } // namespace Slic3r::Arachne diff --git a/src/libslic3r/Arachne/WallToolPaths.hpp b/src/libslic3r/Arachne/WallToolPaths.hpp index 457f7e71494..00652fc0915 100644 --- a/src/libslic3r/Arachne/WallToolPaths.hpp +++ b/src/libslic3r/Arachne/WallToolPaths.hpp @@ -90,16 +90,6 @@ class WallToolPaths using ExtrusionLineSet = ankerl::unordered_dense::set, boost::hash>>; - /*! - * Get the order constraints of the insets when printing walls per region / hole. - * Each returned pair consists of adjacent wall lines where the left has an inset_idx one lower than the right. - * - * Odd walls should always go after their enclosing wall polygons. - * - * \param outer_to_inner Whether the wall polygons with a lower inset_idx should go before those with a higher one. - */ - static ExtrusionLineSet getRegionOrder(const std::vector &input, bool outer_to_inner); - protected: /*! * Stitch the polylines together and form closed polygons. diff --git a/src/libslic3r/Arachne/utils/ExtrusionLine.cpp b/src/libslic3r/Arachne/utils/ExtrusionLine.cpp index 561fd7c5ea3..03fb4ebb55b 100644 --- a/src/libslic3r/Arachne/utils/ExtrusionLine.cpp +++ b/src/libslic3r/Arachne/utils/ExtrusionLine.cpp @@ -253,9 +253,10 @@ bool ExtrusionLine::is_contour() const return poly.is_clockwise(); } -double ExtrusionLine::area() const -{ - assert(this->is_closed); +double ExtrusionLine::area() const { + if (!this->is_closed) + return 0.; + double a = 0.; if (this->junctions.size() >= 3) { Vec2d p1 = this->junctions.back().p.cast(); @@ -265,9 +266,25 @@ double ExtrusionLine::area() const p1 = p2; } } + return 0.5 * a; } +Points to_points(const ExtrusionLine &extrusion_line) { + Points points; + points.reserve(extrusion_line.junctions.size()); + for (const ExtrusionJunction &junction : extrusion_line.junctions) + points.emplace_back(junction.p); + return points; +} + +BoundingBox get_extents(const ExtrusionLine &extrusion_line) { + BoundingBox bbox; + for (const ExtrusionJunction &junction : extrusion_line.junctions) + bbox.merge(junction.p); + return bbox; +} + } // namespace Slic3r::Arachne namespace Slic3r { diff --git a/src/libslic3r/Arachne/utils/ExtrusionLine.hpp b/src/libslic3r/Arachne/utils/ExtrusionLine.hpp index 11b9d005bad..fe021941a93 100644 --- a/src/libslic3r/Arachne/utils/ExtrusionLine.hpp +++ b/src/libslic3r/Arachne/utils/ExtrusionLine.hpp @@ -187,6 +187,8 @@ struct ExtrusionLine bool is_contour() const; double area() const; + + bool is_external_perimeter() const { return this->inset_idx == 0; } }; template @@ -213,6 +215,7 @@ static inline Slic3r::ThickPolyline to_thick_polyline(const PathType &path) static inline Polygon to_polygon(const ExtrusionLine &line) { Polygon out; + assert(line.is_closed); assert(line.junctions.size() >= 3); assert(line.junctions.front().p == line.junctions.back().p); out.points.reserve(line.junctions.size() - 1); @@ -221,24 +224,11 @@ static inline Polygon to_polygon(const ExtrusionLine &line) return out; } -static Points to_points(const ExtrusionLine &extrusion_line) -{ - Points points; - points.reserve(extrusion_line.junctions.size()); - for (const ExtrusionJunction &junction : extrusion_line.junctions) - points.emplace_back(junction.p); - return points; -} +Points to_points(const ExtrusionLine &extrusion_line); -#if 0 -static BoundingBox get_extents(const ExtrusionLine &extrusion_line) -{ - BoundingBox bbox; - for (const ExtrusionJunction &junction : extrusion_line.junctions) - bbox.merge(junction.p); - return bbox; -} +BoundingBox get_extents(const ExtrusionLine &extrusion_line); +#if 0 static BoundingBox get_extents(const std::vector &extrusion_lines) { BoundingBox bbox; @@ -269,6 +259,8 @@ static std::vector to_points(const std::vector &e #endif using VariableWidthLines = std::vector; //; } // namespace Slic3r::Arachne diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 7781000f66b..da4fb9c1df9 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -434,6 +434,8 @@ set(lisbslic3r_sources Arachne/utils/PolygonsSegmentIndex.hpp Arachne/utils/PolylineStitcher.hpp Arachne/utils/PolylineStitcher.cpp + Arachne/PerimeterOrder.hpp + Arachne/PerimeterOrder.cpp Arachne/SkeletalTrapezoidation.hpp Arachne/SkeletalTrapezoidation.cpp Arachne/SkeletalTrapezoidationEdge.hpp diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 624a710902b..5c142db4715 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -9,6 +9,7 @@ #include "VariableWidth.hpp" #include "CurveAnalyzer.hpp" #include "Clipper2Utils.hpp" +#include "Arachne/PerimeterOrder.hpp" #include "Arachne/WallToolPaths.hpp" #include "Geometry/ConvexHull.hpp" #include "ExPolygonCollection.hpp" @@ -566,7 +567,7 @@ static ExtrusionEntityCollection traverse_loops(const PerimeterGenerator &perime for (const auto & r : fuzzified_regions) { BoundingBox bbox = get_extents(perimeter_generator.slices->surfaces); bbox.offset(scale_(1.)); - ::Slic3r::SVG svg(debug_out_path("fuzzy_traverse_loops_%d_%d_%d_region_%d.svg", perimeter_generator.layer_id, loop.is_contour ? 0 : 1, loop.depth, i).c_str(), bbox); + ::Slic3r::SVG svg(debug_out_path("fuzzy_traverse_loops_%d_%d_%d_region_%d.svg", perimeter_generator.layer_id, loop.is_contour() ? 0 : 1, loop.depth, i).c_str(), bbox); svg.draw_outline(perimeter_generator.slices->surfaces); svg.draw_outline(loop.polygon, "green"); svg.draw(r.second, "red", 0.5); @@ -876,13 +877,6 @@ static ClipperLib_Z::Paths clip_extrusion(const ClipperLib_Z::Path& subject, con return clipped_paths; } -struct PerimeterGeneratorArachneExtrusion -{ - Arachne::ExtrusionLine* extrusion = nullptr; - // Indicates if closed ExtrusionLine is a contour or a hole. Used it only when ExtrusionLine is a closed loop. - bool is_contour = false; -}; - static void smooth_overhang_level(ExtrusionPaths &paths) { @@ -967,7 +961,7 @@ static void smooth_overhang_level(ExtrusionPaths &paths) } } -static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator& perimeter_generator, std::vector& pg_extrusions, +static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator& perimeter_generator, Arachne::PerimeterOrder::PerimeterExtrusions& pg_extrusions, bool &steep_overhang_contour, bool &steep_overhang_hole) { // Detect steep overhangs @@ -975,34 +969,34 @@ static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator& p perimeter_generator.layer_id % 2 == 1; // Only calculate overhang degree on even (from GUI POV) layers ExtrusionEntityCollection extrusion_coll; - for (PerimeterGeneratorArachneExtrusion& pg_extrusion : pg_extrusions) { - Arachne::ExtrusionLine* extrusion = pg_extrusion.extrusion; - if (extrusion->empty()) + for (Arachne::PerimeterOrder::PerimeterExtrusion &pg_extrusion : pg_extrusions) { + Arachne::ExtrusionLine &extrusion = pg_extrusion.extrusion; + if (extrusion.empty()) continue; - const bool is_external = extrusion->inset_idx == 0; + const bool is_external = extrusion.inset_idx == 0; ExtrusionRole role = is_external ? erExternalPerimeter : erPerimeter; const auto& regions = perimeter_generator.regions_by_fuzzify; - const bool is_contour = !extrusion->is_closed || pg_extrusion.is_contour; + const bool is_contour = !extrusion.is_closed || pg_extrusion.is_contour(); if (regions.size() == 1) { // optimization const auto& config = regions.begin()->first; - const bool fuzzify = should_fuzzify(config, perimeter_generator.layer_id, extrusion->inset_idx, is_contour); + const bool fuzzify = should_fuzzify(config, perimeter_generator.layer_id, extrusion.inset_idx, is_contour); if (fuzzify) - fuzzy_extrusion_line(extrusion->junctions, config); + fuzzy_extrusion_line(extrusion.junctions, config); } else { // Find all affective regions std::vector> fuzzified_regions; fuzzified_regions.reserve(regions.size()); for (const auto& region : regions) { - if (should_fuzzify(region.first, perimeter_generator.layer_id, extrusion->inset_idx, is_contour)) { + if (should_fuzzify(region.first, perimeter_generator.layer_id, extrusion.inset_idx, is_contour)) { fuzzified_regions.emplace_back(region.first, region.second); } } if (!fuzzified_regions.empty()) { // Split the loops into lines with different config, and fuzzy them separately for (const auto& r : fuzzified_regions) { - const auto splitted = Algorithm::split_line(*extrusion, r.second, false); + const auto splitted = Algorithm::split_line(extrusion, r.second, false); if (splitted.empty()) { // No intersection, skip continue; @@ -1011,19 +1005,19 @@ static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator& p // Fuzzy splitted extrusion if (std::all_of(splitted.begin(), splitted.end(), [](const Algorithm::SplitLineJunction& j) { return j.clipped; })) { // The entire polygon is fuzzified - fuzzy_extrusion_line(extrusion->junctions, r.first); + fuzzy_extrusion_line(extrusion.junctions, r.first); } else { - const auto current_ext = extrusion->junctions; + const auto current_ext = extrusion.junctions; std::vector segment; segment.reserve(current_ext.size()); - extrusion->junctions.clear(); + extrusion.junctions.clear(); - const auto fuzzy_current_segment = [&segment, extrusion, &r]() { - extrusion->junctions.push_back(segment.front()); + const auto fuzzy_current_segment = [&segment, &extrusion, &r]() { + extrusion.junctions.push_back(segment.front()); const auto back = segment.back(); fuzzy_extrusion_line(segment, r.first); - extrusion->junctions.insert(extrusion->junctions.end(), segment.begin(), segment.end()); - extrusion->junctions.push_back(back); + extrusion.junctions.insert(extrusion.junctions.end(), segment.begin(), segment.end()); + extrusion.junctions.push_back(back); segment.clear(); }; @@ -1040,7 +1034,7 @@ static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator& p segment.push_back(to_ex_junction(p)); } else { if (segment.empty()) { - extrusion->junctions.push_back(to_ex_junction(p)); + extrusion.junctions.push_back(to_ex_junction(p)); } else { segment.push_back(to_ex_junction(p)); fuzzy_current_segment(); @@ -1059,9 +1053,9 @@ static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator& p // detect overhanging/bridging perimeters if (perimeter_generator.config->detect_overhang_wall && perimeter_generator.layer_id > perimeter_generator.object_config->raft_layers) { ClipperLib_Z::Path extrusion_path; - extrusion_path.reserve(extrusion->size()); + extrusion_path.reserve(extrusion.size()); BoundingBox extrusion_path_bbox; - for (const Arachne::ExtrusionJunction &ej : extrusion->junctions) { + for (const Arachne::ExtrusionJunction &ej : extrusion.junctions) { extrusion_path.emplace_back(ej.p.x(), ej.p.y(), ej.w); extrusion_path_bbox.merge(Point(ej.p.x(), ej.p.y())); } @@ -1091,7 +1085,7 @@ static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator& p // Always reverse extrusion if use fuzzy skin: https://github.com/SoftFever/OrcaSlicer/pull/2413#issuecomment-1769735357 if (overhangs_reverse && perimeter_generator.has_fuzzy_skin) { - if (pg_extrusion.is_contour) { + if (pg_extrusion.is_contour()) { steep_overhang_contour = true; } else if (perimeter_generator.has_fuzzy_hole) { steep_overhang_hole = true; @@ -1099,7 +1093,7 @@ static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator& p } // Detect steep overhang // Skip the check if we already found steep overhangs - bool found_steep_overhang = (pg_extrusion.is_contour && steep_overhang_contour) || (!pg_extrusion.is_contour && steep_overhang_hole); + bool found_steep_overhang = (pg_extrusion.is_contour() && steep_overhang_contour) || (!pg_extrusion.is_contour() && steep_overhang_hole); if (overhangs_reverse && !found_steep_overhang) { std::map recognization_paths; for (const ExtrusionPath &path : temp_paths) { @@ -1117,7 +1111,7 @@ static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator& p BoundingBox extrusion_bboxs = get_extents(be_clipped); - if (detect_steep_overhang(perimeter_generator.config, pg_extrusion.is_contour, extrusion_bboxs, it.first, be_clipped, perimeter_generator.lower_slices, + if (detect_steep_overhang(perimeter_generator.config, pg_extrusion.is_contour(), extrusion_bboxs, it.first, be_clipped, perimeter_generator.lower_slices, steep_overhang_contour, steep_overhang_hole)) { break; } @@ -1185,7 +1179,7 @@ static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator& p // Arachne sometimes creates extrusion with zero-length (just two same endpoints); if (!paths.empty()) { Point start_point = paths.front().first_point(); - if (!extrusion->is_closed) { + if (!extrusion.is_closed) { // Especially for open extrusion, we need to select a starting point that is at the start // or the end of the extrusions to make one continuous line. Also, we prefer a non-overhang // starting point. @@ -1225,7 +1219,7 @@ static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator& p if (overhangs_reverse) { for (const ExtrusionPath& path : paths) { if (path.role() == erOverhangPerimeter) { - if (pg_extrusion.is_contour) + if (pg_extrusion.is_contour()) steep_overhang_contour = true; else steep_overhang_hole = true; @@ -1242,13 +1236,13 @@ static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator& p steep_overhang_hole = true; } - extrusion_paths_append(paths, *extrusion, role, is_external ? perimeter_generator.ext_perimeter_flow : perimeter_generator.perimeter_flow); + extrusion_paths_append(paths, extrusion, role, is_external ? perimeter_generator.ext_perimeter_flow : perimeter_generator.perimeter_flow); } // Append paths to collection. if (!paths.empty()) { - if (extrusion->is_closed) { - ExtrusionLoop extrusion_loop(std::move(paths), pg_extrusion.is_contour ? elrDefault : elrHole); + if (extrusion.is_closed) { + ExtrusionLoop extrusion_loop(std::move(paths), pg_extrusion.is_contour() ? elrDefault : elrHole); extrusion_loop.make_counter_clockwise(); // TODO: it seems in practice that ExtrusionLoops occasionally have significantly disconnected paths, // triggering the asserts below. Is this a problem? @@ -1883,32 +1877,186 @@ static void group_region_by_fuzzify(PerimeterGenerator& g) } } -void PerimeterGenerator::process_classic() + +// ORCA: +// Inner Outer Inner wall ordering mode perimeter order optimisation functions +/** + * @brief Finds all perimeters touching a given set of reference lines, given as indexes. + * + * @param entities The list of PerimeterGeneratorArachneExtrusion entities. + * @param referenceIndices A set of indices representing the reference points. + * @param threshold_external The distance threshold to consider for proximity for a reference perimeter with inset index 0 + * @param threshold_internal The distance threshold to consider for proximity for a reference perimeter with inset index 1+ + * @param considered_inset_idx What perimeter inset index are we searching for (eg. if we are searching for first internal perimeters proximate to the current reference perimeter, this value should be set to 1 etc). + * @return std::vector A vector of indices representing the touching perimeters. + */ +std::vector findAllTouchingPerimeters(const Arachne::PerimeterOrder::PerimeterExtrusions& entities, const std::unordered_set& referenceIndices, size_t threshold_external, size_t threshold_internal , size_t considered_inset_idx) { + std::unordered_set touchingIndices; + + for (const int refIdx : referenceIndices) { + const auto& referenceEntity = entities[refIdx]; + Points referencePoints = Arachne::to_points(referenceEntity.extrusion); + for (size_t i = 0; i < entities.size(); ++i) { + // Skip already considered references and the reference entity + if (referenceIndices.count(i) > 0) continue; + const auto& entity = entities[i]; + if (entity.extrusion.is_external_perimeter()) continue; // Ignore inset index 0 (external) perimeters from the re-ordering even if they are touching + + if (entity.extrusion.inset_idx != considered_inset_idx) { // Find Inset index perimeters that match the requested inset index + continue; // skip if they dont match + } + + Points points = Arachne::to_points(entity.extrusion); + double distance = MultiPoint::minimumDistanceBetweenLinesDefinedByPoints(referencePoints, points); + // Add to touchingIndices if within threshold distance + size_t threshold=0; + if(referenceEntity.extrusion.is_external_perimeter()) + threshold = threshold_external; + else + threshold = threshold_internal; + if (distance <= threshold) { + touchingIndices.insert(i); + } + } + } + return std::vector(touchingIndices.begin(), touchingIndices.end()); +} + +/** + * @brief Reorders perimeters based on proximity to the reference perimeter + * + * This approach finds all perimeters touching the external perimeter first and then finds all perimeters touching these new ones until none are left + * It ensures a level-by-level traversal, similar to BFS in graph theory. + * + * @param entities The list of PerimeterGeneratorArachneExtrusion entities. + * @param referenceIndex The index of the reference perimeter. + * @param threshold_external The distance threshold to consider for proximity for a reference perimeter with inset index 0 + * @param threshold_internal The distance threshold to consider for proximity for a reference perimeter with inset index 1+ + * @return Arachne::PerimeterOrder::PerimeterExtrusions The reordered list of perimeters based on proximity. + */ +Arachne::PerimeterOrder::PerimeterExtrusions reorderPerimetersByProximity(Arachne::PerimeterOrder::PerimeterExtrusions entities, size_t threshold_external, size_t threshold_internal) { + Arachne::PerimeterOrder::PerimeterExtrusions reordered; + std::unordered_set includedIndices; + + // Function to reorder perimeters starting from a given reference index + auto reorderFromReference = [&](int referenceIndex) { + std::unordered_set firstLevelIndices; + firstLevelIndices.insert(referenceIndex); + + // Find first level touching perimeters + std::vector firstLevelTouchingIndices = findAllTouchingPerimeters(entities, firstLevelIndices, threshold_external, threshold_internal, 1); + // Bring the largest first level perimeter to the front + // The longest first neighbour is most likely the dominant proximate perimeter + // hence printing it immediately after the external perimeter should speed things up + if (!firstLevelTouchingIndices.empty()) { + auto maxIt = std::max_element(firstLevelTouchingIndices.begin(), firstLevelTouchingIndices.end(), [&entities](int a, int b) { + return entities[a].extrusion.getLength() < entities[b].extrusion.getLength(); + }); + std::iter_swap(maxIt, firstLevelTouchingIndices.end() - 1); + } + // Insert first level perimeters into reordered list + reordered.push_back(entities[referenceIndex]); + includedIndices.insert(referenceIndex); + + for (int idx : firstLevelTouchingIndices) { + if (includedIndices.count(idx) == 0) { + reordered.push_back(entities[idx]); + includedIndices.insert(idx); + } + } + + // Loop through all inset indices above 1 + size_t currentInsetIndex = 2; + while (true) { + std::unordered_set currentLevelIndices(firstLevelTouchingIndices.begin(), firstLevelTouchingIndices.end()); + std::vector currentLevelTouchingIndices = findAllTouchingPerimeters(entities, currentLevelIndices, threshold_external, threshold_internal, currentInsetIndex); + + // Break if no more touching perimeters are found + if (currentLevelTouchingIndices.empty()) { + break; + } + + // Exclude any already included indices from the current level touching indices + currentLevelTouchingIndices.erase( + std::remove_if(currentLevelTouchingIndices.begin(), currentLevelTouchingIndices.end(), + [&](int idx) { return includedIndices.count(idx) > 0; }), + currentLevelTouchingIndices.end()); + + // Bring the largest current level perimeter to the end + if (!currentLevelTouchingIndices.empty()) { + auto maxIt = std::max_element(currentLevelTouchingIndices.begin(), currentLevelTouchingIndices.end(), [&entities](int a, int b) { + return entities[a].extrusion.getLength() < entities[b].extrusion.getLength(); + }); + std::iter_swap(maxIt, currentLevelTouchingIndices.begin()); + } + + // Insert current level perimeters into reordered list + for (int idx : currentLevelTouchingIndices) { + if (includedIndices.count(idx) == 0) { + reordered.push_back(entities[idx]); + includedIndices.insert(idx); + } + } + + // Prepare for the next level + firstLevelTouchingIndices = currentLevelTouchingIndices; + currentInsetIndex++; + } + }; + + // Loop through all perimeters and reorder starting from each inset index 0 perimeter + for (size_t refIdx = 0; refIdx < entities.size(); ++refIdx) { + if (entities[refIdx].extrusion.is_external_perimeter() && includedIndices.count(refIdx) == 0) { + reorderFromReference(refIdx); + } + } + + // Append any remaining entities that were not included + for (size_t i = 0; i < entities.size(); ++i) { + if (includedIndices.count(i) == 0) { + reordered.push_back(entities[i]); + } + } + + return reordered; +} + +/** + * @brief Reorders the vector to bring external perimeter (i.e. paths with inset index 0) that are also contours (i.e. external facing lines) to the front. + * + * This function uses a stable partition to move all external perimeter contour elements to the front of the vector, + * while maintaining the relative order of non-contour elements. + * + * @param ordered_extrusions The vector of PerimeterGeneratorArachneExtrusion to reorder. + */ +void bringContoursToFront(Arachne::PerimeterOrder::PerimeterExtrusions& ordered_extrusions) { + std::stable_partition(ordered_extrusions.begin(), ordered_extrusions.end(), [](const Arachne::PerimeterOrder::PerimeterExtrusion& extrusion) { + return (extrusion.extrusion.is_contour() && extrusion.extrusion.is_external_perimeter()); + }); +} +// ORCA: +// Inner Outer Inner wall ordering mode perimeter order optimisation functions ended + +// Thanks, Cura developers, for implementing an algorithm for generating perimeters with variable width (Arachne) that is based on the paper +// "A framework for adaptive width control of dense contour-parallel toolpaths in fused deposition modeling" +void PerimeterGenerator::process_arachne() { group_region_by_fuzzify(*this); // other perimeters - m_mm3_per_mm = this->perimeter_flow.mm3_per_mm(); - coord_t perimeter_width = this->perimeter_flow.scaled_width(); - coord_t perimeter_spacing = this->perimeter_flow.scaled_spacing(); + m_mm3_per_mm = this->perimeter_flow.mm3_per_mm(); + coord_t perimeter_spacing = this->perimeter_flow.scaled_spacing(); // external perimeters - m_ext_mm3_per_mm = this->ext_perimeter_flow.mm3_per_mm(); - coord_t ext_perimeter_width = this->ext_perimeter_flow.scaled_width(); - - coord_t ext_perimeter_spacing = this->ext_perimeter_flow.scaled_spacing(); - coord_t ext_perimeter_spacing2; - // Orca: ignore precise_outer_wall if wall_sequence is not InnerOuter - if(config->precise_outer_wall && this->config->wall_sequence == WallSequence::InnerOuter) - ext_perimeter_spacing2 = scaled(0.5f * (this->ext_perimeter_flow.width() + this->perimeter_flow.width())); - else - ext_perimeter_spacing2 = scaled(0.5f * (this->ext_perimeter_flow.spacing() + this->perimeter_flow.spacing())); - + m_ext_mm3_per_mm = this->ext_perimeter_flow.mm3_per_mm(); + coord_t ext_perimeter_width = this->ext_perimeter_flow.scaled_width(); + coord_t ext_perimeter_spacing = this->ext_perimeter_flow.scaled_spacing(); + coord_t ext_perimeter_spacing2 = scaled(0.5f * (this->ext_perimeter_flow.spacing() + this->perimeter_flow.spacing())); // overhang perimeters - m_mm3_per_mm_overhang = this->overhang_flow.mm3_per_mm(); - + m_mm3_per_mm_overhang = this->overhang_flow.mm3_per_mm(); + // solid infill - coord_t solid_infill_spacing = this->solid_infill_flow.scaled_spacing(); + coord_t solid_infill_spacing = this->solid_infill_flow.scaled_spacing(); // prepare grown lower layer slices for overhang detection if (this->lower_slices != nullptr && this->config->detect_overhang_wall) { @@ -1918,501 +2066,308 @@ void PerimeterGenerator::process_classic() double nozzle_diameter = this->print_config->nozzle_diameter.get_at(this->config->wall_filament - 1); m_lower_slices_polygons = offset(*this->lower_slices, float(scale_(+nozzle_diameter / 2))); } - - // Calculate the minimum required spacing between two adjacent traces. - // This should be equal to the nominal flow spacing but we experiment - // with some tolerance in order to avoid triggering medial axis when - // some squishing might work. Loops are still spaced by the entire - // flow spacing; this only applies to collapsing parts. - // For ext_min_spacing we use the ext_perimeter_spacing calculated for two adjacent - // external loops (which is the correct way) instead of using ext_perimeter_spacing2 - // which is the spacing between external and internal, which is not correct - // and would make the collapsing (thus the details resolution) dependent on - // internal flow which is unrelated. - coord_t min_spacing = coord_t(perimeter_spacing * (1 - INSET_OVERLAP_TOLERANCE)); - coord_t ext_min_spacing = coord_t(ext_perimeter_spacing * (1 - INSET_OVERLAP_TOLERANCE)); - bool has_gap_fill = this->config->gap_infill_speed.value > 0; - // BBS: this flow is for smaller external perimeter for small area - coord_t ext_min_spacing_smaller = coord_t(ext_perimeter_spacing * (1 - SMALLER_EXT_INSET_OVERLAP_TOLERANCE)); - this->smaller_ext_perimeter_flow = this->ext_perimeter_flow; - // BBS: to be checked - this->smaller_ext_perimeter_flow = this->smaller_ext_perimeter_flow.with_width(SCALING_FACTOR * - (ext_perimeter_width - 0.5 * SMALLER_EXT_INSET_OVERLAP_TOLERANCE * ext_perimeter_spacing)); - m_ext_mm3_per_mm_smaller_width = this->smaller_ext_perimeter_flow.mm3_per_mm(); - - // prepare grown lower layer slices for overhang detection - m_lower_polygons_series = generate_lower_polygons_series(this->perimeter_flow.width()); - m_lower_overhang_dist_boundary = dist_boundary(this->perimeter_flow.width()); - if (ext_perimeter_width == perimeter_width){ - m_external_lower_polygons_series = m_lower_polygons_series; - m_external_overhang_dist_boundary=m_lower_overhang_dist_boundary; - } else { - m_external_lower_polygons_series = generate_lower_polygons_series(this->ext_perimeter_flow.width()); - m_external_overhang_dist_boundary = dist_boundary(this->ext_perimeter_flow.width()); - } - m_smaller_external_lower_polygons_series = generate_lower_polygons_series(this->smaller_ext_perimeter_flow.width()); - m_smaller_external_overhang_dist_boundary = dist_boundary(this->smaller_ext_perimeter_flow.width()); - // we need to process each island separately because we might have different - // extra perimeters for each one Surfaces all_surfaces = this->slices->surfaces; 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; - //BBS: reorder the surface to reduce the travel time - ExPolygons surface_exp; - for (const Surface &surface : all_surfaces) - surface_exp.push_back(surface.expolygon); - std::vector surface_order = chain_expolygons(surface_exp); - for (size_t order_idx = 0; order_idx < surface_order.size(); order_idx++) { - const Surface &surface = all_surfaces[surface_order[order_idx]]; + // we need to process each island separately because we might have different + // extra perimeters for each one + for (const Surface& surface : all_surfaces) { + coord_t bead_width_0 = ext_perimeter_spacing; // detect how many perimeters must be generated for this island - int loop_number = this->config->wall_loops + surface.extra_perimeters - 1; // 0-indexed loops + int loop_number = this->config->wall_loops + surface.extra_perimeters - 1; // 0-indexed loops 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) + + // 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) loop_number = 0; - // Set the topmost layer to be one wall - if (loop_number > 0 && config->only_one_wall_top && this->upper_slices == nullptr) + + // 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) loop_number = 0; + + auto apply_precise_outer_wall = config->precise_outer_wall && this->config->wall_sequence == WallSequence::InnerOuter; + // Orca: properly adjust offset for the outer wall if precise_outer_wall is enabled. + ExPolygons last = offset_ex(surface.expolygon.simplify_p(surface_simplify_resolution), + apply_precise_outer_wall? -float(ext_perimeter_width - ext_perimeter_spacing ) + : -float(ext_perimeter_width / 2. - ext_perimeter_spacing / 2.)); + + Arachne::WallToolPathsParams input_params = Arachne::make_paths_params(this->layer_id, *object_config, *print_config); + // Set params is_top_or_bottom_layer for adjusting short-wall removal sensitivity. + input_params.is_top_or_bottom_layer = (is_bottom_layer || is_topmost_layer) ? true : false; - ExPolygons last = union_ex(surface.expolygon.simplify_p(surface_simplify_resolution)); - ExPolygons gaps; - ExPolygons top_fills; - ExPolygons fill_clip; - 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 - std::vector holes(loop_number+1); // depth => loops - ThickPolylines thin_walls; - // we loop one time more than needed in order to find gaps after the last perimeter was applied - for (int i = 0;; ++ i) { // outer loop is 0 - // Calculate next onion shell of perimeters. - ExPolygons offsets; - ExPolygons offsets_with_smaller_width; - if (i == 0) { - // look for thin walls - if (this->config->detect_thin_wall) { - // the minimum thickness of a single loop is: - // ext_width/2 + ext_spacing/2 + spacing/2 + width/2 - offsets = offset2_ex(last, - -float(ext_perimeter_width / 2. + ext_min_spacing / 2. - 1), - +float(ext_min_spacing / 2. - 1)); - // the following offset2 ensures almost nothing in @thin_walls is narrower than $min_width - // (actually, something larger than that still may exist due to mitering or other causes) - coord_t min_width = coord_t(scale_(this->ext_perimeter_flow.nozzle_diameter() / 3)); - ExPolygons expp = opening_ex( - // medial axis requires non-overlapping geometry - diff_ex(last, offset(offsets, float(ext_perimeter_width / 2.) + ClipperSafetyOffset)), - float(min_width / 2.)); - // the maximum thickness of our thin wall area is equal to the minimum thickness of a single loop - for (ExPolygon &ex : expp) - ex.medial_axis(min_width, ext_perimeter_width + ext_perimeter_spacing2, &thin_walls); - } else { - coord_t ext_perimeter_smaller_width = this->smaller_ext_perimeter_flow.scaled_width(); - for (const ExPolygon& expolygon : last) { - // BBS: judge whether it's narrow but not too long island which is hard to place two line - ExPolygons expolys; - expolys.push_back(expolygon); - ExPolygons offset_result = offset2_ex(expolys, - -float(ext_perimeter_width / 2. + ext_min_spacing_smaller / 2.), - +float(ext_min_spacing_smaller / 2.)); - if (offset_result.empty() && - expolygon.area() < (double)(ext_perimeter_width + ext_min_spacing_smaller) * scale_(narrow_loop_length_threshold)) { - // BBS: for narrow external loop, use smaller line width - ExPolygons temp_result = offset_ex(expolygon, -float(ext_perimeter_smaller_width / 2.)); - offsets_with_smaller_width.insert(offsets_with_smaller_width.end(), temp_result.begin(), temp_result.end()); - } - else { - //BBS: for not narrow loop, use normal external perimeter line width - ExPolygons temp_result = offset_ex(expolygon, -float(ext_perimeter_width / 2.)); - offsets.insert(offsets.end(), temp_result.begin(), temp_result.end()); - } - } - } - if (m_spiral_vase && (offsets.size() > 1 || offsets_with_smaller_width.size() > 1)) { - // Remove all but the largest area polygon. - keep_largest_contour_only(offsets); - //BBS - if (offsets.empty()) - //BBS: only have small width loop, then keep the largest in spiral vase mode - keep_largest_contour_only(offsets_with_smaller_width); - else - //BBS: have large area, clean the small width loop - offsets_with_smaller_width.clear(); - } - } else { - //FIXME Is this offset correct if the line width of the inner perimeters differs - // from the line width of the infill? - coord_t distance = (i == 1) ? ext_perimeter_spacing2 : perimeter_spacing; - //BBS - //offsets = this->config->thin_walls ? - // This path will ensure, that the perimeters do not overfill, as in - // prusa3d/Slic3r GH #32, but with the cost of rounding the perimeters - // excessively, creating gaps, which then need to be filled in by the not very - // reliable gap fill algorithm. - // Also the offset2(perimeter, -x, x) may sometimes lead to a perimeter, which is larger than - // the original. - //offset2_ex(last, - // - float(distance + min_spacing / 2. - 1.), - // float(min_spacing / 2. - 1.)) : - // If "detect thin walls" is not enabled, this paths will be entered, which - // leads to overflows, as in prusa3d/Slic3r GH #32 - //offset_ex(last, - float(distance)); + coord_t wall_0_inset = 0; + if (apply_precise_outer_wall) + wall_0_inset = -coord_t(ext_perimeter_width / 2 - ext_perimeter_spacing / 2); - //BBS: For internal perimeter, we should "enable" thin wall strategy in which offset2 is used to - // remove too closed line, so that gap fill can be used for such internal narrow area in following - // handling. - offsets = offset2_ex(last, - -float(distance + min_spacing / 2. - 1.), - float(min_spacing / 2. - 1.)); - // look for gaps - if (has_gap_fill) - // not using safety offset here would "detect" very narrow gaps - // (but still long enough to escape the area threshold) that gap fill - // won't be able to fill but we'd still remove from infill area - append(gaps, diff_ex( - offset(last, - float(0.5 * distance)), - offset(offsets, float(0.5 * distance + 10)))); // safety offset - } - if (offsets.empty() && offsets_with_smaller_width.empty()) { - // Store the number of loops actually generated. - loop_number = i - 1; - // No region left to be filled in. - last.clear(); - break; - } else if (i > loop_number) { - // If i > loop_number, we were looking just for gaps. - break; - } - { - for (const ExPolygon& expolygon : offsets) { - // Outer contour may overlap with an inner contour, - // inner contour may overlap with another inner contour, - // outer contour may overlap with itself. - //FIXME evaluate the overlaps, annotate each point with an overlap depth, - // compensate for the depth of intersection. - contours[i].emplace_back(expolygon.contour, i, true); + //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; - if (!expolygon.holes.empty()) { - holes[i].reserve(holes[i].size() + expolygon.holes.size()); - for (const Polygon& hole : expolygon.holes) - holes[i].emplace_back(hole, i, false); - } - } + // Set one perimeter when TopSurfaces is selected. + if (config->only_one_wall_top) + loop_number = 0; - //BBS: save perimeter loop which use smaller width - if (i == 0) { - for (const ExPolygon& expolygon : offsets_with_smaller_width) { - contours[i].emplace_back(PerimeterGeneratorLoop(expolygon.contour, i, true, true)); - if (!expolygon.holes.empty()) { - holes[i].reserve(holes[i].size() + expolygon.holes.size()); - for (const Polygon& hole : expolygon.holes) - holes[i].emplace_back(PerimeterGeneratorLoop(hole, i, false, true)); - } - } - } - } + Arachne::WallToolPathsParams input_params_tmp = input_params; + + Polygons last_p = to_polygons(last); + Arachne::WallToolPaths wall_tool_paths(last_p, bead_width_0, perimeter_spacing, coord_t(loop_number + 1), + wall_0_inset, layer_height, input_params_tmp); + Arachne::Perimeters perimeters = wall_tool_paths.getToolPaths(); + ExPolygons infill_contour = union_ex(wall_tool_paths.getInnerContour()); - last = std::move(offsets); + // Check if there are some remaining perimeters to generate (the number of perimeters + // is greater than one together with enabled the single perimeter on top surface feature). + if (inner_loop_number >= 0) { + assert(upper_slices != nullptr); - //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); - } + // Infill contour bounding box. + BoundingBox infill_contour_bbox = get_extents(infill_contour); + infill_contour_bbox.offset(SCALED_EPSILON); + + coord_t perimeter_width = this->perimeter_flow.scaled_width(); - if (i == loop_number && (! has_gap_fill || this->config->sparse_infill_density.value == 0)) { - // The last run of this loop is executed to collect gaps for gap fill. - // As the gap fill is either disabled or not - break; + // Get top ExPolygons from current infill contour. + Polygons upper_slices_clipped = ClipperUtils::clip_clipper_polygons_with_subject_bbox(*upper_slices, infill_contour_bbox); + top_expolygons = diff_ex(infill_contour, upper_slices_clipped); + + if (!top_expolygons.empty()) { + if (lower_slices != nullptr) { + const float bridge_offset = float(std::max(ext_perimeter_spacing, perimeter_width)); + const Polygons lower_slices_clipped = ClipperUtils::clip_clipper_polygons_with_subject_bbox(*lower_slices, infill_contour_bbox); + const ExPolygons current_slices_bridges = offset_ex(diff_ex(top_expolygons, lower_slices_clipped), bridge_offset); + + // Remove bridges from top surface polygons. + top_expolygons = diff_ex(top_expolygons, current_slices_bridges); } - } - // nest loops: holes first - for (int d = 0; d <= loop_number; ++ d) { - PerimeterGeneratorLoops &holes_d = holes[d]; - // loop through all holes having depth == d - for (int i = 0; i < (int)holes_d.size(); ++ i) { - const PerimeterGeneratorLoop &loop = holes_d[i]; - // find the hole loop that contains this one, if any - for (int t = d + 1; t <= loop_number; ++ t) { - for (int j = 0; j < (int)holes[t].size(); ++ j) { - PerimeterGeneratorLoop &candidate_parent = holes[t][j]; - if (candidate_parent.polygon.contains(loop.polygon.first_point())) { - candidate_parent.children.push_back(loop); - holes_d.erase(holes_d.begin() + i); - -- i; - goto NEXT_LOOP; - } - } - } - // if no hole contains this hole, find the contour loop that contains it - for (int t = loop_number; t >= 0; -- t) { - for (int j = 0; j < (int)contours[t].size(); ++ j) { - PerimeterGeneratorLoop &candidate_parent = contours[t][j]; - if (candidate_parent.polygon.contains(loop.polygon.first_point())) { - candidate_parent.children.push_back(loop); - holes_d.erase(holes_d.begin() + i); - -- i; - goto NEXT_LOOP; - } - } + // Filter out areas that are too thin and expand top surface polygons a bit to hide the wall line. + // ORCA: skip if the top surface area is smaller than "min_width_top_surface" + const float top_surface_min_width = std::max(float(ext_perimeter_spacing) / 4.f + scaled(0.00001), float(scale_(config->min_width_top_surface.get_abs_value(unscale_(perimeter_width)))) / 4.f); + // Shrink the polygon to remove the small areas, then expand it back out plus a maragin to hide the wall line a little. + // ORCA: Expand the polygon with half the perimeter width in addition to the contracted amount, + // not the full perimeter width as PS does, to enable thin lettering to print on the top surface without nozzle collisions + // 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. + top_expolygons = intersection_ex(top_expolygons, infill_contour); + + const Polygons not_top_polygons = to_polygons(not_top_expolygons); + 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); + Arachne::Perimeters 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; + for (Arachne::ExtrusionLine &el : inner_perimeter) + ++el.inset_idx; } - NEXT_LOOP: ; } + + perimeters.insert(perimeters.end(), inner_perimeters.begin(), inner_perimeters.end()); + infill_contour = union_ex(top_expolygons, inner_wall_tool_paths.getInnerContour()); + } else { + // There is no top surface ExPolygon, so we call Arachne again with parameters + // like when the single perimeter feature is disabled. + Arachne::WallToolPaths no_single_perimeter_tool_paths(last_p, bead_width_0, perimeter_spacing, coord_t(inner_loop_number + 2), wall_0_inset, layer_height, input_params_tmp); + perimeters = no_single_perimeter_tool_paths.getToolPaths(); + infill_contour = union_ex(no_single_perimeter_tool_paths.getInnerContour()); } - // nest contour loops - for (int d = loop_number; d >= 1; -- d) { - PerimeterGeneratorLoops &contours_d = contours[d]; - // loop through all contours having depth == d - for (int i = 0; i < (int)contours_d.size(); ++ i) { - const PerimeterGeneratorLoop &loop = contours_d[i]; - // find the contour loop that contains it - for (int t = d - 1; t >= 0; -- t) { - for (size_t j = 0; j < contours[t].size(); ++ j) { - PerimeterGeneratorLoop &candidate_parent = contours[t][j]; - if (candidate_parent.polygon.contains(loop.polygon.first_point())) { - candidate_parent.children.push_back(loop); - contours_d.erase(contours_d.begin() + i); - -- i; - goto NEXT_CONTOUR; - } - } - } - NEXT_CONTOUR: ; - } - } - // at this point, all loops should be in contours[0] - bool steep_overhang_contour = false; - bool steep_overhang_hole = false; - const WallDirection wall_direction = config->wall_direction; - if (wall_direction != WallDirection::Auto) { - // Skip steep overhang detection if wall direction is specified - steep_overhang_contour = true; - steep_overhang_hole = true; - } - ExtrusionEntityCollection entities = traverse_loops(*this, contours.front(), thin_walls, steep_overhang_contour, steep_overhang_hole); - // All walls are counter-clockwise initially, so we don't need to reorient it if that's what we want - if (wall_direction != WallDirection::CounterClockwise) { - reorient_perimeters(entities, steep_overhang_contour, steep_overhang_hole, - // Reverse internal only if the wall direction is auto - this->config->overhang_reverse_internal_only && wall_direction == WallDirection::Auto); - } + } + //PS - // if brim will be printed, reverse the order of perimeters so that - // we continue inwards after having finished the brim - // TODO: add test for perimeter order - bool is_outer_wall_first = this->config->wall_sequence == WallSequence::OuterInner; - if (is_outer_wall_first || - //BBS: always print outer wall first when there indeed has brim. - (this->layer_id == 0 && - this->object_config->brim_type == BrimType::btOuterOnly && - this->object_config->brim_width.value > 0)) - entities.reverse(); - // Orca: sandwich mode. Apply after 1st layer. - else if ((this->config->wall_sequence == WallSequence::InnerOuterInner) && layer_id > 0){ - entities.reverse(); // reverse all entities - order them from external to internal - if(entities.entities.size()>2){ // 3 walls minimum needed to do inner outer inner ordering - int position = 0; // index to run the re-ordering for multiple external perimeters in a single island. - int arr_i, arr_j = 0; // indexes to run through the walls in the for loops - int outer, first_internal, second_internal, max_internal, current_perimeter; // allocate index values - - // Initiate reorder sequence to bring any index 1 (first internal) perimeters ahead of any second internal perimeters - // Leaving these out of order will result in print defects on the external wall as they will be extruded prior to any - // external wall. To do the re-ordering, we are creating two extrusion arrays - reordered_extrusions which will contain - // the reordered extrusions and skipped_extrusions will contain the ones that were skipped in the scan - ExtrusionEntityCollection reordered_extrusions, skipped_extrusions; - bool found_second_internal = false; // helper variable to indicate the start of a new island - - for(auto extrusion_to_reorder : entities.entities){ //scan the perimeters to reorder - switch (extrusion_to_reorder->inset_idx) { + loop_number = int(perimeters.size()) - 1; + +#ifdef ARACHNE_DEBUG + { + static int iRun = 0; + export_perimeters_to_svg(debug_out_path("arachne-perimeters-%d-%d.svg", params.layer_id, iRun++), to_polygons(last), perimeters, union_ex(wallToolPaths.getInnerContour())); + } +#endif + + // All closed ExtrusionLine should have the same the first and the last point. + // But in rare cases, Arachne produce ExtrusionLine marked as closed but without + // equal the first and the last point. + assert([&perimeters = std::as_const(perimeters)]() -> bool { + for (const Arachne::Perimeter& perimeter : perimeters) + for (const Arachne::ExtrusionLine& el : perimeter) + if (el.is_closed && el.junctions.front().p != el.junctions.back().p) + return false; + return true; + }()); + + bool is_outer_wall_first = + this->config->wall_sequence == WallSequence::OuterInner || + this->config->wall_sequence == WallSequence::InnerOuterInner; + + if (layer_id == 0){ // disable inner outer inner algorithm after the first layer + is_outer_wall_first = + this->config->wall_sequence == WallSequence::OuterInner; + } + Arachne::PerimeterOrder::PerimeterExtrusions ordered_extrusions = Arachne::PerimeterOrder::ordered_perimeter_extrusions(perimeters, is_outer_wall_first); + + // printf("New Layer: Layer ID %d\n",layer_id); //debug - new layer + if (this->config->wall_sequence == WallSequence::InnerOuterInner && layer_id > 0) { // only enable inner outer inner algorithm after first layer + if (ordered_extrusions.size() > 2) { // 3 walls minimum needed to do inner outer inner ordering + int position = 0; // index to run the re-ordering for multiple external perimeters in a single island. + int arr_i, arr_j = 0; // indexes to run through the walls in the for loops + int outer, first_internal, second_internal, max_internal, current_perimeter; // allocate index values + + // To address any remaining scenarios where the outer perimeter contour is not first on the list as arachne sometimes reorders the perimeters when clustering + // for OI mode that is used the basis for IOI + bringContoursToFront(ordered_extrusions); + Arachne::PerimeterOrder::PerimeterExtrusions reordered_extrusions; + + // Debug statement to print spacing values: + //printf("External threshold - Ext perimeter: %d Ext spacing: %d Int perimeter: %d Int spacing: %d\n", this->ext_perimeter_flow.scaled_width(),this->ext_perimeter_flow.scaled_spacing(),this->perimeter_flow.scaled_width(), this->perimeter_flow.scaled_spacing()); + + // Get searching thresholds. For an external perimeter we take the external perimeter spacing/2 plus the internal perimeter spacing/2 and expand by 3% to cover + // rounding errors + coord_t threshold_external = (this->ext_perimeter_flow.scaled_spacing()/2 + this->perimeter_flow.scaled_spacing()/2)*1.03; + + // For the intenal perimeter threshold, the distance is the internal perimeter spacing expanded by 3% to cover rounding errors. + coord_t threshold_internal = this->perimeter_flow.scaled_spacing() * 1.03; + + // Re-order extrusions based on distance + // Alorithm will aggresively optimise for the appearance of the outermost perimeter + ordered_extrusions = reorderPerimetersByProximity(ordered_extrusions,threshold_external,threshold_internal ); + reordered_extrusions = ordered_extrusions; // copy them into the reordered extrusions vector to allow for IOI operations to be performed below without altering the base ordered extrusions list. + + // Now start the sandwich mode wall re-ordering using the reordered_extrusions as the basis + // scan to find the external perimeter, first internal, second internal and last perimeter in the island. + // We then advance the position index to move to the second island and continue until there are no more + // perimeters left. + while (position < reordered_extrusions.size()) { + outer = first_internal = second_internal = current_perimeter = -1; // initialise all index values to -1 + max_internal = reordered_extrusions.size()-1; // initialise the maximum internal perimeter to the last perimeter on the extrusion list + // run through the walls to get the index values that need re-ordering until the first one for each + // is found. Start at "position" index to enable the for loop to iterate for multiple external + // perimeters in a single island + // printf("Reorder Loop. Position %d, extrusion list size: %d, Outer index %d, inner index %d, second inner index %d\n", position, reordered_extrusions.size(),outer,first_internal,second_internal); + for (arr_i = position; arr_i < reordered_extrusions.size(); ++arr_i) { + // printf("Perimeter: extrusion inset index %d, ordered extrusions array position %d\n",reordered_extrusions[arr_i].extrusion->inset_idx, arr_i); + switch (reordered_extrusions[arr_i].extrusion.inset_idx) { case 0: // external perimeter - if(found_second_internal){ //new island - move skipped extrusions to reordered array - for(auto extrusion_skipped : skipped_extrusions) - reordered_extrusions.append(*extrusion_skipped); - skipped_extrusions.clear(); - } - reordered_extrusions.append(*extrusion_to_reorder); + if (outer == -1) + outer = arr_i; break; - case 1: // first internal perimeter - reordered_extrusions.append(*extrusion_to_reorder); + case 1: // first internal wall + if (first_internal==-1 && arr_i>outer && outer!=-1){ + first_internal = arr_i; + } break; - default: // second internal+ perimeter -> put them in the skipped extrusions array - skipped_extrusions.append(*extrusion_to_reorder); - found_second_internal = true; + case 2: // second internal wall + if (second_internal == -1 && arr_i > first_internal && outer!=-1){ + second_internal = arr_i; + } break; } - } - if(entities.entities.size()>reordered_extrusions.size()){ - // we didnt find any more islands, so lets move the remaining skipped perimeters to the reordered extrusions list. - for(auto extrusion_skipped : skipped_extrusions) - reordered_extrusions.append(*extrusion_skipped); - skipped_extrusions.clear(); + if(outer >-1 && first_internal>-1 && reordered_extrusions[arr_i].extrusion.is_external_perimeter()){ // found a new external perimeter after we've found at least a first internal perimeter to re-order. + // This means we entered a new island. + arr_i=arr_i-1; //step back one perimeter + max_internal = arr_i; // new maximum internal perimeter is now this as we have found a new external perimeter, hence a new island. + break; // exit the for loop + } } - // Now start the sandwich mode wall re-ordering using the reordered_extrusions as the basis - // scan to find the external perimeter, first internal, second internal and last perimeter in the island. - // We then advance the position index to move to the second "island" and continue until there are no more - // perimeters left. - while (position < reordered_extrusions.size()) { - outer = first_internal = second_internal = current_perimeter = -1; // initialise all index values to -1 - max_internal = reordered_extrusions.size()-1; // initialise the maximum internal perimeter to the last perimeter on the extrusion list - // run through the walls to get the index values that need re-ordering until the first one for each - // is found. Start at "position" index to enable the for loop to iterate for multiple external - // perimeters in a single island - for (arr_i = position; arr_i < reordered_extrusions.size(); ++arr_i) { - switch (reordered_extrusions.entities[arr_i]->inset_idx) { - case 0: // external perimeter - if (outer == -1) - outer = arr_i; - break; - case 1: // first internal wall - if (first_internal==-1 && arr_i>outer && outer!=-1){ - first_internal = arr_i; - } - break; - case 2: // second internal wall - if (second_internal == -1 && arr_i > first_internal && outer!=-1){ - second_internal = arr_i; - } - break; - } - if(outer >-1 && first_internal>-1 && second_internal>-1 && reordered_extrusions.entities[arr_i]->inset_idx == 0){ // found a new external perimeter after we've found all three perimeters to re-order -> this means we entered a new island. - arr_i=arr_i-1; //step back one perimeter - max_internal = arr_i; // new maximum internal perimeter is now this as we have found a new external perimeter, hence a new island. - break; // exit the for loop + // printf("Layer ID %d, Outer index %d, inner index %d, second inner index %d, maximum internal perimeter %d \n",layer_id,outer,first_internal,second_internal, max_internal); + if (outer > -1 && first_internal > -1 && second_internal > -1) { // found all three perimeters to re-order? If not the perimeters will be processed outside in. + Arachne::PerimeterOrder::PerimeterExtrusions inner_outer_extrusions; // temporary array to hold extrusions for reordering + inner_outer_extrusions.resize(max_internal - position + 1, Arachne::PerimeterOrder::PerimeterExtrusion{{},0.0,{},{}}); // reserve array containing the number of perimeters before a new island. Variables are array indexes hence need to add +1 to convert to position allocations + // printf("Allocated array size %d, max_internal index %d, start position index %d \n",max_internal-position+1,max_internal,position); + + for (arr_j = max_internal; arr_j >=position; --arr_j){ // go inside out towards the external perimeter (perimeters in reverse order) and store all internal perimeters until the first one identified with inset index 2 + if(arr_j >= second_internal){ + //printf("Inside out loop: Mapped perimeter index %d to array position %d\n", arr_j, max_internal-arr_j); + inner_outer_extrusions[max_internal-arr_j] = reordered_extrusions[arr_j]; + current_perimeter++; } } - - if (outer > -1 && first_internal > -1 && second_internal > -1) { // found perimeters to re-order? - ExtrusionEntityCollection inner_outer_extrusions; // temporary collection to hold extrusions for reordering - - for (arr_j = max_internal; arr_j >=position; --arr_j){ // go inside out towards the external perimeter (perimeters in reverse order) and store all internal perimeters until the first one identified with inset index 2 - if(arr_j >= second_internal){ - inner_outer_extrusions.append(*reordered_extrusions.entities[arr_j]); - current_perimeter++; - } - } - - for (arr_j = position; arr_j < second_internal; ++arr_j){ // go outside in and map the remaining perimeters (external and first internal wall(s)) using the outside in wall order - inner_outer_extrusions.append(*reordered_extrusions.entities[arr_j]); - } - - for(arr_j = position; arr_j <= max_internal; ++arr_j) // replace perimeter array with the new re-ordered array - entities.replace(arr_j, *inner_outer_extrusions.entities[arr_j-position]); - } else - break; - // go to the next perimeter from the current position to continue scanning for external walls in the same island - position = arr_i + 1; + + for (arr_j = position; arr_j < second_internal; ++arr_j){ // go outside in and map the remaining perimeters (external and first internal wall(s)) using the outside in wall order + // printf("Outside in loop: Mapped perimeter index %d to array position %d\n", arr_j, current_perimeter+1); + inner_outer_extrusions[++current_perimeter] = reordered_extrusions[arr_j]; + } + + for(arr_j = position; arr_j <= max_internal; ++arr_j) // replace perimeter array with the new re-ordered array + ordered_extrusions[arr_j] = inner_outer_extrusions[arr_j-position]; } + // go to the next perimeter from the current position to continue scanning for external walls in the same island + position = arr_i + 1; } } - - // append perimeters for this slice as a collection - if (! entities.empty()) - this->loops->append(entities); + } + + bool steep_overhang_contour = false; + bool steep_overhang_hole = false; + const WallDirection wall_direction = config->wall_direction; + if (wall_direction != WallDirection::Auto) { + // Skip steep overhang detection if wall direction is specified + steep_overhang_contour = true; + steep_overhang_hole = true; + } + if (ExtrusionEntityCollection extrusion_coll = traverse_extrusions(*this, ordered_extrusions, steep_overhang_contour, steep_overhang_hole); !extrusion_coll.empty()) { + // All walls are counter-clockwise initially, so we don't need to reorient it if that's what we want + if (wall_direction != WallDirection::CounterClockwise) { + reorient_perimeters(extrusion_coll, steep_overhang_contour, steep_overhang_hole, + // Reverse internal only if the wall direction is auto + this->config->overhang_reverse_internal_only && wall_direction == WallDirection::Auto); + } + this->loops->append(extrusion_coll); + } - } // for each loop of an island + const coord_t spacing = (perimeters.size() == 1) ? ext_perimeter_spacing2 : perimeter_spacing; - // fill gaps - if (! gaps.empty()) { - // collapse - double min = 0.2 * perimeter_width * (1 - INSET_OVERLAP_TOLERANCE); - double max = 2. * perimeter_spacing; - ExPolygons gaps_ex = diff_ex( - //FIXME offset2 would be enough and cheaper. - opening_ex(gaps, float(min / 2.)), - offset2_ex(gaps, - float(max / 2.), float(max / 2. + ClipperSafetyOffset))); - ThickPolylines polylines; - for (ExPolygon& ex : gaps_ex) { - //BBS: Use DP simplify to avoid duplicated points and accelerate medial-axis calculation as well. - ex.douglas_peucker(surface_simplify_resolution); - ex.medial_axis(min, max, &polylines); - } - -#ifdef GAPS_OF_PERIMETER_DEBUG_TO_SVG - { - static int irun = 0; - BoundingBox bbox_svg; - bbox_svg.merge(get_extents(gaps_ex)); - { - std::stringstream stri; - stri << "debug_gaps_ex_" << irun << ".svg"; - SVG svg(stri.str(), bbox_svg); - svg.draw(to_polylines(gaps_ex), "blue", 0.5); - svg.Close(); - } - ++ irun; - } -#endif - // SoftFever: filter out tiny gap fills - polylines.erase(std::remove_if(polylines.begin(), polylines.end(), - [&](const ThickPolyline& p) { - return p.length() < scale_(config->filter_out_gap_fill.value); - }), polylines.end()); - - - if (! polylines.empty()) { - ExtrusionEntityCollection gap_fill; - variable_width(polylines, erGapFill, this->solid_infill_flow, gap_fill.entities); - /* Make sure we don't infill narrow parts that are already gap-filled - (we only consider this surface's gaps to reduce the diff() complexity). - Growing actual extrusions ensures that gaps not filled by medial axis - are not subtracted from fill surfaces (they might be too short gaps - that medial axis skips but infill might join with other infill regions - 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)); - this->gap_fill->append(std::move(gap_fill.entities)); - - } - } + if (offset_ex(infill_contour, -float(spacing / 2.)).empty()) + infill_contour.clear(); // Infill region is too small, so let's filter it out. // create one more offset to be used as boundary for fill // we offset by half the perimeter spacing (to get to the actual infill boundary) // and then we offset back and forth by half the infill spacing to only consider the // non-collapsing regions - coord_t inset = + coord_t inset = (loop_number < 0) ? 0 : (loop_number == 0) ? - // one loop - ext_perimeter_spacing / 2 : - // two or more loops? - perimeter_spacing / 2; + // one loop + ext_perimeter_spacing : + // two or more loops? + perimeter_spacing; + coord_t top_inset = inset; + + top_inset = coord_t(scale_(this->config->top_bottom_infill_wall_overlap.get_abs_value(unscale(inset)))); + if(is_topmost_layer || is_bottom_layer) + inset = coord_t(scale_(this->config->top_bottom_infill_wall_overlap.get_abs_value(unscale(inset)))); + else + inset = coord_t(scale_(this->config->infill_wall_overlap.get_abs_value(unscale(inset)))); - // only apply infill overlap if we actually have one perimeter - coord_t infill_peri_overlap = 0; - coord_t top_infill_peri_overlap = 0; - if (inset > 0) { - if(this->layer_id == 0 || this->upper_slices == nullptr){ - infill_peri_overlap = coord_t(scale_(this->config->top_bottom_infill_wall_overlap.get_abs_value(unscale(inset + solid_infill_spacing / 2)))); - }else{ - infill_peri_overlap = coord_t(scale_(this->config->infill_wall_overlap.get_abs_value(unscale(inset + solid_infill_spacing / 2)))); - top_infill_peri_overlap = coord_t(scale_(this->config->top_bottom_infill_wall_overlap.get_abs_value(unscale(inset + solid_infill_spacing / 2)))); - } - inset -= infill_peri_overlap; - } // simplify infill contours according to resolution Polygons pp; - for (ExPolygon &ex : last) + for (ExPolygon& ex : infill_contour) ex.simplify_p(m_scaled_resolution, &pp); ExPolygons not_filled_exp = union_ex(pp); // collapse too narrow infill areas - coord_t min_perimeter_infill_spacing = coord_t(solid_infill_spacing * (1. - INSET_OVERLAP_TOLERANCE)); + const auto min_perimeter_infill_spacing = coord_t(solid_infill_spacing * (1. - INSET_OVERLAP_TOLERANCE)); ExPolygons infill_exp = offset2_ex( not_filled_exp, - float(-inset - min_perimeter_infill_spacing / 2.), - float(min_perimeter_infill_spacing / 2.)); + float(-min_perimeter_infill_spacing / 2.), + float(inset + min_perimeter_infill_spacing / 2.)); // 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))); - if (!top_fills.empty()) { - infill_exp = union_ex(infill_exp, offset_ex(top_infill_exp, double(top_infill_peri_overlap))); + if (!top_expolygons.empty()) { + infill_exp = union_ex(infill_exp, offset_ex(top_expolygons, double(top_inset))); } this->fill_surfaces->append(infill_exp, stInternal); @@ -2421,861 +2376,813 @@ void PerimeterGenerator::process_classic() // BBS: get the no-overlap infill expolygons { ExPolygons polyWithoutOverlap; - if (min_perimeter_infill_spacing / 2 > infill_peri_overlap) - polyWithoutOverlap = offset2_ex( - not_filled_exp, - float(-inset - min_perimeter_infill_spacing / 2.), - float(min_perimeter_infill_spacing / 2 - infill_peri_overlap)); - else - polyWithoutOverlap = offset_ex( - not_filled_exp, - double(-inset - infill_peri_overlap)); - if (!top_fills.empty()) - polyWithoutOverlap = union_ex(polyWithoutOverlap, top_infill_exp); + polyWithoutOverlap = offset2_ex( + not_filled_exp, + float(-min_perimeter_infill_spacing / 2.), + float(+min_perimeter_infill_spacing / 2.)); + if (!top_expolygons.empty()) + polyWithoutOverlap = union_ex(polyWithoutOverlap, top_expolygons); this->fill_no_overlap->insert(this->fill_no_overlap->end(), polyWithoutOverlap.begin(), polyWithoutOverlap.end()); } - - } // for each island + } } -//BBS: -void PerimeterGenerator::add_infill_contour_for_arachne( ExPolygons infill_contour, - int loops, - coord_t ext_perimeter_spacing, - coord_t perimeter_spacing, - coord_t min_perimeter_infill_spacing, - coord_t spacing, - bool is_inner_part) +void PerimeterGenerator::process_classic() { - if( offset_ex(infill_contour, -float(spacing / 2.)).empty() ) - { - infill_contour.clear(); // Infill region is too small, so let's filter it out. - } - - // create one more offset to be used as boundary for fill - // we offset by half the perimeter spacing (to get to the actual infill boundary) - // and then we offset back and forth by half the infill spacing to only consider the - // non-collapsing regions - coord_t insert = (loops < 0) ? 0: ext_perimeter_spacing; - if (is_inner_part || loops > 0) - insert = perimeter_spacing; + group_region_by_fuzzify(*this); - insert = coord_t(scale_(this->config->infill_wall_overlap.get_abs_value(unscale(insert)))); + // other perimeters + m_mm3_per_mm = this->perimeter_flow.mm3_per_mm(); + coord_t perimeter_width = this->perimeter_flow.scaled_width(); + coord_t perimeter_spacing = this->perimeter_flow.scaled_spacing(); - Polygons inner_pp; - for (ExPolygon &ex : infill_contour) - ex.simplify_p(m_scaled_resolution, &inner_pp); + // external perimeters + m_ext_mm3_per_mm = this->ext_perimeter_flow.mm3_per_mm(); + coord_t ext_perimeter_width = this->ext_perimeter_flow.scaled_width(); - this->fill_surfaces->append(offset2_ex(union_ex(inner_pp), float(-min_perimeter_infill_spacing / 2.), float(insert + min_perimeter_infill_spacing / 2.)), stInternal); + coord_t ext_perimeter_spacing = this->ext_perimeter_flow.scaled_spacing(); + coord_t ext_perimeter_spacing2; + // Orca: ignore precise_outer_wall if wall_sequence is not InnerOuter + if(config->precise_outer_wall && this->config->wall_sequence == WallSequence::InnerOuter) + ext_perimeter_spacing2 = scaled(0.5f * (this->ext_perimeter_flow.width() + this->perimeter_flow.width())); + else + ext_perimeter_spacing2 = scaled(0.5f * (this->ext_perimeter_flow.spacing() + this->perimeter_flow.spacing())); + + // overhang perimeters + m_mm3_per_mm_overhang = this->overhang_flow.mm3_per_mm(); + + // solid infill + coord_t solid_infill_spacing = this->solid_infill_flow.scaled_spacing(); - append(*this->fill_no_overlap, offset2_ex(union_ex(inner_pp), float(-min_perimeter_infill_spacing / 2.), float(+min_perimeter_infill_spacing / 2.))); -} + // prepare grown lower layer slices for overhang detection + if (this->lower_slices != nullptr && this->config->detect_overhang_wall) { + // We consider overhang any part where the entire nozzle diameter is not supported by the + // lower layer, so we take lower slices and offset them by half the nozzle diameter used + // in the current layer + double nozzle_diameter = this->print_config->nozzle_diameter.get_at(this->config->wall_filament - 1); + m_lower_slices_polygons = offset(*this->lower_slices, float(scale_(+nozzle_diameter / 2))); + } + + // Calculate the minimum required spacing between two adjacent traces. + // This should be equal to the nominal flow spacing but we experiment + // with some tolerance in order to avoid triggering medial axis when + // some squishing might work. Loops are still spaced by the entire + // flow spacing; this only applies to collapsing parts. + // For ext_min_spacing we use the ext_perimeter_spacing calculated for two adjacent + // external loops (which is the correct way) instead of using ext_perimeter_spacing2 + // which is the spacing between external and internal, which is not correct + // and would make the collapsing (thus the details resolution) dependent on + // internal flow which is unrelated. + coord_t min_spacing = coord_t(perimeter_spacing * (1 - INSET_OVERLAP_TOLERANCE)); + coord_t ext_min_spacing = coord_t(ext_perimeter_spacing * (1 - INSET_OVERLAP_TOLERANCE)); + bool has_gap_fill = this->config->gap_infill_speed.value > 0; -// Orca: sacrificial bridge layer algorithm ported from SuperSlicer -void PerimeterGenerator::process_no_bridge(Surfaces& all_surfaces, coord_t perimeter_spacing, coord_t ext_perimeter_width) -{ - //store surface for bridge infill to avoid unsupported perimeters (but the first one, this one is always good) - if (this->config->counterbore_hole_bridging != chbNone - && this->lower_slices != NULL && !this->lower_slices->empty()) { - const coordf_t bridged_infill_margin = scale_(BRIDGE_INFILL_MARGIN); + // BBS: this flow is for smaller external perimeter for small area + coord_t ext_min_spacing_smaller = coord_t(ext_perimeter_spacing * (1 - SMALLER_EXT_INSET_OVERLAP_TOLERANCE)); + this->smaller_ext_perimeter_flow = this->ext_perimeter_flow; + // BBS: to be checked + this->smaller_ext_perimeter_flow = this->smaller_ext_perimeter_flow.with_width(SCALING_FACTOR * + (ext_perimeter_width - 0.5 * SMALLER_EXT_INSET_OVERLAP_TOLERANCE * ext_perimeter_spacing)); + m_ext_mm3_per_mm_smaller_width = this->smaller_ext_perimeter_flow.mm3_per_mm(); - for (size_t surface_idx = 0; surface_idx < all_surfaces.size(); surface_idx++) { - Surface* surface = &all_surfaces[surface_idx]; - ExPolygons last = { surface->expolygon }; - //compute our unsupported surface - 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)); - if (!unsupported_filtered.empty()) { - //to_draw.insert(to_draw.end(), last.begin(), last.end()); - //extract only the useful part of the lower layer. The safety offset is really needed here. - ExPolygons support = diff_ex(last, unsupported, ApplySafetyOffset::Yes); - if (!unsupported.empty()) { - //only consider the part that can be bridged (really, by the bridge algorithm) - //first, separate into islands (ie, each ExPlolygon) - int numploy = 0; - //only consider the bottom layer that intersect unsupported, to be sure it's only on our island. - ExPolygonCollection lower_island(support); - //a detector per island - ExPolygons bridgeable; - for (ExPolygon unsupported : unsupported_filtered) { - BridgeDetector detector{ unsupported, - lower_island.expolygons, - perimeter_spacing }; - if (detector.detect_angle(Geometry::deg2rad(this->config->bridge_angle.value))) - expolygons_append(bridgeable, union_ex(detector.coverage(-1, true))); - } - if (!bridgeable.empty()) { - //check if we get everything or just the bridgeable area - if (/*this->config->counterbore_hole_bridging.value == chbNoPeri || */this->config->counterbore_hole_bridging.value == chbFilled) { - //we bridge everything, even the not-bridgeable bits - for (size_t i = 0; i < unsupported_filtered.size();) { - ExPolygon& poly_unsupp = *(unsupported_filtered.begin() + i); - Polygons contour_simplified = poly_unsupp.contour.simplify(perimeter_spacing); - ExPolygon poly_unsupp_bigger = poly_unsupp; - Polygons contour_bigger = offset(poly_unsupp_bigger.contour, bridged_infill_margin); - if (contour_bigger.size() == 1) poly_unsupp_bigger.contour = contour_bigger[0]; - - //check convex, has some bridge, not overhang - if (contour_simplified.size() == 1 && contour_bigger.size() == 1 && contour_simplified[0].concave_points().size() == 0 - && intersection_ex(bridgeable, ExPolygons{ poly_unsupp }).size() > 0 - && diff_ex(ExPolygons{ poly_unsupp_bigger }, union_ex(last, offset_ex(bridgeable, bridged_infill_margin + perimeter_spacing / 2)), ApplySafetyOffset::Yes).size() == 0 - ) { - //ok, keep it - i++; - } else { - unsupported_filtered.erase(unsupported_filtered.begin() + i); - } - } - unsupported_filtered = intersection_ex(last, - offset2_ex(unsupported_filtered, double(-perimeter_spacing / 2), double(bridged_infill_margin + perimeter_spacing / 2))); - if (this->config->counterbore_hole_bridging.value == chbFilled) { - for (ExPolygon& expol : unsupported_filtered) { - //check if the holes won't be covered by the upper layer - //TODO: if we want to do that, we must modify the geometry before making perimeters. - //if (this->upper_slices != nullptr && !this->upper_slices->expolygons.empty()) { - // for (Polygon &poly : expol.holes) poly.make_counter_clockwise(); - // float perimeterwidth = this->config->perimeters == 0 ? 0 : (this->ext_perimeter_flow.scaled_width() + (this->config->perimeters - 1) + this->perimeter_flow.scaled_spacing()); - // std::cout << "test upper slices with perimeterwidth=" << perimeterwidth << "=>" << offset_ex(this->upper_slices->expolygons, -perimeterwidth).size(); - // if (intersection(Polygons() = { expol.holes }, to_polygons(offset_ex(this->upper_slices->expolygons, -this->ext_perimeter_flow.scaled_width() / 2))).empty()) { - // std::cout << " EMPTY"; - // expol.holes.clear(); - // } else { - // } - // std::cout << "\n"; - //} else { - expol.holes.clear(); - //} - - //detect inside volume - for (size_t surface_idx_other = 0; surface_idx_other < all_surfaces.size(); surface_idx_other++) { - if (surface_idx == surface_idx_other) continue; - if (intersection_ex(ExPolygons() = { expol }, ExPolygons() = { all_surfaces[surface_idx_other].expolygon }).size() > 0) { - //this means that other_surf was inside an expol holes - //as we removed them, we need to add a new one - ExPolygons new_poly = offset2_ex(ExPolygons{ all_surfaces[surface_idx_other].expolygon }, double(-bridged_infill_margin - perimeter_spacing), double(perimeter_spacing)); - if (new_poly.size() == 1) { - all_surfaces[surface_idx_other].expolygon = new_poly[0]; - expol.holes.push_back(new_poly[0].contour); - expol.holes.back().make_clockwise(); - } else { - for (size_t idx = 0; idx < new_poly.size(); idx++) { - Surface new_surf = all_surfaces[surface_idx_other]; - new_surf.expolygon = new_poly[idx]; - all_surfaces.push_back(new_surf); - expol.holes.push_back(new_poly[idx].contour); - expol.holes.back().make_clockwise(); - } - all_surfaces.erase(all_surfaces.begin() + surface_idx_other); - if (surface_idx_other < surface_idx) { - surface_idx--; - surface = &all_surfaces[surface_idx]; - } - surface_idx_other--; - } - } - } - } - - } - //TODO: add other polys as holes inside this one (-margin) - } else if (/*this->config->counterbore_hole_bridging.value == chbBridgesOverhangs || */this->config->counterbore_hole_bridging.value == chbBridges) { - //simplify to avoid most of artefacts from printing lines. - ExPolygons bridgeable_simplified; - for (ExPolygon& poly : bridgeable) { - poly.simplify(perimeter_spacing, &bridgeable_simplified); - } - bridgeable_simplified = offset2_ex(bridgeable_simplified, -ext_perimeter_width, ext_perimeter_width); - //bridgeable_simplified = intersection_ex(bridgeable_simplified, unsupported_filtered); - //offset by perimeter spacing because the simplify may have reduced it a bit. - //it's not dangerous as it will be intersected by 'unsupported' later - //FIXME: add overlap in this->fill_surfaces->append - //FIXME: it overlap inside unsuppported not-bridgeable area! - - //bridgeable_simplified = offset2_ex(bridgeable_simplified, (double)-perimeter_spacing, (double)perimeter_spacing * 2); - //ExPolygons unbridgeable = offset_ex(diff_ex(unsupported, bridgeable_simplified), perimeter_spacing * 3 / 2); - //ExPolygons unbridgeable = intersection_ex(unsupported, diff_ex(unsupported_filtered, offset_ex(bridgeable_simplified, ext_perimeter_width / 2))); - //unbridgeable = offset2_ex(unbridgeable, -ext_perimeter_width, ext_perimeter_width); - - - // if (this->config->counterbore_hole_bridging.value == chbBridges) { - ExPolygons unbridgeable = unsupported_filtered; - for (ExPolygon& expol : unbridgeable) - expol.holes.clear(); - unbridgeable = diff_ex(unbridgeable, bridgeable_simplified); - unbridgeable = offset2_ex(unbridgeable, -ext_perimeter_width * 2, ext_perimeter_width * 2); - ExPolygons bridges_temp = offset2_ex(intersection_ex(last, diff_ex(unsupported_filtered, unbridgeable), ApplySafetyOffset::Yes), -ext_perimeter_width / 4, ext_perimeter_width / 4); - //remove the overhangs section from the surface polygons - ExPolygons reference = last; - last = diff_ex(last, unsupported_filtered); - //ExPolygons no_bridge = diff_ex(offset_ex(unbridgeable, ext_perimeter_width * 3 / 2), last); - //bridges_temp = diff_ex(bridges_temp, no_bridge); - coordf_t offset_to_do = bridged_infill_margin; - bool first = true; - unbridgeable = diff_ex(unbridgeable, offset_ex(bridges_temp, ext_perimeter_width)); - while (offset_to_do > ext_perimeter_width * 1.5) { - unbridgeable = offset2_ex(unbridgeable, -ext_perimeter_width / 4, ext_perimeter_width * 2.25, ClipperLib::jtSquare); - bridges_temp = diff_ex(bridges_temp, unbridgeable); - bridges_temp = offset_ex(bridges_temp, ext_perimeter_width, ClipperLib::jtMiter, 6.); - unbridgeable = diff_ex(unbridgeable, offset_ex(bridges_temp, ext_perimeter_width)); - offset_to_do -= ext_perimeter_width; - first = false; - } - unbridgeable = offset_ex(unbridgeable, ext_perimeter_width + offset_to_do, ClipperLib::jtSquare); - bridges_temp = diff_ex(bridges_temp, unbridgeable); - unsupported_filtered = offset_ex(bridges_temp, offset_to_do); - unsupported_filtered = intersection_ex(unsupported_filtered, reference); - // } else { - // ExPolygons unbridgeable = intersection_ex(unsupported, diff_ex(unsupported_filtered, offset_ex(bridgeable_simplified, ext_perimeter_width / 2))); - // unbridgeable = offset2_ex(unbridgeable, -ext_perimeter_width, ext_perimeter_width); - // unsupported_filtered = unbridgeable; - - // ////put the bridge area inside the unsupported_filtered variable - // //unsupported_filtered = intersection_ex(last, - // // diff_ex( - // // offset_ex(bridgeable_simplified, (double)perimeter_spacing / 2), - // // unbridgeable - // // ) - // // ); - // } - } else { - unsupported_filtered.clear(); - } - } else { - unsupported_filtered.clear(); - } - } - - if (!unsupported_filtered.empty()) { - - //add this directly to the infill list. - // this will avoid to throw wrong offsets into a good polygons - this->fill_surfaces->append( - unsupported_filtered, - stInternal); - - // store the results - last = diff_ex(last, unsupported_filtered, ApplySafetyOffset::Yes); - //remove "thin air" polygons (note: it assumes that all polygons below will be extruded) - for (int i = 0; i < last.size(); i++) { - if (intersection_ex(support, ExPolygons() = { last[i] }).empty()) { - this->fill_surfaces->append( - ExPolygons() = { last[i] }, - stInternal); - last.erase(last.begin() + i); - i--; - } - } - } - } - } - if (last.size() == 0) { - all_surfaces.erase(all_surfaces.begin() + surface_idx); - surface_idx--; - } else { - surface->expolygon = last[0]; - for (size_t idx = 1; idx < last.size(); idx++) { - all_surfaces.emplace_back(*surface, last[idx]); - } - } - } - } -} - -// ORCA: -// Inner Outer Inner wall ordering mode perimeter order optimisation functions -/** - * @brief Finds all perimeters touching a given set of reference lines, given as indexes. - * - * @param entities The list of PerimeterGeneratorArachneExtrusion entities. - * @param referenceIndices A set of indices representing the reference points. - * @param threshold_external The distance threshold to consider for proximity for a reference perimeter with inset index 0 - * @param threshold_internal The distance threshold to consider for proximity for a reference perimeter with inset index 1+ - * @param considered_inset_idx What perimeter inset index are we searching for (eg. if we are searching for first internal perimeters proximate to the current reference perimeter, this value should be set to 1 etc). - * @return std::vector A vector of indices representing the touching perimeters. - */ -std::vector findAllTouchingPerimeters(const std::vector& entities, const std::unordered_set& referenceIndices, size_t threshold_external, size_t threshold_internal , size_t considered_inset_idx) { - std::unordered_set touchingIndices; - - for (const int refIdx : referenceIndices) { - const auto& referenceEntity = entities[refIdx]; - Points referencePoints = Arachne::to_points(*referenceEntity.extrusion); - for (size_t i = 0; i < entities.size(); ++i) { - // Skip already considered references and the reference entity - if (referenceIndices.count(i) > 0) continue; - const auto& entity = entities[i]; - if (entity.extrusion->inset_idx == 0) continue; // Ignore inset index 0 (external) perimeters from the re-ordering even if they are touching - - if (entity.extrusion->inset_idx != considered_inset_idx) { // Find Inset index perimeters that match the requested inset index - continue; // skip if they dont match - } - - Points points = Arachne::to_points(*entity.extrusion); - double distance = MultiPoint::minimumDistanceBetweenLinesDefinedByPoints(referencePoints, points); - // Add to touchingIndices if within threshold distance - size_t threshold=0; - if(referenceEntity.extrusion->inset_idx == 0) - threshold = threshold_external; - else - threshold = threshold_internal; - if (distance <= threshold) { - touchingIndices.insert(i); - } - } - } - return std::vector(touchingIndices.begin(), touchingIndices.end()); -} - -/** - * @brief Reorders perimeters based on proximity to the reference perimeter - * - * This approach finds all perimeters touching the external perimeter first and then finds all perimeters touching these new ones until none are left - * It ensures a level-by-level traversal, similar to BFS in graph theory. - * - * @param entities The list of PerimeterGeneratorArachneExtrusion entities. - * @param referenceIndex The index of the reference perimeter. - * @param threshold_external The distance threshold to consider for proximity for a reference perimeter with inset index 0 - * @param threshold_internal The distance threshold to consider for proximity for a reference perimeter with inset index 1+ - * @return std::vector The reordered list of perimeters based on proximity. - */ -std::vector reorderPerimetersByProximity(std::vector entities, size_t threshold_external, size_t threshold_internal) { - std::vector reordered; - std::unordered_set includedIndices; - - // Function to reorder perimeters starting from a given reference index - auto reorderFromReference = [&](int referenceIndex) { - std::unordered_set firstLevelIndices; - firstLevelIndices.insert(referenceIndex); - - // Find first level touching perimeters - std::vector firstLevelTouchingIndices = findAllTouchingPerimeters(entities, firstLevelIndices, threshold_external, threshold_internal, 1); - // Bring the largest first level perimeter to the front - // The longest first neighbour is most likely the dominant proximate perimeter - // hence printing it immediately after the external perimeter should speed things up - if (!firstLevelTouchingIndices.empty()) { - auto maxIt = std::max_element(firstLevelTouchingIndices.begin(), firstLevelTouchingIndices.end(), [&entities](int a, int b) { - return entities[a].extrusion->getLength() < entities[b].extrusion->getLength(); - }); - std::iter_swap(maxIt, firstLevelTouchingIndices.end() - 1); - } - // Insert first level perimeters into reordered list - reordered.push_back(entities[referenceIndex]); - includedIndices.insert(referenceIndex); - - for (int idx : firstLevelTouchingIndices) { - if (includedIndices.count(idx) == 0) { - reordered.push_back(entities[idx]); - includedIndices.insert(idx); - } - } - - // Loop through all inset indices above 1 - size_t currentInsetIndex = 2; - while (true) { - std::unordered_set currentLevelIndices(firstLevelTouchingIndices.begin(), firstLevelTouchingIndices.end()); - std::vector currentLevelTouchingIndices = findAllTouchingPerimeters(entities, currentLevelIndices, threshold_external, threshold_internal, currentInsetIndex); - - // Break if no more touching perimeters are found - if (currentLevelTouchingIndices.empty()) { - break; - } - - // Exclude any already included indices from the current level touching indices - currentLevelTouchingIndices.erase( - std::remove_if(currentLevelTouchingIndices.begin(), currentLevelTouchingIndices.end(), - [&](int idx) { return includedIndices.count(idx) > 0; }), - currentLevelTouchingIndices.end()); - - // Bring the largest current level perimeter to the end - if (!currentLevelTouchingIndices.empty()) { - auto maxIt = std::max_element(currentLevelTouchingIndices.begin(), currentLevelTouchingIndices.end(), [&entities](int a, int b) { - return entities[a].extrusion->getLength() < entities[b].extrusion->getLength(); - }); - std::iter_swap(maxIt, currentLevelTouchingIndices.begin()); - } - - // Insert current level perimeters into reordered list - for (int idx : currentLevelTouchingIndices) { - if (includedIndices.count(idx) == 0) { - reordered.push_back(entities[idx]); - includedIndices.insert(idx); - } - } - - // Prepare for the next level - firstLevelTouchingIndices = currentLevelTouchingIndices; - currentInsetIndex++; - } - }; - - // Loop through all perimeters and reorder starting from each inset index 0 perimeter - for (size_t refIdx = 0; refIdx < entities.size(); ++refIdx) { - if (entities[refIdx].extrusion->inset_idx == 0 && includedIndices.count(refIdx) == 0) { - reorderFromReference(refIdx); - } - } - - // Append any remaining entities that were not included - for (size_t i = 0; i < entities.size(); ++i) { - if (includedIndices.count(i) == 0) { - reordered.push_back(entities[i]); - } - } - - return reordered; -} - -/** - * @brief Reorders the vector to bring external perimeter (i.e. paths with inset index 0) that are also contours (i.e. external facing lines) to the front. - * - * This function uses a stable partition to move all external perimeter contour elements to the front of the vector, - * while maintaining the relative order of non-contour elements. - * - * @param ordered_extrusions The vector of PerimeterGeneratorArachneExtrusion to reorder. - */ -void bringContoursToFront(std::vector& ordered_extrusions) { - std::stable_partition(ordered_extrusions.begin(), ordered_extrusions.end(), [](const PerimeterGeneratorArachneExtrusion& extrusion) { - return (extrusion.extrusion->is_contour() && extrusion.extrusion->inset_idx==0); - }); -} -// ORCA: -// Inner Outer Inner wall ordering mode perimeter order optimisation functions ended - - -// Thanks, Cura developers, for implementing an algorithm for generating perimeters with variable width (Arachne) that is based on the paper -// "A framework for adaptive width control of dense contour-parallel toolpaths in fused deposition modeling" -void PerimeterGenerator::process_arachne() -{ - group_region_by_fuzzify(*this); - - // other perimeters - m_mm3_per_mm = this->perimeter_flow.mm3_per_mm(); - coord_t perimeter_spacing = this->perimeter_flow.scaled_spacing(); - - // external perimeters - m_ext_mm3_per_mm = this->ext_perimeter_flow.mm3_per_mm(); - coord_t ext_perimeter_width = this->ext_perimeter_flow.scaled_width(); - coord_t ext_perimeter_spacing = this->ext_perimeter_flow.scaled_spacing(); - coord_t ext_perimeter_spacing2 = scaled(0.5f * (this->ext_perimeter_flow.spacing() + this->perimeter_flow.spacing())); - // overhang perimeters - m_mm3_per_mm_overhang = this->overhang_flow.mm3_per_mm(); - - // solid infill - coord_t solid_infill_spacing = this->solid_infill_flow.scaled_spacing(); - - // prepare grown lower layer slices for overhang detection - if (this->lower_slices != nullptr && this->config->detect_overhang_wall) { - // We consider overhang any part where the entire nozzle diameter is not supported by the - // lower layer, so we take lower slices and offset them by half the nozzle diameter used - // in the current layer - double nozzle_diameter = this->print_config->nozzle_diameter.get_at(this->config->wall_filament - 1); - m_lower_slices_polygons = offset(*this->lower_slices, float(scale_(+nozzle_diameter / 2))); - } - - Surfaces all_surfaces = this->slices->surfaces; + // prepare grown lower layer slices for overhang detection + m_lower_polygons_series = generate_lower_polygons_series(this->perimeter_flow.width()); + m_lower_overhang_dist_boundary = dist_boundary(this->perimeter_flow.width()); + if (ext_perimeter_width == perimeter_width){ + m_external_lower_polygons_series = m_lower_polygons_series; + m_external_overhang_dist_boundary=m_lower_overhang_dist_boundary; + } else { + m_external_lower_polygons_series = generate_lower_polygons_series(this->ext_perimeter_flow.width()); + m_external_overhang_dist_boundary = dist_boundary(this->ext_perimeter_flow.width()); + } + m_smaller_external_lower_polygons_series = generate_lower_polygons_series(this->smaller_ext_perimeter_flow.width()); + m_smaller_external_overhang_dist_boundary = dist_boundary(this->smaller_ext_perimeter_flow.width()); + // we need to process each island separately because we might have different + // extra perimeters for each one + Surfaces all_surfaces = this->slices->surfaces; 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; - // we need to process each island separately because we might have different - // extra perimeters for each one - for (const Surface& surface : all_surfaces) { - coord_t bead_width_0 = ext_perimeter_spacing; + //BBS: reorder the surface to reduce the travel time + ExPolygons surface_exp; + for (const Surface &surface : all_surfaces) + surface_exp.push_back(surface.expolygon); + std::vector surface_order = chain_expolygons(surface_exp); + 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 - int loop_number = this->config->wall_loops + surface.extra_perimeters - 1; // 0-indexed loops + int loop_number = this->config->wall_loops + surface.extra_perimeters - 1; // 0-indexed loops 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++; - - // 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 (this->layer_id == object_config->raft_layers && this->config->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) + // Set the topmost layer to be one wall + if (loop_number > 0 && config->only_one_wall_top && this->upper_slices == nullptr) loop_number = 0; - - auto apply_precise_outer_wall = config->precise_outer_wall && this->config->wall_sequence == WallSequence::InnerOuter; - // Orca: properly adjust offset for the outer wall if precise_outer_wall is enabled. - ExPolygons last = offset_ex(surface.expolygon.simplify_p(surface_simplify_resolution), - apply_precise_outer_wall? -float(ext_perimeter_width - ext_perimeter_spacing ) - : -float(ext_perimeter_width / 2. - ext_perimeter_spacing / 2.)); - - Arachne::WallToolPathsParams input_params = Arachne::make_paths_params(this->layer_id, *object_config, *print_config); - // Set params is_top_or_bottom_layer for adjusting short-wall removal sensitivity. - input_params.is_top_or_bottom_layer = (is_bottom_layer || is_topmost_layer) ? true : false; - coord_t wall_0_inset = 0; - if (apply_precise_outer_wall) - wall_0_inset = -coord_t(ext_perimeter_width / 2 - ext_perimeter_spacing / 2); + ExPolygons last = union_ex(surface.expolygon.simplify_p(surface_simplify_resolution)); + ExPolygons gaps; + ExPolygons top_fills; + ExPolygons fill_clip; + 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 + std::vector holes(loop_number+1); // depth => loops + ThickPolylines thin_walls; + // we loop one time more than needed in order to find gaps after the last perimeter was applied + for (int i = 0;; ++ i) { // outer loop is 0 + // Calculate next onion shell of perimeters. + ExPolygons offsets; + ExPolygons offsets_with_smaller_width; + if (i == 0) { + // look for thin walls + if (this->config->detect_thin_wall) { + // the minimum thickness of a single loop is: + // ext_width/2 + ext_spacing/2 + spacing/2 + width/2 + offsets = offset2_ex(last, + -float(ext_perimeter_width / 2. + ext_min_spacing / 2. - 1), + +float(ext_min_spacing / 2. - 1)); + // the following offset2 ensures almost nothing in @thin_walls is narrower than $min_width + // (actually, something larger than that still may exist due to mitering or other causes) + coord_t min_width = coord_t(scale_(this->ext_perimeter_flow.nozzle_diameter() / 3)); + ExPolygons expp = opening_ex( + // medial axis requires non-overlapping geometry + diff_ex(last, offset(offsets, float(ext_perimeter_width / 2.) + ClipperSafetyOffset)), + float(min_width / 2.)); + // the maximum thickness of our thin wall area is equal to the minimum thickness of a single loop + for (ExPolygon &ex : expp) + ex.medial_axis(min_width, ext_perimeter_width + ext_perimeter_spacing2, &thin_walls); + } else { + coord_t ext_perimeter_smaller_width = this->smaller_ext_perimeter_flow.scaled_width(); + for (const ExPolygon& expolygon : last) { + // BBS: judge whether it's narrow but not too long island which is hard to place two line + ExPolygons expolys; + expolys.push_back(expolygon); + ExPolygons offset_result = offset2_ex(expolys, + -float(ext_perimeter_width / 2. + ext_min_spacing_smaller / 2.), + +float(ext_min_spacing_smaller / 2.)); + if (offset_result.empty() && + expolygon.area() < (double)(ext_perimeter_width + ext_min_spacing_smaller) * scale_(narrow_loop_length_threshold)) { + // BBS: for narrow external loop, use smaller line width + ExPolygons temp_result = offset_ex(expolygon, -float(ext_perimeter_smaller_width / 2.)); + offsets_with_smaller_width.insert(offsets_with_smaller_width.end(), temp_result.begin(), temp_result.end()); + } + else { + //BBS: for not narrow loop, use normal external perimeter line width + ExPolygons temp_result = offset_ex(expolygon, -float(ext_perimeter_width / 2.)); + offsets.insert(offsets.end(), temp_result.begin(), temp_result.end()); + } + } + } + if (m_spiral_vase && (offsets.size() > 1 || offsets_with_smaller_width.size() > 1)) { + // Remove all but the largest area polygon. + keep_largest_contour_only(offsets); + //BBS + if (offsets.empty()) + //BBS: only have small width loop, then keep the largest in spiral vase mode + keep_largest_contour_only(offsets_with_smaller_width); + else + //BBS: have large area, clean the small width loop + offsets_with_smaller_width.clear(); + } + } else { + //FIXME Is this offset correct if the line width of the inner perimeters differs + // from the line width of the infill? + coord_t distance = (i == 1) ? ext_perimeter_spacing2 : perimeter_spacing; + //BBS + //offsets = this->config->thin_walls ? + // This path will ensure, that the perimeters do not overfill, as in + // prusa3d/Slic3r GH #32, but with the cost of rounding the perimeters + // excessively, creating gaps, which then need to be filled in by the not very + // reliable gap fill algorithm. + // Also the offset2(perimeter, -x, x) may sometimes lead to a perimeter, which is larger than + // the original. + //offset2_ex(last, + // - float(distance + min_spacing / 2. - 1.), + // float(min_spacing / 2. - 1.)) : + // If "detect thin walls" is not enabled, this paths will be entered, which + // leads to overflows, as in prusa3d/Slic3r GH #32 + //offset_ex(last, - float(distance)); - //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; + //BBS: For internal perimeter, we should "enable" thin wall strategy in which offset2 is used to + // remove too closed line, so that gap fill can be used for such internal narrow area in following + // handling. + offsets = offset2_ex(last, + -float(distance + min_spacing / 2. - 1.), + float(min_spacing / 2. - 1.)); + // look for gaps + if (has_gap_fill) + // not using safety offset here would "detect" very narrow gaps + // (but still long enough to escape the area threshold) that gap fill + // won't be able to fill but we'd still remove from infill area + append(gaps, diff_ex( + offset(last, - float(0.5 * distance)), + offset(offsets, float(0.5 * distance + 10)))); // safety offset + } + if (offsets.empty() && offsets_with_smaller_width.empty()) { + // Store the number of loops actually generated. + loop_number = i - 1; + // No region left to be filled in. + last.clear(); + break; + } else if (i > loop_number) { + // If i > loop_number, we were looking just for gaps. + break; + } + { + for (const ExPolygon& expolygon : offsets) { + // Outer contour may overlap with an inner contour, + // inner contour may overlap with another inner contour, + // outer contour may overlap with itself. + //FIXME evaluate the overlaps, annotate each point with an overlap depth, + // compensate for the depth of intersection. + contours[i].emplace_back(expolygon.contour, i, true); - // Set one perimeter when TopSurfaces is selected. - if (config->only_one_wall_top) - loop_number = 0; + if (!expolygon.holes.empty()) { + holes[i].reserve(holes[i].size() + expolygon.holes.size()); + for (const Polygon& hole : expolygon.holes) + holes[i].emplace_back(hole, i, false); + } + } - Arachne::WallToolPathsParams input_params_tmp = input_params; - - Polygons last_p = to_polygons(last); - Arachne::WallToolPaths wallToolPaths(last_p, bead_width_0, perimeter_spacing, coord_t(loop_number + 1), - wall_0_inset, layer_height, input_params_tmp); - std::vector perimeters = wallToolPaths.getToolPaths(); - ExPolygons infill_contour = union_ex(wallToolPaths.getInnerContour()); + //BBS: save perimeter loop which use smaller width + if (i == 0) { + for (const ExPolygon& expolygon : offsets_with_smaller_width) { + contours[i].emplace_back(PerimeterGeneratorLoop(expolygon.contour, i, true, true)); + if (!expolygon.holes.empty()) { + holes[i].reserve(holes[i].size() + expolygon.holes.size()); + for (const Polygon& hole : expolygon.holes) + holes[i].emplace_back(PerimeterGeneratorLoop(hole, i, false, true)); + } + } + } + } - // Check if there are some remaining perimeters to generate (the number of perimeters - // is greater than one together with enabled the single perimeter on top surface feature). - if (inner_loop_number >= 0) { - assert(upper_slices != nullptr); + last = std::move(offsets); - // Infill contour bounding box. - BoundingBox infill_contour_bbox = get_extents(infill_contour); - infill_contour_bbox.offset(SCALED_EPSILON); - - coord_t perimeter_width = this->perimeter_flow.scaled_width(); + //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); + } - // Get top ExPolygons from current infill contour. - Polygons upper_slices_clipped = ClipperUtils::clip_clipper_polygons_with_subject_bbox(*upper_slices, infill_contour_bbox); - top_expolygons = diff_ex(infill_contour, upper_slices_clipped); + if (i == loop_number && (! has_gap_fill || this->config->sparse_infill_density.value == 0)) { + // The last run of this loop is executed to collect gaps for gap fill. + // As the gap fill is either disabled or not + break; + } + } - if (!top_expolygons.empty()) { - if (lower_slices != nullptr) { - const float bridge_offset = float(std::max(ext_perimeter_spacing, perimeter_width)); - const Polygons lower_slices_clipped = ClipperUtils::clip_clipper_polygons_with_subject_bbox(*lower_slices, infill_contour_bbox); - const ExPolygons current_slices_bridges = offset_ex(diff_ex(top_expolygons, lower_slices_clipped), bridge_offset); + // nest loops: holes first + for (int d = 0; d <= loop_number; ++ d) { + PerimeterGeneratorLoops &holes_d = holes[d]; + // loop through all holes having depth == d + for (int i = 0; i < (int)holes_d.size(); ++ i) { + const PerimeterGeneratorLoop &loop = holes_d[i]; + // find the hole loop that contains this one, if any + for (int t = d + 1; t <= loop_number; ++ t) { + for (int j = 0; j < (int)holes[t].size(); ++ j) { + PerimeterGeneratorLoop &candidate_parent = holes[t][j]; + if (candidate_parent.polygon.contains(loop.polygon.first_point())) { + candidate_parent.children.push_back(loop); + holes_d.erase(holes_d.begin() + i); + -- i; + goto NEXT_LOOP; + } + } + } + // if no hole contains this hole, find the contour loop that contains it + for (int t = loop_number; t >= 0; -- t) { + for (int j = 0; j < (int)contours[t].size(); ++ j) { + PerimeterGeneratorLoop &candidate_parent = contours[t][j]; + if (candidate_parent.polygon.contains(loop.polygon.first_point())) { + candidate_parent.children.push_back(loop); + holes_d.erase(holes_d.begin() + i); + -- i; + goto NEXT_LOOP; + } + } + } + NEXT_LOOP: ; + } + } + // nest contour loops + for (int d = loop_number; d >= 1; -- d) { + PerimeterGeneratorLoops &contours_d = contours[d]; + // loop through all contours having depth == d + for (int i = 0; i < (int)contours_d.size(); ++ i) { + const PerimeterGeneratorLoop &loop = contours_d[i]; + // find the contour loop that contains it + for (int t = d - 1; t >= 0; -- t) { + for (size_t j = 0; j < contours[t].size(); ++ j) { + PerimeterGeneratorLoop &candidate_parent = contours[t][j]; + if (candidate_parent.polygon.contains(loop.polygon.first_point())) { + candidate_parent.children.push_back(loop); + contours_d.erase(contours_d.begin() + i); + -- i; + goto NEXT_CONTOUR; + } + } + } + NEXT_CONTOUR: ; + } + } + // at this point, all loops should be in contours[0] + bool steep_overhang_contour = false; + bool steep_overhang_hole = false; + const WallDirection wall_direction = config->wall_direction; + if (wall_direction != WallDirection::Auto) { + // Skip steep overhang detection if wall direction is specified + steep_overhang_contour = true; + steep_overhang_hole = true; + } + ExtrusionEntityCollection entities = traverse_loops(*this, contours.front(), thin_walls, steep_overhang_contour, steep_overhang_hole); + // All walls are counter-clockwise initially, so we don't need to reorient it if that's what we want + if (wall_direction != WallDirection::CounterClockwise) { + reorient_perimeters(entities, steep_overhang_contour, steep_overhang_hole, + // Reverse internal only if the wall direction is auto + this->config->overhang_reverse_internal_only && wall_direction == WallDirection::Auto); + } - // Remove bridges from top surface polygons. - top_expolygons = diff_ex(top_expolygons, current_slices_bridges); + // if brim will be printed, reverse the order of perimeters so that + // we continue inwards after having finished the brim + // TODO: add test for perimeter order + bool is_outer_wall_first = this->config->wall_sequence == WallSequence::OuterInner; + if (is_outer_wall_first || + //BBS: always print outer wall first when there indeed has brim. + (this->layer_id == 0 && + this->object_config->brim_type == BrimType::btOuterOnly && + this->object_config->brim_width.value > 0)) + entities.reverse(); + // Orca: sandwich mode. Apply after 1st layer. + else if ((this->config->wall_sequence == WallSequence::InnerOuterInner) && layer_id > 0){ + entities.reverse(); // reverse all entities - order them from external to internal + if(entities.entities.size()>2){ // 3 walls minimum needed to do inner outer inner ordering + int position = 0; // index to run the re-ordering for multiple external perimeters in a single island. + int arr_i, arr_j = 0; // indexes to run through the walls in the for loops + int outer, first_internal, second_internal, max_internal, current_perimeter; // allocate index values + + // Initiate reorder sequence to bring any index 1 (first internal) perimeters ahead of any second internal perimeters + // Leaving these out of order will result in print defects on the external wall as they will be extruded prior to any + // external wall. To do the re-ordering, we are creating two extrusion arrays - reordered_extrusions which will contain + // the reordered extrusions and skipped_extrusions will contain the ones that were skipped in the scan + ExtrusionEntityCollection reordered_extrusions, skipped_extrusions; + bool found_second_internal = false; // helper variable to indicate the start of a new island + + for(auto extrusion_to_reorder : entities.entities){ //scan the perimeters to reorder + switch (extrusion_to_reorder->inset_idx) { + case 0: // external perimeter + if(found_second_internal){ //new island - move skipped extrusions to reordered array + for(auto extrusion_skipped : skipped_extrusions) + reordered_extrusions.append(*extrusion_skipped); + skipped_extrusions.clear(); + } + reordered_extrusions.append(*extrusion_to_reorder); + break; + case 1: // first internal perimeter + reordered_extrusions.append(*extrusion_to_reorder); + break; + default: // second internal+ perimeter -> put them in the skipped extrusions array + skipped_extrusions.append(*extrusion_to_reorder); + found_second_internal = true; + break; + } + } + if(entities.entities.size()>reordered_extrusions.size()){ + // we didnt find any more islands, so lets move the remaining skipped perimeters to the reordered extrusions list. + for(auto extrusion_skipped : skipped_extrusions) + reordered_extrusions.append(*extrusion_skipped); + skipped_extrusions.clear(); + } + + // Now start the sandwich mode wall re-ordering using the reordered_extrusions as the basis + // scan to find the external perimeter, first internal, second internal and last perimeter in the island. + // We then advance the position index to move to the second "island" and continue until there are no more + // perimeters left. + while (position < reordered_extrusions.size()) { + outer = first_internal = second_internal = current_perimeter = -1; // initialise all index values to -1 + max_internal = reordered_extrusions.size()-1; // initialise the maximum internal perimeter to the last perimeter on the extrusion list + // run through the walls to get the index values that need re-ordering until the first one for each + // is found. Start at "position" index to enable the for loop to iterate for multiple external + // perimeters in a single island + for (arr_i = position; arr_i < reordered_extrusions.size(); ++arr_i) { + switch (reordered_extrusions.entities[arr_i]->inset_idx) { + case 0: // external perimeter + if (outer == -1) + outer = arr_i; + break; + case 1: // first internal wall + if (first_internal==-1 && arr_i>outer && outer!=-1){ + first_internal = arr_i; + } + break; + case 2: // second internal wall + if (second_internal == -1 && arr_i > first_internal && outer!=-1){ + second_internal = arr_i; + } + break; + } + if(outer >-1 && first_internal>-1 && second_internal>-1 && reordered_extrusions.entities[arr_i]->inset_idx == 0){ // found a new external perimeter after we've found all three perimeters to re-order -> this means we entered a new island. + arr_i=arr_i-1; //step back one perimeter + max_internal = arr_i; // new maximum internal perimeter is now this as we have found a new external perimeter, hence a new island. + break; // exit the for loop + } + } + + if (outer > -1 && first_internal > -1 && second_internal > -1) { // found perimeters to re-order? + ExtrusionEntityCollection inner_outer_extrusions; // temporary collection to hold extrusions for reordering + + for (arr_j = max_internal; arr_j >=position; --arr_j){ // go inside out towards the external perimeter (perimeters in reverse order) and store all internal perimeters until the first one identified with inset index 2 + if(arr_j >= second_internal){ + inner_outer_extrusions.append(*reordered_extrusions.entities[arr_j]); + current_perimeter++; + } + } + + for (arr_j = position; arr_j < second_internal; ++arr_j){ // go outside in and map the remaining perimeters (external and first internal wall(s)) using the outside in wall order + inner_outer_extrusions.append(*reordered_extrusions.entities[arr_j]); + } + + for(arr_j = position; arr_j <= max_internal; ++arr_j) // replace perimeter array with the new re-ordered array + entities.replace(arr_j, *inner_outer_extrusions.entities[arr_j-position]); + } else + break; + // go to the next perimeter from the current position to continue scanning for external walls in the same island + position = arr_i + 1; + } } + } + + // append perimeters for this slice as a collection + if (! entities.empty()) + this->loops->append(entities); - // Filter out areas that are too thin and expand top surface polygons a bit to hide the wall line. - // ORCA: skip if the top surface area is smaller than "min_width_top_surface" - const float top_surface_min_width = std::max(float(ext_perimeter_spacing) / 4.f + scaled(0.00001), float(scale_(config->min_width_top_surface.get_abs_value(unscale_(perimeter_width)))) / 4.f); - // Shrink the polygon to remove the small areas, then expand it back out plus a maragin to hide the wall line a little. - // ORCA: Expand the polygon with half the perimeter width in addition to the contracted amount, - // not the full perimeter width as PS does, to enable thin lettering to print on the top surface without nozzle collisions - // 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)); + } // for each loop of an island - // 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); + // fill gaps + if (! gaps.empty()) { + // collapse + double min = 0.2 * perimeter_width * (1 - INSET_OVERLAP_TOLERANCE); + double max = 2. * perimeter_spacing; + ExPolygons gaps_ex = diff_ex( + //FIXME offset2 would be enough and cheaper. + opening_ex(gaps, float(min / 2.)), + offset2_ex(gaps, - float(max / 2.), float(max / 2. + ClipperSafetyOffset))); + ThickPolylines polylines; + for (ExPolygon& ex : gaps_ex) { + //BBS: Use DP simplify to avoid duplicated points and accelerate medial-axis calculation as well. + ex.douglas_peucker(surface_simplify_resolution); + ex.medial_axis(min, max, &polylines); + } + +#ifdef GAPS_OF_PERIMETER_DEBUG_TO_SVG + { + static int irun = 0; + BoundingBox bbox_svg; + bbox_svg.merge(get_extents(gaps_ex)); + { + std::stringstream stri; + stri << "debug_gaps_ex_" << irun << ".svg"; + SVG svg(stri.str(), bbox_svg); + svg.draw(to_polylines(gaps_ex), "blue", 0.5); + svg.Close(); + } + ++ irun; + } +#endif + // SoftFever: filter out tiny gap fills + polylines.erase(std::remove_if(polylines.begin(), polylines.end(), + [&](const ThickPolyline& p) { + return p.length() < scale_(config->filter_out_gap_fill.value); + }), polylines.end()); - // Get final top ExPolygons. - top_expolygons = intersection_ex(top_expolygons, infill_contour); - const Polygons not_top_polygons = to_polygons(not_top_expolygons); - 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); - std::vector inner_perimeters = inner_wall_tool_paths.getToolPaths(); + if (! polylines.empty()) { + ExtrusionEntityCollection gap_fill; + variable_width(polylines, erGapFill, this->solid_infill_flow, gap_fill.entities); + /* Make sure we don't infill narrow parts that are already gap-filled + (we only consider this surface's gaps to reduce the diff() complexity). + Growing actual extrusions ensures that gaps not filled by medial axis + are not subtracted from fill surfaces (they might be too short gaps + that medial axis skips but infill might join with other infill regions + 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)); + this->gap_fill->append(std::move(gap_fill.entities)); - // Recalculate indexes of inner perimeters before merging them. - if (!perimeters.empty()) { - for (Arachne::VariableWidthLines &inner_perimeter : inner_perimeters) { - if (inner_perimeter.empty()) - continue; - 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()); - } else { - // There is no top surface ExPolygon, so we call Arachne again with parameters - // like when the single perimeter feature is disabled. - Arachne::WallToolPaths no_single_perimeter_tool_paths(last_p, bead_width_0, perimeter_spacing, coord_t(inner_loop_number + 2), wall_0_inset, layer_height, input_params_tmp); - perimeters = no_single_perimeter_tool_paths.getToolPaths(); - infill_contour = union_ex(no_single_perimeter_tool_paths.getInnerContour()); + // create one more offset to be used as boundary for fill + // we offset by half the perimeter spacing (to get to the actual infill boundary) + // and then we offset back and forth by half the infill spacing to only consider the + // non-collapsing regions + coord_t inset = + (loop_number < 0) ? 0 : + (loop_number == 0) ? + // one loop + ext_perimeter_spacing / 2 : + // two or more loops? + perimeter_spacing / 2; + + // only apply infill overlap if we actually have one perimeter + coord_t infill_peri_overlap = 0; + coord_t top_infill_peri_overlap = 0; + if (inset > 0) { + if(this->layer_id == 0 || this->upper_slices == nullptr){ + infill_peri_overlap = coord_t(scale_(this->config->top_bottom_infill_wall_overlap.get_abs_value(unscale(inset + solid_infill_spacing / 2)))); + }else{ + infill_peri_overlap = coord_t(scale_(this->config->infill_wall_overlap.get_abs_value(unscale(inset + solid_infill_spacing / 2)))); + top_infill_peri_overlap = coord_t(scale_(this->config->top_bottom_infill_wall_overlap.get_abs_value(unscale(inset + solid_infill_spacing / 2)))); } + inset -= infill_peri_overlap; } - //PS + // simplify infill contours according to resolution + Polygons pp; + for (ExPolygon &ex : last) + ex.simplify_p(m_scaled_resolution, &pp); + ExPolygons not_filled_exp = union_ex(pp); + // collapse too narrow infill areas + coord_t min_perimeter_infill_spacing = coord_t(solid_infill_spacing * (1. - INSET_OVERLAP_TOLERANCE)); - loop_number = int(perimeters.size()) - 1; + ExPolygons infill_exp = offset2_ex( + not_filled_exp, + float(-inset - min_perimeter_infill_spacing / 2.), + float(min_perimeter_infill_spacing / 2.)); + // 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))); + if (!top_fills.empty()) { + infill_exp = union_ex(infill_exp, offset_ex(top_infill_exp, double(top_infill_peri_overlap))); + } + this->fill_surfaces->append(infill_exp, stInternal); - #ifdef ARACHNE_DEBUG + apply_extra_perimeters(infill_exp); + + // BBS: get the no-overlap infill expolygons { - static int iRun = 0; - export_perimeters_to_svg(debug_out_path("arachne-perimeters-%d-%d.svg", layer_id, iRun++), to_polygons(last), perimeters, union_ex(wallToolPaths.getInnerContour())); + ExPolygons polyWithoutOverlap; + if (min_perimeter_infill_spacing / 2 > infill_peri_overlap) + polyWithoutOverlap = offset2_ex( + not_filled_exp, + float(-inset - min_perimeter_infill_spacing / 2.), + float(min_perimeter_infill_spacing / 2 - infill_peri_overlap)); + else + polyWithoutOverlap = offset_ex( + not_filled_exp, + double(-inset - infill_peri_overlap)); + if (!top_fills.empty()) + polyWithoutOverlap = union_ex(polyWithoutOverlap, top_infill_exp); + this->fill_no_overlap->insert(this->fill_no_overlap->end(), polyWithoutOverlap.begin(), polyWithoutOverlap.end()); } -#endif - // All closed ExtrusionLine should have the same the first and the last point. - // But in rare cases, Arachne produce ExtrusionLine marked as closed but without - // equal the first and the last point. - assert([&perimeters = std::as_const(perimeters)]() -> bool { - for (const Arachne::VariableWidthLines& perimeter : perimeters) - for (const Arachne::ExtrusionLine& el : perimeter) - if (el.is_closed && el.junctions.front().p != el.junctions.back().p) - return false; - return true; - }()); + } // for each island +} + +//BBS: +void PerimeterGenerator::add_infill_contour_for_arachne( ExPolygons infill_contour, + int loops, + coord_t ext_perimeter_spacing, + coord_t perimeter_spacing, + coord_t min_perimeter_infill_spacing, + coord_t spacing, + bool is_inner_part) +{ + if( offset_ex(infill_contour, -float(spacing / 2.)).empty() ) + { + infill_contour.clear(); // Infill region is too small, so let's filter it out. + } - int start_perimeter = int(perimeters.size()) - 1; - int end_perimeter = -1; - int direction = -1; + // create one more offset to be used as boundary for fill + // we offset by half the perimeter spacing (to get to the actual infill boundary) + // and then we offset back and forth by half the infill spacing to only consider the + // non-collapsing regions + coord_t insert = (loops < 0) ? 0: ext_perimeter_spacing; + if (is_inner_part || loops > 0) + insert = perimeter_spacing; - bool is_outer_wall_first = - this->config->wall_sequence == WallSequence::OuterInner || - this->config->wall_sequence == WallSequence::InnerOuterInner; - - if (layer_id == 0){ // disable inner outer inner algorithm after the first layer - is_outer_wall_first = - this->config->wall_sequence == WallSequence::OuterInner; - } - if (is_outer_wall_first) { - start_perimeter = 0; - end_perimeter = int(perimeters.size()); - direction = 1; - } + insert = coord_t(scale_(this->config->infill_wall_overlap.get_abs_value(unscale(insert)))); - std::vector all_extrusions; - for (int perimeter_idx = start_perimeter; perimeter_idx != end_perimeter; perimeter_idx += direction) { - if (perimeters[perimeter_idx].empty()) - continue; - for (Arachne::ExtrusionLine& wall : perimeters[perimeter_idx]) - all_extrusions.emplace_back(&wall); - } + Polygons inner_pp; + for (ExPolygon &ex : infill_contour) + ex.simplify_p(m_scaled_resolution, &inner_pp); - // Find topological order with constraints from extrusions_constrains. - std::vector blocked(all_extrusions.size(), 0); // Value indicating how many extrusions it is blocking (preceding extrusions) an extrusion. - std::vector> blocking(all_extrusions.size()); // Each extrusion contains a vector of extrusions that are blocked by this extrusion. - std::unordered_map map_extrusion_to_idx; - for (size_t idx = 0; idx < all_extrusions.size(); idx++) - map_extrusion_to_idx.emplace(all_extrusions[idx], idx); - - auto extrusions_constrains = Arachne::WallToolPaths::getRegionOrder(all_extrusions, is_outer_wall_first); - for (auto [before, after] : extrusions_constrains) { - auto after_it = map_extrusion_to_idx.find(after); - ++blocked[after_it->second]; - blocking[map_extrusion_to_idx.find(before)->second].emplace_back(after_it->second); - } + this->fill_surfaces->append(offset2_ex(union_ex(inner_pp), float(-min_perimeter_infill_spacing / 2.), float(insert + min_perimeter_infill_spacing / 2.)), stInternal); + + append(*this->fill_no_overlap, offset2_ex(union_ex(inner_pp), float(-min_perimeter_infill_spacing / 2.), float(+min_perimeter_infill_spacing / 2.))); +} + +// Orca: sacrificial bridge layer algorithm ported from SuperSlicer +void PerimeterGenerator::process_no_bridge(Surfaces& all_surfaces, coord_t perimeter_spacing, coord_t ext_perimeter_width) +{ + //store surface for bridge infill to avoid unsupported perimeters (but the first one, this one is always good) + if (this->config->counterbore_hole_bridging != chbNone + && this->lower_slices != NULL && !this->lower_slices->empty()) { + const coordf_t bridged_infill_margin = scale_(BRIDGE_INFILL_MARGIN); + + for (size_t surface_idx = 0; surface_idx < all_surfaces.size(); surface_idx++) { + Surface* surface = &all_surfaces[surface_idx]; + ExPolygons last = { surface->expolygon }; + //compute our unsupported surface + 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)); + if (!unsupported_filtered.empty()) { + //to_draw.insert(to_draw.end(), last.begin(), last.end()); + //extract only the useful part of the lower layer. The safety offset is really needed here. + ExPolygons support = diff_ex(last, unsupported, ApplySafetyOffset::Yes); + if (!unsupported.empty()) { + //only consider the part that can be bridged (really, by the bridge algorithm) + //first, separate into islands (ie, each ExPlolygon) + int numploy = 0; + //only consider the bottom layer that intersect unsupported, to be sure it's only on our island. + ExPolygonCollection lower_island(support); + //a detector per island + ExPolygons bridgeable; + for (ExPolygon unsupported : unsupported_filtered) { + BridgeDetector detector{ unsupported, + lower_island.expolygons, + perimeter_spacing }; + if (detector.detect_angle(Geometry::deg2rad(this->config->bridge_angle.value))) + expolygons_append(bridgeable, union_ex(detector.coverage(-1, true))); + } + if (!bridgeable.empty()) { + //check if we get everything or just the bridgeable area + if (/*this->config->counterbore_hole_bridging.value == chbNoPeri || */this->config->counterbore_hole_bridging.value == chbFilled) { + //we bridge everything, even the not-bridgeable bits + for (size_t i = 0; i < unsupported_filtered.size();) { + ExPolygon& poly_unsupp = *(unsupported_filtered.begin() + i); + Polygons contour_simplified = poly_unsupp.contour.simplify(perimeter_spacing); + ExPolygon poly_unsupp_bigger = poly_unsupp; + Polygons contour_bigger = offset(poly_unsupp_bigger.contour, bridged_infill_margin); + if (contour_bigger.size() == 1) poly_unsupp_bigger.contour = contour_bigger[0]; - std::vector processed(all_extrusions.size(), false); // Indicate that the extrusion was already processed. - Point current_position = all_extrusions.empty() ? Point::Zero() : all_extrusions.front()->junctions.front().p; // Some starting position. - std::vector ordered_extrusions; // To store our result in. At the end we'll std::swap. - ordered_extrusions.reserve(all_extrusions.size()); + //check convex, has some bridge, not overhang + if (contour_simplified.size() == 1 && contour_bigger.size() == 1 && contour_simplified[0].concave_points().size() == 0 + && intersection_ex(bridgeable, ExPolygons{ poly_unsupp }).size() > 0 + && diff_ex(ExPolygons{ poly_unsupp_bigger }, union_ex(last, offset_ex(bridgeable, bridged_infill_margin + perimeter_spacing / 2)), ApplySafetyOffset::Yes).size() == 0 + ) { + //ok, keep it + i++; + } else { + unsupported_filtered.erase(unsupported_filtered.begin() + i); + } + } + unsupported_filtered = intersection_ex(last, + offset2_ex(unsupported_filtered, double(-perimeter_spacing / 2), double(bridged_infill_margin + perimeter_spacing / 2))); + if (this->config->counterbore_hole_bridging.value == chbFilled) { + for (ExPolygon& expol : unsupported_filtered) { + //check if the holes won't be covered by the upper layer + //TODO: if we want to do that, we must modify the geometry before making perimeters. + //if (this->upper_slices != nullptr && !this->upper_slices->expolygons.empty()) { + // for (Polygon &poly : expol.holes) poly.make_counter_clockwise(); + // float perimeterwidth = this->config->perimeters == 0 ? 0 : (this->ext_perimeter_flow.scaled_width() + (this->config->perimeters - 1) + this->perimeter_flow.scaled_spacing()); + // std::cout << "test upper slices with perimeterwidth=" << perimeterwidth << "=>" << offset_ex(this->upper_slices->expolygons, -perimeterwidth).size(); + // if (intersection(Polygons() = { expol.holes }, to_polygons(offset_ex(this->upper_slices->expolygons, -this->ext_perimeter_flow.scaled_width() / 2))).empty()) { + // std::cout << " EMPTY"; + // expol.holes.clear(); + // } else { + // } + // std::cout << "\n"; + //} else { + expol.holes.clear(); + //} - while (ordered_extrusions.size() < all_extrusions.size()) { - size_t best_candidate = 0; - double best_distance_sqr = std::numeric_limits::max(); - bool is_best_closed = false; + //detect inside volume + for (size_t surface_idx_other = 0; surface_idx_other < all_surfaces.size(); surface_idx_other++) { + if (surface_idx == surface_idx_other) continue; + if (intersection_ex(ExPolygons() = { expol }, ExPolygons() = { all_surfaces[surface_idx_other].expolygon }).size() > 0) { + //this means that other_surf was inside an expol holes + //as we removed them, we need to add a new one + ExPolygons new_poly = offset2_ex(ExPolygons{ all_surfaces[surface_idx_other].expolygon }, double(-bridged_infill_margin - perimeter_spacing), double(perimeter_spacing)); + if (new_poly.size() == 1) { + all_surfaces[surface_idx_other].expolygon = new_poly[0]; + expol.holes.push_back(new_poly[0].contour); + expol.holes.back().make_clockwise(); + } else { + for (size_t idx = 0; idx < new_poly.size(); idx++) { + Surface new_surf = all_surfaces[surface_idx_other]; + new_surf.expolygon = new_poly[idx]; + all_surfaces.push_back(new_surf); + expol.holes.push_back(new_poly[idx].contour); + expol.holes.back().make_clockwise(); + } + all_surfaces.erase(all_surfaces.begin() + surface_idx_other); + if (surface_idx_other < surface_idx) { + surface_idx--; + surface = &all_surfaces[surface_idx]; + } + surface_idx_other--; + } + } + } + } - std::vector available_candidates; - for (size_t candidate = 0; candidate < all_extrusions.size(); ++candidate) { - if (processed[candidate] || blocked[candidate]) - continue; // Not a valid candidate. - available_candidates.push_back(candidate); - } + } + //TODO: add other polys as holes inside this one (-margin) + } else if (/*this->config->counterbore_hole_bridging.value == chbBridgesOverhangs || */this->config->counterbore_hole_bridging.value == chbBridges) { + //simplify to avoid most of artefacts from printing lines. + ExPolygons bridgeable_simplified; + for (ExPolygon& poly : bridgeable) { + poly.simplify(perimeter_spacing, &bridgeable_simplified); + } + bridgeable_simplified = offset2_ex(bridgeable_simplified, -ext_perimeter_width, ext_perimeter_width); + //bridgeable_simplified = intersection_ex(bridgeable_simplified, unsupported_filtered); + //offset by perimeter spacing because the simplify may have reduced it a bit. + //it's not dangerous as it will be intersected by 'unsupported' later + //FIXME: add overlap in this->fill_surfaces->append + //FIXME: it overlap inside unsuppported not-bridgeable area! - std::sort(available_candidates.begin(), available_candidates.end(), [&all_extrusions](const size_t a_idx, const size_t b_idx) -> bool { - return all_extrusions[a_idx]->is_closed < all_extrusions[b_idx]->is_closed; - }); + //bridgeable_simplified = offset2_ex(bridgeable_simplified, (double)-perimeter_spacing, (double)perimeter_spacing * 2); + //ExPolygons unbridgeable = offset_ex(diff_ex(unsupported, bridgeable_simplified), perimeter_spacing * 3 / 2); + //ExPolygons unbridgeable = intersection_ex(unsupported, diff_ex(unsupported_filtered, offset_ex(bridgeable_simplified, ext_perimeter_width / 2))); + //unbridgeable = offset2_ex(unbridgeable, -ext_perimeter_width, ext_perimeter_width); - for (const size_t candidate_path_idx : available_candidates) { - auto& path = all_extrusions[candidate_path_idx]; - if (path->junctions.empty()) { // No vertices in the path. Can't find the start position then or really plan it in. Put that at the end. - if (best_distance_sqr == std::numeric_limits::max()) { - best_candidate = candidate_path_idx; - is_best_closed = path->is_closed; - } - continue; - } + // if (this->config->counterbore_hole_bridging.value == chbBridges) { + ExPolygons unbridgeable = unsupported_filtered; + for (ExPolygon& expol : unbridgeable) + expol.holes.clear(); + unbridgeable = diff_ex(unbridgeable, bridgeable_simplified); + unbridgeable = offset2_ex(unbridgeable, -ext_perimeter_width * 2, ext_perimeter_width * 2); + ExPolygons bridges_temp = offset2_ex(intersection_ex(last, diff_ex(unsupported_filtered, unbridgeable), ApplySafetyOffset::Yes), -ext_perimeter_width / 4, ext_perimeter_width / 4); + //remove the overhangs section from the surface polygons + ExPolygons reference = last; + last = diff_ex(last, unsupported_filtered); + //ExPolygons no_bridge = diff_ex(offset_ex(unbridgeable, ext_perimeter_width * 3 / 2), last); + //bridges_temp = diff_ex(bridges_temp, no_bridge); + coordf_t offset_to_do = bridged_infill_margin; + bool first = true; + unbridgeable = diff_ex(unbridgeable, offset_ex(bridges_temp, ext_perimeter_width)); + while (offset_to_do > ext_perimeter_width * 1.5) { + unbridgeable = offset2_ex(unbridgeable, -ext_perimeter_width / 4, ext_perimeter_width * 2.25, ClipperLib::jtSquare); + bridges_temp = diff_ex(bridges_temp, unbridgeable); + bridges_temp = offset_ex(bridges_temp, ext_perimeter_width, ClipperLib::jtMiter, 6.); + unbridgeable = diff_ex(unbridgeable, offset_ex(bridges_temp, ext_perimeter_width)); + offset_to_do -= ext_perimeter_width; + first = false; + } + unbridgeable = offset_ex(unbridgeable, ext_perimeter_width + offset_to_do, ClipperLib::jtSquare); + bridges_temp = diff_ex(bridges_temp, unbridgeable); + unsupported_filtered = offset_ex(bridges_temp, offset_to_do); + unsupported_filtered = intersection_ex(unsupported_filtered, reference); + // } else { + // ExPolygons unbridgeable = intersection_ex(unsupported, diff_ex(unsupported_filtered, offset_ex(bridgeable_simplified, ext_perimeter_width / 2))); + // unbridgeable = offset2_ex(unbridgeable, -ext_perimeter_width, ext_perimeter_width); + // unsupported_filtered = unbridgeable; - const Point candidate_position = path->junctions.front().p; - double distance_sqr = (current_position - candidate_position).cast().norm(); - if (distance_sqr < best_distance_sqr) { // Closer than the best candidate so far. - if (path->is_closed || (!path->is_closed && best_distance_sqr != std::numeric_limits::max()) || (!path->is_closed && !is_best_closed)) { - best_candidate = candidate_path_idx; - best_distance_sqr = distance_sqr; - is_best_closed = path->is_closed; + // ////put the bridge area inside the unsupported_filtered variable + // //unsupported_filtered = intersection_ex(last, + // // diff_ex( + // // offset_ex(bridgeable_simplified, (double)perimeter_spacing / 2), + // // unbridgeable + // // ) + // // ); + // } + } else { + unsupported_filtered.clear(); + } + } else { + unsupported_filtered.clear(); + } } - } - } - auto& best_path = all_extrusions[best_candidate]; - ordered_extrusions.push_back({ best_path, best_path->is_contour() }); - processed[best_candidate] = true; - for (size_t unlocked_idx : blocking[best_candidate]) - blocked[unlocked_idx]--; + if (!unsupported_filtered.empty()) { - if (!best_path->junctions.empty()) { //If all paths were empty, the best path is still empty. We don't upate the current position then. - if (best_path->is_closed) - current_position = best_path->junctions[0].p; //We end where we started. - else - current_position = best_path->junctions.back().p; //Pick the other end from where we started. - } - } + //add this directly to the infill list. + // this will avoid to throw wrong offsets into a good polygons + this->fill_surfaces->append( + unsupported_filtered, + stInternal); - // printf("New Layer: Layer ID %d\n",layer_id); //debug - new layer - if (this->config->wall_sequence == WallSequence::InnerOuterInner && layer_id > 0) { // only enable inner outer inner algorithm after first layer - if (ordered_extrusions.size() > 2) { // 3 walls minimum needed to do inner outer inner ordering - int position = 0; // index to run the re-ordering for multiple external perimeters in a single island. - int arr_i, arr_j = 0; // indexes to run through the walls in the for loops - int outer, first_internal, second_internal, max_internal, current_perimeter; // allocate index values - - // To address any remaining scenarios where the outer perimeter contour is not first on the list as arachne sometimes reorders the perimeters when clustering - // for OI mode that is used the basis for IOI - bringContoursToFront(ordered_extrusions); - std::vector reordered_extrusions; - - // Debug statement to print spacing values: - //printf("External threshold - Ext perimeter: %d Ext spacing: %d Int perimeter: %d Int spacing: %d\n", this->ext_perimeter_flow.scaled_width(),this->ext_perimeter_flow.scaled_spacing(),this->perimeter_flow.scaled_width(), this->perimeter_flow.scaled_spacing()); - - // Get searching thresholds. For an external perimeter we take the external perimeter spacing/2 plus the internal perimeter spacing/2 and expand by 3% to cover - // rounding errors - coord_t threshold_external = (this->ext_perimeter_flow.scaled_spacing()/2 + this->perimeter_flow.scaled_spacing()/2)*1.03; - - // For the intenal perimeter threshold, the distance is the internal perimeter spacing expanded by 3% to cover rounding errors. - coord_t threshold_internal = this->perimeter_flow.scaled_spacing() * 1.03; - - // Re-order extrusions based on distance - // Alorithm will aggresively optimise for the appearance of the outermost perimeter - ordered_extrusions = reorderPerimetersByProximity(ordered_extrusions,threshold_external,threshold_internal ); - reordered_extrusions = ordered_extrusions; // copy them into the reordered extrusions vector to allow for IOI operations to be performed below without altering the base ordered extrusions list. - - // Now start the sandwich mode wall re-ordering using the reordered_extrusions as the basis - // scan to find the external perimeter, first internal, second internal and last perimeter in the island. - // We then advance the position index to move to the second island and continue until there are no more - // perimeters left. - while (position < reordered_extrusions.size()) { - outer = first_internal = second_internal = current_perimeter = -1; // initialise all index values to -1 - max_internal = reordered_extrusions.size()-1; // initialise the maximum internal perimeter to the last perimeter on the extrusion list - // run through the walls to get the index values that need re-ordering until the first one for each - // is found. Start at "position" index to enable the for loop to iterate for multiple external - // perimeters in a single island - // printf("Reorder Loop. Position %d, extrusion list size: %d, Outer index %d, inner index %d, second inner index %d\n", position, reordered_extrusions.size(),outer,first_internal,second_internal); - for (arr_i = position; arr_i < reordered_extrusions.size(); ++arr_i) { - // printf("Perimeter: extrusion inset index %d, ordered extrusions array position %d\n",reordered_extrusions[arr_i].extrusion->inset_idx, arr_i); - switch (reordered_extrusions[arr_i].extrusion->inset_idx) { - case 0: // external perimeter - if (outer == -1) - outer = arr_i; - break; - case 1: // first internal wall - if (first_internal==-1 && arr_i>outer && outer!=-1){ - first_internal = arr_i; - } - break; - case 2: // second internal wall - if (second_internal == -1 && arr_i > first_internal && outer!=-1){ - second_internal = arr_i; - } - break; - } - if(outer >-1 && first_internal>-1 && reordered_extrusions[arr_i].extrusion->inset_idx == 0){ // found a new external perimeter after we've found at least a first internal perimeter to re-order. - // This means we entered a new island. - arr_i=arr_i-1; //step back one perimeter - max_internal = arr_i; // new maximum internal perimeter is now this as we have found a new external perimeter, hence a new island. - break; // exit the for loop - } - } - - // printf("Layer ID %d, Outer index %d, inner index %d, second inner index %d, maximum internal perimeter %d \n",layer_id,outer,first_internal,second_internal, max_internal); - if (outer > -1 && first_internal > -1 && second_internal > -1) { // found all three perimeters to re-order? If not the perimeters will be processed outside in. - std::vector inner_outer_extrusions; // temporary array to hold extrusions for reordering - inner_outer_extrusions.resize(max_internal - position + 1); // reserve array containing the number of perimeters before a new island. Variables are array indexes hence need to add +1 to convert to position allocations - // printf("Allocated array size %d, max_internal index %d, start position index %d \n",max_internal-position+1,max_internal,position); - - for (arr_j = max_internal; arr_j >=position; --arr_j){ // go inside out towards the external perimeter (perimeters in reverse order) and store all internal perimeters until the first one identified with inset index 2 - if(arr_j >= second_internal){ - //printf("Inside out loop: Mapped perimeter index %d to array position %d\n", arr_j, max_internal-arr_j); - inner_outer_extrusions[max_internal-arr_j] = reordered_extrusions[arr_j]; - current_perimeter++; + // store the results + last = diff_ex(last, unsupported_filtered, ApplySafetyOffset::Yes); + //remove "thin air" polygons (note: it assumes that all polygons below will be extruded) + for (int i = 0; i < last.size(); i++) { + if (intersection_ex(support, ExPolygons() = { last[i] }).empty()) { + this->fill_surfaces->append( + ExPolygons() = { last[i] }, + stInternal); + last.erase(last.begin() + i); + i--; } } - - for (arr_j = position; arr_j < second_internal; ++arr_j){ // go outside in and map the remaining perimeters (external and first internal wall(s)) using the outside in wall order - // printf("Outside in loop: Mapped perimeter index %d to array position %d\n", arr_j, current_perimeter+1); - inner_outer_extrusions[++current_perimeter] = reordered_extrusions[arr_j]; - } - - for(arr_j = position; arr_j <= max_internal; ++arr_j) // replace perimeter array with the new re-ordered array - ordered_extrusions[arr_j] = inner_outer_extrusions[arr_j-position]; } - // go to the next perimeter from the current position to continue scanning for external walls in the same island - position = arr_i + 1; } } - } - - bool steep_overhang_contour = false; - bool steep_overhang_hole = false; - const WallDirection wall_direction = config->wall_direction; - if (wall_direction != WallDirection::Auto) { - // Skip steep overhang detection if wall direction is specified - steep_overhang_contour = true; - steep_overhang_hole = true; - } - if (ExtrusionEntityCollection extrusion_coll = traverse_extrusions(*this, ordered_extrusions, steep_overhang_contour, steep_overhang_hole); !extrusion_coll.empty()) { - // All walls are counter-clockwise initially, so we don't need to reorient it if that's what we want - if (wall_direction != WallDirection::CounterClockwise) { - reorient_perimeters(extrusion_coll, steep_overhang_contour, steep_overhang_hole, - // Reverse internal only if the wall direction is auto - this->config->overhang_reverse_internal_only && wall_direction == WallDirection::Auto); + if (last.size() == 0) { + all_surfaces.erase(all_surfaces.begin() + surface_idx); + surface_idx--; + } else { + surface->expolygon = last[0]; + for (size_t idx = 1; idx < last.size(); idx++) { + all_surfaces.emplace_back(*surface, last[idx]); + } } - this->loops->append(extrusion_coll); - } - - const coord_t spacing = (perimeters.size() == 1) ? ext_perimeter_spacing2 : perimeter_spacing; - - if (offset_ex(infill_contour, -float(spacing / 2.)).empty()) - infill_contour.clear(); // Infill region is too small, so let's filter it out. - - // create one more offset to be used as boundary for fill - // we offset by half the perimeter spacing (to get to the actual infill boundary) - // and then we offset back and forth by half the infill spacing to only consider the - // non-collapsing regions - coord_t inset = - (loop_number < 0) ? 0 : - (loop_number == 0) ? - // one loop - ext_perimeter_spacing : - // two or more loops? - perimeter_spacing; - coord_t top_inset = inset; - - top_inset = coord_t(scale_(this->config->top_bottom_infill_wall_overlap.get_abs_value(unscale(inset)))); - if(is_topmost_layer || is_bottom_layer) - inset = coord_t(scale_(this->config->top_bottom_infill_wall_overlap.get_abs_value(unscale(inset)))); - else - inset = coord_t(scale_(this->config->infill_wall_overlap.get_abs_value(unscale(inset)))); - - // simplify infill contours according to resolution - Polygons pp; - for (ExPolygon& ex : infill_contour) - ex.simplify_p(m_scaled_resolution, &pp); - ExPolygons not_filled_exp = union_ex(pp); - // collapse too narrow infill areas - const auto min_perimeter_infill_spacing = coord_t(solid_infill_spacing * (1. - INSET_OVERLAP_TOLERANCE)); - - ExPolygons infill_exp = offset2_ex( - not_filled_exp, - float(-min_perimeter_infill_spacing / 2.), - float(inset + min_perimeter_infill_spacing / 2.)); - // append infill areas to fill_surfaces - if (!top_expolygons.empty()) { - infill_exp = union_ex(infill_exp, offset_ex(top_expolygons, double(top_inset))); - } - this->fill_surfaces->append(infill_exp, stInternal); - - apply_extra_perimeters(infill_exp); - - // BBS: get the no-overlap infill expolygons - { - ExPolygons polyWithoutOverlap; - polyWithoutOverlap = offset2_ex( - not_filled_exp, - float(-min_perimeter_infill_spacing / 2.), - float(+min_perimeter_infill_spacing / 2.)); - if (!top_expolygons.empty()) - polyWithoutOverlap = union_ex(polyWithoutOverlap, top_expolygons); - this->fill_no_overlap->insert(this->fill_no_overlap->end(), polyWithoutOverlap.begin(), polyWithoutOverlap.end()); } } } From 47ec9b9b0692d094f534ee891f30e00198be1338 Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Sun, 22 Dec 2024 17:53:03 +0800 Subject: [PATCH 06/33] SPE-1950: Optimization of computation complexity of perimeter ordering for Arachne generator. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous implementation during the grouping of perimeters using depth-first searches unnecessarily searched nodes that had no impact on grouping, which significantly increased the search space. Cherry-picked from prusa3d/PrusaSlicer@86309ba939c17ae6e35f0cecb5db6f3032c71fe8 Co-authored-by: Lukáš Hejl --- src/libslic3r/Arachne/PerimeterOrder.cpp | 48 +++++++++++++----------- src/libslic3r/Arachne/PerimeterOrder.hpp | 9 ++++- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/src/libslic3r/Arachne/PerimeterOrder.cpp b/src/libslic3r/Arachne/PerimeterOrder.cpp index 01d50feb1e1..c6c2755a48d 100644 --- a/src/libslic3r/Arachne/PerimeterOrder.cpp +++ b/src/libslic3r/Arachne/PerimeterOrder.cpp @@ -1,4 +1,10 @@ +#include +#include +#include + #include "PerimeterOrder.hpp" +#include "libslic3r/Arachne/utils/ExtrusionJunction.hpp" +#include "libslic3r/Point.hpp" namespace Slic3r::Arachne::PerimeterOrder { @@ -128,7 +134,7 @@ static std::vector ordered_perimeter_extrusions_to_m const Point &extrusion_start_position = extrusion_line.junctions.front().p; const double distance_sqr = (current_position - extrusion_start_position).cast().squaredNorm(); if (distance_sqr < nearest_distance_sqr) { - if (extrusion_line.is_closed || (!extrusion_line.is_closed && nearest_distance_sqr != std::numeric_limits::max()) || (!extrusion_line.is_closed && !is_nearest_closed)) { + if (extrusion_line.is_closed || (!extrusion_line.is_closed && nearest_distance_sqr == std::numeric_limits::max()) || (!extrusion_line.is_closed && !is_nearest_closed)) { nearest_extrusion_idx = extrusion_idx; nearest_distance_sqr = distance_sqr; is_nearest_closed = extrusion_line.is_closed; @@ -184,7 +190,7 @@ static std::vector order_of_grouped_perimeter_extrusions_to_minimize_dis const Point &extrusion_start_position = external_perimeter_extrusion_line.junctions.front().p; const double distance_sqr = (current_position - extrusion_start_position).cast().squaredNorm(); if (distance_sqr < nearest_distance_sqr) { - if (external_perimeter_extrusion_line.is_closed || (!external_perimeter_extrusion_line.is_closed && nearest_distance_sqr != std::numeric_limits::max()) || (!external_perimeter_extrusion_line.is_closed && !is_nearest_closed)) { + if (external_perimeter_extrusion_line.is_closed || (!external_perimeter_extrusion_line.is_closed && nearest_distance_sqr == std::numeric_limits::max()) || (!external_perimeter_extrusion_line.is_closed && !is_nearest_closed)) { nearest_grouped_extrusions_idx = grouped_extrusion_idx; nearest_distance_sqr = distance_sqr; is_nearest_closed = external_perimeter_extrusion_line.is_closed; @@ -219,33 +225,32 @@ static PerimeterExtrusions extract_ordered_perimeter_extrusions(const PerimeterE while (!stack.empty()) { const PerimeterExtrusion *current_extrusion = stack.top(); const size_t current_extrusion_idx = current_extrusion - sorted_perimeter_extrusions.data(); - stack.pop(); - if (visited[current_extrusion_idx]) - continue; + stack.pop(); + visited[current_extrusion_idx] = true; - if (current_extrusion->nearest_external_perimeter == &perimeter_extrusion) + if (current_extrusion->nearest_external_perimeter == &perimeter_extrusion) { grouped_extrusions.back().extrusions.emplace_back(current_extrusion); + } - if (current_extrusion->adjacent_perimeter_extrusions.size() == 1) { - const PerimeterExtrusion *adjacent_extrusion = current_extrusion->adjacent_perimeter_extrusions.front(); - stack.push(adjacent_extrusion); - } else if (current_extrusion->adjacent_perimeter_extrusions.size() > 1) { - // When there is more than one available candidate, then order candidates to minimize distances between - // candidates and also to minimize the distance from the current_position. - std::vector available_candidates; - for (const PerimeterExtrusion *adjacent_extrusion : current_extrusion->adjacent_perimeter_extrusions) { - if (const size_t adjacent_extrusion_idx = adjacent_extrusion - sorted_perimeter_extrusions.data(); !visited[adjacent_extrusion_idx]) - available_candidates.emplace_back(adjacent_extrusion); + std::vector available_candidates; + for (const PerimeterExtrusion *adjacent_extrusion : current_extrusion->adjacent_perimeter_extrusions) { + const size_t adjacent_extrusion_idx = adjacent_extrusion - sorted_perimeter_extrusions.data(); + if (!visited[adjacent_extrusion_idx] && !adjacent_extrusion->is_external_perimeter() && adjacent_extrusion->nearest_external_perimeter == &perimeter_extrusion) { + available_candidates.emplace_back(adjacent_extrusion); } + } + if (available_candidates.size() == 1) { + stack.push(available_candidates.front()); + } else if (available_candidates.size() > 1) { + // When there is more than one available candidate, then order candidates to minimize distances between + // candidates and also to minimize the distance from the current_position. std::vector adjacent_extrusions = ordered_perimeter_extrusions_to_minimize_distances(Point::Zero(), available_candidates); - std::reverse(adjacent_extrusions.begin(), adjacent_extrusions.end()); - for (const PerimeterExtrusion *adjacent_extrusion : adjacent_extrusions) - stack.push(adjacent_extrusion); + for (auto extrusion_it = adjacent_extrusions.rbegin(); extrusion_it != adjacent_extrusions.rend(); ++extrusion_it) { + stack.push(*extrusion_it); + } } - - visited[current_extrusion_idx] = true; } if (!external_perimeters_first) @@ -253,7 +258,6 @@ static PerimeterExtrusions extract_ordered_perimeter_extrusions(const PerimeterE } const std::vector grouped_extrusion_order = order_of_grouped_perimeter_extrusions_to_minimize_distances(Point::Zero(), grouped_extrusions); - assert(grouped_extrusion_order.size() == grouped_ordered_extrusions.size()); PerimeterExtrusions ordered_extrusions; for (size_t order_idx : grouped_extrusion_order) { diff --git a/src/libslic3r/Arachne/PerimeterOrder.hpp b/src/libslic3r/Arachne/PerimeterOrder.hpp index edb13094f95..f8469d917f1 100644 --- a/src/libslic3r/Arachne/PerimeterOrder.hpp +++ b/src/libslic3r/Arachne/PerimeterOrder.hpp @@ -1,7 +1,14 @@ #ifndef slic3r_GCode_PerimeterOrder_hpp_ #define slic3r_GCode_PerimeterOrder_hpp_ -#include +#include +#include +#include +#include + +#include "libslic3r/Arachne/utils/ExtrusionLine.hpp" +#include "libslic3r/BoundingBox.hpp" +#include "libslic3r/Polygon.hpp" namespace Slic3r::Arachne::PerimeterOrder { From 5d1583db8523f11fa96251529053df190418857c Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Sun, 22 Dec 2024 18:35:45 +0800 Subject: [PATCH 07/33] Apply fix includes. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cherry-picked from prusa3d/PrusaSlicer@919740fb3e27eb1725b8c4fa19295d0b7e6ca560 Co-authored-by: Martin Šach --- .../BeadingStrategy/BeadingStrategy.cpp | 4 +- .../BeadingStrategy/BeadingStrategy.hpp | 6 ++- .../BeadingStrategyFactory.cpp | 53 +++++++++---------- .../BeadingStrategyFactory.hpp | 4 ++ .../DistributedBeadingStrategy.cpp | 5 ++ .../DistributedBeadingStrategy.hpp | 1 + .../LimitedBeadingStrategy.cpp | 7 ++- .../LimitedBeadingStrategy.hpp | 3 ++ .../OuterWallInsetBeadingStrategy.cpp | 3 ++ .../OuterWallInsetBeadingStrategy.hpp | 3 ++ .../RedistributeBeadingStrategy.cpp | 3 ++ .../RedistributeBeadingStrategy.hpp | 3 ++ .../WideningBeadingStrategy.cpp | 16 +++--- .../WideningBeadingStrategy.hpp | 4 ++ .../Arachne/SkeletalTrapezoidation.cpp | 37 ++++++++----- .../Arachne/SkeletalTrapezoidation.hpp | 19 +++---- .../Arachne/SkeletalTrapezoidationGraph.cpp | 18 ++++--- .../Arachne/SkeletalTrapezoidationGraph.hpp | 10 ++++ src/libslic3r/Arachne/utils/ExtrusionLine.cpp | 13 ++++- src/libslic3r/Arachne/utils/ExtrusionLine.hpp | 14 ++++- src/libslic3r/Arachne/utils/HalfEdgeGraph.hpp | 6 ++- .../Arachne/utils/PolygonsPointIndex.hpp | 2 - .../Arachne/utils/PolylineStitcher.cpp | 9 ++++ .../Arachne/utils/PolylineStitcher.hpp | 13 ++++- src/libslic3r/Arachne/utils/SparseGrid.hpp | 1 - .../Arachne/utils/SparseLineGrid.hpp | 1 - src/libslic3r/Arachne/utils/SquareGrid.hpp | 9 ++-- src/libslic3r/Geometry/MedialAxis.cpp | 11 +++- src/libslic3r/Geometry/MedialAxis.hpp | 7 +++ src/libslic3r/Geometry/Voronoi.cpp | 6 ++- src/libslic3r/Geometry/Voronoi.hpp | 13 +++++ src/libslic3r/Geometry/VoronoiOffset.cpp | 18 ++++--- src/libslic3r/Geometry/VoronoiOffset.hpp | 8 ++- src/libslic3r/Geometry/VoronoiUtils.cpp | 16 ++++-- src/libslic3r/Geometry/VoronoiUtils.hpp | 7 +++ src/libslic3r/Geometry/VoronoiUtilsCgal.cpp | 12 +++-- src/libslic3r/Geometry/VoronoiUtilsCgal.hpp | 3 ++ 37 files changed, 268 insertions(+), 100 deletions(-) diff --git a/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategy.cpp b/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategy.cpp index b57c84d6398..5ade0c92070 100644 --- a/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategy.cpp +++ b/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategy.cpp @@ -1,10 +1,8 @@ //Copyright (c) 2022 Ultimaker B.V. //CuraEngine is released under the terms of the AGPLv3 or higher. -#include - #include "BeadingStrategy.hpp" -#include "Point.hpp" +#include "libslic3r/Point.hpp" namespace Slic3r::Arachne { diff --git a/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategy.hpp b/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategy.hpp index 99e38239f9d..0a08f5d2d01 100644 --- a/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategy.hpp +++ b/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategy.hpp @@ -4,9 +4,13 @@ #ifndef BEADING_STRATEGY_H #define BEADING_STRATEGY_H +#include #include +#include +#include +#include -#include "../../libslic3r.h" +#include "libslic3r/libslic3r.h" namespace Slic3r::Arachne { diff --git a/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.cpp b/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.cpp index 97acd271ac3..911cd78bc15 100644 --- a/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.cpp +++ b/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.cpp @@ -3,51 +3,50 @@ #include "BeadingStrategyFactory.hpp" +#include +#include +#include + #include "LimitedBeadingStrategy.hpp" #include "WideningBeadingStrategy.hpp" #include "DistributedBeadingStrategy.hpp" #include "RedistributeBeadingStrategy.hpp" #include "OuterWallInsetBeadingStrategy.hpp" +#include "libslic3r/Arachne/BeadingStrategy/BeadingStrategy.hpp" -#include -#include - -namespace Slic3r::Arachne -{ +namespace Slic3r::Arachne { -BeadingStrategyPtr BeadingStrategyFactory::makeStrategy( - const coord_t preferred_bead_width_outer, - const coord_t preferred_bead_width_inner, - const coord_t preferred_transition_length, - const float transitioning_angle, - const bool print_thin_walls, - const coord_t min_bead_width, - const coord_t min_feature_size, - const double wall_split_middle_threshold, - const double wall_add_middle_threshold, - const coord_t max_bead_count, - const coord_t outer_wall_offset, - const int inward_distributed_center_wall_count, - const double minimum_variable_line_ratio -) +BeadingStrategyPtr BeadingStrategyFactory::makeStrategy(const coord_t preferred_bead_width_outer, + const coord_t preferred_bead_width_inner, + const coord_t preferred_transition_length, + const float transitioning_angle, + const bool print_thin_walls, + const coord_t min_bead_width, + const coord_t min_feature_size, + const double wall_split_middle_threshold, + const double wall_add_middle_threshold, + const coord_t max_bead_count, + const coord_t outer_wall_offset, + const int inward_distributed_center_wall_count, + const double minimum_variable_line_ratio) { BeadingStrategyPtr ret = std::make_unique(preferred_bead_width_inner, preferred_transition_length, transitioning_angle, wall_split_middle_threshold, wall_add_middle_threshold, inward_distributed_center_wall_count); - BOOST_LOG_TRIVIAL(debug) << "Applying the Redistribute meta-strategy with outer-wall width = " << preferred_bead_width_outer << ", inner-wall width = " << preferred_bead_width_inner << "."; + + BOOST_LOG_TRIVIAL(trace) << "Applying the Redistribute meta-strategy with outer-wall width = " << preferred_bead_width_outer << ", inner-wall width = " << preferred_bead_width_inner << "."; ret = std::make_unique(preferred_bead_width_outer, minimum_variable_line_ratio, std::move(ret)); if (print_thin_walls) { - BOOST_LOG_TRIVIAL(debug) << "Applying the Widening Beading meta-strategy with minimum input width " << min_feature_size << " and minimum output width " << min_bead_width << "."; + BOOST_LOG_TRIVIAL(trace) << "Applying the Widening Beading meta-strategy with minimum input width " << min_feature_size << " and minimum output width " << min_bead_width << "."; ret = std::make_unique(std::move(ret), min_feature_size, min_bead_width); } // Orca: we allow negative outer_wall_offset here - if (outer_wall_offset != 0) - { - BOOST_LOG_TRIVIAL(debug) << "Applying the OuterWallOffset meta-strategy with offset = " << outer_wall_offset << "."; + if (outer_wall_offset != 0) { + BOOST_LOG_TRIVIAL(trace) << "Applying the OuterWallOffset meta-strategy with offset = " << outer_wall_offset << "."; ret = std::make_unique(outer_wall_offset, std::move(ret)); } - //Apply the LimitedBeadingStrategy last, since that adds a 0-width marker wall which other beading strategies shouldn't touch. - BOOST_LOG_TRIVIAL(debug) << "Applying the Limited Beading meta-strategy with maximum bead count = " << max_bead_count << "."; + // Apply the LimitedBeadingStrategy last, since that adds a 0-width marker wall which other beading strategies shouldn't touch. + BOOST_LOG_TRIVIAL(trace) << "Applying the Limited Beading meta-strategy with maximum bead count = " << max_bead_count << "."; ret = std::make_unique(max_bead_count, std::move(ret)); return ret; } diff --git a/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.hpp b/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.hpp index a586906f459..e24a85e5c55 100644 --- a/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.hpp +++ b/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.hpp @@ -4,8 +4,12 @@ #ifndef BEADING_STRATEGY_FACTORY_H #define BEADING_STRATEGY_FACTORY_H +#include +#include + #include "BeadingStrategy.hpp" #include "../../Point.hpp" +#include "libslic3r/libslic3r.h" namespace Slic3r::Arachne { diff --git a/src/libslic3r/Arachne/BeadingStrategy/DistributedBeadingStrategy.cpp b/src/libslic3r/Arachne/BeadingStrategy/DistributedBeadingStrategy.cpp index c8a84c40113..7234015ae29 100644 --- a/src/libslic3r/Arachne/BeadingStrategy/DistributedBeadingStrategy.cpp +++ b/src/libslic3r/Arachne/BeadingStrategy/DistributedBeadingStrategy.cpp @@ -1,7 +1,12 @@ // Copyright (c) 2022 Ultimaker B.V. // CuraEngine is released under the terms of the AGPLv3 or higher. #include +#include +#include +#include + #include "DistributedBeadingStrategy.hpp" +#include "libslic3r/Arachne/BeadingStrategy/BeadingStrategy.hpp" namespace Slic3r::Arachne { diff --git a/src/libslic3r/Arachne/BeadingStrategy/DistributedBeadingStrategy.hpp b/src/libslic3r/Arachne/BeadingStrategy/DistributedBeadingStrategy.hpp index 4d651732d4a..991d5028b70 100644 --- a/src/libslic3r/Arachne/BeadingStrategy/DistributedBeadingStrategy.hpp +++ b/src/libslic3r/Arachne/BeadingStrategy/DistributedBeadingStrategy.hpp @@ -5,6 +5,7 @@ #define DISTRIBUTED_BEADING_STRATEGY_H #include "BeadingStrategy.hpp" +#include "libslic3r/libslic3r.h" namespace Slic3r::Arachne { diff --git a/src/libslic3r/Arachne/BeadingStrategy/LimitedBeadingStrategy.cpp b/src/libslic3r/Arachne/BeadingStrategy/LimitedBeadingStrategy.cpp index 97d854b418e..24e04c3f26d 100644 --- a/src/libslic3r/Arachne/BeadingStrategy/LimitedBeadingStrategy.cpp +++ b/src/libslic3r/Arachne/BeadingStrategy/LimitedBeadingStrategy.cpp @@ -1,11 +1,14 @@ //Copyright (c) 2022 Ultimaker B.V. //CuraEngine is released under the terms of the AGPLv3 or higher. -#include #include +#include +#include +#include #include "LimitedBeadingStrategy.hpp" -#include "Point.hpp" +#include "libslic3r/Point.hpp" +#include "libslic3r/Arachne/BeadingStrategy/BeadingStrategy.hpp" namespace Slic3r::Arachne { diff --git a/src/libslic3r/Arachne/BeadingStrategy/LimitedBeadingStrategy.hpp b/src/libslic3r/Arachne/BeadingStrategy/LimitedBeadingStrategy.hpp index 33292bc09fc..166057f03ed 100644 --- a/src/libslic3r/Arachne/BeadingStrategy/LimitedBeadingStrategy.hpp +++ b/src/libslic3r/Arachne/BeadingStrategy/LimitedBeadingStrategy.hpp @@ -4,7 +4,10 @@ #ifndef LIMITED_BEADING_STRATEGY_H #define LIMITED_BEADING_STRATEGY_H +#include + #include "BeadingStrategy.hpp" +#include "libslic3r/libslic3r.h" namespace Slic3r::Arachne { diff --git a/src/libslic3r/Arachne/BeadingStrategy/OuterWallInsetBeadingStrategy.cpp b/src/libslic3r/Arachne/BeadingStrategy/OuterWallInsetBeadingStrategy.cpp index 1406f7daa8b..ac9edb1dba6 100644 --- a/src/libslic3r/Arachne/BeadingStrategy/OuterWallInsetBeadingStrategy.cpp +++ b/src/libslic3r/Arachne/BeadingStrategy/OuterWallInsetBeadingStrategy.cpp @@ -4,6 +4,9 @@ #include "OuterWallInsetBeadingStrategy.hpp" #include +#include + +#include "libslic3r/Arachne/BeadingStrategy/BeadingStrategy.hpp" namespace Slic3r::Arachne { diff --git a/src/libslic3r/Arachne/BeadingStrategy/OuterWallInsetBeadingStrategy.hpp b/src/libslic3r/Arachne/BeadingStrategy/OuterWallInsetBeadingStrategy.hpp index 45a700b02e9..f0b4622df3d 100644 --- a/src/libslic3r/Arachne/BeadingStrategy/OuterWallInsetBeadingStrategy.hpp +++ b/src/libslic3r/Arachne/BeadingStrategy/OuterWallInsetBeadingStrategy.hpp @@ -4,7 +4,10 @@ #ifndef OUTER_WALL_INSET_BEADING_STRATEGY_H #define OUTER_WALL_INSET_BEADING_STRATEGY_H +#include + #include "BeadingStrategy.hpp" +#include "libslic3r/libslic3r.h" namespace Slic3r::Arachne { diff --git a/src/libslic3r/Arachne/BeadingStrategy/RedistributeBeadingStrategy.cpp b/src/libslic3r/Arachne/BeadingStrategy/RedistributeBeadingStrategy.cpp index 2b4dda02722..7307781840d 100644 --- a/src/libslic3r/Arachne/BeadingStrategy/RedistributeBeadingStrategy.cpp +++ b/src/libslic3r/Arachne/BeadingStrategy/RedistributeBeadingStrategy.cpp @@ -5,6 +5,9 @@ #include #include +#include + +#include "libslic3r/Arachne/BeadingStrategy/BeadingStrategy.hpp" namespace Slic3r::Arachne { diff --git a/src/libslic3r/Arachne/BeadingStrategy/RedistributeBeadingStrategy.hpp b/src/libslic3r/Arachne/BeadingStrategy/RedistributeBeadingStrategy.hpp index f0fefe23899..701aa630413 100644 --- a/src/libslic3r/Arachne/BeadingStrategy/RedistributeBeadingStrategy.hpp +++ b/src/libslic3r/Arachne/BeadingStrategy/RedistributeBeadingStrategy.hpp @@ -4,7 +4,10 @@ #ifndef REDISTRIBUTE_DISTRIBUTED_BEADING_STRATEGY_H #define REDISTRIBUTE_DISTRIBUTED_BEADING_STRATEGY_H +#include + #include "BeadingStrategy.hpp" +#include "libslic3r/libslic3r.h" namespace Slic3r::Arachne { diff --git a/src/libslic3r/Arachne/BeadingStrategy/WideningBeadingStrategy.cpp b/src/libslic3r/Arachne/BeadingStrategy/WideningBeadingStrategy.cpp index eefcab8e7b0..4c6dbb27061 100644 --- a/src/libslic3r/Arachne/BeadingStrategy/WideningBeadingStrategy.cpp +++ b/src/libslic3r/Arachne/BeadingStrategy/WideningBeadingStrategy.cpp @@ -3,6 +3,11 @@ #include "WideningBeadingStrategy.hpp" +#include +#include + +#include "libslic3r/Arachne/BeadingStrategy/BeadingStrategy.hpp" + namespace Slic3r::Arachne { @@ -24,17 +29,16 @@ WideningBeadingStrategy::Beading WideningBeadingStrategy::compute(coord_t thickn if (thickness < optimal_width) { Beading ret; ret.total_thickness = thickness; - if (thickness >= min_input_width) - { + if (thickness >= min_input_width) { ret.bead_widths.emplace_back(std::max(thickness, min_output_width)); ret.toolpath_locations.emplace_back(thickness / 2); - } else { + ret.left_over = 0; + } else ret.left_over = thickness; - } + return ret; - } else { + } else return parent->compute(thickness, bead_count); - } } coord_t WideningBeadingStrategy::getOptimalThickness(coord_t bead_count) const diff --git a/src/libslic3r/Arachne/BeadingStrategy/WideningBeadingStrategy.hpp b/src/libslic3r/Arachne/BeadingStrategy/WideningBeadingStrategy.hpp index 3e799b9af76..225aeed88b0 100644 --- a/src/libslic3r/Arachne/BeadingStrategy/WideningBeadingStrategy.hpp +++ b/src/libslic3r/Arachne/BeadingStrategy/WideningBeadingStrategy.hpp @@ -4,7 +4,11 @@ #ifndef WIDENING_BEADING_STRATEGY_H #define WIDENING_BEADING_STRATEGY_H +#include +#include + #include "BeadingStrategy.hpp" +#include "libslic3r/libslic3r.h" namespace Slic3r::Arachne { diff --git a/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp b/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp index f1e03d225ee..2d2cf9896db 100644 --- a/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp +++ b/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp @@ -3,20 +3,27 @@ #include "SkeletalTrapezoidation.hpp" -#include -#include -#include -#include #include - -#include "utils/linearAlg2D.hpp" -#include "Utils.hpp" -#include "SVG.hpp" -#include "Geometry/VoronoiVisualUtils.hpp" -#include "Geometry/VoronoiUtilsCgal.hpp" -#include "../EdgeGrid.hpp" - -#include "Geometry/VoronoiUtils.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libslic3r/Geometry/VoronoiUtils.hpp" +#include "ankerl/unordered_dense.h" +#include "libslic3r/Arachne/SkeletalTrapezoidationEdge.hpp" +#include "libslic3r/Arachne/SkeletalTrapezoidationJoint.hpp" +#include "libslic3r/Arachne/utils/ExtrusionJunction.hpp" +#include "libslic3r/Arachne/utils/ExtrusionLine.hpp" + +#ifndef NDEBUG + #include "libslic3r/EdgeGrid.hpp" +#endif #define SKELETAL_TRAPEZOIDATION_BEAD_SEARCH_MAX 1000 //A limit to how long it'll keep searching for adjacent beads. Increasing will re-use beadings more often (saving performance), but search longer for beading (costing performance). @@ -449,6 +456,8 @@ void SkeletalTrapezoidation::constructFromPolygons(const Polygons& polys) edge.from->incident_edge = &edge; } +using NodeSet = SkeletalTrapezoidation::NodeSet; + void SkeletalTrapezoidation::separatePointyQuadEndNodes() { NodeSet visited_nodes; @@ -1924,6 +1933,8 @@ void SkeletalTrapezoidation::addToolpathSegment(const ExtrusionJunction& from, c void SkeletalTrapezoidation::connectJunctions(ptr_vector_t& edge_junctions) { + using EdgeSet = ankerl::unordered_dense::set; + EdgeSet unprocessed_quad_starts(graph.edges.size() * 5 / 2); for (edge_t& edge : graph.edges) { diff --git a/src/libslic3r/Arachne/SkeletalTrapezoidation.hpp b/src/libslic3r/Arachne/SkeletalTrapezoidation.hpp index 3bd00f839bc..70c2a7d9a3d 100644 --- a/src/libslic3r/Arachne/SkeletalTrapezoidation.hpp +++ b/src/libslic3r/Arachne/SkeletalTrapezoidation.hpp @@ -5,11 +5,11 @@ #define SKELETAL_TRAPEZOIDATION_H #include - +#include #include // smart pointers #include // pair - -#include +#include +#include #include "utils/HalfEdgeGraph.hpp" #include "utils/PolygonsSegmentIndex.hpp" @@ -20,6 +20,10 @@ #include "libslic3r/Arachne/BeadingStrategy/BeadingStrategy.hpp" #include "SkeletalTrapezoidationGraph.hpp" #include "../Geometry/Voronoi.hpp" +#include "libslic3r/Line.hpp" +#include "libslic3r/Point.hpp" +#include "libslic3r/Polygon.hpp" +#include "libslic3r/libslic3r.h" //#define ARACHNE_DEBUG //#define ARACHNE_DEBUG_VORONOI @@ -82,10 +86,7 @@ class SkeletalTrapezoidation public: using Segment = PolygonsSegmentIndex; - using NodeSet = ankerl::unordered_dense::set; - using EdgeSet = ankerl::unordered_dense::set; - using EdgeMap = ankerl::unordered_dense::map; - using NodeMap = ankerl::unordered_dense::map; + using NodeSet = ankerl::unordered_dense::set; /*! * Construct a new trapezoidation problem to solve. @@ -169,8 +170,8 @@ class SkeletalTrapezoidation * mapping each voronoi VD edge to the corresponding halfedge HE edge * In case the result segment is discretized, we map the VD edge to the *last* HE edge */ - EdgeMap vd_edge_to_he_edge; - NodeMap vd_node_to_he_node; + ankerl::unordered_dense::map vd_edge_to_he_edge; + ankerl::unordered_dense::map vd_node_to_he_node; node_t &makeNode(const VD::vertex_type &vd_node, Point p); //!< Get the node which the VD node maps to, or create a new mapping if there wasn't any yet. /*! diff --git a/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.cpp b/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.cpp index 686a6055f85..f7a30c32db8 100644 --- a/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.cpp +++ b/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.cpp @@ -2,14 +2,18 @@ //CuraEngine is released under the terms of the AGPLv3 or higher. #include "SkeletalTrapezoidationGraph.hpp" -#include "../Line.hpp" -#include - +#include #include +#include +#include +#include +#include -#include "utils/linearAlg2D.hpp" #include "../Line.hpp" +#include "libslic3r/Arachne/SkeletalTrapezoidationEdge.hpp" +#include "libslic3r/Arachne/SkeletalTrapezoidationJoint.hpp" +#include "libslic3r/Point.hpp" namespace Slic3r::Arachne { @@ -182,8 +186,8 @@ bool STHalfEdgeNode::isLocalMaximum(bool strict) const void SkeletalTrapezoidationGraph::collapseSmallEdges(coord_t snap_dist) { - ankerl::unordered_dense::map::iterator> edge_locator; - ankerl::unordered_dense::map::iterator> node_locator; + ankerl::unordered_dense::map edge_locator; + ankerl::unordered_dense::map node_locator; for (auto edge_it = edges.begin(); edge_it != edges.end(); ++edge_it) { @@ -195,7 +199,7 @@ void SkeletalTrapezoidationGraph::collapseSmallEdges(coord_t snap_dist) node_locator.emplace(&*node_it, node_it); } - auto safelyRemoveEdge = [this, &edge_locator](edge_t* to_be_removed, std::list::iterator& current_edge_it, bool& edge_it_is_updated) + auto safelyRemoveEdge = [this, &edge_locator](edge_t* to_be_removed, Edges::iterator& current_edge_it, bool& edge_it_is_updated) { if (current_edge_it != edges.end() && to_be_removed == &*current_edge_it) diff --git a/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.hpp b/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.hpp index 33e43156ecb..5baac24accb 100644 --- a/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.hpp +++ b/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.hpp @@ -5,10 +5,20 @@ #define SKELETAL_TRAPEZOIDATION_GRAPH_H #include +#include #include "utils/HalfEdgeGraph.hpp" #include "SkeletalTrapezoidationEdge.hpp" #include "SkeletalTrapezoidationJoint.hpp" +#include "libslic3r/Arachne/utils/HalfEdge.hpp" +#include "libslic3r/Arachne/utils/HalfEdgeNode.hpp" +#include "libslic3r/libslic3r.h" + +namespace Slic3r +{ +class Line; +class Point; +}; namespace Slic3r::Arachne { diff --git a/src/libslic3r/Arachne/utils/ExtrusionLine.cpp b/src/libslic3r/Arachne/utils/ExtrusionLine.cpp index 03fb4ebb55b..49449cc59d0 100644 --- a/src/libslic3r/Arachne/utils/ExtrusionLine.cpp +++ b/src/libslic3r/Arachne/utils/ExtrusionLine.cpp @@ -2,10 +2,21 @@ //CuraEngine is released under the terms of the AGPLv3 or higher. #include +#include +#include #include "ExtrusionLine.hpp" -#include "linearAlg2D.hpp" #include "../../VariableWidth.hpp" +#include "libslic3r/Arachne/utils/ExtrusionJunction.hpp" +#include "libslic3r/BoundingBox.hpp" +#include "libslic3r/ExtrusionEntity.hpp" +#include "libslic3r/Line.hpp" +#include "libslic3r/Polygon.hpp" +#include "libslic3r/Polyline.hpp" + +namespace Slic3r { +class Flow; +} // namespace Slic3r namespace Slic3r::Arachne { diff --git a/src/libslic3r/Arachne/utils/ExtrusionLine.hpp b/src/libslic3r/Arachne/utils/ExtrusionLine.hpp index fe021941a93..d8cad702ace 100644 --- a/src/libslic3r/Arachne/utils/ExtrusionLine.hpp +++ b/src/libslic3r/Arachne/utils/ExtrusionLine.hpp @@ -5,16 +5,28 @@ #ifndef UTILS_EXTRUSION_LINE_H #define UTILS_EXTRUSION_LINE_H +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include "ExtrusionJunction.hpp" #include "../../Polyline.hpp" #include "../../Polygon.hpp" #include "../../BoundingBox.hpp" #include "../../ExtrusionEntity.hpp" #include "../../Flow.hpp" -#include "../../../clipper/clipper_z.hpp" +#include "libslic3r/Point.hpp" namespace Slic3r { class ThickPolyline; +class Flow; } namespace Slic3r::Arachne diff --git a/src/libslic3r/Arachne/utils/HalfEdgeGraph.hpp b/src/libslic3r/Arachne/utils/HalfEdgeGraph.hpp index 99efff6a077..17b06f2be28 100644 --- a/src/libslic3r/Arachne/utils/HalfEdgeGraph.hpp +++ b/src/libslic3r/Arachne/utils/HalfEdgeGraph.hpp @@ -21,8 +21,10 @@ class HalfEdgeGraph public: using edge_t = derived_edge_t; using node_t = derived_node_t; - std::list edges; - std::list nodes; + using Edges = std::list; + using Nodes = std::list; + Edges edges; + Nodes nodes; }; } // namespace Slic3r::Arachne diff --git a/src/libslic3r/Arachne/utils/PolygonsPointIndex.hpp b/src/libslic3r/Arachne/utils/PolygonsPointIndex.hpp index 125b3ef9268..04f017f86a5 100644 --- a/src/libslic3r/Arachne/utils/PolygonsPointIndex.hpp +++ b/src/libslic3r/Arachne/utils/PolygonsPointIndex.hpp @@ -156,8 +156,6 @@ struct PathsPointIndexLocator } }; -using PolygonsPointIndexLocator = PathsPointIndexLocator; - }//namespace Slic3r::Arachne namespace std diff --git a/src/libslic3r/Arachne/utils/PolylineStitcher.cpp b/src/libslic3r/Arachne/utils/PolylineStitcher.cpp index 89ec9295402..0abf63ac104 100644 --- a/src/libslic3r/Arachne/utils/PolylineStitcher.cpp +++ b/src/libslic3r/Arachne/utils/PolylineStitcher.cpp @@ -2,7 +2,16 @@ //CuraEngine is released under the terms of the AGPLv3 or higher. #include "PolylineStitcher.hpp" + #include "ExtrusionLine.hpp" +#include "libslic3r/Arachne/utils/PolygonsPointIndex.hpp" +#include "libslic3r/Polygon.hpp" + +namespace Slic3r { +namespace Arachne { +struct ExtrusionJunction; +} // namespace Arachne +} // namespace Slic3r namespace Slic3r::Arachne { diff --git a/src/libslic3r/Arachne/utils/PolylineStitcher.hpp b/src/libslic3r/Arachne/utils/PolylineStitcher.hpp index 2ab770a3ec0..7f547f4f23c 100644 --- a/src/libslic3r/Arachne/utils/PolylineStitcher.hpp +++ b/src/libslic3r/Arachne/utils/PolylineStitcher.hpp @@ -4,11 +4,20 @@ #ifndef UTILS_POLYLINE_STITCHER_H #define UTILS_POLYLINE_STITCHER_H +#include +#include +#include +#include +#include +#include +#include +#include + #include "SparsePointGrid.hpp" #include "PolygonsPointIndex.hpp" #include "../../Polygon.hpp" -#include -#include +#include "libslic3r/Point.hpp" +#include "libslic3r/libslic3r.h" namespace Slic3r::Arachne { diff --git a/src/libslic3r/Arachne/utils/SparseGrid.hpp b/src/libslic3r/Arachne/utils/SparseGrid.hpp index be461d42412..45876fb9a7a 100644 --- a/src/libslic3r/Arachne/utils/SparseGrid.hpp +++ b/src/libslic3r/Arachne/utils/SparseGrid.hpp @@ -6,7 +6,6 @@ #define UTILS_SPARSE_GRID_H #include -#include #include #include diff --git a/src/libslic3r/Arachne/utils/SparseLineGrid.hpp b/src/libslic3r/Arachne/utils/SparseLineGrid.hpp index a9b53686973..0b38988f92d 100644 --- a/src/libslic3r/Arachne/utils/SparseLineGrid.hpp +++ b/src/libslic3r/Arachne/utils/SparseLineGrid.hpp @@ -6,7 +6,6 @@ #define UTILS_SPARSE_LINE_GRID_H #include -#include #include #include diff --git a/src/libslic3r/Arachne/utils/SquareGrid.hpp b/src/libslic3r/Arachne/utils/SquareGrid.hpp index c59c3ee1b9f..ff45d853544 100644 --- a/src/libslic3r/Arachne/utils/SquareGrid.hpp +++ b/src/libslic3r/Arachne/utils/SquareGrid.hpp @@ -4,12 +4,15 @@ #ifndef UTILS_SQUARE_GRID_H #define UTILS_SQUARE_GRID_H -#include "../../Point.hpp" - +#include #include -#include #include #include +#include +#include + +#include "../../Point.hpp" +#include "libslic3r/libslic3r.h" namespace Slic3r::Arachne { diff --git a/src/libslic3r/Geometry/MedialAxis.cpp b/src/libslic3r/Geometry/MedialAxis.cpp index f3514bb5125..7fece75e633 100644 --- a/src/libslic3r/Geometry/MedialAxis.cpp +++ b/src/libslic3r/Geometry/MedialAxis.cpp @@ -1,9 +1,16 @@ #include #include "MedialAxis.hpp" -#include "clipper.hpp" +#include +#include +#include +#include + #include "VoronoiOffset.hpp" -#include "../ClipperUtils.hpp" +#include "libslic3r/ClipperUtils.hpp" +#include "libslic3r/ExPolygon.hpp" +#include "libslic3r/Point.hpp" +#include "libslic3r/libslic3r.h" #ifdef SLIC3R_DEBUG namespace boost { namespace polygon { diff --git a/src/libslic3r/Geometry/MedialAxis.hpp b/src/libslic3r/Geometry/MedialAxis.hpp index b1354ddb2f2..cd1404f915b 100644 --- a/src/libslic3r/Geometry/MedialAxis.hpp +++ b/src/libslic3r/Geometry/MedialAxis.hpp @@ -1,8 +1,15 @@ #ifndef slic3r_Geometry_MedialAxis_hpp_ #define slic3r_Geometry_MedialAxis_hpp_ +#include +#include +#include +#include + #include "Voronoi.hpp" #include "../ExPolygon.hpp" +#include "libslic3r/Line.hpp" +#include "libslic3r/Polyline.hpp" namespace Slic3r::Geometry { diff --git a/src/libslic3r/Geometry/Voronoi.cpp b/src/libslic3r/Geometry/Voronoi.cpp index 32dc5f14889..69db5376988 100644 --- a/src/libslic3r/Geometry/Voronoi.cpp +++ b/src/libslic3r/Geometry/Voronoi.cpp @@ -1,11 +1,13 @@ #include "Voronoi.hpp" +#include +#include + #include "libslic3r/Arachne/utils/PolygonsSegmentIndex.hpp" #include "libslic3r/Geometry/VoronoiUtils.hpp" #include "libslic3r/Geometry/VoronoiUtilsCgal.hpp" #include "libslic3r/MultiMaterialSegmentation.hpp" - -#include +#include "libslic3r/Line.hpp" namespace Slic3r::Geometry { diff --git a/src/libslic3r/Geometry/Voronoi.hpp b/src/libslic3r/Geometry/Voronoi.hpp index fffc958b0ad..23a50bb8f74 100644 --- a/src/libslic3r/Geometry/Voronoi.hpp +++ b/src/libslic3r/Geometry/Voronoi.hpp @@ -1,8 +1,15 @@ #ifndef slic3r_Geometry_Voronoi_hpp_ #define slic3r_Geometry_Voronoi_hpp_ +#include +#include +#include +#include + #include "../Line.hpp" #include "../Polyline.hpp" +#include "libslic3r/Point.hpp" +#include "libslic3r/libslic3r.h" #ifdef _MSC_VER // Suppress warning C4146 in OpenVDB: unary minus operator applied to unsigned type, result still unsigned @@ -10,6 +17,12 @@ #pragma warning(disable : 4146) #endif // _MSC_VER #include "boost/polygon/voronoi.hpp" + +namespace boost { +namespace polygon { +template struct segment_traits; +} // namespace polygon +} // namespace boost #ifdef _MSC_VER #pragma warning(pop) #endif // _MSC_VER diff --git a/src/libslic3r/Geometry/VoronoiOffset.cpp b/src/libslic3r/Geometry/VoronoiOffset.cpp index 46105220a4b..8ecd370235c 100644 --- a/src/libslic3r/Geometry/VoronoiOffset.cpp +++ b/src/libslic3r/Geometry/VoronoiOffset.cpp @@ -1,15 +1,21 @@ // Polygon offsetting using Voronoi diagram prodiced by boost::polygon. -#include "Geometry.hpp" -#include "VoronoiOffset.hpp" -#include "libslic3r.h" - #include +#include +#include +#include +#include +#include +#include +#include + +#include "libslic3r/Geometry.hpp" +#include "VoronoiOffset.hpp" +#include "libslic3r/libslic3r.h" +#include "libslic3r/Geometry/Voronoi.hpp" // #define VORONOI_DEBUG_OUT -#include - #ifdef VORONOI_DEBUG_OUT #include #endif diff --git a/src/libslic3r/Geometry/VoronoiOffset.hpp b/src/libslic3r/Geometry/VoronoiOffset.hpp index 359fe010c85..747538e8b69 100644 --- a/src/libslic3r/Geometry/VoronoiOffset.hpp +++ b/src/libslic3r/Geometry/VoronoiOffset.hpp @@ -3,9 +3,15 @@ #ifndef slic3r_VoronoiOffset_hpp_ #define slic3r_VoronoiOffset_hpp_ -#include "../libslic3r.h" +#include +#include +#include +#include "libslic3r/libslic3r.h" #include "Voronoi.hpp" +#include "libslic3r/Line.hpp" +#include "libslic3r/Point.hpp" +#include "libslic3r/Polygon.hpp" namespace Slic3r { diff --git a/src/libslic3r/Geometry/VoronoiUtils.cpp b/src/libslic3r/Geometry/VoronoiUtils.cpp index 33a68f8b19f..b34e538232e 100644 --- a/src/libslic3r/Geometry/VoronoiUtils.cpp +++ b/src/libslic3r/Geometry/VoronoiUtils.cpp @@ -1,11 +1,17 @@ #include - -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "VoronoiUtils.hpp" -#include "libslic3r.h" +#include "libslic3r/Exception.hpp" +#include "libslic3r/Line.hpp" namespace Slic3r::Geometry { diff --git a/src/libslic3r/Geometry/VoronoiUtils.hpp b/src/libslic3r/Geometry/VoronoiUtils.hpp index 9c915e223b5..6872e4ea721 100644 --- a/src/libslic3r/Geometry/VoronoiUtils.hpp +++ b/src/libslic3r/Geometry/VoronoiUtils.hpp @@ -1,8 +1,15 @@ #ifndef slic3r_VoronoiUtils_hpp_ #define slic3r_VoronoiUtils_hpp_ +#include +#include +#include + #include "libslic3r/Geometry/Voronoi.hpp" #include "libslic3r/Arachne/utils/PolygonsSegmentIndex.hpp" +#include "libslic3r/Arachne/utils/PolygonsPointIndex.hpp" +#include "libslic3r/Point.hpp" +#include "libslic3r/libslic3r.h" using VD = Slic3r::Geometry::VoronoiDiagram; diff --git a/src/libslic3r/Geometry/VoronoiUtilsCgal.cpp b/src/libslic3r/Geometry/VoronoiUtilsCgal.cpp index 3118bf82803..7797a5a29fd 100644 --- a/src/libslic3r/Geometry/VoronoiUtilsCgal.cpp +++ b/src/libslic3r/Geometry/VoronoiUtilsCgal.cpp @@ -1,15 +1,21 @@ -// Needed since the CGAL headers are not self-contained. -#include #include #include #include +#include +#include +#include #include "libslic3r/Geometry/Voronoi.hpp" #include "libslic3r/Geometry/VoronoiUtils.hpp" #include "libslic3r/Arachne/utils/PolygonsSegmentIndex.hpp" #include "libslic3r/MultiMaterialSegmentation.hpp" - #include "VoronoiUtilsCgal.hpp" +#include "libslic3r/Line.hpp" +#include "libslic3r/Point.hpp" + +namespace CGAL { +class MP_Float; +} // namespace CGAL using VD = Slic3r::Geometry::VoronoiDiagram; diff --git a/src/libslic3r/Geometry/VoronoiUtilsCgal.hpp b/src/libslic3r/Geometry/VoronoiUtilsCgal.hpp index 33ae847802c..baafbc7a1a7 100644 --- a/src/libslic3r/Geometry/VoronoiUtilsCgal.hpp +++ b/src/libslic3r/Geometry/VoronoiUtilsCgal.hpp @@ -1,6 +1,9 @@ #ifndef slic3r_VoronoiUtilsCgal_hpp_ #define slic3r_VoronoiUtilsCgal_hpp_ +#include +#include + #include "Voronoi.hpp" #include "../Arachne/utils/PolygonsSegmentIndex.hpp" From 71304368d0fd41f8c7f79a002a43ea676ef4a5e6 Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Sun, 22 Dec 2024 18:52:23 +0800 Subject: [PATCH 08/33] Update to latest PS code --- src/libslic3r/Geometry/VoronoiUtils.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/Geometry/VoronoiUtils.cpp b/src/libslic3r/Geometry/VoronoiUtils.cpp index b34e538232e..f140782891c 100644 --- a/src/libslic3r/Geometry/VoronoiUtils.cpp +++ b/src/libslic3r/Geometry/VoronoiUtils.cpp @@ -132,7 +132,7 @@ VoronoiUtils::discretize_parabola(const Point &source_point, const Segment &sour Point pxx; Line(a, b).distance_to_infinite_squared(source_point, &pxx); const Point ppxx = pxx - source_point; - const coord_t d = ppxx.norm(); + const coord_t d = ppxx.cast().norm(); const Vec2d rot = perp(ppxx).cast().normalized(); const double rot_cos_theta = rot.x(); @@ -145,8 +145,8 @@ VoronoiUtils::discretize_parabola(const Point &source_point, const Segment &sour } const double marking_bound = atan(transitioning_angle * 0.5); - int64_t msx = -marking_bound * d; // projected marking_start - int64_t mex = marking_bound * d; // projected marking_end + int64_t msx = -marking_bound * int64_t(d); // projected marking_start + int64_t mex = marking_bound * int64_t(d); // projected marking_end const coord_t marking_start_end_h = msx * msx / (2 * d) + d / 2; Point marking_start = Point(coord_t(msx), marking_start_end_h).rotated(rot_cos_theta, rot_sin_theta) + pxx; @@ -160,7 +160,7 @@ VoronoiUtils::discretize_parabola(const Point &source_point, const Segment &sour bool add_marking_start = msx * int64_t(dir) > int64_t(sx - px) * int64_t(dir) && msx * int64_t(dir) < int64_t(ex - px) * int64_t(dir); bool add_marking_end = mex * int64_t(dir) > int64_t(sx - px) * int64_t(dir) && mex * int64_t(dir) < int64_t(ex - px) * int64_t(dir); - const Point apex = Point(coord_t(0), coord_t(d / 2)).rotated(rot_cos_theta, rot_sin_theta) + pxx; + const Point apex = Point(0, d / 2).rotated(rot_cos_theta, rot_sin_theta) + pxx; bool add_apex = int64_t(sx - px) * int64_t(dir) < 0 && int64_t(ex - px) * int64_t(dir) > 0; assert(!add_marking_start || !add_marking_end || add_apex); From f2f827c175a41170f6780c3c5242f14b6cfffa94 Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Sun, 22 Dec 2024 18:53:36 +0800 Subject: [PATCH 09/33] Revert the changes BBL made for diagram fix, because this happens! (SoftFever/OrcaSlicer#7815) --- src/libslic3r/Geometry/Voronoi.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/Geometry/Voronoi.cpp b/src/libslic3r/Geometry/Voronoi.cpp index 69db5376988..4f7173e5c28 100644 --- a/src/libslic3r/Geometry/Voronoi.cpp +++ b/src/libslic3r/Geometry/Voronoi.cpp @@ -169,12 +169,10 @@ VoronoiDiagram::detect_known_issues(const VoronoiDiagram &voronoi_diagram, Segme return edge_issue_type; } else if (const IssueType cell_issue_type = detect_known_voronoi_cell_issues(voronoi_diagram, segment_begin, segment_end); cell_issue_type != IssueType::NO_ISSUE_DETECTED) { return cell_issue_type; + } else if (!VoronoiUtilsCgal::is_voronoi_diagram_planar_angle(voronoi_diagram, segment_begin, segment_end)) { + // Detection of non-planar Voronoi diagram detects at least GH issues #8474, #8514 and #8446. + return IssueType::NON_PLANAR_VORONOI_DIAGRAM; } - // BBS: test no problem in BBS - //} else if (!VoronoiUtilsCgal::is_voronoi_diagram_planar_angle(voronoi_diagram, segment_begin, segment_end)) { - // // Detection of non-planar Voronoi diagram detects at least GH issues #8474, #8514 and #8446. - // return IssueType::NON_PLANAR_VORONOI_DIAGRAM; - //} return IssueType::NO_ISSUE_DETECTED; } From 6575bd1ead42ab069290b42e7fec725fffe67587 Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Sun, 22 Dec 2024 20:51:15 +0800 Subject: [PATCH 10/33] SPE-1837: Fixed issue when perimeters weren't generated with Arachne. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cherry-picked from prusa3d/PrusaSlicer@6df4891e6cb98541d23b4c2b83b84a314e23e1ef Co-authored-by: Lukáš Hejl --- .../Arachne/BeadingStrategy/BeadingStrategyFactory.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.cpp b/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.cpp index 911cd78bc15..d6cb1331c11 100644 --- a/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.cpp +++ b/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.cpp @@ -30,7 +30,12 @@ BeadingStrategyPtr BeadingStrategyFactory::makeStrategy(const coord_t preferred_ const int inward_distributed_center_wall_count, const double minimum_variable_line_ratio) { - BeadingStrategyPtr ret = std::make_unique(preferred_bead_width_inner, preferred_transition_length, transitioning_angle, wall_split_middle_threshold, wall_add_middle_threshold, inward_distributed_center_wall_count); + // Handle a special case when there is just one external perimeter. + // Because big differences in bead width for inner and other perimeters cause issues with current beading strategies. + const coord_t optimal_width = max_bead_count <= 2 ? preferred_bead_width_outer : preferred_bead_width_inner; + BeadingStrategyPtr ret = std::make_unique(optimal_width, preferred_transition_length, transitioning_angle, + wall_split_middle_threshold, wall_add_middle_threshold, + inward_distributed_center_wall_count); BOOST_LOG_TRIVIAL(trace) << "Applying the Redistribute meta-strategy with outer-wall width = " << preferred_bead_width_outer << ", inner-wall width = " << preferred_bead_width_inner << "."; ret = std::make_unique(preferred_bead_width_outer, minimum_variable_line_ratio, std::move(ret)); From 1c68e19aca490d33fc4e99c8ad3d02458b7afcf0 Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Sun, 22 Dec 2024 20:52:02 +0800 Subject: [PATCH 11/33] Update to latest code from PS --- src/libslic3r/Arachne/WallToolPaths.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/Arachne/WallToolPaths.cpp b/src/libslic3r/Arachne/WallToolPaths.cpp index 55aabd9b022..8f2b04cf42e 100644 --- a/src/libslic3r/Arachne/WallToolPaths.cpp +++ b/src/libslic3r/Arachne/WallToolPaths.cpp @@ -361,7 +361,7 @@ void removeSmallAreas(Polygons &thiss, const double min_area_size, const bool re } } else { // For each polygon, computes the signed area, move small outlines at the end of the vector and keep pointer on small holes - std::vector small_holes; + Polygons small_holes; for (auto it = thiss.begin(); it < new_end;) { if (double area = ClipperLib::Area(to_path(*it)); fabs(area) < min_area_size) { if (area >= 0) { From 091ab688117de91671aaea02663d77f2d7dfff6c Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 3 Jan 2025 01:38:25 +0900 Subject: [PATCH 12/33] Display Commit ID Used for Build in AboutDialog (#6516) * Display commit ID used for build in AboutDialog * Dynamically check for snapshots --------- Co-authored-by: SoftFever --- CMakeLists.txt | 22 ++++++++++++++++++++++ src/libslic3r/libslic3r_version.h.in | 3 +++ src/slic3r/GUI/AboutDialog.cpp | 11 +++++++++++ 3 files changed, 36 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 40fe0d09180..78fb7da8c95 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,28 @@ if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type (default Release)" FORCE) endif() +find_package(Git) +if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git") + # Check if Orca is on a tag + execute_process( + COMMAND ${GIT_EXECUTABLE} describe --exact-match --tags + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + RESULT_VARIABLE GIT_TAG_CHECK + ) + if(NOT GIT_TAG_CHECK EQUAL 0) + add_definitions("-DSNAPSHOT_BUILD=1") + endif() + + # Check current Git commit hash + execute_process( + COMMAND ${GIT_EXECUTABLE} log -1 --format=%h + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_COMMIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + add_definitions("-DGIT_COMMIT_HASH=\"${GIT_COMMIT_HASH}\"") +endif() + if(DEFINED ENV{SLIC3R_STATIC}) set(SLIC3R_STATIC_INITIAL $ENV{SLIC3R_STATIC}) else() diff --git a/src/libslic3r/libslic3r_version.h.in b/src/libslic3r/libslic3r_version.h.in index 90383c93af6..31af715bc79 100644 --- a/src/libslic3r/libslic3r_version.h.in +++ b/src/libslic3r/libslic3r_version.h.in @@ -5,6 +5,9 @@ #define SLIC3R_APP_KEY "@SLIC3R_APP_KEY@" #define SLIC3R_VERSION "@SLIC3R_VERSION@" #define SoftFever_VERSION "@SoftFever_VERSION@" +#ifndef GIT_COMMIT_HASH + #define GIT_COMMIT_HASH "0000000" // 0000000 means uninitialized +#endif #define SLIC3R_BUILD_ID "@SLIC3R_BUILD_ID@" #define SLIC3R_BUILD_TIME "@SLIC3R_BUILD_TIME@" //#define SLIC3R_RC_VERSION "@SLIC3R_VERSION@" diff --git a/src/slic3r/GUI/AboutDialog.cpp b/src/slic3r/GUI/AboutDialog.cpp index 52d04bed548..e7ff3caa3f7 100644 --- a/src/slic3r/GUI/AboutDialog.cpp +++ b/src/slic3r/GUI/AboutDialog.cpp @@ -259,8 +259,19 @@ AboutDialog::AboutDialog() version->SetBackgroundColour(wxColour("#4d4d4d")); bs_version->SetBackgroundColour(wxColour("#4d4d4d")); + #ifdef SNAPSHOT_BUILD + auto build_string = _L("build") + " " + std::string(GIT_COMMIT_HASH); + wxStaticText* version_build = new wxStaticText(this, wxID_ANY, build_string.c_str(), wxDefaultPosition, wxDefaultSize); + version_build->SetFont(Label::Body_12); + + version_build->SetForegroundColour(wxColour("#FFFFFD")); + version_build->SetBackgroundColour(wxColour("#4d4d4d")); + #endif vesizer->Add(version, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, FromDIP(5)); + #ifdef SNAPSHOT_BUILD + vesizer->Add(version_build, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, FromDIP(5)); + #endif vesizer->Add(bs_version, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, FromDIP(5)); // #if BBL_INTERNAL_TESTING // wxString build_time = wxString::Format("Build Time: %s", std::string(SLIC3R_BUILD_TIME)); From d1dfcbe168837bca52ea7cd16f9f722fb0e9c1ae Mon Sep 17 00:00:00 2001 From: SoftFever Date: Fri, 3 Jan 2025 00:54:17 +0800 Subject: [PATCH 13/33] aesthetic change for build info (#7896) aesthetic change --- CMakeLists.txt | 10 ---------- src/slic3r/GUI/AboutDialog.cpp | 31 +++++++++++++------------------ 2 files changed, 13 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 78fb7da8c95..9b1b293ced0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,16 +24,6 @@ endif() find_package(Git) if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git") - # Check if Orca is on a tag - execute_process( - COMMAND ${GIT_EXECUTABLE} describe --exact-match --tags - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - RESULT_VARIABLE GIT_TAG_CHECK - ) - if(NOT GIT_TAG_CHECK EQUAL 0) - add_definitions("-DSNAPSHOT_BUILD=1") - endif() - # Check current Git commit hash execute_process( COMMAND ${GIT_EXECUTABLE} log -1 --format=%h diff --git a/src/slic3r/GUI/AboutDialog.cpp b/src/slic3r/GUI/AboutDialog.cpp index e7ff3caa3f7..435cc62bb44 100644 --- a/src/slic3r/GUI/AboutDialog.cpp +++ b/src/slic3r/GUI/AboutDialog.cpp @@ -241,11 +241,18 @@ AboutDialog::AboutDialog() // version { + + auto _build_string_font = Label::Body_10; + // _build_string_font.SetStyle(wxFONTSTYLE_ITALIC); + vesizer->Add(0, FromDIP(165), 1, wxEXPAND, FromDIP(5)); - auto version_string = _L("Orca Slicer ") + " " + std::string(SoftFever_VERSION); + auto version_string = _L("Orca Slicer") + " " + std::string(SoftFever_VERSION); wxStaticText* version = new wxStaticText(this, wxID_ANY, version_string.c_str(), wxDefaultPosition, wxDefaultSize); - wxStaticText* bs_version = new wxStaticText(this, wxID_ANY, wxString::Format("Based on PrusaSlicer and BambuStudio"), wxDefaultPosition, wxDefaultSize); - bs_version->SetFont(Label::Body_12); + wxStaticText* credits_string = new wxStaticText(this, wxID_ANY, + wxString::Format("Build %s.\nOrcaSlicer is based on PrusaSlicer and BambuStudio", + std::string(GIT_COMMIT_HASH)), + wxDefaultPosition, wxDefaultSize); + credits_string->SetFont(_build_string_font); wxFont version_font = GetFont(); #ifdef __WXMSW__ version_font.SetPointSize(version_font.GetPointSize()-1); @@ -255,24 +262,12 @@ AboutDialog::AboutDialog() version_font.SetPointSize(FromDIP(16)); version->SetFont(version_font); version->SetForegroundColour(wxColour("#FFFFFD")); - bs_version->SetForegroundColour(wxColour("#FFFFFD")); + credits_string->SetForegroundColour(wxColour("#FFFFFD")); version->SetBackgroundColour(wxColour("#4d4d4d")); - bs_version->SetBackgroundColour(wxColour("#4d4d4d")); - - #ifdef SNAPSHOT_BUILD - auto build_string = _L("build") + " " + std::string(GIT_COMMIT_HASH); - wxStaticText* version_build = new wxStaticText(this, wxID_ANY, build_string.c_str(), wxDefaultPosition, wxDefaultSize); - version_build->SetFont(Label::Body_12); - - version_build->SetForegroundColour(wxColour("#FFFFFD")); - version_build->SetBackgroundColour(wxColour("#4d4d4d")); - #endif + credits_string->SetBackgroundColour(wxColour("#4d4d4d")); vesizer->Add(version, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, FromDIP(5)); - #ifdef SNAPSHOT_BUILD - vesizer->Add(version_build, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, FromDIP(5)); - #endif - vesizer->Add(bs_version, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, FromDIP(5)); + vesizer->Add(credits_string, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, FromDIP(5)); // #if BBL_INTERNAL_TESTING // wxString build_time = wxString::Format("Build Time: %s", std::string(SLIC3R_BUILD_TIME)); // wxStaticText* build_time_text = new wxStaticText(this, wxID_ANY, build_time, wxDefaultPosition, wxDefaultSize); From f0e773f891a10e0cd1a3369515a96d7cf23a1198 Mon Sep 17 00:00:00 2001 From: "Lin Yu-Chieh (Victor)" Date: Fri, 3 Jan 2025 23:18:45 +0800 Subject: [PATCH 14/33] Revise OrcaSlicer_zh_TW.po (#6790) * Update OrcaSlicer_zh_TW.po * Update OrcaSlicer_zh_TW.po up to L3875 * Update OrcaSlicer_zh_TW.po up to L7955 * Merge branch 'main' into main * Update OrcaSlicer_zh_TW.po L7817 * Update OrcaSlicer_zh_TW.po L10000 * Update OrcaSlicer_zh_TW.po L11567 * Update OrcaSlicer_zh_TW.po L12684 * Update OrcaSlicer_zh_TW.po L15950 * Revised fuzzy L335 * Update OrcaSlicer_zh_TW.po * Update OrcaSlicer_zh_TW.po * Update OrcaSlicer_zh_TW.po * Update OrcaSlicer_zh_TW.po * Update OrcaSlicer_zh_TW.po * Update OrcaSlicer_zh_TW.po * Update OrcaSlicer_zh_TW.po * Merge branch 'main' into main * Update OrcaSlicer_zh_TW.po * Update OrcaSlicer_zh_TW.po * Update OrcaSlicer_zh_TW.po * Update OrcaSlicer_zh_TW.po --- localization/i18n/zh_TW/OrcaSlicer_zh_TW.po | 3126 +++++++++---------- 1 file changed, 1468 insertions(+), 1658 deletions(-) diff --git a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po index 19599b5f6cb..d2c70544f5b 100644 --- a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po +++ b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po @@ -1,14 +1,15 @@ -# Copyright (C) 2019 THE PACKAGE'S COPYRIGHT HOLDER +# Copyright (C)2019 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST Translator Jiang Yue , 2019. +# REVISED Victor Lin, 2024 # msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-01 08:07+0100\n" -"PO-Revision-Date: 2023-11-06 14:37+0800\n" -"Last-Translator: ablegods \n" +"POT-Creation-Date: 2024-09-11 22:56+0800\n" +"PO-Revision-Date: 2024-12-31 23:58+0800\n" +"Last-Translator: lin-ycv \n" "Language-Team: \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" @@ -17,9 +18,8 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 3.4.1\n" -#, fuzzy msgid "Supports Painting" -msgstr "自訂支撐" +msgstr "支撐筆刷" msgid "Alt + Mouse wheel" msgstr "Alt + 滑鼠滾輪" @@ -33,36 +33,30 @@ msgstr "重置方向" msgid "Ctrl + Mouse wheel" msgstr "Ctrl + 滑鼠滾輪" -#, fuzzy msgid "Pen size" msgstr "筆刷尺寸" msgid "Left mouse button" msgstr "滑鼠左鍵" -#, fuzzy msgid "Enforce supports" msgstr "新增支撐區" msgid "Right mouse button" msgstr "滑鼠右鍵" -#, fuzzy msgid "Block supports" msgstr "不產生支撐區" msgid "Shift + Left mouse button" msgstr "Shift + 滑鼠左鍵" -#, fuzzy msgid "Erase" msgstr "擦除" -#, fuzzy msgid "Erase all painting" -msgstr "擦除所有手繪支撐" +msgstr "擦除所有自訂支撐" -#, fuzzy msgid "Highlight overhang areas" msgstr "突顯出懸空區域" @@ -75,7 +69,6 @@ msgstr "套用" msgid "Gap area" msgstr "間隙面積" -#, fuzzy msgid "Tool type" msgstr "筆刷類型" @@ -88,13 +81,11 @@ msgstr "僅對懸空區生效" msgid "Auto support threshold angle: " msgstr "自動支撐角度臨界值:" -#, fuzzy msgid "Circle" msgstr "圓形" -#, fuzzy msgid "Sphere" -msgstr "球形" +msgstr "球體" msgid "Fill" msgstr "填充" @@ -106,9 +97,8 @@ msgstr "縫隙填充" msgid "Allows painting only on facets selected by: \"%1%\"" msgstr "僅允許在由以下條件選擇的平面上進行繪製:%1%" -#, fuzzy msgid "Highlight faces according to overhang angle." -msgstr "根據懸空角度突出顯示面。" +msgstr "根據懸空角度突顯出表面。" msgid "No auto support" msgstr "無自動支撐" @@ -128,27 +118,23 @@ msgid "" "the first %1% filaments will be available in painting tool." msgstr "線材數量超過上色工具支援的最大值,僅前 %1% 個線材可在上色工具中使用。" -#, fuzzy msgid "Color Painting" -msgstr "自訂顏色" +msgstr "顏色筆刷" -#, fuzzy msgid "Pen shape" msgstr "筆刷形狀" msgid "Paint" msgstr "繪製" -#, fuzzy msgid "Key 1~9" msgstr "按鍵 1~9" msgid "Choose filament" msgstr "選擇線材" -#, fuzzy msgid "Edge detection" -msgstr "邊緣偵測" +msgstr "偵測邊緣" msgid "Triangles" msgstr "三角形" @@ -156,7 +142,6 @@ msgstr "三角形" msgid "Filaments" msgstr "線材" -#, fuzzy msgid "Brush" msgstr "筆刷" @@ -193,9 +178,9 @@ msgstr "水平" msgid "Remove painted color" msgstr "移除已繪製的顏色" -#, fuzzy, boost-format +#, boost-format msgid "Painted using: Filament %1%" -msgstr "使用:線材 %1% 上色" +msgstr "上色:線材 %1% " msgid "Move" msgstr "移動" @@ -253,7 +238,7 @@ msgid "Translate" msgstr "平移" msgid "Group Operations" -msgstr "群組操作" +msgstr "裙組操作" msgid "Set Position" msgstr "設定位置" @@ -264,11 +249,9 @@ msgstr "設定方向" msgid "Set Scale" msgstr "設定縮放" -#, fuzzy msgid "Reset Position" msgstr "重設位置" -#, fuzzy msgid "Reset Rotation" msgstr "重設旋轉" @@ -276,7 +259,7 @@ msgid "World coordinates" msgstr "世界坐標" msgid "Object coordinates" -msgstr "" +msgstr "物件坐標" msgid "°" msgstr "°" @@ -292,16 +275,16 @@ msgid "uniform scale" msgstr "等比例縮放" msgid "Planar" -msgstr "" +msgstr "平面" msgid "Dovetail" -msgstr "" +msgstr "鳩尾榫" msgid "Auto" msgstr "自動" msgid "Manual" -msgstr "" +msgstr "手動" msgid "Plug" msgstr "插銷" @@ -313,10 +296,10 @@ msgid "Snap" msgstr "" msgid "Prism" -msgstr "" +msgstr "錐體" msgid "Frustum" -msgstr "錐體" +msgstr "截頭圓錐" msgid "Square" msgstr "正方形" @@ -325,14 +308,13 @@ msgid "Hexagon" msgstr "六邊形" msgid "Keep orientation" -msgstr "" +msgstr "保持方向" -#, fuzzy msgid "Place on cut" -msgstr "切割面放置到列印板上" +msgstr "切割面貼其於列印底板" msgid "Flip upside down" -msgstr "" +msgstr "倒轉" msgid "Connectors" msgstr "連接件" @@ -350,7 +332,7 @@ msgstr "形狀" #. Size in emboss direction #. TRN - Input label. Be short as possible msgid "Depth" -msgstr "" +msgstr "深度" msgid "Groove" msgstr "溝槽" @@ -374,21 +356,26 @@ msgid "" "Click to flip the cut plane\n" "Drag to move the cut plane" msgstr "" +"點擊翻轉切割面\n" +"拖曳移動切割面" msgid "" "Click to flip the cut plane\n" "Drag to move the cut plane\n" "Right-click a part to assign it to the other side" msgstr "" +"點擊翻轉切割面" +"拖曳移動切割面" +"右鍵點擊零件切換為另一側" msgid "Move cut plane" -msgstr "" +msgstr "移動切割面" msgid "Mode" msgstr "模式" msgid "Change cut mode" -msgstr "" +msgstr "變更切割模式" msgid "Tolerance" msgstr "公差" @@ -397,7 +384,7 @@ msgid "Drag" msgstr "拖拉" msgid "Draw cut line" -msgstr "" +msgstr "畫切割線" msgid "Left click" msgstr "滑鼠左鍵" @@ -423,12 +410,11 @@ msgstr "取消選擇連接件" msgid "Select all connectors" msgstr "選擇所有連接件" -#, fuzzy msgid "Cut" msgstr "切割" msgid "Rotate cut plane" -msgstr "" +msgstr "旋轉切割面" msgid "Remove connectors" msgstr "刪除所有連接件" @@ -452,10 +438,10 @@ msgid "Cancel" msgstr "取消" msgid "Build Volume" -msgstr "" +msgstr "列印體積" msgid "Flip cut plane" -msgstr "" +msgstr "翻轉切割面" msgid "Groove change" msgstr "" @@ -465,13 +451,13 @@ msgstr "重設" #. TRN: This is an entry in the Undo/Redo stack. The whole line will be 'Edited: (name of whatever was edited)'. msgid "Edited" -msgstr "" +msgstr "編輯" msgid "Cut position" -msgstr "" +msgstr "切割位置" msgid "Reset cutting plane" -msgstr "" +msgstr "重設切割面" msgid "Edit connectors" msgstr "編輯連接件" @@ -480,10 +466,10 @@ msgid "Add connectors" msgstr "新增連接件" msgid "Reset cut" -msgstr "" +msgstr "重設切割" msgid "Reset cutting plane and remove connectors" -msgstr "" +msgstr "重設切割面且移除連接件" msgid "Upper part" msgstr "上半部分" @@ -491,7 +477,6 @@ msgstr "上半部分" msgid "Lower part" msgstr "下半部分" -#, fuzzy msgid "Keep" msgstr "保留" @@ -521,16 +506,16 @@ msgstr[0] "" #, c-format, boost-format msgid "%1$d connector is out of object" msgid_plural "%1$d connectors are out of object" -msgstr[0] "" +msgstr[0] "%1$d連接件在物件外" msgid "Some connectors are overlapped" msgstr "存在連接件相互重疊" msgid "Select at least one object to keep after cutting." -msgstr "" +msgstr "切割後保留至少一個物件。" msgid "Cut plane is placed out of object" -msgstr "" +msgstr "切割面在物件外" msgid "Cut plane with groove is invalid" msgstr "" @@ -542,16 +527,16 @@ msgid "Cut by Plane" msgstr "用平面分割" msgid "non-manifold edges be caused by cut tool, do you want to fix it now?" -msgstr "" +msgstr "切科後產生非流形邊,是否要修復?" msgid "Repairing model object" msgstr "修復模型物件" msgid "Cut by line" -msgstr "" +msgstr "用線切割" msgid "Delete connector" -msgstr "" +msgstr "刪除連接件" msgid "Mesh name" msgstr "Mesh名" @@ -562,7 +547,7 @@ msgstr "細節等級" msgid "Decimate ratio" msgstr "簡化率" -#, fuzzy, boost-format +#, boost-format msgid "" "Processing model '%1%' with more than 1M triangles could be slow. It is " "highly recommended to simplify the model." @@ -618,11 +603,9 @@ msgstr "外觀面偵測" msgid "Perform Recognition" msgstr "執行偵測" -#, fuzzy msgid "Brush size" msgstr "筆刷尺寸" -#, fuzzy msgid "Brush shape" msgstr "筆刷形狀" @@ -634,9 +617,8 @@ msgstr "新增Z縫產生區" msgid "Block seam" msgstr "不產生Z縫區" -#, fuzzy msgid "Seam painting" -msgstr "自訂Z縫" +msgstr "Z縫筆刷" msgid "Remove selection" msgstr "移除繪製" @@ -653,7 +635,7 @@ msgstr "" #. TRN - Input label. Be short as possible #. Select look of letter shape msgid "Font" -msgstr "字體" +msgstr "字型" msgid "Thickness" msgstr "厚度" @@ -684,23 +666,22 @@ msgstr "Shift + 滑鼠上移或下移" msgid "Rotate text" msgstr "旋轉文字" -#, fuzzy msgid "Text shape" msgstr "新增文字" #. TRN - Title in Undo/Redo stack after rotate with text around emboss axe msgid "Text rotate" -msgstr "" +msgstr "文字旋轉" #. TRN - Title in Undo/Redo stack after move with text along emboss axe - From surface msgid "Text move" -msgstr "" +msgstr "文字移動" msgid "Set Mirror" msgstr "設定鏡像" msgid "Embossed text" -msgstr "" +msgstr "浮雕文字" msgid "Enter emboss gizmo" msgstr "" @@ -712,16 +693,16 @@ msgid "Embossing actions" msgstr "" msgid "Emboss" -msgstr "" +msgstr "浮雕" msgid "NORMAL" -msgstr "" +msgstr "正常" msgid "SMALL" -msgstr "" +msgstr "小" msgid "ITALIC" -msgstr "" +msgstr "斜體" msgid "SWISS" msgstr "" @@ -741,13 +722,13 @@ msgstr "高級" msgid "" "The text cannot be written using the selected font. Please try choosing a " "different font." -msgstr "" +msgstr "文字與字型不相容,請選擇其他的字型" msgid "Embossed text cannot contain only white spaces." -msgstr "" +msgstr "浮雕文字不能僅包含空白字元。" -msgid "Text contains character glyph (represented by '?') unknown by font." -msgstr "" +msgid "Text contains character glyph (represented by '?')unknown by font." +msgstr "文字包含字型無法識別的字形(以 '?' 表示)。" msgid "Text input doesn't show font skew." msgstr "" @@ -772,45 +753,45 @@ msgstr "" #, boost-format msgid "Font \"%1%\" can't be selected." -msgstr "" +msgstr "字型 \"%1%\" 無法選擇。" msgid "Operation" msgstr "" msgid "Join" -msgstr "" +msgstr "合併" msgid "Click to change text into object part." -msgstr "" +msgstr "點擊將文字轉換為物件部分。" msgid "You can't change a type of the last solid part of the object." -msgstr "您無法變更模型最後一個實體部分的類型。" +msgstr "你無法變更模型最後一個實體部分的類型。" msgctxt "EmbossOperation" msgid "Cut" msgstr "切割" msgid "Click to change part type into negative volume." -msgstr "" +msgstr "點擊將零件類型變更為負體積。" msgid "Modifier" msgstr "修改器" msgid "Click to change part type into modifier." -msgstr "" +msgstr "點擊將零件類型變更為修改器" msgid "Change Text Type" -msgstr "" +msgstr "更改文字類型" #, boost-format -msgid "Rename style(%1%) for embossing text" +msgid "Rename style(%1%)for embossing text" msgstr "" msgid "Name can't be empty." -msgstr "" +msgstr "名稱不可空白" msgid "Name has to be unique." -msgstr "" +msgstr "名稱必須是獨特的" msgid "OK" msgstr "確認" @@ -894,27 +875,29 @@ msgid "Style \"%1%\" can't be used and will be removed from a list." msgstr "" msgid "Unset italic" -msgstr "" +msgstr "取消斜體" msgid "Set italic" -msgstr "" +msgstr "斜體" msgid "Unset bold" -msgstr "" +msgstr "取消粗體" msgid "Set bold" -msgstr "" +msgstr "粗體" msgid "Revert text size." -msgstr "" +msgstr "恢復文字大小" msgid "Revert embossed depth." -msgstr "" +msgstr "恢復浮雕深度" msgid "" "Advanced options cannot be changed for the selected font.\n" "Select another font." msgstr "" +"無法更改所選字型的進階選項。\n" +"請選擇其他字型。" msgid "Revert using of model surface." msgstr "" @@ -946,75 +929,77 @@ msgstr "頂部" msgctxt "Alignment" msgid "Middle" -msgstr "" +msgstr "置中" msgctxt "Alignment" msgid "Bottom" msgstr "底部" msgid "Revert alignment." -msgstr "" +msgstr "恢復對齊" #. TRN EmbossGizmo: font units msgid "points" -msgstr "" +msgstr "pt" msgid "Revert gap between characters" -msgstr "" +msgstr "恢復字元間距" msgid "Distance between characters" -msgstr "" +msgstr "字元間距" msgid "Revert gap between lines" -msgstr "" +msgstr "恢復線間距" msgid "Distance between lines" -msgstr "" +msgstr "線間距" msgid "Undo boldness" -msgstr "" +msgstr "恢復粗體" msgid "Tiny / Wide glyphs" msgstr "" msgid "Undo letter's skew" -msgstr "" +msgstr "恢復文字變形" msgid "Italic strength ratio" msgstr "" msgid "Undo translation" -msgstr "" +msgstr "恢復移動" msgid "Distance of the center of the text to the model surface." -msgstr "" +msgstr "文字中心到模型表面的距離" msgid "Undo rotation" -msgstr "" +msgstr "恢復旋轉" msgid "Rotate text Clock-wise." -msgstr "" +msgstr "文字順時針旋轉" msgid "Unlock the text's rotation when moving text along the object's surface." -msgstr "" +msgstr "在沿物體表面移動文字時解鎖文字旋轉。" msgid "Lock the text's rotation when moving text along the object's surface." -msgstr "" +msgstr "將文字旋轉鎖定,並沿物體表面移動文字。" msgid "Select from True Type Collection." -msgstr "" +msgstr "從 True Type 中選擇。" msgid "Set text to face camera" -msgstr "" +msgstr "將文字面對相機" msgid "Orient the text towards the camera." -msgstr "" +msgstr "將文字朝向相機定向。" #, boost-format msgid "" "Can't load exactly same font(\"%1%\"). Application selected a similar " "one(\"%2%\"). You have to specify font for enable edit text." msgstr "" +"無法載入完全相同的字型(\"%1%\")。應用程式選擇了相似的字型(\"%2%\")。" +"必須指定字型才能啟用文字編輯。" msgid "No symbol" msgstr "" @@ -1023,7 +1008,7 @@ msgid "Loading" msgstr "載入中" msgid "In queue" -msgstr "" +msgstr "在佇列中" #. TRN - Input label. Be short as possible #. Height of one text line - Font Ascent @@ -1034,13 +1019,13 @@ msgstr "高度" #. Copy surface of model on surface of the embossed text #. TRN - Input label. Be short as possible msgid "Use surface" -msgstr "" +msgstr "用面" #. TRN - Input label. Be short as possible #. Option to change projection on curved surface -#. for each character(glyph) in text separately +#. for each character(glyph)in text separately msgid "Per glyph" -msgstr "" +msgstr "每個字形" #. TRN - Input label. Be short as possible #. Align Top|Middle|Bottom and Left|Center|Right @@ -1049,11 +1034,11 @@ msgstr "對齊" #. TRN - Input label. Be short as possible msgid "Char gap" -msgstr "" +msgstr "字元間距" #. TRN - Input label. Be short as possible msgid "Line gap" -msgstr "" +msgstr "行間距" #. TRN - Input label. Be short as possible msgid "Boldness" @@ -1070,7 +1055,7 @@ msgstr "" #. move text as modifier fully out of not flat surface #. TRN - Input label. Be short as possible msgid "From surface" -msgstr "" +msgstr "從面" #. TRN - Input label. Be short as possible #. Keep vector from bottom to top of text aligned with printer Y axis @@ -1085,11 +1070,11 @@ msgstr "" #. TRN - Title in Undo/Redo stack after rotate with SVG around emboss axe msgid "SVG rotate" -msgstr "" +msgstr "SVG旋轉" #. TRN - Title in Undo/Redo stack after move with SVG along emboss axe - From surface msgid "SVG move" -msgstr "" +msgstr "SVG移動" msgid "Enter SVG gizmo" msgstr "" @@ -1101,24 +1086,24 @@ msgid "SVG actions" msgstr "" msgid "SVG" -msgstr "SVG" +msgstr "" #, boost-format msgid "Opacity (%1%)" -msgstr "" +msgstr "不透明度 (%1%)" #, boost-format msgid "Color gradient (%1%)" -msgstr "" +msgstr "顏色漸層 (%1%)" msgid "Undefined fill type" -msgstr "" +msgstr "未定義的填充類型" msgid "Linear gradient" -msgstr "" +msgstr "線性漸層" msgid "Radial gradient" -msgstr "" +msgstr "徑向漸層" msgid "Open filled path" msgstr "" @@ -1133,46 +1118,47 @@ msgid "" "Final shape contains self-intersection or multiple points with same " "coordinate." msgstr "" +"最終形狀包含自相交或多個具有相同座標的點。" #, boost-format msgid "Shape is marked as invisible (%1%)." -msgstr "" +msgstr "形狀被標記為隱形 (%1%)。" #. TRN: The first placeholder is shape identifier, the second one is text describing the problem. #, boost-format -msgid "Fill of shape (%1%) contains unsupported: %2%." +msgid "Fill of shape (%1%)contains unsupported: %2%." msgstr "" #, boost-format -msgid "Stroke of shape (%1%) is too thin (minimal width is %2% mm)." +msgid "Stroke of shape (%1%)is too thin (minimal width is %2% mm)." msgstr "" #, boost-format -msgid "Stroke of shape (%1%) contains unsupported: %2%." +msgid "Stroke of shape (%1%)contains unsupported: %2%." msgstr "" msgid "Face the camera" -msgstr "" +msgstr "面向相機" #. TRN - Preview of filename after clear local filepath. msgid "Unknown filename" -msgstr "" +msgstr "未知的檔案名稱" #, boost-format msgid "SVG file path is \"%1%\"" -msgstr "" +msgstr "SVG 檔案路徑為 \"%1%\"" msgid "Reload SVG file from disk." -msgstr "" +msgstr "從硬碟重新載入 SVG 檔案。" msgid "Change file" -msgstr "" +msgstr "更換檔案" msgid "Change to another .svg file" -msgstr "" +msgstr "更換為另一個 .svg 檔案" msgid "Forget the file path" -msgstr "" +msgstr "忘記檔案路徑" msgid "" "Do NOT save local path to 3MF file.\n" @@ -1188,13 +1174,13 @@ msgid "Bake into model as uneditable part" msgstr "" msgid "Save as" -msgstr "" +msgstr "儲存為" msgid "Save SVG file" -msgstr "" +msgstr "儲存 '.svg' 檔案" msgid "Save as '.svg' file" -msgstr "" +msgstr "儲存為 '.svg' 檔案" msgid "Size in emboss direction." msgstr "" @@ -1205,19 +1191,19 @@ msgid "Scale also changes amount of curve samples (%1%)" msgstr "" msgid "Width of SVG." -msgstr "" +msgstr "SVG寬" msgid "Height of SVG." -msgstr "" +msgstr "SVG高" msgid "Lock/unlock the aspect ratio of the SVG." -msgstr "" +msgstr "鎖定/解鎖 SVG 的長寬比。" msgid "Reset scale" msgstr "重置比例" msgid "Distance of the center of the SVG to the model surface." -msgstr "" +msgstr "SVG 中心到模型表面的距離。" msgid "Reset distance" msgstr "" @@ -1236,63 +1222,63 @@ msgstr "水平鏡像" #. TRN: This is the name of the action that shows in undo/redo stack (changing part type from SVG to something else). msgid "Change SVG Type" -msgstr "" +msgstr "更改 SVG 類型" #. TRN - Input label. Be short as possible msgid "Mirror" msgstr "鏡像" msgid "Choose SVG file for emboss:" -msgstr "" +msgstr "選擇用於浮雕的 SVG 檔案:" #, boost-format msgid "File does NOT exist (%1%)." -msgstr "" +msgstr "檔案不存在(%1%)。" #, boost-format msgid "Filename has to end with \".svg\" but you selected %1%" -msgstr "" +msgstr "副檔名必須為 \".svg\" ,但選擇的是 %1%。" #, boost-format msgid "Nano SVG parser can't load from file (%1%)." -msgstr "" +msgstr "Nano SVG 解析器無法載入文件 (%1%)。" #, boost-format msgid "SVG file does NOT contain a single path to be embossed (%1%)." -msgstr "" +msgstr "SVG 文件無要浮雕的路徑 (%1%)。" msgid "Vertex" -msgstr "" +msgstr "頂點" msgid "Edge" -msgstr "" +msgstr "邊" msgid "Plane" -msgstr "" +msgstr "平面" msgid "Point on edge" -msgstr "" +msgstr "邊上的點" msgid "Point on circle" -msgstr "" +msgstr "圓上的點" msgid "Point on plane" -msgstr "" +msgstr "平面上的點" msgid "Center of edge" -msgstr "" +msgstr "邊中心" msgid "Center of circle" -msgstr "" +msgstr "圓中心" msgid "ShiftLeft mouse button" -msgstr "" +msgstr "Shift左滑鼠" msgid "Select feature" -msgstr "" +msgstr "選擇特徵" msgid "Select point" -msgstr "" +msgstr "選點" msgid "Delete" msgstr "刪除" @@ -1307,7 +1293,7 @@ msgid "Unselect" msgstr "" msgid "Measure" -msgstr "" +msgstr "測量" msgid "Edit to scale" msgstr "" @@ -1332,16 +1318,16 @@ msgid "Copy to clipboard" msgstr "複製到剪貼簿" msgid "Perpendicular distance" -msgstr "" +msgstr "垂直方向" msgid "Distance" -msgstr "" +msgstr "距離" msgid "Direct distance" msgstr "" msgid "Distance XYZ" -msgstr "" +msgstr "XYZ距離" msgid "Ctrl+" msgstr "Ctrl+" @@ -1356,9 +1342,8 @@ msgstr "未定義" msgid "%1% was replaced with %2%" msgstr "%1% 已被 %2% 替換" -#, fuzzy msgid "The configuration may be generated by a newer version of OrcaSlicer." -msgstr "此設定可能由新版本的 Orca Slicer 產生" +msgstr "此設定可能是新版本的 Orca Slicer 所產生" msgid "Some values have been replaced. Please check them:" msgstr "部分數值已被更換,請檢查:" @@ -1369,50 +1354,46 @@ msgstr "列印參數" msgid "Filament" msgstr "線材" -#, fuzzy msgid "Machine" msgstr "列印設備" -#, fuzzy msgid "Configuration package was loaded, but some values were not recognized." -msgstr "設定檔已被載入,但部分數值未被識別。" +msgstr "設定檔已被載入,但部分數值無法識別。" -#, fuzzy, boost-format +#, boost-format msgid "" "Configuration file \"%1%\" was loaded, but some values were not recognized." -msgstr "設定檔 “%1%” 已被載入,但部分數值未被識別。" +msgstr "設定檔 \"%1%\" 已被載入,但部分數值無法識別。" -#, fuzzy msgid "" "OrcaSlicer will terminate because of running out of memory.It may be a bug. " "It will be appreciated if you report the issue to our team." msgstr "" -"系統記憶體耗盡,Orca Slicer 即將停止並且結束。這可能是個錯誤,希望您可以報告" -"此問題,我們將非常感激。" +"系統記憶體耗盡,Orca Slicer 即將停止並且結束。這可能是個錯誤,希望你可以回報" +"此問題,我們非常感激。" msgid "Fatal error" msgstr "致命錯誤" -#, fuzzy msgid "" "OrcaSlicer will terminate because of a localization error. It will be " "appreciated if you report the specific scenario this issue happened." msgstr "" -"遇到語系本地化錯誤,Orca Slicer 即將停止並且結束。希望您可以報告發生此問題的" -"具體狀況,我們將非常感激。" +"遇到語系本地化錯誤,Orca Slicer 即將停止並且結束。希望你可以回報發生此問題的" +"具體狀況,我們非常感激。" msgid "Critical error" msgstr "嚴重錯誤" -#, fuzzy, boost-format +#, boost-format msgid "OrcaSlicer got an unhandled exception: %1%" -msgstr "Orca Slicer 遭遇到一個未處理的異常:%1%" +msgstr "Orca Slicer 遭遇到一個未處理的例外:%1%" msgid "Untitled" msgstr "未命名" msgid "Downloading Bambu Network Plug-in" -msgstr "正在下載 Bambu 網路套件" +msgstr "正在下載 Bambu 網路插件" msgid "Login information expired. Please login again." msgstr "登入資訊已過期。請重新登入。" @@ -1420,7 +1401,7 @@ msgstr "登入資訊已過期。請重新登入。" msgid "Incorrect password" msgstr "密碼不正確" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "Connect %s failed! [SN:%s, code=%s]" msgstr "連接 %s 失敗。[SN:%s, code=%s]" @@ -1435,7 +1416,7 @@ msgstr "" msgid "WebView2 Runtime" msgstr "WebView2 Runtime" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "" "%s\n" "Do you want to continue?" @@ -1446,15 +1427,13 @@ msgstr "" msgid "Remember my choice" msgstr "記住我的選擇" -#, fuzzy msgid "Loading configuration" msgstr "正在讀取設定檔" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "Click to download new version in default browser: %s" -msgstr "在預設瀏覽器中點擊下載最新版本: %s" +msgstr "在預設瀏覽器中開啟頁面下載最新版本: %s" -#, fuzzy msgid "The Orca Slicer needs an upgrade" msgstr " Orca Slicer 需要進行升級" @@ -1470,6 +1449,9 @@ msgid "" "Please note, application settings will be lost, but printer profiles will " "not be affected." msgstr "" +"OrcaSlicer 設定檔可能已損壞,無法解析。\n" +"OrcaSlicer 嘗試重新創建設定檔。\n" +"請注意,應用程式設定將會丟失,但機臺設定檔案不會受到影響。" msgid "Rebuild" msgstr "重新建構" @@ -1481,11 +1463,9 @@ msgstr "載入目前預設" msgid "Loading a mode view" msgstr "載入模式視圖" -#, fuzzy msgid "Choose one file (3mf):" msgstr "選擇一個檔案(3mf)" -#, fuzzy msgid "Choose one or more files (3mf/step/stl/svg/obj/amf/usd*/abc/ply):" msgstr "選擇一個或多個檔案(3mf/step/stl/svg/obj/amf/usd*/abc/ply):" @@ -1493,9 +1473,8 @@ msgid "Choose one or more files (3mf/step/stl/svg/obj/amf):" msgstr "選擇一個或多個檔案(3mf/step/stl/svg/obj/amf):" msgid "Choose ZIP file" -msgstr "" +msgstr "選擇 ZIP 檔" -#, fuzzy msgid "Choose one file (gcode/3mf):" msgstr "選擇一個檔案(gcode/3mf):" @@ -1505,7 +1484,7 @@ msgstr "部分預設已被修改。" msgid "" "You can keep the modified presets to the new project, discard or save " "changes as new presets." -msgstr "您可以保留尚未儲存修改的預設應用到新項目中,或者選擇忽略。" +msgstr "你可以保留尚未儲存修改的預設應用到新項目中,或者選擇忽略。" msgid "User logged out" msgstr "使用者登出" @@ -1516,11 +1495,10 @@ msgstr "在執行切片過程中不允許新增或打開專案項目!" msgid "Open Project" msgstr "打開專案項目" -#, fuzzy 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 " Orca Slicer 版本過低,需要更新到最新版本方可正常使用" +msgstr " Orca Slicer 版本過舊,需要更新到最新版本才能正常使用" msgid "Privacy Policy Update" msgstr "隱私協議更新" @@ -1529,9 +1507,10 @@ 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 "" +"雲端儲存的用戶預設數量已超過上限,新的用戶預設僅能在本地使用。" msgid "Sync user presets" -msgstr "" +msgstr "同步用戶預設" msgid "Loading user preset" msgstr "正在載入使用者預設" @@ -1564,6 +1543,7 @@ msgid "" "Could not start URL download. Destination folder is not set. Please choose " "destination folder in Configuration Wizard." msgstr "" +"無法開始 URL 下載。未設置目標資料夾。請在設定精靈中選擇目標資料夾。" msgid "Import File" msgstr "匯入檔案" @@ -1580,7 +1560,6 @@ msgstr "打開" msgid "Rename" msgstr "重新命名" -#, fuzzy msgid "Orca Slicer GUI initialization failed" msgstr " Orca Slicer 圖形界面初始化失敗" @@ -1588,9 +1567,8 @@ msgstr " Orca Slicer 圖形界面初始化失敗" msgid "Fatal error, exception caught: %1%" msgstr "致命錯誤,遭遇到異常:%1%" -#, fuzzy msgid "Quality" -msgstr "列印品質" +msgstr "品質" msgid "Shell" msgstr "外殼" @@ -1604,13 +1582,11 @@ msgstr "支撐" msgid "Flush options" msgstr "換料沖刷選項" -#, fuzzy msgid "Speed" -msgstr "列印速度" +msgstr "速度" -#, fuzzy msgid "Strength" -msgstr "列印強度" +msgstr "結構" msgid "Top Solid Layers" msgstr "頂部實心層" @@ -1642,7 +1618,6 @@ msgstr "擦除選項" msgid "Bed adhesion" msgstr "熱床黏接" -#, fuzzy msgid "Add part" msgstr "新增零件" @@ -1659,22 +1634,22 @@ msgid "Add support enforcer" msgstr "新增支撐產生器" msgid "Add text" -msgstr "" +msgstr "加文字" msgid "Add negative text" -msgstr "" +msgstr "加負文字" msgid "Add text modifier" -msgstr "" +msgstr "加文字修改器" msgid "Add SVG part" -msgstr "" +msgstr "加SVG物件" msgid "Add negative SVG" -msgstr "" +msgstr "加負SVG" msgid "Add SVG modifier" -msgstr "" +msgstr "加SVG修改器" msgid "Select settings" msgstr "選擇設定" @@ -1704,10 +1679,10 @@ msgid "Cone" msgstr "錐體" msgid "Disc" -msgstr "" +msgstr "圓盤" msgid "Torus" -msgstr "" +msgstr "環面" msgid "Orca Cube" msgstr "Orca 立方體" @@ -1722,10 +1697,10 @@ msgid "Voron Cube" msgstr "Voron 立方體" msgid "Stanford Bunny" -msgstr "" +msgstr "斯坦福兔子" msgid "Orca String Hell" -msgstr "" +msgstr "Orca 拉絲測試" msgid "" "This model features text embossment on the top surface. For optimal results, " @@ -1734,9 +1709,13 @@ msgid "" "Yes - Change these settings automatically\n" "No - Do not change these settings for me" msgstr "" +"這個模型在頂部表面具有文字浮雕效果。為了達到最佳效果,建議將「One Wall Threshold" +"(min_width_top_surface)」設為 0,以便「僅在頂部表面用一層牆壁」能夠最佳運作。\n" +"是 - 自動更改這些設定\n" +"否 - 不為我更改這些設定" msgid "Text" -msgstr "" +msgstr "文字" msgid "Height range Modifier" msgstr "高度範圍修改器" @@ -1756,26 +1735,25 @@ msgid "Set as individual objects" msgstr "設定為獨立物件" msgid "Fill bed with copies" -msgstr "鋪滿列印板" +msgstr "填滿列印底板" -#, fuzzy msgid "Fill the remaining area of bed with copies of the selected object" -msgstr "用選取物件的副本鋪滿列印板的空白區域" +msgstr "複製選取物件來填滿列印底板的空白區域" msgid "Printable" -msgstr "可列印的" +msgstr "要列印的" msgid "Fix model" msgstr "修復模型" msgid "Export as one STL" -msgstr "" +msgstr "匯出為一個STL" msgid "Export as STLs" -msgstr "" +msgstr "匯出為STLs" msgid "Reload from disk" -msgstr "從磁碟重新載入" +msgstr "從硬碟重新載入" msgid "Reload the selected parts from disk" msgstr "從磁碟重新載入選中的零件" @@ -1789,9 +1767,8 @@ msgstr "用新的 STL 替換選中的零件" msgid "Change filament" msgstr "更換線材" -#, fuzzy msgid "Set filament for selected items" -msgstr "為所選項目設定使用的線材" +msgstr "為所選物件設定使用的線材" msgid "Default" msgstr "預設" @@ -1877,16 +1854,16 @@ msgid "Mirror object" msgstr "鏡像物件" msgid "Edit text" -msgstr "" +msgstr "編輯文字" msgid "Ability to change text, font, size, ..." -msgstr "" +msgstr "編輯文字、字型、尺寸..." msgid "Edit SVG" -msgstr "" +msgstr "編輯SVG" msgid "Change SVG source file, projection, size, ..." -msgstr "" +msgstr "更改SVG來源、投影、尺寸..." msgid "Invalidate cut info" msgstr "解除切割關係" @@ -1895,7 +1872,7 @@ msgid "Add Primitive" msgstr "新增標準模型" msgid "Add Handy models" -msgstr "" +msgstr "新增測試用模型" msgid "Add Models" msgstr "新增模型" @@ -1924,49 +1901,42 @@ msgstr "拆分所選物件" msgid "Auto orientation" msgstr "自動定向" -#, fuzzy msgid "Auto orient the object to improve print quality." -msgstr "自動調整物件方向以提高列印品質。" +msgstr "自動調整物件轉向以提高列印品質。" msgid "Select All" msgstr "全選" -#, fuzzy msgid "select all objects on current plate" -msgstr "全選列印板上所有物件" +msgstr "全選此列印板上所有物件" msgid "Delete All" msgstr "刪除所有" -#, fuzzy msgid "delete all objects on current plate" -msgstr "刪除列印板上所有物件" +msgstr "刪除此列印板上所有物件" msgid "Arrange" msgstr "自動擺放" -#, fuzzy msgid "arrange current plate" -msgstr "在列印板執行自動擺放" +msgstr "自動擺放此列印版" msgid "Reload All" -msgstr "" +msgstr "重新載入所有物件" msgid "reload all from disk" -msgstr "" +msgstr "從硬碟重新載入所有物件" msgid "Auto Rotate" msgstr "自動旋轉方向" -#, fuzzy msgid "auto rotate current plate" -msgstr "在列印板執行自動旋轉方向" +msgstr "自動旋轉此列印板上的物件方向" -#, fuzzy msgid "Delete Plate" msgstr "刪除列印板" -#, fuzzy msgid "Remove the selected plate" msgstr "刪除所選列印板" @@ -2000,7 +1970,6 @@ msgstr "解鎖" msgid "Lock" msgstr "鎖定" -#, fuzzy msgid "Edit Plate Name" msgstr "編輯列印板名" @@ -2028,17 +1997,14 @@ msgid "%1$d non-manifold edge" msgid_plural "%1$d non-manifold edges" msgstr[0] "%1$d 非流形邊" -#, fuzzy msgid "Right click the icon to fix model object" -msgstr "滑鼠右鍵點擊此圖示可修復模型物件" +msgstr "滑鼠右鍵點擊此圖示修復物件模型" -#, fuzzy msgid "Right button click the icon to drop the object settings" -msgstr "滑鼠右鍵點擊此圖示以放棄物件的設定參數" +msgstr "滑鼠右鍵點擊此圖示以放棄物件的列印設定" -#, fuzzy msgid "Click the icon to reset all settings of the object" -msgstr "滑鼠左鍵點擊此圖示可重設物件的所有設定參數" +msgstr "滑鼠左鍵點擊此圖示可重設物件的所有列印設定" #, fuzzy msgid "Right button click the icon to drop the object printable property" @@ -2078,11 +2044,10 @@ msgstr "新增修改器" msgid "Switch to per-object setting mode to edit modifier settings." msgstr "切換到各個物件設定模式以編輯修改器的設定參數。" -#, fuzzy msgid "" "Switch to per-object setting mode to edit process settings of selected " "objects." -msgstr "切換到各個物件設定模式以編輯所選物件的列印參數" +msgstr "切換到物件設定模式編輯所選物件的列印參數" msgid "Delete connector from object which is a part of cut" msgstr "刪除的連接件屬於切割物件的一部分" @@ -2096,7 +2061,7 @@ msgstr "刪除的負體積屬於切割物件的一部分" msgid "" "To save cut correspondence you can delete all connectors from all related " "objects." -msgstr "為保證切割關係,您可以將所有關聯物件的連接件一起刪除。" +msgstr "為保證切割關係,你可以將所有關聯物件的連接件一起刪除。" #, fuzzy msgid "" @@ -2108,7 +2073,7 @@ msgid "" msgstr "" "該行為將破壞切割關係,在此之後將無法保證模型一致性。\n" "\n" -"如果要操作子零件或者負零件,需要先解除切割關係。" +"如果要操作子零件或者負體積,需要先解除切割關係。" msgid "Delete all connectors" msgstr "刪除所有連接件" @@ -2129,7 +2094,7 @@ msgid "Object manipulation" msgstr "物件操作" msgid "Group manipulation" -msgstr "群組操作" +msgstr "裙組操作" msgid "Object Settings to modify" msgstr "要修改的物件設定" @@ -2162,7 +2127,6 @@ msgid "" "If first selected item is an object, the second one should also be object." msgstr "如果第一個選擇的是物件,那麼第二個選擇的也必須是物件。" -#, fuzzy msgid "" "If first selected item is a part, the second one should be part in the same " "object." @@ -2237,7 +2201,6 @@ msgstr "層高" msgid "Wall loops" msgstr "牆層數" -#, fuzzy msgid "Infill density(%)" msgstr "填充密度(%)" @@ -2256,22 +2219,18 @@ msgstr "僅內側" msgid "Outer and inner brim" msgstr "內側和外側" -#, fuzzy msgid "No-brim" -msgstr "無brim(裙邊)" +msgstr "無側裙(brim)" msgid "Outer wall speed" msgstr "外牆速度" -#, fuzzy msgid "Plate" msgstr "列印板" -#, fuzzy msgid "Brim" -msgstr "Brim(裙邊)" +msgstr "側裙(Brim)" -#, fuzzy msgid "Object/Part Setting" msgstr "物件/零件 設定" @@ -2303,7 +2262,7 @@ msgid "Pause" msgstr "暫停" msgid "Template" -msgstr "" +msgstr "範本" msgid "Custom" msgstr "自訂" @@ -2320,9 +2279,8 @@ msgstr "自訂 G-code:" msgid "Custom G-code" msgstr "自訂 G-code" -#, fuzzy msgid "Enter Custom G-code used on current layer:" -msgstr "輸入目前層上使用的自訂 G-code:" +msgstr "輸入當層使用的自訂 G-code:" msgid "Jump to Layer" msgstr "轉換到層" @@ -2369,7 +2327,6 @@ msgstr "刪除自訂 G-code" msgid "Delete Filament Change" msgstr "刪除線材更換" -#, fuzzy msgid "No printer" msgstr "無列印設備" @@ -2392,17 +2349,14 @@ msgstr "無法連接到雲端服務" msgid "Please click on the hyperlink above to view the cloud service status" msgstr "請點擊上方的超連結以查看雲端服務狀態" -#, fuzzy msgid "Failed to connect to the printer" msgstr "無法連接列印設備" -#, fuzzy msgid "Connection to printer failed" msgstr "連接列印設備失敗" -#, fuzzy msgid "Please check the network connection of the printer and Orca." -msgstr "請檢查列印設備和 Orca Slicer 的網路連接" +msgstr "請檢查列印設備與 Orca Slicer 的網路連線" msgid "Connecting..." msgstr "連線中..." @@ -2489,11 +2443,11 @@ msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " "load or unload filaments." msgstr "" +"選擇一個 AMS 槽,然後按下「上料」或「退料」按鈕來自動加載或卸載耗材。" msgid "Edit" msgstr "編輯" -#, fuzzy msgid "" "All the selected objects are on the locked plate,\n" "We can not do auto-arrange on these objects." @@ -2504,7 +2458,6 @@ msgstr "" msgid "No arrangeable objects are selected." msgstr "未選擇欲排列的物件象。" -#, fuzzy msgid "" "This plate is locked,\n" "We can not do auto-arrange on this plate." @@ -2519,10 +2472,9 @@ msgstr "自動擺放" msgid "Arranging canceled." msgstr "已取消自動擺放。" -#, fuzzy msgid "" "Arranging is done but there are unpacked items. Reduce spacing and try again." -msgstr "已完成自動擺放,但是有未被擺到列印板內的物件,可在減小物件間距後重試。" +msgstr "已完成自動擺放,但是有未被擺到列印板內的物件,可縮小物件間距後再重試。" msgid "Arranging done." msgstr "已完成自動擺放。" @@ -2531,30 +2483,28 @@ msgid "" "Arrange failed. Found some exceptions when processing object geometries." msgstr "自動擺放失敗,處理物件位置時遇到異常。" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " "bed:\n" "%s" msgstr "" -"自動擺放會忽略以下無法放入單一列印板的物件:\n" +"自動擺放忽略了以下無法放入單一列印板的物件:\n" "%s" -#, fuzzy msgid "" "All the selected objects are on the locked plate,\n" "We can not do auto-orient on these objects." msgstr "" "所有選中的物件都處於被鎖定的列印板上,\n" -"無法對這些物件做自動定向。" +"無法對這些物件做自動轉向。" -#, fuzzy msgid "" "This plate is locked,\n" "We can not do auto-orient on this plate." msgstr "" "該列印板處於鎖定狀態,\n" -"無法對其進行自動定向。" +"無法對其進行自動轉向。" msgid "Orienting..." msgstr "自動旋轉方向..." @@ -2563,10 +2513,10 @@ msgid "Orienting" msgstr "自動旋轉方向..." msgid "Orienting canceled." -msgstr "" +msgstr "自動轉向已取消。" msgid "Filling" -msgstr "" +msgstr "填充中" msgid "Bed filling canceled." msgstr "填充列印板已取消。" @@ -2589,9 +2539,8 @@ msgstr "登入中" msgid "Login failed" msgstr "登入失敗" -#, fuzzy msgid "Please check the printer network connection." -msgstr "請檢查列印設備的網路連接。" +msgstr "請檢查列印設備的網路連線。" msgid "Abnormal print file data. Please slice again." msgstr "列印檔案資料異常,請重新切片" @@ -2619,7 +2568,6 @@ msgstr "無法傳送列印作業,請重試。" msgid "Failed to upload file to ftp. Please try again." msgstr "上傳檔案至 FTP 失敗,請重試。" -#, fuzzy msgid "" "Check the current status of the bambu server by clicking on the link above." msgstr "點擊上方的連結檢查 Bambu 伺服器的即時狀態。" @@ -2644,7 +2592,7 @@ msgid "Sending print job through cloud service" msgstr "正在通過雲端服務傳送列印作業" msgid "Print task sending times out." -msgstr "" +msgstr "連線逾時" msgid "Service Unavailable" msgstr "暫停服務" @@ -2672,13 +2620,12 @@ msgstr "透過區域網路傳送 gcode 檔案" msgid "Sending gcode file to sdcard" msgstr "傳送 gcode 檔案到 SD 記憶卡" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "Successfully sent. Close current page in %s s" msgstr "傳送成功。即將關閉目前頁面(%s秒)" -#, fuzzy msgid "An SD card needs to be inserted before sending to printer." -msgstr "傳送到列印設備前需要先插入 SD 記憶卡。" +msgstr "列印設備要先插入SD卡才能接收傳送。" msgid "Importing SLA archive" msgstr "匯入 SLA 存檔" @@ -2687,7 +2634,7 @@ msgid "" "The SLA archive doesn't contain any presets. Please activate some SLA " "printer preset first before importing that SLA archive." msgstr "" -"SLA 存檔不包含任何預設。在匯入該 SLA 存檔之前,請先啟用一些 SLA 印表機預設。" +"SLA 存檔不包含任何預設。在匯入該 SLA 存檔之前,請先啟用一些 SLA 列印設備預設。" msgid "Importing canceled." msgstr "匯入已取消。" @@ -2702,10 +2649,10 @@ msgid "" msgstr "匯入的 SLA 存檔不包含任何預設。目前的 SLA 預設被用作備用選項。" msgid "You cannot load SLA project with a multi-part object on the bed" -msgstr "您無法在列印板上載入包含多部分物件的 SLA 項目" +msgstr "你無法在列印板上載入包含多部分物件的 SLA 項目" msgid "Please check your object list before preset changing." -msgstr "請在更改預設之前檢查您的物件清單。" +msgstr "請在更改預設之前檢查你的物件清單。" msgid "Attention!" msgstr "注意!" @@ -2737,15 +2684,14 @@ msgstr "版權" msgid "License" msgstr "憑證" -#, fuzzy msgid "Orca Slicer is licensed under " -msgstr " Orca Slicer 是在" +msgstr " Orca Slicer 授權於" msgid "GNU Affero General Public License, version 3" -msgstr "GNU Affero 通用公共許可證,版本 3 下授權的" +msgstr "GNU Affero 通用公共許可證,版本 3" msgid "Orca Slicer is based on PrusaSlicer and BambuStudio" -msgstr "" +msgstr "Orca Slicer 基於 PrusaSlicer 與 BambuStudio" msgid "Libraries" msgstr "庫" @@ -2762,12 +2708,10 @@ msgstr "關於 %s" msgid "Orca Slicer " msgstr "Orca Slicer " -#, fuzzy msgid "OrcaSlicer is based on BambuStudio, PrusaSlicer, and SuperSlicer." msgstr "" -"Orca Slicer 是基於 Bambulab 的 BambuStudio, PrusaSlicer, and SuperSlicer 開發" +"Orca Slicer 是基於 BambuStudio, PrusaSlicer, 與 SuperSlicer 的開發" -#, fuzzy msgid "BambuStudio is originally based on PrusaSlicer by PrusaResearch." msgstr "BambuStudio 最初是基於 PrusaResearch 的 PrusaSlicer。" @@ -2831,18 +2775,18 @@ msgid "Setting Virtual slot information while printing is not supported" msgstr "不支援在列印時設定虛擬槽位資訊" msgid "Are you sure you want to clear the filament information?" -msgstr "您確定要清除線材資訊嗎?" +msgstr "你確定要清除線材資訊嗎?" msgid "You need to select the material type and color first." -msgstr "您需要先選擇線材類型和顏色。" +msgstr "你需要先選擇線材類型和顏色。" #, c-format, boost-format msgid "Please input a valid value (K in %.1f~%.1f)" -msgstr "" +msgstr "請輸入有效的數值 (K於 %.1f~%.1f 之間)" #, c-format, boost-format msgid "Please input a valid value (K in %.1f~%.1f, N in %.1f~%.1f)" -msgstr "" +msgstr "請輸入有效的數值 (K於 %.1f~%.1f 之間,N於 %.1f~%.1f 之間)" msgid "Other Color" msgstr "其他顏色" @@ -2864,7 +2808,6 @@ msgstr "" msgid "Nozzle Diameter" msgstr "噴嘴直徑" -#, fuzzy msgid "Bed Type" msgstr "列印板類型" @@ -2892,13 +2835,12 @@ msgstr "開始" msgid "Next" msgstr "下一步" -#, fuzzy 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 "" -"校準完成。如下圖中的範例,請在您的熱床上找到最均勻完整的擠出線,並將其左側的" +"校準完成。如下圖中的範例,請在你的熱床上找到最均勻完整的擠出線,並將其左側的" "數值填入係數 K 欄位。" msgid "Save" @@ -2934,15 +2876,12 @@ msgid "" "Note: Only the AMS slots loaded with the same material type can be selected." msgstr "僅允許選擇放入同種材質線材的 AMS 槽位" -#, fuzzy msgid "Enable AMS" msgstr "使用 AMS" -#, fuzzy msgid "Print with filaments in the AMS" msgstr "使用 AMS 裡的線材列印" -#, fuzzy msgid "Disable AMS" msgstr "停用 AMS" @@ -2950,7 +2889,7 @@ msgid "Print with the filament mounted on the back of chassis" msgstr "使用機箱背後掛載的線材列印" msgid "Current Cabin humidity" -msgstr "" +msgstr "濕度" msgid "" "Please change the desiccant when it is too wet. The indicator may not " @@ -2958,11 +2897,13 @@ msgid "" "desiccant pack is changed. it take hours to absorb the moisture, low " "temperatures also slow down the process." msgstr "" +"當濕度太高時,請更換乾燥劑。在以下情況濕度指標可能會不準確:" +"開子打開時 或 乾燥劑剛換,乾燥劑需數小時才能有效吸收濕氣" +"低溫也會降低吸收速度" -#, fuzzy msgid "" "Config which AMS slot should be used for a filament used in the print job" -msgstr "設定列印作業中所使用的線材應使用哪個 AMS 插槽" +msgstr "設定列印作業中所使用的線材應使用哪個 AMS 槽" msgid "Filament used in this print job" msgstr "目前列印作業中使用的線材" @@ -2979,15 +2920,12 @@ msgstr "不使用 AMS" msgid "Print using materials mounted on the back of the case" msgstr "使用安裝在機箱背面的線材進行列印" -#, fuzzy msgid "Print with filaments in ams" msgstr "使用 AMS 裡的線材列印" -#, fuzzy msgid "Print with filaments mounted on the back of the chassis" -msgstr "使用掛載在機箱背部的線材列印" +msgstr "使用掛在機箱背部的線材列印" -#, fuzzy msgid "" "When the current material run out, the printer will continue to print in the " "following order." @@ -2996,30 +2934,27 @@ msgstr "當目前線材用完時,列印設備將按照以下順序繼續列印 msgid "Group" msgstr "組" -#, fuzzy msgid "The printer does not currently support auto refill." -msgstr "此列印設備目前不支援自動補給備用線材。" +msgstr "此列印設備目前不支援自動切換備用線材。" -#, fuzzy msgid "" "AMS filament backup is not enabled, please enable it in the AMS settings." -msgstr "AMS 備用線材自動補給未啟用,請在 AMS 設定中啟用。" +msgstr "AMS 備用線材自動切換未啟用,請在 AMS 設定中啟用。" -#, fuzzy msgid "" "If there are two identical filaments in AMS, AMS filament backup will be " "enabled. \n" "(Currently supporting automatic supply of consumables with the same brand, " "material type, and color)" msgstr "" -"如果 AMS 中有兩個相同的線材,則會啟用 AMS 備用線材自動補給功能。\n" -"(目前支援同品牌、同材質、同顏色的耗材自動供應)" +"如果 AMS 中有兩個相同的線材,則會啟用 AMS 備用線材自動切換功能。\n" +"(目前支援同品牌、同材質、同顏色的線材自動切換)" msgid "DRY" -msgstr "" +msgstr "乾" msgid "WET" -msgstr "" +msgstr "濕" msgid "AMS Settings" msgstr "AMS 設定" @@ -3038,25 +2973,25 @@ msgid "" "Note: if a new filament is inserted during printing, the AMS will not " "automatically read any information until printing is completed." msgstr "" +"備註: 若在列印過程中插入新的線材,AMS會等到列印完成才會讀取線材資訊" msgid "" "When inserting a new filament, the AMS will not automatically read its " "information, leaving it blank for you to enter manually." msgstr "" -"在插入一卷新線材時,AMS 將不會自動讀取線材資訊,預留一個空的線材資訊等待您手" +"在插入一卷新線材時,AMS 將不會自動讀取線材資訊,預留一個空的線材資訊等待你手" "動輸入。" msgid "Power on update" msgstr "開機時偵測" -#, fuzzy msgid "" "The AMS will automatically read the information of inserted filament on " "start-up. It will take about 1 minute.The reading process will roll filament " "spools." msgstr "" -"每次開機時,AMS 將會自動讀取其所插入的線材資訊(讀取過程會轉動線材卷)。需要" -"花時大約1分鐘。" +"每次開機時,AMS 將會自動讀取有插入的線材資訊(讀取過程會轉動線卷)。需要" +"花費大約1分鐘。" msgid "" "The AMS will not automatically read information from inserted filament " @@ -3064,9 +2999,8 @@ msgid "" "last shutdown." msgstr "AMS 不會在啟動時自動讀取線材資訊。它會使用上次關機前記錄的資訊。" -#, fuzzy msgid "Update remaining capacity" -msgstr "更新線材剩餘容量" +msgstr "更新線材剩餘量" msgid "" "The AMS will estimate Bambu filament's remaining capacity after the filament " @@ -3086,12 +3020,13 @@ msgid "" msgstr "AMS 線材耗盡後將自動切換到屬性完全相同的線材" msgid "Air Printing Detection" -msgstr "" +msgstr "偵測到憑空列印" msgid "" "Detects clogging and filament grinding, halting printing immediately to " "conserve time and filament." msgstr "" +"偵測到卡料,已暫停列印來節省時間與線材" msgid "File" msgstr "檔案" @@ -3099,17 +3034,15 @@ msgstr "檔案" msgid "Calibration" msgstr "校準" -#, fuzzy msgid "" "Failed to download the plug-in. Please check your firewall settings and vpn " "software, check and retry." -msgstr "套件下載失敗。請檢查您的防火牆設定和 VPN 軟體,檢查後重試。" +msgstr "插件下載失敗。請檢查你的防火牆設定和 VPN 軟體,檢查後重試。" -#, fuzzy msgid "" "Failed to install the plug-in. Please check whether it is blocked or deleted " "by anti-virus software." -msgstr "安裝套件失敗。請檢查是否被防毒軟體阻擋或刪除。" +msgstr "插件安裝失敗。請檢查是否被防毒軟體阻擋或刪除。" msgid "click here to see more info" msgstr "點擊這裡查看更多資訊" @@ -3117,11 +3050,10 @@ msgstr "點擊這裡查看更多資訊" msgid "Please home all axes (click " msgstr "請先執行回原點(點擊" -#, fuzzy msgid "" -") to locate the toolhead's position. This prevents device moving beyond the " +")to locate the toolhead's position. This prevents device moving beyond the " "printable boundary and causing equipment wear." -msgstr ")操作以定位目前工具頭位置,以防止軸移動時超出邊界造成設備損壞" +msgstr ")來定位目前工具頭位置,以防止移動時超出邊界造成設備損壞" msgid "Go Home" msgstr "回原點" @@ -3165,7 +3097,7 @@ msgid "Running post-processing scripts" msgstr "執行後處理腳本" msgid "Successfully executed post-processing script" -msgstr "" +msgstr "完成執行後處理腳本" msgid "Unknown error occurred during exporting G-code." msgstr "匯出 G-code 期間發生未知錯誤。" @@ -3193,7 +3125,7 @@ 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 "" -"複製到選取之目標檔案夾的 G-code 重命名失敗。當前路徑為%1%.tmp。請再試看看匯" +"複製到選取之目標檔案夾的 G-code 重命名失敗。目前路徑為%1%.tmp。請再試看看匯" "出。" #, boost-format @@ -3234,36 +3166,36 @@ msgstr "將臨時 G-Code 複製到輸出 G-Code 失敗" #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" -msgstr "計劃上傳到 `%1%`。請參閱視窗-> 列印設備上傳隊列" +msgstr "計劃上傳到 `%1%`。請參閱視窗-> 列印設備上傳佇列" msgid "Device" msgstr "設備" msgid "Task Sending" -msgstr "" +msgstr "傳送中" msgid "Task Sent" -msgstr "" +msgstr "傳送完成" msgid "Edit multiple printers" -msgstr "" +msgstr "編輯多個列印設備" msgid "Select connected printers (0/6)" -msgstr "" +msgstr "選擇已連線機台 (0/6)" #, c-format, boost-format msgid "Select Connected Printers (%d/6)" -msgstr "" +msgstr "選擇已連線機台 (%d/6)" #, c-format, boost-format msgid "The maximum number of printers that can be selected is %d" -msgstr "" +msgstr "最多可選擇 %d 台" msgid "Offline" msgstr "離線" msgid "No task" -msgstr "" +msgstr "無作業" msgid "View" msgstr "視角" @@ -3272,16 +3204,16 @@ msgid "N/A" msgstr "N/A" msgid "Edit Printers" -msgstr "" +msgstr "編輯機台" msgid "Device Name" -msgstr "" +msgstr "機台名稱" msgid "Task Name" -msgstr "" +msgstr "作業名稱" msgid "Device Status" -msgstr "" +msgstr "機台狀態" msgid "Actions" msgstr "" @@ -3289,6 +3221,7 @@ msgstr "" msgid "" "Please select the devices you would like to manage here (up to 6 devices)" msgstr "" +"請選擇要管理的設備(最多6台)" msgid "Add" msgstr "新增" @@ -3300,53 +3233,52 @@ msgid "Printing" msgstr "列印中" msgid "Upgrading" -msgstr "" +msgstr "升級中" msgid "Incompatible" msgstr "不相容的預設" msgid "syncing" -msgstr "" +msgstr "同步中" msgid "Printing Finish" -msgstr "" +msgstr "完成列印" msgid "Printing Failed" -msgstr "" +msgstr "列印失敗" msgid "Printing Pause" -msgstr "" +msgstr "列印暫停" msgid "Prepare" msgstr "準備" -#, fuzzy msgid "Slicing" msgstr "正在切片中" msgid "Pending" -msgstr "" +msgstr "待處理" msgid "Sending" -msgstr "" +msgstr "傳送中" msgid "Sending Finish" -msgstr "" +msgstr "傳送完成" msgid "Sending Cancel" -msgstr "" +msgstr "取消傳送" msgid "Sending Failed" -msgstr "" +msgstr "傳送失敗" msgid "Print Success" -msgstr "" +msgstr "列印成功" msgid "Print Failed" -msgstr "" +msgstr "列印失敗" msgid "Removed" -msgstr "" +msgstr "已移除" msgid "Resume" msgstr "繼續" @@ -3355,53 +3287,52 @@ msgid "Stop" msgstr "停止" msgid "Task Status" -msgstr "" +msgstr "狀態" msgid "Sent Time" -msgstr "" +msgstr "傳送時間" msgid "There are no tasks to be sent!" -msgstr "" +msgstr "無檔案可傳!" msgid "No historical tasks!" -msgstr "" +msgstr "無歷史記錄!" msgid "Loading..." msgstr "正在載入影片……" msgid "No AMS" -msgstr "" +msgstr "無 AMS" msgid "Send to Multi-device" -msgstr "" +msgstr "傳送給多個機台" msgid "Preparing print job" msgstr "正在準備列印作業" -#, fuzzy msgid "Abnormal print file data. Please slice again" msgstr "列印檔案資料異常,請重新切片" msgid "There is no device available to send printing." -msgstr "" +msgstr "沒有可用的機臺可以傳送列印" msgid "The number of printers in use simultaneously cannot be equal to 0." msgstr "" msgid "Use External Spool" -msgstr "" +msgstr "使用外掛線盤" msgid "Use AMS" -msgstr "" +msgstr "使用AMS" msgid "Select Printers" -msgstr "" +msgstr "選擇列印設備" msgid "Ams Status" -msgstr "" +msgstr "AMS狀態" msgid "Printing Options" -msgstr "" +msgstr "列印選項" msgid "Bed Leveling" msgstr "熱床調平" @@ -3413,10 +3344,10 @@ msgid "Flow Dynamic Calibration" msgstr "" msgid "Send Options" -msgstr "" +msgstr "傳送選項" msgid "Send to" -msgstr "" +msgstr "傳送到" msgid "" "printers at the same time.(It depends on how many devices can undergo " @@ -3465,11 +3396,10 @@ msgid "" "rectangle." msgstr "G-code 0,0 坐標相對於矩形框左前角的距離。" -#, fuzzy msgid "" -"Diameter of the print bed. It is assumed that origin (0,0) is located in the " +"Diameter of the print bed. It is assumed that origin (0,0)is located in the " "center." -msgstr "熱床直徑。假定原點(0,0) 位於中心。" +msgstr "熱床直徑。假定原點(0,0)位於中心。" msgid "Rectangular" msgstr "矩形" @@ -3511,11 +3441,9 @@ msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "所選檔案包含多個未連接的區域。不支援這種類型。" -#, fuzzy msgid "Choose a file to import bed texture from (PNG/SVG):" -msgstr "選擇(PNG/SVG) 檔案作為熱床紋理:" +msgstr "選擇(PNG/SVG)檔案作為熱床紋理:" -#, fuzzy msgid "Choose an STL file to import bed model from:" msgstr "選擇 STL 檔案來匯入熱床模型:" @@ -3526,14 +3454,16 @@ msgid "" "The recommended minimum temperature is less than 190 degree or the " "recommended maximum temperature is greater than 300 degree.\n" msgstr "" +"推薦的最小溫度低於 190 度或推薦的最大溫度高於 300 度。\n" msgid "" "The recommended minimum temperature cannot be higher than the recommended " "maximum temperature.\n" msgstr "" +"推薦的最小溫度不能高於推薦的最大溫度。\n" msgid "Please check.\n" -msgstr "" +msgstr "請檢查。\n" msgid "" "Nozzle may be blocked when the temperature is out of recommended range.\n" @@ -3557,16 +3487,15 @@ msgstr "" "最大體積速度設定過小\n" "重設為 0.5" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "" "Current chamber temperature is higher than the material's safe temperature," "it may result in material softening and clogging.The maximum safe " "temperature for the material is %d" msgstr "" -"目前列印設備內部溫高於線材的安全溫度,可能會導致線材軟化和堵塞。線材的最高安" +"目前列印設備內部溫度高於線材的安全溫度,可能會導致線材軟化和堵塞。線材的最高安" "全溫度為:%d" -#, fuzzy msgid "" "Too small layer height.\n" "Reset to 0.2" @@ -3582,13 +3511,12 @@ msgstr "" "熨燙線距過小。\n" "將重設為 0.1。" -#, fuzzy msgid "" "Zero initial layer height is invalid.\n" "\n" "The first layer height will be reset to 0.2." msgstr "" -"首層層高為無效的 0 值。\n" +"0為無效的首層層高值。\n" "將被重設為0.2。" #, fuzzy @@ -3624,6 +3552,7 @@ msgid "" "Alternate extra wall does't work well when ensure vertical shell thickness " "is set to All. " msgstr "" +"當確保垂直外殼厚度設為「全部」時,交錯額外牆壁效果不佳。" msgid "" "Change these settings automatically? \n" @@ -3631,6 +3560,9 @@ msgid "" "alternate extra wall\n" "No - Don't use alternate extra wall" msgstr "" +"是否自動更改這些設定?\n" +"是 - 將確保垂直外殼厚度設為中等並啟用交錯額外牆壁\n" +"否 - 不使用交錯額外牆壁" msgid "" "Prime tower does not work when Adaptive Layer Height or Independent Support " @@ -3639,9 +3571,9 @@ msgid "" "YES - Keep Prime Tower\n" "NO - Keep Adaptive Layer Height and Independent Support Layer Height" msgstr "" -"擦拭塔不支援和自適應層高或支撐獨立層高。同時開啟\n" +"換料塔不支援和自適應層高或支撐獨立層高。同時開啟\n" "如何選擇?\n" -"是 - 選擇開啟擦拭塔\n" +"是 - 選擇開啟換料塔\n" "否 - 選擇保留自適應層高或支撐獨立層高" msgid "" @@ -3650,9 +3582,9 @@ msgid "" "YES - Keep Prime Tower\n" "NO - Keep Adaptive Layer Height" msgstr "" -"擦拭塔不支援和自適應層高同時開啟。\n" +"換料塔不支援和自適應層高同時開啟。\n" "如何選擇?\n" -"是 - 選擇開啟擦拭塔\n" +"是 - 選擇開啟換料塔\n" "否 - 選擇保留自適應層高" msgid "" @@ -3661,28 +3593,28 @@ msgid "" "YES - Keep Prime Tower\n" "NO - Keep Independent Support Layer Height" msgstr "" -"擦拭塔不支援和支撐獨立層高同時開啟。\n" +"換料塔不支援和支撐獨立層高同時開啟。\n" "如何選擇?\n" -"是 - 選擇開啟擦拭塔\n" +"是 - 選擇開啟換料塔\n" "否 - 選擇保留支撐獨立層高" msgid "" "seam_slope_start_height need to be smaller than layer_height.\n" "Reset to 0." msgstr "" +"seam_slope_start_height 必須小於 layer_height。\n" +"重設為 0。" -#, fuzzy msgid "" "Spiral mode only works when wall loops is 1, support is disabled, top shell " "layers is 0, sparse infill density is 0 and timelapse type is traditional." msgstr "" -"花瓶模式只能在外牆層數為 1,關閉支撐,頂層層數為 0,稀疏填充密度為 0,傳統縮" -"時攝影時有效。" +"花瓶模式必須調整以下設定才能使用:外牆層數為 1、關閉支撐、頂層層數為 0、" +"稀疏填充密度為 0、縮時攝影模式為傳統。" msgid " But machines with I3 structure will not generate timelapse videos." msgstr "I3 結構機型將不產生縮時攝影。" -#, fuzzy msgid "" "Change these settings automatically? \n" "Yes - Change these settings and enable spiral mode automatically\n" @@ -3719,7 +3651,6 @@ msgstr "校準擠出補償" msgid "Scanning bed surface" msgstr "掃描熱床" -#, fuzzy msgid "Inspecting first layer" msgstr "檢查首層" @@ -3750,12 +3681,11 @@ msgstr "校準微型雷射雷達" msgid "Calibrating extrusion flow" msgstr "校準擠出流量" -#, fuzzy msgid "Paused due to nozzle temperature malfunction" -msgstr "噴嘴溫度異常暫停" +msgstr "暫停:噴嘴溫度異常" msgid "Paused due to heat bed temperature malfunction" -msgstr "熱床溫度異常暫停" +msgstr "暫停:熱床溫度異常" msgid "Filament unloading" msgstr "退料中" @@ -3772,15 +3702,12 @@ msgstr "電機噪音校準" msgid "Paused due to AMS lost" msgstr "由於 AMS 遺失而暫停" -#, fuzzy msgid "Paused due to low speed of the heat break fan" -msgstr "散熱風扇轉速過低導致暫停" +msgstr "暫停:散熱風扇轉速過低" -#, fuzzy msgid "Paused due to chamber temperature control error" -msgstr "列印設備內部溫度控制錯誤導致暫停" +msgstr "暫停:列印設備內部溫度控制錯誤" -#, fuzzy msgid "Cooling chamber" msgstr "列印設備內部溫度冷卻中" @@ -3797,10 +3724,10 @@ msgid "Cutter error pause" msgstr "" msgid "First layer error pause" -msgstr "" +msgstr "第一層錯誤暫停" msgid "Nozzle clog pause" -msgstr "" +msgstr "噴嘴賭賽暫停" msgid "Unknown" msgstr "未定義" @@ -3826,31 +3753,28 @@ msgstr "驗證失敗。" msgid "Update failed." msgstr "更新失敗。" -#, fuzzy 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." +"TPU)is not allowed to be loaded." msgstr "" -"目前設備內部溫度超過 45℃。為避免擠出機阻塞,不允許導入低溫線材(PLA / PETG / " +"目前設備內部溫度超過 45℃。為避免阻塞,不允許進料低溫線材(PLA / PETG / " "TPU)。" -#, fuzzy msgid "" -"Low temperature filament(PLA/PETG/TPU) is loaded in the extruder.In order to " +"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 " "above 45℃." msgstr "" -"為避免擠出機堵塞,設備內部溫度不允許設定在 45℃ 以上時將低溫線材(PLA / " -"PETG / TPU)導入擠出機中。" +"為避免堵塞,使用低溫線材(PLA / PETG / TPU)時,不充許將設備內部溫度" +"設置於45℃以上" -#, fuzzy 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 "" -"當您設定的設備內部溫度低於 40℃ 時,內部溫度控制將不會啟動。 且目標溫度將自動" +"當你設定的設備內部溫度低於 40℃ 時,內部溫度控制將不會啟動。 且目標溫度將自動" "設定為 0℃。" msgid "Failed to start printing job" @@ -3863,7 +3787,6 @@ msgstr "校準不支援目前選擇的噴嘴直徑" msgid "Current flowrate cali param is invalid" msgstr "目前流量校準參數無效" -#, fuzzy msgid "Selected diameter and machine diameter do not match" msgstr "所選噴嘴直徑與設備不匹配" @@ -3894,46 +3817,46 @@ msgstr "預設" #, boost-format msgid "Edit Custom G-code (%1%)" -msgstr "" +msgstr "編輯自訂 GOCDE(%1%)" msgid "Built-in placeholders (Double click item to add to G-code)" -msgstr "" +msgstr "內建占位符(雙點擊加入GCODE)" msgid "Search gcode placeholders" -msgstr "" +msgstr "收尋GOCDE內的占位符" msgid "Add selected placeholder to G-code" -msgstr "" +msgstr "將占位符加到GCODE" msgid "Select placeholder" -msgstr "" +msgstr "占位符" msgid "[Global] Slicing State" -msgstr "" +msgstr "[全域]切片狀態" msgid "Read Only" -msgstr "" +msgstr "唯讀" msgid "Read Write" -msgstr "" +msgstr "讀寫" msgid "Slicing State" -msgstr "" +msgstr "切片狀態" msgid "Print Statistics" -msgstr "" +msgstr "列印數據" msgid "Objects Info" -msgstr "" +msgstr "物件資訊" msgid "Dimensions" -msgstr "" +msgstr "尺寸" msgid "Temperatures" msgstr "溫度" msgid "Timestamps" -msgstr "" +msgstr "時間戳記" #, boost-format msgid "Specific for %1%" @@ -3949,9 +3872,8 @@ msgid "Filament settings" msgstr "線材設定" msgid "SLA Materials settings" -msgstr "" +msgstr "SLA材料設定" -#, fuzzy msgid "Printer settings" msgstr "列印設備設定" @@ -3971,12 +3893,12 @@ msgstr "參數驗證" #, c-format, boost-format msgid "Value %s is out of range. The valid range is from %d to %d." -msgstr "" +msgstr "數值 %s 超出範圍。有效範圍是從 %d 到 %d。" msgid "Value is out of range." msgstr "值超出範圍。" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "" "Is it %s%% or %s %s?\n" "YES for %s%%, \n" @@ -3990,15 +3912,15 @@ msgstr "" msgid "" "Invalid input format. Expected vector of dimensions in the following format: " "\"%1%\"" -msgstr "輸入格式無效。預期向量應使用以下格式:“%1%”" +msgstr "輸入格式無效。預期向量應使用以下格式:\"%1%\"" msgid "Input value is out of range" msgstr "輸入值超出範圍" msgid "Some extension in the input is invalid" -msgstr "" +msgstr "輸入的副檔名無效。" -#, fuzzy, boost-format +#, boost-format msgid "Invalid format. Expected vector format: \"%1%\"" msgstr "無效格式,應該是 \"%1%\" 這種格式" @@ -4027,35 +3949,27 @@ msgstr "層時間" msgid "Layer Time (log)" msgstr "層時間(對數)" -#, fuzzy msgid "Height: " msgstr "層高:" -#, fuzzy msgid "Width: " msgstr "線寬:" -#, fuzzy msgid "Speed: " msgstr "速度:" -#, fuzzy msgid "Flow: " msgstr "擠出流量:" -#, fuzzy msgid "Layer Time: " msgstr "層時間:" -#, fuzzy msgid "Fan: " msgstr "風扇速度:" -#, fuzzy msgid "Temperature: " msgstr "溫度:" -#, fuzzy msgid "Loading G-codes" msgstr "載入 G-code 中" @@ -4065,9 +3979,8 @@ msgstr "正在產生幾何頂點數據" msgid "Generating geometry index data" msgstr "正在產生幾何索引數據" -#, fuzzy msgid "Statistics of All Plates" -msgstr "所有列印板切片資訊" +msgstr "所有列印板數據" msgid "Display" msgstr "顯示" @@ -4077,7 +3990,7 @@ msgid "Flushed" msgstr "廢料" msgid "Tower" -msgstr "" +msgstr "塔" msgid "Total" msgstr "總計" @@ -4112,15 +4025,12 @@ msgstr "百分比" msgid "Used filament" msgstr "使用的線材" -#, fuzzy msgid "Layer Height (mm)" msgstr "層高(mm)" -#, fuzzy msgid "Line Width (mm)" -msgstr "線寬{mm)" +msgstr "線寬 (mm)" -#, fuzzy msgid "Speed (mm/s)" msgstr "速度(mm/s)" @@ -4130,9 +4040,8 @@ msgstr "風扇速度(%)" msgid "Temperature (°C)" msgstr "溫度(℃)" -#, fuzzy msgid "Volumetric flow rate (mm³/s)" -msgstr "體積流量速度(mm³/s)" +msgstr "體積流量(mm³/s)" msgid "Travel" msgstr "空駛" @@ -4173,7 +4082,6 @@ msgstr "顏色更換" msgid "Print" msgstr "列印" -#, fuzzy msgid "Printer" msgstr "列印設備" @@ -4190,10 +4098,10 @@ msgid "Normal mode" msgstr "普通模式" msgid "Total Filament" -msgstr "" +msgstr "總線材量" msgid "Model Filament" -msgstr "" +msgstr "模型線材量" msgid "Prepare time" msgstr "準備時間" @@ -4290,12 +4198,11 @@ msgid "Spacing" msgstr "間距" msgid "0 means auto spacing." -msgstr "" +msgstr "0 表示自動間距。" msgid "Auto rotate for arrangement" msgstr "自動旋轉以最佳化自動擺放效果" -#, fuzzy msgid "Allow multiple materials on same plate" msgstr "允許同一列印板中包含多種材料" @@ -4305,7 +4212,6 @@ msgstr "避開擠出校準區域" msgid "Align to Y axis" msgstr "與 Y 軸對齊" -#, fuzzy msgid "Add plate" msgstr "新增列印板" @@ -4328,7 +4234,6 @@ msgstr "拆分為零件" msgid "Assembly View" msgstr "組裝視角" -#, fuzzy msgid "Select Plate" msgstr "選擇列印板" @@ -4362,7 +4267,7 @@ msgstr "體積:" msgid "Size:" msgstr "尺寸:" -#, fuzzy, boost-format +#, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4370,7 +4275,6 @@ msgstr "" "發現 gcode 路徑在 %d 層,高為 %.2lf mm處的衝突。請將有衝突的物件分離得更遠" "(%s <-> %s)。" -#, fuzzy msgid "An object is layed over the boundary of plate." msgstr "偵測到有物件放在列印板的邊界上。" @@ -4448,10 +4352,10 @@ msgid "Enable" msgstr "開啟" msgid "Hostname or IP" -msgstr "" +msgstr "主機名稱或 IP" msgid "Custom camera source" -msgstr "" +msgstr "自訂相機來源" msgid "Show \"Live Video\" guide page." msgstr "顯示\"直播影片\"引導" @@ -4462,15 +4366,12 @@ msgstr "720p" msgid "1080p" msgstr "1080p" -#, fuzzy msgid "ConnectPrinter(LAN)" msgstr "連接列印設備(區域網路)" -#, fuzzy msgid "Please input the printer access code:" msgstr "請輸入列印設備訪問碼:" -#, fuzzy msgid "" "You can find it in \"Settings > Network > Connection code\"\n" "on the printer, as shown in the figure:" @@ -4500,7 +4401,7 @@ msgid "Preview" msgstr "預覽" msgid "Multi-device" -msgstr "" +msgstr "多臺設備" msgid "Project" msgstr "專案項目" @@ -4514,34 +4415,27 @@ msgstr "否" msgid "will be closed before creating a new model. Do you want to continue?" msgstr "將會被關閉以建立新模型,是否繼續?" -#, fuzzy msgid "Slice plate" msgstr "切片單一列印板" -#, fuzzy msgid "Print plate" msgstr "列印單一列印板" -#, fuzzy msgid "Slice all" msgstr "切片所有列印板" msgid "Export G-code file" msgstr "匯出 G-code 檔案" -#, fuzzy msgid "Export plate sliced file" msgstr "匯出單一列印板切片檔案" -#, fuzzy msgid "Export all sliced file" msgstr "匯出所有列印板切片檔案" -#, fuzzy msgid "Print all" msgstr "列印所有列印板" -#, fuzzy msgid "Send all" msgstr "傳送所有列印板" @@ -4655,16 +4549,14 @@ msgid "Load a model" msgstr "載入模型" msgid "Import Zip Archive" -msgstr "" +msgstr "匯入壓縮檔" msgid "Load models contained within a zip archive" -msgstr "" +msgstr "載入壓縮檔中的模型" -#, fuzzy msgid "Import Configs" msgstr "匯入設定檔" -#, fuzzy msgid "Load configs" msgstr "載入設定檔" @@ -4672,10 +4564,10 @@ msgid "Import" msgstr "匯入" msgid "Export all objects as one STL" -msgstr "" +msgstr "將所有物件匯出為一個 STL 檔案" msgid "Export all objects as STLs" -msgstr "" +msgstr "將所有物件匯出為 STL 檔案" msgid "Export Generic 3MF" msgstr "匯出通用 3MF" @@ -4683,23 +4575,20 @@ msgstr "匯出通用 3MF" msgid "Export 3mf file without using some 3mf-extensions" msgstr "匯出不含 3mf 擴展的 3mf 檔案" -#, fuzzy msgid "Export current sliced file" msgstr "匯出目前已切片的檔案" -#, fuzzy msgid "Export all plate sliced file" msgstr "匯出所有列印板已切片的檔案" msgid "Export G-code" msgstr "匯出 G-code" -#, fuzzy msgid "Export current plate as G-code" msgstr "匯出目前列印板的 G-code" msgid "Export Preset Bundle" -msgstr "" +msgstr "匯出設定檔組" #, fuzzy msgid "Export current configuration to files" @@ -4742,7 +4631,6 @@ msgstr "刪除目前所選項目" msgid "Delete all" msgstr "全部刪除" -#, fuzzy msgid "Deletes all objects" msgstr "刪除所有物件" @@ -4753,10 +4641,10 @@ msgid "Clone copies of selections" msgstr "複製多份所選項目" msgid "Duplicate Current Plate" -msgstr "" +msgstr "複製列印板" msgid "Duplicate the current plate" -msgstr "" +msgstr "複製目前列印板" msgid "Select all" msgstr "選取所有" @@ -4777,10 +4665,10 @@ msgid "Use Orthogonal View" msgstr "使用正交視角" msgid "Show &G-code Window" -msgstr "" +msgstr "顯示 G-code" msgid "Show g-code window in Preview scene" -msgstr "" +msgstr "在預覽分頁中顯示 G-code 視窗" msgid "Show 3D Navigator" msgstr "" @@ -4789,10 +4677,10 @@ msgid "Show 3D navigator in Prepare and Preview scene" msgstr "" msgid "Reset Window Layout" -msgstr "" +msgstr "重設視窗配置" msgid "Reset to default window layout" -msgstr "" +msgstr "恢復預設視窗配置" msgid "Show &Labels" msgstr "顯示名稱" @@ -4807,10 +4695,10 @@ msgid "Show object overhang highlight in 3D scene" msgstr "在 3D 場景中凸顯懸空" msgid "Show Selected Outline (Experimental)" -msgstr "" +msgstr "顯示選取輪廓(實驗性)" msgid "Show outline around selected object in 3D scene" -msgstr "" +msgstr "在 3D 場景中顯示選定物件的輪廓。" msgid "Preferences" msgstr "偏好設定" @@ -4834,16 +4722,16 @@ msgid "Flow rate test - Pass 2" msgstr "流量測試 - 通過 2" msgid "YOLO (Recommended)" -msgstr "" +msgstr "YOLO (建議)" msgid "Orca YOLO flowrate calibration, 0.01 step" -msgstr "" +msgstr "Orca YOLO 流量校正,0.01 步" msgid "YOLO (perfectionist version)" -msgstr "" +msgstr "YOLO (完美主義者模式)" msgid "Orca YOLO flowrate calibration, 0.005 step" -msgstr "" +msgstr "Orca YOLO 流量校正,0.005 步" msgid "Flow rate" msgstr "流量" @@ -4885,7 +4773,6 @@ msgstr "打開 G-code 檔案" msgid "Re&load from Disk" msgstr "從磁碟重新載入" -#, fuzzy msgid "Reload the plater from disk" msgstr "從磁碟重新載入" @@ -4917,24 +4804,22 @@ msgstr "視角" msgid "&Help" msgstr "幫助" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "A file exists with the same name: %s, do you want to override it." msgstr "有一個同名稱的檔案 %s。要覆蓋它嗎?" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "A config exists with the same name: %s, do you want to override it." msgstr "有一個同名稱的設定檔 %s。要覆蓋它嗎?" msgid "Overwrite file" msgstr "覆蓋檔案" -#, fuzzy msgid "Yes to All" msgstr "全部覆蓋" -#, fuzzy msgid "No to All" -msgstr "放棄" +msgstr "全部放棄" msgid "Choose a directory" msgstr "選擇目錄" @@ -4961,6 +4846,8 @@ msgid "" "Hint: Make sure you have added the corresponding printer before importing " "the configs." msgstr "" +"\n" +"提示:在匯入設定之前,請確保已添加對應的列印設備。" msgid "Import result" msgstr "匯入結果" @@ -4974,7 +4861,6 @@ msgstr "此項目不可用。" msgid "Filament Settings" msgstr "線材設定" -#, fuzzy msgid "" "Do you want to synchronize your personal data from Bambu Cloud? \n" "It contains the following information:\n" @@ -4982,11 +4868,11 @@ msgid "" "2. The Filament presets\n" "3. The Printer presets" msgstr "" -"想從 Bambu 雲端同步你的個人數據嗎?\n" -"包含如下資訊:\n" -"1. 列印參數預設檔\n" -"2. 線材預設檔\n" -"3. 列印設備預設檔" +"從 Bambu 雲端同步你的個人數據嗎?\n" +"包含以下資訊:\n" +"1. 列印參數設定\n" +"2. 線材設定\n" +"3. 列印設備設定" msgid "Synchronization" msgstr "同步" @@ -4995,45 +4881,48 @@ msgid "The device cannot handle more conversations. Please retry later." msgstr "" msgid "Player is malfunctioning. Please reinstall the system player." -msgstr "" +msgstr "播放器故障。請重新安裝系統播放器。" msgid "The player is not loaded, please click \"play\" button to retry." -msgstr "" +msgstr "播放器未載入,請點擊「播放」按鈕重試。" msgid "Please confirm if the printer is connected." -msgstr "" +msgstr "請確認列印設備是否已連接。" msgid "" "The printer is currently busy downloading. Please try again after it " "finishes." msgstr "" +"列印機目前正忙於下載。請待下載完成後再試一次。" msgid "Printer camera is malfunctioning." -msgstr "" +msgstr "列印設備攝影機故障。" msgid "Problem occurred. Please update the printer firmware and try again." -msgstr "" +msgstr "發生問題。請更新列印設備韌體後再試一次。" msgid "" "LAN Only Liveview is off. Please turn on the liveview on printer screen." msgstr "" +"僅 LAN 模式的LiveView已關閉。請在列印機螢幕上開啟LiveView。" msgid "Please enter the IP of printer to connect." -msgstr "" +msgstr "請輸入列印設備的 IP 以進行連接。" msgid "Initializing..." msgstr "正在初始化……" msgid "Connection Failed. Please check the network and try again" -msgstr "" +msgstr "連線失敗。請檢查網路並重試。" msgid "" "Please check the network and try again, You can restart or update the " "printer if the issue persists." msgstr "" +"請檢查網路並重試。如果問題持續,你可以重新啟動或更新列印設備。" msgid "The printer has been logged out and cannot connect." -msgstr "" +msgstr "列印設備已登出,無法連接。" msgid "Stopped." msgstr "已經停止。" @@ -5044,7 +4933,7 @@ msgstr "區域網路連接失敗(無法啟動直播)" msgid "" "Virtual Camera Tools is required for this task!\n" "Do you want to install them?" -msgstr "該功能需要“虛擬攝影機工具包”,是否下載並安裝該工具包?" +msgstr "該功能需要\"虛擬攝影機工具包\",是否下載並安裝該工具包?" #, fuzzy msgid "Downloading Virtual Camera Tools" @@ -5102,14 +4991,12 @@ msgstr "切換到影片檔案清單" msgid "Switch to 3mf model files." msgstr "切換到 3MF 模型檔案。" -#, fuzzy msgid "Delete selected files from printer." msgstr "從列印設備中刪除選中的檔案" msgid "Download" msgstr "下載" -#, fuzzy msgid "Download selected files from printer." msgstr "從列印設備中下載選中的檔案" @@ -5123,7 +5010,7 @@ msgid "Refresh" msgstr "刷新" msgid "Reload file list from printer." -msgstr "" +msgstr "從列印機重新載入檔案清單。" #, fuzzy msgid "No printers." @@ -5137,10 +5024,10 @@ msgid "Loading file list..." msgstr "載入檔案清單..." msgid "No files" -msgstr "" +msgstr "無檔案" msgid "Load failed" -msgstr "" +msgstr "載入失敗" msgid "Initialize failed (Device connection not ready)!" msgstr "初始化失敗(未連接列印設備)" @@ -5149,15 +5036,16 @@ msgid "" "Browsing file in SD card is not supported in current firmware. Please update " "the printer firmware." msgstr "" +"目前韌體不支援瀏覽 SD 卡中的檔案。請更新列印機韌體。" msgid "Initialize failed (Storage unavailable, insert SD card.)!" -msgstr "" +msgstr "初始化失敗(存儲不可用,請插入 SD 卡)。" msgid "LAN Connection Failed (Failed to view sdcard)" -msgstr "" +msgstr "LAN 連線失敗(無法查看 SD 卡)。" msgid "Browsing file in SD card is not supported in LAN Only Mode." -msgstr "" +msgstr "在僅 LAN 模式下不支援瀏覽 SD 卡中的檔案。" #, c-format, boost-format msgid "Initialize failed (%s)!" @@ -5172,7 +5060,7 @@ msgstr[0] "將從列印設備中刪除 %u 個檔案。確定要繼續嗎?" msgid "Delete files" msgstr "刪除檔案" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "Do you want to delete the file '%s' from printer?" msgstr "確定要從列印設備中刪除檔案 '%s' 嗎?" @@ -5183,10 +5071,10 @@ msgid "Fetching model information..." msgstr "正在獲取模型資訊..." msgid "Failed to fetch model information from printer." -msgstr "" +msgstr "無法從列印設備獲取模型資訊。" msgid "Failed to parse model information." -msgstr "" +msgstr "解析模型資訊失敗。" msgid "" "The .gcode.3mf file contains no G-code data.Please slice it with Orca Slicer " @@ -5225,24 +5113,23 @@ msgid "" "Reconnecting the printer, the operation cannot be completed immediately, " "please try again later." msgstr "" +"重新連接列印機,操作無法立即完成,請稍後再試。" msgid "File does not exist." -msgstr "" +msgstr "檔案不存在。" msgid "File checksum error. Please retry." -msgstr "" +msgstr "檔案核對和錯誤。請重試。" -#, fuzzy msgid "Not supported on the current printer version." msgstr "目前列印設備的版本不支援。" -#, fuzzy msgid "Storage unavailable, insert SD card." -msgstr "儲存不可用,請插入 SD 記憶卡。" +msgstr "無儲存空間,請插入 SD 記憶卡。" #, c-format, boost-format msgid "Error code: %d" -msgstr "" +msgstr "錯誤代碼:%d" msgid "Speed:" msgstr "速度:" @@ -5302,13 +5189,13 @@ msgid "" msgstr "已經完成了 MakeWorld 模型的列印,但評論資料同步失敗。" msgid "How do you like this printing file?" -msgstr "您覺得這個列印檔案怎麼樣?" +msgstr "你覺得這個列印檔案怎麼樣?" #, fuzzy msgid "" "(The model has already been rated. Your rating will overwrite the previous " "rating.)" -msgstr "(此模型已被評價。您的評價將覆蓋先前的評價。)" +msgstr "(此模型已被評價。你的評價將覆蓋先前的評價。)" msgid "Rate" msgstr "速率" @@ -5323,7 +5210,7 @@ msgid "Camera Setting" msgstr "攝影機設定" msgid "Switch Camera View" -msgstr "" +msgstr "切換相機視角" msgid "Control" msgstr "控制" @@ -5352,7 +5239,6 @@ msgstr "熱床" msgid "Debug Info" msgstr "除錯資訊" -#, fuzzy msgid "No SD Card" msgstr "無 SD 記憶卡" @@ -5371,15 +5257,15 @@ msgstr "下載中..." msgid "Cloud Slicing..." msgstr "雲端切片中..." -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "In Cloud Slicing Queue, there are %s tasks ahead." -msgstr "前面還有 %s 個任務在雲端切片隊列中" +msgstr "雲端切片佇列中,前面還有 %s 個檔案" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "Layer: %s" msgstr "%s 層" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "Layer: %d/%d" msgstr "%d/%d 層" @@ -5387,6 +5273,7 @@ msgid "" "Please heat the nozzle to above 170 degree before loading or unloading " "filament." msgstr "" +"請在上料或退料之前將噴嘴加熱至 170 度以上。" msgid "Still unload" msgstr "繼續退料" @@ -5405,25 +5292,20 @@ msgstr "無法讀取線材資訊:線材已經載入到工具頭,請退出線 msgid "This only takes effect during printing" msgstr "僅在列印過程中生效" -#, fuzzy msgid "Silent" msgstr "靜音模式(50%)" -#, fuzzy msgid "Standard" msgstr "標準模式(100%)" -#, fuzzy msgid "Sport" msgstr "運動模式(125%)" -#, fuzzy msgid "Ludicrous" msgstr "狂暴模式(150%)" -#, fuzzy msgid "Can't start this without SD card." -msgstr "沒有 SD 記憶卡無法開始任務" +msgstr "沒有 SD 記憶卡無法開始" msgid "Rate the Print Profile" msgstr "評價列印設定檔" @@ -5494,11 +5376,10 @@ msgid "" "\n" " error code: " msgstr "" -"由於某些原因,您的評論結果無法上傳。如下:\n" +"由於某些原因,你的評論結果無法上傳。如下:\n" "\n" "錯誤代碼: " -#, fuzzy msgid "error message: " msgstr "錯誤訊息:" @@ -5509,15 +5390,15 @@ msgid "" msgstr "" "\n" "\n" -"您想重新導向到評價網頁嗎?" +"你想重新導向到評價網頁嗎?" msgid "" "Some of your images failed to upload. Would you like to redirect to the " "webpage for rating?" -msgstr "您的部分圖片上傳失敗。 要重定導向評價網頁嗎?" +msgstr "你的部分圖片上傳失敗。 要重定導向評價網頁嗎?" msgid "You can select up to 16 images." -msgstr "您最多可以選擇 16 張圖片。" +msgstr "你最多可以選擇 16 張圖片。" msgid "" "At least one successful print record of this print profile is required \n" @@ -5569,27 +5450,28 @@ msgid "" "The 3mf file version is in Beta and it is newer than the current OrcaSlicer " "version." msgstr "" +"該 3MF 檔案版本為測試版,並且較目前的 OrcaSlicer 版本更新。" msgid "If you would like to try Orca Slicer Beta, you may click to" -msgstr "" +msgstr "如果你想嘗試 Orca Slicer 測試版,可以點擊以下載。" msgid "Download Beta Version" -msgstr "" +msgstr "下載測試版" msgid "The 3mf file version is newer than the current Orca Slicer version." -msgstr "" +msgstr "該 3MF 檔案版本較目前的 Orca Slicer 版本更新。" msgid "Update your Orca Slicer could enable all functionality in the 3mf file." -msgstr "" +msgstr "更新你的 Orca Slicer 以啟用 3MF 檔案中的所有功能。" msgid "Current Version: " -msgstr "" +msgstr "目前版本" msgid "Latest Version: " -msgstr "" +msgstr "最新版本" msgid "Not for now" -msgstr "" +msgstr "現在不要" #, fuzzy msgid "3D Mouse disconnected." @@ -5611,15 +5493,14 @@ msgstr "整合失敗。" msgid "Undo integration was successful." msgstr "整合取消成功。" -#, fuzzy msgid "New network plug-in available." -msgstr "新的網路套件可用。" +msgstr "網路插件有可用的更新。" msgid "Details" msgstr "詳細" msgid "New printer config available." -msgstr "" +msgstr "有新的列印機設定可用。" msgid "Wiki" msgstr "Wiki" @@ -5678,7 +5559,6 @@ msgstr "錯誤:" msgid "Warning:" msgstr "警告:" -#, fuzzy msgid "Export successfully." msgstr "匯出成功。" @@ -5706,7 +5586,6 @@ msgstr "Gcode 路徑有重疊" msgid "Support painting" msgstr "支撐繪製" -#, fuzzy msgid "Color painting" msgstr "上色" @@ -5725,7 +5604,7 @@ msgid "" msgstr "應用程式無法正常運行,因為 OpenGL 的版本低於 2.0。\n" msgid "Please upgrade your graphics card driver." -msgstr "請升級您的顯示卡驅動。" +msgstr "請升級你的顯示卡驅動。" msgid "Unsupported OpenGL version" msgstr "不支援的 OpenGL 版本" @@ -5772,29 +5651,29 @@ msgid "Allow Prompt Sound" msgstr "允許提示音效" msgid "Filament Tangle Detect" -msgstr "" +msgstr "線材打結偵測" msgid "Nozzle Clumping Detection" -msgstr "" +msgstr "噴嘴堵塞偵測" msgid "Check if the nozzle is clumping by filament or other foreign objects." -msgstr "" +msgstr "檢查噴嘴是否因線材或其他異物而堵塞。" msgid "Nozzle Type" -msgstr "" +msgstr "噴嘴類型" msgid "Stainless Steel" -msgstr "" +msgstr "不鏽鋼" msgid "Hardened Steel" -msgstr "" +msgstr "硬化鋼" #, c-format, boost-format msgid "%.1f" msgstr "" msgid "Global" -msgstr "全局" +msgstr "全域" msgid "Objects" msgstr "物件" @@ -5802,47 +5681,41 @@ msgstr "物件" msgid "Advance" msgstr "高級" -#, fuzzy msgid "Compare presets" -msgstr "比較預設檔" +msgstr "比較設定" msgid "View all object's settings" msgstr "查看所有物件的設定" msgid "Material settings" -msgstr "" +msgstr "材料設定" -#, fuzzy msgid "Remove current plate (if not last one)" msgstr "刪除目前列印板(如果不是最後一個)" -#, fuzzy msgid "Auto orient objects on current plate" -msgstr "自動選轉列印板上物件方向" +msgstr "自動轉向列印板上物件" -#, fuzzy msgid "Arrange objects on current plate" msgstr "自動擺放列印板上物件" -#, fuzzy msgid "Unlock current plate" msgstr "解鎖列印板" -#, fuzzy msgid "Lock current plate" msgstr "鎖定列印板" msgid "Edit current plate name" -msgstr "" +msgstr "編輯列印板名稱" msgid "Move plate to the front" -msgstr "" +msgstr "更改列印板順序至前" #, fuzzy msgid "Customize current plate" msgstr "自訂列印板參數" -#, fuzzy, boost-format +#, boost-format msgid " plate %1%:" msgstr "列印板 %1%:" @@ -5852,15 +5725,12 @@ msgstr "無效名稱,不允許使用以下字元:" msgid "Sliced Info" msgstr "切片資訊" -#, fuzzy msgid "Used Filament (m)" msgstr "線材消耗長度(m)" -#, fuzzy msgid "Used Filament (mm³)" msgstr "線材消耗體積(mm³)" -#, fuzzy msgid "Used Filament (g)" msgstr "線材消耗重量(克)" @@ -5880,7 +5750,6 @@ msgstr "點擊編輯預設檔設定" msgid "Connection" msgstr "連接" -#, fuzzy msgid "Bed type" msgstr "列印板類型" @@ -5896,30 +5765,27 @@ msgstr "刪除最後一個線材" msgid "Synchronize filament list from AMS" msgstr "從 AMS 同步線材清單" -#, fuzzy msgid "Set filaments to use" msgstr "設定可選擇的線材" msgid "Search plate, object and part." -msgstr "" +msgstr "搜尋列印板、物件和零件。" msgid "Pellets" -msgstr "" +msgstr "顆粒" -#, fuzzy msgid "" "No AMS filaments. Please select a printer in 'Device' page to load AMS info." -msgstr "沒有發現 AMS 線材。請在“設備”頁面選擇列印設備,將載入 AMS 資訊" +msgstr "沒有發現 AMS 線材。請在\"設備\"頁面選擇列印設備,載入 AMS 資訊" msgid "Sync filaments with AMS" msgstr "同步到 AMS 的線材清單" -#, fuzzy msgid "" "Sync filaments with AMS will drop all current selected filament presets and " "colors. Do you want to continue?" msgstr "" -"同步到 AMS 的線材清單將刪除所有目前設定的線材預設檔、顏色。確定要繼續嗎?" +"同步 AMS 的線材資訊將會刪除所有目前設定的線材設定與顏色。確定要繼續嗎?" msgid "" "Already did a synchronization, do you want to sync only changes or resync " @@ -5935,32 +5801,30 @@ msgstr "重新同步所有" msgid "There are no compatible filaments, and sync is not performed." msgstr "沒有任何相容的線材,同步操作未執行。" -#, fuzzy msgid "" "There are some unknown filaments mapped to generic preset. Please update " "Orca Slicer or restart Orca Slicer to check if there is an update to system " "presets." msgstr "" -"有一些未知型號的線材,映射到通用預設檔。請更新或者重啟 Orca Slicer,以檢查系" -"統預設檔有沒有更新。" +"有一些未知型號的線材套用於通用預設上。請更新或者重啟 Orca Slicer,以檢查系" +"統預設檔有無更新。" -#, fuzzy, boost-format +#, boost-format msgid "Do you want to save changes to \"%1%\"?" -msgstr "是否儲存修改到 \"%1%\"?" +msgstr "是否儲存變更到 \"%1%\"?" #, fuzzy, c-format, boost-format msgid "" -"Successfully unmounted. The device %s(%s) can now be safely removed from the " +"Successfully unmounted. The device %s(%s)can now be safely removed from the " "computer." -msgstr "卸載成功。設備 %s(%s) 現在可能安全地從電腦移除。" +msgstr "卸載成功。設備 %s(%s)現在可能安全地從電腦移除。" -#, fuzzy, c-format, boost-format -msgid "Ejecting of device %s(%s) has failed." -msgstr "退出設備 %s(%s) 失敗。" +#, c-format, boost-format +msgid "Ejecting of device %s(%s)has failed." +msgstr "退出設備 %s(%s)失敗。" -#, fuzzy msgid "Previous unsaved project detected, do you want to restore it?" -msgstr "偵測到有未儲存的專案項目,是否恢復此專案項目?" +msgstr "偵測到有未儲存的專案,是否恢復此專案?" msgid "Restore" msgstr "恢復" @@ -5973,13 +5837,12 @@ msgstr "" "目前熱床溫度比較高。在封閉的列印設備中列印該線材時,噴嘴可能會堵塞。請打開前" "門和/或拆下上部玻璃。" -#, fuzzy msgid "" "The nozzle hardness required by the filament is higher than the default " "nozzle hardness of the printer. Please replace the hardened nozzle or " "filament, otherwise, the nozzle will be attrited or damaged." msgstr "" -"線材所要求的噴嘴硬度高於列印設備預設的噴嘴硬度。請更換硬化的噴嘴或線材,否則" +"線材所要求的噴嘴硬度高於列印設備預設的噴嘴硬度。請更換硬化噴嘴或線材,否則" "噴嘴可能被磨損或損壞。" msgid "" @@ -6003,16 +5866,16 @@ msgstr "該 3mf 檔案不是來自 Orca Slicer,將只載入幾何數據。" msgid "Load 3mf" msgstr "載入 3mf" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "" "The 3mf's version %s is newer than %s's version %s, Found following keys " "unrecognized:" -msgstr "該 3mf 的版本 %s 比 %s 的版本 %s 新,發現以下參數值無法識別:" +msgstr "該 3mf 的版本 %s 比 %s 的版本 %s 新,以下參數值無法識別:" msgid "You'd better upgrade your software.\n" -msgstr "建議升級您的軟體版本。\n" +msgstr "建議升級你的軟體版本。\n" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "" "The 3mf's version %s is newer than %s's version %s, Suggest to upgrade your " "software." @@ -6026,28 +5889,29 @@ msgid "Please correct them in the param tabs" msgstr "請在參數設定頁更正它們" msgid "The 3mf has following modified G-codes in filament or printer presets:" -msgstr "" +msgstr "該 3MF 檔案在耗材或列印機預設中具有以下修改過的 GCODE:" msgid "" "Please confirm that these modified G-codes are safe to prevent any damage to " "the machine!" msgstr "" +"請確認這些修改過的 GCODE 是安全的,以防止對機器造成任何損壞!" msgid "Modified G-codes" -msgstr "" +msgstr "已修改的 GCODE" msgid "The 3mf has following customized filament or printer presets:" -msgstr "" +msgstr "該 3MF 檔案具有以下自訂的耗材或列印機預設:" msgid "" "Please confirm that the G-codes within these presets are safe to prevent any " "damage to the machine!" msgstr "" +"請確認這些預設中的 GCODE 是安全的,以防止對機器造成任何損壞!" msgid "Customized Preset" msgstr "" -#, fuzzy msgid "Name of components inside step file is not UTF8 format!" msgstr "step 檔案中的零件名稱包含非 UTF8 格式的字元!" @@ -6057,24 +5921,23 @@ msgstr "此名稱可能顯示亂碼字元!" msgid "Remember my choice." msgstr "記住我的選擇。" -#, fuzzy, boost-format +#, boost-format msgid "Failed loading file \"%1%\". An invalid configuration was found." msgstr "載入檔案 \"%1%\" 失敗。發現無效設定值。" -#, fuzzy msgid "Objects with zero volume removed" msgstr "體積為零的物件已被移除" msgid "The volume of the object is zero" msgstr "物件的體積為零" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "" "The object from file %s is too small, and maybe in meters or inches.\n" " Do you want to scale to millimeters?" msgstr "" "文件 %s 中的物件太小,可能以公尺(M)或英吋(Inches)為單位。\n" -"是否要轉換成公厘(mm)?" +"是否要轉換成毫米(mm)?" msgid "Object too small" msgstr "物件尺寸過小" @@ -6124,9 +5987,11 @@ msgid "" "The file %s already exists\n" "Do you want to replace it?" msgstr "" +"檔案 %s 已存在" +"您確定要替換它嗎?" msgid "Confirm Save As" -msgstr "" +msgstr "確認另存為" msgid "Delete object which is a part of cut object" msgstr "刪除切割物件的一部分" @@ -6136,7 +6001,7 @@ msgid "" "This action will break a cut correspondence.\n" "After that model consistency can't be guaranteed." msgstr "" -"您正嘗試刪除切割物件的一部分,這將破壞切割對應關係,刪除之後,將無法再保證模" +"你正嘗試刪除切割物件的一部分,這將破壞切割對應關係,刪除之後,將無法再保證模" "型的一致性。" msgid "The selected object couldn't be split." @@ -6190,17 +6055,16 @@ msgstr "無效數據" msgid "Slicing Canceled" msgstr "切片已取消" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "Slicing Plate %d" msgstr "正在切片列印板 %d" msgid "Please resolve the slicing errors and publish again." msgstr "請解決切片錯誤後再重新發布。" -#, fuzzy msgid "" "Network Plug-in is not detected. Network related features are unavailable." -msgstr "未偵測到網路套件。網路相關功能不可用。" +msgstr "未偵測到網路插件。網路相關功能不可用。" msgid "" "Preview only mode:\n" @@ -6211,11 +6075,10 @@ msgstr "" #, fuzzy msgid "You can keep the modified presets to the new project or discard them" -msgstr "您可以將修改後的預設檔保留到新專案項目中或者忽略這些修改" +msgstr "你可以將修改後的預設檔保留到新專案項目中或者忽略這些修改" -#, fuzzy msgid "Creating a new project" -msgstr "建立新專案項目" +msgstr "建立新專案" msgid "Load project" msgstr "載入專案項目" @@ -6237,17 +6100,17 @@ msgid "prepare 3mf file..." msgstr "正在準備 3mf 檔案..." msgid "Download failed, unknown file format." -msgstr "" +msgstr "下載失敗,未知的檔案格式。" msgid "downloading project ..." msgstr "專案項目下載中..." msgid "Download failed, File size exception." -msgstr "" +msgstr "下載失敗,檔案大小異常。" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "Project downloaded %d%%" -msgstr "專案項目已下載 %d%%" +msgstr "專案已下載 %d%%" msgid "" "Importing to Orca Slicer failed. Please download the file and manually " @@ -6269,16 +6132,16 @@ msgstr "載入 G-code 檔案時遇到錯誤" #. TRN %1% is archive path #, boost-format msgid "Loading of a ZIP archive on path %1% has failed." -msgstr "" +msgstr "載入路徑 %1% 的 ZIP 檔案失敗。" #. TRN: First argument = path to file, second argument = error description #, boost-format msgid "Failed to unzip file to %1%: %2%" -msgstr "" +msgstr "無法將檔案解壓縮到 %1%:%2%" #, boost-format msgid "Failed to find unzipped file at %1%. Unzipping of file has failed." -msgstr "" +msgstr "無法找到解壓縮的檔案 %1%。解壓縮檔案失敗。" #, fuzzy msgid "Drop project file" @@ -6308,9 +6171,8 @@ msgstr "在預覽模式不允許增加模型" msgid "All objects will be removed, continue?" msgstr "即將刪除所有物件,是否繼續?" -#, fuzzy msgid "The current project has unsaved changes, save it before continue?" -msgstr "目前專案項目包含未儲存的修改,是否先儲存?" +msgstr "目前專案包含未儲存的修改,是否先儲存?" msgid "Number of copies:" msgstr "複製數量:" @@ -6334,7 +6196,7 @@ msgstr "FAT 檔案系統不允許使用以下字元:" msgid "Save Sliced file as:" msgstr "切片檔案另存為:" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "" "The file %s has been sent to the printer's storage space and can be viewed " "on the printer." @@ -6344,22 +6206,23 @@ msgid "" "Unable to perform boolean operation on model meshes. Only positive parts " "will be kept. You may fix the meshes and try again." msgstr "" +"無法對模型網格執行布林運算。只有正向部分會被保留。你可以修正網格後再試一次。" #, boost-format msgid "Reason: part \"%1%\" is empty." -msgstr "" +msgstr "原因:\"%1%\"無物件" #, boost-format msgid "Reason: part \"%1%\" does not bound a volume." -msgstr "" +msgstr "原因:零件\"%1%\"無體積" #, boost-format msgid "Reason: part \"%1%\" has self intersection." -msgstr "" +msgstr "原因:零件\"%1%\"" #, boost-format msgid "Reason: \"%1%\" and another part have no intersection." -msgstr "" +msgstr "原因:\"%1%\" 與另一個零件沒有交集" #, fuzzy msgid "" @@ -6372,6 +6235,8 @@ msgid "" "3MF file?\n" "If you hit 'NO', all SVGs in the project will not be editable any more." msgstr "" +"你確定要將原始 SVG 檔案及其本地路徑儲存到 3MF 檔案中嗎?" +"如果選擇「否」,專案中的所有 SVG 將不再可編輯。" msgid "Private protection" msgstr "" @@ -6394,29 +6259,26 @@ msgstr "" msgid "Send G-code" msgstr "傳送 G-code" -#, fuzzy msgid "Send to printer" msgstr "傳送到列印設備" -#, fuzzy msgid "Custom supports and color painting were removed before repairing." -msgstr "自訂的支撐和上色在模型修復之前將被清除。" +msgstr "自訂的支撐和上色在模型修復之前被清除了。" msgid "Optimize Rotation" -msgstr "" +msgstr "優化旋轉" msgid "Invalid number" msgstr "無效數字" -#, fuzzy msgid "Plate Settings" msgstr "列印板參數設定" -#, fuzzy, boost-format +#, boost-format msgid "Number of currently selected parts: %1%\n" msgstr "目前選擇的零件數量:%1%\n" -#, fuzzy, boost-format +#, boost-format msgid "Number of currently selected objects: %1%\n" msgstr "目前選擇的物件數量:%1%\n" @@ -6432,15 +6294,15 @@ msgstr "物件名字:%1%\n" msgid "Size: %1% x %2% x %3% in\n" msgstr "大小:%1% x %2% x %3% 英寸\n" -#, fuzzy, boost-format +#, boost-format msgid "Size: %1% x %2% x %3% mm\n" -msgstr "大小: %1% x %2% x %3% m\n" +msgstr "大小: %1% x %2% x %3% mm\n" #, boost-format msgid "Volume: %1% in³\n" msgstr "體積: %1% 英寸³\n" -#, fuzzy, boost-format +#, boost-format msgid "Volume: %1% mm³\n" msgstr "體積: %1% mm³\n" @@ -6451,15 +6313,14 @@ msgstr "三角形:%1%\n" msgid "Tips:" msgstr "提示:" -#, fuzzy msgid "" "\"Fix Model\" feature is currently only on Windows. Please repair the model " -"on Orca Slicer(windows) or CAD softwares." +"on Orca Slicer(windows)or CAD softwares." msgstr "" "\"修復模型\"功能目前僅適用於 Windows 系統。請在 Windows 版本的 Orca slicer " "或 CAD 軟體上修復模型。" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "" "Plate% d: %s is not suggested to be used to print filament %s(%s). If you " "still want to do this printing, please set this filament's bed temperature " @@ -6484,7 +6345,7 @@ msgid "Changing application language" msgstr "正在為應用程式切換語言" msgid "Changing the region will log out your account.\n" -msgstr "修改區域會自動登出您的帳號。\n" +msgstr "修改區域會自動登出你的帳號。\n" msgid "Region selection" msgstr "區域選擇" @@ -6513,7 +6374,6 @@ msgstr "" msgid "Current Instance Path: " msgstr "" -#, fuzzy msgid "General Settings" msgstr "一般設定" @@ -6542,12 +6402,14 @@ msgid "" "This stops the transmission of data to Bambu's cloud services. Users who " "don't use BBL machines or use LAN mode only can safely turn on this function." msgstr "" +"這會停止數據傳輸到 Bambu 的雲端服務。" +"使用者如果不使用 Bambu 機台或僅使用區域網路模式,可以安全地啟用此功能。" msgid "Enable network plugin" -msgstr "" +msgstr "啟用網路插件" msgid "Check for stable updates only" -msgstr "" +msgstr "僅檢查穩定版更新" msgid "Metric" msgstr "公制" @@ -6559,7 +6421,7 @@ msgid "Units" msgstr "單位" msgid "Allow only one OrcaSlicer instance" -msgstr "" +msgstr "僅允許一個 OrcaSlicer 程序" msgid "" "On OSX there is always only one instance of app running by default. However " @@ -6567,13 +6429,15 @@ msgid "" "In such case this settings will allow only one instance." msgstr "" "在 OSX 上,預設情況下總是只有一個應用程式實例在運行。但是卻允許從命令視窗執行" -"同一應用程式的多個實例。當您設定了這個設定後將只允許一個實例執行。" +"同一應用程式的多個實例。當你設定了這個設定後將只允許一個實例執行。" msgid "" "If this is enabled, when starting OrcaSlicer and another instance of the " "same OrcaSlicer is already running, that instance will be reactivated " "instead." msgstr "" +"啟用後,嘗試開起 OrcaSlicer 時若有另一個 OrcaSlicer 程序已在運行時," +"已在運行的程序會被重新啟動。" msgid "Home" msgstr "首頁" @@ -6585,16 +6449,19 @@ msgid "Set the page opened on startup." msgstr "設定為啟動頁面。" msgid "Touchpad" -msgstr "" +msgstr "觸控板" msgid "Camera style" -msgstr "" +msgstr "相機模式" msgid "" "Select camera navigation style.\n" "Default: LMB+move for rotation, RMB/MMB+move for panning.\n" "Touchpad: Alt+move for rotation, Shift+move for panning." msgstr "" +"選擇相機導航樣式。" +"預設:左鍵+移動旋轉,右鍵/中鍵+移動平移。" +"觸控板:Alt+移動旋轉,Shift+移動平移。" msgid "Zoom to mouse position" msgstr "放大到滑鼠位置" @@ -6611,10 +6478,10 @@ msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "如果啟用,則使用自由鏡頭。若未啟用,則使用受限鏡頭。" msgid "Reverse mouse zoom" -msgstr "" +msgstr "反轉滑鼠滾輪縮放方向" msgid "If enabled, reverses the direction of zoom with mouse wheel." -msgstr "" +msgstr "啟用後,改變滑鼠滾輪縮放方向" msgid "Show splash screen" msgstr "顯示啟動動畫" @@ -6622,7 +6489,6 @@ msgstr "顯示啟動動畫" msgid "Show the splash screen during startup." msgstr "啟動時顯示啟動動畫。" -#, fuzzy msgid "Show \"Tip of the day\" notification after start" msgstr "啟動後顯示\"每日小提示\"通知" @@ -6630,46 +6496,48 @@ msgid "If enabled, useful hints are displayed at startup." msgstr "如果啟用,將在啟動時顯示有用的提示。" msgid "Flushing volumes: Auto-calculate every time the color changed." -msgstr "" +msgstr "廢料體積:換色時自動計算" msgid "If enabled, auto-calculate every time the color changed." -msgstr "" +msgstr "啟用後,換色時自動計算" msgid "" "Flushing volumes: Auto-calculate every time when the filament is changed." msgstr "" +"廢料體積:換料時自動計算" msgid "If enabled, auto-calculate every time when filament is changed" -msgstr "" +msgstr "啟用後,換料時自動計算" msgid "Remember printer configuration" -msgstr "" +msgstr "記住機臺設定" msgid "" "If enabled, Orca will remember and switch filament/process configuration for " "each printer automatically." msgstr "" +"啟用後,Orca會記住且自動切換各機臺線材與列印設定" msgid "Multi-device Management(Take effect after restarting Orca)." -msgstr "" +msgstr "多臺設備管理(需重開Orca)" msgid "" "With this option enabled, you can send a task to multiple devices at the " "same time and manage multiple devices." msgstr "" +"啟用時可以同時傳送到並管理多個機臺" msgid "Auto arrange plate after cloning" -msgstr "" +msgstr "複製後自動排列" msgid "Auto arrange plate after object cloning" -msgstr "" +msgstr " " msgid "Network" msgstr "網路" -#, fuzzy msgid "Auto sync user presets(Printer/Filament/Process)" -msgstr "同步使用者預設(列印設備/線材/列印品質參數)" +msgstr "自動同步使用者預設(列印設備/線材/列印品質參數)" msgid "User Sync" msgstr "使用者同步" @@ -6683,31 +6551,24 @@ msgstr "系統同步" msgid "Clear my choice on the unsaved presets." msgstr "清除我對未儲存預設的選擇。" -#, fuzzy msgid "Associate files to OrcaSlicer" msgstr " Orca Slicer 檔案關聯" -#, fuzzy msgid "Associate .3mf files to OrcaSlicer" msgstr "使用 Orca Slicer 打開 .3mf 檔案" -#, fuzzy msgid "If enabled, sets OrcaSlicer as default application to open .3mf files" msgstr "開啟後,將預設使用 Orca Slicer 打開 .3mf 檔案" -#, fuzzy msgid "Associate .stl files to OrcaSlicer" msgstr "使用 Orca Slicer 打開 .stl 檔案" -#, fuzzy msgid "If enabled, sets OrcaSlicer as default application to open .stl files" msgstr "開啟後,將預設使用 Orca Slicer 打開 .stl 檔案" -#, fuzzy msgid "Associate .step/.stp files to OrcaSlicer" msgstr "使用 Orca Slicer 打開 .step/.stp 檔案" -#, fuzzy msgid "If enabled, sets OrcaSlicer as default application to open .step files" msgstr "開啟後,將預設使用 Orca Slicer 打開 .step 檔案" @@ -6727,15 +6588,14 @@ msgid "Clear my choice on the unsaved projects." msgstr "清除我對未儲存的專案項目的選擇。" msgid "No warnings when loading 3MF with modified G-codes" -msgstr "" +msgstr "載入具有GCODE修改的3MF時不警告" msgid "Auto-Backup" msgstr "自動備份" -#, fuzzy msgid "" "Backup your project periodically for restoring from the occasional crash." -msgstr "定期備份專案項目,以便從未預期的錯誤中恢復。" +msgstr "定期備份專案,以便從未預期的錯誤中恢復。" msgid "every" msgstr "所有" @@ -6758,7 +6618,6 @@ msgstr "開發者模式" msgid "Skip AMS blacklist check" msgstr "跳過 AMS 黑名單檢查" -#, fuzzy msgid "Home page and daily tips" msgstr "首頁和每日小提示" @@ -6771,7 +6630,6 @@ msgstr "同步設定" msgid "User sync" msgstr "使用者同步" -#, fuzzy msgid "Preset sync" msgstr "預設檔同步" @@ -6781,15 +6639,12 @@ msgstr "偏好設定同步" msgid "View control settings" msgstr "視角控制設定" -#, fuzzy msgid "Rotate of view" msgstr "旋轉視角" -#, fuzzy msgid "Move of view" msgstr "移動視角" -#, fuzzy msgid "Zoom of view" msgstr "縮放視角" @@ -6854,13 +6709,11 @@ msgstr "除錯模式生效!" msgid "Switch cloud environment, Please login again!" msgstr "切換雲端環境,請重新登入!" -#, fuzzy msgid "System presets" -msgstr "系統預設檔" +msgstr "系統預設" -#, fuzzy msgid "User presets" -msgstr "使用者預設檔" +msgstr "使用者預設" msgid "Incompatible presets" msgstr "不相容的預設" @@ -6874,9 +6727,8 @@ msgstr "點擊設定線材顏色" msgid "Please choose the filament colour" msgstr "請選擇線材顏色" -#, fuzzy msgid "Add/Remove presets" -msgstr "新增/刪除 預設檔" +msgstr "新增/刪除 預設" msgid "Edit preset" msgstr "編輯預設" @@ -6891,10 +6743,10 @@ msgid "Add/Remove materials" msgstr "新增/刪除材料" msgid "Select/Remove printers(system presets)" -msgstr "" +msgstr "選擇/移除機台(系統預設)" msgid "Create printer" -msgstr "" +msgstr "創建機臺" msgid "The selected preset is null!" msgstr "選擇的預設為空!" @@ -6911,18 +6763,17 @@ msgstr "" msgid "Please input layer value (>= 2)." msgstr "" -#, fuzzy msgid "Plate name" msgstr "列印板名稱" msgid "Same as Global Print Sequence" -msgstr "跟隨全局列印順序" +msgstr "跟隨全域列印順序" msgid "Print sequence" msgstr "列印順序" msgid "Same as Global" -msgstr "" +msgstr "跟隨全域設定" msgid "Disable" msgstr "" @@ -6935,11 +6786,11 @@ msgstr "首層線材列印順序" #, fuzzy msgid "Same as Global Plate Type" -msgstr "跟隨全局列印板設定" +msgstr "跟隨全域列印板設定" #, fuzzy msgid "Same as Global Bed Type" -msgstr "跟隨全局列印板設定" +msgstr "跟隨全域列印板設定" msgid "By Layer" msgstr "逐層" @@ -6956,11 +6807,9 @@ msgstr "登出" msgid "Slice all plate to obtain time and filament estimation" msgstr "正在切片以獲取切片資訊和預估列印時間" -#, fuzzy msgid "Packing project data into 3mf file" msgstr "正在將專案資料打包到 3mf 檔案中" -#, fuzzy msgid "Uploading 3mf" msgstr "正在上傳 3mf" @@ -6976,18 +6825,16 @@ msgstr "發布" msgid "Publish was cancelled" msgstr "發布已取消" -#, fuzzy msgid "Slicing Plate 1" msgstr "正在切片列印板 1" -#, fuzzy msgid "Packing data to 3mf" msgstr "將資料打包至 3mf" msgid "Jump to webpage" msgstr "轉換到網頁" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "Save %s as" msgstr "另存 %s 為" @@ -7003,11 +6850,11 @@ msgstr "名稱不可用。" msgid "Overwrite a system profile is not allowed" msgstr "不允許覆蓋系統預設" -#, fuzzy, boost-format +#, boost-format msgid "Preset \"%1%\" already exists." msgstr "預設 \"%1%\" 已存在。" -#, fuzzy, boost-format +#, boost-format msgid "Preset \"%1%\" already exists and is incompatible with current printer." msgstr "預設 \"%1%\" 已存在,並且和目前列印設備不相容。" @@ -7074,7 +6921,6 @@ msgstr "登出成功。" msgid "Busy" msgstr "忙碌" -#, fuzzy msgid "Bambu Cool Plate" msgstr "低溫列印版" @@ -7087,7 +6933,6 @@ msgstr "工程列印熱床" msgid "Bambu Smooth PEI Plate" msgstr "" -#, fuzzy msgid "High temperature Plate" msgstr "高溫列印板" @@ -7109,7 +6954,6 @@ msgstr "傳送完成" msgid "Error code" msgstr "錯誤代碼" -#, fuzzy msgid "No login account, only printers in LAN mode are displayed" msgstr "未登入帳號,僅顯示區域網路模式的列印設備" @@ -7184,43 +7028,40 @@ msgstr "" "已自動建立 \"線材清單=>AMS 槽位\" 的映射關係。 可點擊上方的線材來手動設定其所" "對應的 AMS 槽位" -#, fuzzy msgid "An SD card needs to be inserted before printing." -msgstr "請在進行列印前插入 SD記憶卡" +msgstr "請在進行列印前插入 SD 記憶卡" #, c-format, boost-format msgid "" -"The selected printer (%s) is incompatible with the chosen printer profile in " +"The selected printer (%s)is incompatible with the chosen printer profile in " "the slicer (%s)." msgstr "" +"以選的機臺(%s)與切片軟體內所選的機臺預設(%s)不相容" -#, fuzzy msgid "An SD card needs to be inserted to record timelapse." msgstr "使用縮時攝影功能需要插入 SD 記憶卡" -#, fuzzy msgid "" "Cannot send the print job to a printer whose firmware is required to get " "updated." -msgstr "需要更新列印設備韌體後,才能將列印作業傳送到列印設備" +msgstr "機台需要更新韌體才能接收列印作業" -#, fuzzy msgid "Cannot send the print job for empty plate" -msgstr "無法為空列印板傳送列印作業" +msgstr "無法傳送空的列印板" #, fuzzy msgid "This printer does not support printing all plates" msgstr "此列印設備類型不支援列印所有列印板" -#, fuzzy msgid "" "When enable spiral vase mode, machines with I3 structure will not generate " "timelapse videos." -msgstr "當啟用花瓶模式時,龍門結構的設備不會產生縮時攝影影片" +msgstr "當啟用花瓶模式時,門架結構的設備不會產生縮時攝影影片" msgid "" "Timelapse is not supported because Print sequence is set to \"By object\"." msgstr "" +"逐件列印模式下不支援縮時錄影" msgid "Errors" msgstr "錯誤" @@ -7228,22 +7069,20 @@ msgstr "錯誤" msgid "Please check the following:" msgstr "請檢查以下內容:" -#, fuzzy 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-code 時選擇的列印設備類型與目前選擇的列印設備不一致。建議您使用相同的" +"產生 G-code 時選擇的列印設備類型與目前選擇的列印設備不一致。建議你使用相同的" "列印設備類型進行切片。" -#, fuzzy msgid "" "There are some unknown filaments in the AMS mappings. Please check whether " "they are the required filaments. If they are okay, press \"Confirm\" to " "start printing." msgstr "" -"AMS 映射中存在一些未知的線材。請檢查是否符合預期線材。如果符合,按“確定”以開" +"AMS 設定中存在一些未知的線材。請檢查是否符合所需的線材。如果符合,按\"確定\"以開" "始列印作業。" #, c-format, boost-format @@ -7262,18 +7101,17 @@ msgstr "" #, c-format, boost-format msgid "" -"Printing high temperature material(%s material) with %s may cause nozzle " +"Printing high temperature material(%s material)with %s may cause nozzle " "damage" msgstr "" msgid "Please fix the error above, otherwise printing cannot continue." -msgstr "" +msgstr "請排除上述錯誤,否則無法繼續列印" msgid "" "Please click the confirm button if you still want to proceed with printing." -msgstr "如果您仍然想繼續列印,請滑鼠左鍵點擊 確定 按鈕。" +msgstr "如果你仍然想繼續列印,請滑鼠左鍵點擊 確定 按鈕。" -#, fuzzy msgid "" "Connecting to the printer. Unable to cancel during the connection process." msgstr "正在連接列印設備。連接過程中無法取消。" @@ -7281,38 +7119,32 @@ msgstr "正在連接列印設備。連接過程中無法取消。" msgid "" "Caution to use! Flow calibration on Textured PEI Plate may fail due to the " "scattered surface." -msgstr "小心使用!金屬紋理 PEI 板 上的流量校準可能會因表面光線散射而失敗。" +msgstr "小心使用!紋理 PEI 板 上的流量校準可能會因表面光線散射而失敗。" msgid "Automatic flow calibration using Micro Lidar" msgstr "使用微型雷射雷達進行自動流量校準" -#, fuzzy msgid "Modifying the device name" msgstr "修改列印設備名稱" msgid "Bind with Pin Code" -msgstr "" +msgstr "Pin碼綁定" -#, fuzzy msgid "Send to Printer SD card" msgstr "傳送到列印設備的 SD 記憶卡" msgid "Cannot send the print task when the upgrade is in progress" msgstr "設備升級中,無法傳送列印作業" -#, fuzzy msgid "The selected printer is incompatible with the chosen printer presets." msgstr "所選列印設備與選擇的列印設備預設檔不相容。" -#, fuzzy msgid "An SD card needs to be inserted before send to printer SD card." msgstr "傳送到列印設備需要插入 SD 記憶卡" -#, fuzzy msgid "The printer is required to be in the same LAN as Orca Slicer." msgstr "列印設備需要與 Orca Slicer 在同一個區域網路內。" -#, fuzzy msgid "The printer does not support sending to printer SD card." msgstr "該列印設備不支援傳送到 SD 記憶卡。" @@ -7320,7 +7152,7 @@ msgid "Slice ok." msgstr "切片完成." msgid "View all Daily tips" -msgstr "" +msgstr "顯示所有每日提示" msgid "Failed to create socket" msgstr "建立網路端點連線失敗" @@ -7354,27 +7186,27 @@ msgid "" "Please Find the Pin Code in Account page on printer screen,\n" " and type in the Pin Code below." msgstr "" +"請在印表設備螢幕上的帳戶頁面找到 PIN 碼,\n" +"並在下面輸入 PIN 碼。" msgid "Can't find Pin Code?" -msgstr "" +msgstr "找不到Pin?" msgid "Pin Code" -msgstr "" +msgstr "Pin" msgid "Binding..." -msgstr "" +msgstr "綁定..." msgid "Please confirm on the printer screen" -msgstr "" +msgstr "請到機台上按確認" msgid "Log in failed. Please check the Pin Code." -msgstr "" +msgstr "登入失敗。請確認Pin" -#, fuzzy msgid "Log in printer" msgstr "登入列印設備" -#, fuzzy msgid "Would you like to log in this printer with current account?" msgstr "你想使用目前帳號登入這台列印設備嗎?" @@ -7394,19 +7226,19 @@ msgid "" "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 "" -"感謝您購買 Bambu Lab 設備,使用 Bambu Lab 設備前,請閱讀一下條款,點擊同意使" -"用您的 Bambu Lab 設備即表示您同意遵守隱私政策以及使用條款(統稱為 條款 )。如" -"果您不願遵守或不同意 Bambu Lab 隱私政策,請不要使用 Bambu Lab 設備和服務。" +"感謝你購買 Bambu Lab 設備,使用 Bambu Lab 設備前,請閱讀一下條款,點擊同意使" +"用你的 Bambu Lab 設備即表示你同意遵守隱私政策以及使用條款(統稱為 條款 )。如" +"果你不願遵守或不同意 Bambu Lab 隱私政策,請不要使用 Bambu Lab 設備和服務。" msgid "and" -msgstr "" +msgstr " 與 " msgid "Privacy Policy" msgstr "隱私協議" #, fuzzy msgid "We ask for your help to improve everyone's printer" -msgstr "我們請求您的幫助來改善大家的列印設備" +msgstr "我們請求你的幫助來改善大家的列印設備" msgid "Statement about User Experience Improvement Program" msgstr "關於使用者體驗改善計劃的聲明" @@ -7427,10 +7259,10 @@ msgid "" msgstr "" "在 3D 列印社區,我們從彼此的成功和失敗中學習調整自己的切片參數和設定。%s 遵循" "同樣的原則,透過機器學習的方式從大量使用者列印的成功和失敗中獲取經驗,從而改" -"善列印性能。我們正在透過向 %s 提供真實世界的資料來訓練他們變得更聰明。如果您" -"願意,此服務將訪問您的錯誤日誌和使用日誌中的資訊,其中可能包括隱私政策中描述" +"善列印性能。我們正在透過向 %s 提供真實世界的資料來訓練他們變得更聰明。如果你" +"願意,此服務將訪問你的錯誤日誌和使用日誌中的資訊,其中可能包括隱私政策中描述" "的資料。我們不會收集任何可以直接或間接識別個人的個人資料,包括但不限於姓名、" -"地址、支付資訊或電話號碼。啟用此服務即表示您同意這些條款和有關隱私政策的聲" +"地址、支付資訊或電話號碼。啟用此服務即表示你同意這些條款和有關隱私政策的聲" "明。" msgid "Statement on User Experience Improvement Plan" @@ -7439,18 +7271,15 @@ msgstr "關於使用者體驗改善計劃的聲明" msgid "Log in successful." msgstr "登入成功。" -#, fuzzy msgid "Log out printer" msgstr "登出列印設備" -#, fuzzy msgid "Would you like to log out the printer?" msgstr "你想登出列印設備嗎?" msgid "Please log in first." msgstr "請先登入。" -#, fuzzy msgid "There was a problem connecting to the printer. Please try again." msgstr "連接列印設備時發生錯誤。 重新連接。" @@ -7468,29 +7297,25 @@ msgstr "刪除此預設" msgid "Search in preset" msgstr "在預設中搜索" -#, fuzzy msgid "Click to reset all settings to the last saved preset." msgstr "點擊以將所有設定還原到最後一次儲存的版本。" -#, fuzzy msgid "" "Prime tower is required for smooth timelapse. There may be flaws on the " "model without prime tower. Are you sure you want to disable prime tower?" msgstr "" -"平滑模式的縮時錄影需要擦拭塔,否則列印物件上可能會有瑕疵。確定要關閉擦拭塔" +"平滑模式的縮時錄影需要換料塔,否則列印物件上可能會有瑕疵。確定要關閉換料塔" "嗎?" -#, fuzzy msgid "" "Prime tower is required for smooth timelapse. There may be flaws on the " "model without prime tower. Do you want to enable prime tower?" msgstr "" -"平滑模式的縮時錄影需要擦拭塔,否則列印物件上可能會有瑕疵。要打開擦拭塔嗎?" +"平滑模式的縮時錄影需要換料塔,否則列印物件上可能會有瑕疵。要打開換料塔嗎?" msgid "Still print by object?" -msgstr "" +msgstr "持續逐件列印?" -#, fuzzy msgid "" "We have added an experimental style \"Tree Slim\" that features smaller " "support volume but weaker strength.\n" @@ -7498,9 +7323,8 @@ msgid "" msgstr "" "我們增加了一種實驗性的支撐樣式 \"苗條樹\",它的特點是支撐體積較小,但強度較" "弱。\n" -"因此我們推薦以下參數:接觸層數為 0,頂部Z距離為 0,牆層數為 2。" +"因此我們推薦以下參數:界面數為 0,頂部Z距離為 0,牆層數為 2。" -#, fuzzy msgid "" "Change these settings automatically? \n" "Yes - Change these settings automatically\n" @@ -7510,7 +7334,6 @@ msgstr "" "是 - 自動調整這些設定\n" "否 - 不用為我調整這些設定" -#, fuzzy msgid "" "For \"Tree Strong\" and \"Tree Hybrid\" styles, we recommend the following " "settings: at least 2 interface layers, at least 0.1mm top z distance or " @@ -7519,7 +7342,6 @@ msgstr "" "對於 \"強壯樹 \"和 \"混合樹 \"的支撐樣式,我們推薦以下設定:至少 2 層界面層," "至少 0.1 毫米的頂部z距離或使用專用的支撐線材。" -#, fuzzy msgid "" "When using support material for the support interface, We recommend the " "following settings:\n" @@ -7527,7 +7349,7 @@ msgid "" "independent support layer height" msgstr "" "當使用專用的支撐線材時,我們推薦以下設定:\n" -"0 頂層z距離,0 接觸層間距,同心圖案,並且禁用獨立支撐層高" +"0 頂層z距離,0 界面間距,同心模式,並且禁用獨立支撐層高" msgid "" "Enabling this option will modify the model's shape. If your print requires " @@ -7542,17 +7364,20 @@ msgid "" "Layer height is too small.\n" "It will set to min_layer_height\n" msgstr "" +"層高過薄\n" +"將改為 min_layer_height\n" msgid "" "Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " "height limits ,this may cause printing quality issues." msgstr "" +"層高超過了印表設備設定 -> 擠出機 -> 層高限制,這可能會導致列印品質問題。" msgid "Adjust to the set range automatically? \n" -msgstr "" +msgstr "是否自動調整至設定範圍?\n" msgid "Adjust" -msgstr "" +msgstr "調整" msgid "Ignore" msgstr "忽略" @@ -7578,8 +7403,8 @@ msgid "" "by right-click the empty position of build plate and choose \"Add " "Primitive\"->\"Timelapse Wipe Tower\"." msgstr "" -"在錄製無工具頭縮時錄影影片時,建議增加“縮時錄影擦拭塔”\n" -"右鍵單擊列印板的空白位置,選擇“新增標準模型”->“縮時錄影擦拭塔”。" +"在錄製無工具頭縮時錄影影片時,建議增加\"縮時錄影換料塔\"\n" +"右鍵單擊列印板的空白位置,選擇\"新增標準模型\"->\"縮時錄影換料塔\"。" msgid "Line width" msgstr "線寬" @@ -7594,13 +7419,13 @@ msgid "Wall generator" msgstr "牆產生器" msgid "Walls and surfaces" -msgstr "" +msgstr "牆與表面" msgid "Bridging" -msgstr "" +msgstr "橋接" msgid "Overhangs" -msgstr "" +msgstr "懸空" msgid "Walls" msgstr "牆" @@ -7614,11 +7439,9 @@ msgstr "首層速度" msgid "Other layers speed" msgstr "其他層速度" -#, fuzzy msgid "Overhang speed" msgstr "懸空列印速度" -#, fuzzy 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 " @@ -7630,7 +7453,6 @@ msgstr "" msgid "Bridge" msgstr "橋接" -#, fuzzy msgid "Set speed for external and internal bridges" msgstr "設定外部和內部橋接的速度" @@ -7646,7 +7468,6 @@ msgstr "抖動(XY軸)" msgid "Raft" msgstr "筏層" -#, fuzzy msgid "Support filament" msgstr "支撐線材" @@ -7657,13 +7478,13 @@ msgid "Multimaterial" msgstr "多線材" msgid "Prime tower" -msgstr "擦拭塔" +msgstr "換料塔" msgid "Filament for Features" msgstr "" msgid "Ooze prevention" -msgstr "" +msgstr "防止漏料" msgid "Skirt" msgstr "側裙" @@ -7677,7 +7498,6 @@ msgstr "G-code 輸出" msgid "Post-processing Scripts" msgstr "後處理腳本" -#, fuzzy msgid "Notes" msgstr "備註" @@ -7706,21 +7526,18 @@ msgstr "參數覆蓋" msgid "Retraction" msgstr "回抽" -#, fuzzy msgid "Basic information" msgstr "基本資訊" msgid "Recommended nozzle temperature" msgstr "建議噴嘴溫度" -#, fuzzy msgid "Recommended nozzle temperature range of this filament. 0 means no set" msgstr "該線材的建議噴嘴溫度範圍。0 表示未設定" msgid "Flow ratio and Pressure Advance" -msgstr "" +msgstr "流量比與壓力提前" -#, fuzzy msgid "Print chamber temperature" msgstr "列印設備內部溫度" @@ -7733,39 +7550,33 @@ msgstr "噴嘴" msgid "Nozzle temperature when printing" msgstr "列印時的噴嘴溫度" -#, fuzzy msgid "Cool plate" msgstr "低溫列印板" -#, fuzzy msgid "" "Bed temperature when cool plate is installed. Value 0 means the filament " "does not support to print on the Cool Plate" msgstr "使用低溫列印板時的熱床溫度。0 值表示這個線材不支援低溫列印板" msgid "Textured Cool plate" -msgstr "" +msgstr "紋理低溫列印板" msgid "" "Bed temperature when cool plate is installed. Value 0 means the filament " "does not support to print on the Textured Cool Plate" msgstr "" -#, fuzzy msgid "Engineering plate" msgstr "工程高溫列印板" -#, fuzzy msgid "" "Bed temperature when engineering plate is installed. Value 0 means the " "filament does not support to print on the Engineering Plate" msgstr "使用工程高溫列印板時的熱床溫度。0 值表示這個線材不支援工程高溫列印板" -#, fuzzy msgid "Smooth PEI Plate / High Temp Plate" msgstr "光滑面 PEI 列印板/高溫列印板" -#, fuzzy msgid "" "Bed temperature when Smooth PEI Plate/High temperature plate is installed. " "Value 0 means the filament does not support to print on the Smooth PEI Plate/" @@ -7774,16 +7585,14 @@ msgstr "" "使用光滑面 PEI 列印板/高溫列印板時的熱床溫度。0 值表示這個線材不支援光滑面列" "印板/高溫列印板" -#, fuzzy msgid "Textured PEI Plate" -msgstr "金屬紋理 PEI 列印板" +msgstr "紋理 PEI 列印板" -#, fuzzy msgid "" "Bed temperature when Textured PEI Plate is installed. Value 0 means the " "filament does not support to print on the Textured PEI Plate" msgstr "" -"使用金屬紋理 PEI 列印板時的熱床溫度。0 值表示這個線材不支援金屬紋理 PEI 列印" +"使用紋理 PEI 列印板時的熱床溫度。0 值表示這個線材不支援紋理 PEI 列印" "板" msgid "Volumetric speed limitation" @@ -7795,34 +7604,30 @@ msgstr "冷卻" msgid "Cooling for specific layer" msgstr "特定層冷卻" -#, fuzzy msgid "Part cooling fan" -msgstr "部件冷卻風扇" +msgstr "物件冷卻風扇" msgid "Min fan speed threshold" msgstr "最小風扇速度臨界值" -#, fuzzy msgid "" "Part cooling fan speed will start to run at min speed when the estimated " "layer time is no longer than the layer time in setting. When layer time is " "shorter than threshold, fan speed is interpolated between the minimum and " "maximum fan speed according to layer printing time" msgstr "" -"當預計的層時間不大於設定的層時間時,部件冷卻風扇速度將開始以最小速度運轉。當" +"當預計的層時間小於設定的層時間時,物件冷卻風扇速度將開始以最小速度運轉。當" "層時間小於設定值時,風扇速度將根據該層列印時間在最小和最大風扇速度之間自動調" "整" msgid "Max fan speed threshold" msgstr "最大風扇速度臨界值" -#, fuzzy msgid "" "Part cooling fan speed will be max when the estimated layer time is shorter " "than the setting value" -msgstr "當預計的層列印時間比設定值要小時,部件冷卻風扇轉速將達到最大值" +msgstr "當預計的層列印時間比設定值要小時,物件冷卻風扇轉速將達到最大值" -#, fuzzy msgid "Auxiliary part cooling fan" msgstr "輔助冷卻風扇" @@ -7835,7 +7640,6 @@ msgstr "列印期間" msgid "Complete print" msgstr "列印完成" -#, fuzzy msgid "Filament start G-code" msgstr "線材起始 G-code" @@ -7878,20 +7682,17 @@ msgid "Extruder Clearance" msgstr "擠出機避讓空間" msgid "Adaptive bed mesh" -msgstr "" +msgstr "自適應床面網格" msgid "Accessory" msgstr "配件" -#, fuzzy msgid "Machine gcode" msgstr "列印設備 G-code" -#, fuzzy msgid "Machine start G-code" msgstr "列印設備起始 G-code" -#, fuzzy msgid "Machine end G-code" msgstr "列印設備結束 G-code" @@ -7934,12 +7735,11 @@ msgstr "加速度限制" msgid "Jerk limitation" msgstr "抖動限制" -#, fuzzy msgid "Single extruder multi-material setup" msgstr "單擠出機多線材設定" msgid "Number of extruders of the printer." -msgstr "" +msgstr "機台擠出機數量" msgid "" "Single Extruder Multi Material is selected, \n" @@ -7990,9 +7790,10 @@ msgid "" "%d Filament Preset and %d Process Preset is attached to this printer. Those " "presets would be deleted if the printer is deleted." msgstr "" +"此印表設備含有 %d 線材預設和 %d 處理預設。若刪除此印表設備,這些預設將被刪除。" msgid "Presets inherited by other presets can not be deleted!" -msgstr "" +msgstr "被其他預設繼承的預設無法刪除!" msgid "The following presets inherit this preset." msgid_plural "The following preset inherits this preset." @@ -8013,7 +7814,7 @@ msgid "" "please reset the filament information for that slot." msgstr "" -#, fuzzy, boost-format +#, boost-format msgid "Are you sure to %1% the selected preset?" msgstr "確定要 %1% 所選預設嗎?" @@ -8025,13 +7826,11 @@ msgstr "設定" #, fuzzy msgid "Click to reset current value and attach to the global value." -msgstr "點擊該圖示,恢復到全局的設定數值,並與全局設定同步變化。" +msgstr "點擊該圖示,恢復到全域的設定數值,並與全域設定同步變化。" -#, fuzzy msgid "Click to drop current modify and reset to saved value." -msgstr "點擊該圖示,放棄目前的修改,恢復到上次儲存的數值。" +msgstr "放棄目前的修改,恢復到上次儲存的數值。" -#, fuzzy msgid "Process Settings" msgstr "列印參數設定" @@ -8093,7 +7892,7 @@ msgstr "" "將選擇的選項轉移到新選擇的預設 \n" "\"%1%\"。" -#, fuzzy, boost-format +#, boost-format msgid "Preset \"%1%\" contains the following unsaved changes:" msgstr "預設 \"%1%\" 包含以下未儲存的修改:" @@ -8111,18 +7910,22 @@ msgstr "預設 \"%1%\" 和新的列印品質預設不相容,並且它包含以 #, boost-format msgid "You have changed some settings of preset \"%1%\". " -msgstr "" +msgstr "已更改預設 \"%1%\" 的一些設定。" msgid "" "\n" "You can save or discard the preset values you have modified." msgstr "" +"\n" +"你可以儲存或放棄已修改的預設值。" msgid "" "\n" "You can save or discard the preset values you have modified, or choose to " "transfer the values you have modified to the new preset." msgstr "" +"\n" +"你可以儲存或放棄已修改的預設值,或選擇將修改的數值轉移到新的預設值。" msgid "You have previously modified your settings." msgstr "" @@ -8132,18 +7935,18 @@ msgid "" "You can discard the preset values you have modified, or choose to transfer " "the modified values to the new project" msgstr "" +"\n" +"你可以放棄已修改的預設值,或選擇將修改的數值轉移到新專案中。" msgid "Extruders count" msgstr "擠出機數量" -#, fuzzy msgid "General" msgstr "一般" msgid "Capabilities" msgstr "能力" -#, fuzzy msgid "Show all presets (including incompatible)" msgstr "顯示所有預設(包括不相容的)" @@ -8161,26 +7964,26 @@ msgid "" msgstr "" msgid "Transfer values from left to right" -msgstr "" +msgstr "將數值從左邊轉移到右邊" msgid "" "If enabled, this dialog can be used for transfer selected values from left " "to right preset." msgstr "" +"如果啟用,則此視窗可用於將選定的數值從左邊轉移到右邊的預設值。" msgid "Add File" msgstr "新增檔案" -#, fuzzy msgid "Set as cover" msgstr "設定為封面" msgid "Cover" msgstr "封面" -#, fuzzy, boost-format +#, boost-format msgid "The name \"%1%\" already exists." -msgstr "名字 \"%1%\" 已經存在。" +msgstr "\"%1%\" 已經存在。" msgid "Basic Info" msgstr "基本資訊" @@ -8192,7 +7995,6 @@ msgstr "圖片" msgid "Bill of Materials" msgstr "材料清單" -#, fuzzy msgid "Assembly Guide" msgstr "組裝說明" @@ -8209,22 +8011,18 @@ msgstr "%s 更新" msgid "A new version is available" msgstr "發現新版本" -#, fuzzy msgid "Configuration update" msgstr "設定檔更新" -#, fuzzy msgid "A new configuration package available, Do you want to install it?" -msgstr "新的設定檔可用,確定要安裝嗎?" +msgstr "有新的設定檔可用,是否要安裝?" msgid "Description:" msgstr "描述:" -#, fuzzy msgid "Configuration incompatible" msgstr "設定檔不相容" -#, fuzzy msgid "the configuration package is incompatible with current application." msgstr "設定檔和目前的應用程式不相容。" @@ -8242,16 +8040,14 @@ msgstr "退出 %s" #, fuzzy msgid "the Configuration package is incompatible with current APP." -msgstr "設定檔與目前手機應用程式不相容。" +msgstr "設定檔與目前(手機應用程式)?不相容。" msgid "Configuration updates" msgstr "組態檔更新" -#, fuzzy msgid "No updates available." -msgstr "以更新到最新。" +msgstr "已經是最新版本。" -#, fuzzy msgid "The configuration is up to date." msgstr "目前設定檔已經是最新版本。" @@ -8305,11 +8101,9 @@ msgid "" " current extruders exceeds 16." msgstr "" -#, fuzzy msgid "Ramming customization" msgstr "自訂尖端成型" -#, fuzzy msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -8321,25 +8115,22 @@ msgid "" "This is an expert-level setting, incorrect adjustment will likely lead to " "jams, extruder wheel grinding into filament etc." msgstr "" -"尖端成型是指在單擠出機多線材印表機中換色之前的快速抽插。\n" +"尖端成型是指在單擠出機多線材列印設備中換色之前的快速抽插。\n" "其目的是使退出的線材末端正確成形,這樣就不會妨礙新線材的插入,並可以重新插" "入。\n" "這個階段很重要,不同的線材可能需要不同的擠出速度才能獲得良好的形狀。因此尖端" "成型過程中的擠壓率是需要可調整的。\n" -"這是一個專業的設定,不正確的調整可能會導致堵塞、擠出機齒輪刨料等。" +"這是一個進階的設定,不正確的調整可能會導致堵塞、線材磨損等。" -#, fuzzy msgid "Total ramming time" msgstr "尖端成型總時間" msgid "s" msgstr "秒" -#, fuzzy msgid "Total rammed volume" msgstr "尖端成型總體積" -#, fuzzy msgid "Ramming line width" msgstr "尖端成型線寬" @@ -8361,18 +8152,17 @@ msgid "" "changed. You could disable the auto-calculate in Orca Slicer > Preferences" msgstr "" -msgid "Flushing volume (mm³) for each filament pair." +msgid "Flushing volume (mm³)for each filament pair." msgstr "在兩個線材間切換所需的廢料體積(mm³)" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "Suggestion: Flushing Volume in range [%d, %d]" msgstr "建議:廢料體積量應設定在[ %d, %d ]範圍內" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "The multiplier should be in range [%.2f, %.2f]." msgstr "倍數的數值範圍是[%.2f, %.2f]" -#, fuzzy msgid "Multiplier" msgstr "倍數" @@ -8389,7 +8179,7 @@ msgid "From" msgstr "從" msgid "To" -msgstr "" +msgstr "至" msgid "" "Windows Media Player is required for this task! Do you want to enable " @@ -8421,18 +8211,17 @@ msgid "Bambu Network plug-in not detected." msgstr "" msgid "Click here to download it." -msgstr "" +msgstr "下載" msgid "Login" msgstr "登入" #, fuzzy msgid "The configuration package is changed in previous Config Guide" -msgstr "設定檔在之前的設定引導過程中以改變" +msgstr "設定檔在之前的設定引導過程中已改變" -#, fuzzy msgid "Configuration package changed" -msgstr "設定檔以改變" +msgstr "設定檔已改變" msgid "Toolbar" msgstr "工具欄" @@ -8440,9 +8229,8 @@ msgstr "工具欄" msgid "Objects list" msgstr "物件清單" -#, fuzzy msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" -msgstr "從 STL/STEP/3MF/OBJ/AMF 檔案中匯入幾何數據" +msgstr "從 STL/STEP/3MF/OBJ/AMF 檔案中匯入幾何模型" msgid "⌘+Shift+G" msgstr "" @@ -8463,9 +8251,8 @@ msgstr "" msgid "Show keyboard shortcuts list" msgstr "顯示鍵盤快捷鍵清單" -#, fuzzy msgid "Global shortcuts" -msgstr "全局快捷鍵" +msgstr "全域快捷鍵" msgid "Rotate View" msgstr "旋轉視角" @@ -8497,7 +8284,6 @@ msgstr "" msgid "Shift+Tab" msgstr "" -#, fuzzy msgid "Collapse/Expand the sidebar" msgstr "摺疊/展開 側邊欄" @@ -8517,7 +8303,6 @@ msgstr "選擇單一零件" msgid "⌘+Left mouse button" msgstr "⌘+滑鼠左鍵" -#, fuzzy msgid "Select multiple objects" msgstr "選擇多個物件" @@ -8539,39 +8324,33 @@ msgstr "框選多個零件" msgid "Arrow Up" msgstr "上箭頭" -#, fuzzy msgid "Move selection 10 mm in positive Y direction" msgstr "Y 方向移動 10mm" msgid "Arrow Down" msgstr "下箭頭" -#, fuzzy msgid "Move selection 10 mm in negative Y direction" msgstr "Y 方向移動 10mm" msgid "Arrow Left" msgstr "左箭頭" -#, fuzzy msgid "Move selection 10 mm in negative X direction" msgstr "X 方向移動 10mm" msgid "Arrow Right" msgstr "右箭頭" -#, fuzzy msgid "Move selection 10 mm in positive X direction" msgstr "X 方向移動 10mm" msgid "Shift+Any arrow" msgstr "Shift+方向鍵" -#, fuzzy msgid "Movement step set to 1 mm" msgstr "沿 X、Y 軸以 1mm 為單位步進移動" -#, fuzzy msgid "keyboard 1-9: set filament for object/part" msgstr "按鍵 1~9:設定物件/零件的線材" @@ -8635,7 +8414,6 @@ msgstr "在準備/預覽模式之中切換" msgid "Plater" msgstr "準備" -#, fuzzy msgid "Move: press to snap by 1mm" msgstr "移動:以 1mm 為單位步進移動" @@ -8660,7 +8438,6 @@ msgstr "Alt+滑鼠滾輪" msgid "Gizmo" msgstr "" -#, fuzzy msgid "Set extruder number for the objects and parts" msgstr "設定物件、零件使用的擠出機編號" @@ -8694,7 +8471,6 @@ msgstr "水平滑動條 - 向右移動一步" msgid "On/Off one layer mode of the vertical slider" msgstr "開啟/關閉垂直滑動條的單層模式" -#, fuzzy msgid "On/Off g-code window" msgstr "開啟/關閉 G-code 視窗" @@ -8717,60 +8493,58 @@ msgstr "更新說明" msgid "version %s update information :" msgstr "版本 %s 更新資訊" -#, fuzzy msgid "Network plug-in update" -msgstr "網路套件升級" +msgstr "網路插件升級" -#, fuzzy msgid "" "Click OK to update the Network plug-in when Orca Slicer launches next time." -msgstr "按一下「確定」以在下次啟動 Orca Slicer 時更新網路套件" +msgstr "按下「確定」後,下次啟動 Orca Slicer 時會更新網路插件" -#, fuzzy, c-format, boost-format -msgid "A new Network plug-in(%s) available, Do you want to install it?" -msgstr "新的網路套件( %s) 可用,您是否需要安裝它?" +#, c-format, boost-format +msgid "A new Network plug-in(%s)available, Do you want to install it?" +msgstr "新版的網路插件( %s)可用,是否要安裝?" msgid "New version of Orca Slicer" msgstr "新版本的 Orca Slicer" msgid "Skip this Version" -msgstr "" +msgstr "跳過這個版本" msgid "Done" msgstr "完成" msgid "resume" -msgstr "" +msgstr "繼續" msgid "Resume Printing" -msgstr "" +msgstr "繼續列印" msgid "Resume Printing(defects acceptable)" -msgstr "" +msgstr "繼續列印 (瑕疵可接受)" msgid "Resume Printing(problem solved)" -msgstr "" +msgstr "繼續列印 (問題排除了)" msgid "Stop Printing" -msgstr "" +msgstr "停止列印" msgid "Check Assistant" msgstr "" msgid "Filament Extruded, Continue" -msgstr "" +msgstr "線才擠出,繼續" msgid "Not Extruded Yet, Retry" -msgstr "" +msgstr "尚未擠出,重試" msgid "Finished, Continue" -msgstr "" +msgstr "完成,繼續" msgid "Load Filament" msgstr "進料" msgid "Filament Loaded, Resume" -msgstr "" +msgstr "進料完成,繼續" msgid "View Liveview" msgstr "" @@ -8778,16 +8552,13 @@ msgstr "" msgid "Confirm and Update Nozzle" msgstr "" -#, fuzzy msgid "LAN Connection Failed (Sending print file)" -msgstr "區域網路連接失敗(傳送列印作業)" +msgstr "區域網路連接失敗(傳送列印檔案)" -#, fuzzy msgid "" "Step 1, please confirm Orca Slicer and your printer are in the same LAN." -msgstr "第1步,請確認 Orca Slicer 和您的列印設備在同一個區域網路上。" +msgstr "第1步,請確認 Orca Slicer 和你的列印設備在同一個區域網路上。" -#, fuzzy msgid "" "Step 2, if the IP and Access Code below are different from the actual values " "on your printer, please correct them." @@ -8800,26 +8571,27 @@ msgstr "" msgid "Access Code" msgstr "訪問碼" -#, fuzzy msgid "Where to find your printer's IP and Access Code?" msgstr "在哪裡可以找到列印設備的 IP 和訪問碼?" msgid "Step 3: Ping the IP address to check for packet loss and latency." -msgstr "" +msgstr "步驟 3:Ping 該 IP 地址以檢查封包遺失和延遲。" msgid "Test" msgstr "測試" msgid "IP and Access Code Verified! You may close the window" -msgstr "" +msgstr "IP 和存取碼已驗證!可以關閉視窗。" msgid "Connection failed, please double check IP and Access Code" -msgstr "" +msgstr "連接失敗,請再次檢查 IP 和存取碼。" msgid "" "Connection failed! If your IP and Access Code is correct, \n" "please move to step 3 for troubleshooting network issues" msgstr "" +"連接失敗!如果 IP 和存取碼正確,\n" +"請進入第 3 步進行網路問題排解。" msgid "Model:" msgstr "型號:" @@ -8876,12 +8648,11 @@ msgstr "擴展板" msgid "Saving objects into the 3mf failed." msgstr "將物件儲存到 3mf 失敗。" -#, fuzzy msgid "Only Windows 10 is supported." -msgstr "僅支援 Windows 10 作業系統。" +msgstr "僅支援 Windows 10。" msgid "Failed to initialize the WinRT library." -msgstr "無法初始化 WinRT 函式庫。。" +msgstr "無法初始化 WinRT 函式庫。" msgid "Exporting objects" msgstr "正在匯出物件" @@ -8895,7 +8666,6 @@ msgstr "透過 Windows 服務修復物件" msgid "Repair failed." msgstr "修復失敗。" -#, fuzzy msgid "Loading repaired objects" msgstr "正在載入修復的物件" @@ -8923,7 +8693,7 @@ msgstr "修復已完成" msgid "Repair canceled" msgstr "修復被取消" -#, fuzzy, boost-format +#, boost-format msgid "Copying of file %1% to %2% failed: %3%" msgstr "從 %1% 複製檔案到 %2% 失敗:%3%" @@ -8966,7 +8736,6 @@ msgid "" "collision." msgstr "" -#, fuzzy msgid "" "Failed to generate gcode for invalid custom G-code.\n" "\n" @@ -8977,9 +8746,9 @@ msgstr "" msgid "Please check the custom G-code or use the default custom G-code." msgstr "請檢查自訂 G-code,或者使用預設的。" -#, fuzzy, boost-format +#, boost-format msgid "Generating G-code: layer %1%" -msgstr "正在產生 G-code:%1% 層" +msgstr "正在產生 G-code:第 %1% 層" msgid "Inner wall" msgstr "內牆" @@ -9025,7 +8794,7 @@ msgstr "計算 %1% 的線寬失敗。無法獲得 \"%2%\" 的值" msgid "" "Invalid spacing supplied to Flow::with_spacing(), check your layer height " "and extrusion width" -msgstr "提供給 Flow::with_spacing() 的間距無效,請檢查層高和擠出寬度" +msgstr "提供給 Flow::with_spacing()的間距無效,請檢查層高和擠出寬度" msgid "undefined error" msgstr "未定義的錯誤" @@ -9120,12 +8889,12 @@ msgstr "驗證失敗" msgid "write callback failed" msgstr "寫入回調失敗" -#, fuzzy, boost-format +#, boost-format msgid "" "%1% is too close to exclusion area, there may be collisions when printing." msgstr "%1% 離不可列印區域太近,可能會發生碰撞。" -#, fuzzy, boost-format +#, boost-format msgid "%1% is too close to others, and collisions may be caused." msgstr "%1% 離其它物件太近,可能會發生碰撞。" @@ -9140,7 +8909,7 @@ msgid " is too close to exclusion area, there may be collisions when printing." msgstr "離不可列印區域太近,列印時可能會發生碰撞。" msgid "Prime Tower" -msgstr "擦拭塔" +msgstr "換料塔" msgid " is too close to others, and collisions may be caused.\n" msgstr "離其它物件太近,可能會發生碰撞。\n" @@ -9161,7 +8930,7 @@ msgstr "根據目前設定,不會進行任何列印。" msgid "" "Smooth mode of timelapse is not supported when \"by object\" sequence is " "enabled." -msgstr "平滑模式的縮時錄影不支援在逐件列印模式下使用。" +msgstr "逐件列印模式下不支援使用平滑模式的縮時錄影。" msgid "" "Please select \"By object\" print sequence to print multiple objects in " @@ -9192,9 +8961,8 @@ msgstr "雖然物件 %1% 本身符合列印體積,但最後一層超出了最 msgid "" "You might want to reduce the size of your model or change current print " "settings and retry." -msgstr "您可能想要減小模型的尺寸或更改目前的列印設定並重試。" +msgstr "你可能想要減小模型的尺寸或更改目前的列印設定並重試。" -#, fuzzy msgid "Variable layer height is not supported with Organic supports." msgstr "有機樹支撐不支持可變層高。" @@ -9207,7 +8975,7 @@ msgstr "" msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." -msgstr "擦拭塔目前僅支援相對擠出機定址 (use_relative_e_distances=1)。" +msgstr "換料塔目前僅支援相對擠出機定址 (use_relative_e_distances=1)。" msgid "" "Ooze prevention is only supported with the wipe tower when " @@ -9219,37 +8987,34 @@ msgid "" "RepRapFirmware and Repetier G-code flavors." msgstr "" -#, fuzzy msgid "The prime tower is not supported in \"By object\" print." -msgstr "逐件列印模式下無法使用擦拭塔。" +msgstr "逐件列印模式下無法使用換料塔。" -#, fuzzy msgid "" "The prime tower is not supported when adaptive layer height is on. It " "requires that all objects have the same layer height." -msgstr "可變層高開啟時無法使用擦拭塔。它要求所有物件擁有相同的層高。" +msgstr "可變層高開啟時無法使用換料塔。它要求所有物件擁有相同的層高。" msgid "The prime tower requires \"support gap\" to be multiple of layer height" -msgstr "擦拭塔要求”支撐間隙“為層高的整數倍數。" +msgstr "換料塔要求\"支撐間隙\"為層高的整數倍數。" msgid "The prime tower requires that all objects have the same layer heights" -msgstr "擦拭塔要求各個物件擁有同樣的層高。" +msgstr "換料塔要求各個物件擁有同樣的層高。" msgid "" "The prime tower requires that all objects are printed over the same number " "of raft layers" -msgstr "擦拭塔要求各個物件使用同樣的筏層數量。" +msgstr "換料塔要求各個物件使用同樣的筏層數量。" msgid "" "The prime tower requires that all objects are sliced with the same layer " "heights." -msgstr "擦拭塔要求各個物件擁有同樣的層高。" +msgstr "換料塔要求各個物件擁有同樣的層高。" -#, fuzzy msgid "" "The prime tower is only supported if all objects have the same variable " "layer height" -msgstr "各個物件的層高存在差異,無法啟用擦拭塔" +msgstr "各個物件的層高存在差異,無法啟用換料塔" msgid "Too small line width" msgstr "線寬太小" @@ -9259,9 +9024,8 @@ msgstr "線寬太大" msgid "" "The prime tower requires that support has the same layer height with object." -msgstr "擦拭塔要求支撐和物件採用同樣的層高。" +msgstr "換料塔要求支撐和物件採用同樣的層高。" -#, fuzzy msgid "" "Organic support tree tip diameter must not be smaller than support material " "extrusion width." @@ -9277,7 +9041,6 @@ msgid "" "diameter." msgstr "有機樹狀支撐枝直徑不得小於支撐樹梢直徑。" -#, fuzzy msgid "" "Support enforcers are used but support is not enabled. Please enable support." msgstr "使用支撐添加器但沒有打開支撐。請打開支撐。" @@ -9305,7 +9068,7 @@ msgid "" "extruder addressing." msgstr "在 layer_gcode 中發現 \"G92 E0\",它與絕對擠出機尋址不相容。" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "Plate %d: %s does not support filament %s" msgstr "列印板 %d:%s 不支援線材 %s" @@ -9345,7 +9108,6 @@ msgid "" "filaments differs significantly." msgstr "" -#, fuzzy msgid "Generating skirt & brim" msgstr "正在產生 skirt 和 brim(裙邊)" @@ -9372,7 +9134,7 @@ msgid "" "polygon by points in following format: \"XxY, XxY, ...\"" msgstr "" "XY 平面上的不可列印區域。例如,X1系列設備在換料過程中,會使用左前角區域來切斷" -"線材。這個多邊形區域由以下格式的點表示:“XxY,XxY,…”" +"線材。這個多邊形區域由以下格式的點表示:\"XxY,XxY,…\"" #, fuzzy msgid "Bed custom texture" @@ -9413,15 +9175,14 @@ msgstr "每一層的切片高度。越小的層高意味著更高的精度和更 msgid "Printable height" msgstr "可列印高度" -#, fuzzy msgid "Maximum printable height which is limited by mechanism of printer" -msgstr "最大可列印高度受列印設備硬體限制" +msgstr "受列印設備硬體限制的最大可列印高度" msgid "Preferred orientation" msgstr "" msgid "Automatically orient stls on the Z-axis upon initial import" -msgstr "" +msgstr "匯入STL時自動對齊Z軸" #, fuzzy msgid "Printer preset names" @@ -9451,10 +9212,9 @@ msgstr "" msgid "Device UI" msgstr "設備使用者界面" -#, fuzzy msgid "" "Specify the URL of your device user interface if it's not same as print_host" -msgstr "如果列印設備的使用者界面 URL 不同,請在此指定。" +msgstr "如果列印設備的使用者界面 URL 不同,請輸入在此。" msgid "API Key / Password" msgstr "API Key / 密碼" @@ -9467,7 +9227,6 @@ msgstr "" "Orca slicer 可以將 G-code 檔案上傳到列印設備。此欄位應包含用於身份驗證的 API " "金鑰或密碼。" -#, fuzzy msgid "Name of the printer" msgstr "列印設備名稱" @@ -9524,15 +9283,14 @@ msgstr "空駛時繞過外牆以避免在模型外觀表面產生斑點" msgid "Avoid crossing wall - Max detour length" msgstr "避免跨越外牆-最大繞行長度" -#, fuzzy msgid "" "Maximum detour distance for avoiding crossing wall. Don't detour if the " "detour distance is large than this value. Detour length could be specified " -"either as an absolute value or as percentage (for example 50%) of a direct " +"either as an absolute value or as percentage (for example 50%)of a direct " "travel path. Zero to disable" msgstr "" -"避免跨越外牆時的最大繞行距離。如果繞行距離大於該數值,則空駛不繞行。繞行距離" -"可指定為絕對值或直接空駛路徑的百分比(例如 50%)。0 表示禁用" +"避免跨越外牆時的最大繞行距離。如果繞行距離大於該數值,則不繞行。繞行距離" +"可為絕對值或直線路徑的百分比(例如 50%)。0 表示禁用" msgid "mm or %" msgstr "mm 或 %" @@ -9540,7 +9298,6 @@ msgstr "mm 或 %" msgid "Other layers" msgstr "其它層" -#, fuzzy msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Cool Plate" @@ -9570,7 +9327,7 @@ msgstr "除首層外的熱床溫度。0 值表示這個線材不支援高溫列 msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Textured PEI Plate" -msgstr "除首層外的熱床溫度。0 值表示這個線材不支援金屬紋理 PEI 列印板" +msgstr "除首層外的熱床溫度。0 值表示這個線材不支援紋理 PEI 列印板" msgid "Initial layer" msgstr "首層" @@ -9605,7 +9362,7 @@ msgstr "首層熱床溫度。0 值表示這個線材不支援高溫列印板" msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Textured PEI Plate" -msgstr "首層熱床溫度。0 值表示這個線材不支援金屬紋理 PEI 列印板" +msgstr "首層熱床溫度。0 值表示這個線材不支援紋理 PEI 列印板" #, fuzzy msgid "Bed types supported by the printer" @@ -9666,7 +9423,7 @@ msgstr "" "完全由底部殼體層數決定" msgid "Apply gap fill" -msgstr "" +msgstr "間隙填充" msgid "" "Enables gap fill for the selected solid surfaces. The minimum gap length " @@ -9700,12 +9457,11 @@ msgid "Everywhere" msgstr "全部" msgid "Top and bottom surfaces" -msgstr "" +msgstr "頂部與底部" msgid "Nowhere" -msgstr "" +msgstr "無" -#, fuzzy msgid "Force cooling for overhang and bridge" msgstr "懸空/橋接強制冷卻" @@ -9715,7 +9471,6 @@ msgid "" "bridge to get better cooling" msgstr "勾選這個選項將自動最佳化橋接和懸空的風扇轉速以獲得更好的冷卻" -#, fuzzy msgid "Fan speed for overhang" msgstr "懸空風扇速度" @@ -9725,7 +9480,7 @@ msgid "" "wall which has large overhang degree. Forcing cooling for overhang and " "bridge can get better quality for these part" msgstr "" -"當列印橋接和超過臨界值設定的懸空時,強制部件冷卻風扇為設定的速度數值。強制冷" +"當列印橋接和超過臨界值設定的懸空時,強制物件冷卻風扇為設定的速度數值。強制冷" "卻能夠使懸空和橋接獲得更好的列印品質" msgid "Cooling overhang threshold" @@ -9739,11 +9494,9 @@ msgid "" "all outer wall no matter how much overhang degree" msgstr "" -#, fuzzy msgid "Bridge infill direction" msgstr "橋接填充角度" -#, fuzzy msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for " @@ -9764,7 +9517,7 @@ msgid "Bridge flow ratio" msgstr "橋接流量" msgid "" -"Decrease this value slightly(for example 0.9) to reduce the amount of " +"Decrease this value slightly(for example 0.9)to reduce the amount of " "material for bridge, to improve sag. \n" "\n" "The actual bridge flow used is calculated by multiplying this value with the " @@ -9772,12 +9525,12 @@ msgid "" msgstr "" msgid "Internal bridge flow ratio" -msgstr "" +msgstr "內部橋接流量" msgid "" "This value governs the thickness of the internal bridge layer. This is the " "first layer over sparse infill. Decrease this value slightly (for example " -"0.9) to improve surface quality over sparse infill.\n" +"0.9)to improve surface quality over sparse infill.\n" "\n" "The actual internal bridge flow used is calculated by multiplying this value " "with the bridge flow ratio, the filament flow ratio, and if set, the " @@ -9805,7 +9558,6 @@ msgid "" "value with the filament flow ratio, and if set, the object's flow ratio." msgstr "" -#, fuzzy msgid "Precise wall" msgstr "精準外牆尺寸" @@ -9825,7 +9577,7 @@ msgid "" msgstr "頂面只使用單層牆,從而更多的空間能夠使用頂部填充圖案" msgid "One wall threshold" -msgstr "單層牆臨界值" +msgstr "單壁閾值" #, no-c-format, no-boost-format msgid "" @@ -9839,7 +9591,7 @@ msgid "" "artifacts." msgstr "" "如果頂面需要列印,但是它的一部分被其它層覆蓋,那麼當它的寬度小於這個值時,它" -"不會被認為是頂層。這個設定可以用於避免在狹窄頂面上觸發“頂面單層牆”。這個值可" +"不會被認為是頂層。這個設定可以用於避免在狹窄頂面上觸發\"頂面單層牆\"。這個值可" "以是 mm 或線寬的 %。\n" "警告:如果啟用該選項,可能會在下一層上產生一些薄的特徵,比如字母。將此設定設" "為 0 可以消除這些偽影。" @@ -9853,19 +9605,20 @@ msgid "" msgstr "首層只使用單層牆,從而更多的空間能夠使用底部填充圖案" msgid "Extra perimeters on overhangs" -msgstr "懸空上的額外周長" +msgstr "懸挑上的額外周長" msgid "" "Create additional perimeter paths over steep overhangs and areas where " "bridges cannot be anchored. " -msgstr "在陡峭的懸空和無法固定橋接的區域中增加額外的周長路徑。" +msgstr "" +"在陡峭的懸空和無法固定橋接的區域中增加額外的周長路徑。" msgid "Reverse on even" -msgstr "" +msgstr "偶數反向" #, fuzzy msgid "Overhang reversal" -msgstr "懸空反轉" +msgstr "懸空反向" msgid "" "Extrude perimeters that have a part over an overhang in the reverse " @@ -9875,9 +9628,12 @@ msgid "" "This setting can also help reduce part warping due to the reduction of " "stresses in the part walls." msgstr "" +"在偶數層上,對於有懸挑部分的外圍輪廓,採用反向擠出。這種交替模式可以大幅改善陡峭的懸挑。\n" +"\n" +"此設定還有助於減少因零件牆壁應力降低而導致的變形。" msgid "Reverse only internal perimeters" -msgstr "" +msgstr "僅在內圍輪廓反向" msgid "" "Apply the reverse perimeters logic only on internal perimeters. \n" @@ -9895,7 +9651,7 @@ msgid "" msgstr "" msgid "Bridge counterbore holes" -msgstr "" +msgstr "橋接沉孔" msgid "" "This option creates bridges for counterbore holes, allowing them to be " @@ -9904,12 +9660,16 @@ msgid "" "2. Partially Bridged: Only a part of the unsupported area will be bridged.\n" "3. Sacrificial Layer: A full sacrificial bridge layer is created." msgstr "" +"此選項為沉孔創建橋接,使其可以無需支撐地列印。可用模式包括:\n" +"1. 無:不創建橋接。\n" +"2. 部分橋接:只有部分無支撐區域會被橋接。\n" +"3. 犧牲層:創建一層完整的祭層橋接。" msgid "Partially bridged" -msgstr "" +msgstr "部分橋接" msgid "Sacrificial layer" -msgstr "" +msgstr "犧牲層" msgid "Reverse threshold" msgstr "反轉臨界值" @@ -9925,6 +9685,8 @@ msgid "" "When Detect overhang wall is not enabled, this option is ignored and " "reversal happens on every even layers regardless." msgstr "" +"懸挑需要達到的毫米數,才會反向列印。可以是周邊寬度的百分比。\n" +"值為 0 時,將在每個偶數層啟用反向列印。" msgid "Classic mode" msgstr "經典模式" @@ -9932,16 +9694,14 @@ msgstr "經典模式" msgid "Enable this option to use classic mode" msgstr "開啟此選項以使用經典模式" -#, fuzzy msgid "Slow down for overhang" -msgstr "懸空降速" +msgstr "懸空處降速" msgid "Enable this option to slow printing down for different overhang degree" msgstr "打開這個選項將降低不同懸垂程度的走線的列印速度" -#, fuzzy msgid "Slow down for curled perimeters" -msgstr "翹邊降速" +msgstr "翹邊處降速" #, no-c-format, no-boost-format msgid "" @@ -9967,7 +9727,6 @@ msgstr "" msgid "mm/s or %" msgstr "mm/s 或 %" -#, fuzzy msgid "External" msgstr "外部" @@ -9979,11 +9738,14 @@ msgid "" "are supported by less than 13%, whether they are part of a bridge or an " "overhang." msgstr "" +"外部可見橋接擠出速度。\n" +"\n" +"如果禁用了「翹邊處降速」或啟用了「經典懸挑模式」,則它將是支撐不足 13% 的懸挑牆的列印速度," +"無論它們是橋接的一部分還是懸挑。" msgid "mm/s" -msgstr "mm/s" +msgstr "" -#, fuzzy msgid "Internal" msgstr "內部" @@ -9991,18 +9753,16 @@ msgid "" "Speed of internal bridges. If the value is expressed as a percentage, it " "will be calculated based on the bridge_speed. Default value is 150%." msgstr "" +"內部橋接速度。如果該值以百分比表示,將基於 bridge_speed 進行計算。預設值為 150%" -#, fuzzy msgid "Brim width" -msgstr "Brim(裙邊) 寬度" +msgstr "Brim(裙邊)寬度" -#, fuzzy msgid "Distance from model to the outermost brim line" -msgstr "從模型到最外圈 brim(裙邊) 走線的距離" +msgstr "從模型到 brim(裙邊)最外圈的距離" -#, fuzzy msgid "Brim type" -msgstr "Brim(裙邊) 類型" +msgstr "Brim(裙邊)類型" #, fuzzy msgid "" @@ -10012,20 +9772,17 @@ msgstr "" "該參數控制在模型的外側和/或內側產生 brim(裙邊)。自動是指自動分析和計算邊框" "的寬度。" -#, fuzzy msgid "Brim-object gap" -msgstr "Brim(裙邊) 與模型的間隙" +msgstr "Brim(裙邊)與模型的間隙" -#, fuzzy msgid "" "A gap between innermost brim line and object can make brim be removed more " "easily" -msgstr "在 brim(裙邊)和模型之間設定間隙,能夠讓 brim(裙邊)更容易剝離" +msgstr "在 brim(裙邊)和模型之間設定間隙,能夠讓 brim(裙邊)更容易拆除" msgid "Brim ears" msgstr "圓盤" -#, fuzzy msgid "Only draw brim over the sharp edges of the model." msgstr "僅在模型的鋒利邊緣上產生Brim(裙邊)。" @@ -10053,7 +9810,6 @@ msgstr "" "在偵測尖銳角度之前,幾何形狀將被簡化。此參數表示簡化的最小偏差長度。\n" "設為 0 以停用" -#, fuzzy msgid "Compatible machine" msgstr "相容的設備" @@ -10100,8 +9856,8 @@ msgid "" "that layer can be cooled for longer time. This can improve the cooling " "quality for needle and small details" msgstr "" -"勾選這個選項,將降低列印速度,使得最終的層列印時間不小於\"最大風扇速度臨界值" -"\"裡的層時間臨界值,從而使得該層獲得更久的冷卻。這能夠改善尖頂和小細節的冷卻" +"勾選這個選項,將降低列印速度,使得最終的層列印時間不小於\"最大風扇速度臨界值\"" +"裡的層時間臨界值,從而使得該層獲得更久的冷卻。這能夠改善尖頂和小細節的冷卻" "效果" msgid "Normal printing" @@ -10115,7 +9871,6 @@ msgstr "除首層之外的預設的列印和空駛的加速度" msgid "mm/s²" msgstr "mm/s²" -#, fuzzy msgid "Default filament profile" msgstr "預設線材設定檔" @@ -10123,7 +9878,6 @@ msgstr "預設線材設定檔" msgid "Default filament profile when switch to this machine profile" msgstr "切換設備自動更換預設線材設定檔" -#, fuzzy msgid "Default process profile" msgstr "預設切片設定檔" @@ -10131,18 +9885,15 @@ msgstr "預設切片設定檔" msgid "Default process profile when switch to this machine profile" msgstr "切換設備自動更換預設切片設定檔" -#, fuzzy msgid "Activate air filtration" msgstr "開啟空氣過濾器/排風扇" -#, fuzzy msgid "Activate for better air filtration. G-code command: M106 P3 S(0-255)" msgstr "啟動空氣過濾器/排風扇。 G-code 指令:M106 P3 S(0-255)" msgid "Fan speed" msgstr "風扇速度" -#, fuzzy msgid "" "Speed of exhaust fan during printing.This speed will overwrite the speed in " "filament custom gcode" @@ -10151,21 +9902,19 @@ msgstr "列印過程中排風扇的速度。此速度將覆蓋線材自訂 G-cod msgid "Speed of exhaust fan after printing completes" msgstr "列印完成後排風扇的轉速" -#, fuzzy msgid "No cooling for the first" -msgstr "對前N層關閉部件風扇" +msgstr "前N層關閉零件風扇" #, fuzzy msgid "" "Close all cooling fan for the first certain layers. Cooling fan of the first " "layer used to be closed to get better build plate adhesion" msgstr "" -"對開始的一些層關閉所有的部件冷卻風扇。通常關閉首層冷卻用來獲得更好的首層黏附" +"對開始的一些層關閉所有的物件冷卻風扇。通常關閉首層冷卻用來獲得更好的首層黏附" msgid "Don't support bridges" msgstr "不支撐橋接" -#, fuzzy msgid "" "Don't support the whole bridge area which make support very large. Bridge " "usually can be printing directly without support if not very long" @@ -10186,15 +9935,17 @@ msgstr "" msgid "Thick internal bridges" msgstr "" +"增厚內部橋接" msgid "" "If enabled, thick internal bridges will be used. It's usually recommended to " "have this feature turned on. However, consider turning it off if you are " "using large nozzles." msgstr "" +"如果啟用,將使用較厚的內部橋接。通常建議開啟此功能。但如果使用較大的噴嘴,可考慮關閉此選項。" msgid "Filter out small internal bridges (beta)" -msgstr "" +msgstr "篩選掉短的內部橋接(beta)" msgid "" "This option can help reducing pillowing on top surfaces in heavily slanted " @@ -10224,47 +9975,61 @@ msgid "" "overhang. This option is useful for heavily slanted top surface models. " "However, in most cases it creates too many unnecessary bridges." msgstr "" +"此選項有助於減少在大幅傾斜或曲面的模型上頂部表面瑕疵。\n" +"\n" +"預設情況下,小型內部橋接會被篩選掉,內部實心填充會直接印刷在稀疏填充上。這在大多數情況下" +"運作良好,能加速列印並且不會過度影響頂部表面質量。\n" +"\n" +"在大幅傾斜或曲面的模型中,特別是當使用過低的稀疏填充密度時,這可能會導致支撐不夠的實心" +"填充翹曲,進而造成瑕疵。\n" +"\n" +"禁用此選項將在稍微未支撐的內部實心填充區列印內部橋接層。以下選項控制篩選的程度(創建" +"內部橋接的數量)。\n" +"\n" +"篩選 - 啟用此選項。這是預設行為,並且在大多數情況下運作良好。\n" +"\n" +"有限篩選 - 僅在大幅傾斜的表面上創建內部橋接。這對大多數困難模型來說效果良好。\n" +"\n" +"不篩選 - 在每個可能的內部懸挑處創建內部橋接。這個選項對於大幅傾斜的頂部表面模型很有用。" +"然而,在大多數情況下,它會創建過多不必要的橋接。" msgid "Filter" -msgstr "" +msgstr "篩選" msgid "Limited filtering" -msgstr "" +msgstr "局部篩選" msgid "No filtering" -msgstr "" +msgstr "不篩選" msgid "Max bridge length" msgstr "最大橋接長度" -#, fuzzy msgid "" "Max length of bridges that don't need support. Set it to 0 if you want all " "bridges to be supported, and set it to a very large value if you don't want " "any bridges to be supported." msgstr "" -"不需要支撐的橋接的最大長度。如果希望支援所有橋接,請將其設定為 0;如果不希望" +"不需要支撐的橋接最大長度。如果希望支援所有橋接,請將其設定為 0;如果不希望" "支援任何橋接,請將其設定為非常大的值。" -#, fuzzy msgid "End G-code" msgstr "結尾 G-code" -#, fuzzy msgid "End G-code when finish the whole printing" msgstr "所有列印結束時的結尾 G-code" msgid "Between Object Gcode" -msgstr "" +msgstr "物件分隔" msgid "" "Insert Gcode between objects. This parameter will only come into effect when " "you print your models object by object" msgstr "" +"在物件之間插入 Gcode。此參數僅在逐次列印時生效。" -#, fuzzy msgid "End G-code when finish the printing of this filament" -msgstr "結束使用該耗材列印時的結尾 G-code" +msgstr "使用該線材列印結束時的結尾 G-code" msgid "Ensure vertical shell thickness" msgstr "確保垂直外殼厚度" @@ -10337,11 +10102,10 @@ msgid "" "nozzle diameter." msgstr "外牆的線寬。如果以 % 表示,將以噴嘴直徑為基準來計算" -#, fuzzy msgid "" "Speed of outer wall which is outermost and visible. It's used to be slower " "than inner wall speed to get better quality." -msgstr "外牆的列印速度。它通常使用比內壁速度慢的速度,以獲得更好的列印品質。" +msgstr "外牆的列印速度。它通常比內壁速度慢,以獲得更好的列印品質。" msgid "Small perimeters" msgstr "微小部位" @@ -10349,7 +10113,7 @@ msgstr "微小部位" msgid "" "This separate setting will affect the speed of perimeters having radius <= " "small_perimeter_threshold (usually holes). If expressed as percentage (for " -"example: 80%) it will be calculated on the outer wall speed setting above. " +"example: 80%)it will be calculated on the outer wall speed setting above. " "Set to zero for auto." msgstr "" "這個單獨的設定將影響半徑 <= small_perimeter_threshold(通常是圓孔)的周長的速" @@ -10364,10 +10128,10 @@ msgid "" msgstr "這設定了微小部位周長的臨界值。 預設臨界值是 0mm" msgid "Walls printing order" -msgstr "" +msgstr "牆列印順序" msgid "" -"Print sequence of the internal (inner) and external (outer) walls. \n" +"Print sequence of the internal (inner)and external (outer)walls. \n" "\n" "Use Inner/Outer for best overhangs. This is because the overhanging walls " "can adhere to a neighbouring perimeter while printing. However, this option " @@ -10392,16 +10156,16 @@ msgid "" msgstr "" msgid "Inner/Outer" -msgstr "" +msgstr "裡/外" msgid "Outer/Inner" -msgstr "" +msgstr "外/裡" msgid "Inner/Outer/Inner" -msgstr "" +msgstr "裡/外/裡" msgid "Print infill first" -msgstr "" +msgstr "先列印填充" msgid "" "Order of wall/infill. When the tickbox is unchecked the walls are printed " @@ -10415,7 +10179,7 @@ msgid "" msgstr "" msgid "Wall loop direction" -msgstr "" +msgstr "牆方向" msgid "" "The direction which the wall loops are extruded when looking down from the " @@ -10427,12 +10191,18 @@ msgid "" "\n" "This option will be disabled if spiral vase mode is enabled." msgstr "" +"從上方觀看時,牆擠出方向。\n" +"\n" +"預設情況下,所有牆面都是以逆時針方向擠出,除非啟用了「偶數反向」。將此設置為「自動」以外的" +"任何選項,將強制牆面方向,無論是否啟用了「偶數反向」。\n" +"\n" +"如果啟用了花瓶模式,這個選項將被禁用。" msgid "Counter clockwise" -msgstr "" +msgstr "逆時針" msgid "Clockwise" -msgstr "" +msgstr "順時針" msgid "Height to rod" msgstr "到橫杆高度" @@ -10493,7 +10263,7 @@ msgid "Probe point distance" msgstr "" msgid "" -"This option sets the preferred distance between probe points (grid size) for " +"This option sets the preferred distance between probe points (grid size)for " "the X and Y directions, with the default being 50mm for both X and Y." msgstr "" @@ -10504,13 +10274,13 @@ msgid "" "This option determines the additional distance by which the adaptive bed " "mesh area should be expanded in the XY directions." msgstr "" +"此選項決定自適應床面網格區域在 XY 方向上應該擴展的額外距離。" msgid "Extruder Color" msgstr "擠出機顏色" -#, fuzzy msgid "Only used as a visual help on UI" -msgstr "作為使用者介面上的輔助" +msgstr "作為介面上的輔助" msgid "Extruder offset" msgstr "擠出機偏移" @@ -10518,7 +10288,6 @@ msgstr "擠出機偏移" msgid "Flow ratio" msgstr "流量比例" -#, fuzzy msgid "" "The material may have volumetric change after switching between molten state " "and crystalline state. This setting changes all extrusion flow of this " @@ -10527,7 +10296,7 @@ msgid "" "has slight overflow or underflow" msgstr "" "線材經過融化後凝固可能會產生體積差異。這個設定會等比例改變所有擠出走線的擠出" -"量。推薦的範圍為 0.95 到 1.05。發現大平層模型的頂面有輕微的缺料或多料時,或許" +"量。推薦的範圍為 0.95 到 1.05。發現模型的平面有輕微的缺料或多料時,或許" "可以嘗試微調這個參數。" msgid "" @@ -10540,6 +10309,11 @@ msgid "" "The final object flow ratio is this value multiplied by the filament flow " "ratio." msgstr "" +"線材經過融化後凝固可能會產生體積差異。這個設定會等比例改變所有擠出走線的擠出" +"量。推薦的範圍為 0.95 到 1.05。發現模型的平面有輕微的缺料或多料時,或許" +"可以嘗試微調這個參數。" +"\n" +"最終物體流量比是此值與線材流量比的乘積。" msgid "Enable pressure advance" msgstr "啟用壓力提前" @@ -10550,16 +10324,16 @@ msgid "" msgstr "啟用壓力提前,一旦啟用會覆蓋自動校準的結果" #, fuzzy -msgid "Pressure advance(Klipper) AKA Linear advance factor(Marlin)" +msgid "Pressure advance(Klipper)AKA Linear advance factor(Marlin)" msgstr "壓力提前(Klipper)或者線性提前(Marlin)" msgid "Enable adaptive pressure advance (beta)" -msgstr "" +msgstr "啟用進階壓力提前 (beta)" #, no-c-format, no-boost-format msgid "" "With increasing print speeds (and hence increasing volumetric flow through " -"the nozzle) and increasing accelerations, it has been observed that the " +"the nozzle)and increasing accelerations, it has been observed that the " "effective PA value typically decreases. This means that a single PA value is " "not always 100% optimal for all features and a compromise value is usually " "used that does not cause too much bulging on features with lower flow speed " @@ -10579,11 +10353,11 @@ msgid "" msgstr "" msgid "Adaptive pressure advance measurements (beta)" -msgstr "" +msgstr "自適應壓力提前測量(beta)" #, no-c-format, no-boost-format msgid "" -"Add sets of pressure advance (PA) values, the volumetric flow speeds and " +"Add sets of pressure advance (PA)values, the volumetric flow speeds and " "accelerations they were measured at, separated by a comma. One set of values " "per line. For example\n" "0.04,3.96,3000\n" @@ -10613,7 +10387,7 @@ msgid "" msgstr "" msgid "Enable adaptive pressure advance for overhangs (beta)" -msgstr "" +msgstr "啟用懸挑自適應壓力提前(beta)" msgid "" "Enable adaptive PA for overhangs as well as when flow changes within the " @@ -10621,9 +10395,12 @@ msgid "" "set accurately, it will cause uniformity issues on the external surfaces " "before and after overhangs.\n" msgstr "" +"啟用自適應 PA 以應對懸挑以及同一特徵內流量變化。" +"這是一個實驗性選項,因為如果 PA 配置未準確設定,可能會在懸挑前後的外部表面上造成均勻" +"性問題。\n" msgid "Pressure advance for bridges" -msgstr "" +msgstr "橋接壓力提前" msgid "" "Pressure advance value for bridges. Set to 0 to disable. \n" @@ -10633,8 +10410,11 @@ msgid "" "pressure drop in the nozzle when printing in the air and a lower PA helps " "counteract this." msgstr "" +"橋接的壓力提前值。設為 0 可禁用。\n" +"\n" +"在列印橋接時,較低的 PA 值有助於減少橋接結束後出現的輕微欠擠壓現象。" +"這是由於列印空中時噴嘴內部壓力下降,較低的 PA 值有助於抵消這個問題。" -#, fuzzy msgid "" "Default line width if other line widths are set to 0. If expressed as a %, " "it will be computed over the nozzle diameter." @@ -10644,16 +10424,15 @@ msgstr "" msgid "Keep fan always on" msgstr "保持風扇永遠開啟" -#, fuzzy msgid "" "If enable this setting, part cooling fan will never be stopped and will run " "at least at minimum speed to reduce the frequency of starting and stopping" msgstr "" -"如果勾選這個選項,部件冷卻風扇將永遠不會停止,並且會以最小風扇轉速設定值持運" +"如果勾選這個選項,物件冷卻風扇將不會停止,並且會以最小風扇轉速設定值" "運轉以減少風扇的頻繁開關" msgid "Don't slow down outer walls" -msgstr "" +msgstr "列印外牆不減速" msgid "" "If enabled, this setting will ensure external perimeters are not slowed down " @@ -10663,21 +10442,27 @@ msgid "" " 1. To avoid changes in shine when printing glossy filaments \n" "2. To avoid changes in external wall speed which may create slight wall " "artifacts that appear like z banding \n" -"3. To avoid printing at speeds which cause VFAs (fine artifacts) on the " +"3. To avoid printing at speeds which cause VFAs (fine artifacts)on the " "external walls\n" "\n" msgstr "" +"如果啟用,這個設定將確保外圍輪廓不會因為達到最小層時間而減慢速度。" +"這在以下情境中特別有幫助:\n" +"\n" +" 1. 避免在列印光面材料時發生光澤變化\n" +" 2. 避免外牆速度變化,這可能會產生類似Z帶紋的牆面瑕疵\n" +" 3. 避免以會在外牆上造成細微瑕疵(細節瑕疵,VFA)速度列印\n" +"\n" msgid "Layer time" msgstr "層時間" -#, fuzzy msgid "" "Part cooling fan will be enabled for layers of which estimated time is " "shorter than this value. Fan speed is interpolated between the minimum and " "maximum fan speeds according to layer printing time" msgstr "" -"當層預估列印時間小於該數值時,部件冷卻風扇將會被開啟。風扇轉速將根據層列印時" +"當層預估列印時間小於該數值時,物件冷卻風扇將會被開啟。風扇轉速將根據層列印時" "間在最大和最小風扇轉速之間自動調整" msgid "Default color" @@ -10690,7 +10475,7 @@ msgid "Filament notes" msgstr "線材備註" msgid "You can put your notes regarding the filament here." -msgstr "您可以將有關線材的備註存放在這裡。" +msgstr "你可以將有關線材的備註存放在這裡。" msgid "Required nozzle HRC" msgstr "噴嘴硬度要求" @@ -10700,14 +10485,13 @@ msgid "" "of nozzle's HRC." msgstr "列印此線材的所需的最小噴嘴硬度。零值表示不檢查噴嘴硬度。" -#, fuzzy msgid "" "This setting stands for how much volume of filament can be melted and " "extruded per second. Printing speed is limited by max volumetric speed, in " "case of too high and unreasonable speed setting. Can't be zero" msgstr "" -"這個設定表示在 1 秒內能夠融化和擠出的線材體積。列印速度會受到最大體積速度的限" -"制,防止設定過高和不合理的速度。不允許設定為 0。" +"這個設定表示每秒能夠融化和擠出的線材體積。列印速度會受限於到最大體積速度," +"防止設定過高和不合理的速度。不允許設定為 0。" msgid "mm³/s" msgstr "mm³/s" @@ -10754,7 +10538,7 @@ msgid "" "Internally it is converted to filament_diameter. All other volume " "calculations remain the same.\n" "\n" -"filament_diameter = sqrt( (4 * pellet_flow_coefficient) / PI )" +"filament_diameter = sqrt( (4 * pellet_flow_coefficient)/ PI )" msgstr "" msgid "Shrinkage (XY)" @@ -10768,9 +10552,9 @@ msgid "" "Be sure to allow enough space between objects, as this compensation is done " "after the checks." msgstr "" -"冷卻後耗材會收縮的百分比(如果測量的長度是 94mm 而不是 100mm,則為是收縮率為 " +"冷卻後線材會收縮的百分比(如果測量的長度是 94mm 而不是 100mm,則為是收縮率為 " "94%)\n" -"補償將按比例縮放 xy 軸該補償僅考慮牆壁所使用的耗材\n" +"補償將按比例縮放 xy 軸該補償僅考慮牆壁所使用的線材\n" "請確保物體之間有足夠的間距,因為補償是在邊界檢查之後進行" msgid "Shrinkage (Z)" @@ -10783,14 +10567,12 @@ msgid "" "compensate." msgstr "" -#, fuzzy msgid "Loading speed" msgstr "進料速度" msgid "Speed used for loading the filament on the wipe tower." -msgstr "將線材擠出到擦拭塔上的速度。" +msgstr "將線材擠出到換料塔上的速度。" -#, fuzzy msgid "Loading speed at the start" msgstr "啟動時進料速度" @@ -10805,12 +10587,11 @@ msgstr "退料速度" msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." -msgstr "使用於擦拭塔上退料的速度(不影響尖端成型之後初始部分的速度)。" +msgstr "使用於換料塔上退料的速度(不影響尖端成型之後初始部分的速度)。" msgid "Unloading speed at the start" msgstr "退料初始速度" -#, fuzzy msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "線材尖端成型後立即退料的速度。" @@ -10856,7 +10637,7 @@ msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "從這個速度開始冷卻移動逐漸加速。" msgid "Minimal purge on wipe tower" -msgstr "擦拭塔上的最小清理量" +msgstr "換料塔上的最小清理量" msgid "" "After a tool change, the exact position of the newly loaded filament inside " @@ -10865,8 +10646,8 @@ msgid "" "object, Orca Slicer will always prime this amount of material into the wipe " "tower to produce successive infill or sacrificial object extrusions reliably." msgstr "" -"換色後,新載入的線材在噴嘴內的確切位置可能未知,耗材壓力可能還不穩定。在沖刷" -"列印頭到填充或作為擠出廢料之前,將始終將這些的線材沖刷到擦拭塔中以產生連續的" +"換色後,新載入的線材在噴嘴內的確切位置可能未知,線材壓力可能還不穩定。在沖刷" +"列印頭到填充或作為擠出廢料之前,將始終將這些的線材沖刷到換料塔中以產生連續的" "填充或穩定的擠出廢料。" msgid "Speed of the last cooling move" @@ -10893,7 +10674,7 @@ msgid "" "the toolchange. This option is only used when the wipe tower is enabled." msgstr "" "多色列印設備執行尖端成型時(即,當列印設備設定中的單擠出機多材料未選取時)。" -"選取時,在換色之前,會迅速擠出少量線材絲到擦拭塔上。此選項僅在啟用擦拭塔時使" +"選取時,在換色之前,會迅速擠出少量線材絲到換料塔上。此選項僅在啟用換料塔時使" "用。" msgid "Multi-tool ramming volume" @@ -10951,15 +10732,14 @@ msgstr "價格" msgid "Filament price. For statistics only" msgstr "線材的價格。只用於統計資訊。" -#, fuzzy msgid "money/kg" msgstr "元/公斤" msgid "Vendor" -msgstr "供應商" +msgstr "廠牌" msgid "Vendor of filament. For show only" -msgstr "列印線材的供應商。僅用於展示。" +msgstr "列印線材的廠牌。僅用於展示。" msgid "(Undefined)" msgstr "(未定義)" @@ -11037,10 +10817,9 @@ msgstr "" msgid "Sparse infill anchor length" msgstr "稀疏填充錨線長度" -#, fuzzy 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 " +"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 " @@ -11050,11 +10829,11 @@ msgid "" "Set this parameter to zero to disable anchoring perimeters connected to a " "single infill line." msgstr "" -"用附加周長的一小段將填充線連接到內部周長。如果以百分比(例如:15%)表示,則計" -"算填充拉伸寬度。Orca Slicer 試圖將兩條緊密的填充線連接到一個短的周長段。如果" -"找不到短於“填充”和“錨點”最大值的周長線段,則填充線僅在一側連接到周長線段,並" -"且所取周長線段的長度僅限於此參數,但不超過“錨點長度”最大值。將此參數設定為" -"零,以禁用連接到單個填充線的錨點周長。" +"將內填充線連接到內牆邊緣,並使用一小段額外的邊緣。如果以百分比表示(例如:15%)," +"則是基於內填充擠出寬度來計算。Orca Slicer 會嘗試將兩條相近的內填充線連接到一段短邊緣。" +"如果找不到小於 infill_anchor_max 的邊緣段,則內填充線將只連接到一側的邊緣段," +"且所選的邊緣段長度會限制在此參數範圍內,但不超過\"錨點長度\"最大值。若將此參數設為零," +"則會禁用連接到單一內填充線的錨固邊緣。" #, fuzzy msgid "0 (no open anchors)" @@ -11066,10 +10845,9 @@ msgstr "1000(無限制)" msgid "Maximum length of the infill anchor" msgstr "填充錨線的最大長度" -#, fuzzy 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 " +"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 this parameter is found, the infill line is connected " @@ -11079,26 +10857,24 @@ msgid "" "If set to 0, the old algorithm for infill connection will be used, it should " "create the same result as with 1000 & 0." msgstr "" -"用附加周長的一小段將填充線連接到內部周長。如果以百分比(例如:15%)表示,則計" -"算填充拉伸寬度。Orca Slicer 試圖將兩條緊密的填充線連接到一個短的周長段。如果" -"找不到比此參數短的周長線段,則填充線僅在一側連接到周長線段,並且所採用的周長" -"線段的長度僅限於 infl_anchor,但不超過此參數。將此參數設定為零以禁用錨點。" +"將內填充線連接到內牆邊緣,並使用一小段額外的邊緣。如果以百分比表示(例如:15%)," +"則是基於內填充擠出寬度來計算。Orca Slicer 會嘗試將兩條相近的內填充線連接到一段短邊緣。" +"如果找不到小於此參數的邊緣段,則內填充線將只連接到一側的邊緣段,且所選的邊緣段長度會限制於" +"infill_anchor,但不會超過此參數。\n" +"如果設為0,則會使用舊的內填充連接算法,這應該會產生與設為 1000 和 0 相同的結果。" msgid "0 (Simple connect)" msgstr "0(簡單連接)" -#, fuzzy msgid "Acceleration of outer walls" msgstr "外牆的加速度。它通常使用比內壁速度慢的加速度,以獲得更好的列印品質" -#, fuzzy msgid "Acceleration of inner walls" -msgstr "內圈牆加速度,使用較低值可以改善列印品質。" +msgstr "內牆加速度,使用較低值可以改善列印品質。" msgid "Acceleration of travel moves" msgstr "空駛加速度" -#, fuzzy msgid "" "Acceleration of top surface infill. Using a lower value may improve top " "surface quality" @@ -11107,7 +10883,6 @@ msgstr "頂面填充的加速度。使用較低值可能會改善頂面列印品 msgid "Acceleration of outer wall. Using a lower value can improve quality" msgstr "外牆加速度。使用較小的值可以提高列印品質。" -#, fuzzy msgid "" "Acceleration of bridges. If the value is expressed as a percentage (e.g. " "50%), it will be calculated based on the outer wall acceleration." @@ -11221,29 +10996,25 @@ msgid "" "than \"close_fan_the_first_x_layers\", in which case the fan will be running " "at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" -"風扇速度將從“禁用第一層”的零線性上升到“全風扇速度層”的最大。如果低於“禁用風扇" -"第一層”,則“全風扇速度第一層”將被忽略,在這種情況下,風扇將在“禁用風扇第一" -"層”+1層以最大允許速度運行。" +"風扇速度將從\"禁用第一層\"的零線性上升到\"全風扇速度層\"的最大。如果低於\"禁用風扇第一層\"" +",則\"全風扇速度第一層\"將被忽略,在這種情況下,風扇將在\"禁用風扇第一層\"+1層以最大允許" +"速度運行。" msgid "layer" -msgstr "" +msgstr "層" -#, fuzzy msgid "Support interface fan speed" -msgstr "支撐接觸面風扇速度" +msgstr "支撐界面風扇速度" -#, fuzzy msgid "" "This fan speed is enforced during all support interfaces, to be able to " "weaken their bonding with a high fan speed.\n" "Set to -1 to disable this override.\n" "Can only be overridden by disable_fan_first_layers." msgstr "" -"所有支撐接觸層列印期間強制執行速度,透過高轉速風扇速度減少支撐與物件的融" -"合。\n" +"所有支撐界面列印期間強制風扇速度,高速可以減少支撐與物件的融合。\n" "設定為 -1 以停用。" -#, fuzzy msgid "" "Randomly jitter while printing the wall, so that the surface has a rough " "look. This setting controls the fuzzy position" @@ -11323,14 +11094,12 @@ msgstr "" msgid "Add line number" msgstr "標註行號" -#, fuzzy -msgid "Enable this to add line number(Nx) at the beginning of each G-Code line" +msgid "Enable this to add line number(Nx)at the beginning of each G-Code line" msgstr "打開這個設定,G-code 的每一行的開頭會增加Nx標註行號。" msgid "Scan first layer" msgstr "首層檢查" -#, fuzzy msgid "" "Enable this to enable the camera on printer to check the quality of first " "layer" @@ -11367,7 +11136,6 @@ msgstr "噴嘴硬度。零值表示在切片時不檢查噴嘴硬度。" msgid "HRC" msgstr "洛氏硬度" -#, fuzzy msgid "Printer structure" msgstr "列印設備結構" @@ -11392,12 +11160,11 @@ msgstr "最佳物件位置" msgid "Best auto arranging position in range [0,1] w.r.t. bed shape." msgstr "針對列印版的形狀,範圍 [0,1] 內的最佳自動擺放位置 。" -#, fuzzy msgid "" "Enable this option if machine has auxiliary part cooling fan. G-code " "command: M106 P2 S(0-255)." msgstr "" -"如果設備有輔助部件冷卻風扇,請啟用此選項。 G-code 指令:M106 P2 S(0-255)。" +"如果設備有輔助物件冷卻風扇,請啟用此選項。 G-code 指令:M106 P2 S(0-255)。" msgid "" "Start the fan this number of seconds earlier than its target start time (you " @@ -11413,18 +11180,16 @@ msgstr "" "將風扇啟動指令往前移動指定時間以補償風扇的啟動時間。目前支援 G1 G0 指令\n" "設為 0 以禁用此選項" -#, fuzzy msgid "Only overhangs" msgstr "僅懸空" #, fuzzy msgid "Will only take into account the delay for the cooling of overhangs." -msgstr "僅對懸空有效" +msgstr "僅參考懸空的冷卻延遲" msgid "Fan kick-start time" msgstr "風扇" -#, fuzzy msgid "" "Emit a max fan speed command for this amount of seconds before reducing to " "target speed to kick-start the cooling fan.\n" @@ -11432,26 +11197,22 @@ msgid "" "fan started spinning from a stop, or to get the fan up to speed faster.\n" "Set to 0 to deactivate." msgstr "" -"在降低到目標速度以啟動冷卻風扇之前,持續發出最大風扇速度命令。\n" -"這對於低 PWM/功率可能不足以使風扇從停止狀態開始旋轉或使風扇加速得更快的風扇很" -"有用。\n" +"先用最快風扇速度運轉冷卻風扇N秒後再降低到目標速度。\n" +"這對於低 PWM/功率不足以讓風扇從停止狀態啟動,或使風扇加速更快的情況非常有用。\n" "設定為 0 以停用。" msgid "Time cost" msgstr "時間成本" -#, fuzzy msgid "The printer cost per hour" -msgstr "列印設備每小時成本" +msgstr "列印設備每小時的成本" msgid "money/h" msgstr "元/小時" -#, fuzzy msgid "Support control chamber temperature" msgstr "支援控制列印設備內部溫度" -#, fuzzy msgid "" "This option is enabled if machine support controlling chamber temperature\n" "G-code command: M141 S(0-255)" @@ -11462,7 +11223,6 @@ msgstr "" msgid "Support air filtration" msgstr "支援空氣過濾" -#, fuzzy msgid "" "Enable this if printer support air filtration\n" "G-code command: M106 P3 S(0-255)" @@ -11473,7 +11233,6 @@ msgstr "" msgid "G-code flavor" msgstr "G-code 風格" -#, fuzzy msgid "What kind of gcode the printer is compatible with" msgstr "列印設備相容的 G-code 樣式" @@ -11495,7 +11254,6 @@ msgstr "" msgid "Label objects" msgstr "標註物件" -#, fuzzy msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -11520,7 +11278,7 @@ msgid "" "descriptive text. If you print from SD card, the additional weight of the " "file could make your firmware slow down." msgstr "" -"啟用此選項可取得帶註釋的 G-code,其中每一行均由描述性文字進行解釋。 如果您從 " +"啟用此選項可取得帶註釋的 G-code,其中每一行均由描述性文字進行解釋。 如果你從 " "SD 卡列印,檔案的額外容量可能會導致韌體速度變慢。" msgid "Infill combination" @@ -11539,12 +11297,12 @@ msgid "" "Maximum layer height for the combined sparse infill. \n" "\n" "Set it to 0 or 100% to use the nozzle diameter (for maximum reduction in " -"print time) or a value of ~80% to maximize sparse infill strength.\n" +"print time)or a value of ~80% to maximize sparse infill strength.\n" "\n" "The number of layers over which infill is combined is derived by dividing " "this value with the layer height and rounded down to the nearest decimal.\n" "\n" -"Use either absolute mm values (eg. 0.32mm for a 0.4mm nozzle) or % values " +"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 "" @@ -11657,13 +11415,11 @@ msgstr "" msgid "Ironing Type" msgstr "熨燙類型" -#, fuzzy msgid "" "Ironing is using small flow to print on same height of surface again to make " "flat surface more smooth. This setting controls which layer being ironed" msgstr "" -"熨燙指的是使用小流量在表面的同高度列印,進而是的平面更加光滑。這個功能用於設" -"定哪些層進行熨燙。" +"熨燙是指使用小流量在表面相同高度再次列印,以使平面更加光滑。此設定控制哪些層進行熨燙。" msgid "No ironing" msgstr "不熨燙" @@ -11717,7 +11473,6 @@ msgstr "在每次換層抬升Z高度之後插入這段 G-code。" msgid "Supports silent mode" msgstr "支援靜音模式" -#, fuzzy msgid "" "Whether the machine supports silent mode in which machine use lower " "acceleration to print" @@ -11726,7 +11481,6 @@ msgstr "設備是否支援使用低加速度列印的靜音模式。" msgid "Emit limits to G-code" msgstr "" -#, fuzzy msgid "Machine limits" msgstr "設備限制" @@ -11738,7 +11492,7 @@ msgstr "" msgid "" "This G-code will be used as a code for the pause print. User can insert " "pause G-code in gcode viewer" -msgstr "該 G-code 用於暫停列印。您可以在 gcode 預覽中插入暫停 G-code" +msgstr "該 G-code 用於暫停列印。你可以在 gcode 預覽中插入暫停 G-code" msgid "This G-code will be used as a custom code" msgstr "該 G-code 是訂製化指令" @@ -11834,28 +11588,24 @@ msgstr "E軸最大抖動" msgid "Minimum speed for extruding" msgstr "最小擠出速度" -#, fuzzy msgid "Minimum speed for extruding (M205 S)" msgstr "最小擠出速度(M205 S)" msgid "Minimum travel speed" msgstr "最小空駛速度" -#, fuzzy msgid "Minimum travel speed (M205 T)" msgstr "最小空駛速度(M205 T)" msgid "Maximum acceleration for extruding" msgstr "擠出最大加速度" -#, fuzzy msgid "Maximum acceleration for extruding (M204 P)" msgstr "擠出時的最大加速度(M204 P)" msgid "Maximum acceleration for retracting" msgstr "回抽最大加速度" -#, fuzzy msgid "Maximum acceleration for retracting (M204 R)" msgstr "回抽最大加速度(M204 R)" @@ -11869,7 +11619,7 @@ msgid "" "Part cooling fan speed may be increased when auto cooling is enabled. This " "is the maximum speed limitation of part cooling fan" msgstr "" -"啟用自動冷卻時,可能會提高部件冷卻風扇的轉速。這是部件冷卻風扇的最大速度限制" +"啟用自動冷卻時,可能會提高物件冷卻風扇的轉速。這是物件冷卻風扇的最大速度限制" msgid "Max" msgstr "最大" @@ -11882,11 +11632,10 @@ msgstr "擠出頭最大可列印的層高。用於限制開啟自適應層高時 msgid "Extrusion rate smoothing" msgstr "平滑擠出率" -#, fuzzy 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 " +"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" "It defines the maximum rate by which the extruded volumetric flow in mm3/sec " @@ -11896,7 +11645,7 @@ msgid "" "A value of 0 disables the feature. \n" "\n" "For a high speed, high flow direct drive printer (like the Bambu lab or " -"Voron) this value is usually not needed. However it can provide some " +"Voron)this value is usually not needed. However it can provide some " "marginal benefit in certain cases where feature speeds vary greatly. For " "example, when there are aggressive slowdowns due to overhangs. In these " "cases a high value of around 300-350mm3/s2 is recommended as this allows for " @@ -11911,21 +11660,21 @@ msgid "" "\n" "Note: this parameter disables arc fitting." msgstr "" -"此參數是列印設備從列印高流量(高速/較大寬度)擠出轉換到較低流量(較低速度/較" -"小寬度)擠出時,用於突然變化擠出速率的平滑,反之亦然。\n" -"它定義了擠出體積流量(以 mm3/秒為單位)隨時間變化的最大速率。數值越高意味著允" -"許更高的擠出速率變化,從而實現更快的速度轉換。\n" +"此參數是列印設備從列印高流量(高速/較大寬度)擠出轉換到較低流量(較低速度/" +"較小寬度)擠出時,用於平滑突然變擠出速率,反之亦然。\n" +"它定義了擠出體積流量(mm3/秒)隨時間變化的最大速率。數值越高意味著允許" +"更高的擠出速率變化,從而實現更快的速度轉換。\n" "\n" "值為 0 會停用該功能。\n" "\n" -"對於高速、高流量的機型(如 Bambu lab 或 Voron),通常不需要此值。但是,在某些" -"功能速度差異很大的情況下,它可以提供一些邊際效益。 例如,當懸空而出現嚴重的減" -"速時。 在這些情況下,建議使用大約 300-350 mm3/s2,因為這樣剛好允許足夠的平" +"對於高速、高流量的機型(如 Bambu lab 或 Voron),通常不需要此設置。但是,在某些" +"速度差異很大的情況下,它可以提供一些邊際效益。 例如,當出現因懸空而導致的劇烈減" +"速時。在這些情況下,建議使用大約 300-350 mm3/s2,因為這樣剛好允許足夠的平" "滑,以幫助壓力提前實現更平滑的流量過渡。\n" "\n" -"對於速度較慢且沒有壓力提前的機種,該值應設定的非常低。對於近程擠出機來說\n" -"10-15 mm3/s2 是一個相對好的起點,而對於遠程擠出機來說是 5-10 mm3/s2。\n" -"此功能在 Prusa 切片機中稱為壓力均衡器。\n" +"對於速度較慢且沒有壓力提前的機種,應將此值設置為較低。對於近程擠出機來說\n" +"10-15 mm3/s2 是一個好的起點,而對於遠程擠出機來說是 5-10 mm3/s2。\n" +"此功能在 Prusa 切片軟體中稱為壓力均衡器。\n" "\n" "注意:此參數會停用圓弧擬合。" @@ -11947,9 +11696,8 @@ msgid "" msgstr "" msgid "Minimum speed for part cooling fan" -msgstr "部件冷卻風扇的最小轉速" +msgstr "物件冷卻風扇的最小轉速" -#, fuzzy 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 " @@ -11987,16 +11735,15 @@ msgstr "設定備註" msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." -msgstr "您可以在這裡放置您的個人備註。 該文字將會加入 G 代碼標題註釋中。" +msgstr "你可以在這裡放置你的個人備註。 該文字將會加入 G 代碼標題註釋中。" msgid "Host Type" msgstr "主機類型" -#, fuzzy msgid "" "Orca Slicer can upload G-code files to a printer host. This field must " "contain the kind of the host." -msgstr "切片軟體可以將 G-code 檔案上傳到列印設備。此欄位必須包含設備類型。" +msgstr "Orca Slicer可以將 G-code 檔案上傳到列印設備。此欄位必須包含設備類型。" msgid "Nozzle volume" msgstr "噴嘴內腔體積" @@ -12057,7 +11804,6 @@ msgstr "從切割區域到垃圾桶的起始和結束點。" msgid "Reduce infill retraction" msgstr "減小填充回抽" -#, fuzzy msgid "" "Don't retract when the travel is in infill area absolutely. That means the " "oozing can't been seen. This can reduce times of retraction for complex " @@ -12077,17 +11823,14 @@ msgstr "檔案名稱格式" msgid "User can self-define the project file name when export" msgstr "使用者可以自訂匯出項目檔案的名稱。" -#, fuzzy msgid "Make overhangs printable" -msgstr "懸空可列印" +msgstr "修改懸空成可列印" -#, fuzzy msgid "Modify the geometry to print overhangs without support material." msgstr "修改幾何形狀使得懸空部分無需支撐材料或者橋接列印。" -#, fuzzy msgid "Make overhangs printable - Maximum angle" -msgstr "懸空可列印的最大角度" +msgstr "懸空可列印修改的最大角度" msgid "" "Maximum angle of overhangs to allow after making more steep overhangs " @@ -12136,7 +11879,7 @@ msgid "Number of walls of every layer" msgstr "每一層的外牆" msgid "Alternate extra wall" -msgstr "" +msgstr "交錯額外牆壁" msgid "" "This setting adds an extra wall to every other layer. This way the infill " @@ -12156,7 +11899,7 @@ msgid "" "argument, and they can access the Orca Slicer config settings by reading " "environment variables." msgstr "" -"如果您想透過自訂腳本處理輸出的 G-code,只需在此處列出它們的絕對路徑即可。 用" +"如果你想透過自訂腳本處理輸出的 G-code,只需在此處列出它們的絕對路徑即可。 用" "分號分隔多個腳本。 腳本將傳遞 G-code 檔案的絕對路徑作為第一個參數,並且它們可" "以透過讀取環境變數來讀取 Orca Slicer 設定。" @@ -12248,12 +11991,11 @@ msgstr "" msgid "Retraction Length" msgstr "回抽長度" -#, fuzzy msgid "" "Some amount of material in extruder is pulled back to avoid ooze during long " "travel. Set zero to disable retraction" msgstr "" -"擠出機中的一些材料會被拉回特定長度,避免空駛較長時軟化的線材滲出。設定為 0 表" +"擠出機將材料拉回指定長度,避免空駛較長時軟化的線材滲出。設定為 0 表" "示關閉回抽。" msgid "Long retraction when cut(experimental)" @@ -12567,15 +12309,14 @@ msgstr "" msgid "Wipe speed" msgstr "擦拭速度" -#, fuzzy msgid "" "The wipe speed is determined by the speed setting specified in this " "configuration.If the value is expressed as a percentage (e.g. 80%), it will " "be calculated based on the travel speed setting above.The default value for " "this parameter is 80%" msgstr "" -"擦拭速度是根據此配置中指定的速度設定確定的。如果該值以百分比形式表示(例如 " -"80%),則將根據上方的移動速度設定進行計算。該參數的預設值為 80%。" +"擦拭速度是根據此配置中指定的速度設定。如果該值以百分比形式表示(例如 " +"80%),則將根據空駛速度設定進行計算。該參數的預設值為 80%。" msgid "Skirt distance" msgstr "Skirt距離" @@ -12685,7 +12426,6 @@ msgstr "內部實心填充的線寬。如果以%表示,它將以噴嘴直徑 msgid "Speed of internal solid infill, not the top and bottom surface" msgstr "內部實心填充的速度,不是頂面和底面。" -#, fuzzy msgid "" "Spiralize 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 " @@ -12723,7 +12463,7 @@ msgstr "" "如果啟用平滑模式或者傳統模式,將在每次列印時產生縮時錄影影片。列印完每層後," "將用內建相機拍攝快照。列印完成後,所有這些快照會組合成一個延時影片。如果啟用" "平滑模式,列印完每層後,工具頭將移動到吐料槽,然後拍攝快照。由於平滑模式在拍" -"攝快照的過程中熔融的線材可能會從噴嘴中洩漏,因此需要使用擦拭塔進行噴嘴擦拭。" +"攝快照的過程中熔融的線材可能會從噴嘴中洩漏,因此需要使用換料塔進行噴嘴擦拭。" msgid "Traditional" msgstr "傳統模式" @@ -12776,17 +12516,19 @@ msgstr "手動更換線材" 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 " +"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 "" +"啟用此選項以僅在列印開始時省略自訂更換線材 G-code。工具更換命令(例如 T0)將在整個" +"列印過程中跳過。這對於手動多線材列印很有用,我們使用 M600/PAUSE 來觸發手動線材更換動作。" msgid "Purge in prime tower" -msgstr "沖刷進擦拭塔" +msgstr "沖刷進換料塔" msgid "Purge remaining filament into prime tower" -msgstr "沖刷剩餘的線材進入擦拭塔" +msgstr "沖刷剩餘的線材進入換料塔" msgid "Enable filament ramming" msgstr "啟用線材尖端成型" @@ -12800,8 +12542,8 @@ msgid "" "print the wipe tower. User is responsible for ensuring there is no collision " "with the print." msgstr "" -"如果啟用,將不會在沒有換色的層列印擦拭塔。存在換色的層時,擠出機將降低高度打" -"印擦拭塔。使用者應該確保不會與列印物件發生衝突。" +"如果啟用,將不會在沒有換色的層列印換料塔。存在換色的層時,擠出機將降低高度打" +"印換料塔。使用者應該確保不會與列印物件發生衝突。" msgid "Prime all printing extruders" msgstr "所有擠出機畫線" @@ -12840,18 +12582,17 @@ msgstr "奇偶" msgid "Close holes" msgstr "閉孔" -#, fuzzy msgid "Z offset" -msgstr "Z 軸偏移(Z offset)" +msgstr "Z 偏移(Z offset)" msgid "" -"This value will be added (or subtracted) from all the Z coordinates in the " +"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 "" "該設定值將從輸出 G-code 中的所有 Z 座標增加(或 減少)。 它用於 Z 軸限位器位" -"置的補償:例如,您的 Z 軸限位器實際上使噴嘴距離列印板高了 0.3 mm,請將其設定" +"置的補償:例如,你的 Z 軸限位器實際上使噴嘴距離列印板高了 0.3 mm,請將其設定" "為 -0.3。" msgid "Enable support" @@ -12861,26 +12602,22 @@ msgid "Enable support generation." msgstr "開啟支撐產生。" msgid "" -"normal(auto) and tree(auto) is used to generate support automatically. If " -"normal(manual) or tree(manual) is selected, only support enforcers are " +"normal(auto)and tree(auto)is used to generate support automatically. If " +"normal(manual)or tree(manual)is selected, only support enforcers are " "generated" msgstr "" "普通(自動)和樹狀(自動)用於自動產生支撐體。如果選擇普通(手動)或樹狀(手" "動),僅會在支撐強制面上產生支撐。" -#, fuzzy msgid "normal(auto)" msgstr "普通(自動)" -#, fuzzy msgid "tree(auto)" msgstr "樹狀(自動)" -#, fuzzy msgid "normal(manual)" msgstr "普通(手動)" -#, fuzzy msgid "tree(manual)" msgstr "樹狀(手動)" @@ -12893,9 +12630,8 @@ msgstr "模型和支撐之間 XY 分離距離" msgid "Pattern angle" msgstr "模式角度" -#, fuzzy msgid "Use this setting to rotate the support pattern on the horizontal plane." -msgstr "設定支撐圖案在水平面的旋轉角度。" +msgstr "設定支撐圖形在水平面的旋轉角度。" msgid "On build plate only" msgstr "僅在列印板產生" @@ -12932,18 +12668,18 @@ msgstr "支撐產生於模型表面時,支撐面底部和模型之間的z間 msgid "Support/raft base" msgstr "支撐/筏層主體" -#, fuzzy msgid "" "Filament to print support base and raft. \"Default\" means no specific " "filament for support and current filament is used" msgstr "列印支撐主體和筏層的線材。\"預設\"代表不指定特定的線材,並使用目前線材" msgid "Avoid interface filament for base" -msgstr "" +msgstr "避免介面線材用於底座" msgid "" "Avoid using support interface filament to print support base if possible." msgstr "" +"如果可能,避免使用支援介面線材來列印支援底座。" msgid "" "Line width of support. If expressed as a %, it will be computed over the " @@ -12960,11 +12696,10 @@ msgstr "使用圈形走線覆蓋頂部接觸面。預設關閉。" msgid "Support/raft interface" msgstr "支撐/筏層界面" -#, fuzzy msgid "" "Filament to print support interface. \"Default\" means no specific filament " "for support interface and current filament is used" -msgstr "列印支撐接觸面的線材。\"預設\"代表不指定特定的線材,並使用目前線材" +msgstr "列印支撐界面的線材。\"預設\"代表不指定特定的線材,並使用目前線材" msgid "Top interface layers" msgstr "頂部接觸面層數" @@ -12976,7 +12711,7 @@ msgid "Bottom interface layers" msgstr "底部接觸面層數" msgid "Number of bottom interface layers" -msgstr "" +msgstr "底層介面層數" msgid "Same as top" msgstr "與頂部相同" @@ -13031,7 +12766,7 @@ msgstr "支撐線距" msgid "Normal Support expansion" msgstr "普通支撐延伸" -msgid "Expand (+) or shrink (-) the horizontal span of normal support" +msgid "Expand (+)or shrink (-)the horizontal span of normal support" msgstr "在水平方向對普通支撐進行延伸(+)或收縮(-)" msgid "Speed of support" @@ -13052,7 +12787,7 @@ msgstr "" "混合風格將在大平面懸空下建立與正常支撐類似的結構。" msgid "Default (Grid/Organic" -msgstr "" +msgstr "預設 (格狀/有機" msgid "Snug" msgstr "緊貼" @@ -13072,19 +12807,17 @@ msgstr "混合樹" msgid "Independent support layer height" msgstr "支撐獨立層高" -#, fuzzy 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間隙(z-gap)並且節省列印時" -"間。當擦拭塔被啟用時,這個選項將無效。" +"支撐層使用與物件層獨立的層高。這是為了支援自訂Z間隙(z-gap)並且節省列印時" +"間。當換料塔被啟用時,這個選項將無效。" msgid "Threshold angle" msgstr "臨界值角度" -#, fuzzy msgid "" "Support will be generated for overhangs whose slope angle is below the " "threshold." @@ -13093,33 +12826,29 @@ msgstr "將會為懸空角度低於臨界值的模型表面產生支撐。" msgid "Tree support branch angle" msgstr "樹狀支撐分支角度" -#, fuzzy msgid "" "This setting determines the maximum overhang angle that t he branches of " "tree support allowed to make.If the angle is increased, the branches can be " "printed more horizontally, allowing them to reach farther." msgstr "" -"此設定確定了允許樹狀支撐的最大懸垂角度。如果角度增加,可以更水平地列印分支," +"此設定決定樹狀支撐的最大分支角度。如果角度增加,可以更水平地列印分支," "使它們可以到達更遠的地方。" -#, fuzzy msgid "Preferred Branch Angle" msgstr "偏好樹狀分支角度" #. TRN PrintSettings: "Organic supports" > "Preferred Branch Angle" -#, fuzzy 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." msgstr "" -"樹狀分支的偏好角度,當它們不必避開模型時。 使用較低的角度使它們更垂直且更穩" +"當樹狀分支不必避開模型時的偏好角度。 使用較低的角度使它們更垂直且更穩" "定。 使用更高的角度使分支合併得更快。" msgid "Tree support branch distance" msgstr "樹狀支撐分支距離" -#, fuzzy msgid "" "This setting determines the distance between neighboring tree support nodes." msgstr "此設定確定了樹狀支撐的相鄰節點之間的距離。" @@ -13170,7 +12899,6 @@ msgstr "有機樹狀支撐的分支末端直徑。" msgid "Tree support branch diameter" msgstr "樹狀支撐分支直徑" -#, fuzzy msgid "This setting determines the initial diameter of support nodes." msgstr "此設定確定了樹狀支撐節點的初始直徑。" @@ -13188,9 +12916,8 @@ msgstr "" "樹狀分支直徑隨著向底部逐漸變粗的角度。 0 角度將導致分支在其長度上具有均勻的厚" "度。 一點角度可以增加有機樹支撐的穩定性。" -#, fuzzy msgid "Branch Diameter with double walls" -msgstr "分支直徑雙層牆" +msgstr "分支雙層牆直徑" #. TRN PrintSettings: "Organic supports" > "Branch Diameter" msgid "" @@ -13202,15 +12929,14 @@ msgstr "" "層牆體,請將此值設為 0。" msgid "Support wall loops" -msgstr "" +msgstr "支撐牆數" msgid "This setting specify the count of walls around support" -msgstr "" +msgstr "此設定指定支援結構的牆壁數量" msgid "Tree support with infill" msgstr "樹狀支撐產生填充" -#, fuzzy msgid "" "This setting specifies whether to add infill inside large hollows of tree " "support" @@ -13231,6 +12957,11 @@ msgid "" "either via macros or natively and is usually used when an active chamber " "heater is installed." msgstr "" +"此選項啟用機箱溫度控制。此選項會在 \"machine_start_gcode\" 之前啟用 M191 命令," +"設定機箱溫度並等待達到設定溫度。此外,它會在列印結束時發出 M141 命令來關閉機箱加熱器" +"(如果存在)\n。" +"\n" +"此選項依賴於韌體支援 M191 和 M141 命令(通過巨集或原生),通常用於主動機箱加熱器。" msgid "Chamber temperature" msgstr "機箱溫度" @@ -13243,17 +12974,27 @@ msgid "" "ASA. \n" "\n" "For PLA, PETG, TPU, PVA, and other low-temperature materials, this option " -"should be disabled (set to 0) as the chamber temperature should be low to " +"should be disabled (set to 0)as the chamber temperature should be low to " "avoid extruder clogging caused by material softening at the heat break.\n" "\n" "If enabled, this parameter also sets a gcode variable named " "chamber_temperature, which can be used to pass the desired chamber " "temperature to your print start macro, or a heat soak macro like this: " -"PRINT_START (other variables) CHAMBER_TEMP=[chamber_temperature]. This may " +"PRINT_START (other variables)CHAMBER_TEMP=[chamber_temperature]. This may " "be useful if your printer does not support M141/M191 commands, or if you " "desire to handle heat soaking in the print start macro if no active chamber " "heater is installed." msgstr "" +"對於 ABS、ASA、PC 和 PA 等高溫材料,較高的機箱溫度有助於抑制或減少翹曲,並可能提高層間" +"結合強度。然而,同時,較高的機箱溫度會降低列印 ABS 和 ASA 時的空氣過濾效率。\n" +"\n" +"對於 PLA、PETG、TPU、PVA 和其他低溫材料,不應使用此選項(設置為 0),因為機箱溫度應較低," +"以避免由於材料在喉管軟化而導致擠出機堵塞。\n" +"\n" +"如果啟用,此參數還設置了一個名為 chamber_temperature 的 gcode 變數,可將所需的機箱溫度" +"傳遞給列印巨集,例如:PRINT_START(其他變數)CHAMBER_TEMP=[chamber_temperature]。" +"如果你的印表設備不支持 M141/M191 命令,或者你希望在沒有安裝主動機箱加熱器的情況下在列印" +"開始巨集中處理熱浸處理,這可能很有用。" msgid "Nozzle temperature for layers after the initial one" msgstr "除首層外的其它層的噴嘴溫度" @@ -13301,7 +13042,6 @@ msgstr "頂部殼體層數" msgid "Top shell thickness" msgstr "頂部殼體厚度" -#, fuzzy msgid "" "The number of top solid layers is increased when slicing if the thickness " "calculated by top shell layers is thinner than this value. This can avoid " @@ -13340,13 +13080,18 @@ msgid "" "Setting a value in the retract amount before wipe setting below will perform " "any excess retraction before the wipe, else it will be performed after." msgstr "" +"描述當回抽時噴嘴沿最後一條路徑移動的時間。\n" +"\n" +"根據擦拭操作持續時間、擠出機/線材回抽設定的速度和時間長度,可能需要回抽來抽回剩餘的線材。" +"\n" +"若在下面的擦拭設定之前設定回抽量,將會在擦拭之前執行多餘的回抽,否則將在之後執行。" msgid "" "The wiping tower can be used to clean up the residue on the nozzle and " "stabilize the chamber pressure inside the nozzle, in order to avoid " "appearance defects when printing objects." msgstr "" -"擦拭塔可以用來清理噴嘴上的殘留料和讓噴嘴內部的腔壓達到穩定狀態,以避免列印物" +"換料塔可以用來清理噴嘴上的殘留料和讓噴嘴內部的壓力達到穩定狀態,以避免列印物" "體時出現外觀瑕疵。" msgid "Purging volumes" @@ -13364,16 +13109,16 @@ msgid "Prime volume" msgstr "清理量" msgid "The volume of material to prime extruder on tower." -msgstr "擦拭塔上的清理量" +msgstr "換料塔上的清理量" msgid "Width of prime tower" -msgstr "擦拭塔寬度" +msgstr "換料塔寬度" msgid "Wipe tower rotation angle" -msgstr "擦拭塔旋轉角度" +msgstr "換料塔旋轉角度" msgid "Wipe tower rotation angle with respect to x-axis." -msgstr "擦拭塔相對於 x 軸的旋轉角度。" +msgstr "換料塔相對於 x 軸的旋轉角度。" msgid "Stabilization cone apex angle" msgstr "穩定錐形頂角" @@ -13381,10 +13126,10 @@ msgstr "穩定錐形頂角" msgid "" "Angle at the apex of the cone that is used to stabilize the wipe tower. " "Larger angle means wider base." -msgstr "圓錐體頂點處的角度,用於穩定擦拭塔。 更大的角度意味著更寬的底座。" +msgstr "圓錐體頂點處的角度,用於穩定換料塔。 更大的角度意味著更寬的底座。" msgid "Maximum wipe tower print speed" -msgstr "" +msgstr "換料塔最快列印速度" msgid "" "The maximum print speed when purging in the wipe tower and printing the wipe " @@ -13407,15 +13152,25 @@ msgid "" "For the wipe tower external perimeters the internal perimeter speed is used " "regardless of this setting." msgstr "" +"在換料塔中和換料塔稀疏層時的最快列印速度。在列印時,如果稀疏填充速度或從線材最大體積速度計算出" +"的速度較低,則將使用較低的速度。\n" +"\n" +"在列印稀疏層時,如果內部周界速度或從線材最大體積速度計算出的速度較低,則將使用較低的速度。\n" +"\n" +"提高此速度可能會影響塔的穩定性,並增加噴嘴與換料塔上斑點的碰撞力。\n" +"\n" +"在將此參數提高於預設值 90mm/sec 以上之前,請確保你的印表設備能夠可靠地在更高的速度下橋接," +"並且工具更換時的溢出能良好的被控制。\n" +"\n" +"對於換料塔外部周邊,無論此設定如何,都使用內部周邊速度。" 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 將使用唯一的擠出機(盡量使用不可溶的材" +"列印換料塔周長時使用的擠出機。設置為 0 將使用唯一的擠出機(盡量使用不可溶的材" "料)。" -#, fuzzy msgid "Purging volumes - load/unload volumes" msgstr "清理量 - 進料/退料 量" @@ -13424,10 +13179,9 @@ msgid "" "wipe tower. These values are used to simplify creation of the full purging " "volumes below." msgstr "" -"可保存所需的體積,用於更改每個擦拭塔上工具所使用的 from/to 體積 。這些值用於" +"可保存所需的體積,用於更改每個換料塔上工具所使用的 from/to 體積 。這些值用於" "簡化完全沖刷體積的建立。" -#, fuzzy 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 " @@ -13436,25 +13190,23 @@ msgid "" msgstr "" "多色列印換色後的廢料會被用來列印物件的填充。這樣可以減少線材浪費和縮短列印時" "間,但是如果物件的內外牆是採用透明線材列印的,則可以從模型外觀上看到內部的混" -"色廢料。該功能只有在啟用擦拭塔的時候才生效。" +"色廢料。該功能只有在啟用換料塔的時候才生效。" -#, fuzzy 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 the prime tower is enabled." msgstr "" "多色列印換色後的廢料會被用來列印物件的支撐。這樣可以減少線材浪費和縮短列印時" -"間。該功能只有在啟用擦拭塔的時候才生效。" +"間。該功能只有在啟用換料塔的時候才生效。" -#, fuzzy msgid "" "This object will be used to purge the nozzle after a filament change to save " "filament and decrease the print time. Colours of the objects will be mixed " "as a result. It will not take effect, unless the prime tower is enabled." msgstr "" "多色列印換色後的廢料會被用來列印這個物件。這樣可以減少線材浪費和縮短列印時" -"間,但是這個物件的外觀會是混色的。該功能只有在啟用擦拭塔的時候才生效。" +"間,但是這個物件的外觀會是混色的。該功能只有在啟用換料塔的時候才生效。" msgid "Maximal bridging distance" msgstr "最大橋接距離" @@ -13463,28 +13215,31 @@ msgid "Maximal distance between supports on sparse infill sections." msgstr "稀疏填充截面上的支撐之間的最大距離。" msgid "Wipe tower purge lines spacing" -msgstr "擦拭塔線距" +msgstr "換料塔線距" msgid "Spacing of purge lines on the wipe tower." -msgstr "擦拭塔上的線距。" +msgstr "換料塔上的線距。" msgid "Extra flow for purging" -msgstr "" +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 "" +"用於換料塔上的換料的額外流量。這會使列印線比正常情況更粗或更細。間距會自動調整。" msgid "Idle temperature" -msgstr "" +msgstr "閒置溫度" msgid "" "Nozzle temperature when the tool is currently not used in multi-tool setups." "This is only used when 'Ooze prevention' is active in Print Settings. Set to " "0 to disable." msgstr "" +"當工具頭在多工具頭設置中未使用時的噴嘴溫度。" +"僅在「列印設定」中啟用「溢出預防」時有效。設置 0 為禁用。" msgid "X-Y hole compensation" msgstr "X-Y 孔洞尺寸補償" @@ -13514,7 +13269,7 @@ msgstr "將圓孔轉換為多邊形孔" msgid "" "Search for almost-circular holes that span more than one layer and convert " -"the geometry to polyholes. Use the nozzle size and the (biggest) diameter to " +"the geometry to polyholes. Use the nozzle size and the (biggest)diameter to " "compute the polyhole.\n" "See http://hydraraptor.blogspot.com/2011/02/polyholes.html" msgstr "" @@ -13544,9 +13299,8 @@ msgstr "扭曲多邊形孔" msgid "Rotate the polyhole every layer." msgstr "依層旋轉多邊形孔" -#, fuzzy msgid "G-code thumbnails" -msgstr "G-code 縮圖尺寸" +msgstr "G-code 縮圖" msgid "" "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " @@ -13571,6 +13325,8 @@ msgid "" "Wipe tower is only compatible with relative mode. It is recommended on most " "printers. Default is checked" msgstr "" +"建議在使用「標籤物件」選項時使用相對擠出。某些擠出機取消此選項(絕對擠出模式)" +"時工作效果更好。換料塔僅與相對模式兼容。建議在大部分印表設備上使用。預設為啟用。" msgid "" "Classic wall generator produces walls with constant extrusion width and for " @@ -13651,7 +13407,7 @@ msgstr "" "征將被加寬到牆最小寬度。參數值表示為相對噴嘴直徑的百分比" msgid "Minimum wall length" -msgstr "" +msgstr "最短牆長" msgid "" "Adjust this value to prevent short, unclosed walls from being printed, which " @@ -13663,6 +13419,11 @@ msgid "" "top-surface. 'One wall threshold' is only visible if this setting is set " "above the default value of 0.5, or if single-wall top surfaces is enabled." msgstr "" +"調整此值可防止列印短的、未閉合的牆面,這些可能會增加列印時間。較高的值會移除更多、更長的牆面。\n" +"\n" +"注意:底部和頂部表面不受此值影響,以防止模型外部出現視覺間隙。調整下面的「高級設定」中的" +"「單壁閾值」來調整對什麼被視為頂表面的敏感度。「單壁閾值」僅在此設定設置為大於預設值 0.5" +"或啟用單壁頂部表面時可見。" msgid "First layer minimum wall width" msgstr "首層牆最小線寬" @@ -13679,7 +13440,7 @@ msgstr "牆最小線寬" msgid "" "Width of the wall that will replace thin features (according to the Minimum " -"feature size) of the model. If the Minimum wall width is thinner than the " +"feature size)of the model. If the Minimum wall width is thinner than the " "thickness of the feature, the wall will become as thick as the feature " "itself. It's expressed as a percentage over nozzle diameter" msgstr "" @@ -13697,13 +13458,11 @@ msgstr "" "此選項用於自動識別內部狹窄的實心填充。開啟後,將對狹窄實心區域使用同心填充加" "快列印速度。否則使用預設的直線填充。" -#, fuzzy msgid "invalid value " msgstr "無效值" -#, fuzzy msgid "Invalid value when spiral vase mode is enabled: " -msgstr "花瓶模式時無效值:" +msgstr "值於花瓶模式無效:" msgid "too large line width " msgstr "線寬過大" @@ -13720,7 +13479,6 @@ msgstr "匯出最小尺寸的 3mf。" msgid "No check" msgstr "不檢查" -#, fuzzy msgid "Do not run any validity checks, such as gcode path conflicts check." msgstr "不要執行任何有效性檢查,如 G-code 路徑衝突檢查。" @@ -13746,11 +13504,9 @@ msgstr "繞 Y 旋轉" msgid "Rotation angle around the Y axis in degrees." msgstr "繞 Y 軸的旋轉角度(以度為單位)" -#, fuzzy msgid "Data directory" -msgstr "檔案路徑" +msgstr "檔案目錄" -#, fuzzy msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -13776,65 +13532,72 @@ msgid "" "custom G-code travels somewhere else, it should write to this variable so " "OrcaSlicer knows where it travels from when it gets control back." msgstr "" +"自訂 G-code 區塊開頭的擠出機位置。如果自訂 G-code 移動到了其他位置,應該寫入此變數," +"以便 OrcaSlicer 知道它從哪裡移動到當它重新獲得控制權時。" msgid "" "Retraction state at the beginning of the custom G-code block. If the custom " "G-code moves the extruder axis, it should write to this variable so " "OrcaSlicer de-retracts correctly when it gets control back." msgstr "" +"自訂 G-code 區塊開頭的回抽狀態。如果自訂 G-code 移動了擠出機軸,應該寫入此變數," +"以便 OrcaSlicer 在重新獲得控制權時正確返回抽。" msgid "Extra de-retraction" -msgstr "" +msgstr "額外返回抽" msgid "Currently planned extra extruder priming after de-retraction." msgstr "" msgid "Absolute E position" -msgstr "" +msgstr "絕對擠出值" msgid "" "Current position of the extruder axis. Only used with absolute extruder " "addressing." -msgstr "" +msgstr "擠出機軸的目前位置。僅用於絕對擠出值。" msgid "Current extruder" -msgstr "" +msgstr "目前使用的擠出機" msgid "Zero-based index of currently used extruder." -msgstr "" +msgstr "目前使用的擠出機的索引,從 0 開始。" msgid "Current object index" -msgstr "" +msgstr "目前列印物件的索引" msgid "" "Specific for sequential printing. Zero-based index of currently printed " "object." msgstr "" +"特定於序列列印。目前列印物件的索引,從 0 開始。" msgid "Has wipe tower" -msgstr "" +msgstr "有換料塔" msgid "Whether or not wipe tower is being generated in the print." -msgstr "" +msgstr "是否有產生換料塔" msgid "Initial extruder" -msgstr "" +msgstr "初始擠出機" msgid "" "Zero-based index of the first extruder used in the print. Same as " "initial_tool." msgstr "" +"列印中使用的第一個擠出機的索引,從 0 開始。與 initial_tool 相同。" msgid "Initial tool" -msgstr "" +msgstr "初始工具頭" msgid "" "Zero-based index of the first extruder used in the print. Same as " "initial_extruder." msgstr "" +"列印中使用的第一個擠出機的索引,從 0 開始。與 initial_extruder 相同。" msgid "Is extruder used?" -msgstr "" +msgstr "擠出機是否被使用?" msgid "" "Vector of booleans stating whether a given extruder is used in the print." @@ -13847,50 +13610,51 @@ msgid "Are the extra multi-material priming regions used in this print?" msgstr "" msgid "Volume per extruder" -msgstr "" +msgstr "各擠出機線材體積" msgid "Total filament volume extruded per extruder during the entire print." -msgstr "" +msgstr "各擠出機擠出總線材體積" msgid "Total toolchanges" -msgstr "" +msgstr "總工具頭變更次數" msgid "Number of toolchanges during the print." -msgstr "" +msgstr "列印期間工具頭變更次數" msgid "Total volume" -msgstr "" +msgstr "總體積" msgid "Total volume of filament used during the entire print." -msgstr "" +msgstr "列印總線材體積" msgid "Weight per extruder" -msgstr "" +msgstr "各擠出機擠出總重" msgid "" "Weight per extruder extruded during the entire print. Calculated from " "filament_density value in Filament Settings." msgstr "" +"各擠出機擠出總重,依據線材密度計算" msgid "Total weight" -msgstr "" +msgstr "總重" msgid "" "Total weight of the print. Calculated from filament_density value in " "Filament Settings." -msgstr "" +msgstr "列印總重,依據線材密度計算" msgid "Total layer count" -msgstr "" +msgstr "總層數" msgid "Number of layers in the entire print." -msgstr "" +msgstr "列印總層數" msgid "Number of objects" -msgstr "" +msgstr "物件數量" msgid "Total number of objects in the print." -msgstr "" +msgstr "列印總物件數量" msgid "Number of instances" msgstr "" @@ -13899,7 +13663,7 @@ msgid "Total number of object instances in the print, summed over all objects." msgstr "" msgid "Scale per object" -msgstr "" +msgstr "各物件縮放" msgid "" "Contains a string with the information about what scaling was applied to the " @@ -13907,105 +13671,112 @@ msgid "" "index 0).\n" "Example: 'x:100% y:50% z:100'." msgstr "" +"包含一個字串,描述了每個物件縮放的資訊。第一個物件索引為 0。" +"例如:'x:100% y:50% z:100'" msgid "Input filename without extension" -msgstr "" +msgstr "輸入檔名(不含副檔名)" msgid "Source filename of the first object, without extension." -msgstr "" +msgstr "第一個物件的原始檔名(不含副檔名)" msgid "" "The vector has two elements: x and y coordinate of the point. Values in mm." msgstr "" +"這個向量包含兩個元素:點的 x 和 y 座標,單位為毫米。" msgid "" "The vector has two elements: x and y dimension of the bounding box. Values " "in mm." msgstr "" +"這個向量包含兩個元素:邊界的 x 和 y 尺寸,單位為mm。" msgid "First layer convex hull" -msgstr "" +msgstr "第一層凸包" msgid "" "Vector of points of the first layer convex hull. Each element has the " "following format:'[x, y]' (x and y are floating-point numbers in mm)." msgstr "" +"第一層凸包的點向量。每個元素格式為:'[x, y]'(x 和 y 是以mm為單位的實數)。" msgid "Bottom-left corner of first layer bounding box" -msgstr "" +msgstr "第一層邊界左下角" msgid "Top-right corner of first layer bounding box" -msgstr "" +msgstr "第一層邊界右上角" msgid "Size of the first layer bounding box" -msgstr "" +msgstr "第一層邊界大小" msgid "Bottom-left corner of print bed bounding box" -msgstr "" +msgstr "列印平台邊界左下角" msgid "Top-right corner of print bed bounding box" -msgstr "" +msgstr "列印平台邊界右上角" msgid "Size of the print bed bounding box" -msgstr "" +msgstr "列印平台邊界大小" msgid "Timestamp" -msgstr "" +msgstr "時間戳記" msgid "String containing current time in yyyyMMdd-hhmmss format." -msgstr "" +msgstr "yyyyMMdd-hhmmss 格式的目前時間字串" msgid "Day" -msgstr "" +msgstr "天" msgid "Hour" -msgstr "" +msgstr "小時" msgid "Minute" -msgstr "" +msgstr "分" msgid "Print preset name" -msgstr "" +msgstr "列印預設名稱" msgid "Name of the print preset used for slicing." -msgstr "" +msgstr "切片使用的列印預設名稱" msgid "Filament preset name" -msgstr "" +msgstr "線材預設名稱" msgid "" "Names of the filament presets used for slicing. The variable is a vector " "containing one name for each extruder." msgstr "" +"切片使用的各個擠出機的線材預設名稱。此變數是一個向量,包含每個擠出機相對應的名稱。" msgid "Printer preset name" -msgstr "" +msgstr "列印設備預設名稱" msgid "Name of the printer preset used for slicing." -msgstr "" +msgstr "用於切片的列印設備預設名稱" msgid "Physical printer name" -msgstr "" +msgstr "列印設備名稱" msgid "Name of the physical printer used for slicing." -msgstr "" +msgstr "用於切片的印表設備名稱。" msgid "Number of extruders" -msgstr "" +msgstr "總擠出機數" msgid "" "Total number of extruders, regardless of whether they are used in the " "current print." msgstr "" +"總擠出機數,無論是否用於列印。" msgid "Layer number" -msgstr "" +msgstr "層數" msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "" +msgstr "當層數 (第一層為一)" msgid "Layer z" -msgstr "" +msgstr "層z高" msgid "" "Height of the current layer above the print bed, measured to the top of the " @@ -14024,7 +13795,6 @@ msgstr "" msgid "The current extruder ID. The same as current_extruder." msgstr "" -#, fuzzy msgid "Error in zip archive" msgstr "zip 檔案中存在錯誤" @@ -14055,11 +13825,11 @@ msgstr "浮空懸臂" msgid "large overhangs" msgstr "大面積懸空" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "" "It seems object %s has %s. Please re-orient the object or enable support " "generation." -msgstr "似乎物件 %s 有 %s。請重新調整物件的方向或啟用支撐。" +msgstr "物件 %s 似乎有 %s。請重新調整物件的方向或啟用支撐。" msgid "Optimizing toolpath" msgstr "正在最佳化走線" @@ -14067,14 +13837,12 @@ msgstr "正在最佳化走線" msgid "Slicing mesh" msgstr "正在切片網格" -#, fuzzy msgid "" -"No layers were detected. You might want to repair your STL file(s) or check " +"No layers were detected. You might want to repair your STL file(s)or check " "their size or thickness and retry.\n" msgstr "" -"沒有偵測到層。您可能需要修復 STL 檔案,或檢查模型尺寸、厚度等,之後再重試。\n" +"沒有切到層次。你可能需要修復 STL 檔案,或檢查模型尺寸、厚度等,之後再重試。\n" -#, fuzzy msgid "" "An object's XY size compensation will not be used because it is also color-" "painted.\n" @@ -14083,9 +13851,9 @@ msgstr "" "物件的 XY 尺寸補償不會生效,因為在此物件上做過上色操作。\n" "XY 尺寸補償不能與上色功能一起使用。" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "Support: generate toolpath at layer %d" -msgstr "支撐:正在產生 %d 層的走線路徑" +msgstr "支撐:正在產生 %d 層的路徑" msgid "Support: detect overhangs" msgstr "支撐:正在偵測懸空面" @@ -14102,21 +13870,20 @@ msgstr "支撐:正在產生多邊形" msgid "Support: generate toolpath" msgstr "支撐:正在產生走線路徑" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "Support: generate polygons at layer %d" msgstr "支撐:正在產生 %d 層的多邊形" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "Support: fix holes at layer %d" msgstr "支撐:正在修補 %d 層的空洞" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "Support: propagate branches at layer %d" msgstr "支撐:正在生長 %d 層的樹枝" -#, fuzzy msgid "" -"Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." +"Unknown file format. Input file must have .stl, .obj, .amf(.xml)extension." msgstr "未知的檔案格式。輸入檔案的副檔名必須為 .stl、.obj 或 .amf(.xml)。" msgid "Loading of a model file failed." @@ -14125,32 +13892,27 @@ msgstr "載入模型檔案失敗。" msgid "The supplied file couldn't be read because it's empty" msgstr "無法讀取提供的檔案,因為該檔案為空。" -#, fuzzy msgid "Unknown file format. Input file must have .3mf or .zip.amf extension." msgstr "未知的檔案格式。輸入檔案的副檔名必須為 .3mf 或 .zip .amf。" msgid "Canceled" msgstr "已取消" -#, fuzzy msgid "load_obj: failed to parse" -msgstr "載入物件:無法分析" +msgstr "載入物件:解析失敗" msgid "load mtl in obj: failed to parse" -msgstr "" +msgstr "載入物件材質:解析失敗" -#, fuzzy msgid "The file contains polygons with more than 4 vertices." -msgstr "該檔案包含頂點超過 4 個的多邊形。" +msgstr "該檔案包含超過 4 個頂點的多邊形。" -#, fuzzy msgid "The file contains polygons with less than 2 vertices." -msgstr "該檔案包含頂點少於 2 個的多邊形。" +msgstr "該檔案包含少於 2 個頂點的多邊形。" msgid "The file contains invalid vertex index." msgstr "檔案包含無效的頂點索引。" -#, fuzzy msgid "This OBJ file couldn't be read because it's empty." msgstr "無法讀取此 OBJ 檔案,因為它是空的。" @@ -14172,9 +13934,8 @@ msgstr "結果可由人眼讀取。" msgid "Auto-Calibration" msgstr "自動校準" -#, fuzzy msgid "We would use Lidar to read the calibration result" -msgstr "將使用微型雷射雷達來讀取校準結果。" +msgstr "將使用雷射雷達來讀取校準結果。" msgid "Prev" msgstr "上一個" @@ -14193,9 +13954,8 @@ msgstr "如何使用校準結果?" msgid "" "You could change the Flow Dynamics Calibration Factor in material editing" -msgstr "您可以在線材編輯中更改流量動態校準因子。" +msgstr "你可以在線材編輯中更改流量動態校準因子。" -#, fuzzy msgid "" "The current firmware version of the printer does not support calibration.\n" "Please upgrade the printer firmware." @@ -14221,7 +13981,7 @@ msgstr "流量比例" msgid "Max Volumetric Speed" msgstr "最大體積速度" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "" "Please input valid values:\n" "Start value: >= %.1f\n" @@ -14231,8 +13991,8 @@ msgid "" msgstr "" "請輸入有效值:\n" "起始值:>= %.1f\n" -"最終值:<= %.1f\n" -"結束值:> 起始值\n" +"終止值:<= %.1f\n" +"終止值:> 起始值\n" "步距:>= %.3f)" msgid "The name cannot be empty." @@ -14240,39 +14000,32 @@ msgstr "名稱不能為空。" #, c-format, boost-format msgid "The selected preset: %s is not found." -msgstr "" +msgstr "找不到所選的預設:%s。" -#, fuzzy msgid "The name cannot be the same as the system preset name." msgstr "名稱不能與系統預設值名稱相同。" -#, fuzzy msgid "The name is the same as another existing preset name" msgstr "該名稱與另一個現有預設值名稱相同。" -#, fuzzy msgid "create new preset failed." -msgstr "新增預設值失敗" +msgstr "新增預設失敗" -#, fuzzy msgid "" "Are you sure to cancel the current calibration and return to the home page?" -msgstr "您確定要取消目前的校準並返回首頁嗎?" +msgstr "你確定要取消目前的校準並返回首頁嗎?" -#, fuzzy msgid "No Printer Connected!" msgstr "沒有連接列印設備!" -#, fuzzy msgid "Printer is not connected yet." msgstr "列印設備尚未連接。" msgid "Please select filament to calibrate." msgstr "請選擇要校準的線材。" -#, fuzzy msgid "The input value size must be 3." -msgstr "輸入值大小必須為 3。" +msgstr "輸入值必須為 3。" msgid "" "This machine type can only hold 16 history results per nozzle. You can " @@ -14281,15 +14034,16 @@ msgid "" "historical results. \n" "Do you still want to continue the calibration?" msgstr "" +"此機型每個噴嘴只能儲存 16 筆歷史記錄。你可以刪除現有的歷史記錄,然後開始校準。" +"或者你可以繼續校準,但無法建立新的校準歷史記錄。\n" +"是否仍要繼續校準?" -#, fuzzy msgid "Connecting to printer..." msgstr "正在連接列印設備..." msgid "The failed test result has been dropped." msgstr "測試失敗的結果已被刪除。" -#, fuzzy msgid "Flow Dynamics Calibration result has been saved to the printer" msgstr "動態流量校準的結果已儲存至列印設備。" @@ -14299,12 +14053,15 @@ msgid "" "Only one of the results with the same name is saved. Are you sure you want " "to override the historical result?" msgstr "" +"已經有一個同名的歷史校準結果:%s。" +"僅保存同名結果中的其中一個。確定要覆寫歷史結果嗎?" #, c-format, boost-format msgid "" "This machine type can only hold %d history results per nozzle. This result " "will not be saved." msgstr "" +"此機型每個噴嘴只能儲存 %d 筆歷史記錄。此結果將不會被保存。" msgid "Internal Error" msgstr "內部錯誤" @@ -14312,7 +14069,6 @@ msgstr "內部錯誤" msgid "Please select at least one filament for calibration" msgstr "請至少選擇一種線材進行校準。" -#, fuzzy msgid "Flow rate calibration result has been saved to preset" msgstr "流量比例校準結果已儲存到預設值" @@ -14322,7 +14078,6 @@ msgstr "最大體積速度校準結果已儲存到預設值" msgid "When do you need Flow Dynamics Calibration" msgstr "在什麼情況下需要進行動態流量校準" -#, fuzzy msgid "" "We now have added the auto-calibration for different filaments, which is " "fully automated and the result will be saved into the printer for future " @@ -14334,10 +14089,10 @@ msgid "" "filament setting." msgstr "" "我們現在已經為不同的列印線材新增了自動校準功能,該功能是完全自動化的,並且結" -"果將儲存在列印設備中以供將來使用。您只需要在以下有限情況下進行校準:\n" -"1. 如果您引入了不同品牌/型號的新列印線材,或者列印線材受潮;\n" +"果將儲存在列印設備中以供將來使用。你只需要在以下有限情況下進行校準:\n" +"1. 如果你引入了不同品牌/型號的新列印線材,或者列印線材受潮;\n" "2. 如果噴嘴磨損或更換了新的噴嘴;\n" -"3. 如果您在列印線材設定中更改了最大體積速度或列印溫度。" +"3. 如果你在列印線材設定中更改了最大體積速度或列印溫度。" msgid "About this calibration" msgstr "關於此校準" @@ -14361,6 +14116,17 @@ msgid "" "cause the result not exactly the same in each calibration. We are still " "investigating the root cause to do improvements with new updates." msgstr "" +"請參考我們的 Wiki 頁面,了解「流體動力校準」的詳細資訊。\n" +"\n" +"通常不需要進行校準。當你啟動單色/單材質列印,並在列印開始選單中勾選「流體動力校準」選項時," +"列印設備將按照舊方式,在列印前校準耗材。當你啟動多色/多材質列印時,列印設備將在每次耗材切換時使用" +"預設的補償參數,這在大部分情況下都能得到良好的結果。\n" +"\n" +"請注意,有些情況可能會導致校準結果不可靠,例如列印板上的黏著力不足。你可以通過清洗印板板或" +"塗抹膠水來改善黏著力。有關此主題的更多資訊,請參考我們的 Wiki。\n" +"\n" +"在我們的測試中,校準結果存在約 10% 的誤差,這可能導致每次校準的結果不完全相同。" +"我們仍在調查根本原因,並將在新的更新中進行改進。" msgid "When to use Flow Rate Calibration" msgstr "何時使用流量率校準" @@ -14383,7 +14149,6 @@ msgstr "" "3. 表面品質差:列印的表面看起來粗糙或不均勻。\n" "4. 結構穩固性差:列印物件容易斷裂,或者沒有應有的穩固性。" -#, fuzzy msgid "" "In addition, Flow Rate Calibration is crucial for foaming materials like LW-" "PLA used in RC planes. These materials expand greatly when heated, and " @@ -14392,7 +14157,6 @@ msgstr "" "此外,對於像用於遙控飛機的輕質發泡 PLA(LW-PLA)這樣的發泡線材,流量率校準非" "常重要。這些線材在加熱時會大幅膨脹,而校準提供了有用的流量率參考。" -#, fuzzy msgid "" "Flow Rate Calibration measures the ratio of expected to actual extrusion " "volumes. The default setting works well in Bambu Lab printers and official " @@ -14403,10 +14167,9 @@ msgid "" msgstr "" "流量率校準測量預期擠出體積與實際擠出體積之間的比率。預設設定在 Bambu Lab 列印" "設備和官方線材上表現良好,因為它們已經進行了預先校準和微調。對於普通的線材," -"通常情況下,您不需要執行流量率校準,除非在完成其他校準後仍然看到上述列出的缺" +"通常情況下,你不需要執行流量率校準,除非在完成其他校準後仍然看到上述列出的缺" "陷。如需更多詳細資訊,請查閱 wiki 文章。" -#, fuzzy msgid "" "Auto Flow Rate Calibration utilizes Bambu Lab's Micro-Lidar technology, " "directly measuring the calibration patterns. However, please be advised that " @@ -14425,7 +14188,7 @@ msgid "" "can lead to sub-par prints or printer damage. Please make sure to carefully " "read and understand the process before doing it." msgstr "" -"自動流量率校準採用 Bambu Lab 的微型雷射雷達技術,直接測量校準圖案。然而,請注" +"自動流量率校準採用 Bambu Lab 的雷射雷達技術,直接測量校準圖案。然而,請注" "意,這種方法的功效和準確性可能會因特定類型的線材而受影響。特別是透明或半透" "明、帶有閃光顆粒或具有高反射表面的線材可能不適合這種校準,並可能產生不理想的" "結果。\n" @@ -14438,7 +14201,7 @@ msgstr "" "程。" msgid "When you need Max Volumetric Speed Calibration" -msgstr "當您需要最大體積速度校準時" +msgstr "當你需要最大體積速度校準時" msgid "Over-extrusion or under extrusion" msgstr "過度擠壓或擠壓不足" @@ -14450,26 +14213,24 @@ msgid "material with significant thermal shrinkage/expansion, such as..." msgstr "具有顯著熱收縮/膨脹的材料,例如..." msgid "materials with inaccurate filament diameter" -msgstr "耗材直徑不準確的線材" +msgstr "線材直徑不準確的線材" msgid "We found the best Flow Dynamics Calibration Factor" msgstr "我們找到了最佳的流量動態校準因子。" -#, fuzzy msgid "" "Part of the calibration failed! You may clean the plate and retry. The " "failed test result would be dropped." -msgstr "部分校準失敗! 您可以清潔列印板並重試。 失敗的測試結果將不會儲存。" +msgstr "部分校準失敗! 你可以清潔列印板並重試。 失敗的測試結果將不會儲存。" msgid "" "*We recommend you to add brand, materia, type, and even humidity level in " "the Name" -msgstr "*我們建議您在名稱中加入品牌、材料、類型,甚至濕度水平。" +msgstr "*我們建議你在名稱中加入品牌、材料、類型,甚至濕度水平。" msgid "Failed" msgstr "失敗" -#, fuzzy msgid "Please enter the name you want to save to printer." msgstr "請輸入要儲存到列印設備的名稱。" @@ -14480,29 +14241,28 @@ msgid "" "Only one of the results with the same name will be saved. Are you sure you " "want to override the other results?" msgstr "" +"同名的結果只能儲存一個,是否要覆蓋其他結果?" msgid "Please find the best line on your plate" -msgstr "請在您的列印板上找到最佳線條" +msgstr "請在你的列印板上找到最佳線條" msgid "Please find the corner with perfect degree of extrusion" -msgstr "" +msgstr "請找到最完美的列印角度" msgid "Input Value" msgstr "輸入值" -#, fuzzy msgid "Save to Filament Preset" -msgstr "儲存到材料預設值" +msgstr "儲存到材料預設" -#, fuzzy msgid "Preset" -msgstr "預設值" +msgstr "預設" msgid "Record Factor" msgstr "記錄係數" msgid "We found the best flow ratio for you" -msgstr "我們為您找到了最佳流量比" +msgstr "我們為你找到了最佳流量比" msgid "Flow Ratio" msgstr "流量比" @@ -14510,9 +14270,8 @@ msgstr "流量比" msgid "Please input a valid value (0.0 < flow ratio < 2.0)" msgstr "請輸入一個有效值(0.0<流量比<2.0)" -#, fuzzy msgid "Please enter the name of the preset you want to save." -msgstr "請輸入要儲存的預設值的名稱。" +msgstr "請輸入要儲存的預設名稱。" msgid "Calibration1" msgstr "校準 1" @@ -14555,7 +14314,6 @@ msgstr "基於流量比的精細校準" msgid "Title" msgstr "標題" -#, fuzzy msgid "" "A test model will be printed. Please clear the build plate and place it back " "to the hot bed before calibration." @@ -14598,20 +14356,18 @@ msgstr "%s 與 %s 不相容" msgid "TPU is not supported for Flow Dynamics Auto-Calibration." msgstr "不支援 TPU 進行流量動態自動校準。" -#, fuzzy msgid "Connecting to printer" msgstr "正在連接列印設備" msgid "From k Value" -msgstr "" +msgstr "從 k 值" msgid "To k Value" -msgstr "" +msgstr "至 k 值" msgid "Step value" -msgstr "" +msgstr "步進值" -#, fuzzy msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "噴嘴直徑已從列印設備設定中同步" @@ -14641,19 +14397,19 @@ msgstr "操作" #, c-format, boost-format msgid "This machine type can only hold %d history results per nozzle." -msgstr "" +msgstr "此設備型號每個噴嘴僅能儲存 %d 筆歷史結果。" msgid "Edit Flow Dynamics Calibration" msgstr "編輯動態流量校準" msgid "New Flow Dynamic Calibration" -msgstr "" +msgstr "重新校準動態流量" msgid "Ok" msgstr "" msgid "The filament must be selected." -msgstr "" +msgstr "必須選擇線材。" msgid "Network lookup" msgstr "搜尋網路" @@ -14677,13 +14433,15 @@ msgid "Finished" msgstr "完成" msgid "Multiple resolved IP addresses" -msgstr "" +msgstr "多個解析的 IP 位址" #, boost-format msgid "" "There are several IP addresses resolving to hostname %1%.\n" "Please select one that should be used." msgstr "" +"有多個 IP 位址解析到主機名稱 %1%。\n" +"請選擇一個要使用的 IP 位址。" msgid "PA Calibration" msgstr "PA校準" @@ -14756,17 +14514,15 @@ msgstr "" msgid "Filament type" msgstr "線材類型" -#, fuzzy msgid "Start temp: " msgstr "起始溫度: " msgid "End temp: " -msgstr "結束溫度" +msgstr "終止溫度" msgid "Temp step: " msgstr "溫度步距" -#, fuzzy msgid "" "Please input valid values:\n" "Start temp: <= 350\n" @@ -14775,8 +14531,8 @@ msgid "" msgstr "" "請輸入有效值:\n" "起始溫度:<= 350\n" -"結束溫度:>= 170\n" -"開始溫度 > 結束溫度 + 5)" +"終止溫度:>= 170\n" +"開始溫度 > 終止溫度 + 5)" msgid "Max volumetric speed test" msgstr "最大體積速度測試" @@ -14790,7 +14546,6 @@ msgstr "結束流量" msgid "step: " msgstr "步距" -#, fuzzy msgid "" "Please input valid values:\n" "start > 0 \n" @@ -14831,31 +14586,30 @@ msgstr "結束回抽長度" msgid "mm/mm" msgstr "" -#, fuzzy msgid "Send G-Code to printer host" msgstr "傳送 G-code 到列印設備" msgid "Upload to Printer Host with the following filename:" msgstr "使用下列檔案名上傳到列印設備:" -msgid "Use forward slashes ( / ) as a directory separator if needed." +msgid "Use forward slashes ( / )as a directory separator if needed." msgstr "如有需要,請使用正斜槓( / )作為目錄分隔符號。" msgid "Upload to storage" msgstr "上傳到儲存單位" msgid "Switch to Device tab after upload." -msgstr "" +msgstr "上傳後切換到設備分頁。" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" -msgstr "上傳的檔名不以 \"%s\" 結尾。確定要繼續嗎?" +msgstr "上傳的檔名不是 \"%s\" 結尾。確定要繼續嗎?" msgid "Upload" msgstr "上傳" msgid "Print host upload queue" -msgstr "列印主機上傳隊列" +msgstr "列印主機上傳佇列" msgid "ID" msgstr "ID" @@ -14880,7 +14634,7 @@ msgid "Show error message" msgstr "顯示錯誤資訊" msgid "Enqueued" -msgstr "已加入隊列" +msgstr "已加入佇列" msgid "Uploading" msgstr "正在上傳" @@ -14888,15 +14642,12 @@ msgstr "正在上傳" msgid "Cancelling" msgstr "取消中" -#, fuzzy msgid "Error uploading to print host" msgstr "上傳到列印設備時發生錯誤" -#, fuzzy msgid "Unable to perform boolean operation on selected parts" msgstr "無法對所選零件執行布林運算" -#, fuzzy msgid "Mesh Boolean" msgstr "布林運算" @@ -14934,119 +14685,122 @@ msgid "Delete input" msgstr "刪除輸入" msgid "Network Test" -msgstr "" +msgstr "網路測試" msgid "Start Test Multi-Thread" -msgstr "" +msgstr "開始多續測試" msgid "Start Test Single-Thread" -msgstr "" +msgstr "開始單續測試" msgid "Export Log" -msgstr "" +msgstr "匯出記錄" msgid "OrcaSlicer Version:" -msgstr "" +msgstr "OrcaSlicer 版本:" msgid "System Version:" -msgstr "" +msgstr "系統版本:" msgid "DNS Server:" -msgstr "" +msgstr "DNS 伺服器:" msgid "Test OrcaSlicer(GitHub)" -msgstr "" +msgstr "測試 OrcaSlicer(GitHub)" msgid "Test OrcaSlicer(GitHub):" -msgstr "" +msgstr "測試 OrcaSlicer(GitHub):" msgid "Test Bing.com" -msgstr "" +msgstr "測試 Bing.com:" msgid "Test bing.com:" -msgstr "" +msgstr "測試 bing.com:" msgid "Log Info" -msgstr "" +msgstr "日誌資訊" msgid "Select filament preset" -msgstr "" +msgstr "選擇線材預設" msgid "Create Filament" -msgstr "" +msgstr "建立線材" msgid "Create Based on Current Filament" -msgstr "" +msgstr "依據目前線材建立" msgid "Copy Current Filament Preset " -msgstr "" +msgstr "複製目前的線材預設" msgid "Basic Information" -msgstr "" +msgstr "基本資訊" msgid "Add Filament Preset under this filament" -msgstr "" +msgstr "在此線材下新增線材預設" msgid "We could create the filament presets for your following printer:" -msgstr "" +msgstr "可以為你以下的列印設備建立線材預設:" msgid "Select Vendor" -msgstr "" +msgstr "選擇廠牌" msgid "Input Custom Vendor" -msgstr "" +msgstr "輸入自訂廠牌" msgid "Can't find vendor I want" -msgstr "" +msgstr "找不到我想要的廠牌" msgid "Select Type" -msgstr "" +msgstr "選擇類型" msgid "Select Filament Preset" -msgstr "" +msgstr "選擇線材預設" msgid "Serial" -msgstr "" +msgstr "序號" msgid "e.g. Basic, Matte, Silk, Marble" -msgstr "" +msgstr "例如:基本、霧面、絲光、大理石" msgid "Filament Preset" -msgstr "" +msgstr "線材預設" msgid "Create" -msgstr "" +msgstr "創建" msgid "Vendor is not selected, please reselect vendor." -msgstr "" +msgstr "廠牌尚未選擇,請重新選擇廠牌。" msgid "Custom vendor is not input, please input custom vendor." -msgstr "" +msgstr "自訂廠牌尚未輸入,請輸入自訂廠牌。" msgid "" "\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." msgstr "" +"「Bambu」或「Generic」不能作為自訂線材的廠牌名稱。" msgid "Filament type is not selected, please reselect type." -msgstr "" +msgstr "線材類型尚未選擇,請重新選擇類型。" msgid "Filament serial is not entered, please enter serial." -msgstr "" +msgstr "線材序號尚未輸入,請輸入序號。" msgid "" "There may be escape characters in the vendor or serial input of filament. " "Please delete and re-enter." msgstr "" +"線材的廠牌或序號輸入中可能包含跳脫字元,請刪除並重新輸入。" msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." -msgstr "" +msgstr "自訂廠牌或序號中的所有輸入都是空白,請重新輸入。" msgid "The vendor can not be a number. Please re-enter." -msgstr "" +msgstr "廠牌不能為數字,請重新輸入。" msgid "" "You have not selected a printer or preset yet. Please select at least one." msgstr "" +"尚未選擇列印設備或預設,請至少選擇一個。" #, c-format, boost-format msgid "" @@ -15054,108 +14808,114 @@ msgid "" "If you continue creating, the preset created will be displayed with its full " "name. Do you want to continue?" msgstr "" +"所建立的線材名稱 %s 已經存在。\n" +"如果繼續建立,預設將顯示完整的名稱。是否要繼續?" msgid "Some existing presets have failed to be created, as follows:\n" -msgstr "" +msgstr "以下是一些現有的預設無法建立的原因:\n" msgid "" "\n" "Do you want to rewrite it?" msgstr "" +"\n" +"確定要覆寫嗎?" msgid "" "We would rename the presets as \"Vendor Type Serial @printer you " "selected\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" +"將會將預設名稱重新命名為「廠牌 型號 序號 @選擇的列印設備」。\n" +"若要為更多列印設備新增預設,請前往列印設備選擇頁面。" msgid "Create Printer/Nozzle" -msgstr "" +msgstr "建立列印設備/噴嘴" msgid "Create Printer" -msgstr "" +msgstr "建立列印設備" msgid "Create Nozzle for Existing Printer" -msgstr "" +msgstr "為現有列印設備建立噴嘴" msgid "Create from Template" -msgstr "" +msgstr "從範本建立" msgid "Create Based on Current Printer" -msgstr "" +msgstr "依據目前列印設備建立" msgid "Import Preset" -msgstr "" +msgstr "匯入預設" msgid "Create Type" -msgstr "" +msgstr "建立類型" msgid "The model is not found, please reselect vendor." -msgstr "" +msgstr "找不到該型號,請重新選擇廠牌。" msgid "Select Model" -msgstr "" +msgstr "選擇型號" msgid "Select Printer" -msgstr "" +msgstr "Select Model" msgid "Input Custom Model" -msgstr "" +msgstr "輸入自訂型號" msgid "Can't find my printer model" -msgstr "" +msgstr "找不到我的列印設備型號" msgid "Rectangle" -msgstr "" +msgstr "矩形" msgid "Printable Space" -msgstr "" +msgstr "可列印空間" msgid "Hot Bed STL" -msgstr "" +msgstr "熱床 STL" msgid "Load stl" -msgstr "" +msgstr "載入 STL" msgid "Hot Bed SVG" -msgstr "" +msgstr "熱床 SVG" msgid "Load svg" -msgstr "" +msgstr "載入 SVG" msgid "Max Print Height" -msgstr "" +msgstr "最大列印高度" #, c-format, boost-format msgid "The file exceeds %d MB, please import again." -msgstr "" +msgstr "檔案超過 %d MB,請重新匯入。" msgid "Exception in obtaining file size, please import again." -msgstr "" +msgstr "取得檔案大小時發生例外,請重新匯入。" msgid "Preset path is not find, please reselect vendor." -msgstr "" +msgstr "找不到預設路徑,請重新選擇廠牌。" msgid "The printer model was not found, please reselect." -msgstr "" +msgstr "找不到列印設備型號,請重新選擇。" msgid "The nozzle diameter is not found, please reselect." -msgstr "" +msgstr "找不到噴嘴直徑,請重新選擇。" msgid "The printer preset is not found, please reselect." -msgstr "" +msgstr "未找到列印設備預設設定,請重新選擇。" msgid "Printer Preset" -msgstr "" +msgstr "列印設備預設設定" msgid "Filament Preset Template" -msgstr "" +msgstr "線材預設設定模板" msgid "Deselect All" -msgstr "" +msgstr "取消全選" msgid "Process Preset Template" -msgstr "" +msgstr "處理預設設定模板" msgid "Back Page 1" msgstr "" @@ -15164,14 +14924,16 @@ msgid "" "You have not yet chosen which printer preset to create based on. Please " "choose the vendor and model of the printer" msgstr "" +"尚未選擇要基於哪個列印設備預設設定來創建,請選擇列印設備的廠牌和型號。" msgid "" "You have entered an illegal input in the printable area section on the first " "page. Please check before creating it." msgstr "" +"在第一頁的可列印區域部分輸入了無效的設定,請在創建前檢查。" msgid "The custom printer or model is not entered, please enter it." -msgstr "" +msgstr "未輸入自訂列印設備或型號,請輸入。" msgid "" "The printer preset you created already has a preset with the same name. Do " @@ -15182,60 +14944,68 @@ msgid "" "reserve.\n" "\tCancel: Do not create a preset, return to the creation interface." msgstr "" +"創建的列印設備預設設定已經有相同名稱的預設設定。是否要覆蓋它?\n" +"\t是:覆蓋相同名稱的列印設備預設設定,並重新創建名稱相同的線材和處理預設設定," +"名稱不同的線材和處理預設設定將被保留。\n " +"\t取消:不創建預設設定,返回創建界面。" msgid "You need to select at least one filament preset." -msgstr "" +msgstr "需要至少選擇一個線材預設設定。" msgid "You need to select at least one process preset." -msgstr "" +msgstr "需要至少選擇一個處理預設設定。" msgid "Create filament presets failed. As follows:\n" -msgstr "" +msgstr "創建線材預設設定失敗,原因如下:\n" msgid "Create process presets failed. As follows:\n" -msgstr "" +msgstr "創建處理預設設定失敗,原因如下:\n" msgid "Vendor is not find, please reselect." -msgstr "" +msgstr "未找到廠牌,請重新選擇。" msgid "Current vendor has no models, please reselect." -msgstr "" +msgstr "目前廠牌沒有可用的型號,請重新選擇。" msgid "" "You have not selected the vendor and model or entered the custom vendor and " "model." msgstr "" +"你尚未選擇廠牌和型號,或未輸入自訂的廠牌和型號。" msgid "" "There may be escape characters in the custom printer vendor or model. Please " "delete and re-enter." msgstr "" +"自訂列印設備廠牌或型號中可能包含轉義字符。請刪除後重新輸入。" msgid "" "All inputs in the custom printer vendor or model are spaces. Please re-enter." msgstr "" +"自訂列印設備廠牌或型號的所有輸入為空格。請重新輸入。" msgid "Please check bed printable shape and origin input." -msgstr "" +msgstr "請檢查熱床可列印區域形狀和原點設定。" msgid "" "You have not yet selected the printer to replace the nozzle, please choose." msgstr "" +"尚未選擇要更換噴嘴的列印設備,請選擇。" msgid "Create Printer Successful" -msgstr "" +msgstr "列印設備創建成功" msgid "Create Filament Successful" -msgstr "" +msgstr "線材創建成功" msgid "Printer Created" -msgstr "" +msgstr "列印設備創建完成" msgid "Please go to printer settings to edit your presets" -msgstr "" +msgstr "請前往列印設備設定編輯你的預設設定" msgid "Filament Created" -msgstr "" +msgstr "線材創建完成" msgid "" "Please go to filament setting to edit your presets if you need.\n" @@ -15243,6 +15013,8 @@ msgid "" "volumetric speed has a significant impact on printing quality. Please set " "them carefully." msgstr "" +"如果需要,請前往線材設定編輯你的預設設定。\n " +"請注意,噴嘴溫度、熱床溫度和最大體積速度對列印品質有重大影響,請小心設置。" msgid "" "\n" @@ -15252,42 +15024,46 @@ msgid "" "page. \n" "Click \"Sync user presets\" to enable the synchronization function." msgstr "" +"\n" +"\n" +"Orca 偵測到你的使用者預設設定同步功能未啟用,這可能會導致設備頁面上的線材設定無法成功。" +"請點擊「同步使用者預設設定」以啟用同步功能。" msgid "Printer Setting" -msgstr "" +msgstr "列印設備設定" msgid "Printer config bundle(.orca_printer)" -msgstr "" +msgstr "列印機配置包 (.orca_printer)" msgid "Filament bundle(.orca_filament)" -msgstr "" +msgstr "線材包 (.orca_filament)" msgid "Printer presets(.zip)" -msgstr "" +msgstr "列印設備預設設定檔 (.zip)" msgid "Filament presets(.zip)" -msgstr "" +msgstr "線材預設設定檔 (.zip)" msgid "Process presets(.zip)" -msgstr "" +msgstr "處理預設設定檔 (.zip)" msgid "initialize fail" -msgstr "" +msgstr "初始化失敗" msgid "add file fail" -msgstr "" +msgstr "添加檔案失敗。" msgid "add bundle structure file fail" -msgstr "" +msgstr "添加捆綁結構檔案失敗" msgid "finalize fail" -msgstr "" +msgstr "失敗" msgid "open zip written fail" -msgstr "" +msgstr "打開 zip 檔案失敗" msgid "Export successful" -msgstr "" +msgstr "匯出成功" #, c-format, boost-format msgid "" @@ -15296,132 +15072,147 @@ msgid "" "If not, a time suffix will be added, and you can modify the name after " "creation." msgstr "" +"目前目錄中已存在 '%s' 資料夾。你是否要清除它並重新建立?\n" +"如果不想清除,將會加上時間後綴,並且你可以在建立後修改名稱。" msgid "" "Printer and all the filament&&process presets that belongs to the printer. \n" "Can be shared with others." msgstr "" +"列印設備及所有屬於該列印設備的線材和處理預設設定。 \n" +"可以與他人分享。" msgid "" "User's filament preset set. \n" "Can be shared with others." msgstr "" +"使用者的線材預設設定。 \n" +"可以與他人分享。" msgid "" "Only display printer names with changes to printer, filament, and process " "presets." msgstr "" +"僅顯示對列印設備、線材和處理預設設定有變更的列印設備名稱。" msgid "Only display the filament names with changes to filament presets." -msgstr "" +msgstr "僅顯示對線材預設設定有變更的線材名稱。" msgid "" "Only printer names with user printer presets will be displayed, and each " "preset you choose will be exported as a zip." msgstr "" +"只有具有使用者列印設備預設設定的列印設備名稱會顯示,你選擇的每個預設設定將以 zip 檔案格式匯出。" 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 "" +"只有具有使用者線材預設設定的線材名稱會顯示,\n" +"你選擇的每個線材名稱中的所有使用者線材預設設定將以 zip 檔案格式匯出。" 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 "" +"只有具有變更過處理預設設定的列印設備名稱會顯示,\n" +"你選擇的每個列印設備名稱中的所有使用者處理預設設定將以 zip 檔案格式匯出。" msgid "Please select at least one printer or filament." -msgstr "" +msgstr "請至少選擇一個列印設備或線材。" msgid "Please select a type you want to export" -msgstr "" +msgstr "請選擇你要匯出的類型" msgid "Failed to create temporary folder, please try Export Configs again." -msgstr "" +msgstr "創建臨時資料夾失敗,請再次嘗試匯出配置。" msgid "Edit Filament" -msgstr "" +msgstr "編輯線材" msgid "Filament presets under this filament" -msgstr "" +msgstr "此線材下的線材預設設定" msgid "" "Note: If the only preset under this filament is deleted, the filament will " "be deleted after exiting the dialog." -msgstr "" +msgstr "注意:如果此線材下的唯一預設設定被刪除,退出對話框後該線材將被刪除。" msgid "Presets inherited by other presets can not be deleted" -msgstr "" +msgstr "被其他預設設定繼承的預設設定無法刪除" msgid "The following presets inherits this preset." msgid_plural "The following preset inherits this preset." msgstr[0] "" msgid "Delete Preset" -msgstr "" +msgstr "刪除預設設定" msgid "Are you sure to delete the selected preset?" -msgstr "" +msgstr "確定要刪除選定的預設設定嗎?" msgid "Delete preset" -msgstr "" +msgstr "刪除預設設定" msgid "+ Add Preset" -msgstr "" +msgstr "+ 新增預設設定" msgid "Delete Filament" -msgstr "" +msgstr "刪除線材" 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" +"如果你正在列印設備上使用此線材,請重新設置該插槽的線材資訊。" msgid "Delete filament" -msgstr "" +msgstr "刪除線材" msgid "Add Preset" -msgstr "" +msgstr "新增預設設定" msgid "Add preset for new printer" -msgstr "" +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 "" msgid "Edit Preset" -msgstr "" +msgstr "編輯預設設定" msgid "For more information, please check out Wiki" -msgstr "" +msgstr "如需更多資訊,請查看 Wiki。" msgid "Collapse" msgstr "摺疊" msgid "Daily Tips" -msgstr "" +msgstr "每日提示" #, c-format, boost-format msgid "nozzle memorized: %.1f %s" -msgstr "" +msgstr "記錄的噴嘴:%.1f %s" msgid "" "Your nozzle diameter in preset is not consistent with memorized nozzle " "diameter. Did you change your nozzle lately?" msgstr "" +"預設的噴嘴直徑與記錄的噴嘴直徑不一致。你最近有更換噴嘴嗎?" #, c-format, boost-format msgid "*Printing %s material with %s may cause nozzle damage" -msgstr "" +msgstr "*使用 %s 材料和 %s 列印可能會導致噴嘴損壞。" #, fuzzy msgid "Need select printer" @@ -15440,42 +15231,40 @@ msgid "Physical Printer" msgstr "實體列印設備" msgid "Print Host upload" -msgstr "打印主機上傳" +msgstr "列印主機上傳" msgid "Could not get a valid Printer Host reference" -msgstr "無法獲得有效的打印機主機參考資料" +msgstr "無法獲得有效的列印設備主機參考資料" msgid "Success!" msgstr "成功!" msgid "Are you sure to log out?" -msgstr "" +msgstr "確定要登出嗎?" #, fuzzy msgid "Refresh Printers" msgstr "重新整理列印設備" msgid "View print host webui in Device tab" -msgstr "" +msgstr "在設備選項卡中查看列印主機的 Web UI" msgid "Replace the BambuLab's device tab with print host webui" -msgstr "" +msgstr "將 BambuLab 的設備選項卡替換為列印主機的 Web UI" -#, fuzzy msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." msgstr "" -"HTTPS CA 憑證檔案是可選的。 僅當您使用具有自帶簽名憑證的 HTTPS 時才需要它。" +"HTTPS CA 憑證檔案是可選的。 僅當你使用具有自行簽證的 HTTPS 時才需要它。" -#, fuzzy msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "憑證檔(*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgid "Open CA certificate file" msgstr "開啟 CA憑證檔" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "" "On this system, %s uses HTTPS certificates from the system Certificate Store " "or Keychain." @@ -15484,17 +15273,17 @@ msgstr "在此系統上,%s 使用系統憑證儲存庫或鑰匙圈中的 HTTPS msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." -msgstr "若要使用自訂 CA 憑證檔,請將您的 CA 憑證檔匯入到憑證儲存庫/鑰匙圈中。" +msgstr "若要使用自訂 CA 憑證檔,請將你的 CA 憑證檔匯入到憑證儲存庫/鑰匙圈中。" msgid "Login/Test" -msgstr "" +msgstr "登入/測試" msgid "Connection to printers connected via the print host failed." -msgstr "經由打印主機連接的打印機連接失敗。" +msgstr "經由列印主機連接的列印設備連接失敗。" #, c-format, boost-format msgid "Mismatched type of print host: %s" -msgstr "打印主機類型不符:%s" +msgstr "列印主機類型不符:%s" msgid "Connection to AstroBox works correctly." msgstr "與 AstroBox 的連接工作正常。" @@ -15532,13 +15321,14 @@ msgstr "無法連接到 FlashAir" msgid "" "Note: FlashAir with firmware 2.00.02 or newer and activated upload function " "is required." -msgstr "注意:FlashAir 需要韌體為 2.00.02 或更新版本並啟動上傳功能。" +msgstr "" +"注意:FlashAir 需要韌體為 2.00.02 或更新版本並啟動上傳功能。" msgid "Connection to MKS works correctly." -msgstr "" +msgstr "成功連接到 MKS。" msgid "Could not connect to MKS" -msgstr "" +msgstr "無法連接到 MKS" msgid "Connection to OctoPrint works correctly." msgstr "與 OctoPrint 的連接工作正常。" @@ -15562,28 +15352,28 @@ msgid "Could not connect to PrusaLink" msgstr "無法連接到 PrusaLink" msgid "Storages found" -msgstr "" +msgstr "找到存儲空間" #. TRN %1% = storage path #, boost-format msgid "%1% : read only" -msgstr "" +msgstr "%1% : 唯讀" #. TRN %1% = storage path #, boost-format msgid "%1% : no free space" -msgstr "" +msgstr "%1%:沒有可用空間" #. TRN %1% = host #, boost-format msgid "Upload has failed. There is no suitable storage found at %1%." -msgstr "" +msgstr "上傳失敗。未找到適當的存儲位置在 %1%。" msgid "Connection to Prusa Connect works correctly." -msgstr "" +msgstr "成功連接到 Prusa Connect。" msgid "Could not connect to Prusa Connect" -msgstr "" +msgstr "無法連接到 Prusa Connect。" msgid "Connection to Repetier works correctly." msgstr "與 Repetier 的連接工作正常。" @@ -15600,7 +15390,7 @@ msgid "" "Message body: \"%2%\"" msgstr "" "HTTP 狀態:%1%\n" -"訊息內容:“%2%”" +"訊息內容:\"%2%\"" #, boost-format msgid "" @@ -15609,8 +15399,8 @@ msgid "" "Error: \"%2%\"" msgstr "" "主機溝通解析失敗。\n" -"訊息內容:“%1%”\n" -"錯誤碼:“%2%”" +"訊息內容:\"%1%\"\n" +"錯誤碼:\"%2%\"" #, boost-format msgid "" @@ -15618,38 +15408,47 @@ msgid "" "Message body: \"%1%\"\n" "Error: \"%2%\"" msgstr "" -"主機打印機例舉失敗。\n" -"訊息內容:“%1%”\n" -"錯誤碼:“%2%”" +"主機列印設備例舉失敗。\n" +"訊息內容:\"%1%\"\n" +"錯誤碼:\"%2%\"" msgid "" "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." msgstr "" +"它具有較小的層高,產生幾乎可以忽略不計的層線並具有較高的列印品質。" +"適用於大多數一般的列印情況。" 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. So, it results in " "much higher printing quality, but a much longer printing time." msgstr "" +"與 0.2 毫米噴嘴的預設配置相比,該配置具有較低的速度和加速度," +"且稀疏填充圖案為 Gyroid。因此,列印品質大幅提高,但列印時間大幅延長。" msgid "" "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." msgstr "" +"與 0.2 毫米噴嘴的預設配置相比,該配置具有略大的層高," +"產生幾乎可以忽略不計的層線,並略微縮短列印時間。" msgid "" "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." msgstr "" +"與 0.2 毫米噴嘴的預設配置相比,該配置具有較大的層高,產生略微可見的層線,但列印時間較短。" msgid "" "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." msgstr "" +"與 0.2 毫米噴嘴的預設配置相比,該配置具有較小的層高," +"產生幾乎不可見的層線並提高列印品質,但列印時間較短。" msgid "" "Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " @@ -15657,12 +15456,16 @@ msgid "" "Gyroid. So, it results in almost invisible layer lines and much higher " "printing quality, but much longer printing time." msgstr "" +"與 0.2 毫米噴嘴的預設配置相比,該配置具有較小的層線、較低的速度和加速度," +"且稀疏填充圖案為 Gyroid。因此,產生幾乎不可見的層線並大幅提高列印品質,但列印時間會大大延長。" msgid "" "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." msgstr "" +"與 0.2 毫米噴嘴的預設配置相比,該配置具有較小的層高," +"產生最小的層線並提高列印品質,但列印時間較短。" msgid "" "Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " @@ -15670,35 +15473,46 @@ msgid "" "Gyroid. So, it results in minimal layer lines and much higher printing " "quality, but much longer printing time." msgstr "" +"與 0.2 毫米噴嘴的預設配置相比,該配置具有較小的層線、較低的速度和加速度," +"且稀疏填充圖案為 Gyroid。因此,產生最小的層線並大幅提高列印品質,但列印時間會大大延長。" msgid "" "It has a general layer height, and results in general layer lines and " "printing quality. It is suitable for most general printing cases." msgstr "" +"它具有一般的層高,產生一般的層線和列印品質。適用於大多數一般的列印情況。" msgid "" "Compared with the default profile of a 0.4 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." msgstr "" +"與 0.4 毫米噴嘴的預設配置相比,該配置具有更多的牆壁圈層和較高的稀疏填充密度。" +"因此,列印物品的強度更高,但會增加耗材使用量並延長列印時間。" msgid "" "Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " "height, and results in more apparent layer lines and lower printing quality, " "but slightly shorter printing time." msgstr "" +"與 0.4 毫米噴嘴的預設配置相比,該配置具有較大的層高," +"產生更明顯的層線並降低列印品質,但列印時間略微縮短。" msgid "" "Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " "height, and results in more apparent layer lines and lower printing quality, " "but shorter printing time." msgstr "" +"與 0.4 毫米噴嘴的預設配置相比,該配置具有較大的層高," +"產生更明顯的層線並降低列印品質,但列印時間較短。" msgid "" "Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " "height, and results in less apparent layer lines and higher printing " "quality, but longer printing time." msgstr "" +"與 0.4 毫米噴嘴的預設配置相比,該配置具有較小的層高," +"產生較不明顯的層線並提高列印品質,但列印時間較長。" msgid "" "Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " @@ -15706,12 +15520,16 @@ msgid "" "Gyroid. So, it results in less apparent layer lines and much higher printing " "quality, but much longer printing time." msgstr "" +"與 0.4 毫米噴嘴的預設配置相比,該配置具有較小的層高、較低的速度和加速度," +"且稀疏填充圖案為 Gyroid。因此,產生較不明顯的層線,並且列印品質大幅提高,但列印時間會大大延長。" msgid "" "Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " "height, and results in almost negligible layer lines and higher printing " "quality, but longer printing time." msgstr "" +"與 0.4 毫米噴嘴的預設配置相比,該配置具有較小的層高," +"產生幾乎可以忽略不計的層線,並提高列印品質,但列印時間較長。" msgid "" "Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " @@ -15719,64 +15537,84 @@ msgid "" "Gyroid. So, it results in almost negligible layer lines and much higher " "printing quality, but much longer printing time." msgstr "" +"與 0.4 毫米噴嘴的預設配置相比,該配置具有較小的層高、較低的速度和加速度," +"且稀疏填充圖案為 Gyroid。因此,產生幾乎可以忽略不計的層線," +"並且列印品質大幅提高,但列印時間會大大延長。" msgid "" "Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " "height, and results in almost negligible layer lines and longer printing " "time." msgstr "" +"與 0.4 毫米噴嘴的預設配置相比,該配置具有較小的層高,產生幾乎可以忽略不計的層線,但列印時間較長。" msgid "" "It has a big layer height, and results in apparent layer lines and ordinary " "printing quality and printing time." msgstr "" +"它具有較大的層高,產生明顯的層線,並且列印品質和列印時間屬於普通水平。" msgid "" "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." msgstr "" +"與 0.6 毫米噴嘴的預設配置相比,該配置具有更多的牆壁圈層和較高的稀疏填充密度。" +"因此,列印物品的強度更高,但會增加耗材使用量並延長列印時間。" msgid "" "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." msgstr "" +"與 0.6 毫米噴嘴的預設配置相比,該配置具有較大的層高," +"產生較為明顯的層線並降低列印品質,但在某些情況下會縮短列印時間。" msgid "" "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." msgstr "" +"與 0.6 毫米噴嘴的預設配置相比,該配置具有較大的層高," +"產生更明顯的層線並顯著降低列印品質,但在某些情況下會縮短列印時間。" msgid "" "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." msgstr "" +"與 0.6 毫米噴嘴的預設配置相比,該配置具有較小的層高," +"產生較不明顯的層線並略微提高列印品質,但列印時間較長。" msgid "" "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." msgstr "" +"與 0.6 毫米噴嘴的預設配置相比,該配置具有較小的層高," +"產生較不明顯的層線並提高列印品質,但列印時間較長。" msgid "" "It has a very big layer height, and results in very apparent layer lines, " "low printing quality and general printing time." msgstr "" +"它具有非常大的層高,產生明顯的層線、較低的列印品質和一般的列印時間。" msgid "" "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." msgstr "" +"與0.8mm噴嘴的預設配置相比,該配置具有較大的層高,產生非常明顯的層線並顯著降低列印品質," +"但在某些情況下會縮短列印時間。" msgid "" "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." msgstr "" +"與0.8mm噴嘴的預設配置相比,該配置具有更大的層高,產生極為明顯的層線並顯著降低列印品質," +"但在某些情況下會大幅縮短列印時間。" msgid "" "Compared with the default profile of a 0.8 mm nozzle, it has a slightly " @@ -15784,51 +15622,55 @@ msgid "" "lines and slightly higher printing quality, but longer printing time in some " "printing cases." msgstr "" +"與0.8mm噴嘴的預設配置相比,該配置具有略小的層高,產生略少但仍明顯的層線," +"並略微提高列印品質,但在某些情況下會延長列印時間。" msgid "" "Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " "height, and results in less but still apparent layer lines and slightly " "higher printing quality, but longer printing time in some printing cases." msgstr "" +"與0.8mm噴嘴的預設配置相比,該配置具有較小的層高,從而產生較少但仍明顯的層線," +"並略微提高列印品質,但在某些情況下會延長列印時間。" msgid "Connected to Obico successfully!" -msgstr "" +msgstr "成功連接到 Obico!" msgid "Could not connect to Obico" -msgstr "" +msgstr "無法連接到 Obico" msgid "Connected to SimplyPrint successfully!" -msgstr "" +msgstr "成功連接到 SimplyPrint!" msgid "Could not connect to SimplyPrint" -msgstr "" +msgstr "無法連接到 SimplyPrint" msgid "Internal error" -msgstr "" +msgstr "內部錯誤" msgid "Unknown error" -msgstr "" +msgstr "未知錯誤" msgid "SimplyPrint account not linked. Go to Connect options to set it up." -msgstr "" +msgstr "SimplyPrint 帳戶未連結。請前往連接選項進行設置。" msgid "Connection to Flashforge works correctly." -msgstr "" +msgstr "成功連接到 Flashforge" msgid "Could not connect to Flashforge" -msgstr "" +msgstr "無法連接到 Flashforge" msgid "The provided state is not correct." -msgstr "" +msgstr "提供的狀態不正確。" msgid "Please give the required permissions when authorizing this application." -msgstr "" +msgstr "授權此應用程式時,請提供所需的權限。" msgid "Something unexpected happened when trying to log in, please try again." -msgstr "" +msgstr "嘗試登入時發生了意外錯誤,請再試一次。" msgid "User cancelled." -msgstr "" +msgstr "使用者取消" #: resources/data/hints.ini: [hint:Precise wall] msgid "" @@ -15836,20 +15678,26 @@ msgid "" "Did you know that turning on precise wall can improve precision and layer " "consistency?" msgstr "" +"精確牆壁\n" +"你知道啟用精確牆壁可以提高精度和層次一致性嗎?" #: resources/data/hints.ini: [hint:Sandwich mode] msgid "" "Sandwich mode\n" -"Did you know that you can use sandwich mode (inner-outer-inner) to improve " +"Did you know that you can use sandwich mode (inner-outer-inner)to improve " "precision and layer consistency if your model doesn't have very steep " "overhangs?" msgstr "" +"三明治模式\n" +"如果模型沒有非常陡峭的懸垂部分,可以使用三明治模式(內-外-內)來提高精度和層次一致性" #: resources/data/hints.ini: [hint:Chamber temperature] msgid "" "Chamber temperature\n" "Did you know that OrcaSlicer supports chamber temperature?" msgstr "" +"機箱溫度\n" +"你知道 OrcaSlicer 支援機箱內溫度控制嗎?" #: resources/data/hints.ini: [hint:Calibration] msgid "" @@ -15857,24 +15705,32 @@ msgid "" "Did you know that calibrating your printer can do wonders? Check out our " "beloved calibration solution in OrcaSlicer." msgstr "" +"校準\n" +"你知道校準列印設備可以帶來奇效嗎?快來看看我們在 OrcaSlicer 中的校準解決方案。" #: resources/data/hints.ini: [hint:Auxiliary fan] msgid "" "Auxiliary fan\n" "Did you know that OrcaSlicer supports Auxiliary part cooling fan?" msgstr "" +"輔助風扇\n" +"你知道 OrcaSlicer 支援輔助零件冷卻風扇嗎?" #: resources/data/hints.ini: [hint:Air filtration] msgid "" "Air filtration/Exhaust Fan\n" "Did you know that OrcaSlicer can support Air filtration/Exhaust Fan?" msgstr "" +"空氣過濾/排風扇\n" +"你知道 OrcaSlicer 支援空氣過濾/排風扇嗎?" #: resources/data/hints.ini: [hint:G-code window] msgid "" "G-code window\n" "You can turn on/off the G-code window by pressing the C key." msgstr "" +"G-code 視窗\n" +"你可以按 C 鍵開啟/關閉 G-code 視窗。" #: resources/data/hints.ini: [hint:Switch workspaces] msgid "" @@ -15882,6 +15738,8 @@ msgid "" "You can switch between Prepare and Preview workspaces by " "pressing the Tab key." msgstr "" +"切換工作區\n" +"你可以按 Tab 鍵在 準備預覽 工作區之間切換。" #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" @@ -15889,6 +15747,8 @@ msgid "" "Did you know that Orca Slicer offers a wide range of keyboard shortcuts and " "3D scene operations." msgstr "" +"如何使用鍵盤快捷鍵\n" +"你知道 Orca Slicer 提供了廣泛的鍵盤快捷鍵和 3D 場景操作嗎?" #: resources/data/hints.ini: [hint:Reverse on odd] msgid "" @@ -15896,6 +15756,8 @@ msgid "" "Did you know that Reverse on odd feature can significantly improve " "the surface quality of your overhangs?" msgstr "" +"奇數反向\n" +"你知道 奇數反向 功能可以顯著改善懸垂部分的表面品質嗎?" #: resources/data/hints.ini: [hint:Cut Tool] msgid "" @@ -15904,7 +15766,7 @@ msgid "" "cutting tool?" msgstr "" "切割工具\n" -"您知道嗎?您可以使用切割工具以任何角度和位置切割模型。" +"你知道嗎?你可以使用切割工具以任何角度和位置切割模型。" #: resources/data/hints.ini: [hint:Fix Model] msgid "" @@ -15912,6 +15774,8 @@ msgid "" "Did you know that you can fix a corrupted 3D model to avoid a lot of slicing " "problems on the Windows system?" msgstr "" +"修復模型\n" +"你知道可以修復損壞的 3D 模型,以避免在 Windows 系統上出現大量切片問題嗎?" #: resources/data/hints.ini: [hint:Timelapse] msgid "" @@ -15919,29 +15783,26 @@ msgid "" "Did you know that you can generate a timelapse video during each print?" msgstr "" "縮時錄影\n" -"您知道嗎?您可以每次列印時產生一段縮時錄影。" +"你知道嗎?你可以每次列印時產生一段縮時錄影。" #: resources/data/hints.ini: [hint:Auto-Arrange] -#, fuzzy msgid "" "Auto-Arrange\n" "Did you know that you can auto-arrange all objects in your project?" msgstr "" "自動擺放\n" -"您知道嗎?您可以自動擺放專案項目中的所有物件。" +"你知道嗎?你可以自動擺放專案項目中的所有物件。" #: resources/data/hints.ini: [hint:Auto-Orient] -#, fuzzy msgid "" "Auto-Orient\n" "Did you know that you can rotate objects to an optimal orientation for " "printing by a simple click?" msgstr "" "自動定向\n" -"您知道嗎,您只需單擊滑鼠,即可將物件旋轉到適合的列印方向。" +"你知道嗎,你只需單擊滑鼠,即可將物件旋轉到適合的列印方向。" #: resources/data/hints.ini: [hint:Lay on Face] -#, fuzzy msgid "" "Lay on Face\n" "Did you know that you can quickly orient a model so that one of its faces " @@ -15949,18 +15810,17 @@ msgid "" "F key." msgstr "" "指定列印物件底部\n" -"您知道嗎,您可以快速指定模型的底面,使其位於列印板上。選擇 \"選擇底面” 功能或" +"你知道嗎,你可以快速指定模型的底面,使其位於列印板上。選擇 \"選擇底面\" 功能或" "按F鍵。" #: resources/data/hints.ini: [hint:Object List] -#, fuzzy msgid "" "Object List\n" "Did you know that you can view all objects/parts in a list and change " "settings for each object/part?" msgstr "" "物件清單\n" -"您知道物件清單嗎?您可以在其中的查看所有物件/零件,並更改每個物件/零件的設" +"你知道物件清單嗎?你可以在其中的查看所有物件/零件,並更改每個物件/零件的設" "定。" #: resources/data/hints.ini: [hint:Search Functionality] @@ -15969,6 +15829,8 @@ msgid "" "Did you know that you use the Search tool to quickly find a specific Orca " "Slicer setting?" msgstr "" +"搜尋功能\n" +"你知道可以使用搜尋工具快速找到特定的設定嗎?" #: resources/data/hints.ini: [hint:Simplify Model] msgid "" @@ -15976,26 +15838,26 @@ msgid "" "Did you know that you can reduce the number of triangles in a mesh using the " "Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" +"簡化模型\n" +"你知道可以使用簡化網格功能來減少網格中的三角形數量嗎?右鍵點擊模型並選擇簡化模型。" #: resources/data/hints.ini: [hint:Slicing Parameter Table] -#, fuzzy msgid "" "Slicing Parameter Table\n" "Did you know that you can view all objects/parts on a table and change " "settings for each object/part?" msgstr "" "參數表格\n" -"您知道嗎?您可以參數表格上的所有物件/零件,並更改每個物件/零件的設定。" +"你知道嗎?你可以看參數表格上的所有物件/零件,並更改每個物件/零件的設定。" #: resources/data/hints.ini: [hint:Split to Objects/Parts] -#, fuzzy msgid "" "Split to Objects/Parts\n" "Did you know that you can split a big object into small ones for easy " "colorizing or printing?" msgstr "" "分割成物件/零件\n" -"您知道嗎,您可以把一個大物件分割成多個小物件/零件以便著色或列印。" +"你知道嗎,你可以把一個大物件分割成多個小物件/零件以便著色或列印。" #: resources/data/hints.ini: [hint:Subtract a Part] msgid "" @@ -16004,9 +15866,11 @@ msgid "" "part modifier? That way you can, for example, create easily resizable holes " "directly in Orca Slicer." msgstr "" +"減去零件\n" +"你知道可以使用負零件修飾器從一個網格中減去另一個網格嗎?" +"這樣,你可以在 Orca Slicer 中輕鬆創建可調整大小的孔洞。" #: resources/data/hints.ini: [hint:STEP] -#, fuzzy msgid "" "STEP\n" "Did you know that you can improve your print quality by slicing a STEP file " @@ -16015,7 +15879,7 @@ msgid "" "lower resolution STL. Give it a try!" msgstr "" "STEP檔案\n" -"您知道嗎,通過切片 STEP 檔案而不是 STL 檔案可以提高列印品質。\n" +"你知道嗎,通過切片 STEP 檔案而不是 STL 檔案可以提高列印品質。\n" " Orca Slicer 支援切片 STEP 檔案,提供比低解析度 STL 更平滑的結果。試試看!" #: resources/data/hints.ini: [hint:Z seam location] @@ -16026,7 +15890,7 @@ msgid "" "the overall look of your model. Check it out!" msgstr "" "Z接縫位置\n" -"您知道嗎,您可以自訂Z接縫的位置,甚至可以將其繪製在列印上,使其位於不太可見的" +"你知道嗎,你可以自訂Z接縫的位置,甚至可以將其繪製在列印上,使其位於不太可見的" "位置。這樣可以改善模型的整體外觀。試試看!" #: resources/data/hints.ini: [hint:Fine-tuning for flow rate] @@ -16037,11 +15901,10 @@ msgid "" "printed model by doing some fine-tuning." msgstr "" "流量微調\n" -"你知道嗎,您可以微調流量,以獲得更好看的列印效果。根據線材的不同,可以通過進" +"你知道嗎,你可以微調流量,以獲得更好看的列印效果。根據線材的不同,可以通過進" "行一些微調來提高列印模型的整體光潔度。" #: resources/data/hints.ini: [hint:Split your prints into plates] -#, fuzzy msgid "" "Split your prints into plates\n" "Did you know that you can split a model that has a lot of parts into " @@ -16049,7 +15912,7 @@ msgid "" "track of all the parts." msgstr "" "分類列印\n" -"您知道嗎,您可以把一個有很多零件的模型安排到多個獨立的列印板,然後列印出來," +"你知道嗎,你可以把一個有很多零件的模型安排到多個獨立的列印板,然後列印出來," "這將簡化對所有零件的管理。" #: resources/data/hints.ini: [hint:Speed up your print with Adaptive Layer @@ -16060,7 +15923,7 @@ msgid "" "Layer Height option? Check it out!" msgstr "" "自適應層高度加速列印\n" -"您知道嗎,您可以使用“自適應層高度”選項可以更快地列印模型。試試看!" +"你知道嗎,你可以使用\"自適應層高度\"選項可以更快地列印模型。試試看!" #: resources/data/hints.ini: [hint:Support painting] msgid "" @@ -16070,7 +15933,7 @@ msgid "" "model that actually need it." msgstr "" "自訂支撐\n" -"您知道嗎,您可以手動繪製增加/隱藏支撐的位置,此功能使僅將支撐材料放置在實際需" +"你知道嗎,你可以手動繪製增加/隱藏支撐的位置,此功能使僅將支撐材料放置在實際需" "要的模型截面上變得容易。" #: resources/data/hints.ini: [hint:Different types of supports] @@ -16081,7 +15944,7 @@ msgid "" "print speed. Check them out!" msgstr "" "支撐類型\n" -"您知道嗎,有多種可選的支撐類型,樹狀支撐非常適合人物/動物模型,同時可以節耗材" +"你知道嗎,有多種可選的支撐類型,樹狀支撐非常適合人物/動物模型,同時可以節線材" "並提高列印速度。試試看!" #: resources/data/hints.ini: [hint:Printing Silk Filament] @@ -16092,7 +15955,7 @@ msgid "" "the best results." msgstr "" "列印絲綢線材\n" -"你知道嗎,絲綢耗材需要特別考慮才能成功列印。為了獲得最佳效果,通常建議使用較" +"你知道嗎,絲綢線材需要特別考慮才能成功列印。為了獲得最佳效果,通常建議使用較" "高的溫度和較低的速度。" #: resources/data/hints.ini: [hint:Brim for better adhesion] @@ -16102,21 +15965,19 @@ msgid "" "the printing surface, it's recommended to use a brim?" msgstr "" "使用 Brim(裙邊)\n" -"您知道嗎?當模型與熱床表面的接觸面積較小時,建議使用 brim(裙邊)以提高列印成" +"你知道嗎?當模型與熱床表面的接觸面積較小時,建議使用 brim(裙邊)以提高列印成" "功率。" #: resources/data/hints.ini: [hint:Set parameters for multiple objects] -#, fuzzy msgid "" "Set parameters for multiple objects\n" "Did you know that you can set slicing parameters for all selected objects at " "one time?" msgstr "" "為多個物件設定參數\n" -"您知道嗎,可以同時為所有選取的物件設定切片參數。" +"你知道嗎,你可以同時為所有選取的物件設定切片參數。" #: resources/data/hints.ini: [hint:Stack objects] -#, fuzzy msgid "" "Stack objects\n" "Did you know that you can stack objects as a whole one?" @@ -16125,7 +15986,6 @@ msgstr "" "你知道嗎?你可以把多個物件組合為一個整體。" #: resources/data/hints.ini: [hint:Flush into support/objects/infill] -#, fuzzy msgid "" "Flush into support/objects/infill\n" "Did you know that you can save the wasted filament by flushing them into " @@ -16151,6 +16011,9 @@ msgid "" "extruder/hotend clogging when printing lower temperature filament with a " "higher enclosure temperature. More info about this in the Wiki." msgstr "" +"需要在開啟列印設備門的情況下列印\n" +"你知道當列印低溫耗材且機身溫度較高時,開啟列印設備門可以減少擠出機/熱端堵塞的機率嗎?" +"更多資訊請參閱Wiki。" #: resources/data/hints.ini: [hint:Avoid warping] msgid "" @@ -16159,14 +16022,14 @@ msgid "" "ABS, appropriately increasing the heatbed temperature can reduce the " "probability of warping." msgstr "" +"避免翹曲\n" +"你知道當列印容易翹曲的材料(如 ABS)時,適當提高熱床溫度可以降低翹曲的機率嗎?" -#, fuzzy #~ msgid "Cool Plate" #~ msgstr "低溫列印板" -#, fuzzy #~ msgid "Reverse on odd" -#~ msgstr "反轉奇數層懸空方向" +#~ msgstr "反轉奇數層方向" #, no-c-format, no-boost-format #~ msgid "" @@ -16177,7 +16040,6 @@ msgstr "" #~ "判定懸空反轉需要的值(mm),可以是線寬的百分比。\n" #~ " 0 值則會在每個奇數層上啟用反向。" -#, fuzzy #~ msgid "" #~ "While printing by Object, the extruder may collide skirt.\n" #~ "Thus, reset the skirt layer to 1 to avoid that." @@ -16211,11 +16073,11 @@ msgstr "" #~ msgstr "有限" #~ msgid "Shrinkage" -#~ msgstr "耗材收縮率" +#~ msgstr "線材收縮率" #, fuzzy #~ msgid "" -#~ "Decrease this value slightly(for example 0.9) to reduce the amount of " +#~ "Decrease this value slightly(for example 0.9)to reduce the amount of " #~ "material for bridge, to improve sag" #~ msgstr "稍微減小這個數值(比如 0.9)可以減小橋接的線材量,來改善下垂。" @@ -16252,7 +16114,7 @@ msgstr "" #~ msgstr "切換線材時,退料所需時間。只用於統計資訊。" #~ msgid "" -#~ "Time for the printer firmware (or the Multi Material Unit 2.0) to load a " +#~ "Time for the printer firmware (or the Multi Material Unit 2.0)to load a " #~ "new filament during a tool change (when executing the T code). This time " #~ "is added to the total print time by the G-code time estimator." #~ msgstr "" @@ -16261,7 +16123,7 @@ msgstr "" #~ "上去。" #~ msgid "" -#~ "Time for the printer firmware (or the Multi Material Unit 2.0) to unload " +#~ "Time for the printer firmware (or the Multi Material Unit 2.0)to unload " #~ "a filament during a tool change (when executing the T code). This time is " #~ "added to the total print time by the G-code time estimator." #~ msgstr "" @@ -16272,7 +16134,6 @@ msgstr "" #~ msgid "Filter out gaps smaller than the threshold specified" #~ msgstr "忽略小於指定數值的間隙" -#, fuzzy #~ msgid "" #~ "Enable this option for chamber temperature control. An M191 command will " #~ "be added before \"machine_start_gcode\"\n" @@ -16283,13 +16144,11 @@ msgstr "" #~ "G碼指令:M141/M191 S(0-255)" #~ msgid "Wipe tower extruder" -#~ msgstr "擦拭塔擠出機" +#~ msgstr "換料塔擠出機" -#, fuzzy #~ msgid "Printer local connection failed, please try again." #~ msgstr "列印設備區域網路連接失敗,請重試。" -#, fuzzy #~ msgid "" #~ "Please find the details of Flow Dynamics Calibration from our wiki.\n" #~ "\n" @@ -16304,7 +16163,7 @@ msgstr "" #~ "Please note there are a few cases that will make the calibration result " #~ "not reliable: using a texture plate to do the calibration; the build " #~ "plate does not have good adhesion (please wash the build plate or apply " -#~ "gluestick!) ...You can find more from our wiki.\n" +#~ "gluestick!)...You can find more from our wiki.\n" #~ "\n" #~ "The calibration results have about 10 percent jitter in our test, which " #~ "may cause the result not exactly the same in each calibration. We are " @@ -16312,13 +16171,13 @@ msgstr "" #~ msgstr "" #~ "請從我們的wiki中找到流量動態校準的詳細資訊。\n" #~ "\n" -#~ "通常情況下,校準是不必要的。當您開始單色/單線材列印,並在列印開始選單中勾" -#~ "選了“流量動態校準”選項時,列印設備將按照舊的方式,在列印前校準絲料;當您開" +#~ "通常情況下,校準是不必要的。當你開始單色/單線材列印,並在列印開始選單中勾" +#~ "選了\"流量動態校準\"選項時,列印設備將按照舊的方式,在列印前校準絲料;當你開" #~ "始多色/多線材列印時,列印設備將在每次換絲料時使用預設的補償參數,這在大多" #~ "數情況下會產生良好的效果。\n" #~ "\n" #~ "請注意,有幾種情況會導致校準結果不可靠:使用紋理板進行校準;建模平台黏附效" -#~ "果不好(請清洗建模平台或塗抹膠棒)... 您可以在我們的wiki中找到更多資訊。\n" +#~ "果不好(請清洗建模平台或塗抹膠棒)... 你可以在我們的wiki中找到更多資訊。\n" #~ "\n" #~ "在我們的測試中,校準結果有約 10% 的波動,這可能導致每次校準的結果略有不" #~ "同。我們仍在調查根本原因,並通過新的更新進行改進。" @@ -16328,7 +16187,7 @@ msgstr "" #~ "you want to overrides the other results?" #~ msgstr "相同名稱的結果只會儲存一個。確定要覆蓋其他結果嗎?" -#, fuzzy, c-format, boost-format +#, c-format, boost-format #~ msgid "" #~ "There is already a historical calibration result with the same name: %s. " #~ "Only one of the results with the same name is saved. Are you sure you " @@ -16337,14 +16196,12 @@ msgstr "" #~ "已經存在一個具有相同名稱的校準結果:%s。相同名稱的結果只會儲存一個。確定要" #~ "覆蓋嗎?" -#, fuzzy #~ msgid "Please find the cornor with perfect degree of extrusion" -#~ msgstr "請在您的列印板上找到最接近完美的直角" +#~ msgstr "請在你的列印板上找到最接近完美的直角" #~ msgid "V" #~ msgstr "版本:" -#, fuzzy #~ msgid "" #~ "Orca Slicer is based on BambuStudio by Bambulab, which is from " #~ "PrusaSlicer by Prusa Research. PrusaSlicer is from Slic3r by Alessandro " @@ -16354,7 +16211,6 @@ msgstr "" #~ "Prusa Research 的 PrusaSlicer。PrusaSlicer 源自於 Alessandro Ranellucci " #~ "的 Slic3r 和 RepRap 社群" -#, fuzzy #~ msgid "Export &Configs" #~ msgstr "匯出設定檔" @@ -16396,24 +16252,20 @@ msgstr "" #~ msgid "Cabin humidity" #~ msgstr "AMS 內部濕度" -#, fuzzy #~ msgid "" #~ "Green means that AMS humidity is normal, orange represent humidity is " #~ "high, red represent humidity is too high.(Hygrometer: lower the better.)" #~ msgstr "" -#~ "綠色表示 AMS 濕度正常,橙色表示濕度高,紅色表示濕度過高。(濕度計:越低越" -#~ "好。)" +#~ "綠色表示 AMS 濕度正常,橙色表示濕度高,紅色表示濕度過高。(濕度計:越低越好。)" #~ msgid "Desiccant status" #~ msgstr "乾燥劑狀態" -#, fuzzy #~ msgid "" #~ "A desiccant status lower than two bars indicates that desiccant may be " #~ "inactive. Please change the desiccant.(The bars: higher the better.)" #~ msgstr "" -#~ "乾燥劑狀態低於兩格表示乾燥劑可能是趨近無效。請更換乾燥劑。(指示格:越高越" -#~ "好)。" +#~ "乾燥劑狀態低於兩格表示乾燥劑可能是趨近無效。請更換乾燥劑。(指示格:越高越好。)" #~ msgid "" #~ "Note: When the lid is open or the desiccant pack is changed, it can take " @@ -16428,8 +16280,7 @@ msgstr "" #~ "Note: if new filament is inserted during printing, the AMS will not " #~ "automatically read any information until printing is completed." #~ msgstr "" -#~ "注意:如果是在列印過程中插入新的線材,AMS 會在列印作業結束後自動讀取此線材" -#~ "信息。" +#~ "注意:如果是在列印過程中插入新的線材,AMS 會在列印作業結束後自動讀取此線材信息。" #, boost-format #~ msgid "Succeed to export G-code to %1%" @@ -16441,19 +16292,16 @@ msgstr "" #~ msgid "Initialize failed (No Camera Device)!" #~ msgstr "初始化失敗(沒有攝影機)" -#, fuzzy #~ msgid "" #~ "Printer is busy downloading, Please wait for the downloading to finish." #~ msgstr "列印設備正忙於下載,請等待下載完成。" -#, fuzzy #~ msgid "Initialize failed (Not supported on the current printer version)!" #~ msgstr "初始化失敗(目前列印設備的版本不支援)!" #~ msgid "Initialize failed (Not accessible in LAN-only mode)!" #~ msgstr "初始化失敗(在區域網路模式中不可存取)!" -#, fuzzy #~ msgid "Initialize failed (Missing LAN ip of printer)!" #~ msgstr "初始化失敗(未找到列印設備的區域網路地址)!" @@ -16473,7 +16321,6 @@ msgstr "" #~ msgid "Load failed [%d]" #~ msgstr "載入失敗 [%d]" -#, fuzzy #~ msgid "Failed to fetching model information from printer." #~ msgstr "無法從列印設備獲取模型資訊。" @@ -16483,26 +16330,24 @@ msgstr "" #, boost-format #~ msgid "" #~ "You have changed some settings of preset \"%1%\". \n" -#~ "Would you like to keep these changed settings (new value) after switching " +#~ "Would you like to keep these changed settings (new value)after switching " #~ "preset?" -#~ msgstr "您已經更改了預設 \"%1%\",是否在切換後要保留這些更改的預設參數?" +#~ msgstr "你已經更改了預設 \"%1%\",是否在切換後要保留這些更改的預設參數?" #~ msgid "" #~ "You have changed some preset settings. \n" -#~ "Would you like to keep these changed settings (new value) after switching " +#~ "Would you like to keep these changed settings (new value)after switching " #~ "preset?" -#~ msgstr "您已經更改了預設參數,是否在切換後要保留這些更改的預設參數?" +#~ msgstr "你已經更改了預設參數,是否在切換後要保留這些更改的預設參數?" #~ msgid "" #~ "Add solid infill near sloping surfaces to guarantee the vertical shell " #~ "thickness (top+bottom solid layers)" #~ msgstr "在斜面表面附近增加實心填充,以保證垂直外殼厚度(頂部+底部實心層)" -#, fuzzy #~ msgid "Configuration package updated to " #~ msgstr "設定檔已更新到" -#, fuzzy #~ msgid "" #~ "Improve shell precision by adjusting outer wall spacing. This also " #~ "improves layer consistency." @@ -16513,13 +16358,11 @@ msgstr "" #~ "layer cooling is enabled, when printing overhangs and when feature speeds " #~ "are not specified explicitly." #~ msgstr "" -#~ "線材最小列印速度。當啟用減速以實現更好的層冷卻、列印懸空以及未明確指定特徵" -#~ "速度時" +#~ "線材最小列印速度。當啟用減速以實現更好的層冷卻、列印懸空以及未明確指定特徵速度時" #~ msgid "No sparse layers (EXPERIMENTAL)" #~ msgstr "無稀疏層(实验性功能)" -#, fuzzy #~ msgid "The Config can not be loaded." #~ msgstr "設定檔無法載入。" @@ -16604,10 +16447,9 @@ msgstr "" #~ "model. Read more in the documentation." #~ msgstr "" #~ "簡化模型\n" -#~ "您知道嗎,您可以使用“簡化模型”功能減少模型的三角形數。在模型上單擊滑鼠右" -#~ "鍵,然後選擇“簡化模型”。" +#~ "你知道嗎,你可以使用\"簡化模型\"功能減少模型的三角形數。在模型上單擊滑鼠右" +#~ "鍵,然後選擇\"簡化模型\"。" -#, fuzzy #~ msgid "" #~ "Subtract a Part\n" #~ "Did you know that you can subtract one mesh from another using the " @@ -16615,7 +16457,7 @@ msgstr "" #~ "resizable holes directly in Orca Slicer. Read more in the documentation." #~ msgstr "" #~ "減去部分幾何體\n" -#~ "您知道嗎,您可以使用負零件從另一個幾何體中減去另一個幾何體。例如,可以直接" +#~ "你知道嗎,你可以使用負零件從另一個幾何體中減去另一個幾何體。例如,可以直接" #~ "在 Orca Slicer 中建立可輕鬆調整大小的孔。" #~ msgid "Filling bed " @@ -16637,17 +16479,15 @@ msgstr "" #~ msgid "Please heat the nozzle to above 170 degree before loading filament." #~ msgstr "請在進料前把噴嘴升溫到 170℃" -#, fuzzy #~ msgid "Show g-code window" #~ msgstr "顯示 G-code 視窗" -#, fuzzy #~ msgid "If enabled, g-code window will be displayed." #~ msgstr "如果啟用,將顯示 G-Code 視窗。" -#, fuzzy, c-format +#, c-format #~ msgid "Density of internal sparse infill, 100% means solid throughout" -#~ msgstr "內部稀疏填充密度,100%% 表示整體實心" +#~ msgstr "內部填充密度,100% 表示整體實心" #~ msgid "Tree support wall loops" #~ msgstr "樹狀支撐外牆層數" @@ -16671,15 +16511,12 @@ msgstr "" #~ msgid "Check cloud service status" #~ msgstr "檢查雲端服務狀態" -#, fuzzy #~ msgid "Please input a valid value (K in 0~0.5)" #~ msgstr "請輸入有效的數值(K 值的範圍為 0~0.5)" -#, fuzzy #~ msgid "Please input a valid value (K in 0~0.5, N in 0.6~2.0)" #~ msgstr "請輸入有效的數值(K 值的範圍為 0~0.5, N 值的範圍為 0.6~2.0)" -#, fuzzy #~ msgid "Export all objects as STL" #~ msgstr "匯出所有物件為 STL" @@ -16689,11 +16526,9 @@ msgstr "" #~ msgid "Incompatible 3mf" #~ msgstr "不相容的 3mf" -#, fuzzy #~ msgid "Add/Remove printers" #~ msgstr "新增/刪除列印設備" -#, fuzzy #~ msgid "" #~ "When print by object, machines with I3 structure will not generate " #~ "timelapse videos." @@ -16703,7 +16538,6 @@ msgstr "" #~ msgid "%s is not supported by AMS." #~ msgstr "AMS 不支援 %s 。" -#, fuzzy #~ msgid "Don't remind me of this version again" #~ msgstr "不要再提醒我這個版本" @@ -16739,35 +16573,27 @@ msgstr "" #~ msgid "inner-outer-inner/infill" #~ msgstr "內牆/外牆/內牆/填充" -#, fuzzy #~ msgid "Export 3MF" #~ msgstr "匯出 3MF" -#, fuzzy #~ msgid "Export project as 3MF." -#~ msgstr "匯出項目為 3MF。" +#~ msgstr "匯出專案為 3MF。" -#, fuzzy #~ msgid "Export slicing data" #~ msgstr "匯出切片資料" -#, fuzzy #~ msgid "Export slicing data to a folder." #~ msgstr "匯出切片資料到資料夾" -#, fuzzy #~ msgid "Load slicing data" #~ msgstr "匯入切片資料" -#, fuzzy #~ msgid "Load cached slicing data from directory" -#~ msgstr "從目錄匯入快取的切片資料" +#~ msgstr "從目錄匯入切片資料的快取" -#, fuzzy #~ msgid "Export STL" #~ msgstr "匯出 STL 檔案" -#, fuzzy #~ msgid "Export the objects as multiple STL." #~ msgstr "將物件匯出為多個 STL 檔案" @@ -16780,23 +16606,18 @@ msgstr "" #~ msgid "Show command help." #~ msgstr "顯示命令行幫助。" -#, fuzzy #~ msgid "Update the configs values of 3mf to latest." #~ msgstr "將 3mf 的設定值更新為最新值。" -#, fuzzy #~ msgid "Load default filaments" #~ msgstr "載入預設列印線材" -#, fuzzy #~ msgid "Load first filament as default for those not loaded" -#~ msgstr "載入第一個列印線材為預設線材" +#~ msgstr "載入第一個列印線材為預設代替未能載入的線材" -#, fuzzy #~ msgid "max triangle count per plate for slicing." #~ msgstr "切片時每個列印板的最大三角形數。" -#, fuzzy #~ msgid "max slicing time per plate in seconds." #~ msgstr "每個列印板的最大切片時間(秒)。" @@ -16812,11 +16633,9 @@ msgstr "" #~ msgid "Output the model's information." #~ msgstr "輸出模型的資訊。" -#, fuzzy #~ msgid "Export Settings" #~ msgstr "匯出設定" -#, fuzzy #~ msgid "Export settings to a file." #~ msgstr "匯出設定檔到檔案。" @@ -16853,19 +16672,15 @@ msgstr "" #~ msgid "Scale the model by a float factor" #~ msgstr "根據因子縮放模型" -#, fuzzy #~ msgid "Load General Settings" #~ msgstr "載入一般設定" -#, fuzzy #~ msgid "Load process/machine settings from the specified file" #~ msgstr "從指定檔案載入列印參數/設備設定" -#, fuzzy #~ msgid "Load Filament Settings" #~ msgstr "載入線材設定" -#, fuzzy #~ msgid "Load filament settings from the specified file list" #~ msgstr "從指定檔案清單載入線材設定" @@ -16894,7 +16709,6 @@ msgstr "" #~ msgid "Debug level" #~ msgstr "除錯等級" -#, fuzzy #~ msgid "" #~ "Sets debug logging level. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" #~ "trace\n" @@ -16902,11 +16716,10 @@ msgstr "" #~ "設定除錯日誌等級。0:fatal, 1:error, 2:warning, 3:info, 4:debug, " #~ "5:trace\n" -#, fuzzy, boost-format +#, boost-format #~ msgid "The selected preset: %1% is not found." #~ msgstr "未找到選定的預設值:%1%。" -#, fuzzy #~ msgid "" #~ "3D Scene Operations\n" #~ "Did you know how to control view and object/part selection with mouse and " @@ -16915,24 +16728,22 @@ msgstr "" #~ "3D 場景操作\n" #~ "如何在 3D 場景中使用滑鼠和觸碰面板進行視角控制和物件/零件選擇" -#, fuzzy #~ msgid "" #~ "Fix Model\n" #~ "Did you know that you can fix a corrupted 3D model to avoid a lot of " #~ "slicing problems?" #~ msgstr "" #~ "修復模型\n" -#~ "您知道嗎?您可以修復一個損壞的 3D 模型以避免諸多切片問題。" +#~ "你知道嗎?你可以修復一個損壞的 3D 模型以避免諸多切片問題。" -#, fuzzy #~ msgid "" #~ "When need to print with the printer door opened\n" #~ "Opening the printer door can reduce the probability of extruder/hotend " #~ "clogging when printing lower temperature filament with a higher enclosure " #~ "temperature. More info about this in the Wiki." #~ msgstr "" -#~ "當需要打開印表機門進行列印時\n" -#~ "當列印較低溫度的耗材時,打開印表機門可以減少擠出機或熱端堵塞的可能性。 有" +#~ "當需要打開列印設備門進行列印時\n" +#~ "當列印較低溫度的線材時,打開列印設備門可以減少擠出機或熱端堵塞的可能性。 有" #~ "關此內容的更多信息,請參見 Wiki。" #~ msgid "Embedded" @@ -16948,9 +16759,8 @@ msgstr "" #~ msgid "Online Models" #~ msgstr "線上模型" -#, fuzzy #~ msgid "Show online staff-picked models on the home page" -#~ msgstr "在首頁上顯示工作人員推薦的線上模型" +#~ msgstr "在首頁上顯示推薦的模型" #, c-format #~ msgid "" @@ -16982,7 +16792,7 @@ msgstr "" #~ "The bed temperature exceeds filament's vitrification temperature. Please " #~ "open the front door of printer before printing to avoid nozzle clog." #~ msgstr "" -#~ "熱床溫度超過了線材的軟化溫度。請在列印前打開3D列印機前門以防堵頭。" +#~ "熱床溫度超過了線材的軟化溫度。請在列印前打開3D列印設備前門以防堵頭。" #~ msgid "Temperature of vitrificaiton" #~ msgstr "軟化溫度" @@ -16993,14 +16803,14 @@ msgstr "" #~ msgstr "材料在這個溫度開始變軟。因此熱床溫度不能超過這個溫度。" #~ msgid "Enable this option if machine has auxiliary part cooling fan" -#~ msgstr "如果機器有輔助部件冷卻風扇,勾選該選項" +#~ msgstr "如果機器有輔助物件冷卻風扇,勾選該選項" #~ 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" #~ msgstr "" -#~ "輔助部件冷卻風扇的轉速。輔助部件冷卻風扇將一直運行在該速度,除了設置的無需" +#~ "輔助物件冷卻風扇的轉速。輔助物件冷卻風扇將一直運行在該速度,除了設置的無需" #~ "冷卻的前若干層" #~ msgid "" @@ -17040,7 +16850,7 @@ msgstr "" #~ "circulation or reduce the temperature of the hot bed" #~ msgstr "" #~ "熱床溫度超過了線材的軟化溫度,線材軟化可能造成噴頭堵塞。\n" -#~ "請保持3D列印機在列印過程中敞開,保證空氣流通或降低熱床溫度" +#~ "請保持3D列印設備在列印過程中敞開,保證空氣流通或降低熱床溫度" #~ msgid "Total Time Estimation" #~ msgstr "總時間預估" @@ -17052,7 +16862,7 @@ msgstr "" #~ msgstr "立即打分" #~ msgid "Please give a score for your favorite Bambu Market model." -#~ msgstr "請為您喜歡的 Bambu 商城模型打分。" +#~ msgstr "請為你喜歡的 Bambu 商城模型打分。" #~ msgid "Score" #~ msgstr "打分" @@ -17061,7 +16871,7 @@ msgstr "" #~ msgstr "高溫列印熱床" #~ msgid "Can't connect to the printer" -#~ msgstr "無法連接3D列印機" +#~ msgstr "無法連接列印設備" #~ msgid "Recommended temperature range" #~ msgstr "建議溫度範圍" From 604ded5ff060b062d78e164d517e25ea477944ee Mon Sep 17 00:00:00 2001 From: Eryone <40707672+Eryone@users.noreply.github.com> Date: Sun, 5 Jan 2025 13:36:20 +0800 Subject: [PATCH 15/33] Add profiles for new printer Eryone Thinker X400 (#7365) * add printer Eryone Thinker X400 add printer Eryone Thinker X400 * Update fdm_process_common.json replace zig-zag * Update Thinker X400_cover.png --- resources/profiles/Eryone.json | 82 ++++++ .../profiles/Eryone/Thinker X400_cover.png | Bin 0 -> 36514 bytes resources/profiles/Eryone/Thinker_texture.png | Bin 0 -> 19520 bytes resources/profiles/Eryone/X400_bed.stl | Bin 0 -> 969984 bytes .../Eryone/filament/Eryone Generic ABS.json | 54 ++++ .../Eryone/filament/Eryone Generic ASA.json | 54 ++++ .../Eryone/filament/Eryone Generic PETG.json | 49 ++++ .../Eryone/filament/Eryone Generic PLA.json | 31 +++ .../filament/Eryone Generic Silk PLA.json | 34 +++ .../Eryone/filament/Eryone Generic TPU.json | 43 +++ .../Eryone/filament/Eryone Standard PLA.json | 250 ++++++++++++++++++ .../Eryone/filament/fdm_filament_common.json | 132 +++++++++ .../Eryone/filament/fdm_filament_pla.json | 91 +++++++ .../machine/Thinker X400 0.4 nozzle.json | 211 +++++++++++++++ .../profiles/Eryone/machine/Thinker X400.json | 12 + .../Eryone/machine/fdm_machine_common.json | 174 ++++++++++++ .../0.12mm Standard @Thinker X400.json | 27 ++ .../0.16mm Standard @Thinker X400.json | 27 ++ .../0.20mm Standard @Thinker X400.json | 242 +++++++++++++++++ .../0.24mm Standard @Thinker X400.json | 24 ++ .../Eryone/process/fdm_process_common.json | 118 +++++++++ 21 files changed, 1655 insertions(+) create mode 100644 resources/profiles/Eryone.json create mode 100644 resources/profiles/Eryone/Thinker X400_cover.png create mode 100644 resources/profiles/Eryone/Thinker_texture.png create mode 100644 resources/profiles/Eryone/X400_bed.stl create mode 100644 resources/profiles/Eryone/filament/Eryone Generic ABS.json create mode 100644 resources/profiles/Eryone/filament/Eryone Generic ASA.json create mode 100644 resources/profiles/Eryone/filament/Eryone Generic PETG.json create mode 100644 resources/profiles/Eryone/filament/Eryone Generic PLA.json create mode 100644 resources/profiles/Eryone/filament/Eryone Generic Silk PLA.json create mode 100644 resources/profiles/Eryone/filament/Eryone Generic TPU.json create mode 100644 resources/profiles/Eryone/filament/Eryone Standard PLA.json create mode 100644 resources/profiles/Eryone/filament/fdm_filament_common.json create mode 100644 resources/profiles/Eryone/filament/fdm_filament_pla.json create mode 100644 resources/profiles/Eryone/machine/Thinker X400 0.4 nozzle.json create mode 100644 resources/profiles/Eryone/machine/Thinker X400.json create mode 100644 resources/profiles/Eryone/machine/fdm_machine_common.json create mode 100644 resources/profiles/Eryone/process/0.12mm Standard @Thinker X400.json create mode 100644 resources/profiles/Eryone/process/0.16mm Standard @Thinker X400.json create mode 100644 resources/profiles/Eryone/process/0.20mm Standard @Thinker X400.json create mode 100644 resources/profiles/Eryone/process/0.24mm Standard @Thinker X400.json create mode 100644 resources/profiles/Eryone/process/fdm_process_common.json diff --git a/resources/profiles/Eryone.json b/resources/profiles/Eryone.json new file mode 100644 index 00000000000..7bbaf375d8e --- /dev/null +++ b/resources/profiles/Eryone.json @@ -0,0 +1,82 @@ +{ + "name": "Thinker X400", + "version": "01.09.00.02", + "force_update": "0", + "description": "Eryone configurations", + "machine_model_list": [ + { + "name": "Thinker X400", + "sub_path": "machine/Thinker X400.json" + } + ], + "process_list": [ + { + "name": "fdm_process_common", + "sub_path": "process/fdm_process_common.json" + }, + { + "name": "0.20mm Standard @Thinker X400", + "sub_path": "process/0.20mm Standard @Thinker X400.json" + }, + { + "name": "0.12mm Standard @Thinker X400", + "sub_path": "process/0.12mm Standard @Thinker X400.json" + }, + { + "name": "0.16mm Standard @Thinker X400", + "sub_path": "process/0.16mm Standard @Thinker X400.json" + }, + { + "name": "0.24mm Standard @Thinker X400", + "sub_path": "process/0.24mm Standard @Thinker X400.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": "Eryone Standard PLA", + "sub_path": "filament/Eryone Standard PLA.json" + }, + { + "name": "Eryone Generic PLA", + "sub_path": "filament/Eryone Generic PLA.json" + }, + { + "name": "Eryone Generic ABS", + "sub_path": "filament/Eryone Generic ABS.json" + }, + { + "name": "Eryone Generic PETG", + "sub_path": "filament/Eryone Generic PETG.json" + }, + { + "name": "Eryone Generic ASA", + "sub_path": "filament/Eryone Generic ASA.json" + }, + { + "name": "Eryone Generic Silk PLA", + "sub_path": "filament/Eryone Generic Silk PLA.json" + }, + { + "name": "Eryone Generic TPU", + "sub_path": "filament/Eryone Generic TPU.json" + } + ], + "machine_list": [ + { + "name": "fdm_machine_common", + "sub_path": "machine/fdm_machine_common.json" + }, + { + "name": "Thinker X400 0.4 nozzle", + "sub_path": "machine/Thinker X400 0.4 nozzle.json" + } + ] +} diff --git a/resources/profiles/Eryone/Thinker X400_cover.png b/resources/profiles/Eryone/Thinker X400_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..9c2985e6db13db339bf6f5e4d26eb7ad0f07fee0 GIT binary patch literal 36514 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/Eryone/filament/Eryone Generic ABS.json b/resources/profiles/Eryone/filament/Eryone Generic ABS.json new file mode 100644 index 00000000000..91f0c59d72c --- /dev/null +++ b/resources/profiles/Eryone/filament/Eryone Generic ABS.json @@ -0,0 +1,54 @@ +{ + "type": "filament", + "filament_id": "EFL91", + "setting_id": "EFSA01", + "name": "Eryone Generic ABS", + "from": "system", + "instantiation": "true", + "inherits": "Eryone Standard PLA", + "compatible_printers": [ + "Thinker X400 0.4 nozzle" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "60" + ], + "fan_min_speed": [ + "30" + ], + "filament_settings_id": [ + "Eryone Generic ABS" + ], + "filament_type": [ + "ABS" + ], + "filament_vendor": [ + "Eryone" + ], + "hot_plate_temp": [ + "115" + ], + "hot_plate_temp_initial_layer": [ + "115" + ], + "nozzle_temperature": [ + "250" + ], + "nozzle_temperature_initial_layer": [ + "250" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "slow_down_layer_time": [ + "12" + ] +} diff --git a/resources/profiles/Eryone/filament/Eryone Generic ASA.json b/resources/profiles/Eryone/filament/Eryone Generic ASA.json new file mode 100644 index 00000000000..9fffd9ed921 --- /dev/null +++ b/resources/profiles/Eryone/filament/Eryone Generic ASA.json @@ -0,0 +1,54 @@ +{ + "type": "filament", + "filament_id": "EFL92", + "setting_id": "EFSA02", + "name": "Eryone Generic ASA", + "from": "system", + "instantiation": "true", + "inherits": "Eryone Standard PLA", + "compatible_printers": [ + "Thinker X400 0.4 nozzle" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "30" + ], + "fan_min_speed": [ + "30" + ], + "filament_settings_id": [ + "Eryone Generic ASA" + ], + "filament_type": [ + "ASA" + ], + "filament_vendor": [ + "Eryone" + ], + "hot_plate_temp": [ + "115" + ], + "hot_plate_temp_initial_layer": [ + "115" + ], + "nozzle_temperature": [ + "265" + ], + "nozzle_temperature_initial_layer": [ + "265" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "slow_down_layer_time": [ + "12" + ] +} diff --git a/resources/profiles/Eryone/filament/Eryone Generic PETG.json b/resources/profiles/Eryone/filament/Eryone Generic PETG.json new file mode 100644 index 00000000000..c9fc9060bef --- /dev/null +++ b/resources/profiles/Eryone/filament/Eryone Generic PETG.json @@ -0,0 +1,49 @@ +{ + "type": "filament", + "filament_id": "EFL93", + "setting_id": "EFSA03", + "name": "Eryone Generic PETG", + "from": "system", + "instantiation": "true", + "inherits": "Eryone Standard PLA", + "compatible_printers": [ + "Thinker X400 0.4 nozzle" + ], + "fan_min_speed": [ + "90" + ], + "close_fan_the_first_x_layers": [ + "2" + ], + "filament_vendor": [ + "Eryone" + ], + "filament_settings_id": [ + "Eryone Generic PETG" + ], + "filament_type": [ + "PETG" + ], + + "hot_plate_temp": [ + "85" + ], + "hot_plate_temp_initial_layer": [ + "85" + ], + "nozzle_temperature": [ + "245" + ], + "nozzle_temperature_initial_layer": [ + "245" + ], + "nozzle_temperature_range_high": [ + "270" + ], + "nozzle_temperature_range_low": [ + "225" + ], + "slow_down_layer_time": [ + "8" + ] +} diff --git a/resources/profiles/Eryone/filament/Eryone Generic PLA.json b/resources/profiles/Eryone/filament/Eryone Generic PLA.json new file mode 100644 index 00000000000..8b9d23b072f --- /dev/null +++ b/resources/profiles/Eryone/filament/Eryone Generic PLA.json @@ -0,0 +1,31 @@ +{ + "type": "filament", + "filament_id": "EFL90", + "setting_id": "EFSA00", + "name": "Eryone Generic PLA", + "from": "system", + "instantiation": "true", + "inherits": "Eryone Standard PLA", + "compatible_printers": [ + "Thinker X400 0.4 nozzle" + ], + "fan_min_speed": [ + "90" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "filament_settings_id": [ + "Eryone Generic PLA" + ], + "from": "User", + "hot_plate_temp": [ + "65" + ], + "slow_down_layer_time": [ + "4" + ], + "slow_down_min_speed": [ + "15" + ] +} diff --git a/resources/profiles/Eryone/filament/Eryone Generic Silk PLA.json b/resources/profiles/Eryone/filament/Eryone Generic Silk PLA.json new file mode 100644 index 00000000000..6fce0687c69 --- /dev/null +++ b/resources/profiles/Eryone/filament/Eryone Generic Silk PLA.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "filament_id": "EFL941", + "setting_id": "EFSA041", + "name": "Eryone Generic Silk PLA", + "from": "system", + "instantiation": "true", + "inherits": "Eryone Standard PLA", + "compatible_printers": [ + "Thinker X400 0.4 nozzle" + ], + "fan_min_speed": [ + "90" + ], + "filament_settings_id": [ + "Eryone Generic Silk PLA" + ], + "from": "User", + "hot_plate_temp": [ + "65" + ], + "nozzle_temperature": [ + "225" + ], + "nozzle_temperature_initial_layer": [ + "225" + ], + "slow_down_layer_time": [ + "8" + ], + "slow_down_min_speed": [ + "15" + ] +} diff --git a/resources/profiles/Eryone/filament/Eryone Generic TPU.json b/resources/profiles/Eryone/filament/Eryone Generic TPU.json new file mode 100644 index 00000000000..1cabba5b695 --- /dev/null +++ b/resources/profiles/Eryone/filament/Eryone Generic TPU.json @@ -0,0 +1,43 @@ +{ + "type": "filament", + "filament_id": "EFL95", + "setting_id": "EFSA05", + "name": "Eryone Generic TPU", + "from": "system", + "instantiation": "true", + "inherits": "Eryone Standard PLA", + "compatible_printers": [ + "Thinker X400 0.4 nozzle" + ], + "fan_min_speed": [ + "90" + ], + "filament_max_volumetric_speed": [ + "4.2" + ], + "filament_retraction_length": [ + "1.6" + ], + "filament_settings_id": [ + "Eryone Generic TPU" + ], + "filament_type": [ + "TPU" + ], + "from": "User", + "nozzle_temperature": [ + "230" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "hot_plate_temp": [ + "50" + ], + "hot_plate_temp_initial_layer": [ + "50" + ], + "slow_down_layer_time": [ + "8" + ] +} diff --git a/resources/profiles/Eryone/filament/Eryone Standard PLA.json b/resources/profiles/Eryone/filament/Eryone Standard PLA.json new file mode 100644 index 00000000000..66299ef95a0 --- /dev/null +++ b/resources/profiles/Eryone/filament/Eryone Standard PLA.json @@ -0,0 +1,250 @@ +{ + "type": "filament", + + "name": "Eryone Standard PLA", + "from": "system", + "instantiation": "false", + "compatible_printers": [ + "Thinker X400 0.4 nozzle" + ], + "activate_air_filtration": [ + "0" + ], + "activate_chamber_temp_control": [ + "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": [ + "80" + ], + "cool_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "default_filament_colour": [ + "" + ], + "during_print_exhaust_fan_speed": [ + "60" + ], + "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": [ + "20" + ], + "filament_density": [ + "1.24" + ], + "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_load_time": [ + "0" + ], + "filament_loading_speed": [ + "28" + ], + "filament_loading_speed_start": [ + "3" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "0" + ], + "filament_multitool_ramming_flow": [ + "10" + ], + "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_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_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_settings_id": [ + "Eryone Standard PLA" + ], + "filament_shrink": [ + "100%" + ], + "filament_soluble": [ + "0" + ], + "filament_start_gcode": [ + "; filament start gcode" + ], + "filament_toolchange_delay": [ + "0" + ], + "filament_type": [ + "PLA" + ], + "filament_unload_time": [ + "0" + ], + "filament_unloading_speed": [ + "90" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_vendor": [ + "Eryone" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "260" + ], + "nozzle_temperature_range_low": [ + "180" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "50%" + ], + "pressure_advance": [ + "0.02" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "0" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "5" + ], + "slow_down_min_speed": [ + "10" + ], + "support_material_interface_fan_speed": [ + "-1" + ], + "temperature_vitrification": [ + "60" + ], + "textured_plate_temp": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ] +} diff --git a/resources/profiles/Eryone/filament/fdm_filament_common.json b/resources/profiles/Eryone/filament/fdm_filament_common.json new file mode 100644 index 00000000000..4851217fe16 --- /dev/null +++ b/resources/profiles/Eryone/filament/fdm_filament_common.json @@ -0,0 +1,132 @@ +{ + "type": "filament", + "name": "fdm_filament_common", + "from": "system", + "instantiation": "false", + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp": [ + "60" + ], + "hot_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "overhang_fan_threshold": [ + "95%" + ], + "overhang_fan_speed": [ + "100" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "filament_end_gcode": [ + "; filament end gcode \n" + ], + "filament_flow_ratio": [ + "1" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "fan_cooling_layer_time": [ + "60" + ], + "filament_cost": [ + "0" + ], + "filament_density": [ + "0" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_max_volumetric_speed": [ + "0" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_settings_id": [ + "" + ], + "filament_soluble": [ + "0" + ], + "filament_type": [ + "PLA" + ], + "filament_vendor": [ + "Generic" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "nozzle_temperature_initial_layer": [ + "200" + ], + "full_fan_speed_layer": [ + "0" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "35" + ], + "slow_down_min_speed": [ + "10" + ], + "slow_down_layer_time": [ + "5" + ], + "filament_start_gcode": [ + "; Filament gcode\n" + ], + "nozzle_temperature": [ + "200" + ], + "temperature_vitrification": [ + "100" + ] +} diff --git a/resources/profiles/Eryone/filament/fdm_filament_pla.json b/resources/profiles/Eryone/filament/fdm_filament_pla.json new file mode 100644 index 00000000000..324fe07e498 --- /dev/null +++ b/resources/profiles/Eryone/filament/fdm_filament_pla.json @@ -0,0 +1,91 @@ +{ + "type": "filament", + "name": "fdm_filament_pla", + "from": "system", + "instantiation": "false", + "inherits": "fdm_filament_common", + "fan_cooling_layer_time": [ + "100" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "filament_type": [ + "PLA" + ], + "filament_density": [ + "1.24" + ], + "filament_cost": [ + "20" + ], + "cool_plate_temp": [ + "35" + ], + "eng_plate_temp": [ + "0" + ], + "hot_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "35" + ], + "eng_plate_temp_initial_layer": [ + "0" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "slow_down_for_layer_cooling": [ + "0" + ], + "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" + ], + "enable_overhang_bridge_fan": [ + "0" + ], + "filament_start_gcode": [ + "; filament start gcode\n" + ] +} diff --git a/resources/profiles/Eryone/machine/Thinker X400 0.4 nozzle.json b/resources/profiles/Eryone/machine/Thinker X400 0.4 nozzle.json new file mode 100644 index 00000000000..f2f7ce92f75 --- /dev/null +++ b/resources/profiles/Eryone/machine/Thinker X400 0.4 nozzle.json @@ -0,0 +1,211 @@ +{ + "type": "machine", + "setting_id": "GM003", + "name": "Thinker X400 0.4 nozzle", + "from": "system", + "instantiation": "true", + "printer_model": "Thinker X400", + "default_print_profile": "0.20mm Standard @Thinker X400", + "default_filament_profile":"Eryone Generic PLA;Eryone Generic ABS;Eryone Generic ASA;Eryone Generic PETG;Eryone Generic Silk PLA;Eryone Generic TPU", + "auxiliary_fan": "0", + "bed_custom_model": "", + "bed_custom_texture": "", + "bed_exclude_area": [ + "0x0" + ], + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\n", + "best_object_pos": "0.5,0.5", + "change_filament_gcode": "", + "cooling_tube_length": "5", + "cooling_tube_retraction": "91.5", + "deretraction_speed": [ + "30" + ], + "enable_filament_ramming": "1", + "extra_loading_move": "-2", + "extruder_clearance_height_to_lid": "135", + "extruder_clearance_height_to_rod": "40", + "extruder_clearance_radius": "85", + "extruder_colour": [ + "#FCE94F" + ], + "extruder_offset": [ + "0x0" + ], + "fan_kickstart": "0", + "fan_speedup_overhangs": "1", + "fan_speedup_time": "0", + "gcode_flavor": "klipper", + "high_current_on_filament_swap": "0", + "host_type": "octoprint", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", + "machine_end_gcode": "PRINT_END", + "machine_load_filament_time": "0", + "machine_max_acceleration_e": [ + "10000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "5000", + "20000" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "12000", + "20000" + ], + "machine_max_acceleration_x": [ + "10000", + "20000" + ], + "machine_max_acceleration_y": [ + "10000", + "20000" + ], + "machine_max_acceleration_z": [ + "300", + "200" + ], + "machine_max_jerk_e": [ + "2.5", + "2.5" + ], + "machine_max_jerk_x": [ + "9", + "9" + ], + "machine_max_jerk_y": [ + "9", + "9" + ], + "machine_max_jerk_z": [ + "0.3", + "0.4" + ], + "machine_max_speed_e": [ + "30", + "25" + ], + "machine_max_speed_x": [ + "500", + "200" + ], + "machine_max_speed_y": [ + "500", + "200" + ], + "machine_max_speed_z": [ + "8", + "12" + ], + "machine_min_extruding_rate": [ + "0", + "0" + ], + "machine_min_travel_rate": [ + "0", + "0" + ], + "machine_pause_gcode": "PAUSE", + "machine_start_gcode": "M117 Heating\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nPRINT_START \nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting]\n\nM104 S0\nM140 S[bed_temperature_initial_layer_single] ; set bed temp\nM117 Heating\nM190 S[bed_temperature_initial_layer_single]\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\n\n;QUAD_GANTRY_LEVEL\nCLEAN_N S=[first_layer_temperature] X=240 Y=-3 A=0\nM117 Quad Level\n_QUAD_GANTRY_LEVEL horizontal_move_z=10 retry_tolerance=1 LIFT_SPEED=5\nG28 Z\nM117 Quad Level\n_QUAD_GANTRY_LEVEL horizontal_move_z=5 retry_tolerance=0.05 LIFT_SPEED=5\nHOME_Z X=132.5 Y=197.5\nM117 Bed Mesh Level\nBED_MESH_CALIBRATE\nM117 Heating\nG1 Y0.0 Z0.3 F1500 ; move print head up\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nM117 .\nG92 E0.0\n; intro line\nG1 X175.0 E12 F1000\nG1 Y0.6\nG1 X5.0 E10 F1000\nG92 E0.0\n; intro line\nG1 Y1.0 Z0.2 F1000\nG1 X200.0 E15.0 F1000\nG92 E0.0", + "machine_unload_filament_time": "0", + "manual_filament_change": "0", + "max_layer_height": [ + "0.32" + ], + "min_layer_height": [ + "0.08" + ], + "nozzle_diameter": [ + "0.4" + ], + "nozzle_hrc": "0", + "nozzle_type": "hardened_steel", + "nozzle_volume": "0", + "parking_pos_retraction": "92", + "print_host": "192.168.2.8", + "print_host_webui": "", + "printable_area": [ + "0x0", + "400x0", + "400x400", + "0x400" + ], + "printable_height": "400", + "printer_notes": "", + "printer_settings_id": "Thinker X400 0.4 nozzle", + "printer_structure": "undefine", + "printer_technology": "FFF", + "printer_variant": "0.4", + "printhost_apikey": "", + "printhost_authorization_type": "key", + "printhost_cafile": "", + "printhost_password": "", + "printhost_port": "", + "printhost_ssl_ignore_revoke": "0", + "printhost_user": "", + "purge_in_prime_tower": "1", + "retract_before_wipe": [ + "0%" + ], + "retract_length_toolchange": [ + "2" + ], + "retract_lift_above": [ + "0" + ], + "retract_lift_below": [ + "0" + ], + "retract_lift_enforce": [ + "All Surfaces" + ], + "retract_restart_extra": [ + "0" + ], + "retract_restart_extra_toolchange": [ + "0" + ], + "retract_when_changing_layer": [ + "1" + ], + "retraction_length": [ + "0.8" + ], + "retraction_minimum_travel": [ + "1" + ], + "retraction_speed": [ + "30" + ], + "scan_first_layer": "0", + "silent_mode": "0", + "single_extruder_multi_material": "1", + "support_air_filtration": "1", + "support_chamber_temp_control": "1", + "template_custom_gcode": "", + "thumbnails": [ + "250x250" + ], + "thumbnails_format": "PNG", + "time_cost": "0", + "time_lapse_gcode": "", + "upward_compatible_machine": [], + "use_firmware_retraction": "0", + "use_relative_e_distances": "1", + "wipe": [ + "1" + ], + "wipe_distance": [ + "2" + ], + "z_hop": [ + "0.3" + ], + "z_hop_types": [ + "Auto Lift" + ] +} diff --git a/resources/profiles/Eryone/machine/Thinker X400.json b/resources/profiles/Eryone/machine/Thinker X400.json new file mode 100644 index 00000000000..42dd7724c5a --- /dev/null +++ b/resources/profiles/Eryone/machine/Thinker X400.json @@ -0,0 +1,12 @@ +{ + "type": "machine_model", + "name": "Thinker X400", + "model_id": "Thinker-X400", + "nozzle_diameter": "0.4", + "machine_tech": "FFF", + "family": "Eryone", + "bed_model": "X400_bed.stl", + "bed_texture": "Thinker_texture.png", + "hotend_model": "", + "default_materials": "Eryone Generic PLA;Eryone Generic ABS;Eryone Generic ASA;Eryone Generic PETG;Eryone Generic Silk PLA;Eryone Generic TPU" +} diff --git a/resources/profiles/Eryone/machine/fdm_machine_common.json b/resources/profiles/Eryone/machine/fdm_machine_common.json new file mode 100644 index 00000000000..3540ba61fe9 --- /dev/null +++ b/resources/profiles/Eryone/machine/fdm_machine_common.json @@ -0,0 +1,174 @@ +{ + "type": "machine", + "name": "fdm_machine_common", + "from": "system", + "instantiation": "false", + "gcode_flavor": "marlin2", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0.0\n;[layer_z]\n\n", + "machine_start_gcode": "M4899 T3 ; Enable v3 jerk and S-curve acceleration \nM104 S150 ; Set hotend temp to 150 degrees to prevent ooze\nM190 S{first_layer_bed_temperature[0]} ; set and wait for bed temp to stabilize\nM109 S{first_layer_temperature[0]} ; set final nozzle temp to stabilize\nG28 ;Home", + "machine_end_gcode": "M104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM18", + "change_filament_gcode": "M600", + "machine_pause_gcode": "M601", + "extruder_colour": [ + "#018001" + ], + "extruder_offset": [ + "0x0" + ], + "machine_max_acceleration_e": [ + "5000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "5000", + "20000" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "20000", + "20000" + ], + "machine_max_acceleration_x": [ + "10000", + "20000" + ], + "machine_max_acceleration_y": [ + "10000", + "20000" + ], + "machine_max_acceleration_z": [ + "200", + "200" + ], + "machine_max_jerk_e": [ + "2.5", + "2.5" + ], + "machine_max_jerk_x": [ + "9", + "9" + ], + "machine_max_jerk_y": [ + "9", + "9" + ], + "machine_max_jerk_z": [ + "0.2", + "0.4" + ], + "machine_max_speed_e": [ + "50", + "25" + ], + "machine_max_speed_x": [ + "500", + "200" + ], + "machine_max_speed_y": [ + "500", + "200" + ], + "machine_max_speed_z": [ + "8", + "12" + ], + "machine_min_extruding_rate": [ + "0", + "0" + ], + "machine_min_travel_rate": [ + "0", + "0" + ], + "machine_pause_gcode": "PAUSE", + "machine_start_gcode": "G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting]\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\n\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\n\nG28 ; home all\nQUAD_GANTRY_LEVEL\n\nG28\n\nBED_MESH_CALIBRATE\n\nG1 Y1.0 Z0.3 F1500 ; move print head up\n\nG92 E0.0\n; intro line\nG1 X205.0 E10 F1000\nG1 Y1.6\nG1 X5.0 E15 F1000\nG92 E0.0\n; intro line\nG1 Y2.0 Z0.2 F1000\nG1 X200.0 E20.0 F1000\nG92 E0.0\n", + "machine_unload_filament_time": "0", + "manual_filament_change": "0", + "max_layer_height": [ + "0.32" + ], + "min_layer_height": [ + "0.08" + ], + "nozzle_diameter": [ + "0.4" + ], + "printer_notes": "", + "printer_settings_id": "Thinker X400 0.4 nozzle", + "printer_structure": "undefine", + "printer_technology": "FFF", + "printer_variant": "0.4", + "printhost_apikey": "", + "printhost_authorization_type": "key", + "printhost_cafile": "", + "printhost_password": "", + "printhost_port": "", + "printhost_ssl_ignore_revoke": "0", + "printhost_user": "", + "purge_in_prime_tower": "1", + "retract_before_wipe": [ + "0%" + ], + "retract_length_toolchange": [ + "2" + ], + "retract_lift_above": [ + "0" + ], + "retract_lift_below": [ + "0" + ], + "retract_lift_enforce": [ + "All Surfaces" + ], + "retract_restart_extra": [ + "0" + ], + "retract_restart_extra_toolchange": [ + "0" + ], + "retract_when_changing_layer": [ + "1" + ], + "retraction_length": [ + "0.7" + ], + "retraction_minimum_travel": [ + "1" + ], + "retraction_speed": [ + "40" + ], + "scan_first_layer": "0", + "silent_mode": "0", + "single_extruder_multi_material": "1", + "support_air_filtration": "1", + "support_chamber_temp_control": "1", + "template_custom_gcode": "", + "thumbnails": [ + "400x400" + ], + "thumbnails_format": "PNG", + "time_cost": "0", + "time_lapse_gcode": "", + "upward_compatible_machine": [], + "use_firmware_retraction": "0", + "use_relative_e_distances": "1", + "version": "1.6.0.0", + "wipe": [ + "1" + ], + "wipe_distance": [ + "0.3" + ], + "z_hop": [ + "0" + ], + "z_hop_types": [ + "Spiral Lift" + ], + "z_offset": "0" +} diff --git a/resources/profiles/Eryone/process/0.12mm Standard @Thinker X400.json b/resources/profiles/Eryone/process/0.12mm Standard @Thinker X400.json new file mode 100644 index 00000000000..c3fc98d56eb --- /dev/null +++ b/resources/profiles/Eryone/process/0.12mm Standard @Thinker X400.json @@ -0,0 +1,27 @@ +{ + "brim_object_gap": "0", + "default_acceleration": "8000", + "elefant_foot_compensation": "0.12", + "from": "User", + "gap_infill_speed": "300", + "inherits": "0.20mm Standard @Thinker X400", + "inner_wall_acceleration": "8000", + "inner_wall_speed": "300", + "internal_solid_infill_speed": "300", + "is_custom_defined": "0", + "layer_height": "0.12", + "name": "0.12mm Standard @Thinker X400", + "only_one_wall_top": "1", + "outer_wall_speed": "200", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10", + "print_settings_id": "0.12mm Standard @Thinker X400", + "raft_first_layer_expansion": "10", + "sparse_infill_density": "15%", + "sparse_infill_speed": "300", + "top_shell_layers": "5", + "top_shell_thickness": "1", + "version": "1.9.0.2", + "wall_generator": "classic" +} diff --git a/resources/profiles/Eryone/process/0.16mm Standard @Thinker X400.json b/resources/profiles/Eryone/process/0.16mm Standard @Thinker X400.json new file mode 100644 index 00000000000..f224b3388ca --- /dev/null +++ b/resources/profiles/Eryone/process/0.16mm Standard @Thinker X400.json @@ -0,0 +1,27 @@ +{ + "brim_object_gap": "0", + "default_acceleration": "8000", + "elefant_foot_compensation": "0.12", + "from": "User", + "gap_infill_speed": "300", + "inherits": "0.20mm Standard @Thinker X400", + "inner_wall_acceleration": "8000", + "inner_wall_speed": "300", + "internal_solid_infill_speed": "300", + "is_custom_defined": "0", + "layer_height": "0.16", + "name": "0.16mm Standard @Thinker X400", + "only_one_wall_top": "1", + "outer_wall_speed": "200", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10", + "print_settings_id": "0.16mm Standard @Thinker X400", + "raft_first_layer_expansion": "10", + "sparse_infill_density": "15%", + "sparse_infill_speed": "300", + "top_shell_layers": "5", + "top_shell_thickness": "1", + "version": "1.9.0.2", + "wall_generator": "classic" +} diff --git a/resources/profiles/Eryone/process/0.20mm Standard @Thinker X400.json b/resources/profiles/Eryone/process/0.20mm Standard @Thinker X400.json new file mode 100644 index 00000000000..8a9364b225f --- /dev/null +++ b/resources/profiles/Eryone/process/0.20mm Standard @Thinker X400.json @@ -0,0 +1,242 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.20mm Standard @Thinker X400", + "from": "", + "instantiation": "true", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Thinker X400 0.4 nozzle" + ], + "accel_to_decel_enable": "1", + "accel_to_decel_factor": "50%", + "bottom_shell_layers": "3", + "bottom_shell_thickness": "0", + "bottom_solid_infill_flow_ratio": "1", + "bottom_surface_pattern": "monotonic", + "bridge_acceleration": "50%", + "bridge_angle": "0", + "bridge_density": "100%", + "bridge_flow": "0.95", + "bridge_no_support": "0", + "bridge_speed": "50", + "brim_ears_detection_length": "1", + "brim_ears_max_angle": "125", + "brim_object_gap": "0", + "brim_type": "auto_brim", + "brim_width": "5", + "compatible_printers_condition": "", + "default_acceleration": "8000", + "default_jerk": "0", + "detect_overhang_wall": "1", + "detect_thin_wall": "0", + "draft_shield": "disabled", + "elefant_foot_compensation": "0.12", + "elefant_foot_compensation_layers": "1", + "enable_arc_fitting": "1", + "enable_overhang_speed": "1", + "enable_prime_tower": "0", + "enable_support": "0", + "enforce_support_layers": "0", + "exclude_object": "1", + "extra_perimeters_on_overhangs": "0", + "filename_format": "{input_filename_base}_{filament_type[0]}_{print_time}.gcode", + "filter_out_gap_fill": "0", + "flush_into_infill": "0", + "flush_into_objects": "0", + "flush_into_support": "1", + + "fuzzy_skin": "none", + "fuzzy_skin_point_distance": "0.8", + "fuzzy_skin_thickness": "0.3", + "gap_infill_speed": "250", + "gcode_add_line_number": "0", + "gcode_comments": "0", + "gcode_label_objects": "1", + "hole_to_polyhole": "0", + "hole_to_polyhole_threshold": "0.01", + "hole_to_polyhole_twisted": "1", + "independent_support_layer_height": "1", + "infill_anchor": "400%", + "infill_anchor_max": "20", + "infill_combination": "0", + "infill_direction": "45", + "infill_jerk": "9", + "infill_wall_overlap": "25%", + "initial_layer_acceleration": "500", + "initial_layer_infill_speed": "105", + "initial_layer_jerk": "9", + "initial_layer_line_width": "0.5", + "initial_layer_min_bead_width": "85%", + "initial_layer_print_height": "0.2", + "initial_layer_speed": "50", + "initial_layer_travel_speed": "100%", + "inner_wall_acceleration": "8000", + "inner_wall_jerk": "9", + "inner_wall_line_width": "0.45", + "inner_wall_speed": "250", + "interface_shells": "0", + "internal_bridge_speed": "150%", + "internal_solid_infill_acceleration": "100%", + "internal_solid_infill_line_width": "0.42", + "internal_solid_infill_pattern": "monotonic", + "internal_solid_infill_speed": "250", + "ironing_angle": "-1", + "ironing_flow": "10%", + "ironing_pattern": "zig-zag", + "ironing_spacing": "0.15", + "ironing_speed": "30", + "ironing_type": "no ironing", + "layer_height": "0.2", + "line_width": "0.42", + "make_overhang_printable": "0", + "make_overhang_printable_angle": "55", + "make_overhang_printable_hole_size": "0", + "max_bridge_length": "10", + "max_travel_detour_distance": "0", + "max_volumetric_extrusion_rate_slope": "0", + "max_volumetric_extrusion_rate_slope_segment_length": "3", + "min_bead_width": "85%", + "min_feature_size": "25%", + "min_width_top_surface": "300%", + "minimum_sparse_infill_area": "15", + "notes": "", + "only_one_wall_first_layer": "0", + "only_one_wall_top": "1", + "ooze_prevention": "0", + "outer_wall_acceleration": "5000", + "outer_wall_jerk": "9", + "outer_wall_line_width": "0.42", + "outer_wall_speed": "200", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "10", + "overhang_reverse": "0", + "overhang_reverse_threshold": "50%", + "overhang_speed_classic": "0", + "post_process": [], + "precise_outer_wall": "0", + "prime_tower_brim_width": "3", + "prime_tower_width": "60", + "prime_volume": "45", + "print_flow_ratio": "1", + "print_sequence": "by layer", + "print_settings_id": "0.20mm Standard @Thinker X400", + "raft_contact_distance": "0.1", + "raft_expansion": "1.5", + "raft_first_layer_density": "95%", + "raft_first_layer_expansion": "10", + "raft_layers": "0", + "reduce_crossing_wall": "0", + "reduce_infill_retraction": "1", + "resolution": "0.012", + "role_based_wipe_speed": "1", + "seam_gap": "10%", + "seam_position": "aligned", + "single_extruder_multi_material_priming": "1", + "skirt_distance": "2", + "skirt_height": "1", + "skirt_loops": "0", + "skirt_speed": "0", + "slice_closing_radius": "0.049", + "slicing_mode": "regular", + "slow_down_layers": "0", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "50%", + "small_perimeter_threshold": "0", + "solid_infill_filament": "1", + "sparse_infill_acceleration": "100%", + "sparse_infill_density": "15%", + "sparse_infill_filament": "1", + "sparse_infill_line_width": "0.45", + "sparse_infill_pattern": "grid", + "sparse_infill_speed": "250", + "spiral_mode": "0", + "staggered_inner_seams": "0", + "standby_temperature_delta": "-5", + "support_angle": "0", + "support_base_pattern": "rectilinear", + "support_base_pattern_spacing": "2.5", + "support_bottom_interface_spacing": "0.5", + "support_bottom_z_distance": "0.2", + "support_critical_regions_only": "0", + "support_expansion": "0", + "support_filament": "0", + "support_interface_bottom_layers": "2", + "support_interface_filament": "0", + "support_interface_loop_pattern": "0", + "support_interface_pattern": "rectilinear", + "support_interface_spacing": "0.5", + "support_interface_speed": "60", + "support_interface_top_layers": "2", + "support_line_width": "0.42", + "support_object_xy_distance": "0.35", + "support_on_build_plate_only": "0", + "support_remove_small_overhang": "1", + "support_speed": "80", + "support_style": "default", + "support_threshold_angle": "30", + "support_top_z_distance": "0.2", + "support_type": "normal(auto)", + "thick_bridges": "0", + "timelapse_type": "0", + "top_shell_layers": "5", + "top_shell_thickness": "1", + "top_solid_infill_flow_ratio": "1", + "top_surface_acceleration": "2000", + "top_surface_jerk": "9", + "top_surface_line_width": "0.42", + "top_surface_pattern": "monotonic", + "top_surface_speed": "200", + "travel_acceleration": "5000", + "travel_jerk": "12", + "travel_speed": "350", + "travel_speed_z": "0", + "tree_support_adaptive_layer_height": "1", + "tree_support_angle_slow": "25", + "tree_support_auto_brim": "1", + "tree_support_branch_angle": "45", + "tree_support_branch_angle_organic": "40", + "tree_support_branch_diameter": "5", + "tree_support_branch_diameter_angle": "5", + "tree_support_branch_diameter_double_wall": "3", + "tree_support_branch_diameter_organic": "2", + "tree_support_branch_distance": "5", + "tree_support_branch_distance_organic": "1", + "tree_support_brim_width": "3", + "tree_support_tip_diameter": "0.8", + "tree_support_top_rate": "30%", + "tree_support_wall_count": "2", + "version": "1.9.0.2", + "wall_distribution_count": "1", + "wall_filament": "1", + "wall_generator": "classic", + "wall_infill_order": "inner wall/outer wall/infill", + "wall_loops": "2", + "wall_transition_angle": "10", + "wall_transition_filter_deviation": "25%", + "wall_transition_length": "100%", + "wipe_on_loops": "0", + "wipe_speed": "80%", + "wipe_tower_bridging": "10", + "wipe_tower_cone_angle": "0", + "wipe_tower_extra_spacing": "100%", + "wipe_tower_extruder": "0", + "wipe_tower_no_sparse_layers": "0", + "wipe_tower_rotation_angle": "0", + "wiping_volumes_extruders": [ + "70", + "70", + "70", + "70", + "70", + "70", + "70", + "70", + "70", + "70" + ], + "xy_contour_compensation": "0", + "xy_hole_compensation": "0" +} diff --git a/resources/profiles/Eryone/process/0.24mm Standard @Thinker X400.json b/resources/profiles/Eryone/process/0.24mm Standard @Thinker X400.json new file mode 100644 index 00000000000..95e96660fb5 --- /dev/null +++ b/resources/profiles/Eryone/process/0.24mm Standard @Thinker X400.json @@ -0,0 +1,24 @@ +{ + "brim_object_gap": "0", + "default_acceleration": "8000", + "elefant_foot_compensation": "0.12", + "from": "User", + "gap_infill_speed": "220", + "inherits": "0.20mm Standard @Thinker X400", + "inner_wall_acceleration": "8000", + "inner_wall_speed": "220", + "internal_solid_infill_speed": "220", + "is_custom_defined": "0", + "layer_height": "0.24", + "name": "0.24mm Standard @Thinker X400", + "only_one_wall_top": "1", + "outer_wall_speed": "200", + "print_settings_id": "0.24mm Standard @Thinker X400", + "raft_first_layer_expansion": "10", + "sparse_infill_density": "15%", + "sparse_infill_speed": "220", + "top_shell_layers": "5", + "top_shell_thickness": "1", + "version": "1.9.0.2", + "wall_generator": "classic" +} diff --git a/resources/profiles/Eryone/process/fdm_process_common.json b/resources/profiles/Eryone/process/fdm_process_common.json new file mode 100644 index 00000000000..478fff7b361 --- /dev/null +++ b/resources/profiles/Eryone/process/fdm_process_common.json @@ -0,0 +1,118 @@ +{ + "type": "process", + "name": "fdm_process_common", + "from": "system", + "instantiation": "false", + "adaptive_layer_height": "0", + "reduce_crossing_wall": "0", + "max_travel_detour_distance": "0", + "bottom_surface_pattern": "monotonic", + "bottom_shell_thickness": "0.5", + "bridge_speed": "50", + "bridge_acceleration": "500", + "brim_width": "5", + "brim_object_gap": "0.1", + "compatible_printers": [], + "compatible_printers_condition": "", + "print_sequence": "by layer", + "default_acceleration": "2500", + "travel_acceleration": "2500", + "inner_wall_acceleration": "500", + "outer_wall_acceleration": "500", + "bridge_no_support": "0", + "draft_shield": "disabled", + "elefant_foot_compensation": "0.2", + "outer_wall_line_width": "0.42", + "wall_infill_order": "inner wall/outer wall/infill", + "line_width": "0.45", + "infill_direction": "45", + "sparse_infill_density": "15%", + "sparse_infill_pattern": "cubic", + "initial_layer_line_width": "0.45", + "initial_layer_print_height": "0.2", + "infill_combination": "0", + "sparse_infill_line_width": "0.48", + "infill_wall_overlap": "23%", + "interface_shells": "0", + "ironing_flow": "10%", + "ironing_spacing": "0.15", + "ironing_speed": "30", + "ironing_type": "no ironing", + "reduce_infill_retraction": "1", + "filename_format": "{input_filename_base}_{filament_type[0]}_{printer_model}.gcode", + "detect_overhang_wall": "1", + "enable_overhang_speed": "1", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "15", + "inner_wall_line_width": "0.45", + "wall_loops": "3", + "print_settings_id": "", + "raft_layers": "0", + "seam_position": "aligned", + "skirt_distance": "3", + "skirt_height": "1", + "skirt_loops": "2", + "minimum_sparse_infill_area": "15", + "internal_solid_infill_line_width": "0.45", + "spiral_mode": "0", + "standby_temperature_delta": "-5", + "enable_support": "0", + "resolution": "0.012", + "support_type": "normal(auto)", + "support_on_build_plate_only": "0", + "support_top_z_distance": "0.2", + "support_filament": "0", + "support_line_width": "0.36", + "support_interface_loop_pattern": "0", + "support_interface_filament": "0", + "support_interface_top_layers": "2", + "support_interface_bottom_layers": "2", + "support_interface_spacing": "0.5", + "support_interface_speed": "80", + "support_base_pattern": "rectilinear", + "support_base_pattern_spacing": "2.5", + "support_speed": "125", + "support_threshold_angle": "40", + "support_object_xy_distance": "2.5", + "tree_support_branch_angle": "30", + "tree_support_wall_count": "0", + "tree_support_with_infill": "0", + "detect_thin_wall": "0", + "top_surface_pattern": "monotonicline", + "top_surface_line_width": "0.4", + "top_shell_thickness": "0.7", + "top_solid_infill_flow_ratio": "1", + "enable_prime_tower": "0", + "wipe_tower_no_sparse_layers": "0", + "prime_tower_width": "60", + "xy_hole_compensation": "0", + "xy_contour_compensation": "0", + "layer_height": "0.2", + "bottom_shell_layers": "4", + "top_shell_layers": "5", + "bridge_flow": "0.95", + "initial_layer_speed": "50", + "initial_layer_infill_speed": "50", + "initial_layer_travel_speed": "100%", + "outer_wall_speed": "125", + "inner_wall_speed": "250", + "sparse_infill_speed": "250", + "internal_solid_infill_speed": "200", + "top_surface_speed": "150", + "gap_infill_speed": "150", + "travel_speed": "300", + "travel_speed_z": "0", + "enable_arc_fitting": "0", + "ensure_vertical_shell_thickness": "1", + "precise_outer_wall": "1", + "independent_support_layer_height": "1", + "default_jerk": "15", + "infill_jerk": "15", + "initial_layer_jerk": "12", + "inner_wall_jerk": "15", + "outer_wall_jerk": "10", + "top_surface_jerk": "12", + "travel_jerk": "20" +} \ No newline at end of file From 67cc143916bb6cad861cd959287f17e88bbe83ee Mon Sep 17 00:00:00 2001 From: Ioannis Giannakas <59056762+igiannakas@users.noreply.github.com> Date: Sun, 5 Jan 2025 15:05:04 +0000 Subject: [PATCH 16/33] Optimisation: ERS - Reduce redundant gcode commands from extrusion rate smoothing (#7398) * Optimisation: Reduce volume of output gcode commands for pressure equalizer * Update thresholds * Update PrintConfig.cpp * Merge branch 'main' into Optimisation-Reduce-reduntant-gcode-commands-produced-by-Estrusion-Rate-Smoothing * Merge branch 'SoftFever:main' into Optimisation-Reduce-reduntant-gcode-commands-produced-by-Estrusion-Rate-Smoothing * Merge branch 'SoftFever:main' into Optimisation-Reduce-reduntant-gcode-commands-produced-by-Estrusion-Rate-Smoothing * Merge branch 'SoftFever:main' into Optimisation-Reduce-reduntant-gcode-commands-produced-by-Estrusion-Rate-Smoothing * Merge branch 'main' into Optimisation-Reduce-reduntant-gcode-commands-produced-by-Estrusion-Rate-Smoothing * Merge branch 'SoftFever:main' into Optimisation-Reduce-reduntant-gcode-commands-produced-by-Estrusion-Rate-Smoothing * Merge branch 'main' into Optimisation-Reduce-reduntant-gcode-commands-produced-by-Estrusion-Rate-Smoothing * Merge branch 'SoftFever:main' into Optimisation-Reduce-reduntant-gcode-commands-produced-by-Estrusion-Rate-Smoothing * Merge branch 'main' into Optimisation-Reduce-reduntant-gcode-commands-produced-by-Estrusion-Rate-Smoothing --- src/libslic3r/GCode/PressureEqualizer.cpp | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/GCode/PressureEqualizer.cpp b/src/libslic3r/GCode/PressureEqualizer.cpp index 806ef768e71..d5ddc50d919 100644 --- a/src/libslic3r/GCode/PressureEqualizer.cpp +++ b/src/libslic3r/GCode/PressureEqualizer.cpp @@ -482,11 +482,25 @@ void PressureEqualizer::output_gcode_line(const size_t line_idx) if (*comment != ';') comment = nullptr; - // Emit the line with lowered extrusion rates. + // get the gcode line length float l = line.dist_xyz(); - if (auto nSegments = size_t(ceil(l / m_max_segment_length)); nSegments == 1) { // Just update this segment. + // number of segments this line can be broken down to + auto nSegments = size_t(ceil(l / m_max_segment_length)); + + // Orca: + // Calculate the absolute difference in volumetric extrusion rate between the start and end point of the line. + // Quantize it to 1mm3/min (0.016mm3/sec). + int delta_volumetric_rate = std::round(fabs(line.volumetric_extrusion_rate_end - line.volumetric_extrusion_rate_start)); + + // Emit the line with lowered extrusion rates. + // Orca: + // First, check if the change in volumetric extrusion rate is trivial (less than 10mm3/min -> 0.16mm3/sec (5mm/sec speed for a 0.25 mm nozzle). + // Or if the line size is equal in length with the smallest segment. + // If so, then emit the line as a single extrusion, i.e. dont split into segments. + if ( nSegments == 1 || delta_volumetric_rate < 10) { push_line_to_output(line_idx, line.feedrate() * line.volumetric_correction_avg(), comment); - } else { + } else // The line needs to be split the line into segments and apply extrusion rate smoothing + { bool accelerating = line.volumetric_extrusion_rate_start < line.volumetric_extrusion_rate_end; // Update the initial and final feed rate values. line.pos_start[4] = line.volumetric_extrusion_rate_start * line.pos_end[4] / line.volumetric_extrusion_rate; @@ -769,7 +783,8 @@ void PressureEqualizer::push_line_to_output(const size_t line_idx, float new_fee // Orca: sanity check, 1 mm/s is the minimum feedrate. if (new_feedrate < 60) new_feedrate = 60; - new_feedrate = std::round(new_feedrate); + // Quantize speed changes to a minimum of 1mm/sec, to reduce gcode volume for trivial speed changes. + new_feedrate = std::round(new_feedrate / 60.0) * 60.0; const GCodeLine &line = m_gcode_lines[line_idx]; if (line_idx > 0 && output_buffer_length > 0) { const std::string prev_line_str = std::string(output_buffer.begin() + int(this->output_buffer_prev_length), From bb009eaa99a7736d3c05d145a062347df93fb76b Mon Sep 17 00:00:00 2001 From: Ioannis Giannakas <59056762+igiannakas@users.noreply.github.com> Date: Sun, 5 Jan 2025 15:19:00 +0000 Subject: [PATCH 17/33] Enhancement: ERS - Option to limit ERS to external perimeters and overhangs only (#7399) * Option to limit ERS to external perimeters and overhangs only * Label name * Label update * Merge branch 'main' into Limit-ERS-to-external-perimeters-and-overhangs * Merge branch 'main' into Limit-ERS-to-external-perimeters-and-overhangs * Merge branch 'SoftFever:main' into Limit-ERS-to-external-perimeters-and-overhangs * Merge branch 'SoftFever:main' into Limit-ERS-to-external-perimeters-and-overhangs * Merge branch 'main' into Limit-ERS-to-external-perimeters-and-overhangs * Merge branch 'SoftFever:main' into Limit-ERS-to-external-perimeters-and-overhangs * Merge branch 'main' into Limit-ERS-to-external-perimeters-and-overhangs * Merge branch 'SoftFever:main' into Limit-ERS-to-external-perimeters-and-overhangs * Merge branch 'main' into Limit-ERS-to-external-perimeters-and-overhangs --- src/libslic3r/GCode/PressureEqualizer.cpp | 10 ++++++++-- src/libslic3r/GCode/PressureEqualizer.hpp | 3 +++ src/libslic3r/Preset.cpp | 2 +- src/libslic3r/Print.cpp | 1 + src/libslic3r/PrintConfig.cpp | 7 +++++++ src/libslic3r/PrintConfig.hpp | 1 + src/slic3r/GUI/ConfigManipulation.cpp | 1 + src/slic3r/GUI/Tab.cpp | 1 + 8 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/GCode/PressureEqualizer.cpp b/src/libslic3r/GCode/PressureEqualizer.cpp index d5ddc50d919..ee101e36054 100644 --- a/src/libslic3r/GCode/PressureEqualizer.cpp +++ b/src/libslic3r/GCode/PressureEqualizer.cpp @@ -62,6 +62,7 @@ PressureEqualizer::PressureEqualizer(const Slic3r::GCodeConfig &config) : m_use_ m_max_volumetric_extrusion_rate_slope_positive = float(config.max_volumetric_extrusion_rate_slope.value) * 60.f * 60.f; m_max_volumetric_extrusion_rate_slope_negative = float(config.max_volumetric_extrusion_rate_slope.value) * 60.f * 60.f; m_max_segment_length = float(config.max_volumetric_extrusion_rate_slope_segment_length.value); + m_extrusion_rate_smoothing_external_perimeter_only = bool(config.extrusion_rate_smoothing_external_perimeter_only.value); } for (ExtrusionRateSlope &extrusion_rate_slope : m_max_volumetric_extrusion_rate_slopes) { @@ -629,7 +630,9 @@ void PressureEqualizer::adjust_volumetric_rate(const size_t fist_line_idx, const rate_end = rate_succ; // don't alter the flow rate for these extrusion types - if (!line.adjustable_flow || line.extrusion_role == ExtrusionRole::erBridgeInfill || line.extrusion_role == ExtrusionRole::erIroning) { + // Orca: Limit ERS to external perimeters and overhangs if option selected by user + if (!line.adjustable_flow || line.extrusion_role == ExtrusionRole::erBridgeInfill || line.extrusion_role == ExtrusionRole::erIroning || + (m_extrusion_rate_smoothing_external_perimeter_only && line.extrusion_role != ExtrusionRole::erOverhangPerimeter && line.extrusion_role != ExtrusionRole::erExternalPerimeter)) { rate_end = line.volumetric_extrusion_rate_end; } else if (line.volumetric_extrusion_rate_end > rate_end) { line.volumetric_extrusion_rate_end = rate_end; @@ -684,10 +687,13 @@ void PressureEqualizer::adjust_volumetric_rate(const size_t fist_line_idx, const float rate_start = feedrate_per_extrusion_role[iRole]; // don't alter the flow rate for these extrusion types - if (!line.adjustable_flow || line.extrusion_role == ExtrusionRole::erBridgeInfill || line.extrusion_role == ExtrusionRole::erIroning) { + // Orca: Limit ERS to external perimeters and overhangs if option selected by user + if (!line.adjustable_flow || line.extrusion_role == ExtrusionRole::erBridgeInfill || line.extrusion_role == ExtrusionRole::erIroning || + (m_extrusion_rate_smoothing_external_perimeter_only && line.extrusion_role != ExtrusionRole::erOverhangPerimeter && line.extrusion_role != ExtrusionRole::erExternalPerimeter)) { rate_start = line.volumetric_extrusion_rate_start; } else if (iRole == size_t(line.extrusion_role) && rate_prec < rate_start) rate_start = rate_prec; + if (line.volumetric_extrusion_rate_start > rate_start) { line.volumetric_extrusion_rate_start = rate_start; line.max_volumetric_extrusion_rate_slope_positive = rate_slope; diff --git a/src/libslic3r/GCode/PressureEqualizer.hpp b/src/libslic3r/GCode/PressureEqualizer.hpp index 3563cdabc6a..4b3159e5021 100644 --- a/src/libslic3r/GCode/PressureEqualizer.hpp +++ b/src/libslic3r/GCode/PressureEqualizer.hpp @@ -83,6 +83,9 @@ class PressureEqualizer // Maximum segment length to split a long segment if the initial and the final flow rate differ. // Smaller value means a smoother transition between two different flow rates. float m_max_segment_length; + + // Apply ERS only on external perimeters and overhangs + bool m_extrusion_rate_smoothing_external_perimeter_only; // Indicate if extrude set speed block was opened using the tag ";_EXTRUDE_SET_SPEED" // or not (not opened, or it was closed using the tag ";_EXTRUDE_END"). diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 4eb5c5e949c..d6596b2fb97 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -770,7 +770,7 @@ static std::vector s_Preset_print_options { "ironing_type", "ironing_pattern", "ironing_flow", "ironing_speed", "ironing_spacing", "ironing_angle", "max_travel_detour_distance", "fuzzy_skin", "fuzzy_skin_thickness", "fuzzy_skin_point_distance", "fuzzy_skin_first_layer", - "max_volumetric_extrusion_rate_slope", "max_volumetric_extrusion_rate_slope_segment_length", + "max_volumetric_extrusion_rate_slope", "max_volumetric_extrusion_rate_slope_segment_length","extrusion_rate_smoothing_external_perimeter_only", "inner_wall_speed", "outer_wall_speed", "sparse_infill_speed", "internal_solid_infill_speed", "top_surface_speed", "support_speed", "support_object_xy_distance", "support_interface_speed", "bridge_speed", "internal_bridge_speed", "gap_infill_speed", "travel_speed", "travel_speed_z", "initial_layer_speed", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index e825498bf61..31f225cfa29 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -144,6 +144,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n "slow_down_min_speed", "max_volumetric_extrusion_rate_slope", "max_volumetric_extrusion_rate_slope_segment_length", + "extrusion_rate_smoothing_external_perimeter_only", "reduce_infill_retraction", "filename_format", "retraction_minimum_travel", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 2877fa71699..f7e88a03180 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -3355,6 +3355,13 @@ void PrintConfigDef::init_fff_params() def->max = 5; def->mode = comAdvanced; def->set_default_value(new ConfigOptionInt(3)); + + def = this->add("extrusion_rate_smoothing_external_perimeter_only", coBool); + def->label = L("Apply only on external features"); + def->tooltip = L("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."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(false)); def = this->add("fan_min_speed", coFloats); def->label = L("Fan speed"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index ee522dab0de..a9bcfe76d0e 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1092,6 +1092,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloat, max_volumetric_extrusion_rate_slope)) ((ConfigOptionInt, max_volumetric_extrusion_rate_slope_segment_length)) + ((ConfigOptionBool, extrusion_rate_smoothing_external_perimeter_only)) ((ConfigOptionPercents, retract_before_wipe)) ((ConfigOptionFloats, retraction_length)) diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 704fdf0dac1..2c1269f12ad 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -497,6 +497,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co int have_volumetric_extrusion_rate_slope_segment_length = config->option("max_volumetric_extrusion_rate_slope_segment_length")->value; toggle_field("enable_arc_fitting", !have_volumetric_extrusion_rate_slope); toggle_line("max_volumetric_extrusion_rate_slope_segment_length", have_volumetric_extrusion_rate_slope); + toggle_line("extrusion_rate_smoothing_external_perimeter_only", have_volumetric_extrusion_rate_slope); if(have_volumetric_extrusion_rate_slope) config->set_key_value("enable_arc_fitting", new ConfigOptionBool(false)); if(have_volumetric_extrusion_rate_slope_segment_length==0) { DynamicPrintConfig new_conf = *config; diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index e3a981287a1..b86e2b75e13 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2215,6 +2215,7 @@ void TabPrint::build() optgroup = page->new_optgroup(L("Advanced"), L"param_advanced", 15); optgroup->append_single_option_line("max_volumetric_extrusion_rate_slope", "extrusion-rate-smoothing"); optgroup->append_single_option_line("max_volumetric_extrusion_rate_slope_segment_length", "extrusion-rate-smoothing"); + optgroup->append_single_option_line("extrusion_rate_smoothing_external_perimeter_only", "extrusion-rate-smoothing"); page = add_options_page(L("Support"), "custom-gcode_support"); // ORCA: icon only visible on placeholders optgroup = page->new_optgroup(L("Support"), L"param_support"); From e62d6a3b68619d2aecc8b4513263e33257491f60 Mon Sep 17 00:00:00 2001 From: Ioannis Giannakas <59056762+igiannakas@users.noreply.github.com> Date: Sun, 5 Jan 2025 15:23:11 +0000 Subject: [PATCH 18/33] Enhancement: ERS - segment length - convert to float (#7400) Enhancement: ERS segment length - convert to float To allow splitting of line segments down to 0.5mm for improved external surface finish. Co-authored-by: SoftFever --- src/libslic3r/PrintConfig.cpp | 10 ++++++---- src/libslic3r/PrintConfig.hpp | 3 ++- src/slic3r/GUI/ConfigManipulation.cpp | 6 +++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index f7e88a03180..e922af9c5d8 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -3345,16 +3345,17 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloat(0)); - def = this->add("max_volumetric_extrusion_rate_slope_segment_length", coInt); + def = this->add("max_volumetric_extrusion_rate_slope_segment_length", coFloat); def->label = L("Smoothing segment length"); def->tooltip = L("A lower value results in smoother extrusion rate transitions. However, this results in a significantly larger gcode file " "and more instructions for the printer to process. \n\n" "Default value of 3 works well for most cases. If your printer is stuttering, increase this value to reduce the number of adjustments made\n\n" - "Allowed values: 1-5"); - def->min = 1; + "Allowed values: 0.5-5"); + def->min = 0.5; def->max = 5; + def->sidetext = L("mm"); def->mode = comAdvanced; - def->set_default_value(new ConfigOptionInt(3)); + def->set_default_value(new ConfigOptionFloat(3.0)); def = this->add("extrusion_rate_smoothing_external_perimeter_only", coBool); def->label = L("Apply only on external features"); @@ -3363,6 +3364,7 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionBool(false)); + def = this->add("fan_min_speed", coFloats); def->label = L("Fan speed"); def->tooltip = L("Minimum speed for part cooling fan"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index a9bcfe76d0e..e406e4f3c2e 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1091,8 +1091,9 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionString, time_lapse_gcode)) ((ConfigOptionFloat, max_volumetric_extrusion_rate_slope)) - ((ConfigOptionInt, max_volumetric_extrusion_rate_slope_segment_length)) + ((ConfigOptionFloat, max_volumetric_extrusion_rate_slope_segment_length)) ((ConfigOptionBool, extrusion_rate_smoothing_external_perimeter_only)) + ((ConfigOptionPercents, retract_before_wipe)) ((ConfigOptionFloats, retraction_length)) diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 2c1269f12ad..600cb30c0fc 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -494,14 +494,14 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co auto gcflavor = preset_bundle->printers.get_edited_preset().config.option>("gcode_flavor")->value; bool have_volumetric_extrusion_rate_slope = config->option("max_volumetric_extrusion_rate_slope")->value > 0; - int have_volumetric_extrusion_rate_slope_segment_length = config->option("max_volumetric_extrusion_rate_slope_segment_length")->value; + float have_volumetric_extrusion_rate_slope_segment_length = config->option("max_volumetric_extrusion_rate_slope_segment_length")->value; toggle_field("enable_arc_fitting", !have_volumetric_extrusion_rate_slope); toggle_line("max_volumetric_extrusion_rate_slope_segment_length", have_volumetric_extrusion_rate_slope); toggle_line("extrusion_rate_smoothing_external_perimeter_only", have_volumetric_extrusion_rate_slope); if(have_volumetric_extrusion_rate_slope) config->set_key_value("enable_arc_fitting", new ConfigOptionBool(false)); - if(have_volumetric_extrusion_rate_slope_segment_length==0) { + if(have_volumetric_extrusion_rate_slope_segment_length < 0.5) { DynamicPrintConfig new_conf = *config; - new_conf.set_key_value("max_volumetric_extrusion_rate_slope_segment_length", new ConfigOptionInt(1)); + new_conf.set_key_value("max_volumetric_extrusion_rate_slope_segment_length", new ConfigOptionFloat(1)); apply(config, &new_conf); } From 333ed4c34d98d8dd856310e29e0ffd83c5bb5ebb Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Mon, 6 Jan 2025 09:07:58 +0800 Subject: [PATCH 19/33] Fix flatpack build --- src/libslic3r/Geometry/VoronoiUtilsCgal.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libslic3r/Geometry/VoronoiUtilsCgal.cpp b/src/libslic3r/Geometry/VoronoiUtilsCgal.cpp index 7797a5a29fd..28a648851db 100644 --- a/src/libslic3r/Geometry/VoronoiUtilsCgal.cpp +++ b/src/libslic3r/Geometry/VoronoiUtilsCgal.cpp @@ -1,3 +1,5 @@ +// Needed since the CGAL headers are not self-contained. +#include #include #include #include From b32f2b22379f29b990495d0c62d08dc812f091fc Mon Sep 17 00:00:00 2001 From: SoftFever Date: Mon, 6 Jan 2025 20:50:54 +0800 Subject: [PATCH 20/33] Fix profiles with missing compatible printers Hide filaments with missing compatible printers by default --- .../Elegoo/filament/Elegoo Generic ASA.json | 29 ++++++++++++++++++- .../filament/Elegoo Generic PETG PRO.json | 27 +++++++++++++++++ .../filament/Elegoo Generic PLA Matte.json | 29 ++++++++++++++++++- .../Ratrig/filament/RatRig BigNozzle ABS.json | 27 +++++++++++++++++ .../Ratrig/filament/RatRig BigNozzle ASA.json | 27 +++++++++++++++++ .../filament/RatRig BigNozzle PCTG.json | 27 +++++++++++++++++ .../filament/RatRig BigNozzle PETG.json | 27 +++++++++++++++++ .../Ratrig/filament/RatRig BigNozzle PLA.json | 27 +++++++++++++++++ .../Ratrig/filament/RatRig Generic PCTG.json | 27 +++++++++++++++++ resources/web/guide/22/22.js | 3 +- 10 files changed, 247 insertions(+), 3 deletions(-) diff --git a/resources/profiles/Elegoo/filament/Elegoo Generic ASA.json b/resources/profiles/Elegoo/filament/Elegoo Generic ASA.json index c45a4095dfc..8f2fce2250c 100644 --- a/resources/profiles/Elegoo/filament/Elegoo Generic ASA.json +++ b/resources/profiles/Elegoo/filament/Elegoo Generic ASA.json @@ -14,5 +14,32 @@ ], "filament_max_volumetric_speed": [ "12" - ] + ], + "compatible_printers": [ + "Elegoo Neptune 0.4 nozzle", + "Elegoo Neptune X 0.4 nozzle", + "Elegoo Neptune 2 0.4 nozzle", + "Elegoo Neptune 2S 0.4 nozzle", + "Elegoo Neptune 2D 0.4 nozzle", + "Elegoo Neptune 3 0.4 nozzle", + "Elegoo Neptune 3 Pro 0.4 nozzle", + "Elegoo Neptune 3 Plus 0.4 nozzle", + "Elegoo Neptune 3 Max 0.4 nozzle", + "Elegoo Neptune 4 (0.2 nozzle)", + "Elegoo Neptune 4 (0.4 nozzle)", + "Elegoo Neptune 4 (0.6 nozzle)", + "Elegoo Neptune 4 (0.8 nozzle)", + "Elegoo Neptune 4 Max (0.2 nozzle)", + "Elegoo Neptune 4 Max (0.4 nozzle)", + "Elegoo Neptune 4 Max (0.6 nozzle)", + "Elegoo Neptune 4 Max (0.8 nozzle)", + "Elegoo Neptune 4 Plus (0.2 nozzle)", + "Elegoo Neptune 4 Plus (0.4 nozzle)", + "Elegoo Neptune 4 Plus (0.6 nozzle)", + "Elegoo Neptune 4 Plus (0.8 nozzle)", + "Elegoo Neptune 4 Pro (0.2 nozzle)", + "Elegoo Neptune 4 Pro (0.4 nozzle)", + "Elegoo Neptune 4 Pro (0.6 nozzle)", + "Elegoo Neptune 4 Pro (0.8 nozzle)" + ] } diff --git a/resources/profiles/Elegoo/filament/Elegoo Generic PETG PRO.json b/resources/profiles/Elegoo/filament/Elegoo Generic PETG PRO.json index 444d6524b1e..24cacc05066 100644 --- a/resources/profiles/Elegoo/filament/Elegoo Generic PETG PRO.json +++ b/resources/profiles/Elegoo/filament/Elegoo Generic PETG PRO.json @@ -77,5 +77,32 @@ ], "filament_end_gcode": [ "; filament end gcode \n" + ], + "compatible_printers": [ + "Elegoo Neptune 0.4 nozzle", + "Elegoo Neptune X 0.4 nozzle", + "Elegoo Neptune 2 0.4 nozzle", + "Elegoo Neptune 2S 0.4 nozzle", + "Elegoo Neptune 2D 0.4 nozzle", + "Elegoo Neptune 3 0.4 nozzle", + "Elegoo Neptune 3 Pro 0.4 nozzle", + "Elegoo Neptune 3 Plus 0.4 nozzle", + "Elegoo Neptune 3 Max 0.4 nozzle", + "Elegoo Neptune 4 (0.2 nozzle)", + "Elegoo Neptune 4 (0.4 nozzle)", + "Elegoo Neptune 4 (0.6 nozzle)", + "Elegoo Neptune 4 (0.8 nozzle)", + "Elegoo Neptune 4 Max (0.2 nozzle)", + "Elegoo Neptune 4 Max (0.4 nozzle)", + "Elegoo Neptune 4 Max (0.6 nozzle)", + "Elegoo Neptune 4 Max (0.8 nozzle)", + "Elegoo Neptune 4 Plus (0.2 nozzle)", + "Elegoo Neptune 4 Plus (0.4 nozzle)", + "Elegoo Neptune 4 Plus (0.6 nozzle)", + "Elegoo Neptune 4 Plus (0.8 nozzle)", + "Elegoo Neptune 4 Pro (0.2 nozzle)", + "Elegoo Neptune 4 Pro (0.4 nozzle)", + "Elegoo Neptune 4 Pro (0.6 nozzle)", + "Elegoo Neptune 4 Pro (0.8 nozzle)" ] } diff --git a/resources/profiles/Elegoo/filament/Elegoo Generic PLA Matte.json b/resources/profiles/Elegoo/filament/Elegoo Generic PLA Matte.json index bad35c3b98b..688a0304d96 100644 --- a/resources/profiles/Elegoo/filament/Elegoo Generic PLA Matte.json +++ b/resources/profiles/Elegoo/filament/Elegoo Generic PLA Matte.json @@ -17,5 +17,32 @@ ], "filament_start_gcode": [ "; filament start gcode\n" - ] + ], + "compatible_printers": [ + "Elegoo Neptune 0.4 nozzle", + "Elegoo Neptune X 0.4 nozzle", + "Elegoo Neptune 2 0.4 nozzle", + "Elegoo Neptune 2S 0.4 nozzle", + "Elegoo Neptune 2D 0.4 nozzle", + "Elegoo Neptune 3 0.4 nozzle", + "Elegoo Neptune 3 Pro 0.4 nozzle", + "Elegoo Neptune 3 Plus 0.4 nozzle", + "Elegoo Neptune 3 Max 0.4 nozzle", + "Elegoo Neptune 4 (0.2 nozzle)", + "Elegoo Neptune 4 (0.4 nozzle)", + "Elegoo Neptune 4 (0.6 nozzle)", + "Elegoo Neptune 4 (0.8 nozzle)", + "Elegoo Neptune 4 Max (0.2 nozzle)", + "Elegoo Neptune 4 Max (0.4 nozzle)", + "Elegoo Neptune 4 Max (0.6 nozzle)", + "Elegoo Neptune 4 Max (0.8 nozzle)", + "Elegoo Neptune 4 Plus (0.2 nozzle)", + "Elegoo Neptune 4 Plus (0.4 nozzle)", + "Elegoo Neptune 4 Plus (0.6 nozzle)", + "Elegoo Neptune 4 Plus (0.8 nozzle)", + "Elegoo Neptune 4 Pro (0.2 nozzle)", + "Elegoo Neptune 4 Pro (0.4 nozzle)", + "Elegoo Neptune 4 Pro (0.6 nozzle)", + "Elegoo Neptune 4 Pro (0.8 nozzle)" + ] } diff --git a/resources/profiles/Ratrig/filament/RatRig BigNozzle ABS.json b/resources/profiles/Ratrig/filament/RatRig BigNozzle ABS.json index eb6226db698..318eb4a1f3f 100644 --- a/resources/profiles/Ratrig/filament/RatRig BigNozzle ABS.json +++ b/resources/profiles/Ratrig/filament/RatRig BigNozzle ABS.json @@ -50,5 +50,32 @@ ], "overhang_fan_speed": [ "30" + ], + "compatible_printers": [ + "RatRig V-Core 3 200 0.4 nozzle", + "RatRig V-Core 3 300 0.4 nozzle", + "RatRig V-Core 3 400 0.4 nozzle", + "RatRig V-Core 3 500 0.4 nozzle", + "RatRig V-Minion 0.4 nozzle", + "RatRig V-Cast 0.4 nozzle", + "RatRig V-Cast 0.6 nozzle", + "RatRig V-Core 4 300 0.4 nozzle", + "RatRig V-Core 4 300 0.5 nozzle", + "RatRig V-Core 4 300 0.6 nozzle", + "RatRig V-Core 4 400 0.4 nozzle", + "RatRig V-Core 4 400 0.5 nozzle", + "RatRig V-Core 4 400 0.6 nozzle", + "RatRig V-Core 4 500 0.4 nozzle", + "RatRig V-Core 4 500 0.5 nozzle", + "RatRig V-Core 4 500 0.6 nozzle", + "RatRig V-Core 4 HYBRID 300 0.4 nozzle", + "RatRig V-Core 4 HYBRID 300 0.5 nozzle", + "RatRig V-Core 4 HYBRID 300 0.6 nozzle", + "RatRig V-Core 4 HYBRID 400 0.4 nozzle", + "RatRig V-Core 4 HYBRID 400 0.5 nozzle", + "RatRig V-Core 4 HYBRID 400 0.6 nozzle", + "RatRig V-Core 4 HYBRID 500 0.4 nozzle", + "RatRig V-Core 4 HYBRID 500 0.5 nozzle", + "RatRig V-Core 4 HYBRID 500 0.6 nozzle" ] } diff --git a/resources/profiles/Ratrig/filament/RatRig BigNozzle ASA.json b/resources/profiles/Ratrig/filament/RatRig BigNozzle ASA.json index 31827e04c23..87c1ead4d42 100644 --- a/resources/profiles/Ratrig/filament/RatRig BigNozzle ASA.json +++ b/resources/profiles/Ratrig/filament/RatRig BigNozzle ASA.json @@ -50,5 +50,32 @@ ], "overhang_fan_speed": [ "28" + ], + "compatible_printers": [ + "RatRig V-Core 3 200 0.4 nozzle", + "RatRig V-Core 3 300 0.4 nozzle", + "RatRig V-Core 3 400 0.4 nozzle", + "RatRig V-Core 3 500 0.4 nozzle", + "RatRig V-Minion 0.4 nozzle", + "RatRig V-Cast 0.4 nozzle", + "RatRig V-Cast 0.6 nozzle", + "RatRig V-Core 4 300 0.4 nozzle", + "RatRig V-Core 4 300 0.5 nozzle", + "RatRig V-Core 4 300 0.6 nozzle", + "RatRig V-Core 4 400 0.4 nozzle", + "RatRig V-Core 4 400 0.5 nozzle", + "RatRig V-Core 4 400 0.6 nozzle", + "RatRig V-Core 4 500 0.4 nozzle", + "RatRig V-Core 4 500 0.5 nozzle", + "RatRig V-Core 4 500 0.6 nozzle", + "RatRig V-Core 4 HYBRID 300 0.4 nozzle", + "RatRig V-Core 4 HYBRID 300 0.5 nozzle", + "RatRig V-Core 4 HYBRID 300 0.6 nozzle", + "RatRig V-Core 4 HYBRID 400 0.4 nozzle", + "RatRig V-Core 4 HYBRID 400 0.5 nozzle", + "RatRig V-Core 4 HYBRID 400 0.6 nozzle", + "RatRig V-Core 4 HYBRID 500 0.4 nozzle", + "RatRig V-Core 4 HYBRID 500 0.5 nozzle", + "RatRig V-Core 4 HYBRID 500 0.6 nozzle" ] } diff --git a/resources/profiles/Ratrig/filament/RatRig BigNozzle PCTG.json b/resources/profiles/Ratrig/filament/RatRig BigNozzle PCTG.json index 480aa223962..48728018c81 100644 --- a/resources/profiles/Ratrig/filament/RatRig BigNozzle PCTG.json +++ b/resources/profiles/Ratrig/filament/RatRig BigNozzle PCTG.json @@ -65,5 +65,32 @@ ], "temperature_vitrification": [ "90" + ], + "compatible_printers": [ + "RatRig V-Core 3 200 0.4 nozzle", + "RatRig V-Core 3 300 0.4 nozzle", + "RatRig V-Core 3 400 0.4 nozzle", + "RatRig V-Core 3 500 0.4 nozzle", + "RatRig V-Minion 0.4 nozzle", + "RatRig V-Cast 0.4 nozzle", + "RatRig V-Cast 0.6 nozzle", + "RatRig V-Core 4 300 0.4 nozzle", + "RatRig V-Core 4 300 0.5 nozzle", + "RatRig V-Core 4 300 0.6 nozzle", + "RatRig V-Core 4 400 0.4 nozzle", + "RatRig V-Core 4 400 0.5 nozzle", + "RatRig V-Core 4 400 0.6 nozzle", + "RatRig V-Core 4 500 0.4 nozzle", + "RatRig V-Core 4 500 0.5 nozzle", + "RatRig V-Core 4 500 0.6 nozzle", + "RatRig V-Core 4 HYBRID 300 0.4 nozzle", + "RatRig V-Core 4 HYBRID 300 0.5 nozzle", + "RatRig V-Core 4 HYBRID 300 0.6 nozzle", + "RatRig V-Core 4 HYBRID 400 0.4 nozzle", + "RatRig V-Core 4 HYBRID 400 0.5 nozzle", + "RatRig V-Core 4 HYBRID 400 0.6 nozzle", + "RatRig V-Core 4 HYBRID 500 0.4 nozzle", + "RatRig V-Core 4 HYBRID 500 0.5 nozzle", + "RatRig V-Core 4 HYBRID 500 0.6 nozzle" ] } diff --git a/resources/profiles/Ratrig/filament/RatRig BigNozzle PETG.json b/resources/profiles/Ratrig/filament/RatRig BigNozzle PETG.json index da008803733..6c42d5533dc 100644 --- a/resources/profiles/Ratrig/filament/RatRig BigNozzle PETG.json +++ b/resources/profiles/Ratrig/filament/RatRig BigNozzle PETG.json @@ -59,5 +59,32 @@ ], "nozzle_temperature_range_low": [ "230" + ], + "compatible_printers": [ + "RatRig V-Core 3 200 0.4 nozzle", + "RatRig V-Core 3 300 0.4 nozzle", + "RatRig V-Core 3 400 0.4 nozzle", + "RatRig V-Core 3 500 0.4 nozzle", + "RatRig V-Minion 0.4 nozzle", + "RatRig V-Cast 0.4 nozzle", + "RatRig V-Cast 0.6 nozzle", + "RatRig V-Core 4 300 0.4 nozzle", + "RatRig V-Core 4 300 0.5 nozzle", + "RatRig V-Core 4 300 0.6 nozzle", + "RatRig V-Core 4 400 0.4 nozzle", + "RatRig V-Core 4 400 0.5 nozzle", + "RatRig V-Core 4 400 0.6 nozzle", + "RatRig V-Core 4 500 0.4 nozzle", + "RatRig V-Core 4 500 0.5 nozzle", + "RatRig V-Core 4 500 0.6 nozzle", + "RatRig V-Core 4 HYBRID 300 0.4 nozzle", + "RatRig V-Core 4 HYBRID 300 0.5 nozzle", + "RatRig V-Core 4 HYBRID 300 0.6 nozzle", + "RatRig V-Core 4 HYBRID 400 0.4 nozzle", + "RatRig V-Core 4 HYBRID 400 0.5 nozzle", + "RatRig V-Core 4 HYBRID 400 0.6 nozzle", + "RatRig V-Core 4 HYBRID 500 0.4 nozzle", + "RatRig V-Core 4 HYBRID 500 0.5 nozzle", + "RatRig V-Core 4 HYBRID 500 0.6 nozzle" ] } diff --git a/resources/profiles/Ratrig/filament/RatRig BigNozzle PLA.json b/resources/profiles/Ratrig/filament/RatRig BigNozzle PLA.json index f3121fe45db..5f426a270ae 100644 --- a/resources/profiles/Ratrig/filament/RatRig BigNozzle PLA.json +++ b/resources/profiles/Ratrig/filament/RatRig BigNozzle PLA.json @@ -35,5 +35,32 @@ ], "nozzle_temperature_range_low": [ "210" + ], + "compatible_printers": [ + "RatRig V-Core 3 200 0.4 nozzle", + "RatRig V-Core 3 300 0.4 nozzle", + "RatRig V-Core 3 400 0.4 nozzle", + "RatRig V-Core 3 500 0.4 nozzle", + "RatRig V-Minion 0.4 nozzle", + "RatRig V-Cast 0.4 nozzle", + "RatRig V-Cast 0.6 nozzle", + "RatRig V-Core 4 300 0.4 nozzle", + "RatRig V-Core 4 300 0.5 nozzle", + "RatRig V-Core 4 300 0.6 nozzle", + "RatRig V-Core 4 400 0.4 nozzle", + "RatRig V-Core 4 400 0.5 nozzle", + "RatRig V-Core 4 400 0.6 nozzle", + "RatRig V-Core 4 500 0.4 nozzle", + "RatRig V-Core 4 500 0.5 nozzle", + "RatRig V-Core 4 500 0.6 nozzle", + "RatRig V-Core 4 HYBRID 300 0.4 nozzle", + "RatRig V-Core 4 HYBRID 300 0.5 nozzle", + "RatRig V-Core 4 HYBRID 300 0.6 nozzle", + "RatRig V-Core 4 HYBRID 400 0.4 nozzle", + "RatRig V-Core 4 HYBRID 400 0.5 nozzle", + "RatRig V-Core 4 HYBRID 400 0.6 nozzle", + "RatRig V-Core 4 HYBRID 500 0.4 nozzle", + "RatRig V-Core 4 HYBRID 500 0.5 nozzle", + "RatRig V-Core 4 HYBRID 500 0.6 nozzle" ] } diff --git a/resources/profiles/Ratrig/filament/RatRig Generic PCTG.json b/resources/profiles/Ratrig/filament/RatRig Generic PCTG.json index 9f28df73abf..bf85ee98d31 100644 --- a/resources/profiles/Ratrig/filament/RatRig Generic PCTG.json +++ b/resources/profiles/Ratrig/filament/RatRig Generic PCTG.json @@ -62,5 +62,32 @@ ], "temperature_vitrification": [ "90" + ], + "compatible_printers": [ + "RatRig V-Core 3 200 0.4 nozzle", + "RatRig V-Core 3 300 0.4 nozzle", + "RatRig V-Core 3 400 0.4 nozzle", + "RatRig V-Core 3 500 0.4 nozzle", + "RatRig V-Minion 0.4 nozzle", + "RatRig V-Cast 0.4 nozzle", + "RatRig V-Cast 0.6 nozzle", + "RatRig V-Core 4 300 0.4 nozzle", + "RatRig V-Core 4 300 0.5 nozzle", + "RatRig V-Core 4 300 0.6 nozzle", + "RatRig V-Core 4 400 0.4 nozzle", + "RatRig V-Core 4 400 0.5 nozzle", + "RatRig V-Core 4 400 0.6 nozzle", + "RatRig V-Core 4 500 0.4 nozzle", + "RatRig V-Core 4 500 0.5 nozzle", + "RatRig V-Core 4 500 0.6 nozzle", + "RatRig V-Core 4 HYBRID 300 0.4 nozzle", + "RatRig V-Core 4 HYBRID 300 0.5 nozzle", + "RatRig V-Core 4 HYBRID 300 0.6 nozzle", + "RatRig V-Core 4 HYBRID 400 0.4 nozzle", + "RatRig V-Core 4 HYBRID 400 0.5 nozzle", + "RatRig V-Core 4 HYBRID 400 0.6 nozzle", + "RatRig V-Core 4 HYBRID 500 0.4 nozzle", + "RatRig V-Core 4 HYBRID 500 0.5 nozzle", + "RatRig V-Core 4 HYBRID 500 0.6 nozzle" ] } diff --git a/resources/web/guide/22/22.js b/resources/web/guide/22/22.js index 41f014c9188..cdb00f26c8a 100644 --- a/resources/web/guide/22/22.js +++ b/resources/web/guide/22/22.js @@ -138,7 +138,8 @@ function SortUI() //let bCheck=$("#MachineList input:first").prop("checked"); if( fModel=='') { - bFind=true; + // Orca: hide + bFind=false; } else { From 99a0facfb3a5c9b4e661e536825c08393053cb53 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Mon, 6 Jan 2025 20:56:07 +0800 Subject: [PATCH 21/33] Check missing `compatible_printers` error --- src/libslic3r/Preset.cpp | 1 + src/libslic3r/PresetBundle.cpp | 20 ++++++++++++++++++++ src/libslic3r/PresetBundle.hpp | 7 +------ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index d6596b2fb97..1ed6d07ad87 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -1174,6 +1174,7 @@ void PresetCollection::load_presets( << "Error in a preset file: The preset \"" << preset.file << "\" contains the following incorrect keys: " << incorrect_keys << ", which were removed"; } + preset.loaded = true; //BBS: add some workaround for previous incorrect settings if ((!preset.setting_id.empty())&&(preset.setting_id == preset.base_id)) diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index ae18f5f810e..039930c3872 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -4190,4 +4190,24 @@ void PresetBundle::set_default_suppressed(bool default_suppressed) printers.set_default_suppressed(default_suppressed); } +bool PresetBundle::has_errors() const +{ + if (m_errors != 0 || printers.m_errors != 0 || filaments.m_errors != 0 || prints.m_errors != 0) + return true; + + bool has_errors = false; + // Orca: check if all filament presets have compatible_printers setting + for (auto& preset : filaments) { + if (!preset.is_system) + continue; + auto* compatible_printers = dynamic_cast(preset.config.option("compatible_printers")); + if (compatible_printers == nullptr || compatible_printers->values.empty()) { + has_errors = true; + BOOST_LOG_TRIVIAL(error) << "Filament preset \"" << preset.file << "\" is missing compatible_printers setting"; + } + } + + return has_errors; +} + } // namespace Slic3r diff --git a/src/libslic3r/PresetBundle.hpp b/src/libslic3r/PresetBundle.hpp index 29379379200..da952dde272 100644 --- a/src/libslic3r/PresetBundle.hpp +++ b/src/libslic3r/PresetBundle.hpp @@ -274,12 +274,7 @@ class PresetBundle } // Orca: for validation only - bool has_errors() const - { - if (m_errors != 0 || printers.m_errors != 0 || filaments.m_errors != 0 || prints.m_errors != 0) - return true; - return false; - } + bool has_errors() const; private: //std::pair load_system_presets(ForwardCompatibilitySubstitutionRule compatibility_rule); From 5b1bc5c0efd2a99c6e4212870ffe1f2139dc9fd3 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Mon, 6 Jan 2025 23:53:33 +0800 Subject: [PATCH 22/33] free mac space --- .github/workflows/build_orca.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/build_orca.yml b/.github/workflows/build_orca.yml index 56548dc46a2..75af2364cf9 100644 --- a/.github/workflows/build_orca.yml +++ b/.github/workflows/build_orca.yml @@ -87,6 +87,14 @@ jobs: mkdir -p ${{ github.workspace }}/deps/build_${{inputs.arch}}/OrcaSlicer_dep_${{inputs.arch}} tree ${{ github.workspace }}/deps/build_${{inputs.arch}}/OrcaSlicer_dep_${{inputs.arch}} + - name: Free disk space + if: inputs.os == 'macos-14' + run: | + df -hI /dev/disk3s1s1 + sudo find /Applications -maxdepth 1 -type d -name "Xcode_*.app" ! -name "Xcode_15.4.app" -exec rm -rf {} + + sudo rm -rf ~/Library/Developer/CoreSimulator/Caches/* + df -hI /dev/disk3s1s1 + - name: Build slicer mac if: inputs.os == 'macos-14' working-directory: ${{ github.workspace }} From adba9a0280805f21325657f5ddea6ace2262a83e Mon Sep 17 00:00:00 2001 From: SoftFever Date: Tue, 7 Jan 2025 07:49:43 +0800 Subject: [PATCH 23/33] Update build_orca.yml --- .github/workflows/build_orca.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build_orca.yml b/.github/workflows/build_orca.yml index 75af2364cf9..b31fdbcd701 100644 --- a/.github/workflows/build_orca.yml +++ b/.github/workflows/build_orca.yml @@ -81,11 +81,10 @@ jobs: - name: Install tools mac if: inputs.os == 'macos-14' run: | - brew install tree ninja libtool + brew install ninja libtool brew list mkdir -p ${{ github.workspace }}/deps/build_${{inputs.arch}} mkdir -p ${{ github.workspace }}/deps/build_${{inputs.arch}}/OrcaSlicer_dep_${{inputs.arch}} - tree ${{ github.workspace }}/deps/build_${{inputs.arch}}/OrcaSlicer_dep_${{inputs.arch}} - name: Free disk space if: inputs.os == 'macos-14' From 9b68c695d73861eccfea18c6fcd9165b980008da Mon Sep 17 00:00:00 2001 From: whoseyoung <78847564+whoseyoung@users.noreply.github.com> Date: Tue, 7 Jan 2025 22:46:02 +0800 Subject: [PATCH 24/33] Updated some configurations for the Geeetech M1 machine (#7481) Updated some configurations for the M1 machine Fixed an issue where incorrect parameters on the M1 machine caused slicing to fail. --- .../filament/Generic PETG @Geeetech.json | 62 +++++++++---------- .../filament/Generic PLA @Geeetech.json | 54 ++++++++-------- .../Generic PLA @Geeetech_FastSpeed.json | 16 ++--- .../filament/Generic PLA-CF @Geeetech.json | 62 +++++++++---------- .../filament/Generic PVA @Geeetech.json | 54 ++++++++-------- .../filament/Generic TPU @Geeetech.json | 62 +++++++++---------- .../machine/Geeetech M1 0.2 nozzle.json | 24 +++---- .../machine/Geeetech M1 0.4 nozzle.json | 24 +++---- .../machine/Geeetech M1 0.6 nozzle.json | 24 +++---- .../machine/Geeetech M1 0.8 nozzle.json | 24 +++---- .../Geeetech/machine/fdm_geeetech_common.json | 4 +- .../Geeetech/machine/fdm_machine_common.json | 3 +- .../0.08mm Extra Fine @Geeetech M1.json | 29 +++++---- ....08mm Optimal @Geeetech M1 0.2 nozzle.json | 29 +++++---- .../process/0.10mm Fine @Geeetech M1.json | 29 +++++---- ...10mm Standard @Geeetech M1 0.2 nozzle.json | 29 +++++---- .../0.12mm Draft @Geeetech M1 0.2 nozzle.json | 29 +++++---- ...m Extra Draft @Geeetech M1 0.2 nozzle.json | 29 +++++---- .../process/0.16mm Optimal @Geeetech M1.json | 29 +++++---- .../process/0.20mm Standard @Geeetech M1.json | 31 ++++++---- ....24mm Optimal @Geeetech M1 0.6 nozzle.json | 29 +++++---- .../process/0.25mm Draft @Geeetech M1.json | 31 ++++++---- ...30mm Standard @Geeetech M1 0.6 nozzle.json | 29 +++++---- .../0.36mm Draft @Geeetech M1 0.6 nozzle.json | 29 +++++---- ....36mm Optimal @Geeetech M1 0.8 nozzle.json | 29 +++++---- .../0.44mm Draft @Geeetech M1 0.8 nozzle.json | 29 +++++---- .../process/fdm_process_Geeetech_HS_0.20.json | 2 +- .../process/fdm_process_Geeetech_HS_0.25.json | 4 +- 28 files changed, 464 insertions(+), 365 deletions(-) diff --git a/resources/profiles/Geeetech/filament/Generic PETG @Geeetech.json b/resources/profiles/Geeetech/filament/Generic PETG @Geeetech.json index c5adbe3d500..b003156d2c4 100644 --- a/resources/profiles/Geeetech/filament/Generic PETG @Geeetech.json +++ b/resources/profiles/Geeetech/filament/Generic PETG @Geeetech.json @@ -48,9 +48,9 @@ "Geeetech A10 Pro 0.6 nozzle", "Geeetech A10 Pro 0.8 nozzle", "Geeetech A20 0.2 nozzle", - "Geeetech A20 0.4 nozzle", - "Geeetech A20 0.6 nozzle", - "Geeetech A20 0.8 nozzle", + "Geeetech A20 0.4 nozzle", + "Geeetech A20 0.6 nozzle", + "Geeetech A20 0.8 nozzle", "Geeetech A30 Pro 0.2 nozzle", "Geeetech A30 Pro 0.4 nozzle", "Geeetech A30 Pro 0.6 nozzle", @@ -58,33 +58,33 @@ "Geeetech A10 M 0.4 nozzle", "Geeetech A20 M 0.4 nozzle", "Geeetech A30 M 0.4 nozzle", - "Geeetech A10 T 0.4 nozzle", - "Geeetech A20 T 0.4 nozzle", - "Geeetech A30 T 0.4 nozzle", - "Geeetech Mizar 0.2 nozzle", - "Geeetech Mizar 0.4 nozzle", - "Geeetech Mizar 0.6 nozzle", - "Geeetech Mizar 0.8 nozzle", - "Geeetech Mizar S 0.2 nozzle", - "Geeetech Mizar S 0.4 nozzle", - "Geeetech Mizar S 0.6 nozzle", - "Geeetech Mizar S 0.8 nozzle", - "Geeetech Mizar Pro 0.2 nozzle", - "Geeetech Mizar Pro 0.4 nozzle", - "Geeetech Mizar Pro 0.6 nozzle", - "Geeetech Mizar Pro 0.8 nozzle", - "Geeetech Mizar Max 0.2 nozzle", - "Geeetech Mizar Max 0.4 nozzle", - "Geeetech Mizar Max 0.6 nozzle", - "Geeetech Mizar Max 0.8 nozzle", - "Geeetech Mizar M 0.4 nozzle", - "Geeetech Thunder 0.2 nozzle", - "Geeetech Thunder 0.4 nozzle", - "Geeetech Thunder 0.6 nozzle", - "Geeetech Thunder 0.8 nozzle", - "Geeetech M1 0.2 nozzle", - "Geeetech M1 0.4 nozzle", - "Geeetech M1 0.6 nozzle", - "Geeetech M1 0.8 nozzle" + "Geeetech A10 T 0.4 nozzle", + "Geeetech A20 T 0.4 nozzle", + "Geeetech A30 T 0.4 nozzle", + "Geeetech Mizar 0.2 nozzle", + "Geeetech Mizar 0.4 nozzle", + "Geeetech Mizar 0.6 nozzle", + "Geeetech Mizar 0.8 nozzle", + "Geeetech Mizar S 0.2 nozzle", + "Geeetech Mizar S 0.4 nozzle", + "Geeetech Mizar S 0.6 nozzle", + "Geeetech Mizar S 0.8 nozzle", + "Geeetech Mizar Pro 0.2 nozzle", + "Geeetech Mizar Pro 0.4 nozzle", + "Geeetech Mizar Pro 0.6 nozzle", + "Geeetech Mizar Pro 0.8 nozzle", + "Geeetech Mizar Max 0.2 nozzle", + "Geeetech Mizar Max 0.4 nozzle", + "Geeetech Mizar Max 0.6 nozzle", + "Geeetech Mizar Max 0.8 nozzle", + "Geeetech Mizar M 0.4 nozzle", + "Geeetech Thunder 0.2 nozzle", + "Geeetech Thunder 0.4 nozzle", + "Geeetech Thunder 0.6 nozzle", + "Geeetech Thunder 0.8 nozzle", + "Geeetech M1 0.2 nozzle", + "Geeetech M1 0.4 nozzle", + "Geeetech M1 0.6 nozzle", + "Geeetech M1 0.8 nozzle" ] } \ No newline at end of file diff --git a/resources/profiles/Geeetech/filament/Generic PLA @Geeetech.json b/resources/profiles/Geeetech/filament/Generic PLA @Geeetech.json index 1c74088c4e0..3606f07d2a3 100644 --- a/resources/profiles/Geeetech/filament/Generic PLA @Geeetech.json +++ b/resources/profiles/Geeetech/filament/Generic PLA @Geeetech.json @@ -17,9 +17,9 @@ "Geeetech A10 Pro 0.6 nozzle", "Geeetech A10 Pro 0.8 nozzle", "Geeetech A20 0.2 nozzle", - "Geeetech A20 0.4 nozzle", - "Geeetech A20 0.6 nozzle", - "Geeetech A20 0.8 nozzle", + "Geeetech A20 0.4 nozzle", + "Geeetech A20 0.6 nozzle", + "Geeetech A20 0.8 nozzle", "Geeetech A30 Pro 0.2 nozzle", "Geeetech A30 Pro 0.4 nozzle", "Geeetech A30 Pro 0.6 nozzle", @@ -27,29 +27,29 @@ "Geeetech A10 M 0.4 nozzle", "Geeetech A20 M 0.4 nozzle", "Geeetech A30 M 0.4 nozzle", - "Geeetech A10 T 0.4 nozzle", - "Geeetech A20 T 0.4 nozzle", - "Geeetech A30 T 0.4 nozzle", - "Geeetech Mizar 0.2 nozzle", - "Geeetech Mizar 0.4 nozzle", - "Geeetech Mizar 0.6 nozzle", - "Geeetech Mizar 0.8 nozzle", - "Geeetech Mizar S 0.2 nozzle", - "Geeetech Mizar S 0.4 nozzle", - "Geeetech Mizar S 0.6 nozzle", - "Geeetech Mizar S 0.8 nozzle", - "Geeetech Mizar Pro 0.2 nozzle", - "Geeetech Mizar Pro 0.4 nozzle", - "Geeetech Mizar Pro 0.6 nozzle", - "Geeetech Mizar Pro 0.8 nozzle", - "Geeetech Mizar Max 0.2 nozzle", - "Geeetech Mizar Max 0.4 nozzle", - "Geeetech Mizar Max 0.6 nozzle", - "Geeetech Mizar Max 0.8 nozzle", - "Geeetech Mizar M 0.4 nozzle", - "Geeetech M1 0.2 nozzle", - "Geeetech M1 0.4 nozzle", - "Geeetech M1 0.6 nozzle", - "Geeetech M1 0.8 nozzle" + "Geeetech A10 T 0.4 nozzle", + "Geeetech A20 T 0.4 nozzle", + "Geeetech A30 T 0.4 nozzle", + "Geeetech Mizar 0.2 nozzle", + "Geeetech Mizar 0.4 nozzle", + "Geeetech Mizar 0.6 nozzle", + "Geeetech Mizar 0.8 nozzle", + "Geeetech Mizar S 0.2 nozzle", + "Geeetech Mizar S 0.4 nozzle", + "Geeetech Mizar S 0.6 nozzle", + "Geeetech Mizar S 0.8 nozzle", + "Geeetech Mizar Pro 0.2 nozzle", + "Geeetech Mizar Pro 0.4 nozzle", + "Geeetech Mizar Pro 0.6 nozzle", + "Geeetech Mizar Pro 0.8 nozzle", + "Geeetech Mizar Max 0.2 nozzle", + "Geeetech Mizar Max 0.4 nozzle", + "Geeetech Mizar Max 0.6 nozzle", + "Geeetech Mizar Max 0.8 nozzle", + "Geeetech Mizar M 0.4 nozzle", + "Geeetech M1 0.2 nozzle", + "Geeetech M1 0.4 nozzle", + "Geeetech M1 0.6 nozzle", + "Geeetech M1 0.8 nozzle" ] } \ No newline at end of file diff --git a/resources/profiles/Geeetech/filament/Generic PLA @Geeetech_FastSpeed.json b/resources/profiles/Geeetech/filament/Generic PLA @Geeetech_FastSpeed.json index 7d1d2e86e17..c1d3566c4eb 100644 --- a/resources/profiles/Geeetech/filament/Generic PLA @Geeetech_FastSpeed.json +++ b/resources/profiles/Geeetech/filament/Generic PLA @Geeetech_FastSpeed.json @@ -19,13 +19,13 @@ "hot_plate_temp_initial_layer": ["65"], "textured_plate_temp_initial_layer": ["65"], "compatible_printers": [ - "Geeetech Thunder 0.2 nozzle", - "Geeetech Thunder 0.4 nozzle", - "Geeetech Thunder 0.6 nozzle", - "Geeetech Thunder 0.8 nozzle", - "Geeetech M1 0.2 nozzle", - "Geeetech M1 0.4 nozzle", - "Geeetech M1 0.6 nozzle", - "Geeetech M1 0.8 nozzle" + "Geeetech Thunder 0.2 nozzle", + "Geeetech Thunder 0.4 nozzle", + "Geeetech Thunder 0.6 nozzle", + "Geeetech Thunder 0.8 nozzle", + "Geeetech M1 0.2 nozzle", + "Geeetech M1 0.4 nozzle", + "Geeetech M1 0.6 nozzle", + "Geeetech M1 0.8 nozzle" ] } \ No newline at end of file diff --git a/resources/profiles/Geeetech/filament/Generic PLA-CF @Geeetech.json b/resources/profiles/Geeetech/filament/Generic PLA-CF @Geeetech.json index 6489909a087..3c077478005 100644 --- a/resources/profiles/Geeetech/filament/Generic PLA-CF @Geeetech.json +++ b/resources/profiles/Geeetech/filament/Generic PLA-CF @Geeetech.json @@ -24,9 +24,9 @@ "Geeetech A10 Pro 0.6 nozzle", "Geeetech A10 Pro 0.8 nozzle", "Geeetech A20 0.2 nozzle", - "Geeetech A20 0.4 nozzle", - "Geeetech A20 0.6 nozzle", - "Geeetech A20 0.8 nozzle", + "Geeetech A20 0.4 nozzle", + "Geeetech A20 0.6 nozzle", + "Geeetech A20 0.8 nozzle", "Geeetech A30 Pro 0.2 nozzle", "Geeetech A30 Pro 0.4 nozzle", "Geeetech A30 Pro 0.6 nozzle", @@ -34,33 +34,33 @@ "Geeetech A10 M 0.4 nozzle", "Geeetech A20 M 0.4 nozzle", "Geeetech A30 M 0.4 nozzle", - "Geeetech A10 T 0.4 nozzle", - "Geeetech A20 T 0.4 nozzle", - "Geeetech A30 T 0.4 nozzle", - "Geeetech Mizar 0.2 nozzle", - "Geeetech Mizar 0.4 nozzle", - "Geeetech Mizar 0.6 nozzle", - "Geeetech Mizar 0.8 nozzle", - "Geeetech Mizar S 0.2 nozzle", - "Geeetech Mizar S 0.4 nozzle", - "Geeetech Mizar S 0.6 nozzle", - "Geeetech Mizar S 0.8 nozzle", - "Geeetech Mizar Pro 0.2 nozzle", - "Geeetech Mizar Pro 0.4 nozzle", - "Geeetech Mizar Pro 0.6 nozzle", - "Geeetech Mizar Pro 0.8 nozzle", - "Geeetech Mizar Max 0.2 nozzle", - "Geeetech Mizar Max 0.4 nozzle", - "Geeetech Mizar Max 0.6 nozzle", - "Geeetech Mizar Max 0.8 nozzle", - "Geeetech Mizar M 0.4 nozzle", - "Geeetech Thunder 0.2 nozzle", - "Geeetech Thunder 0.4 nozzle", - "Geeetech Thunder 0.6 nozzle", - "Geeetech Thunder 0.8 nozzle", - "Geeetech M1 0.2 nozzle", - "Geeetech M1 0.4 nozzle", - "Geeetech M1 0.6 nozzle", - "Geeetech M1 0.8 nozzle" + "Geeetech A10 T 0.4 nozzle", + "Geeetech A20 T 0.4 nozzle", + "Geeetech A30 T 0.4 nozzle", + "Geeetech Mizar 0.2 nozzle", + "Geeetech Mizar 0.4 nozzle", + "Geeetech Mizar 0.6 nozzle", + "Geeetech Mizar 0.8 nozzle", + "Geeetech Mizar S 0.2 nozzle", + "Geeetech Mizar S 0.4 nozzle", + "Geeetech Mizar S 0.6 nozzle", + "Geeetech Mizar S 0.8 nozzle", + "Geeetech Mizar Pro 0.2 nozzle", + "Geeetech Mizar Pro 0.4 nozzle", + "Geeetech Mizar Pro 0.6 nozzle", + "Geeetech Mizar Pro 0.8 nozzle", + "Geeetech Mizar Max 0.2 nozzle", + "Geeetech Mizar Max 0.4 nozzle", + "Geeetech Mizar Max 0.6 nozzle", + "Geeetech Mizar Max 0.8 nozzle", + "Geeetech Mizar M 0.4 nozzle", + "Geeetech Thunder 0.2 nozzle", + "Geeetech Thunder 0.4 nozzle", + "Geeetech Thunder 0.6 nozzle", + "Geeetech Thunder 0.8 nozzle", + "Geeetech M1 0.2 nozzle", + "Geeetech M1 0.4 nozzle", + "Geeetech M1 0.6 nozzle", + "Geeetech M1 0.8 nozzle" ] } \ No newline at end of file diff --git a/resources/profiles/Geeetech/filament/Generic PVA @Geeetech.json b/resources/profiles/Geeetech/filament/Generic PVA @Geeetech.json index 45342caf6be..165abbe22d9 100644 --- a/resources/profiles/Geeetech/filament/Generic PVA @Geeetech.json +++ b/resources/profiles/Geeetech/filament/Generic PVA @Geeetech.json @@ -24,9 +24,9 @@ "Geeetech A10 Pro 0.6 nozzle", "Geeetech A10 Pro 0.8 nozzle", "Geeetech A20 0.2 nozzle", - "Geeetech A20 0.4 nozzle", - "Geeetech A20 0.6 nozzle", - "Geeetech A20 0.8 nozzle", + "Geeetech A20 0.4 nozzle", + "Geeetech A20 0.6 nozzle", + "Geeetech A20 0.8 nozzle", "Geeetech A30 Pro 0.2 nozzle", "Geeetech A30 Pro 0.4 nozzle", "Geeetech A30 Pro 0.6 nozzle", @@ -34,29 +34,29 @@ "Geeetech A10 M 0.4 nozzle", "Geeetech A20 M 0.4 nozzle", "Geeetech A30 M 0.4 nozzle", - "Geeetech A10 T 0.4 nozzle", - "Geeetech A20 T 0.4 nozzle", - "Geeetech A30 T 0.4 nozzle", - "Geeetech Mizar 0.2 nozzle", - "Geeetech Mizar 0.4 nozzle", - "Geeetech Mizar 0.6 nozzle", - "Geeetech Mizar 0.8 nozzle", - "Geeetech Mizar S 0.2 nozzle", - "Geeetech Mizar S 0.4 nozzle", - "Geeetech Mizar S 0.6 nozzle", - "Geeetech Mizar S 0.8 nozzle", - "Geeetech Mizar Pro 0.2 nozzle", - "Geeetech Mizar Pro 0.4 nozzle", - "Geeetech Mizar Pro 0.6 nozzle", - "Geeetech Mizar Pro 0.8 nozzle", - "Geeetech Mizar Max 0.2 nozzle", - "Geeetech Mizar Max 0.4 nozzle", - "Geeetech Mizar Max 0.6 nozzle", - "Geeetech Mizar Max 0.8 nozzle", - "Geeetech Mizar M 0.4 nozzle", - "Geeetech M1 0.2 nozzle", - "Geeetech M1 0.4 nozzle", - "Geeetech M1 0.6 nozzle", - "Geeetech M1 0.8 nozzle" + "Geeetech A10 T 0.4 nozzle", + "Geeetech A20 T 0.4 nozzle", + "Geeetech A30 T 0.4 nozzle", + "Geeetech Mizar 0.2 nozzle", + "Geeetech Mizar 0.4 nozzle", + "Geeetech Mizar 0.6 nozzle", + "Geeetech Mizar 0.8 nozzle", + "Geeetech Mizar S 0.2 nozzle", + "Geeetech Mizar S 0.4 nozzle", + "Geeetech Mizar S 0.6 nozzle", + "Geeetech Mizar S 0.8 nozzle", + "Geeetech Mizar Pro 0.2 nozzle", + "Geeetech Mizar Pro 0.4 nozzle", + "Geeetech Mizar Pro 0.6 nozzle", + "Geeetech Mizar Pro 0.8 nozzle", + "Geeetech Mizar Max 0.2 nozzle", + "Geeetech Mizar Max 0.4 nozzle", + "Geeetech Mizar Max 0.6 nozzle", + "Geeetech Mizar Max 0.8 nozzle", + "Geeetech Mizar M 0.4 nozzle", + "Geeetech M1 0.2 nozzle", + "Geeetech M1 0.4 nozzle", + "Geeetech M1 0.6 nozzle", + "Geeetech M1 0.8 nozzle" ] } \ No newline at end of file diff --git a/resources/profiles/Geeetech/filament/Generic TPU @Geeetech.json b/resources/profiles/Geeetech/filament/Generic TPU @Geeetech.json index 06af7a93393..31f225a4df7 100644 --- a/resources/profiles/Geeetech/filament/Generic TPU @Geeetech.json +++ b/resources/profiles/Geeetech/filament/Generic TPU @Geeetech.json @@ -15,9 +15,9 @@ "Geeetech A10 Pro 0.6 nozzle", "Geeetech A10 Pro 0.8 nozzle", "Geeetech A20 0.2 nozzle", - "Geeetech A20 0.4 nozzle", - "Geeetech A20 0.6 nozzle", - "Geeetech A20 0.8 nozzle", + "Geeetech A20 0.4 nozzle", + "Geeetech A20 0.6 nozzle", + "Geeetech A20 0.8 nozzle", "Geeetech A30 Pro 0.2 nozzle", "Geeetech A30 Pro 0.4 nozzle", "Geeetech A30 Pro 0.6 nozzle", @@ -25,33 +25,33 @@ "Geeetech A10 M 0.4 nozzle", "Geeetech A20 M 0.4 nozzle", "Geeetech A30 M 0.4 nozzle", - "Geeetech A10 T 0.4 nozzle", - "Geeetech A20 T 0.4 nozzle", - "Geeetech A30 T 0.4 nozzle", - "Geeetech Mizar 0.2 nozzle", - "Geeetech Mizar 0.4 nozzle", - "Geeetech Mizar 0.6 nozzle", - "Geeetech Mizar 0.8 nozzle", - "Geeetech Mizar S 0.2 nozzle", - "Geeetech Mizar S 0.4 nozzle", - "Geeetech Mizar S 0.6 nozzle", - "Geeetech Mizar S 0.8 nozzle", - "Geeetech Mizar Pro 0.2 nozzle", - "Geeetech Mizar Pro 0.4 nozzle", - "Geeetech Mizar Pro 0.6 nozzle", - "Geeetech Mizar Pro 0.8 nozzle", - "Geeetech Mizar Max 0.2 nozzle", - "Geeetech Mizar Max 0.4 nozzle", - "Geeetech Mizar Max 0.6 nozzle", - "Geeetech Mizar Max 0.8 nozzle", - "Geeetech Mizar M 0.4 nozzle", - "Geeetech Thunder 0.2 nozzle", - "Geeetech Thunder 0.4 nozzle", - "Geeetech Thunder 0.6 nozzle", - "Geeetech Thunder 0.8 nozzle", - "Geeetech M1 0.2 nozzle", - "Geeetech M1 0.4 nozzle", - "Geeetech M1 0.6 nozzle", - "Geeetech M1 0.8 nozzle" + "Geeetech A10 T 0.4 nozzle", + "Geeetech A20 T 0.4 nozzle", + "Geeetech A30 T 0.4 nozzle", + "Geeetech Mizar 0.2 nozzle", + "Geeetech Mizar 0.4 nozzle", + "Geeetech Mizar 0.6 nozzle", + "Geeetech Mizar 0.8 nozzle", + "Geeetech Mizar S 0.2 nozzle", + "Geeetech Mizar S 0.4 nozzle", + "Geeetech Mizar S 0.6 nozzle", + "Geeetech Mizar S 0.8 nozzle", + "Geeetech Mizar Pro 0.2 nozzle", + "Geeetech Mizar Pro 0.4 nozzle", + "Geeetech Mizar Pro 0.6 nozzle", + "Geeetech Mizar Pro 0.8 nozzle", + "Geeetech Mizar Max 0.2 nozzle", + "Geeetech Mizar Max 0.4 nozzle", + "Geeetech Mizar Max 0.6 nozzle", + "Geeetech Mizar Max 0.8 nozzle", + "Geeetech Mizar M 0.4 nozzle", + "Geeetech Thunder 0.2 nozzle", + "Geeetech Thunder 0.4 nozzle", + "Geeetech Thunder 0.6 nozzle", + "Geeetech Thunder 0.8 nozzle", + "Geeetech M1 0.2 nozzle", + "Geeetech M1 0.4 nozzle", + "Geeetech M1 0.6 nozzle", + "Geeetech M1 0.8 nozzle" ] } \ No newline at end of file diff --git a/resources/profiles/Geeetech/machine/Geeetech M1 0.2 nozzle.json b/resources/profiles/Geeetech/machine/Geeetech M1 0.2 nozzle.json index d3355efe9af..3e5bb81c6e8 100644 --- a/resources/profiles/Geeetech/machine/Geeetech M1 0.2 nozzle.json +++ b/resources/profiles/Geeetech/machine/Geeetech M1 0.2 nozzle.json @@ -15,19 +15,19 @@ "0.2" ], "extruder_type": [ - "Direct" - ], + "Direct Drive" + ], "machine_max_acceleration_e": [ - "2000", - "2000" + "3000", + "3000" ], "machine_max_acceleration_extruding": [ - "2000", - "2000" + "3000", + "3000" ], "machine_max_acceleration_retracting": [ - "2000", - "2000" + "3000", + "3000" ], "machine_max_acceleration_travel": [ "3000", @@ -76,7 +76,7 @@ "machine_max_jerk_z": [ "3", "3" - ], + ], "max_layer_height": [ "0.14" ], @@ -91,7 +91,7 @@ ], "deretraction_speed": [ "40" - ], + ], "printable_area": [ "0x0", "105x0", @@ -102,8 +102,8 @@ "retract_lift_below":[ "95" ], - "machine_start_gcode": ";Geeetech M1 official wiki URL for M1:https://www.geeetech.com/wiki/index.php/Geeetech_M1_3D_printer \nM104 S[first_layer_temperature] ; Set Hotend Temperature\nM140 S[first_layer_bed_temperature] ; set Bed Temperature\nM190 S[first_layer_bed_temperature] ; Wait for Bed Temperature\nM109 S[first_layer_temperature] ; wait for Hotend Temperature\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 ;Off Main Fan\nM300 S2500 P1000 ;Play a short tune\nG1 Z0.28 ;Move Z Axis up little to prevent scratching of Heat Bed\nG92 E0 ;Reset Extruder\nG1 Y3 F2400 ;Move to start position\nG1 X75 E40 F500 ;Draw a filament line\nG92 E0 ;Reset Extruder\n;G1 E-0.2 F3000 ;Retract a little\nG1 Z2.0 F3000 ;Move Z Axis up little to prevent scratching of Heat Bed\nG1 X70 Y3 Z0.27 F3000 ;Quickly wipe away from the filament line\nG92 E0 ;Reset Extruder", - "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+70, printable_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{printable_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors", + "machine_start_gcode": ";Geeetech M1 official wiki URL:https://www.geeetech.com/wiki/index.php/Geeetech_M1_3D_printer \nM104 S[first_layer_temperature] ; Set Hotend Temperature\nM140 S[first_layer_bed_temperature] ; set Bed Temperature\nM190 S[first_layer_bed_temperature] ; Wait for Bed Temperature\nM109 S[first_layer_temperature] ; wait for Hotend Temperature\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 ;Off Main Fan\nM300 S2500 P1000 ;Play a short tune\nG1 Z0.28 ;Move Z Axis up little to prevent scratching of Heat Bed\nG92 E0 ;Reset Extruder\nG1 Y3 F2400 ;Move to start position\nG1 X75 E40 F500 ;Draw a filament line\nG92 E0 ;Reset Extruder\n;G1 E-0.2 F3000 ;Retract a little\nG1 Z2.0 F3000 ;Move Z Axis up little to prevent scratching of Heat Bed\nG1 X70 Y3 Z0.27 F3000 ;Quickly wipe away from the filament line\nG92 E0 ;Reset Extruder", + "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+70, printable_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{printable_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors\nM221 S100;Slicer Flow recovery 100%\nM220 S100 ;Set Feedrate recovery 100%\nM204 P3000.00 R3000.00 T3000.00", "nozzle_type": "brass", "auxiliary_fan": "0" } \ No newline at end of file diff --git a/resources/profiles/Geeetech/machine/Geeetech M1 0.4 nozzle.json b/resources/profiles/Geeetech/machine/Geeetech M1 0.4 nozzle.json index a3925678ba8..04d69908c7e 100644 --- a/resources/profiles/Geeetech/machine/Geeetech M1 0.4 nozzle.json +++ b/resources/profiles/Geeetech/machine/Geeetech M1 0.4 nozzle.json @@ -15,19 +15,19 @@ "0.4" ], "extruder_type": [ - "Direct" - ], + "Direct Drive" + ], "machine_max_acceleration_e": [ - "2000", - "2000" + "3000", + "3000" ], "machine_max_acceleration_extruding": [ - "2000", - "2000" + "3000", + "3000" ], "machine_max_acceleration_retracting": [ - "2000", - "2000" + "3000", + "3000" ], "machine_max_acceleration_travel": [ "3000", @@ -76,7 +76,7 @@ "machine_max_jerk_z": [ "3", "3" - ], + ], "max_layer_height": [ "0.14" ], @@ -91,7 +91,7 @@ ], "deretraction_speed": [ "40" - ], + ], "max_layer_height": [ "0.3" ], @@ -108,8 +108,8 @@ "retract_lift_below":[ "95" ], - "machine_start_gcode": ";Geeetech M1 official wiki URL for M1:https://www.geeetech.com/wiki/index.php/Geeetech_M1_3D_printer \nM104 S[first_layer_temperature] ; Set Hotend Temperature\nM140 S[first_layer_bed_temperature] ; set Bed Temperature\nM190 S[first_layer_bed_temperature] ; Wait for Bed Temperature\nM109 S[first_layer_temperature] ; wait for Hotend Temperature\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 ;Off Main Fan\nM300 S2500 P1000 ;Play a short tune\nG1 Z0.28 ;Move Z Axis up little to prevent scratching of Heat Bed\nG92 E0 ;Reset Extruder\nG1 Y3 F2400 ;Move to start position\nG1 X75 E40 F500 ;Draw a filament line\nG92 E0 ;Reset Extruder\n;G1 E-0.2 F3000 ;Retract a little\nG1 Z2.0 F3000 ;Move Z Axis up little to prevent scratching of Heat Bed\nG1 X70 Y3 Z0.27 F3000 ;Quickly wipe away from the filament line\nG92 E0 ;Reset Extruder", - "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+70, printable_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{printable_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors", + "machine_start_gcode": ";Geeetech M1 official wiki URL:https://www.geeetech.com/wiki/index.php/Geeetech_M1_3D_printer \nM104 S[first_layer_temperature] ; Set Hotend Temperature\nM140 S[first_layer_bed_temperature] ; set Bed Temperature\nM190 S[first_layer_bed_temperature] ; Wait for Bed Temperature\nM109 S[first_layer_temperature] ; wait for Hotend Temperature\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 ;Off Main Fan\nM300 S2500 P1000 ;Play a short tune\nG1 Z0.28 ;Move Z Axis up little to prevent scratching of Heat Bed\nG92 E0 ;Reset Extruder\nG1 Y3 F2400 ;Move to start position\nG1 X75 E40 F500 ;Draw a filament line\nG92 E0 ;Reset Extruder\n;G1 E-0.2 F3000 ;Retract a little\nG1 Z2.0 F3000 ;Move Z Axis up little to prevent scratching of Heat Bed\nG1 X70 Y3 Z0.27 F3000 ;Quickly wipe away from the filament line\nG92 E0 ;Reset Extruder", + "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+70, printable_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{printable_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors\nM221 S100;Slicer Flow recovery 100%\nM220 S100 ;Set Feedrate recovery 100%\nM204 P3000.00 R3000.00 T3000.00", "nozzle_type": "brass", "auxiliary_fan": "0" } \ No newline at end of file diff --git a/resources/profiles/Geeetech/machine/Geeetech M1 0.6 nozzle.json b/resources/profiles/Geeetech/machine/Geeetech M1 0.6 nozzle.json index de834f01ae0..b87332df041 100644 --- a/resources/profiles/Geeetech/machine/Geeetech M1 0.6 nozzle.json +++ b/resources/profiles/Geeetech/machine/Geeetech M1 0.6 nozzle.json @@ -15,19 +15,19 @@ "0.6" ], "extruder_type": [ - "Direct" - ], + "Direct Drive" + ], "machine_max_acceleration_e": [ - "2000", - "2000" + "3000", + "3000" ], "machine_max_acceleration_extruding": [ - "2000", - "2000" + "3000", + "3000" ], "machine_max_acceleration_retracting": [ - "2000", - "2000" + "3000", + "3000" ], "machine_max_acceleration_travel": [ "3000", @@ -76,7 +76,7 @@ "machine_max_jerk_z": [ "3", "3" - ], + ], "max_layer_height": [ "0.14" ], @@ -91,7 +91,7 @@ ], "deretraction_speed": [ "40" - ], + ], "max_layer_height": [ "0.42" ], @@ -108,8 +108,8 @@ "retract_lift_below":[ "95" ], - "machine_start_gcode": ";Geeetech M1 official wiki URL for M1:https://www.geeetech.com/wiki/index.php/Geeetech_M1_3D_printer \nM104 S[first_layer_temperature] ; Set Hotend Temperature\nM140 S[first_layer_bed_temperature] ; set Bed Temperature\nM190 S[first_layer_bed_temperature] ; Wait for Bed Temperature\nM109 S[first_layer_temperature] ; wait for Hotend Temperature\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 ;Off Main Fan\nM300 S2500 P1000 ;Play a short tune\nG1 Z0.28 ;Move Z Axis up little to prevent scratching of Heat Bed\nG92 E0 ;Reset Extruder\nG1 Y3 F2400 ;Move to start position\nG1 X75 E40 F500 ;Draw a filament line\nG92 E0 ;Reset Extruder\n;G1 E-0.2 F3000 ;Retract a little\nG1 Z2.0 F3000 ;Move Z Axis up little to prevent scratching of Heat Bed\nG1 X70 Y3 Z0.27 F3000 ;Quickly wipe away from the filament line\nG92 E0 ;Reset Extruder", - "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+70, printable_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{printable_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors", + "machine_start_gcode": ";Geeetech M1 official wiki URL:https://www.geeetech.com/wiki/index.php/Geeetech_M1_3D_printer \nM104 S[first_layer_temperature] ; Set Hotend Temperature\nM140 S[first_layer_bed_temperature] ; set Bed Temperature\nM190 S[first_layer_bed_temperature] ; Wait for Bed Temperature\nM109 S[first_layer_temperature] ; wait for Hotend Temperature\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 ;Off Main Fan\nM300 S2500 P1000 ;Play a short tune\nG1 Z0.28 ;Move Z Axis up little to prevent scratching of Heat Bed\nG92 E0 ;Reset Extruder\nG1 Y3 F2400 ;Move to start position\nG1 X75 E40 F500 ;Draw a filament line\nG92 E0 ;Reset Extruder\n;G1 E-0.2 F3000 ;Retract a little\nG1 Z2.0 F3000 ;Move Z Axis up little to prevent scratching of Heat Bed\nG1 X70 Y3 Z0.27 F3000 ;Quickly wipe away from the filament line\nG92 E0 ;Reset Extruder", + "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+70, printable_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{printable_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors\nM221 S100;Slicer Flow recovery 100%\nM220 S100 ;Set Feedrate recovery 100%\nM204 P3000.00 R3000.00 T3000.00", "nozzle_type": "brass", "auxiliary_fan": "0" } \ No newline at end of file diff --git a/resources/profiles/Geeetech/machine/Geeetech M1 0.8 nozzle.json b/resources/profiles/Geeetech/machine/Geeetech M1 0.8 nozzle.json index 0505e1055d6..8b4b0c9490d 100644 --- a/resources/profiles/Geeetech/machine/Geeetech M1 0.8 nozzle.json +++ b/resources/profiles/Geeetech/machine/Geeetech M1 0.8 nozzle.json @@ -15,19 +15,19 @@ "0.8" ], "extruder_type": [ - "Direct" - ], + "Direct Drive" + ], "machine_max_acceleration_e": [ - "2000", - "2000" + "3000", + "3000" ], "machine_max_acceleration_extruding": [ - "2000", - "2000" + "3000", + "3000" ], "machine_max_acceleration_retracting": [ - "2000", - "2000" + "3000", + "3000" ], "machine_max_acceleration_travel": [ "3000", @@ -76,7 +76,7 @@ "machine_max_jerk_z": [ "3", "3" - ], + ], "max_layer_height": [ "0.14" ], @@ -91,7 +91,7 @@ ], "deretraction_speed": [ "40" - ], + ], "max_layer_height": [ "0.56" ], @@ -108,8 +108,8 @@ "retract_lift_below":[ "95" ], - "machine_start_gcode": ";Geeetech M1 official wiki URL for M1:https://www.geeetech.com/wiki/index.php/Geeetech_M1_3D_printer \nM104 S[first_layer_temperature] ; Set Hotend Temperature\nM140 S[first_layer_bed_temperature] ; set Bed Temperature\nM190 S[first_layer_bed_temperature] ; Wait for Bed Temperature\nM109 S[first_layer_temperature] ; wait for Hotend Temperature\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 ;Off Main Fan\nM300 S2500 P1000 ;Play a short tune\nG1 Z0.28 ;Move Z Axis up little to prevent scratching of Heat Bed\nG92 E0 ;Reset Extruder\nG1 Y3 F2400 ;Move to start position\nG1 X75 E40 F500 ;Draw a filament line\nG92 E0 ;Reset Extruder\n;G1 E-0.2 F3000 ;Retract a little\nG1 Z2.0 F3000 ;Move Z Axis up little to prevent scratching of Heat Bed\nG1 X70 Y3 Z0.27 F3000 ;Quickly wipe away from the filament line\nG92 E0 ;Reset Extruder", - "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+70, printable_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{printable_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors", + "machine_start_gcode": ";Geeetech M1 official wiki URL:https://www.geeetech.com/wiki/index.php/Geeetech_M1_3D_printer \nM104 S[first_layer_temperature] ; Set Hotend Temperature\nM140 S[first_layer_bed_temperature] ; set Bed Temperature\nM190 S[first_layer_bed_temperature] ; Wait for Bed Temperature\nM109 S[first_layer_temperature] ; wait for Hotend Temperature\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 ;Off Main Fan\nM300 S2500 P1000 ;Play a short tune\nG1 Z0.28 ;Move Z Axis up little to prevent scratching of Heat Bed\nG92 E0 ;Reset Extruder\nG1 Y3 F2400 ;Move to start position\nG1 X75 E40 F500 ;Draw a filament line\nG92 E0 ;Reset Extruder\n;G1 E-0.2 F3000 ;Retract a little\nG1 Z2.0 F3000 ;Move Z Axis up little to prevent scratching of Heat Bed\nG1 X70 Y3 Z0.27 F3000 ;Quickly wipe away from the filament line\nG92 E0 ;Reset Extruder", + "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+70, printable_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{printable_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors\nM221 S100;Slicer Flow recovery 100%\nM220 S100 ;Set Feedrate recovery 100%\nM204 P3000.00 R3000.00 T3000.00", "nozzle_type": "brass", "auxiliary_fan": "0" } \ No newline at end of file diff --git a/resources/profiles/Geeetech/machine/fdm_geeetech_common.json b/resources/profiles/Geeetech/machine/fdm_geeetech_common.json index 840813efb54..7f21963b543 100644 --- a/resources/profiles/Geeetech/machine/fdm_geeetech_common.json +++ b/resources/profiles/Geeetech/machine/fdm_geeetech_common.json @@ -80,7 +80,8 @@ "0.08" ], "printable_height": "250", - "extruder_clearance_radius": "47", + "extruder_clearance_max_radius": "47", + "extruder_clearance_dist_to_rod": "24", "extruder_clearance_height_to_rod": "34", "extruder_clearance_height_to_lid": "34", "printer_settings_id": "", @@ -137,5 +138,4 @@ "support_multi_bed_types": "1", "auxiliary_fan": "0", "z_hop_types": "Normal Lift" - } diff --git a/resources/profiles/Geeetech/machine/fdm_machine_common.json b/resources/profiles/Geeetech/machine/fdm_machine_common.json index 85543a55006..fb4fff3f145 100644 --- a/resources/profiles/Geeetech/machine/fdm_machine_common.json +++ b/resources/profiles/Geeetech/machine/fdm_machine_common.json @@ -70,7 +70,8 @@ "0.08" ], "printable_height": "250", - "extruder_clearance_radius": "65", + "extruder_clearance_max_radius": "65", + "extruder_clearance_dist_to_rod": "33", "extruder_clearance_height_to_rod": "36", "extruder_clearance_height_to_lid": "140", "nozzle_diameter": [ diff --git a/resources/profiles/Geeetech/process/0.08mm Extra Fine @Geeetech M1.json b/resources/profiles/Geeetech/process/0.08mm Extra Fine @Geeetech M1.json index ae615d24408..dec4d5444f2 100644 --- a/resources/profiles/Geeetech/process/0.08mm Extra Fine @Geeetech M1.json +++ b/resources/profiles/Geeetech/process/0.08mm Extra Fine @Geeetech M1.json @@ -5,21 +5,28 @@ "from": "system", "setting_id": "GP_Geeetech_038", "instantiation": "true", - "initial_layer_speed": "30", + "initial_layer_speed": "30", "initial_layer_infill_speed": "50", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "sparse_infill_speed": "120", - "internal_solid_infill_speed":"100", - "top_surface_speed": "50", - "gap_infill_speed": "80", - "travel_speed": "200", + "outer_wall_speed": "80", + "inner_wall_speed": "100", + "sparse_infill_speed": "120", + "internal_solid_infill_speed":"100", + "top_surface_speed": "50", + "gap_infill_speed": "80", + "travel_speed": "200", "default_acceleration": "2000", - "outer_wall_acceleration": "1500", - "inner_wall_acceleration": "3000", + "outer_wall_acceleration": "1500", + "inner_wall_acceleration": "3000", "initial_layer_acceleration": "500", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "2000", "travel_acceleration": "3000", + "default_jerk": "10", + "initial_layer_jerk": "10", + "outer_wall_jerk": "10", + "infill_jerk": "10", + "travel_jerk": "10", + "inner_wall_jerk": "10", + "top_surface_jerk": "10", "compatible_printers": [ "Geeetech M1 0.4 nozzle" ] diff --git a/resources/profiles/Geeetech/process/0.08mm Optimal @Geeetech M1 0.2 nozzle.json b/resources/profiles/Geeetech/process/0.08mm Optimal @Geeetech M1 0.2 nozzle.json index 594fc8012dc..a4c54327672 100644 --- a/resources/profiles/Geeetech/process/0.08mm Optimal @Geeetech M1 0.2 nozzle.json +++ b/resources/profiles/Geeetech/process/0.08mm Optimal @Geeetech M1 0.2 nozzle.json @@ -5,21 +5,28 @@ "from": "system", "setting_id": "GP_Geeetech_039", "instantiation": "true", - "initial_layer_speed": "30", + "initial_layer_speed": "30", "initial_layer_infill_speed": "50", - "outer_wall_speed": "100", - "inner_wall_speed": "150", - "sparse_infill_speed": "120", - "internal_solid_infill_speed":"100", - "top_surface_speed": "50", - "gap_infill_speed": "80", - "travel_speed": "200", + "outer_wall_speed": "100", + "inner_wall_speed": "150", + "sparse_infill_speed": "120", + "internal_solid_infill_speed":"100", + "top_surface_speed": "50", + "gap_infill_speed": "80", + "travel_speed": "200", "default_acceleration": "2000", - "outer_wall_acceleration": "1500", - "inner_wall_acceleration": "3000", + "outer_wall_acceleration": "1500", + "inner_wall_acceleration": "3000", "initial_layer_acceleration": "500", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "2000", "travel_acceleration": "3000", + "default_jerk": "10", + "initial_layer_jerk": "10", + "outer_wall_jerk": "10", + "infill_jerk": "10", + "travel_jerk": "10", + "inner_wall_jerk": "10", + "top_surface_jerk": "10", "compatible_printers": [ "Geeetech M1 0.2 nozzle" ] diff --git a/resources/profiles/Geeetech/process/0.10mm Fine @Geeetech M1.json b/resources/profiles/Geeetech/process/0.10mm Fine @Geeetech M1.json index 1efa2662ebd..a2936435f64 100644 --- a/resources/profiles/Geeetech/process/0.10mm Fine @Geeetech M1.json +++ b/resources/profiles/Geeetech/process/0.10mm Fine @Geeetech M1.json @@ -5,21 +5,28 @@ "from": "system", "setting_id": "GP_Geeetech_040", "instantiation": "true", - "initial_layer_speed": "30", + "initial_layer_speed": "30", "initial_layer_infill_speed": "50", - "outer_wall_speed": "60", - "inner_wall_speed": "100", - "sparse_infill_speed": "120", - "internal_solid_infill_speed":"100", - "top_surface_speed": "50", - "gap_infill_speed": "80", - "travel_speed": "200", + "outer_wall_speed": "60", + "inner_wall_speed": "100", + "sparse_infill_speed": "120", + "internal_solid_infill_speed":"100", + "top_surface_speed": "50", + "gap_infill_speed": "80", + "travel_speed": "200", "default_acceleration": "2000", - "outer_wall_acceleration": "1500", - "inner_wall_acceleration": "3000", + "outer_wall_acceleration": "1500", + "inner_wall_acceleration": "3000", "initial_layer_acceleration": "500", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "2000", "travel_acceleration": "3000", + "default_jerk": "10", + "initial_layer_jerk": "10", + "outer_wall_jerk": "10", + "infill_jerk": "10", + "travel_jerk": "10", + "inner_wall_jerk": "10", + "top_surface_jerk": "10", "compatible_printers": [ "Geeetech M1 0.4 nozzle" ] diff --git a/resources/profiles/Geeetech/process/0.10mm Standard @Geeetech M1 0.2 nozzle.json b/resources/profiles/Geeetech/process/0.10mm Standard @Geeetech M1 0.2 nozzle.json index c4bad282640..1f4f85d03df 100644 --- a/resources/profiles/Geeetech/process/0.10mm Standard @Geeetech M1 0.2 nozzle.json +++ b/resources/profiles/Geeetech/process/0.10mm Standard @Geeetech M1 0.2 nozzle.json @@ -5,21 +5,28 @@ "from": "system", "setting_id": "GP_Geeetech_041", "instantiation": "true", - "initial_layer_speed": "30", + "initial_layer_speed": "30", "initial_layer_infill_speed": "50", - "outer_wall_speed": "100", - "inner_wall_speed": "120", - "sparse_infill_speed": "150", - "internal_solid_infill_speed":"100", - "top_surface_speed": "50", - "gap_infill_speed": "80", - "travel_speed": "200", + "outer_wall_speed": "100", + "inner_wall_speed": "120", + "sparse_infill_speed": "150", + "internal_solid_infill_speed":"100", + "top_surface_speed": "50", + "gap_infill_speed": "80", + "travel_speed": "200", "default_acceleration": "2000", - "outer_wall_acceleration": "1500", - "inner_wall_acceleration": "3000", + "outer_wall_acceleration": "1500", + "inner_wall_acceleration": "3000", "initial_layer_acceleration": "500", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "2000", "travel_acceleration": "3000", + "default_jerk": "10", + "initial_layer_jerk": "10", + "outer_wall_jerk": "10", + "infill_jerk": "10", + "travel_jerk": "10", + "inner_wall_jerk": "10", + "top_surface_jerk": "10", "compatible_printers": [ "Geeetech M1 0.2 nozzle" ] diff --git a/resources/profiles/Geeetech/process/0.12mm Draft @Geeetech M1 0.2 nozzle.json b/resources/profiles/Geeetech/process/0.12mm Draft @Geeetech M1 0.2 nozzle.json index 4b937acd8b4..3429a023bf0 100644 --- a/resources/profiles/Geeetech/process/0.12mm Draft @Geeetech M1 0.2 nozzle.json +++ b/resources/profiles/Geeetech/process/0.12mm Draft @Geeetech M1 0.2 nozzle.json @@ -5,21 +5,28 @@ "from": "system", "setting_id": "GP_Geeetech_042", "instantiation": "true", - "initial_layer_speed": "30", + "initial_layer_speed": "30", "initial_layer_infill_speed": "50", - "outer_wall_speed": "80", - "inner_wall_speed": "120", - "sparse_infill_speed": "150", - "internal_solid_infill_speed":"100", - "top_surface_speed": "50", - "gap_infill_speed": "80", - "travel_speed": "200", + "outer_wall_speed": "80", + "inner_wall_speed": "120", + "sparse_infill_speed": "150", + "internal_solid_infill_speed":"100", + "top_surface_speed": "50", + "gap_infill_speed": "80", + "travel_speed": "200", "default_acceleration": "2000", - "outer_wall_acceleration": "1500", - "inner_wall_acceleration": "3000", + "outer_wall_acceleration": "1500", + "inner_wall_acceleration": "3000", "initial_layer_acceleration": "500", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "2000", "travel_acceleration": "3000", + "default_jerk": "10", + "initial_layer_jerk": "10", + "outer_wall_jerk": "10", + "infill_jerk": "10", + "travel_jerk": "10", + "inner_wall_jerk": "10", + "top_surface_jerk": "10", "compatible_printers": [ "Geeetech M1 0.2 nozzle" ] diff --git a/resources/profiles/Geeetech/process/0.14mm Extra Draft @Geeetech M1 0.2 nozzle.json b/resources/profiles/Geeetech/process/0.14mm Extra Draft @Geeetech M1 0.2 nozzle.json index 780a01e420c..90b467804bd 100644 --- a/resources/profiles/Geeetech/process/0.14mm Extra Draft @Geeetech M1 0.2 nozzle.json +++ b/resources/profiles/Geeetech/process/0.14mm Extra Draft @Geeetech M1 0.2 nozzle.json @@ -5,21 +5,28 @@ "from": "system", "setting_id": "GP_Geeetech_043", "instantiation": "true", - "initial_layer_speed": "30", + "initial_layer_speed": "30", "initial_layer_infill_speed": "50", - "outer_wall_speed": "80", - "inner_wall_speed": "120", - "sparse_infill_speed": "120", - "internal_solid_infill_speed":"100", - "top_surface_speed": "50", - "gap_infill_speed": "80", - "travel_speed": "200", + "outer_wall_speed": "80", + "inner_wall_speed": "120", + "sparse_infill_speed": "120", + "internal_solid_infill_speed":"100", + "top_surface_speed": "50", + "gap_infill_speed": "80", + "travel_speed": "200", "default_acceleration": "2000", - "outer_wall_acceleration": "1500", - "inner_wall_acceleration": "3000", + "outer_wall_acceleration": "1500", + "inner_wall_acceleration": "3000", "initial_layer_acceleration": "500", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "2000", "travel_acceleration": "3000", + "default_jerk": "10", + "initial_layer_jerk": "10", + "outer_wall_jerk": "10", + "infill_jerk": "10", + "travel_jerk": "10", + "inner_wall_jerk": "10", + "top_surface_jerk": "10", "compatible_printers": [ "Geeetech M1 0.2 nozzle" ] diff --git a/resources/profiles/Geeetech/process/0.16mm Optimal @Geeetech M1.json b/resources/profiles/Geeetech/process/0.16mm Optimal @Geeetech M1.json index 492fcd23d97..b8309486028 100644 --- a/resources/profiles/Geeetech/process/0.16mm Optimal @Geeetech M1.json +++ b/resources/profiles/Geeetech/process/0.16mm Optimal @Geeetech M1.json @@ -5,21 +5,28 @@ "from": "system", "setting_id": "GP_Geeetech_044", "instantiation": "true", - "initial_layer_speed": "30", + "initial_layer_speed": "30", "initial_layer_infill_speed": "50", - "outer_wall_speed": "60", - "inner_wall_speed": "100", - "sparse_infill_speed": "120", - "internal_solid_infill_speed":"100", - "top_surface_speed": "50", - "gap_infill_speed": "80", - "travel_speed": "200", + "outer_wall_speed": "60", + "inner_wall_speed": "100", + "sparse_infill_speed": "120", + "internal_solid_infill_speed":"100", + "top_surface_speed": "50", + "gap_infill_speed": "80", + "travel_speed": "200", "default_acceleration": "2000", - "outer_wall_acceleration": "1500", - "inner_wall_acceleration": "3000", + "outer_wall_acceleration": "1500", + "inner_wall_acceleration": "3000", "initial_layer_acceleration": "500", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "2000", "travel_acceleration": "3000", + "default_jerk": "10", + "initial_layer_jerk": "10", + "outer_wall_jerk": "10", + "infill_jerk": "10", + "travel_jerk": "10", + "inner_wall_jerk": "10", + "top_surface_jerk": "10", "compatible_printers": [ "Geeetech M1 0.4 nozzle" ] diff --git a/resources/profiles/Geeetech/process/0.20mm Standard @Geeetech M1.json b/resources/profiles/Geeetech/process/0.20mm Standard @Geeetech M1.json index b89706c6922..c2527b022aa 100644 --- a/resources/profiles/Geeetech/process/0.20mm Standard @Geeetech M1.json +++ b/resources/profiles/Geeetech/process/0.20mm Standard @Geeetech M1.json @@ -12,22 +12,29 @@ "inner_wall_line_width": "0.40", "internal_solid_infill_line_width": "0.40", "support_line_width": "0.38", - "top_surface_line_width": "0.40", - "initial_layer_speed": "30", + "top_surface_line_width": "0.40", + "initial_layer_speed": "30", "initial_layer_infill_speed": "50", - "outer_wall_speed": "50", - "inner_wall_speed": "80", - "sparse_infill_speed": "120", - "internal_solid_infill_speed":"100", - "top_surface_speed": "50", - "gap_infill_speed": "80", - "travel_speed": "200", + "outer_wall_speed": "50", + "inner_wall_speed": "80", + "sparse_infill_speed": "120", + "internal_solid_infill_speed":"100", + "top_surface_speed": "50", + "gap_infill_speed": "80", + "travel_speed": "200", "default_acceleration": "2000", - "outer_wall_acceleration": "1500", - "inner_wall_acceleration": "3000", + "outer_wall_acceleration": "1500", + "inner_wall_acceleration": "3000", "initial_layer_acceleration": "500", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "2000", "travel_acceleration": "3000", + "default_jerk": "10", + "initial_layer_jerk": "10", + "outer_wall_jerk": "10", + "infill_jerk": "10", + "travel_jerk": "10", + "inner_wall_jerk": "10", + "top_surface_jerk": "10", "compatible_printers": [ "Geeetech M1 0.4 nozzle" ] diff --git a/resources/profiles/Geeetech/process/0.24mm Optimal @Geeetech M1 0.6 nozzle.json b/resources/profiles/Geeetech/process/0.24mm Optimal @Geeetech M1 0.6 nozzle.json index 8d76f758324..59e1e6f9db6 100644 --- a/resources/profiles/Geeetech/process/0.24mm Optimal @Geeetech M1 0.6 nozzle.json +++ b/resources/profiles/Geeetech/process/0.24mm Optimal @Geeetech M1 0.6 nozzle.json @@ -5,21 +5,28 @@ "from": "system", "setting_id": "GP_Geeetech_045", "instantiation": "true", - "initial_layer_speed": "30", + "initial_layer_speed": "30", "initial_layer_infill_speed": "50", - "outer_wall_speed": "50", - "inner_wall_speed": "80", - "sparse_infill_speed": "100", - "internal_solid_infill_speed":"100", - "top_surface_speed": "50", - "gap_infill_speed": "80", - "travel_speed": "200", + "outer_wall_speed": "50", + "inner_wall_speed": "80", + "sparse_infill_speed": "100", + "internal_solid_infill_speed":"100", + "top_surface_speed": "50", + "gap_infill_speed": "80", + "travel_speed": "200", "default_acceleration": "2000", - "outer_wall_acceleration": "1500", - "inner_wall_acceleration": "3000", + "outer_wall_acceleration": "1500", + "inner_wall_acceleration": "3000", "initial_layer_acceleration": "500", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "2000", "travel_acceleration": "3000", + "default_jerk": "10", + "initial_layer_jerk": "10", + "outer_wall_jerk": "10", + "infill_jerk": "10", + "travel_jerk": "10", + "inner_wall_jerk": "10", + "top_surface_jerk": "10", "compatible_printers": [ "Geeetech M1 0.6 nozzle" ] diff --git a/resources/profiles/Geeetech/process/0.25mm Draft @Geeetech M1.json b/resources/profiles/Geeetech/process/0.25mm Draft @Geeetech M1.json index 46dd14e7ecf..1abfa86a35f 100644 --- a/resources/profiles/Geeetech/process/0.25mm Draft @Geeetech M1.json +++ b/resources/profiles/Geeetech/process/0.25mm Draft @Geeetech M1.json @@ -12,22 +12,29 @@ "inner_wall_line_width": "0.40", "internal_solid_infill_line_width": "0.40", "support_line_width": "0.38", - "top_surface_line_width": "0.40", - "initial_layer_speed": "30", + "top_surface_line_width": "0.40", + "initial_layer_speed": "30", "initial_layer_infill_speed": "50", - "outer_wall_speed": "50", - "inner_wall_speed": "80", - "sparse_infill_speed": "100", - "internal_solid_infill_speed":"100", - "top_surface_speed": "50", - "gap_infill_speed": "80", - "travel_speed": "200", + "outer_wall_speed": "50", + "inner_wall_speed": "80", + "sparse_infill_speed": "100", + "internal_solid_infill_speed":"100", + "top_surface_speed": "50", + "gap_infill_speed": "80", + "travel_speed": "200", "default_acceleration": "2000", - "outer_wall_acceleration": "1500", - "inner_wall_acceleration": "3000", + "outer_wall_acceleration": "1500", + "inner_wall_acceleration": "3000", "initial_layer_acceleration": "500", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "2000", "travel_acceleration": "3000", + "default_jerk": "10", + "initial_layer_jerk": "10", + "outer_wall_jerk": "10", + "infill_jerk": "10", + "travel_jerk": "10", + "inner_wall_jerk": "10", + "top_surface_jerk": "10", "compatible_printers": [ "Geeetech M1 0.4 nozzle" ] diff --git a/resources/profiles/Geeetech/process/0.30mm Standard @Geeetech M1 0.6 nozzle.json b/resources/profiles/Geeetech/process/0.30mm Standard @Geeetech M1 0.6 nozzle.json index 4ca4de9516a..4c0b0cf9e59 100644 --- a/resources/profiles/Geeetech/process/0.30mm Standard @Geeetech M1 0.6 nozzle.json +++ b/resources/profiles/Geeetech/process/0.30mm Standard @Geeetech M1 0.6 nozzle.json @@ -5,21 +5,28 @@ "from": "system", "setting_id": "GP_Geeetech_048", "instantiation": "true", - "initial_layer_speed": "30", + "initial_layer_speed": "30", "initial_layer_infill_speed": "50", - "outer_wall_speed": "100", - "inner_wall_speed": "150", - "sparse_infill_speed": "120", - "internal_solid_infill_speed":"100", - "top_surface_speed": "50", - "gap_infill_speed": "80", - "travel_speed": "200", + "outer_wall_speed": "100", + "inner_wall_speed": "150", + "sparse_infill_speed": "120", + "internal_solid_infill_speed":"100", + "top_surface_speed": "50", + "gap_infill_speed": "80", + "travel_speed": "200", "default_acceleration": "2000", - "outer_wall_acceleration": "1500", - "inner_wall_acceleration": "3000", + "outer_wall_acceleration": "1500", + "inner_wall_acceleration": "3000", "initial_layer_acceleration": "500", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "2000", "travel_acceleration": "3000", + "default_jerk": "10", + "initial_layer_jerk": "10", + "outer_wall_jerk": "10", + "infill_jerk": "10", + "travel_jerk": "10", + "inner_wall_jerk": "10", + "top_surface_jerk": "10", "compatible_printers": [ "Geeetech M1 0.6 nozzle" ] diff --git a/resources/profiles/Geeetech/process/0.36mm Draft @Geeetech M1 0.6 nozzle.json b/resources/profiles/Geeetech/process/0.36mm Draft @Geeetech M1 0.6 nozzle.json index efe67bed36a..2ec0a1f6eba 100644 --- a/resources/profiles/Geeetech/process/0.36mm Draft @Geeetech M1 0.6 nozzle.json +++ b/resources/profiles/Geeetech/process/0.36mm Draft @Geeetech M1 0.6 nozzle.json @@ -5,21 +5,28 @@ "from": "system", "setting_id": "GP_Geeetech_049", "instantiation": "true", - "initial_layer_speed": "30", + "initial_layer_speed": "30", "initial_layer_infill_speed": "50", - "outer_wall_speed": "100", - "inner_wall_speed": "150", - "sparse_infill_speed": "120", - "internal_solid_infill_speed":"100", - "top_surface_speed": "50", - "gap_infill_speed": "80", - "travel_speed": "200", + "outer_wall_speed": "100", + "inner_wall_speed": "150", + "sparse_infill_speed": "120", + "internal_solid_infill_speed":"100", + "top_surface_speed": "50", + "gap_infill_speed": "80", + "travel_speed": "200", "default_acceleration": "2000", - "outer_wall_acceleration": "1500", - "inner_wall_acceleration": "3000", + "outer_wall_acceleration": "1500", + "inner_wall_acceleration": "3000", "initial_layer_acceleration": "500", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "2000", "travel_acceleration": "3000", + "default_jerk": "10", + "initial_layer_jerk": "10", + "outer_wall_jerk": "10", + "infill_jerk": "10", + "travel_jerk": "10", + "inner_wall_jerk": "10", + "top_surface_jerk": "10", "compatible_printers": [ "Geeetech M1 0.6 nozzle" ] diff --git a/resources/profiles/Geeetech/process/0.36mm Optimal @Geeetech M1 0.8 nozzle.json b/resources/profiles/Geeetech/process/0.36mm Optimal @Geeetech M1 0.8 nozzle.json index fed334ec70a..d56a499e0dc 100644 --- a/resources/profiles/Geeetech/process/0.36mm Optimal @Geeetech M1 0.8 nozzle.json +++ b/resources/profiles/Geeetech/process/0.36mm Optimal @Geeetech M1 0.8 nozzle.json @@ -5,21 +5,28 @@ "from": "system", "setting_id": "GP_Geeetech_050", "instantiation": "true", - "initial_layer_speed": "30", + "initial_layer_speed": "30", "initial_layer_infill_speed": "50", - "outer_wall_speed": "100", - "inner_wall_speed": "150", - "sparse_infill_speed": "120", - "internal_solid_infill_speed":"100", - "top_surface_speed": "50", - "gap_infill_speed": "80", - "travel_speed": "200", + "outer_wall_speed": "100", + "inner_wall_speed": "150", + "sparse_infill_speed": "120", + "internal_solid_infill_speed":"100", + "top_surface_speed": "50", + "gap_infill_speed": "80", + "travel_speed": "200", "default_acceleration": "2000", - "outer_wall_acceleration": "1500", - "inner_wall_acceleration": "3000", + "outer_wall_acceleration": "1500", + "inner_wall_acceleration": "3000", "initial_layer_acceleration": "500", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "2000", "travel_acceleration": "3000", + "default_jerk": "10", + "initial_layer_jerk": "10", + "outer_wall_jerk": "10", + "infill_jerk": "10", + "travel_jerk": "10", + "inner_wall_jerk": "10", + "top_surface_jerk": "10", "compatible_printers": [ "Geeetech M1 0.8 nozzle" ] diff --git a/resources/profiles/Geeetech/process/0.44mm Draft @Geeetech M1 0.8 nozzle.json b/resources/profiles/Geeetech/process/0.44mm Draft @Geeetech M1 0.8 nozzle.json index 9221f9f41f9..90f03d0c2a3 100644 --- a/resources/profiles/Geeetech/process/0.44mm Draft @Geeetech M1 0.8 nozzle.json +++ b/resources/profiles/Geeetech/process/0.44mm Draft @Geeetech M1 0.8 nozzle.json @@ -5,21 +5,28 @@ "from": "system", "setting_id": "GP_Geeetech_051", "instantiation": "true", - "initial_layer_speed": "30", + "initial_layer_speed": "30", "initial_layer_infill_speed": "50", - "outer_wall_speed": "100", - "inner_wall_speed": "150", - "sparse_infill_speed": "120", - "internal_solid_infill_speed":"100", - "top_surface_speed": "50", - "gap_infill_speed": "80", - "travel_speed": "200", + "outer_wall_speed": "100", + "inner_wall_speed": "150", + "sparse_infill_speed": "120", + "internal_solid_infill_speed":"100", + "top_surface_speed": "50", + "gap_infill_speed": "80", + "travel_speed": "200", "default_acceleration": "2000", - "outer_wall_acceleration": "1500", - "inner_wall_acceleration": "3000", + "outer_wall_acceleration": "1500", + "inner_wall_acceleration": "3000", "initial_layer_acceleration": "500", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "2000", "travel_acceleration": "3000", + "default_jerk": "10", + "initial_layer_jerk": "10", + "outer_wall_jerk": "10", + "infill_jerk": "10", + "travel_jerk": "10", + "inner_wall_jerk": "10", + "top_surface_jerk": "10", "compatible_printers": [ "Geeetech M1 0.8 nozzle" ] diff --git a/resources/profiles/Geeetech/process/fdm_process_Geeetech_HS_0.20.json b/resources/profiles/Geeetech/process/fdm_process_Geeetech_HS_0.20.json index eac0c76c8e3..a5d79fd99c8 100644 --- a/resources/profiles/Geeetech/process/fdm_process_Geeetech_HS_0.20.json +++ b/resources/profiles/Geeetech/process/fdm_process_Geeetech_HS_0.20.json @@ -5,7 +5,7 @@ "from": "system", "instantiation": "false", "layer_height": "0.20", - "wall_loops": "2", + "wall_loops": "2", "bottom_shell_layers": "5", "elefant_foot_compensation": "0.15", "top_shell_layers": "5", diff --git a/resources/profiles/Geeetech/process/fdm_process_Geeetech_HS_0.25.json b/resources/profiles/Geeetech/process/fdm_process_Geeetech_HS_0.25.json index 36f90fca544..a576c234afb 100644 --- a/resources/profiles/Geeetech/process/fdm_process_Geeetech_HS_0.25.json +++ b/resources/profiles/Geeetech/process/fdm_process_Geeetech_HS_0.25.json @@ -5,8 +5,8 @@ "from": "system", "instantiation": "false", "layer_height": "0.25", - "wall_loops": "2", - "initial_layer_print_height": "0.3", + "wall_loops": "2", + "initial_layer_print_height": "0.3", "elefant_foot_compensation": "0.15", "top_surface_line_width": "0.45", "top_shell_thickness": "1.0", From a96aad1fda09945eb3e93c3f68ca534d3840a7da Mon Sep 17 00:00:00 2001 From: Bhall338 <23674868+brandonfhall@users.noreply.github.com> Date: Tue, 7 Jan 2025 09:53:14 -0500 Subject: [PATCH 25/33] 7607 k2plus filament change gcode (#7713) * added change g-code * adjusted change_filament_gcode for all k2 profiles * Merge branch 'main' into 7607-k2plus-filament-change-gcode * Merge branch 'main' into 7607-k2plus-filament-change-gcode * Merge branch 'main' into 7607-k2plus-filament-change-gcode * Merge branch 'main' into 7607-k2plus-filament-change-gcode * Merge branch 'main' into 7607-k2plus-filament-change-gcode * Merge branch 'main' into 7607-k2plus-filament-change-gcode * Merge branch 'main' into 7607-k2plus-filament-change-gcode * removed extra space on new line characters. to exeactly match creality print * Merge branch 'main' into 7607-k2plus-filament-change-gcode * Merge branch 'main' into 7607-k2plus-filament-change-gcode * disabled filamanet ramming and cleared Single Extruder Paramaters * Merge branch '7607-k2plus-filament-change-gcode' of https://github.com/brandonfhall/OrcaSlicer into 7607-k2plus-filament-change-gcode * Merge branch 'main' into 7607-k2plus-filament-change-gcode * Merge branch 'main' into 7607-k2plus-filament-change-gcode --- .../Creality/machine/Creality K2 Plus 0.2 nozzle.json | 6 ++++++ .../Creality/machine/Creality K2 Plus 0.4 nozzle.json | 6 ++++++ .../Creality/machine/Creality K2 Plus 0.6 nozzle.json | 6 ++++++ .../Creality/machine/Creality K2 Plus 0.8 nozzle.json | 6 ++++++ 4 files changed, 24 insertions(+) diff --git a/resources/profiles/Creality/machine/Creality K2 Plus 0.2 nozzle.json b/resources/profiles/Creality/machine/Creality K2 Plus 0.2 nozzle.json index b88686c8c2a..dccdf656faf 100644 --- a/resources/profiles/Creality/machine/Creality K2 Plus 0.2 nozzle.json +++ b/resources/profiles/Creality/machine/Creality K2 Plus 0.2 nozzle.json @@ -108,6 +108,11 @@ "deretraction_speed": [ "40" ], + "enable_filament_ramming": "0", + "cooling_tube_length": "0", + "cooling_tube_retraction": "0", + "parking_pos_retraction": "0", + "extra_loading_move": "0", "extruder_clearance_height_to_lid": "118", "extruder_clearance_height_to_rod": "24", "extruder_clearance_radius": "64", @@ -125,6 +130,7 @@ "machine_start_gcode":"M140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nG1 Z3 F600\nM83\nG1 Y150 F12000\nG1 X0 F12000\nG1 Z0.2 F600\nG1 X0 Y150 F6000\nG1 X0 Y0 E15 F1500\nG1 X150 Y0 E15 F1500\nG92 E0\nG1 Z1 F600", "machine_end_gcode": "END_PRINT", "machine_pause_gcode": "PAUSE", + "change_filament_gcode": "G2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\nG1 X0 Y245 F30000\nG1 Z{z_after_toolchange} F600", "scan_first_layer": "0", "thumbnails_format":"PNG", "thumbnails": [ diff --git a/resources/profiles/Creality/machine/Creality K2 Plus 0.4 nozzle.json b/resources/profiles/Creality/machine/Creality K2 Plus 0.4 nozzle.json index 68417eebeb4..0b86c46be82 100644 --- a/resources/profiles/Creality/machine/Creality K2 Plus 0.4 nozzle.json +++ b/resources/profiles/Creality/machine/Creality K2 Plus 0.4 nozzle.json @@ -108,6 +108,11 @@ "deretraction_speed": [ "40" ], + "enable_filament_ramming": "0", + "cooling_tube_length": "0", + "cooling_tube_retraction": "0", + "parking_pos_retraction": "0", + "extra_loading_move": "0", "extruder_clearance_height_to_lid": "118", "extruder_clearance_height_to_rod": "24", "extruder_clearance_radius": "64", @@ -125,6 +130,7 @@ "machine_start_gcode":"M140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nG1 Z3 F600\nM83\nG1 Y150 F12000\nG1 X0 F12000\nG1 Z0.2 F600\nG1 X0 Y150 F6000\nG1 X0 Y0 E15 F1500\nG1 X150 Y0 E15 F1500\nG92 E0\nG1 Z1 F600", "machine_end_gcode": "END_PRINT", "machine_pause_gcode": "PAUSE", + "change_filament_gcode": "G2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\nG1 X0 Y245 F30000\nG1 Z{z_after_toolchange} F600", "scan_first_layer": "0", "thumbnails_format":"PNG", "thumbnails": [ diff --git a/resources/profiles/Creality/machine/Creality K2 Plus 0.6 nozzle.json b/resources/profiles/Creality/machine/Creality K2 Plus 0.6 nozzle.json index 2ad329e24e7..ab0c9db1648 100644 --- a/resources/profiles/Creality/machine/Creality K2 Plus 0.6 nozzle.json +++ b/resources/profiles/Creality/machine/Creality K2 Plus 0.6 nozzle.json @@ -108,6 +108,11 @@ "deretraction_speed": [ "40" ], + "enable_filament_ramming": "0", + "cooling_tube_length": "0", + "cooling_tube_retraction": "0", + "parking_pos_retraction": "0", + "extra_loading_move": "0", "extruder_clearance_height_to_lid": "118", "extruder_clearance_height_to_rod": "24", "extruder_clearance_radius": "64", @@ -125,6 +130,7 @@ "machine_start_gcode":"M140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nG1 Z3 F600\nM83\nG1 Y150 F12000\nG1 X0 F12000\nG1 Z0.2 F600\nG1 X0 Y150 F6000\nG1 X0 Y0 E15 F1500\nG1 X150 Y0 E15 F1500\nG92 E0\nG1 Z1 F600", "machine_end_gcode": "END_PRINT", "machine_pause_gcode": "PAUSE", + "change_filament_gcode": "G2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\nG1 X0 Y245 F30000\nG1 Z{z_after_toolchange} F600", "scan_first_layer": "0", "thumbnails_format": "PNG", "thumbnails": [ diff --git a/resources/profiles/Creality/machine/Creality K2 Plus 0.8 nozzle.json b/resources/profiles/Creality/machine/Creality K2 Plus 0.8 nozzle.json index 2461c907114..72b061807aa 100644 --- a/resources/profiles/Creality/machine/Creality K2 Plus 0.8 nozzle.json +++ b/resources/profiles/Creality/machine/Creality K2 Plus 0.8 nozzle.json @@ -108,6 +108,11 @@ "deretraction_speed": [ "40" ], + "enable_filament_ramming": "0", + "cooling_tube_length": "0", + "cooling_tube_retraction": "0", + "parking_pos_retraction": "0", + "extra_loading_move": "0", "extruder_clearance_height_to_lid": "118", "extruder_clearance_height_to_rod": "24", "extruder_clearance_radius": "64", @@ -125,6 +130,7 @@ "machine_start_gcode":"M140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nG1 Z3 F600\nM83\nG1 Y150 F12000\nG1 X0 F12000\nG1 Z0.2 F600\nG1 X0 Y150 F6000\nG1 X0 Y0 E15 F1500\nG1 X150 Y0 E15 F1500\nG92 E0\nG1 Z1 F600", "machine_end_gcode": "END_PRINT", "machine_pause_gcode": "PAUSE", + "change_filament_gcode": "G2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\nG1 X0 Y245 F30000\nG1 Z{z_after_toolchange} F600", "scan_first_layer": "0", "thumbnails_format":"PNG", "thumbnails": [ From b73d3866b51130ff1cc04232a93e6461181b8dee Mon Sep 17 00:00:00 2001 From: Trent Bartlem Date: Wed, 8 Jan 2025 00:58:29 +1000 Subject: [PATCH 26/33] add dependabot (#7752) * Create dependabot.yml * Update dependabot.yml --- .github/dependabot.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000000..4dc6a16243f --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,18 @@ +version: 2 +updates: + # Only care about major updates to github actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" + ignore: # Only suggest major updates for built-in actions + - dependency-name: "github/*" + update-types: ["version-update:semver-patch", "version-update:semver-minor"] + - dependency-name: "actions/*" + update-types: ["version-update:semver-patch", "version-update:semver-minor"] + # Docker dependencies + - package-ecosystem: "docker" + directory: "/" + schedule: + interval: "monthly" + # no support for c/cpp From 8da0d1bd869a1d111ff1c35ad961f274a660e002 Mon Sep 17 00:00:00 2001 From: pwnept <34002935+pwnept@users.noreply.github.com> Date: Tue, 7 Jan 2025 22:09:24 +0700 Subject: [PATCH 27/33] Fix printer gcode setting bed temp to nozzle temp Raise3D Pro3 (#7756) * Fix start gcode setting bed temp to nozzle temp for Raise3D Pro3 Plus left nozzle Edited Raise3D Pro3 Plus 0.4 nozzle (Left).json Replaced S{nozzle_temperature_initial_layer[0]} with S[bed_temperature_initial_layer_single] for M140 and M190 * Fix start gcode setting bed temp to nozzle temp for Raise3D Pro3 left nozzle Edited Raise3D Pro3 0.4 nozzle (Left).json Replaced S{nozzle_temperature_initial_layer[0]} with S[bed_temperature_initial_layer_single] for M140 and M190 * Update Raise3D Pro3 Plus 0.4 nozzle (Left).json --------- Co-authored-by: SoftFever --- .../Raise3D/machine/Raise3D Pro3 0.4 nozzle (Left).json | 4 ++-- .../Raise3D/machine/Raise3D Pro3 Plus 0.4 nozzle (Left).json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/profiles/Raise3D/machine/Raise3D Pro3 0.4 nozzle (Left).json b/resources/profiles/Raise3D/machine/Raise3D Pro3 0.4 nozzle (Left).json index a2d17658126..b112eea0d58 100644 --- a/resources/profiles/Raise3D/machine/Raise3D Pro3 0.4 nozzle (Left).json +++ b/resources/profiles/Raise3D/machine/Raise3D Pro3 0.4 nozzle (Left).json @@ -143,10 +143,10 @@ "default_filament_profile": [ "Raise3D Generic PLA" ], - "machine_start_gcode": ";Bounding Box: {digits(first_layer_print_min[0],0,2)} {if(first_layer_print_max[0]>300)}{300}{else}{digits(first_layer_print_max[0],0,2)}{endif} {digits(first_layer_print_min[1],0,2)} {if(first_layer_print_max[1]>300)}{300}{else}{digits(first_layer_print_max[1],0,2)}{endif}\n\nM104 T0 S{nozzle_temperature_initial_layer[0] - 20} ; raise left extruder temp\nM140 S{nozzle_temperature_initial_layer[0]} ; raise bed temp\nM190 S{nozzle_temperature_initial_layer[0]} ; wait for bed temp\nM109 T0 S{nozzle_temperature_initial_layer[0] - 20} ; wait for left extruder temp\nM104 T0 S[nozzle_temperature_initial_layer] ; set left extruder temp\nM109 T0 S[nozzle_temperature_initial_layer] ; wait for left extruder temp\nT0\nG21\nG90\nM82\nM107\nM106 P2 S0\nG1 Z0.3 F500\nG92 E0\nG1 Z0.3 F400\nG1 X100 Y{random(2,8)} F1000\nG1 X170 Y{random(2,8)} E15 F200\nG1 Z5 E15 F200\nG92 E0\nG1 Z10 F2000 ; move up from purge line\nG1 Y30 F2000 ; move away from purge line\nG1 X{(first_layer_print_max[0] + first_layer_print_min[0])/2} Y{(first_layer_print_max[1] + first_layer_print_min[1])/2} Z{initial_layer_print_height} ; move to center of print\nM117 Printing...\nM1001", + "machine_start_gcode": ";Bounding Box: {digits(first_layer_print_min[0],0,2)} {if(first_layer_print_max[0]>300)}{300}{else}{digits(first_layer_print_max[0],0,2)}{endif} {digits(first_layer_print_min[1],0,2)} {if(first_layer_print_max[1]>300)}{300}{else}{digits(first_layer_print_max[1],0,2)}{endif}\n\nM104 T0 S{nozzle_temperature_initial_layer[0] - 20} ; raise left extruder temp\nM140 S[bed_temperature_initial_layer_single] ; raise bed temp\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp\nM109 T0 S{nozzle_temperature_initial_layer[0] - 20} ; wait for left extruder temp\nM104 T0 S[nozzle_temperature_initial_layer] ; set left extruder temp\nM109 T0 S[nozzle_temperature_initial_layer] ; wait for left extruder temp\nT0\nG21\nG90\nM82\nM107\nM106 P2 S0\nG1 Z0.3 F500\nG92 E0\nG1 Z0.3 F400\nG1 X100 Y{random(2,8)} F1000\nG1 X170 Y{random(2,8)} E15 F200\nG1 Z5 E15 F200\nG92 E0\nG1 Z10 F2000 ; move up from purge line\nG1 Y30 F2000 ; move away from purge line\nG1 X{(first_layer_print_max[0] + first_layer_print_min[0])/2} Y{(first_layer_print_max[1] + first_layer_print_min[1])/2} Z{initial_layer_print_height} ; move to center of print\nM117 Printing...\nM1001", "machine_end_gcode": "M1002\nM221 T0 S100\nM104 S0\nM140 S0\nM107\nM106 P2 S0\nG91\nG1 E-1 F300\nG1 Z+0.5 E-5 X-20 Y-20 F9000.00\nG28 X0 Y0\nM84\nG90\n", "toolchange_gcode": "; layer [layer_num] tool change", "before_layer_change_gcode": "; before layer [layer_num] change\nG92 E0\n{if layer_z <= initial_layer_print_height + layer_height * 2}\nM109 T0 S{nozzle_temperature_initial_layer[0]}\nM140 S[bed_temperature_initial_layer_single]\n{else}\nM109 T0 S{nozzle_temperature[0]}\nM140 S{bed_temperature[0]}\n{endif}\n{if (filament_type[0] ==\"PLA\" or filament_type[0] ==\"PETG\")}\n{if layer_z >= initial_layer_print_height + layer_height * 2}\nM106 P2 S150\n{elsif layer_z >= initial_layer_print_height + layer_height * 1}\nM106 P2 S100\n{else}\nM106 P2 S0\n{endif}\n{endif}", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", "scan_first_layer": "0" -} \ No newline at end of file +} diff --git a/resources/profiles/Raise3D/machine/Raise3D Pro3 Plus 0.4 nozzle (Left).json b/resources/profiles/Raise3D/machine/Raise3D Pro3 Plus 0.4 nozzle (Left).json index de1b5a6412b..bdc1583d90e 100644 --- a/resources/profiles/Raise3D/machine/Raise3D Pro3 Plus 0.4 nozzle (Left).json +++ b/resources/profiles/Raise3D/machine/Raise3D Pro3 Plus 0.4 nozzle (Left).json @@ -143,10 +143,10 @@ "default_filament_profile": [ "Raise3D Generic PLA" ], - "machine_start_gcode": ";Bounding Box: {digits(first_layer_print_min[0],0,2)} {if(first_layer_print_max[0]>300)}{300}{else}{digits(first_layer_print_max[0],0,2)}{endif} {digits(first_layer_print_min[1],0,2)} {if(first_layer_print_max[1]>300)}{300}{else}{digits(first_layer_print_max[1],0,2)}{endif}\n\nM104 T0 S{nozzle_temperature_initial_layer[0] - 20} ; raise left extruder temp\nM140 S{nozzle_temperature_initial_layer[0]} ; raise bed temp\nM190 S{nozzle_temperature_initial_layer[0]} ; wait for bed temp\nM109 T0 S{nozzle_temperature_initial_layer[0] - 20} ; wait for left extruder temp\nM104 T0 S[nozzle_temperature_initial_layer] ; set left extruder temp\nM109 T0 S[nozzle_temperature_initial_layer] ; wait for left extruder temp\nT0\nG21\nG90\nM82\nM107\nM106 P2 S0\nG1 Z0.3 F500\nG92 E0\nG1 Z0.3 F400\nG1 X100 Y{random(2,8)} F1000\nG1 X170 Y{random(2,8)} E15 F200\nG1 Z5 E15 F200\nG92 E0\nG1 Z10 F2000 ; move up from purge line\nG1 Y30 F2000 ; move away from purge line\nG1 X{(first_layer_print_max[0] + first_layer_print_min[0])/2} Y{(first_layer_print_max[1] + first_layer_print_min[1])/2} Z{initial_layer_print_height} ; move to center of print\nM117 Printing...\nM1001", + "machine_start_gcode": ";Bounding Box: {digits(first_layer_print_min[0],0,2)} {if(first_layer_print_max[0]>300)}{300}{else}{digits(first_layer_print_max[0],0,2)}{endif} {digits(first_layer_print_min[1],0,2)} {if(first_layer_print_max[1]>300)}{300}{else}{digits(first_layer_print_max[1],0,2)}{endif}\n\nM104 T0 S{nozzle_temperature_initial_layer[0] - 20} ; raise left extruder temp\nM140 S[bed_temperature_initial_layer_single] ; raise bed temp\nM190 S{bed_temperature_initial_layer_single} ; wait for bed temp\nM109 T0 S{nozzle_temperature_initial_layer[0] - 20} ; wait for left extruder temp\nM104 T0 S[nozzle_temperature_initial_layer] ; set left extruder temp\nM109 T0 S[nozzle_temperature_initial_layer] ; wait for left extruder temp\nT0\nG21\nG90\nM82\nM107\nM106 P2 S0\nG1 Z0.3 F500\nG92 E0\nG1 Z0.3 F400\nG1 X100 Y{random(2,8)} F1000\nG1 X170 Y{random(2,8)} E15 F200\nG1 Z5 E15 F200\nG92 E0\nG1 Z10 F2000 ; move up from purge line\nG1 Y30 F2000 ; move away from purge line\nG1 X{(first_layer_print_max[0] + first_layer_print_min[0])/2} Y{(first_layer_print_max[1] + first_layer_print_min[1])/2} Z{initial_layer_print_height} ; move to center of print\nM117 Printing...\nM1001", "machine_end_gcode": "M1002\nM221 T0 S100\nM104 S0\nM140 S0\nM107\nM106 P2 S0\nG91\nG1 E-1 F300\nG1 Z+0.5 E-5 X-20 Y-20 F9000.00\nG28 X0 Y0\nM84\nG90\n", "toolchange_gcode": "; layer [layer_num] tool change", "before_layer_change_gcode": "; before layer [layer_num] change\n{if layer_z <= initial_layer_print_height + layer_height * 2}\nM109 T0 S{nozzle_temperature_initial_layer[0]}\nM140 S[bed_temperature_initial_layer_single]\n{else}\nM109 T0 S{nozzle_temperature[0]}\nM140 S{bed_temperature[0]}\n{endif}\n{if (filament_type[0] ==\"PLA\" or filament_type[0] ==\"PETG\")}\n{if layer_z >= initial_layer_print_height + layer_height * 2}\nM106 P2 S150\n{elsif layer_z >= initial_layer_print_height + layer_height * 1}\nM106 P2 S100\n{else}\nM106 P2 S0\n{endif}\n{endif}", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", "scan_first_layer": "0" -} \ No newline at end of file +} From 18547fa6a1316c83c071df534d0b78121b9b9d9b Mon Sep 17 00:00:00 2001 From: Carlos Francisco Caruncho Serrano Date: Tue, 7 Jan 2025 16:09:37 +0100 Subject: [PATCH 28/33] Small Spanish String Fixes (#7845) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update OrcaSlicer_es.po * Merge remote-tracking branch 'upstream/main' into Spanish_Translation * Merge remote-tracking branch 'upstream/main' into Spanish_Translation * some changes * Merge remote-tracking branch 'upstream/main' into Spanish_Translation * Some fixes * More fixes * More fixes and improves * More fixes * Merge remote-tracking branch 'upstream/main' * Merge remote-tracking branch 'upstream/main' * Update OrcaSlicer_es.po * Merge branch 'main' of https://github.com/tadeu2/OrcaSlicer * Merge remote-tracking branch 'upstream/main' into Spanish_Translation * Merge remote-tracking branch 'upstream/main' into spanish_translation * Update OrcaSlicer_es.po * Merge remote-tracking branch 'upstream/main' into spanish_translation * Merge remote-tracking branch 'upstream/main' into spanish_translation * Traducción español Beta 2.1.0 * Update text.js * Update OrcaSlicer_es.po Cambiado punto por coma * Merge remote-tracking branch 'upstream/main' into Spanish_Translation * Merge remote-tracking branch 'upstream/main' * Minor fix PR * Update OrcaSlicer_es.po * Merge remote-tracking branch 'upstream/main' into spanish_translation * Update OrcaSlicer_es.po * Merge remote-tracking branch 'upstream/main' into Spanish_Translation * Update Spanish Language * Updated strings * Update OrcaSlicer_es.po * Update OrcaSlicer_es.po * Fixed Spanish Strings in English Fixed a lot of string whose are translations were english to english. * Some spanish strings improved * Merge remote-tracking branch 'upstream/main' into Spanish_Translation * Update Spanish Strings in RC * Update OrcaSlicer_es.po * Update OrcaSlicer_es.po * Merge remote-tracking branch 'upstream/main' into spanish_translation * Update OrcaSlicer_es.po * Update OrcaSlicer_es.po * Update OrcaSlicer_es.po * Merge remote-tracking branch 'upstream/main' into Spanish_Translation * Update OrcaSlicer_es.po * Merge branch 'Spanish_Translation' * Update OrcaSlicer_es.po * Some fixes * More fixes and improves * Update OrcaSlicer_es.po * Update OrcaSlicer_es.po Cambiado punto por coma --- localization/i18n/es/OrcaSlicer_es.po | 110 +++++++++++++++----------- 1 file changed, 63 insertions(+), 47 deletions(-) diff --git a/localization/i18n/es/OrcaSlicer_es.po b/localization/i18n/es/OrcaSlicer_es.po index 1538f94cd42..faac511fc7e 100644 --- a/localization/i18n/es/OrcaSlicer_es.po +++ b/localization/i18n/es/OrcaSlicer_es.po @@ -5962,7 +5962,7 @@ msgid "Edit current plate name" msgstr "Editar el nombre de la bandeja actual" msgid "Move plate to the front" -msgstr "" +msgstr "Mover bandeja al frente" msgid "Customize current plate" msgstr "Personalizar bandeja actual" @@ -6343,7 +6343,7 @@ msgid "Slicing Plate %d" msgstr "Laminando bandeja %d" msgid "Please resolve the slicing errors and publish again." -msgstr "Por favor, resuelva los errores de corte y publique de nuevo." +msgstr "Por favor, resuelva los errores de laminado y publique de nuevo." msgid "" "Network Plug-in is not detected. Network related features are unavailable." @@ -7957,12 +7957,15 @@ msgstr "" "Bandeja Fría" msgid "Textured Cool plate" -msgstr "" +msgstr "Bandeja Fría Texturizada" msgid "" "Bed temperature when cool plate is installed. Value 0 means the filament " "does not support to print on the Textured Cool Plate" msgstr "" +"Temperatura de la cama cuando la placa fría está instalada. El valor 0 " +"significa que el filamento no se puede imprimir en la placa de refrigeración " +"texturizada" msgid "Engineering plate" msgstr "Bandeja de Ingeniería" @@ -9458,7 +9461,7 @@ msgstr "" msgid "Variable layer height is not supported with Organic supports." msgstr "" -"La altura de capa variable no es compatible con los soportes orgánicos." +"La altura de capa adaptativa no es compatible con los soportes orgánicos." msgid "" "Different nozzle diameters and different filament diameters may not work " @@ -9529,7 +9532,7 @@ msgid "" "layer height" msgstr "" "La torre de purga sólo se admite si todos los objetos tienen la misma altura " -"de capa variable" +"de capa adaptativa" msgid "Too small line width" msgstr "Ancho de línea demasiado pequeño" @@ -9721,8 +9724,8 @@ msgid "" "Slicing height for each layer. Smaller layer height means more accurate and " "more printing time" msgstr "" -"Altura de corte para cada capa. Una altura de capa más pequeña significa más " -"precisión y más tiempo de impresión" +"Altura de laminado para cada capa. Una altura de capa más pequeña significa " +"más precisión y más tiempo de impresión" msgid "Printable height" msgstr "Altura imprimible" @@ -9873,6 +9876,9 @@ msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Textured Cool Plate" msgstr "" +"Temperatura de la cama para las capas excepto la inicial. El valor 0 " +"significa que el filamento no es compatible para imprimir en la placa fría " +"texturizada" msgid "" "Bed temperature for layers except the initial one. Value 0 means the " @@ -9914,6 +9920,8 @@ msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Textured Cool Plate" msgstr "" +"Temperatura de la capa inicial. El valor 0 significa que el filamento no es " +"compatible para imprimir en la placa fría texturizada" msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " @@ -9942,16 +9950,16 @@ msgid "Bed types supported by the printer" msgstr "Tipos de cama que admite la impresora" msgid "Smooth Cool Plate" -msgstr "" +msgstr "Bandeja Fría Lisa" msgid "Engineering Plate" msgstr "Bandeja de Ingeniería" msgid "Smooth High Temp Plate" -msgstr "" +msgstr "Bandeja Lisa de Alta Temperatura" msgid "Textured Cool Plate" -msgstr "" +msgstr "Bandeja Fría Texturizada" msgid "First layer print sequence" msgstr "Secuencia de impresión de primera capa" @@ -10356,6 +10364,11 @@ msgid "" "When Detect overhang wall is not enabled, this option is ignored and " "reversal happens on every even layers regardless." msgstr "" +"Número de mm que debe tener el voladizo para que la inversión se considere " +"útil. Puede ser % of el ancho del perímetro.\n" +"El valor 0 permite la inversión en cada capa par.\n" +"Cuando Detectar voladizo de pared no está activado, esta opción se ignora y " +"la inversión se produce en todas las capas pares." msgid "Classic mode" msgstr "Modo clásico" @@ -13146,12 +13159,15 @@ msgid "Force a retraction when changes layer" msgstr "Forzar una retracción al cambiar de capa" msgid "Retract on top layer" -msgstr "" +msgstr "Retracción en la capa superior" msgid "" "Force a retraction on top layer. Disabling could prevent clog on very slow " "patterns with small movements, like Hilbert curve" msgstr "" +"Forzar una retracción en la capa superior. Desactivarlo podría evitar " +"atascos en patrones muy lentos con movimientos pequeños, como la curva de " +"Hilbert" msgid "Retraction Length" msgstr "Longitud de retracción" @@ -13667,9 +13683,9 @@ msgstr "" "significa que esta característica está desactivada.\n" "\n" "El uso de un valor distinto de cero es útil si la impresora está configurada " -"para imprimir sin una línea principal. El número final de bucles no se tiene " -"en cuenta al organizar o validar la distancia de los objetos. En este caso, " -"aumente el número de bucles." +"para imprimir sin una línea principal. \n" +"El número final de bucles no se tiene en cuenta al organizar o validar la " +"distancia de los objetos. En este caso, aumente el número de bucles." msgid "" "The printing speed in exported gcode will be slowed down, when the estimated " @@ -13713,7 +13729,7 @@ msgid "" msgstr "" "El modo espiral suaviza los movimientos z del contorno exterior. Convierte " "un modelo sólido en una impresión de un solo perímetro con capas inferiores " -"sólidas. El modelo final generado no tiene costuras." +"sólidas. El modelo final generado no tiene costuras" msgid "Smooth Spiral" msgstr "Espiral Suave" @@ -14756,7 +14772,7 @@ msgstr "" "\"label_objects\". Algunos extrusores funcionan mejor con esta opción " "desactivada (modo de extrusión absoluta). La torre de purga sólo es " "compatible con el modo relativo. Se recomienda en la mayoría de las " -"impresoras. Por defecto está activada." +"impresoras. Por defecto está activada" msgid "" "Classic wall generator produces walls with constant extrusion width and for " @@ -14820,7 +14836,7 @@ msgstr "" "forma de cuña con un ángulo mayor que este ajuste no tendrá transiciones y " "no se imprimirán perímetros en el centro para rellenar el espacio restante. " "La reducción de este ajuste reduce el número y la longitud de estos " -"perímetros centrales, pero puede dejar huecos o sobreextruir." +"perímetros centrales, pero puede dejar huecos o sobreextruir" msgid "Wall distribution count" msgstr "Recuento de la distribución del perímetro" @@ -14846,7 +14862,7 @@ msgstr "" "sean más finas que este valor no se imprimirán, mientras que las " "características más gruesas que el Tamaño mínimo de la característica se " "ensancharán hasta el Ancho mínimo de perímetro. Se expresa en porcentaje " -"sobre el diámetro de la boquilla." +"sobre el diámetro de la boquilla" msgid "Minimum wall length" msgstr "Longitud mínima de perímetro" @@ -16142,10 +16158,10 @@ msgstr "" "final > inicio + paso)" msgid "Start retraction length: " -msgstr "Longitud de retracción inicial:" +msgstr "Longitud de retracción inicial: " msgid "End retraction length: " -msgstr "Longitud de retracción final:" +msgstr "Longitud de retracción final: " msgid "mm/mm" msgstr "mm/mm" @@ -17366,7 +17382,7 @@ msgid "" "consistency?" msgstr "" "Perímetro preciso. \n" -"¿Sabía que activar el perímetro precisa puede mejorar la precisión y la " +"¿Sabías que activar el perímetro precisa puede mejorar la precisión y la " "uniformidad de las capas?" #: resources/data/hints.ini: [hint:Sandwich mode] @@ -17387,7 +17403,7 @@ msgid "" "Did you know that OrcaSlicer supports chamber temperature?" msgstr "" "Temperatura de la cámara \n" -"¿Sabía que OrcaSlicer tiene la función de control de temperatura de cámara?" +"¿Sabías que OrcaSlicer tiene la función de control de temperatura de cámara?" #: resources/data/hints.ini: [hint:Calibration] msgid "" @@ -17405,7 +17421,7 @@ msgid "" "Did you know that OrcaSlicer supports Auxiliary part cooling fan?" msgstr "" "Ventilador auxiliar\n" -"¿Sabía que OrcaSlicer admite un ventilador auxiliar de refrigeración de " +"¿Sabías que OrcaSlicer admite un ventilador auxiliar de refrigeración de " "piezas?" #: resources/data/hints.ini: [hint:Air filtration] @@ -17422,7 +17438,7 @@ msgid "" "You can turn on/off the G-code window by pressing the C key." msgstr "" "Ventana de G-Code \n" -"Puede activar/desactivar la ventana de G-Code pulsando la tecla C." +"Puedes activar/desactivar la ventana de G-Code pulsando la tecla C." #: resources/data/hints.ini: [hint:Switch workspaces] msgid "" @@ -17442,7 +17458,7 @@ msgid "" msgstr "" "Cómo utilizar los atajos de teclado \n" "¿Sabías que Orca Slicer ofrece una amplia gama de atajos de teclado y " -"operaciones de escenas 3D." +"operaciones de escenas 3D?." #: resources/data/hints.ini: [hint:Reverse on odd] msgid "" @@ -17451,8 +17467,8 @@ msgid "" "the surface quality of your overhangs?" msgstr "" "Invertir en impar \n" -"Sabía que la función Invertir en impar puede mejorar " -"significativamente la calidad de la superficie de sus voladizos?" +"¿Sabías que la función Invertir en impar puede mejorar " +"significativamente la calidad de la superficie de los voladizos?" #: resources/data/hints.ini: [hint:Cut Tool] msgid "" @@ -17472,7 +17488,7 @@ msgid "" msgstr "" "Arreglar modelo \n" "¿Sabías que puedes arreglar un modelo 3D dañado para evitar muchos problemas " -"de corte en el sistema Windows?" +"de laminado en el sistema Windows?" #: resources/data/hints.ini: [hint:Timelapse] msgid "" @@ -17550,7 +17566,7 @@ msgid "" "settings for each object/part?" msgstr "" "Tabla de parámetros de laminado\n" -"¿Sabía que puede ver todos los objetos/partes de una tabla y cambiar los " +"¿Sabías que puedes ver todos los objetos/partes de una tabla y cambiar los " "parámetros de cada objeto/parte?" #: resources/data/hints.ini: [hint:Split to Objects/Parts] @@ -17584,10 +17600,10 @@ msgid "" "lower resolution STL. Give it a try!" msgstr "" "STEP\n" -"¿Sabías que puedes mejorar la calidad de impresión cortando un archivo STEP " +"¿Sabías que puedes mejorar la calidad de impresión laminando un archivo STEP " "en lugar de un STL?\n" -"Orca Slicer soporta el corte de archivos STEP, proporcionando resultados más " -"suaves que un STL de menor resolución. ¡Pruébalo!" +"Orca Slicer soporta el laminado de archivos STEP, proporcionando resultados " +"más suaves que un STL de menor resolución. ¡Pruébalo!" #: resources/data/hints.ini: [hint:Z seam location] msgid "" @@ -17620,7 +17636,7 @@ msgid "" "individual plates ready to print? This will simplify the process of keeping " "track of all the parts." msgstr "" -"Divide tus impresiones en planchas\n" +"Divide tus impresiones en bandejas\n" "¿Sabías que puedes dividir un modelo con muchas piezas en bandejas " "individuales listas para imprimir? Esto simplificará el proceso de " "seguimiento de todas las piezas." @@ -17632,9 +17648,9 @@ msgid "" "Did you know that you can print a model even faster, by using the Adaptive " "Layer Height option? Check it out!" msgstr "" -"Acelere su impresión con la altura de capa adaptativa\n" +"Acelere su impresión con la Altura Adaptable de Capa\n" "¿Sabías que puedes imprimir un modelo aún más rápido utilizando la opción " -"Altura de capa adaptable? ¡Compruébalo!" +"Altura Adaptable de Capa? ¡Compruébalo!" #: resources/data/hints.ini: [hint:Support painting] msgid "" @@ -17644,9 +17660,9 @@ msgid "" "model that actually need it." msgstr "" "Pintura de soportes\n" -"¿Sabías que puedes pintar la ubicación de los soportes? Esta función " -"facilita la colocación del material de soporte sólo en las secciones del " -"modelo que realmente lo necesitan." +"¿Sabías que puedes pintar los soportes en cualquier ubicación? Esta función " +"facilita la colocación de soportes sólo en las secciones donde realmente sea " +"necesario." #: resources/data/hints.ini: [hint:Different types of supports] msgid "" @@ -17658,7 +17674,7 @@ msgstr "" "Diferentes tipos de soportes\n" "¿Sabías que puedes elegir entre varios tipos de soportes? Los soportes en " "forma de árbol son ideales para modelos orgánicos, ahorran filamento y " -"mejoran la velocidad de impresión. ¡Compruébalos!" +"mejoran la velocidad de impresión. ¡Compruébalo!" #: resources/data/hints.ini: [hint:Printing Silk Filament] msgid "" @@ -17668,7 +17684,7 @@ msgid "" "the best results." msgstr "" "Impresión de filamento de seda\n" -"¿Sabías que el filamento de seda necesita una consideración especial para " +"¿Sabías que el filamento de seda necesita una configuración especial para " "imprimirlo con éxito? Se recomienda siempre una temperatura más alta y una " "velocidad más baja para obtener los mejores resultados." @@ -17678,8 +17694,8 @@ msgid "" "Did you know that when printing models have a small contact interface with " "the printing surface, it's recommended to use a brim?" msgstr "" -"Borde de adherencia para una mejor adherencia\n" -"¿Sabía que cuando los modelos de impresión tienen una pequeña interfaz de " +"Borde de adherencia\n" +"¿Sabías que cuando los modelos de impresión tienen una pequeña interfaz de " "contacto con la superficie de impresión, se recomienda utilizar un borde de " "adherencia?" @@ -17690,7 +17706,7 @@ msgid "" "one time?" msgstr "" "Establecer parámetros para varios objetos\n" -"¿Sabías que puedes establecer parámetros de corte para todos los objetos " +"¿Sabías que puedes establecer parámetros de laminado para todos los objetos " "seleccionados a la vez?" #: resources/data/hints.ini: [hint:Stack objects] @@ -17698,8 +17714,8 @@ msgid "" "Stack objects\n" "Did you know that you can stack objects as a whole one?" msgstr "" -"Apilar objetos\n" -"¿Sabías que puedes apilar objetos como un todo?" +"Agrupar objetos\n" +"¿Sabías que puedes agrupar objetos como un todo?" #: resources/data/hints.ini: [hint:Flush into support/objects/infill] msgid "" @@ -17730,8 +17746,8 @@ msgid "" "higher enclosure temperature. More info about this in the Wiki." msgstr "" "Cuando es necesario imprimir con la puerta de la impresora abierta \n" -"¿Sabía usted que la apertura de la puerta de la impresora puede reducir la " -"probabilidad de obstrucción del extrusor / hotend al imprimir filamento de " +"¿Sabías que la apertura de la puerta de la impresora puede reducir la " +"probabilidad de obstrucción del extrusor / cabezal al imprimir filamento de " "baja temperatura con una temperatura más alta de la cubierta. Más " "información sobre esto en la Wiki." From f7ee8642e948b51020426845761054453d618aca Mon Sep 17 00:00:00 2001 From: kiniad <126398817+kiniad@users.noreply.github.com> Date: Tue, 7 Jan 2025 16:14:24 +0100 Subject: [PATCH 29/33] Complete profile sets for Ratrig V-Core 4 - IDEX (#7855) * Update 0.25mm Quality Speed @RatRig V-Core 4 HYBRID 0.4.json it's HYBRID not HYBIRD * Update 0.25mm Quality Speed @RatRig V-Core 4 HYBRID 0.5.json it's HYBRID not HYBIRD * Update 0.25mm Quality Speed @RatRig V-Core 4 HYBRID 0.6.json it's HYBRID not HYBIRD * Add files via upload Adding process files for the 0.8 nozzle * Add files via upload machine profiles for 0.8 nozzle * Update Ratrig.json Added support for 0.8.nozle * Add files via upload Added filament profile for the more and more popular PCTG * Update Ratrig.json Add filament PCTG * Update Ratrig.json Filament setting for big (>0.4) nozzles * Add files via upload Filament setting for big (>0.4) nozzles * Filament setting for big (>0.4) nozzles Filament setting for big (>0.4) nozzles * Optimized layer and extrusion values Optimized layer and extrusion values * New set of profiles for RatRig V-Core 4 - 400 IDEX New developed set of profiles for RatRig V-Core 4 - 400 IDEX with virtual copy and mirror printers (with appropriate smaller build plates and idex commands) * New set of profiles for RatRig V-Core 4 - 400 IDEX New developed set of profiles for RatRig V-Core 4 - 400 IDEX with virtual copy and mirror printers (with appropriate smaller build plates and idex commands) * New set of profiles for RatRig V-Core 4 - 400 IDEX New developed set of profiles for RatRig V-Core 4 - 400 IDEX with virtual copy and mirror printers (with appropriate smaller build plates and idex commands) * Profiles V-Core4 IDEX 300 + 500 Added profiles for Ratrig V-Core4 IDEX bedsize 300 and 500 * Profiles V-Core4 IDEX 300 + 500 Added profiles for Ratrig V-Core4 IDEX bedsize 300 and 500 * Complete profile sets for V-Core 4 - IDEX Now the profile sets for V-Core 4 IDEX - size 300+400+500, all with copy and mirror mode, are completed. (profiles are tested in real prints for V-Core 4 IDEX 400 including copy and mirror, 300+500 only calculated) * Complete profile sets for V-Core 4 - IDEX Now the profile sets for V-Core 4 IDEX - size 300+400+500, all with copy and mirror mode, are completed. (profiles are tested in real prints for V-Core 4 IDEX 400 including copy and mirror, 300+500 only calculated) * Updated Filament for large nozzles (>=0.6) Added missing TPU for big nozzles --------- Co-authored-by: SoftFever --- resources/profiles/Ratrig.json | 1049 ++++++++++------- ...tRig V-Core 4 IDEX 300 COPY MODE_cover.png | Bin 0 -> 36499 bytes ...ig V-Core 4 IDEX 300 MIRROR MODE_cover.png | Bin 0 -> 36499 bytes .../Ratrig/RatRig V-Core 4 IDEX 300_cover.png | Bin 0 -> 36499 bytes ...tRig V-Core 4 IDEX 400 COPY MODE_cover.png | Bin 0 -> 36499 bytes ...ig V-Core 4 IDEX 400 MIRROR MODE_cover.png | Bin 0 -> 36499 bytes .../Ratrig/RatRig V-Core 4 IDEX 400_cover.png | Bin 0 -> 36499 bytes ...tRig V-Core 4 IDEX 500 COPY MODE_cover.png | Bin 0 -> 36499 bytes ...ig V-Core 4 IDEX 500 MIRROR MODE_cover.png | Bin 0 -> 36499 bytes .../Ratrig/RatRig V-Core 4 IDEX 500_cover.png | Bin 0 -> 36499 bytes .../Ratrig/filament/RatRig BigNozzle ABS.json | 2 +- .../Ratrig/filament/RatRig BigNozzle ASA.json | 2 +- .../filament/RatRig BigNozzle PCTG.json | 2 +- .../filament/RatRig BigNozzle PETG.json | 2 +- .../Ratrig/filament/RatRig BigNozzle PLA.json | 2 +- .../Ratrig/filament/RatRig BigNozzle TPU.json | 33 + .../Ratrig/filament/RatRig Generic PCTG.json | 4 +- .../machine/RatRig V-Cast 0.4 nozzle.json | 38 +- .../machine/RatRig V-Cast 0.6 nozzle.json | 40 +- .../Ratrig/machine/RatRig V-Cast.json | 24 +- .../RatRig V-Core 3 200 0.4 nozzle.json | 38 +- .../Ratrig/machine/RatRig V-Core 3 200.json | 24 +- .../RatRig V-Core 3 300 0.4 nozzle.json | 38 +- .../Ratrig/machine/RatRig V-Core 3 300.json | 24 +- .../RatRig V-Core 3 400 0.4 nozzle.json | 38 +- .../Ratrig/machine/RatRig V-Core 3 400.json | 24 +- .../RatRig V-Core 3 500 0.4 nozzle.json | 38 +- .../Ratrig/machine/RatRig V-Core 3 500.json | 24 +- .../RatRig V-Core 4 300 0.4 nozzle.json | 114 +- .../RatRig V-Core 4 300 0.5 nozzle.json | 114 +- .../RatRig V-Core 4 300 0.6 nozzle.json | 114 +- .../RatRig V-Core 4 300 0.8 nozzle.json | 57 + .../Ratrig/machine/RatRig V-Core 4 300.json | 24 +- .../RatRig V-Core 4 400 0.4 nozzle.json | 114 +- .../RatRig V-Core 4 400 0.5 nozzle.json | 114 +- .../RatRig V-Core 4 400 0.6 nozzle.json | 114 +- .../RatRig V-Core 4 400 0.8 nozzle.json | 57 + .../Ratrig/machine/RatRig V-Core 4 400.json | 24 +- .../RatRig V-Core 4 500 0.4 nozzle.json | 114 +- .../RatRig V-Core 4 500 0.5 nozzle.json | 114 +- .../RatRig V-Core 4 500 0.6 nozzle.json | 114 +- .../RatRig V-Core 4 500 0.8 nozzle.json | 57 + .../Ratrig/machine/RatRig V-Core 4 500.json | 24 +- ...RatRig V-Core 4 HYBRID 300 0.4 nozzle.json | 116 +- ...RatRig V-Core 4 HYBRID 300 0.5 nozzle.json | 116 +- ...RatRig V-Core 4 HYBRID 300 0.6 nozzle.json | 116 +- .../machine/RatRig V-Core 4 HYBRID 300.json | 24 +- ...RatRig V-Core 4 HYBRID 400 0.4 nozzle.json | 116 +- ...RatRig V-Core 4 HYBRID 400 0.5 nozzle.json | 116 +- ...RatRig V-Core 4 HYBRID 400 0.6 nozzle.json | 116 +- .../machine/RatRig V-Core 4 HYBRID 400.json | 24 +- ...RatRig V-Core 4 HYBRID 500 0.4 nozzle.json | 116 +- ...RatRig V-Core 4 HYBRID 500 0.5 nozzle.json | 116 +- ...RatRig V-Core 4 HYBRID 500 0.6 nozzle.json | 116 +- .../machine/RatRig V-Core 4 HYBRID 500.json | 24 +- .../RatRig V-Core 4 IDEX 300 0.4 nozzle.json | 65 + .../RatRig V-Core 4 IDEX 300 0.5 nozzle.json | 65 + .../RatRig V-Core 4 IDEX 300 0.6 nozzle.json | 65 + .../RatRig V-Core 4 IDEX 300 0.8 nozzle.json | 65 + ...-Core 4 IDEX 300 COPY MODE 0.4 nozzle.json | 65 + ...-Core 4 IDEX 300 COPY MODE 0.5 nozzle.json | 65 + ...-Core 4 IDEX 300 COPY MODE 0.6 nozzle.json | 65 + ...-Core 4 IDEX 300 COPY MODE 0.8 nozzle.json | 65 + .../RatRig V-Core 4 IDEX 300 COPY MODE.json | 12 + ...ore 4 IDEX 300 MIRROR MODE 0.4 nozzle.json | 65 + ...ore 4 IDEX 300 MIRROR MODE 0.5 nozzle.json | 65 + ...ore 4 IDEX 300 MIRROR MODE 0.6 nozzle.json | 65 + ...ore 4 IDEX 300 MIRROR MODE 0.8 nozzle.json | 65 + .../RatRig V-Core 4 IDEX 300 MIRROR MODE.json | 12 + .../machine/RatRig V-Core 4 IDEX 300.json | 12 + .../RatRig V-Core 4 IDEX 400 0.4 nozzle.json | 65 + .../RatRig V-Core 4 IDEX 400 0.5 nozzle.json | 65 + .../RatRig V-Core 4 IDEX 400 0.6 nozzle.json | 65 + .../RatRig V-Core 4 IDEX 400 0.8 nozzle.json | 65 + ...-Core 4 IDEX 400 COPY MODE 0.4 nozzle.json | 65 + ...-Core 4 IDEX 400 COPY MODE 0.5 nozzle.json | 65 + ...-Core 4 IDEX 400 COPY MODE 0.6 nozzle.json | 65 + ...-Core 4 IDEX 400 COPY MODE 0.8 nozzle.json | 65 + .../RatRig V-Core 4 IDEX 400 COPY MODE.json | 12 + ...ore 4 IDEX 400 MIRROR MODE 0.4 nozzle.json | 65 + ...ore 4 IDEX 400 MIRROR MODE 0.5 nozzle.json | 65 + ...ore 4 IDEX 400 MIRROR MODE 0.6 nozzle.json | 65 + ...ore 4 IDEX 400 MIRROR MODE 0.8 nozzle.json | 65 + .../RatRig V-Core 4 IDEX 400 MIRROR MODE.json | 12 + .../machine/RatRig V-Core 4 IDEX 400.json | 12 + .../RatRig V-Core 4 IDEX 500 0.4 nozzle.json | 65 + .../RatRig V-Core 4 IDEX 500 0.5 nozzle.json | 65 + .../RatRig V-Core 4 IDEX 500 0.6 nozzle.json | 65 + .../RatRig V-Core 4 IDEX 500 0.8 nozzle.json | 65 + ...-Core 4 IDEX 500 COPY MODE 0.4 nozzle.json | 65 + ...-Core 4 IDEX 500 COPY MODE 0.5 nozzle.json | 65 + ...-Core 4 IDEX 500 COPY MODE 0.6 nozzle.json | 65 + ...-Core 4 IDEX 500 COPY MODE 0.8 nozzle.json | 65 + .../RatRig V-Core 4 IDEX 500 COPY MODE.json | 12 + ...ore 4 IDEX 500 MIRROR MODE 0.4 nozzle.json | 65 + ...ore 4 IDEX 500 MIRROR MODE 0.5 nozzle.json | 65 + ...ore 4 IDEX 500 MIRROR MODE 0.6 nozzle.json | 65 + ...ore 4 IDEX 500 MIRROR MODE 0.8 nozzle.json | 65 + .../RatRig V-Core 4 IDEX 500 MIRROR MODE.json | 12 + .../machine/RatRig V-Core 4 IDEX 500.json | 12 + .../machine/RatRig V-Minion 0.4 nozzle.json | 38 +- .../Ratrig/machine/RatRig V-Minion.json | 24 +- .../Ratrig/machine/fdm_klipper_common.json | 121 +- .../Ratrig/machine/fdm_machine_common.json | 234 ++-- .../process/0.08mm Extra Fine @RatRig.json | 40 +- .../Ratrig/process/0.12mm Fine @RatRig.json | 40 +- .../process/0.15mm Optimal @RatRig.json | 40 +- .../0.20mm Bambu Support W @RatRig.json | 58 +- .../0.20mm Quality @RatRig V-Core 4 0.4.json | 124 +- .../0.20mm Quality @RatRig V-Core 4 0.5.json | 124 +- ...m Quality @RatRig V-Core 4 HYBRID 0.4.json | 124 +- ...m Quality @RatRig V-Core 4 HYBRID 0.5.json | 124 +- ...m Quality @RatRig V-Core 4 HYBRID 0.6.json | 62 + ...0mm Quality @RatRig V-Core 4 IDEX 0.4.json | 48 + ...0mm Quality @RatRig V-Core 4 IDEX 0.5.json | 68 ++ ...0mm Quality @RatRig V-Core 4 IDEX 0.6.json | 47 + .../process/0.20mm Standard @RatRig.json | 40 +- .../Ratrig/process/0.24mm Draft @RatRig.json | 42 +- ...mm Quality Speed @RatRig V-Core 4 0.4.json | 124 +- ...mm Quality Speed @RatRig V-Core 4 0.5.json | 124 +- ...mm Quality Speed @RatRig V-Core 4 0.6.json | 124 +- ...ity Speed @RatRig V-Core 4 HYBRID 0.4.json | 124 +- ...ality Speed @RatRig V-Core 4 IDEX 0.4.json | 48 + ...ality Speed @RatRig V-Core 4 IDEX 0.5.json | 68 ++ ...ality Speed @RatRig V-Core 4 IDEX 0.6.json | 68 ++ .../0.25mm Speed @RatRig V-Core 4 0.4.json | 120 +- .../0.25mm Speed @RatRig V-Core 4 0.5.json | 120 +- ...5mm Speed @RatRig V-Core 4 HYBRID 0.4.json | 120 +- ....25mm Speed @RatRig V-Core 4 IDEX 0.4.json | 67 ++ ....25mm Speed @RatRig V-Core 4 IDEX 0.5.json | 66 ++ ....25mm Speed @RatRig V-Core 4 IDEX 0.6.json | 66 ++ ....25mm Speed @RatRig V-Core 4 IDEX 0.8.json | 66 ++ .../process/0.28mm Extra Draft @RatRig.json | 42 +- .../0.30mm Big @RatRig V-Core 4 0.6.json | 134 +-- ....30mm Big @RatRig V-Core 4 HYBRID 0.6.json | 134 +-- .../0.30mm Big @RatRig V-Core 4 IDEX 0.6.json | 73 ++ .../0.30mm Big @RatRig V-Core 4 IDEX 0.8.json | 73 ++ ...m Extra Big @RatRig V-Core 4 IDEX 0.8.json | 73 ++ .../Ratrig/process/fdm_process_common.json | 140 +-- .../process/fdm_process_ratrig_common.json | 230 ++-- .../fdm_process_ratrig_common_idex.json | 122 ++ .../process/fdm_process_ratrig_idex.json | 122 ++ .../Ratrig/ratrig-vcore-bed-400-copy-mode.stl | Bin 0 -> 299584 bytes .../ratrig-vcore-bed-400-mirror-mode.stl | Bin 0 -> 202284 bytes 144 files changed, 7093 insertions(+), 3032 deletions(-) create mode 100644 resources/profiles/Ratrig/RatRig V-Core 4 IDEX 300 COPY MODE_cover.png create mode 100644 resources/profiles/Ratrig/RatRig V-Core 4 IDEX 300 MIRROR MODE_cover.png create mode 100644 resources/profiles/Ratrig/RatRig V-Core 4 IDEX 300_cover.png create mode 100644 resources/profiles/Ratrig/RatRig V-Core 4 IDEX 400 COPY MODE_cover.png create mode 100644 resources/profiles/Ratrig/RatRig V-Core 4 IDEX 400 MIRROR MODE_cover.png create mode 100644 resources/profiles/Ratrig/RatRig V-Core 4 IDEX 400_cover.png create mode 100644 resources/profiles/Ratrig/RatRig V-Core 4 IDEX 500 COPY MODE_cover.png create mode 100644 resources/profiles/Ratrig/RatRig V-Core 4 IDEX 500 MIRROR MODE_cover.png create mode 100644 resources/profiles/Ratrig/RatRig V-Core 4 IDEX 500_cover.png create mode 100644 resources/profiles/Ratrig/filament/RatRig BigNozzle TPU.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 300 0.8 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 400 0.8 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 500 0.8 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 300 0.4 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 300 0.5 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 300 0.6 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 300 0.8 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 300 COPY MODE 0.4 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 300 COPY MODE 0.5 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 300 COPY MODE 0.6 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 300 COPY MODE 0.8 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 300 COPY MODE.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 300 MIRROR MODE 0.4 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 300 MIRROR MODE 0.5 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 300 MIRROR MODE 0.6 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 300 MIRROR MODE 0.8 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 300 MIRROR MODE.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 300.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 400 0.4 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 400 0.5 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 400 0.6 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 400 0.8 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 400 COPY MODE 0.4 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 400 COPY MODE 0.5 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 400 COPY MODE 0.6 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 400 COPY MODE 0.8 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 400 COPY MODE.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 400 MIRROR MODE 0.4 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 400 MIRROR MODE 0.5 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 400 MIRROR MODE 0.6 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 400 MIRROR MODE 0.8 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 400 MIRROR MODE.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 400.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 500 0.4 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 500 0.5 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 500 0.6 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 500 0.8 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 500 COPY MODE 0.4 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 500 COPY MODE 0.5 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 500 COPY MODE 0.6 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 500 COPY MODE 0.8 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 500 COPY MODE.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 500 MIRROR MODE 0.4 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 500 MIRROR MODE 0.5 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 500 MIRROR MODE 0.6 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 500 MIRROR MODE 0.8 nozzle.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 500 MIRROR MODE.json create mode 100644 resources/profiles/Ratrig/machine/RatRig V-Core 4 IDEX 500.json create mode 100644 resources/profiles/Ratrig/process/0.20mm Quality @RatRig V-Core 4 HYBRID 0.6.json create mode 100644 resources/profiles/Ratrig/process/0.20mm Quality @RatRig V-Core 4 IDEX 0.4.json create mode 100644 resources/profiles/Ratrig/process/0.20mm Quality @RatRig V-Core 4 IDEX 0.5.json create mode 100644 resources/profiles/Ratrig/process/0.20mm Quality @RatRig V-Core 4 IDEX 0.6.json create mode 100644 resources/profiles/Ratrig/process/0.25mm Quality Speed @RatRig V-Core 4 IDEX 0.4.json create mode 100644 resources/profiles/Ratrig/process/0.25mm Quality Speed @RatRig V-Core 4 IDEX 0.5.json create mode 100644 resources/profiles/Ratrig/process/0.25mm Quality Speed @RatRig V-Core 4 IDEX 0.6.json create mode 100644 resources/profiles/Ratrig/process/0.25mm Speed @RatRig V-Core 4 IDEX 0.4.json create mode 100644 resources/profiles/Ratrig/process/0.25mm Speed @RatRig V-Core 4 IDEX 0.5.json create mode 100644 resources/profiles/Ratrig/process/0.25mm Speed @RatRig V-Core 4 IDEX 0.6.json create mode 100644 resources/profiles/Ratrig/process/0.25mm Speed @RatRig V-Core 4 IDEX 0.8.json create mode 100644 resources/profiles/Ratrig/process/0.30mm Big @RatRig V-Core 4 IDEX 0.6.json create mode 100644 resources/profiles/Ratrig/process/0.30mm Big @RatRig V-Core 4 IDEX 0.8.json create mode 100644 resources/profiles/Ratrig/process/0.35mm Extra Big @RatRig V-Core 4 IDEX 0.8.json create mode 100644 resources/profiles/Ratrig/process/fdm_process_ratrig_common_idex.json create mode 100644 resources/profiles/Ratrig/process/fdm_process_ratrig_idex.json create mode 100644 resources/profiles/Ratrig/ratrig-vcore-bed-400-copy-mode.stl create mode 100644 resources/profiles/Ratrig/ratrig-vcore-bed-400-mirror-mode.stl diff --git a/resources/profiles/Ratrig.json b/resources/profiles/Ratrig.json index e983dbebe3b..526c138845e 100644 --- a/resources/profiles/Ratrig.json +++ b/resources/profiles/Ratrig.json @@ -1,398 +1,651 @@ -{ - "name": "RatRig", - "version": "02.02.00.04", - "force_update": "0", - "description": "RatRig configurations", - "machine_model_list": [ - { - "name": "RatRig V-Core 3 200", - "sub_path": "machine/RatRig V-Core 3 200.json" - }, - { - "name": "RatRig V-Core 3 300", - "sub_path": "machine/RatRig V-Core 3 300.json" - }, - { - "name": "RatRig V-Core 3 400", - "sub_path": "machine/RatRig V-Core 3 400.json" - }, - { - "name": "RatRig V-Core 3 500", - "sub_path": "machine/RatRig V-Core 3 500.json" - }, - { - "name": "RatRig V-Minion", - "sub_path": "machine/RatRig V-Minion.json" - }, - { - "name": "RatRig V-Cast", - "sub_path": "machine/RatRig V-Cast.json" - }, - { - "name": "RatRig V-Core 4 300", - "sub_path": "machine/RatRig V-Core 4 300.json" - }, - { - "name": "RatRig V-Core 4 400", - "sub_path": "machine/RatRig V-Core 4 400.json" - }, - { - "name": "RatRig V-Core 4 500", - "sub_path": "machine/RatRig V-Core 4 500.json" - }, - { - "name": "RatRig V-Core 4 HYBRID 300", - "sub_path": "machine/RatRig V-Core 4 HYBRID 300.json" - }, - { - "name": "RatRig V-Core 4 HYBRID 400", - "sub_path": "machine/RatRig V-Core 4 HYBRID 400.json" - }, - { - "name": "RatRig V-Core 4 HYBRID 500", - "sub_path": "machine/RatRig V-Core 4 HYBRID 500.json" - } - ], - "process_list": [ - { - "name": "fdm_process_common", - "sub_path": "process/fdm_process_common.json" - }, - { - "name": "fdm_process_RatRig_common", - "sub_path": "process/fdm_process_ratrig_common.json" - }, - { - "name": "0.08mm Extra Fine @RatRig", - "sub_path": "process/0.08mm Extra Fine @RatRig.json" - }, - { - "name": "0.12mm Fine @RatRig", - "sub_path": "process/0.12mm Fine @RatRig.json" - }, - { - "name": "0.15mm Optimal @RatRig", - "sub_path": "process/0.15mm Optimal @RatRig.json" - }, - { - "name": "0.20mm Standard @RatRig", - "sub_path": "process/0.20mm Standard @RatRig.json" - }, - { - "name": "0.24mm Draft @RatRig", - "sub_path": "process/0.24mm Draft @RatRig.json" - }, - { - "name": "0.28mm Extra Draft @RatRig", - "sub_path": "process/0.28mm Extra Draft @RatRig.json" - }, - { - "name": "0.30mm Big @RatRig V-Core 4 0.6", - "sub_path": "process/0.30mm Big @RatRig V-Core 4 0.6.json" - }, - { - "name": "0.25mm Speed @RatRig V-Core 4 0.4", - "sub_path": "process/0.25mm Speed @RatRig V-Core 4 0.4.json" - }, - { - "name": "0.25mm Speed @RatRig V-Core 4 0.5", - "sub_path": "process/0.25mm Speed @RatRig V-Core 4 0.5.json" - }, - { - "name": "0.25mm Speed @RatRig V-Core 4 0.6", - "sub_path": "process/0.25mm Speed @RatRig V-Core 4 0.6.json" - }, - { - "name": "0.25mm Quality Speed @RatRig V-Core 4 0.4", - "sub_path": "process/0.25mm Quality Speed @RatRig V-Core 4 0.4.json" - }, - { - "name": "0.25mm Quality Speed @RatRig V-Core 4 0.5", - "sub_path": "process/0.25mm Quality Speed @RatRig V-Core 4 0.5.json" - }, - { - "name": "0.35mm Extra Big @RatRig V-Core 4 HYBRID 0.8", - "sub_path": "process/0.35mm Extra Big @RatRig V-Core 4 HYBRID 0.8.json" - }, - { - "name": "0.30mm Big @RatRig V-Core 4 HYBRID 0.8", - "sub_path": "process/0.30mm Big @RatRig V-Core 4 HYBRID 0.8.json" - }, - { - "name": "0.25mm Speed @RatRig V-Core 4 HYBRID 0.8", - "sub_path": "process/0.25mm Speed @RatRig V-Core 4 HYBRID 0.8.json" - }, - { - "name": "0.25mm Quality Speed @RatRig V-Core 4 0.6", - "sub_path": "process/0.25mm Quality Speed @RatRig V-Core 4 0.6.json" - }, - { - "name": "0.20mm Quality @RatRig V-Core 4 0.4", - "sub_path": "process/0.20mm Quality @RatRig V-Core 4 0.4.json" - }, - { - "name": "0.20mm Quality @RatRig V-Core 4 0.5", - "sub_path": "process/0.20mm Quality @RatRig V-Core 4 0.5.json" - }, - { - "name": "0.30mm Big @RatRig V-Core 4 HYBRID 0.6", - "sub_path": "process/0.30mm Big @RatRig V-Core 4 HYBRID 0.6.json" - }, - { - "name": "0.25mm Speed @RatRig V-Core 4 HYBRID 0.4", - "sub_path": "process/0.25mm Speed @RatRig V-Core 4 HYBRID 0.4.json" - }, - { - "name": "0.25mm Speed @RatRig V-Core 4 HYBRID 0.5", - "sub_path": "process/0.25mm Speed @RatRig V-Core 4 HYBRID 0.5.json" - }, - { - "name": "0.25mm Speed @RatRig V-Core 4 HYBRID 0.6", - "sub_path": "process/0.25mm Speed @RatRig V-Core 4 HYBRID 0.6.json" - }, - { - "name": "0.25mm Quality Speed @RatRig V-Core 4 HYBRID 0.4", - "sub_path": "process/0.25mm Quality Speed @RatRig V-Core 4 HYBRID 0.4.json" - }, - { - "name": "0.25mm Quality Speed @RatRig V-Core 4 HYBRID 0.5", - "sub_path": "process/0.25mm Quality Speed @RatRig V-Core 4 HYBRID 0.5.json" - }, - { - "name": "0.25mm Quality Speed @RatRig V-Core 4 HYBRID 0.6", - "sub_path": "process/0.25mm Quality Speed @RatRig V-Core 4 HYBRID 0.6.json" - }, - { - "name": "0.20mm Quality @RatRig V-Core 4 HYBRID 0.4", - "sub_path": "process/0.20mm Quality @RatRig V-Core 4 HYBRID 0.4.json" - }, - { - "name": "0.20mm Quality @RatRig V-Core 4 HYBRID 0.5", - "sub_path": "process/0.20mm Quality @RatRig V-Core 4 HYBRID 0.5.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_tpu", - "sub_path": "filament/fdm_filament_tpu.json" - }, - { - "name": "fdm_filament_pet", - "sub_path": "filament/fdm_filament_pet.json" - }, - { - "name": "fdm_filament_abs", - "sub_path": "filament/fdm_filament_abs.json" - }, - { - "name": "fdm_filament_pc", - "sub_path": "filament/fdm_filament_pc.json" - }, - { - "name": "fdm_filament_asa", - "sub_path": "filament/fdm_filament_asa.json" - }, - { - "name": "fdm_filament_pva", - "sub_path": "filament/fdm_filament_pva.json" - }, - { - "name": "fdm_filament_pa", - "sub_path": "filament/fdm_filament_pa.json" - }, - { - "name": "RatRig Generic PLA", - "sub_path": "filament/RatRig Generic PLA.json" - }, - { - "name": "RatRig Generic PLA-CF", - "sub_path": "filament/RatRig Generic PLA-CF.json" - }, - { - "name": "RatRig Generic PCTG", - "sub_path": "filament/RatRig Generic PCTG.json" - }, - { - "name": "RatRig Generic PETG", - "sub_path": "filament/RatRig Generic PETG.json" - }, - { - "name": "RatRig Generic ABS", - "sub_path": "filament/RatRig Generic ABS.json" - }, - { - "name": "RatRig Generic TPU", - "sub_path": "filament/RatRig Generic TPU.json" - }, - { - "name": "RatRig Generic ASA", - "sub_path": "filament/RatRig Generic ASA.json" - }, - { - "name": "RatRig Generic PC", - "sub_path": "filament/RatRig Generic PC.json" - }, - { - "name": "RatRig Generic PVA", - "sub_path": "filament/RatRig Generic PVA.json" - }, - { - "name": "RatRig Generic PA", - "sub_path": "filament/RatRig Generic PA.json" - }, - { - "name": "RatRig Generic PA-CF", - "sub_path": "filament/RatRig Generic PA-CF.json" - }, - { - "name": "RatRig PunkFil ABS", - "sub_path": "filament/RatRig PunkFil ABS.json" - }, - { - "name": "RatRig PunkFil PETG CF", - "sub_path": "filament/RatRig PunkFil PETG CF.json" - }, - { - "name": "RatRig PunkFil PETG", - "sub_path": "filament/RatRig PunkFil PETG.json" - }, - { - "name": "RatRig BigNozzle ABS", - "sub_path": "filament/RatRig BigNozzle ABS.json" - }, - { - "name": "RatRig BigNozzle ASA", - "sub_path": "filament/RatRig BigNozzle ASA.json" - }, - { - "name": "RatRig BigNozzle PLA", - "sub_path": "filament/RatRig BigNozzle PLA.json" - }, - { - "name": "RatRig BigNozzle PETG", - "sub_path": "filament/RatRig BigNozzle PETG.json" - }, - { - "name": "RatRig BigNozzle PCTG", - "sub_path": "filament/RatRig BigNozzle PCTG.json" - } - ], - "machine_list": [ - { - "name": "fdm_machine_common", - "sub_path": "machine/fdm_machine_common.json" - }, - { - "name": "fdm_klipper_common", - "sub_path": "machine/fdm_klipper_common.json" - }, - { - "name": "RatRig V-Core 3 200 0.4 nozzle", - "sub_path": "machine/RatRig V-Core 3 200 0.4 nozzle.json" - }, - { - "name": "RatRig V-Core 3 300 0.4 nozzle", - "sub_path": "machine/RatRig V-Core 3 300 0.4 nozzle.json" - }, - { - "name": "RatRig V-Core 3 400 0.4 nozzle", - "sub_path": "machine/RatRig V-Core 3 400 0.4 nozzle.json" - }, - { - "name": "RatRig V-Core 3 500 0.4 nozzle", - "sub_path": "machine/RatRig V-Core 3 500 0.4 nozzle.json" - }, - { - "name": "RatRig V-Minion 0.4 nozzle", - "sub_path": "machine/RatRig V-Minion 0.4 nozzle.json" - }, - { - "name": "RatRig V-Cast 0.4 nozzle", - "sub_path": "machine/RatRig V-Cast 0.4 nozzle.json" - }, - { - "name": "RatRig V-Cast 0.6 nozzle", - "sub_path": "machine/RatRig V-Cast 0.6 nozzle.json" - }, - { - "name": "RatRig V-Core 4 300 0.4 nozzle", - "sub_path": "machine/RatRig V-Core 4 300 0.4 nozzle.json" - }, - { - "name": "RatRig V-Core 4 300 0.5 nozzle", - "sub_path": "machine/RatRig V-Core 4 300 0.5 nozzle.json" - }, - { - "name": "RatRig V-Core 4 300 0.6 nozzle", - "sub_path": "machine/RatRig V-Core 4 300 0.6 nozzle.json" - }, - { - "name": "RatRig V-Core 4 400 0.4 nozzle", - "sub_path": "machine/RatRig V-Core 4 400 0.4 nozzle.json" - }, - { - "name": "RatRig V-Core 4 400 0.5 nozzle", - "sub_path": "machine/RatRig V-Core 4 400 0.5 nozzle.json" - }, - { - "name": "RatRig V-Core 4 400 0.6 nozzle", - "sub_path": "machine/RatRig V-Core 4 400 0.6 nozzle.json" - }, - { - "name": "RatRig V-Core 4 500 0.4 nozzle", - "sub_path": "machine/RatRig V-Core 4 500 0.4 nozzle.json" - }, - { - "name": "RatRig V-Core 4 500 0.5 nozzle", - "sub_path": "machine/RatRig V-Core 4 500 0.5 nozzle.json" - }, - { - "name": "RatRig V-Core 4 500 0.6 nozzle", - "sub_path": "machine/RatRig V-Core 4 500 0.6 nozzle.json" - }, - { - "name": "RatRig V-Core 4 HYBRID 300 0.4 nozzle", - "sub_path": "machine/RatRig V-Core 4 HYBRID 300 0.4 nozzle.json" - }, - { - "name": "RatRig V-Core 4 HYBRID 300 0.5 nozzle", - "sub_path": "machine/RatRig V-Core 4 HYBRID 300 0.5 nozzle.json" - }, - { - "name": "RatRig V-Core 4 HYBRID 300 0.6 nozzle", - "sub_path": "machine/RatRig V-Core 4 HYBRID 300 0.6 nozzle.json" - }, - { - "name": "RatRig V-Core 4 HYBRID 400 0.4 nozzle", - "sub_path": "machine/RatRig V-Core 4 HYBRID 400 0.4 nozzle.json" - }, - { - "name": "RatRig V-Core 4 HYBRID 400 0.5 nozzle", - "sub_path": "machine/RatRig V-Core 4 HYBRID 400 0.5 nozzle.json" - }, - { - "name": "RatRig V-Core 4 HYBRID 400 0.6 nozzle", - "sub_path": "machine/RatRig V-Core 4 HYBRID 400 0.6 nozzle.json" - }, - { - "name": "RatRig V-Core 4 HYBRID 500 0.4 nozzle", - "sub_path": "machine/RatRig V-Core 4 HYBRID 500 0.4 nozzle.json" - }, - { - "name": "RatRig V-Core 4 HYBRID 500 0.5 nozzle", - "sub_path": "machine/RatRig V-Core 4 HYBRID 500 0.5 nozzle.json" - }, - { - "name": "RatRig V-Core 4 HYBRID 500 0.6 nozzle", - "sub_path": "machine/RatRig V-Core 4 HYBRID 500 0.6 nozzle.json" - } - ] -} +{ + "name": "RatRig", + "version": "02.03.00.01", + "force_update": "0", + "description": "RatRig configurations", + "machine_model_list": [ + { + "name": "RatRig V-Core 3 200", + "sub_path": "machine/RatRig V-Core 3 200.json" + }, + { + "name": "RatRig V-Core 3 300", + "sub_path": "machine/RatRig V-Core 3 300.json" + }, + { + "name": "RatRig V-Core 3 400", + "sub_path": "machine/RatRig V-Core 3 400.json" + }, + { + "name": "RatRig V-Core 3 500", + "sub_path": "machine/RatRig V-Core 3 500.json" + }, + { + "name": "RatRig V-Minion", + "sub_path": "machine/RatRig V-Minion.json" + }, + { + "name": "RatRig V-Cast", + "sub_path": "machine/RatRig V-Cast.json" + }, + { + "name": "RatRig V-Core 4 300", + "sub_path": "machine/RatRig V-Core 4 300.json" + }, + { + "name": "RatRig V-Core 4 400", + "sub_path": "machine/RatRig V-Core 4 400.json" + }, + { + "name": "RatRig V-Core 4 500", + "sub_path": "machine/RatRig V-Core 4 500.json" + }, + { + "name": "RatRig V-Core 4 HYBRID 300", + "sub_path": "machine/RatRig V-Core 4 HYBRID 300.json" + }, + { + "name": "RatRig V-Core 4 HYBRID 400", + "sub_path": "machine/RatRig V-Core 4 HYBRID 400.json" + }, + { + "name": "RatRig V-Core 4 HYBRID 500", + "sub_path": "machine/RatRig V-Core 4 HYBRID 500.json" + }, + { + "name": "RatRig V-Core 4 IDEX 300", + "sub_path": "machine/RatRig V-Core 4 IDEX 300.json" + }, + { + "name": "RatRig V-Core 4 IDEX 300 COPY MODE", + "sub_path": "machine/RatRig V-Core 4 IDEX 300 COPY MODE.json" + }, + { + "name": "RatRig V-Core 4 IDEX 300 MIRROR MODE", + "sub_path": "machine/RatRig V-Core 4 IDEX 300 MIRROR MODE.json" + }, + { + "name": "RatRig V-Core 4 IDEX 400", + "sub_path": "machine/RatRig V-Core 4 IDEX 400.json" + }, + { + "name": "RatRig V-Core 4 IDEX 400 COPY MODE", + "sub_path": "machine/RatRig V-Core 4 IDEX 400 COPY MODE.json" + }, + { + "name": "RatRig V-Core 4 IDEX 400 MIRROR MODE", + "sub_path": "machine/RatRig V-Core 4 IDEX 400 MIRROR MODE.json" + }, + { + "name": "RatRig V-Core 4 IDEX 500", + "sub_path": "machine/RatRig V-Core 4 IDEX 500.json" + }, + { + "name": "RatRig V-Core 4 IDEX 500 COPY MODE", + "sub_path": "machine/RatRig V-Core 4 IDEX 500 COPY MODE.json" + }, + { + "name": "RatRig V-Core 4 IDEX 500 MIRROR MODE", + "sub_path": "machine/RatRig V-Core 4 IDEX 500 MIRROR MODE.json" + } + ], + "process_list": [ + { + "name": "fdm_process_common", + "sub_path": "process/fdm_process_common.json" + }, + { + "name": "fdm_process_RatRig_common", + "sub_path": "process/fdm_process_ratrig_common.json" + }, + { + "name": "fdm_process_RatRig_idex", + "sub_path": "process/fdm_process_ratrig_idex.json" + }, + { + "name": "0.08mm Extra Fine @RatRig", + "sub_path": "process/0.08mm Extra Fine @RatRig.json" + }, + { + "name": "0.12mm Fine @RatRig", + "sub_path": "process/0.12mm Fine @RatRig.json" + }, + { + "name": "0.15mm Optimal @RatRig", + "sub_path": "process/0.15mm Optimal @RatRig.json" + }, + { + "name": "0.20mm Standard @RatRig", + "sub_path": "process/0.20mm Standard @RatRig.json" + }, + { + "name": "0.24mm Draft @RatRig", + "sub_path": "process/0.24mm Draft @RatRig.json" + }, + { + "name": "0.28mm Extra Draft @RatRig", + "sub_path": "process/0.28mm Extra Draft @RatRig.json" + }, + { + "name": "0.30mm Big @RatRig V-Core 4 0.6", + "sub_path": "process/0.30mm Big @RatRig V-Core 4 0.6.json" + }, + { + "name": "0.25mm Speed @RatRig V-Core 4 0.4", + "sub_path": "process/0.25mm Speed @RatRig V-Core 4 0.4.json" + }, + { + "name": "0.25mm Speed @RatRig V-Core 4 0.5", + "sub_path": "process/0.25mm Speed @RatRig V-Core 4 0.5.json" + }, + { + "name": "0.25mm Speed @RatRig V-Core 4 0.6", + "sub_path": "process/0.25mm Speed @RatRig V-Core 4 0.6.json" + }, + { + "name": "0.25mm Quality Speed @RatRig V-Core 4 0.4", + "sub_path": "process/0.25mm Quality Speed @RatRig V-Core 4 0.4.json" + }, + { + "name": "0.25mm Quality Speed @RatRig V-Core 4 0.5", + "sub_path": "process/0.25mm Quality Speed @RatRig V-Core 4 0.5.json" + }, + { + "name": "0.25mm Quality Speed @RatRig V-Core 4 0.6", + "sub_path": "process/0.25mm Quality Speed @RatRig V-Core 4 0.6.json" + }, + { + "name": "0.20mm Quality @RatRig V-Core 4 0.4", + "sub_path": "process/0.20mm Quality @RatRig V-Core 4 0.4.json" + }, + { + "name": "0.20mm Quality @RatRig V-Core 4 0.5", + "sub_path": "process/0.20mm Quality @RatRig V-Core 4 0.5.json" + }, + { + "name": "0.35mm Extra Big @RatRig V-Core 4 HYBRID 0.8", + "sub_path": "process/0.35mm Extra Big @RatRig V-Core 4 HYBRID 0.8.json" + }, + { + "name": "0.30mm Big @RatRig V-Core 4 HYBRID 0.8", + "sub_path": "process/0.30mm Big @RatRig V-Core 4 HYBRID 0.8.json" + }, + { + "name": "0.25mm Speed @RatRig V-Core 4 HYBRID 0.8", + "sub_path": "process/0.25mm Speed @RatRig V-Core 4 HYBRID 0.8.json" + }, + { + "name": "0.30mm Big @RatRig V-Core 4 HYBRID 0.6", + "sub_path": "process/0.30mm Big @RatRig V-Core 4 HYBRID 0.6.json" + }, + { + "name": "0.25mm Speed @RatRig V-Core 4 HYBRID 0.4", + "sub_path": "process/0.25mm Speed @RatRig V-Core 4 HYBRID 0.4.json" + }, + { + "name": "0.25mm Speed @RatRig V-Core 4 HYBRID 0.5", + "sub_path": "process/0.25mm Speed @RatRig V-Core 4 HYBRID 0.5.json" + }, + { + "name": "0.25mm Speed @RatRig V-Core 4 HYBRID 0.6", + "sub_path": "process/0.25mm Speed @RatRig V-Core 4 HYBRID 0.6.json" + }, + { + "name": "0.25mm Quality Speed @RatRig V-Core 4 HYBRID 0.4", + "sub_path": "process/0.25mm Quality Speed @RatRig V-Core 4 HYBRID 0.4.json" + }, + { + "name": "0.25mm Quality Speed @RatRig V-Core 4 HYBRID 0.5", + "sub_path": "process/0.25mm Quality Speed @RatRig V-Core 4 HYBRID 0.5.json" + }, + { + "name": "0.25mm Quality Speed @RatRig V-Core 4 HYBRID 0.6", + "sub_path": "process/0.25mm Quality Speed @RatRig V-Core 4 HYBRID 0.6.json" + }, + { + "name": "0.20mm Quality @RatRig V-Core 4 HYBRID 0.4", + "sub_path": "process/0.20mm Quality @RatRig V-Core 4 HYBRID 0.4.json" + }, + { + "name": "0.20mm Quality @RatRig V-Core 4 HYBRID 0.5", + "sub_path": "process/0.20mm Quality @RatRig V-Core 4 HYBRID 0.5.json" + }, + { + "name": "0.20mm Quality @RatRig V-Core 4 HYBRID 0.6", + "sub_path": "process/0.20mm Quality @RatRig V-Core 4 HYBRID 0.6.json" + }, + { + "name": "0.25mm Quality Speed @RatRig V-Core 4 IDEX 0.4", + "sub_path": "process/0.25mm Quality Speed @RatRig V-Core 4 IDEX 0.4.json" + }, + { + "name": "0.25mm Speed @RatRig V-Core 4 IDEX 0.4", + "sub_path": "process/0.25mm Speed @RatRig V-Core 4 IDEX 0.4.json" + }, + { + "name": "0.20mm Quality @RatRig V-Core 4 IDEX 0.4", + "sub_path": "process/0.20mm Quality @RatRig V-Core 4 IDEX 0.4.json" + }, + { + "name": "0.25mm Quality Speed @RatRig V-Core 4 IDEX 0.5", + "sub_path": "process/0.25mm Quality Speed @RatRig V-Core 4 IDEX 0.5.json" + }, + { + "name": "0.25mm Speed @RatRig V-Core 4 IDEX 0.5", + "sub_path": "process/0.25mm Speed @RatRig V-Core 4 IDEX 0.5.json" + }, + { + "name": "0.20mm Quality @RatRig V-Core 4 IDEX 0.5", + "sub_path": "process/0.20mm Quality @RatRig V-Core 4 IDEX 0.5.json" + }, + { + "name": "0.20mm Quality @RatRig V-Core 4 IDEX 0.6", + "sub_path": "process/0.20mm Quality @RatRig V-Core 4 IDEX 0.6.json" + }, + { + "name": "0.25mm Speed @RatRig V-Core 4 IDEX 0.6", + "sub_path": "process/0.25mm Speed @RatRig V-Core 4 IDEX 0.6.json" + }, + { + "name": "0.25mm Quality Speed @RatRig V-Core 4 IDEX 0.6", + "sub_path": "process/0.25mm Quality Speed @RatRig V-Core 4 IDEX 0.6.json" + }, + { + "name": "0.30mm Big @RatRig V-Core 4 IDEX 0.6", + "sub_path": "process/0.30mm Big @RatRig V-Core 4 IDEX 0.6.json" + }, + { + "name": "0.35mm Extra Big @RatRig V-Core 4 IDEX 0.8", + "sub_path": "process/0.35mm Extra Big @RatRig V-Core 4 IDEX 0.8.json" + }, + { + "name": "0.30mm Big @RatRig V-Core 4 IDEX 0.8", + "sub_path": "process/0.30mm Big @RatRig V-Core 4 IDEX 0.8.json" + }, + { + "name": "0.25mm Speed @RatRig V-Core 4 IDEX 0.8", + "sub_path": "process/0.25mm Speed @RatRig V-Core 4 IDEX 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_tpu", + "sub_path": "filament/fdm_filament_tpu.json" + }, + { + "name": "fdm_filament_pet", + "sub_path": "filament/fdm_filament_pet.json" + }, + { + "name": "fdm_filament_abs", + "sub_path": "filament/fdm_filament_abs.json" + }, + { + "name": "fdm_filament_pc", + "sub_path": "filament/fdm_filament_pc.json" + }, + { + "name": "fdm_filament_asa", + "sub_path": "filament/fdm_filament_asa.json" + }, + { + "name": "fdm_filament_pva", + "sub_path": "filament/fdm_filament_pva.json" + }, + { + "name": "fdm_filament_pa", + "sub_path": "filament/fdm_filament_pa.json" + }, + { + "name": "RatRig Generic PLA", + "sub_path": "filament/RatRig Generic PLA.json" + }, + { + "name": "RatRig Generic PLA-CF", + "sub_path": "filament/RatRig Generic PLA-CF.json" + }, + { + "name": "RatRig Generic PCTG", + "sub_path": "filament/RatRig Generic PCTG.json" + }, + { + "name": "RatRig Generic PETG", + "sub_path": "filament/RatRig Generic PETG.json" + }, + { + "name": "RatRig Generic ABS", + "sub_path": "filament/RatRig Generic ABS.json" + }, + { + "name": "RatRig Generic TPU", + "sub_path": "filament/RatRig Generic TPU.json" + }, + { + "name": "RatRig Generic ASA", + "sub_path": "filament/RatRig Generic ASA.json" + }, + { + "name": "RatRig Generic PC", + "sub_path": "filament/RatRig Generic PC.json" + }, + { + "name": "RatRig Generic PVA", + "sub_path": "filament/RatRig Generic PVA.json" + }, + { + "name": "RatRig Generic PA", + "sub_path": "filament/RatRig Generic PA.json" + }, + { + "name": "RatRig Generic PA-CF", + "sub_path": "filament/RatRig Generic PA-CF.json" + }, + { + "name": "RatRig PunkFil ABS", + "sub_path": "filament/RatRig PunkFil ABS.json" + }, + { + "name": "RatRig PunkFil PETG CF", + "sub_path": "filament/RatRig PunkFil PETG CF.json" + }, + { + "name": "RatRig PunkFil PETG", + "sub_path": "filament/RatRig PunkFil PETG.json" + }, + { + "name": "RatRig BigNozzle ABS", + "sub_path": "filament/RatRig BigNozzle ABS.json" + }, + { + "name": "RatRig BigNozzle ASA", + "sub_path": "filament/RatRig BigNozzle ASA.json" + }, + { + "name": "RatRig BigNozzle PLA", + "sub_path": "filament/RatRig BigNozzle PLA.json" + }, + { + "name": "RatRig BigNozzle PETG", + "sub_path": "filament/RatRig BigNozzle PETG.json" + }, + { + "name": "RatRig BigNozzle PCTG", + "sub_path": "filament/RatRig BigNozzle PCTG.json" + }, + { + "name": "RatRig BigNozzle TPU", + "sub_path": "filament/RatRig BigNozzle TPU.json" + } + ], + "machine_list": [ + { + "name": "fdm_machine_common", + "sub_path": "machine/fdm_machine_common.json" + }, + { + "name": "fdm_klipper_common", + "sub_path": "machine/fdm_klipper_common.json" + }, + { + "name": "RatRig V-Core 3 200 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 3 200 0.4 nozzle.json" + }, + { + "name": "RatRig V-Core 3 300 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 3 300 0.4 nozzle.json" + }, + { + "name": "RatRig V-Core 3 400 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 3 400 0.4 nozzle.json" + }, + { + "name": "RatRig V-Core 3 500 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 3 500 0.4 nozzle.json" + }, + { + "name": "RatRig V-Minion 0.4 nozzle", + "sub_path": "machine/RatRig V-Minion 0.4 nozzle.json" + }, + { + "name": "RatRig V-Cast 0.4 nozzle", + "sub_path": "machine/RatRig V-Cast 0.4 nozzle.json" + }, + { + "name": "RatRig V-Cast 0.6 nozzle", + "sub_path": "machine/RatRig V-Cast 0.6 nozzle.json" + }, + { + "name": "RatRig V-Core 4 300 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 4 300 0.4 nozzle.json" + }, + { + "name": "RatRig V-Core 4 300 0.5 nozzle", + "sub_path": "machine/RatRig V-Core 4 300 0.5 nozzle.json" + }, + { + "name": "RatRig V-Core 4 300 0.6 nozzle", + "sub_path": "machine/RatRig V-Core 4 300 0.6 nozzle.json" + }, + { + "name": "RatRig V-Core 4 400 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 4 400 0.4 nozzle.json" + }, + { + "name": "RatRig V-Core 4 400 0.5 nozzle", + "sub_path": "machine/RatRig V-Core 4 400 0.5 nozzle.json" + }, + { + "name": "RatRig V-Core 4 400 0.6 nozzle", + "sub_path": "machine/RatRig V-Core 4 400 0.6 nozzle.json" + }, + { + "name": "RatRig V-Core 4 400 0.8 nozzle", + "sub_path": "machine/RatRig V-Core 4 400 0.8 nozzle.json" + }, + { + "name": "RatRig V-Core 4 500 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 4 500 0.4 nozzle.json" + }, + { + "name": "RatRig V-Core 4 500 0.5 nozzle", + "sub_path": "machine/RatRig V-Core 4 500 0.5 nozzle.json" + }, + { + "name": "RatRig V-Core 4 500 0.6 nozzle", + "sub_path": "machine/RatRig V-Core 4 500 0.6 nozzle.json" + }, + { + "name": "RatRig V-Core 4 HYBRID 300 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 4 HYBRID 300 0.4 nozzle.json" + }, + { + "name": "RatRig V-Core 4 HYBRID 300 0.5 nozzle", + "sub_path": "machine/RatRig V-Core 4 HYBRID 300 0.5 nozzle.json" + }, + { + "name": "RatRig V-Core 4 HYBRID 300 0.6 nozzle", + "sub_path": "machine/RatRig V-Core 4 HYBRID 300 0.6 nozzle.json" + }, + { + "name": "RatRig V-Core 4 HYBRID 400 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 4 HYBRID 400 0.4 nozzle.json" + }, + { + "name": "RatRig V-Core 4 HYBRID 400 0.5 nozzle", + "sub_path": "machine/RatRig V-Core 4 HYBRID 400 0.5 nozzle.json" + }, + { + "name": "RatRig V-Core 4 HYBRID 400 0.6 nozzle", + "sub_path": "machine/RatRig V-Core 4 HYBRID 400 0.6 nozzle.json" + }, + { + "name": "RatRig V-Core 4 HYBRID 400 0.8 nozzle", + "sub_path": "machine/RatRig V-Core 4 HYBRID 400 0.8 nozzle.json" + }, + { + "name": "RatRig V-Core 4 HYBRID 500 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 4 HYBRID 500 0.4 nozzle.json" + }, + { + "name": "RatRig V-Core 4 HYBRID 500 0.5 nozzle", + "sub_path": "machine/RatRig V-Core 4 HYBRID 500 0.5 nozzle.json" + }, + { + "name": "RatRig V-Core 4 HYBRID 500 0.6 nozzle", + "sub_path": "machine/RatRig V-Core 4 HYBRID 500 0.6 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 300 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 300 0.4 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 300 0.5 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 300 0.5 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 300 0.6 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 300 0.6 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 300 0.8 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 300 0.8 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 300 COPY MODE 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 300 COPY MODE 0.4 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 300 COPY MODE 0.5 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 300 COPY MODE 0.5 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 300 COPY MODE 0.6 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 300 COPY MODE 0.6 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 300 COPY MODE 0.8 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 300 COPY MODE 0.8 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 300 MIRROR MODE 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 300 MIRROR MODE 0.4 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 300 MIRROR MODE 0.5 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 300 MIRROR MODE 0.5 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 300 MIRROR MODE 0.6 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 300 MIRROR MODE 0.6 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 300 MIRROR MODE 0.8 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 300 MIRROR MODE 0.8 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 400 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 400 0.4 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 400 0.5 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 400 0.5 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 400 0.6 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 400 0.6 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 400 0.8 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 400 0.8 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 400 COPY MODE 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 400 COPY MODE 0.4 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 400 COPY MODE 0.5 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 400 COPY MODE 0.5 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 400 COPY MODE 0.6 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 400 COPY MODE 0.6 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 400 COPY MODE 0.8 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 400 COPY MODE 0.8 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 400 MIRROR MODE 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 400 MIRROR MODE 0.4 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 400 MIRROR MODE 0.5 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 400 MIRROR MODE 0.5 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 400 MIRROR MODE 0.6 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 400 MIRROR MODE 0.6 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 400 MIRROR MODE 0.8 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 400 MIRROR MODE 0.8 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 500 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 500 0.4 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 500 0.5 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 500 0.5 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 500 0.6 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 500 0.6 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 500 0.8 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 500 0.8 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 500 COPY MODE 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 500 COPY MODE 0.4 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 500 MIRROR MODE 0.4 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 500 MIRROR MODE 0.4 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 500 COPY MODE 0.5 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 500 COPY MODE 0.5 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 500 MIRROR MODE 0.5 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 500 MIRROR MODE 0.5 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 500 COPY MODE 0.6 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 500 COPY MODE 0.6 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 500 MIRROR MODE 0.6 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 500 MIRROR MODE 0.6 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 500 COPY MODE 0.8 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 500 COPY MODE 0.8 nozzle.json" + }, + { + "name": "RatRig V-Core 4 IDEX 500 MIRROR MODE 0.8 nozzle", + "sub_path": "machine/RatRig V-Core 4 IDEX 500 MIRROR MODE 0.8 nozzle.json" + } + ] +} diff --git a/resources/profiles/Ratrig/RatRig V-Core 4 IDEX 300 COPY MODE_cover.png b/resources/profiles/Ratrig/RatRig V-Core 4 IDEX 300 COPY MODE_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..c7bf8b01f75f34a34b2df56c304fb7bd43fe02d9 GIT binary patch literal 36499 zcmdQ~g;!Kvv>&<#qy+(KK^$NNq>+|xhDKVtQ#z!Plo3HdKtQ^?OThW0L%K^^Qt}<& zTJMi|iymg(nS1X!d;e-jtEXDtMR2EoM!zdc$p+5msNvz3-s zSCE!waB*{fW9wiAfv_h9B#FuQNYM6~XvuP>5_u7O4yb4DWelNFu%eNN&*U<1(M%eeu})5R#*BRXjt6 zq5YF*EV?lbRS^?VLDk8Q9>u`&Tubc@Wz7+-$;Hv}8P|`R*5O+r?9|XfNVYt!MY9=+ zGx4yKf$&zqD*Txe{;|;USILJgf$PnCe`vOnd(elWG&857u4#HO&#L*pQipH7yuBo{ zlk6q~O{Ff2tED=-r2%Sp-KLU;gD#nyRHS-Rq)(#~HRP}mdQoG=N#;x{*RBulqt?`t zl%D8f#nBRclMG+K?7Cm}Zg}JB`$Gl)d&uI$xjQPHE3Xipp8Adi#}-fY%j}S6Wos2L zLYmaZXy`cIFyGaO#O}sFIYj#?(s`7^MV-w2*A~Bz=_v5k(g𝔒yI{IYU4C!Uqz_ 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𝔒yI{IYU4C!Uqz_ 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𝔒yI{IYU4C!Uqz_ zW`lM#BBGFJQmYET)|QTzhM?iv>ua=1cef5Z@0)sXTd>WQH4ix!V1(cP8yJXscz4qjbk`*Qg^|!!Ui#5kVg%pU|7X9hCn%?h zpJLGpd$618PjNzg-@JKq^qt0;_Ih@@-K+N4=FSuKu;a3iv$@>Fo+^U){i{As!+P3Z zRTlj-j&t?;K_BpMH#3}_YGJ!t#l`HYuzhUU5qSGz>1wJWE@Jj( z_d|HT>?SJcY$GgR^H^99f~qE#9gUM=;vTHNdEn^i*x|od)z1+WWxsY$EPnNA*ng8u z{O&lRqwl1ZPh30!^^rTwO5d_ZpFO6!u&m7SaAIQOiy4&y((1XG*n6dqTxP>rVu@BW zSpl@?rs+?_K3)sVZ@Ju4))5c6 z9vn7?`@dSW*00}uzV3fueQo_ zw9?@ESeSKxR&glg`FrAJ*4D_(XtV@F@TX6<=bx-q=NWOk=>h@*#4(PR>EBBkB0aCy z*T1qTkXFyY+E4SjS9VSAg^B2dF*V4mg6{8}H&6b0Mwszg^HBS*(JXadUJAC~Y;fl_ zH8uTSX-xf3?QL6s5lJ5M{uSj-14?_1EaSasmp>yNUN2-nHt@%nniCA2n~+Z zqbWmYGdDL<0s;b4eWU@!pNfmR*{y>$9WA{Ix8~vfy5E7^6{K$~il#1FQ+^z7cs~ft zp1gY9Hi&{lHH-MhcA#TBeBf#*=99+st*Wr8Wz8dhzUev@c+kFpB;_fuqPb&h?N~Zi@cI2qDoBI3HuDDP&84-aMu!oLm|Q zm0g#3R`eQw6QEqQ_cl=~TS{cX+nv6UAjb6Y@{%H#T|arNtfn?T*cxzsP889VU}!j( zx852q#d!2@3tZ>92&rbjebEzFkqcJ>bu>ZN_Ho{6@{z=N^ z58d`q&7yZcqC}`_b*_&&wvXCAx(NRF0kwg{svyPpNVdr+BA5L?L+3WudkuCE7E*os zg#P21;Xumt0y8^b{7=f*$t+#fFgq-8$pfgOWpWD;XMQdR_tRQF9VdUW0(#3J5@E8= z%bN(D!{<&P^RoQ3)cy`w{=r6`kxvBBmCzk}3Mr4vu#<1C`K|1 z<3|)@#!n_%BI#tAw1Q}ngT~vQpbPIM+TRBU>9_a!QVDT!MvnSZ_ku58oQ*teKf;nv z#vJE!J)6|c)8@!&YQjsB$DMI_3`3dQ+7=arHZmXkO6Dx}R6Jyvswq7S?VMb!DBKRr zp4NPM;psE1@!(8vzqvK#CtatnG17=DQYt6dtqGKpkf|vhJ!H5xNBG~rZ~J{Qj(u)U zPEOqE>1kMx`wYuvX z$?e64O6F4)v0`$yReU4Nz%7zQm&)22ou7{bw@tH1#+YOd0hK^ZMitm5=yIg0Ws7(p z3`#H@=_a#e?(gmS4<~aUDyR$c^Hb8&(D?OMm*zpTcvVikRK_pOt8n8js;p3yX$5$o z?r@|g4sVgf_K`p%(BRt#2d{K>bty>I4;d@okmwrzo-U3GB#Xqftn)ve4AofuKJjN) z_vFI5&@>9#LMi+;$n5g z3-Bu9NX2|rE-tP+2OFF1@8(qlHzf@td3kvXkZiQ0LdcXM5=&)Vz37($v&a#F>FyL~ zT6+2`j#Me(Oz=H7skXp&`R(IlpLqcijp0b6SXsl8?(&WMvoCGFUHWai60-5Km8k{nDfFfd}C)KSx!QHW^V`SXk)k>Gf{@ z%orUTlY0Ip!mQFvT0D0&Z(zf1VC#gP93L|e8{#lijg^_1+5TXH=ELMkP#eCkTFBzl z?#lFxYJ+YIPA*kW*3$e&ONSdB!U~^+<9Lb?`nJFzrld}A+~bW>NCfU>`BYa>_g}p z%VrC_O;u#Q*_IQR5~TgE7IdX0`e%T-@odWQlT=P+%39;$L;UbqP{nV2*~zaC3RE)i zI|RZX)6;LE&D*7Kn!us%u~z!D)L^SZ5eV1iPPBJDW?%`f3?wl(uEsno{_v%+5U0zO zxa03n=gP*$sKv$CqPM5xjaR=*o_h4V&KK+0)qOZM;0-=pU%BUhCdIj-|5N2iHOm*j zW!Bj@XV4&}(>`bLd3ph3k~{+yG`FsfqN43Q-6D}^dwW}g?@`}Srbv;RivM9(mn3GG z$B%&jf?+M3G1&actkn;$pm_Y+sIa#ad3}V;Mo(2s0|g1u1?w_+O_h zZSo*XdU`rBE~dON9as*c!#(ggRh98Ot$fYDC*y@`K_cY%w;%8B?xJ5Xzbc`F3kiLy zgzfSot!|$NKjyK2p(5R6gbe|;Icuv64&_tnu}BcZmep|SqtIPm^gH}_0ZWXCcznQ3 zmf?F8j-43t zDB~J72py@@J2FVgL5kEiHtKEsu7VN7uMrbP?mXw^sDJGrtV`{WpaGdtC0bF7atE71kXD^1QX0q&dTjKNiaztI z6R^#uS~RyuM@L^n?&Gay`e7)=L`eq9893C1cB@1Wz!uQFs`N@@f>s{$Wo_jYb9fjR zF0lskzO_w%MKK!?s6k#r-m|MUC52`ea1iKHl0UY~YJ2l4wQH84hhnKA(9f#kp?&FQ z4H*UxiH#&XrG<(+s*=vX!EsBiBW1!vp=yh*_jc>irBYk7;vu=AjRaS}it&tgub@pd|p%P^FwEao`*xWIzcL@P|7AC%%pRC(2LLT@ptE+^!AAjE!u&VhK6fMIf zU&sp@5oiR&m}t%AW;QmsFaq`%&9ftpR7DD9X|C_Li5MXg6odVN0}jUM??1Mv$KtN* znDa>9=((*w!jg1p;&?~X-N{F|<*ePr(_6^4#Wu-v;OAoK#{F=n-GnT7N0heR?vs~p zVq?c{LotcTlvq*QRQ4Cu^?OU@0V?9+XTv9_zJmcVp^))vQv*uDt$>T?2dVGP^ebT) z5msiuQG5og5zRt7>%O--zSln35oW^EchIKv_=bgi)C^9xx24dVVnni+W^aSx1j4|lYJlyfx%(v!mZ();mw2{8;pR<#% zlg8Q<4Tl?QVFabTO%A%j%EVJ^c4;pvX6`O5o=g>Pd5IL_DQ%rH0q-@_dxc&Mrdbi5J ztCn)=;JvM#hQ>nQe*jEY!=w?XyiM|NQ|?Z^QQ`HrZ0XV&6WCbq2$0^i*xrq@`1PO94UI+p6L-t(@E zl(JrL(^-oPjM|5{T_~OQz@awjL<-4f>8K5R(P6ENL|QqRK)-8L|C(Un&E-EDkk?u) zHT?5uCf7$4sM9gI>M~(lLge^Z--_c+)nDanO6F@8tv<~th&F$|cKPKQ=VyBQ9HjGp zcvLIgxJ*j3;!h)iRGSSB-g)bTMMuwDBaA;Tt$}W3ma#1=!M5pqm8U1i_Q#TTPxI-a zn{6hCV#%Fj0r!DqEw6K=+b}gaeTIj_F@m-2ihc)p6Dxg>({t1yA9QtgT4&)r`S5QnpSs88OWyWaQFU;G4!mmQ*FFOu z=0g^-c1ovygMn9p7J3AS6&JL>S+jprr}?Ig4&#<0M_jYrot)w+cg`;^q!EZp7=g+- z11>s#I67%`@8AnpA-5(YJ6l`Z_Po3{M+b+AcvCtYF>-vy>|xzh$;n)nscyOHdMLpQx*HFVY|Q5$*+nEvx-HJIx)8Dofc-_=u^VR(fcdm z9x2#Cp$w+u1uEqmpIy=Ag3Y2T^y&C!+Ot)29*@IEmzEMt)xV$b&w)m&@V4#%?GwO* zC&S_ojHkN@&^saf`}>WzQ*$F@W2+*GfiXP%{I96Z>u!v7-SE_2{$+XWvyAq8c#7L!f2Rr>~z}GDL<5vJ}K0iCV9rD{AVVw6_d+#YUcHq8o^0xJKObOt6bi!p! z$ZWJ*u;Q^9Ils z#+cQZUL`fP2SeH7;@3G30=CD<)I_WJ>lgO+_6$Xbm&`?0v1JsbnvA3vh`;^#t)SU? z#(?YJ*FCcTrEkQuGvr!==Cfdt$B+~|`KzFN?0NqaPS8KVj{Kw?VekMTmiMoYQ6_g| zL@czIuZS>5W@e(x3>(UAqgmTt);ll7>%nyTm`bd6R*wZEA|hOd#V$&VZAvno%O;uY z%EPI`*|PmfABde2r)Om7a_+G{@9yoz`}9eYojfe{;p&@7j~EiI>ZsYcv#MB?O1!NG=ygu_Tj2`d!({ z6+OP&rpGAehlbF^UjEv0_t_9a!|%}f-+$1ntE=Cekb$KQx2Bka&d%2= zVO=9J{P>vZSi!sHEsp^Wg+n{5p?dI~4~l>T0ex!rn$Um!`D5{WMwcTtbWDxvWBXXN zVfU!MRk#X4vy;R)pD?4!I3SkfvhG)npMB)~ZL+o!IATI=_;n0eo$nsgvKJ@bG$q|44Fa_IsD>}eE3;1g@q{H31g?Mtn6|b=P;z8Xkg1T zo%+w}Pf)SRW!Yn-m`$aO5eN$Ijw}2>GqlP*?`%IMT78jWY#~HUWub=bt#{>LK)g0jx zEKP!rpHF(#u)Do)9I19Ef>rbvwisyquGo%P7B4j>Mk)s)NeooY?L+*~VDl>ZrsHZ@ z%C2ADl;B^TfQyTZg#7WH{PJ?H-@GkN1HHpWPO_%z4%#tAmwWdHQig_P-`O4>p$=sk zUg>Fbu-af_NRpG_haYX{B``fs82@4J{bZobD3_gyGIlgSbNvi~=tFUL#PJrYSp)_? zc6YBy%g+ACrLb{u02k1bHH_;sfA*n4=U#C2`dBof<)E1Whlp0MuHUFF(6i3>@U7o} zZGY!tZ66stWk)>kQVfTwmze?-M}e5+3(0w)q7leV#O;ktDX6 z6#IL#K9~aJ6$Dp;ZThbo>j%xkEnhyMOpQ9|q1aCuBwo|@BUI#*eq%>RJ1MYje4UukRy33ZD%%A(xmbk(a$2Zl5^V z6v~M=Xn%=9dPX!{+z8j3YHMptgP$+l)rcHhqzMa)G#?%Hi{oh|5=Uc_5LMaO6Rwcm zzv}e94@4_ECB?>WKKgtAE$m|`oEpO=REp=Xe97}aG%ys?qxa?>9;cVjDq783Ey5{f zkF|@m(T54t5rm@sEx9@^nq7QQoI-4;drN$QHgSAo?zO=~&eh*EA@4IV|EJD4ntFM8fyf0ZMjStqfI zqM)XROiN1(K{z!%M%19Av{c8=^4HJK4j;&kr;cPs6#*57@^de`dv^h8x7e!x!}*hQ zz_OZ;ojF8bOKUtPT5X;%IsNs^1gvqMO51VBW8b45QyAXTT>_r6%GT)kWX$zrlB3?B zOeu}Q<=KGU<0BLD&J$Xnsj?AD7RgZCU+Pr_JIilLnw?DT?Ch>^#4pjVF^bfo48dD(=a!1taWT88eibf<(N_dpAw=)@NRu5Y&kxAd zVb;fC9lPK665~V;e>wVoz0Uw`2=t|M_!hbQQ`oHE8J;ULu1ob$_4% zKvZw4?w(}3UMF|pU-z4ad+GlBBVAjExkr*uQv20{;Nb}Y2EEsZD(36{*w#T7U2tXL z*DOiqEnkFXG&)D~7JUtk?HJ7DEvZgC3+@96Y(0?;&8F;SJ1Ta2U1+(^8G*3Y;6-a zx%Yao`rJTxrYgXpOTFmS+dwLpVUncD@}YKf?zrXu-rv6iDHykni;Mg9OQ=W3tTS8+ zZEHAN&QDHcL!d`1U`=k9MaHk2x}L2X(f8?mF~iWcps;XsW@g7wWM*+uRU;EArj*hggs0DR0b= z^4ICi;Kp)2>L+p7-t7r{aEFJEh8Iy37P3L}Ut+O|vq9#iYHxle46u7BA)$u&yy2}> z>7OKKIpB;LV~HnO0Q*Muv!LXPI08YE&<}9%O2%<)|C*P@`4oQ|(n6v0l0W1)xtdSK z9jWRlYY(aZ-B?uLyK0vn0i1~Xdj6&56pvdNIld_scA;u!cYDBfu{jaX%XN3-XmgNcdAufqBX!L(m5*RZEmp6h)T`p}g!aw5?!Ny`G zn4SuiMBqp0M?@%80>KU}C6~*i6_lFz?Pa zk8wyi0-Al@n5EF!A|RQV;()RN8^j~rP1o{p%4A3%n7`LjM)e9gS3ZC~-IP&q}1tk3+p=$~jg61CnhPtiRPIH)R9z0hu( zp>jf6pjc)q7ub$b{s5x2b18D5xMU&`0sJ5bK%F!r zLx-fbKIIeU&gAJ3ik{k_?{@kk2*h(y(Kv8hl~q*!=0Ytg@UbzLe{JL%G#J*p6_x8u z0XPFJG(Z}SxV8*slm!VxCB>FInKG*D-i2oVr`Bk%3T>PnHo(dZtM~cwvXcqQvO5Lz)O;&!=C5WLY;f+85 z>IR;rNK?G~J2aQQc5=67_+?l~2q)E}N8LqQg(IV*A;319b7~=6QOBj+LmJoL>l$yY z=<-RFCbKAv@CC2=;I!$TJ6h?#VjvD?Q9v{bAET`FBg%JAWi?wZMdw-Nii>q7uVwQz z04`W^(xkP2=FCEh)&t>gJwnIEiA+RoX#W(uQ=Y5S z9e0EvtPsvMxSsGT@0lIZ!ncU)za-2bhPQT3TybL8MMS*zI;~%x=!+irl2yv1;O^8! zwI2zB*Mz7FLI7EU!C)Vpn|BJxtcO0oy}-ZC=ME@3T@HH??>JMPAGRi#_MOL59ccwb z$KTAqo8y7$W#sKST#5t%ygmI6YyPNR?7F1 zeMtRY4I9d)eV}ejaM$z(9p7d>tGix+5!vf!=o<~k?)A|uylXCuoDfC|wDhNuWXz+|CH zk4Q>VqN1Vcb8J|Mmue3l9o0zR%*x8@8`FGLr3a0TJpnk5JjE;mo!T?U7HcxIrD#%WuXl*C|X|b3Txa< zw+C1tLpFpf9td`)L8wSgDhL8i*7>`x#SZd&HnT6KY#xE z**Kn=_(_8QOI>#?w`a8`Rsuy$_Rh|c?D+pI*8s(bJ)mlia$f5pZP}&X`?yzmrppBWy3o|r}P0g+5`Xl%n9c*ZEZc|zh({s zS&!5?pEWMfsF2IzhA#YwgPda?Fk^5ikluE%M{n=%hUKz@bccN5I0E^ZxDZqF%XS0{ z7J~v>vl98+q$Re1*#W;$hA$mK7|P?FV`EHz{#xyQGShn}Wfqky@gBFyNg;W=gJrbK z73L^rX3-j#@@$z7HXSj6J1dnH?svv2PxLAAtFDK$vonR`#ICB(t#w6-BWi3N zOoQjIhsEzjUtTl~BNkv9M&4g4nG}|*%>gPCbl-#m6K#9%2?b$9j)kSigvOJ{&E<@b z-v5g_fba_yJ-r-9YWG@#c)W{X+**Ia8c^8FyVbLOR`CGG(`JMQ?wfMA-`1;qHiwku zYRbo(QT;bOJYKMLR1f(I!rE-V?#s~4ieRSWuo45Z` z9<%lp#w)&;qm->*S^s1TEcw?I=RjA+65T|cSBuKZ=qg(O{1^ev-~L9`h{$@-uST;- z6sgSeoL5BJRbf?^B38C}h6y!WT2AnA@q2eSdYQV{Ql-GC1S#$T4$zidk5^?|@2(^Z zqo(R#oh5uo_Gc%aa6%>J2nZWK?u*l!1$1b5iF+qHrBu#NK^ zOp&U358b@F4hzLoX*y<#n%j(vGXw;Vy3^{TTtCQeEqK3!$U6DEV=2VPMMst=I92uP6S<7G5`D( z_0$lG&-G$2QSzQXAetjIEd>dvw&F1fB*froT~degyCp}j{;b)nDMsgp#vdi%2aVg z3Zx?w6Cpc0)R>ldqHN1RU3P<|$X`qNtWoGAck6F*gWO@th{$qk)2^`RDsWh&dT_Xt z3tXk-N57|lyLSWKN&TW*%2~9t5;+Sckz|n##Da-9G3Udx7c{NJ(?5&{>=T+)1}&*t z0(t{37Gl9V)#{%5Zx3oPH(S|Q`>rpa^}nA(%;{0+lo$%oFY2%n1u7`^@%h}t(b?IE z`g*UzMjvCJ2e0|f;=UfgA72K%Z)Ul~X>P@)vU!IB}fZ*Z%G-XiR zAU%UMz7CJIxx7L`cn^t<1u}1ZFIa6|3ru>IoG!P-?}e~VJ&omxw1M9f%79xd7s=of zPtT49Cw8hZox7Db^&w2hnx8l&+&kzXOCEnFr8x<94Z);m5~l8xXe#v7qyo;@FC$yzcyiJdOQS`c8z~EiKllF9 zoHAqAJ}JBP*OoFjcx_gE*woTO1G++9_L9rm*$Bs@2)3csnb-$w=)>k~VN9Du&T?ot>TZ zqtCYKJ}co50W3Q_%0U5%URqy6U6Wi}dva)JoZ|sxq>D!sia{lE^U?(tDR$U`p=;vZ z(8d~SHD${zv8%TI1t(0>rJN`HdI*2gBE;pBE%XMWdY~lU)VTb=_3P*=U;{x#z~s&+9Z#Py6WpX4yoC z{8?hqg5Gnh+tEFvHaZfYv_4`UXC=4?TDUo$%1`JIMNhUnBd%DGss#(l0=U{t#sxKK zqk}1IRrf=;QQvdhCl4^ANiflp6|GL|Qkx zF7;PDrVqE@oam=NF7N+v5{4g*Ub=2wgNrExWC@&DPUg`MnEgD#R-slx>>Kz6)`g6J zV4IZV-vk4{h+H*XAQ%m~;E2%{fo+ynDoxu8`$x(Vk-30Nh~bqbOUv>?B2L2l=E-m$ zcTd{k5ux##2K(yl+j+W2p1 z=*oahQ>CrdL3l@hvL0V9fi6ErTvSw<6AdM_?*1$D8fArL@IGQ;QM>dSjV%0pZYsoz zS|-oT!^>0C#Lsm6)!t$q0o0niu-Vq!{0&;qN4Do3A9DCK{(Ra0o`UrOgdg zKhu=KiKc3`8kSd9M=`y(5G%ujHoC$K`#MI|>OxJ4vM~J;Bs&&rBr>DX6(9}>U0At+ ztxXR+3ANQ(`Bgm(XHE3M*ijaXI7cc^=H~+_tOssmXBWD@vm}}2nWNshyv*=VK~{VL zhfAcURo+CkZ2tb?@kdN!8=$=Q%;7DiLCfmm8bV27pkwJF`+&vG^9jmj)EEqO6|f_g z6p5rvSh`4~3l{dFUi-5uDOg|Cr;Od@mY;jCouwiNdcz4Gf+%Ifs+nT)`seY}$^)u2 z>@PYF$n4G&pL;s*Nt7F4r#DYlu>d>6CyMIt&NIrw+>!=1nCU(@b54N{g zXI}PPYHbDARK^VpG~JIp3P%THq)9c_XHr=3cZ&PqP+<{~5*@_`slstvko%2`kI&VE zjUlp*9B@VD)k)cy9X!3gJC3v1PnYg*mxf=r`nV>2ctL{2;_{)u7F3yc<-77Mq!ZjM z3M3uNiB|d^-gTX|&@`mNN4SU|8*`?rg^kU(V){sL3nrEEr|^!_L@$B=wCzZknVGlu z_dz_MVE(}$Cay@^T)P(Dh=;_E3lRXw?A?B&z+#Kf?%hzzOUugY>bTk4O3TW0S8VVp zhPnHg}sF1f9DR zP6&g2{qjj6Du=&c{Pm*1_gdwx#~+oNaS$cKSDahxAF<(h2-RLs%Q2ba@6&F z)%a+^a~d*)|9DU@)!9Fk(fE4Ha`Vd*G=v=w>=1}!w_MI=DaOc^ z6?X`gwh>J~;MvA4UZYOAqTI`!AsED%kHe)%Ms2$ZWqf=*QAUZwFQ1c7IVhjIzZR-y<XP`Jhs7J0isBWrB}r{NNy-rTYxWw~?%GUXt!lEH0{2tf-HD#uTRK zh5@w#uwH_6pD*A^N&)Jn{`=@u0hN^V@FxL>JTtB1Pp3|;RFW+k9Ooi{n9wXPy2GWY z!<0ZuA8$}=dn5$~LISVAKPB4}A-`)HCNRANPD?ql|sMB=8` zejmArXsvnAq;eRv>!2uu*GPf$x-e^w+PG&a3gdL?R1satVO6N=I3Rzqq$mIx3v_p`;1OE6xX2JvJGSAkhzNsZj$`3!Di&Q)j9uDAp^$Rp!+~z!3y4fpiXb& z^T41T)|kr5#G3dP->MiL?dH>UGOP2FMYwtgQ6-ME;2wrNODses)(Zy%&6`nQKf5P|kb-VZB;(kjXi1v=~{dDRpp8Kf=%nOj`Rmn)E zRz@e4avHScdCZRQ5y{oDVB5wjwccW>U$;PS$k^KQ!qcNxdYTXvZyfLXZ*^?#cVMcj zPOvw#Qfm!DP}rpUo(}te=K~^HNLEP|9)@9iBCVWpc=$XhLm6~5v=#=b4H=cUUdppE z^%MoM+*MbF`u_G>lOLzA&IrwLU(N50kdj;NDp6iv|9P9KwR(Pv*}If${Gf zz4$4q?_9bT%4r~$JfFHQv~vKi^YO8@9kg?Hwgy|B5f^>$&RcYlJ-4Iu zw+2VJ4P&|0C&Z~9(ke$sdt3D?a|>&$8AH$DQDI23{gtjtTB^3el%z4tCOuxBW$(jr zjhBF~ao$~-V-o?Whb~VV>`i0~d6N0Z&8Xm%rUnJhvh^8CtB$qXbiAZm^2yuEFJrqy zdfQUMc%TdD7z8ynH9o+o{TGudUH;g==IRdy+rEPwH68x`(9fS}|5Z!1%moQO>ly?n z4njt}$3Fi4Ksps$WDQ*tWVZ^xN`qRM0cEn?N~A~||KH(``yLjhGN<$ylc<(z*t^pp zDUon7-u(~!oN7cJ-)1Y`=FD-tEsB4wq^g5K^DG>L-m1$Lo#iP+MN5N&0)$;YHefwj zFDmBBoSe%;usJD1P(}|x@%EQXeimVdquNWai+FEPXT_du+$DFu_O)?=|KjCxAm_xq z<+BW~AET**3(XQ59Jq2)BXy+cZn$8oV{L6sFyM+0wDcdvn@DhFD=Hr3s7GN(fswa3 zEcsB}aro2x7mwa|!{eG37Z;OitcTmZ@o#IgZ=ucYAE z4XWDu2BwdkU$kLB1%MJ|McC@&dX~t0eM%E!LyM6BT-QqU{Fg<$h|b%b+UV%#|NWIAN|zXkv8c_y_X#m)h*9+bw4c- zgTeuJ3{~T6$!a#jh*3xYa{>1p%`PT76D+oi}aFV`O!=1u7x~xE1h@MhK-SHg>(KlM|(qQmm;yL8{wKk>zue zST<8CTY%J8E|1rI?yr~BT&<8+N#5uVua}GLsc|to-Dy1>Kb5A+v$*X2s#^1T_$Qvi z05LfZTz?f6evNRb6P!v03~%LY=DhuzpP$cx%b7B03gS~Z4;}-9FNcnI@Q#h&XBfmV zE$qyZS#v!5AsrXz4=gU~#V-Gt1Q5y=qOn%x8a6nU%`VM4*U0-ta$(WhGh}l73K09e z&nZ7~SiY+FQXHeKTlyJ|sUUX5kl8}>*{=!u-lHQI1cqzJ8~AJc-NvumIr;g7D=y^e23_CZXSkgF6j+&Cx})^00-!XMkviWTZ^3wh zDx2z`n5vp3s*fN}M7`OceI+Cz@{{zmXCd%s1R-x^5H~(&Oh}gzmwjD*JAXn zpP#h-W_EVTS0;b`9|KM!emyg6gW(kU*v8!si)5M499oT;bdCX zZiS_M~ygA}0S<)H(zbrtE(Ro9Nj3_p% zJrgfUaIzL7J~|jVR`HykT|qKnSz4SMToWXJ;ePaf=D7dEyNOz?#UdB$%GQlX`ug&z z{C_`|^4axy<#3s_@6ph<+?Q)}sM0a1jpj-)K=hMGDCgcSsyO~?UXVC^@61%S%e2|A zrA|)x;N>NQrG9AV@v;x)@*XzNUvsn^Q`}_O%2>YAKjT3iM!EAiibX^E8)=UEHx8nh zS9$8>vI~`FJv&RWQbEVDCKFsHkDDq310Hn3&$GgadS#LH=t}vTUKq!~(n>2JT==T_ z)RLEaj^a6Czpq{tfB48F6P)}nYk)2AQ6_+!w_vVxo(omWfFYZPQlN{Jo-#Y z>>$8wUPT1}5BLOnF8B`q+`pBJ+V3(=G(cRe^FcEfzPpO5q_!BsiS3o~ofpdAgZ{0I zVM^@+ONf2AR4(;MhxkM17tL~YDXJd$vL4Z>JZ33F@LF)@@vy|3>&_j+D(kt-M&G5^ zt$%($+Xl}0i|IXS2I5dFNNCC)+MeU0u!u02T&|vhX89cmwH|+`0hPB9+ofrbL!ONU zRSgVCX^vFka`u=jKUX2h@_bWH%Ef~B;ZM>25DR@5)w?V{sfH?<|DowDgW~AAEsQe^ zP6+N2hT!f5C-CCIU4lEo-Q6|#;1Jy1Ex0=b3$DREU*}fcDvILY4BdVD?6dZI*7m9b zL~tlzj~n?)5{8*O4AeIi{4X%#JXoNg@ut{%OdFb6^1I^XZI}VjXqd0-tA9(vP3?OU z-bp(Me~Kz}0qZo`it-X6q2h%W1sG}S$Ye*TM)7MiGyMEI`?;vDiObBUiA+nrLxv>L zhC&cI=RmotRLz&=F*e&4t+K}7w_Ojrhzl*~>8y|qO@_Xi@T;kj+96}A>DhJ6 zEiQ&80SKSh(@{yKTS4Y}`=g5D)YC(bkQZ4-dQO0LZ6+6ctP3;1-hN0@*tH=8)C^$T z1jybYfIK2agJE?>7o_Wf``4TIhXfrUth;S?sgM3m4%XkJfu)+NcXp{sn_xu< zXl_0?Y<-{k{9v^A3!p9D8qSc|oQVaMapOPJV4)$EuX42HNglJaG4iG&5@2L#i}K=1 z-M8I3xXIEkIb3du0=ystzB?pCUVfp9f3`0Jo$Z?mT%5&f?`TProl z)wmL1RROwm^{)^+yVLJ`v%Gf^zm>Q%Io^#RWKO)d7?B4U*}lHO{=+)TbX{g?nU{0d za$0fZ9xAdZzyQ5FI~et_e(>p{;gl2Q&vFf{-zH)?1ALKSCp~_k;ZS_@u}ewT!O}xL{x(L7w{0 zkf7Y^Kik=@54hk!mnP_R<6i!f+cXX_s{q>6yp#Md20b%NWMjsx%H@TFtt{s{=BI7hf)cz%t@4+r={c=x*%^FQW(cjhe@ zUC);T?-Zec5xcQ5WgmB)0Eo&#po$*IXEhST^dC~0w6Ypz3Pmluv&qT<;%F3 z7;6YUtu+1m=-0mje0;E}Ca}eA2{FwqTv}}r`H2*41ZY$^C~JuIBQ%L4dwbn>&+xfm z>}s*Z>$P4J+*(ZpAU6e&E+wfFf@u)dIc1v}`#mZd&-E0rRyu{;MSJ!Vnth&;SJyV_ zV+X&Up8u#I#f(Qe-3W}WP=$ww2gJWVz_40tIrpK%{zSc`%ouQi9Jc6ZiGQ92kVf~M z0z&anBMRiN?Q^9Ra5d$NKo5Tz=n3QbR)b$B?0x4lfI6MVwqgCO9uQ8!om5ehKA%wY zlwh_$qX8$K=3kzuXPe69c=4Lx*>nR3Wih5XU)CnfV_ygEAUh`~l3Mq5nQ6@~S~*|Q zqyyR1%<`5WW1Y`*Z5*-Z`LH}CCVOTnnzfyo&)#<0bbM*Aeo0kic4R|zj zOzlt>F{3zW*X9jw*jqs2gnwY5Y8QbYd@#Tz9U8L$g=pD#xSjx znKW6)81m;cTx>(X1t6}hudidj;PrK_vBbv3$T{1Ah&$|@9(J=5y!3j@I`taT&qix44QYA1S_wWyW&{LbRlD$`bjlJ9q8NyM!PZSkeTOjm3%omv@FQ}Hy` zlZ*&Tliz9L%w`ef3|+jN&{y`5TioQ-Ff6S8+MDI?3{DC>(;WGaa z)yq5lf%tggBnlN21aqcf5C4^G{F^{~J=(W}Q3i7Kdd|tKqG#Q+8LrzcNkq3l76w1J z@lz!&LqAFVJy;BWTW_r=X4afUOw{y;8oU93negk;rgMQtzi`m$(-!il@PDM*@j|)# zu)wc>O;Nq3M<31)AoyTW*!c(LWySL#YDCnPjMh2@1wOhCh^0Gn|Pi4ey|7HPbmek;b*T-ahoRBC0C zZKcgNYbMj_{gpsePX9Gh^d@1!xw)%C^`_71=4nrLr{CM-?bO-H)%LT`pz7L7ZIPa< z-85MbClO9dcL*EOl!%}CRJNl+rO&KtAWh780}oepYa}+Q2JtjBrt{<84ZI&fAwe}6 zcYH3q4E6&_I^ru$8%_5U#+54a#3dH2ZkJi!P5(lD9sGy1lwWu*wKGplOmuEP?NCLA zP|d2(O(3kQJEyK%jv4~P+a3p=O!)Ap2N`cz=#o=3 ztI!`?RwL4U6q%sp0~b5|-iU%$sP11S%R#Hd&&~yZ{mSvrY+LNrw~*qMB3p;Yso6c2 zt8#fyt-0gG8>UT6OcBe=8J3%D+XdbgS_bkeptVs&e==UM*iL|z+H6rd1^RIPNs7V| zKy<_QXv$bIs!c_~Hvz-uHN=1%XJioA2!t3|R>rSgxi}jDkDO|d=#S(N7*I%jfkX1& z(4?vCd7bF=!aG6C3A1nhm|1jCjgRlgCnjv;Q%Tjt4_3Z4TD_-eI;Z*EDuO$FI2VXQ zWQ~p`Hlu0XXHF@C3;Ki14S8*wpGHZ0>E+h3LR;*8^`A_W_E678$FnV!2-WY=o>Arf zbG04EG5SThZ7Dw)E)Q1)H+~2k=!Jxzt-0|#7y9`ZR0(KRs`G?TVSb{y@77>W`vVx8 z@&6eHlq%Jo``B?TA2%)5MNH`2x=jme&oL;YlA+2H z_5s^_jCC5yrQynuh&u>R+s+Gz6>L5m3E;!5f1AquGq4+1FlT8Ui@CNOj3@TJj0V#e zOGI`%2gv++odpfEsENb(ER<{5djM8lk}qS6feTje!Qis3cqFH~!lKj6`+vT8AixJ+ zDiiqnMr-FUbUyuKmuYq7DbTJhp>)n%UP z`MXw;uTIjMTz2KuHIwc0dJq@ih66^;RDzH1bK|R4t!CfT6A@8NBU(2t_b<-Z6qo3U z=JR3FRh>$_k0~GFg3=GPqO~aRom#(o;vwXe&?Zmieu^6$97Ohg*(JC48ew-P8NSfd z)Fe=f`JF{f%(Vg6Tp-jZqS$pIpfde#m~4#x3$4$?3)mTYgp;Ni^IiAP# zK(k`&_sGE(TclX6f3lmXjM?Oj@kQvRDW%Tlb@rYsuA~Kb=DjOFX~$RCf7aBaPdT6b z-ZBB=vaJS6C%1amlrA>?W!8U23xb!OoJ{2}?Q`mT&()yeBlz}!T}VGXJL>{4#joPg z(>y!S#l2A{%cSIjxic}4&!r9bk|@1+{Q@ayzk&~I#5RU_)e<9$ z;YQH-(0bc8nMUW4s!t9cUp(a89V(CZEO&-Gc#>Nrr@a=!JebVw)!BS<-Pk&GO~~+t zrA3IIMh6#bS+H-$^E>?p`2t5~UWOP75LU*@Xw2I&?uG(_801F^d$KCDc%AceSle!_ zz+1^bFz<+#fzS83+3&f%Q~#p-Vxzqoa|1h2O!V4)X>rk6&vvyvn($W;g35@f5?m=v zf#-=JV7-YY6N&`(0KUxX4!+J#t*m*ESUQsKhl8*`XZC)`jyRMu#sijM`m@D@^fs58 zLEG&nZxra?DG{{asSBMPRE-!0lV-oYEk$(OvokVBJo%*b-*y^ZUG5r{#gGlfWrcjU zzOZgy=iyFhwxgeaG|CH?Z45Q5k62hxdpR}#)F0<}_3kF0Ao8%E8sc~pB6u|N7L)Z& z@cFdf{c42H5fJixQB2?NPOIn;mS)i?;u8xtECaDZSQ*7WM)X{20WdPg=KU04KhoQL zHMO?5Nb~Ur%Fhx=QSPCDYVUkLn%%RKL(Xzj$ofe`FH4ApemQKh_~MbvpHAd%Oe@3I z=FT%)W`_{0;1L#{8~bs=TYpRZ{UALKdW!`i!)aBbAvXM;LWtS zT_$QjR=eB95P;A`ZM3^t3x|zhtYpMq04Cx-X>` zc@!4c1Z9uLSL$uJR^y65c6db#YO7?<$buBp?JhndT3NeLHU5U16YUEj>tB@CV8X2` zynCOOlOxuu3dfG0Nd?0-B^{1&9ugv1QNc{fh0Grqo!3DxDYC5}mOPq%{ow0=pqLGG zpJzs>+ze~wM#`6}c7Dzjw0IwZ1*N`SwHy0uTVuKhS|w7AK_jGl=b5K8Bx2s>ULa$U`lk)|AiBjR2{q5B?;{H@9z|)M5ih8|o zSg`3WVC;N2P1hb3anfR9LG z$;vqFu$8#DBm0MFt{WDHuC4+AKZYCz6FyQJnn7vAs$bSRmcd}dUR7pra8PYz`G+5f zBi-Q?ZB*&4Y$iK3kV_>jz3GjpdxKT+n_3S#q#Eu@ZEdyH?C?e3Q;|GjqyExOyo7Fv zj0kbzo&e)m#~>->@S}E{ znh%wWi|?I-Emu9CqH^`pt+jE6fvqXU@$J(XHIyM`)Tw%@UA;`zb&Vof#n{SfREzPZ zEZoXpW*;k(Q&K5=6)K%ZgJRW4Q~{@qO9%9@`o1WBia9IZO(~?0^u-pG(bIVmCx2qi zFAckGqv$utV6PacBQMw>$P5K43a) z;;X3UaWwqv3#{<9WfFL+e%c~5qCnV1!#6{j8sg`>jY!@IXdyc+ra8R%#qw~mkZy}R z(uM+Rm%+fW@Ds{Q+TSaU_()1F2}%aqe=;j)raX_>AfI&kLhyxGIF)s|XttSt!Hh!@ zc@eH-;vwnuX@t*EwiNXEmcJ0ryBlVNHZp~ZKRXtZHdbOUC6bi+hr;h=*zc-7TfnXJ z{&a<7=#o~neg)X%KgBL}p1Ul!yRpo2vT;i8XV5qOXKD&lF~EGV-U$nI7i5o5-y=}& z(9HgRkZaHI7>}O0XS1TGJ@?op{cg|^>q-~81t;KkHb6)IKqDBpayW)CZRl{25aZ~} z)=xwqj0I%IB)R`ikY*JShyq@X|8$Ah3m}$3qUf*JD|92=3C)Be5zVs>`|7zD(>ELy ze^MM2V#PJk<>TeB^YD#gUfjfG0iAcvX~y?MFcxT1nK7j&L?okdm5%MK-95y}pI2dh z$>$HTKYL~NaLljfi!e07#qgkLN$oMa};&0*Hj{;h~CH zkqX{27D+GNuq)WGqn1_KCEVyAJqG6pc;IZ<4cp%P$Ss*k@%dlxhoDJsgwBZ8UmC-yz%42M;t>g|m2Ab#a1psHgf;HQ`1*-y8M(W6S6_u5g+hsXeJjlHj z?d4?d$}M}TI#{=!L|oWTF#RlP41kE|^agRgRHG*t;cf|4B|swPoen5;>BfmmVI@)uo1Z`ufNa zAAgrQWgJKyR5(k%8#$O1k)??6f|=R-Ox{RPsJ~ykMXa@()m+!hetysGHTmKrO?bVW zQcN#fM77gWLJZN}x}=uI9uz9n4OD`&D&DNe4{liIrv=uyPY`NN2!9CHzkkBve7!Xw z0K?e9HOkd8M2%_M(xr-N{iFPj6(`Zu)`!YWoayB0caB*l*ytN9RtRU>^EJ+i33?b^P>-Ko~M(nFIj*HQk+f&lIsCcQd5C#`XQ?o$C-dO@)* zM#mWql3Z^={iuB@bGq;nn?F; zrM*wp+F6ynqTO}y@zitN|UmzSMVC~46r zH|mx354f)#ME!T(Q;pDwJ|tLIy2I}Y(vvI#gNZ(!>KQ#mGe9CG9ssBYCW8Sx>2jx6 z^EZXeoSYea4CQ#;sG4ENXyCP(?XHD*lLiFX{+@a}ol-boYrfdfsM2LqH)Q*vRteKk zR~HC`Q2`SCH@jJ_|IY9npU;}jrJBT)M&pZX(~UvdEgsz!1h~74RC|nHg3K)QwC~i? zE1d3$H+e<6M$8VqDGq`hze|s|jH4y_I8%((!tz;#Ez1(J%LYb!ko~$T=GiX!^jc=U zFG7eLjOMtm2E#sLypEVXSXi%O4v-T)+x>CS84D5FGhuEXo&yBpl42{UKUpj-!oN8o+HH%0{)e0x#a`T_BXO3ZeGe$-{$D zhh+`E(9{Nf@)28Um}4?l&N42+sxi{QYpQztA6Oe25XdAd8f^1)Z3Nq0SI6$)Ps}6X zP(V9T8f1EB?{%WH83~|*)WFhXuPJlDUuuE3d#k<97g%9uDd)TeltV)gkCpFy9tr_> zz^5vFPxx>9@>#Yq(60IUM$fG?@4jwy8m6YL&GS3fRX3I_I-+(uADa)w;q%mcpqZqL zR6l?h^#vb{Xg+T;!HB}GPyw>k9uW&*6Zy$Fo9DuWLDoTP@7_;b>vo}!8<~gqA9-CP zrpah$yeGfG+WAU7@;^ohG($T#p{+CW`_8@%z>*vRlmEY?1JFq3^|<=&e=WK=HQ2b% zAzxCllemCU`yp>d=7v*##;S4su~d_>&7-%mkqhY4Bk##d>P!>TlxQ+;&zBu2`W*fD zSG4OCjz4y{q-}#4Y!tp+T5FBr;Lj<~K{TD?#Zk!?6LNei+8;wx*1;(1ryesaM@$5c zw#tthCh$EIx){t3!^l%FH?``Y2)YfKA1#3MB1pQBBKsTCm1>0lHsz*>PV^^&kWE1$h=OKAw`!j*HgQItoHc}20fzi;|Q|DMW;RC!`82t zeIDvaV~I|($?PtFsRsX)(W&ic%5W9U-`5z4i7FzuG_%3bnkS@})iq&%AcFB<)T)A` zU-|7p%i^8c{n$<;-c=i+z(8rlbps7n15!8_ybV@M3_hB|#lnbT$%TBw zDuba#)2P;4;S|_}aPr8y(EEKRL9CAPoXp#aqON;@Xiij>Yg8Ls{RmZ%My1zpamFSy z6*s77Isx{~`5!J76}rO!Q)wk9IN0;;VzZkZPiD8TW6k(^n4YKETxLti;!L1HN%)8>M5hl_?FJX#gU#GtePAE zrpVcg)TB&~C*}9*F(or`=?X=?@h{i03E2@q%t#vwPQ( z$Z$kUReJsF>sek*1>b%8HC-RI1<40ihU+9M0kRS(mXD*fAWD7?S3XJ&Qft3&J+b!> z0HCAW&}I#Zd~=pyhgS-4bJzV5rb~tj3!$eb5H^X|L@O!5l*Owv9o1%%PT!abFK@n` zZB{j{op~^^K>;U@Y!N$Pfdo7>K$YwHrJO-)_{Z%nmqS%0S|LoEve%(Wb#>+L_@H@j zC)Yzx7$>{`r#cTIp4c&xGeoia}j~>89hGUE_=c? z#2`*Jw%9x!vVsSe_N^x=g-G+7Xf=L%Yb(~7opovS$>``uoTkX{4I+f%L~Jzq5uYn4 z_fJ0m<~N>^_^1;uff^1jU9gJ9k%<{m6jqWFwJj*kd_2v0C6e{Wf$9=*K4Xjddw7%l5efVZqzKLT^yVKHI=hAn73N(fSmj>rWBauGyb-XEE*2%r69_6 zPT4oA=Ii{s9U!}Ude5Xa+NmtqwOq&n4~Y16>No*ztzGjPwwSK>3i1u0qUM5Mda`|Q z1F8;n(;Axd;(+lCM*&JBGj`3eN)O3-8`eZO97#+ly*qt^fmR5UL{A}OV4N8Vsl-qQs3K)1Y*I<-!#HQ`;(fw`U zCFw(e3xOLc$ym*ZdFmb_)+=OQrrNi%k0a6c$$B)^li=RfhzD$q;5dAxSpD zE){z+Pi+eGmKm}vafLd?AHcM8=-OTr!{SwX(%jV;*xmTPHhTkj*aC`^Uz=BKg4i%6 zV3nH>Mu~-@WE}Qn$${V&Sq0S9S>m>hb9ojX{bV#!gx&;5tb3j&D>(*0`3RutC{qF_ zH6G&g7&Qt_9qXQJ!NS0Tv<9RmKUqRtWlj64fD{Cp#e_@Hf*~<(3WdZwJ4niETObZZ zlrp4m%J=Szkhc{lvy^;3+S*h7kB7UzE7~racjHmn2W18GXcgKD5odL_gNTNj6J1(& zP54Q)E=(*eyQ_`Xtm+(g{B#U*mP{FE5cQHdLRRkM=fy**Nb(1ZCY^Ibt@4HGBWK{v zeop3QXE&)#6wXE-nSVGCg+0w9B+kOb;sykJcBz!DzaM53RDAcyfdK2gN=k<<8P09R zi1!~BN*L?4^@ajw%n%XC2rH}L9S@s^EJZxk4ykIOrF*ofgIW0LfL``Tbdhj%q(rem zkMV~OcWQj~{!RAx?)8w%*xJl3)1S5pbh9DJIbVWQ^MNv@;FMW$waLSYRb>K(VIDR_KO4pU# zwKam$R2C|pN=51I>5tTqBpRPvIx+f0&V|@=t6feHZUt$X=U*1|#vBb7&kC$b%3#XE zIhiBHmhV?kU9r(GZn+eo%Vm=|Bil+?`uDCjo3Vbc)t^ic(Vn8GEjUTs{)q;$y8$?Z zKc3)4C>bgCj-CLK;e{dpH_Sg>SK4Mw$KIr<3k`q9we`QTF)XCG=={&bWhM09+C5iS zU}l3hBw2{yKCCJw1h$L3@0tK-K_X8HLDax#?%Ky)9~74ggYEB6_=;KpzoY4G6;%J_ zQ_B+-Vu4Z^BMtZIrRi<{?G*iNGPR6x!9C-~W)`i^?NO!`BbT#k87KI-UTZ1#hvOt{ ze&xq_l1kiHkMZHvReoUawW5iB^p{Ca#sPv-VslN>n&>Ix zW%IbzfFOz4z0KE+P1_D*xTi-Tt#5Yf=MOwEVu_Uus5c^MYAZn+(^?({@-BX;IWGC~ zVNM#GP6(7Y@+!Cok_87C1Ye}}SZcUs&GH9A{d=mZ4Ap`~5rr87K8E&0V{4_T2yCVn zea1ivN3YoKWjht&tr%MPyA&r*AHDCSw2&aDOIWhuT=T;p{(M1b|*zKu;9~SK^3vh;0Gq1tAEEO&zsV<#y(bw)(ZK8 zWIoPGgG@gJmf0))Xk?)H5CT@tz0c-5v7UP$AmMyYS<;14`VK#L8yr0_cs(FIdE}1 zAhPQoNh{uQhJQ!>dM6C_{$ZI!LmwZY*j6ehT+o7pL&s#F@;e^{AL7%Bckhy3Xr4Or zADq7A2pzRC>5KlSX)00srGOM&QmORGCtZ^gMpi@+QHGX)GTv8utUHn(W_J9iPeKYY?{dk;5{I{ zq-9tjRdlhz_>V|wdLY7}F^~in=!TLfD#25ZnyNs~K`Mpdk(^bW?r>l~iqvMR;?-dV)scR9an^Mfh33`+Y92`@WT#RnrFApIanMf-a zaEO>ukMV%;60n^?aV18vktjVoA)W^Un~pE<-%rChoUQf&2+Bf)osPJIPIYJq*6j*C z7L3>3sU*qp>Iq*2_LC`AHB0Y*AlUEzsw67KSYO{e5*75h!hWVS{Q-|gA1o)bg>IXh zL>U0|U+mPUFi`W2virT2_Sc4aX8)|o)zWWjjubGjERD9FkMDbsHfpFxPE)55vKVacuY^m!2 zNF0}C=SsfL8ou*%ckfbAo&Yrln_q#g|g1y9LR z2qSL=;2?=1hUZg6!bxzfsx&BLlq)6rvz8}W3w?gFy8h`PR)=HKFFdU*%2$<2dUpW{ z7-Xbo&TN%dmb4Gf6pEzF?hJ=Ti&oy#Xw{V>p__DFk+1(QV_!xSP6c>VIw7;)>l`mS zf$Un6U*wY55R-q_F(r1$7qbKRm-mFzx1O)E8O7*B%fRHc1uMix?e~E3ejxjPJ%CdI z7NsykSaX@pBNwl?&wH-dd5H$GRE#kbQvd3IB?1al#YuKQ7q@V2NBS>hj$sn%rnJ&y zy_a?BWcgGi9rO1Dg6iujnIB(%Dlfbt7(2U=oX&NVf%T7@LxJgYlcilnDrq+=#%! ziV8no%zwJeyMhzGMuOFyk}XUOQ3(!=Bt-z?RKXtkAl8jA=yUkU`z??X7XeJxxO5CP znr4l=5WH#B65o|tkl_($57i^k8O)P5y|Xbi7cyW(WxdEVhUbs;9MZC$E^(OtA#c6C zB0-%((xOgqW)4Wij7{<4zPM4l2+t&SuxtB`QE z&s9p`A45Uf3}0n`ZOVZ_g-eV3F^<>>!r#G9Qo>~LMx1n*i#!C!nQ$|(vlA_Hd|7%t z!XO^&tgqIGj)Z>o{C-(G%1srcNEWWfgHNP*QIZ>~M#L<46&MXJ|J50P$Lnw6@+_Hi zJfMB{4s9I<5~vRu*r9$G_r6pA+7S+Z<&~{H++^OAB$r2zfx6+qMAOTuJtE z*z}~*?AkHiouQ@42lK|L)n5B+ril96cdS&$i$0Mu6-GSDBD|Q0UC4Eyv+ef*6yAd> zj&TBbYFx|2tv|!$_ZbuW!v+bkuZ`6{F~EU7m%%bi3~f%1M~9|u<0lF-dmKT34sHmA zzgz$mjAft$`VUfATXKN>e&LD4!XGu3DjOd6n;gG?z!P|U&H}k;m59lDk9!pIP1Eqe zk6YHz?CX&sMtMIRTc#**H7*a=gmco=iG7UFBr*2AP(z|$1Q%HQ=r%bltk>xpW zWV0NyeV9DHW=P2P!r<5!*)4zFp#m1dWKfM?6BHiD#`TqVv`nv?TZ^07rVk^Ymm2<(8@5}YN`6BnmG)HKCrvGq?o4$|_fp-uN9SUjrfp!i z1#X&5VoNnLeQ8@^5{_r2u#6sl0#1H=dM%S;)&J7@5EtdXSQ z3>?m9uV!bAYfA^4V)V5eRYVg9KJOqfCef$B0S&}=@9DRY+N9gs%ogJF`X;u#%R^!=7`jWh`$e02_LT?i|Tm&2xm0Xt@vBrSZL4ybCo4#~HQ9TyF5&OJ- zgvKODV?lKjwIu{*h9GDF`^gi1&pgam(-Ll7vyonxOw)ZwqS^iz1smybNL0&oEo7jy zhjdtIW%OcS=X8Z)Qvds&(@KoWO5Hg68#^XABa$K}J4c-<1^&KKukYx{^3|tU`Qwxc z(6Quu`2jkliBLeL{IYrPTo8<<`cVx_4C~g|#}H>g>*0eXc#KF{J#m|YK)Q$hW9dEUb60mEcp&8A^(63&^cjt-Hz_Q3jOzSjns zH}2Nsv^yunbBuD9J182Ar5p}f)ND9b@1-WUJf)0)nMC=#oQ8GjOsFjqkyTOLyn+V+hfn3OyYv zRrzyAylmgrjvAGq3;Q+E0%D-jVT$0-LQ`HY2sd=XfBd8Kf6aLMSoL&I-}^KO*fL=v z@_tdEBc$LHRGWW6`vH?LG6(0WVUEQzKb@T`CTfFhic=vF^~;-dX2FsMwSFt=n<2#i zyH+2Ke9bSL{22?1SQF=Vy@s{3yxqrLtE0-V``%h?%!bmv_L-uNIw9Eg@JI#FpEfdP zC3CiAqGfkD^I6V2Q2wFlzxhY2s}WCj&8VCASfP|Km3wDwn1XwXz&N>Izy*Z`8cB~5 zxpUj;bp?T?_dUH`Z>W64mc@Q$b#4~W6=Cq+_G2k9?(?qF-@9_^@ zp$%A}b25KNIhZelGhK0RqMvpf%O^JMFaixgeD)`l!YdK>OVNbRcUDKwjouAP9qI0^ zF8bef%n0*JD#^;BcG!zl54WnAS0Wc}d38B3D4H5HqExBFi>H35I z_ygq-P@2gm{6ua&H$VtZ(iC;K#moYN7R+3Zo^!!)VotdKQNAc$W8#n*S^WS@;?fkN z7&0Y5Ww@WXKx{u<>)#PSqVWN*?og)=tmnu|PVu3}w&vOO5huPO(U3cj)5{Q_PZgus zPDRkpLnhfoY4d!DSgVcpubgvoci(X9rTyH#YKs|znQOs};3>t#qTyk(Mc_?y_^jyL+Yf?M@c1O13QHcCA89F!;55vNTZ_n!Ccp64OFR?vdB;$5 z#I!@2wCikAU7DT##1Jw6+&oq78id|Hw+mCGnrzE^eHg(+fe~Rjrjo%?{kR|u$KtY5 zS5x!wvz!TvKg+3CI}uY6(b~xPGttNnNP3kI8`pD3?l z;=R^ZF)Z|JY_tp)jAxO0rEN0_sIu=;<{uHMlux_-zK=l%tOd}@_%d#Rcbdk2i!AI> zQ`Q3LLSKy{{#%@j|1XbDBV4R~L99p@>G}z80jT4ForBIG1-7%L<)KALPBXh*wn)%v z%?($IV?ys^N&}fAl1`(n(7IeSaqD0gD-Pk5?%KE+)nBgyx%IH7PHE@ED_A}oUwe*m zukv5JyGj|o2_KvC&V)`MTef0Pi}LtL4`r<+|Ejd26+IzI!1TVnyv%5riY!@u!RI|# zx*Z5+CYPl>tDj{{?mrE7$|&|%*$RZ8UP~K(dN-yb@{W@NIP1e~sEF-NXF!5v*vr z-fBoUOI>%lZGgAZdqqj+)~IkE`KBl^en{{q(mP5lT@K*Ch6|itdV$q=21ClGt(uiG zf3%8xI5!~hP_+5pQNxa`wFiam#*OCQTd$#w6BTTN+qG5y_`>cw+W$bkqSx!hT8HQS zxI|ebmRJZcP~fEtx#1^WVuWufZ9VYV%Hn|;@BRp!1Xj=Pl%u}jh^^yFR+rGl6vZF9 zHilCxwwnDwv8?EiybKZ{he7w#CZ1zx(5{3X)^6Nx5Edl3(k5Ba_T+$ENF5dHP!ikH zPD_)LNxNW$p<{ey5!t*)CX(x~YsSHGOl(23MK-d1Zns4X28RTqe2mQJZuWbremkxn zDCdR(Jz26_!D9^ju8RUC2(QZ6KZDf8TlePR(-VKoR=jM$e*p^3$e+*v5kT-qD|s>w zD+lqC6^}9qHMaglSmLnXD0MogGKTNq+|2q;`3{pO(%EJ)l5EL#ee`Bj-F;5$?pNtE zQdgY*{F(y=i4w=HAgIc%ALz!P++G5~vOAaC{a7k_#J9Rmb>^4(ix2K_-8;7o=!cDs zjY(o4lptqK{1x8V+Et6K+_$4#z{=@(kY30IvIg`VY;23w<{VhBFLf+(cf}B_b*Fu0bhGB-#>j`xl9%KySA$< z$1?wrC!qudxT?Z>#EMXwEhC@#*woMj5PcvG6&t)vFygM3JMUA;$^`ZHt|*j%7@IjJ5$aJV*dCKp9Kc@ zzdRaP2AFv|n1oRGDz&uv@F%{LIi3nTG7yE>4em9b`BT#@+R8^Jm-3_|9or{=9QQ6{ zDZ=A97ia!#*zNR=;WjL7I4u;EIQAQUJvR}?)X4ZBQxmm^UlNO#La z(*l^Of$2ZZ*3n5y;$+C4LQLWMAXErm_l=uk_9r9PYfxB@#o^7t;$k%+eWEhr(1ld_jO@{vW%~Zn;RPbPAV^%;Kf6!lk=}A`t!8yUDIET zuSQ(@sn(j=zSMB+nJ&oEF4V&*6nJek61~@@bGtxQEeZ_oI9R8^^&yvhCNr(|l0RB_ z$@oVA#;fd%rZ50E1U@hx!2j`C^abBk5N@gk#iypG4DiI7Zk)m6u4@Hb#iMdmMEfu8Q(fV;?v==6_*O#>-J zfWc}db5ekB)yX>4uLPh>9Co;{rw#r-Eotx_;8%WSphQ@(T6pwPIwqV9b?vQNDV#gX zpV1Vr)s$*gkt|b1QVe+(ndNjL!i|K{Jr2qnB|umaY3jAUT|fPMW~+%r9twZZ-L191 zZZ+n;yldBpK*-Zubz)?R=I?Je&mqrr?C==VU62*-t#86F|D|BdV8NReOQ2^4c$gJC zKfq}t#@)ZHa4%$#Dhg``#e8KBhon8l!gS#~lVJ?Cqx)mmM!dtCcP0>2v#h^s| zL8Weoox7z{(SX|o)B62E{T_t-7sTj_SX6K*MKaU$#AqTxbP8YSVN_5EJGasO3)qu& zk-iBD@LbK3MFsa>doztgU9MnY(B8>Nh^qRJG#JI>;-sjoVD}N2Vg=?tk9EI{om*2u zfm!z~p1|C)-}dMJzoYDX&7am6bhNzyJmW`)FGCWkNmcfV) z$>*q7C6b*L&wZ_<%1t?A(g{Q(ZX{BpixVf6LcERXbL|gwDIYBj!Y>V7FU$*cqK_7R z=ZLIN|Lp8qrb|8{`gp_g zOQ8gP6w)Vl_(2CIFbbdfoX_X!CSXZ!q}F<=Y7>%HKDHQ^iM4wFJrzc|?dew57Pt5d z)^R@>PcjvJqPl0-G_ol!V3(iaoP%q?W#RJ6Bc!c+dbddKt;vcxHo04Og^IFOX|^*l z)FP#)x%)xGIe*&k1jy4fGdJJ%%5e-z@g$O5u_;HFPoXhPVeU&u!u^kAtai>eU!|(& z9*$|%qN3EmZ#a)--QytplaG9lE6n8qU_~kivKO}E0Lsf=8$+^Ey+4IPqla(!TpY!9 zeN{rb%6M~9VAbjzzP86+2h9ZDHFm~Wk@Bd}@oy@7#G?%uk-qT~HfyR7Km z(%B+Flb^9@kx5Wao+eIFsR8FZlE5p4?~?HY+TyxXie+A#j0W*s978?EVMOZ5&A8B8WE* z6blb9j4ORi(UqFCl32qOJlT}CFqnIiDufMPXnJHf(uBFAwOR0gwkpWmBiiBpwdExS z>Ww88n6_))KzKb={%9*`P^Ny%8IPMTEF1zC5{Q>olDK_Uglpg71=g5Ud3gv^E40PL z1p`pD{?bq7hgf}J<^cd^X#o8JyFVGIhrocijU&I;u)j~=#4bIBGNsT~y7vk-fhllh zapq({w)z~ADEYpB1p*;k5Ch1e`sLPT`b8xFQ6>N|)(jte47=UOcWm$&eUtuA!p)kZfxaq0KZzp?M#jiULE>WsXj7@GzD3O+6^pSc1K&lOQzg%L>C&Vr;U!G zQ+Q6MmXWFOOU}um%?U%fJ>?dnxy+@)8Y0(Y!)%OG2(fh55l(ba9gj5SU`)o7#hCrh zxBue&p6{RV`#sO+`}w`zueZbO96uGxwAMOHFh$Yy+!*-V#Zd{knfu=nZXHQi#Q8d1 zs`72DZt0|*uTvjhGi47QAYpiyw->N{@6uOoboEHhZDC)wh1^oWu0|opXXRq(?>;bIJes=$LT@gqm2P8PgL1>Vo@elT4{8AtmL9@ z<*Zk3K+I#NK7b&*+mzEG@7Dlik~O{C=r68r?SIbLy1)K^umG#*hSbHl^i!?Gd~sm5?d3x%KwZ^1VrLeG;2X>3vvVE zm_$?42jvfmt-fgteJ_KWjt>Om!?TfNdVYGD^*)c0$t~W(j9jC~zPqk8ANX2PweA$#bGa@zn0q&voBe|uq9I6|rEm4_ z=ABdR zWT9=Q)8OD>2(O9JT7Sy4)sP}C^t62Cke&8@!}&d_VjL`BLdGZJJ&*0x217Jko!np#zKqmT zRWp_)+rYEoJEEgzeu%U}^*3*;I=8&*wq44;=o_mdpShbTf(k`PLnyd&ta8zRl{JLH--Tu~5))>>!(|!K@)`iEL5!G)= zBn}O-@FdAe*x(4~pdIu5dpnfFaO5UkIa=_1!089hhR=PDlqV%8EPs+N!SZ2v^B#Tw zP4QHBWWuOj++tZw<(n?iR)h@b;V&mosY-vErFjY9O@Uy*0rxamH{%;Lg#H$@7HllV z3EUUQz*5b%(dWhZqdG56k(>(dAd!lPDPJyWB7RilxxnG`Ln*{JBmQcCNnRFCqboZN zkuo=DB|`!~fj3TzI@_kd=2W3+r7N|6#5r!YZNc&b%ausVik-60BiU>@Eu}>GYZvqk zXnC3w+nXlyj2&`RHFTyvBuf2PPT+37+P_^FjbAjuC#^dv6~JLm_9(Oe$mjEGem+t? z8SxR&#zrDoxt6?SNtO$G>@?fKzNcIyFF#G!MJs1tn%z9EpGh67$?sPhZ8v+J$iitz*r6-EI31kWn}nIV9Q>q^!QNSU&{M`oz8v&<#qy+(KK^$NNq>+|xhDKVtQ#z!Plo3HdKtQ^?OThW0L%K^^Qt}<& zTJMi|iymg(nS1X!d;e-jtEXDtMR2EoM!zdc$p+5msNvz3-s zSCE!waB*{fW9wiAfv_h9B#FuQNYM6~XvuP>5_u7O4yb4DWelNFu%eNN&*U<1(M%eeu})5R#*BRXjt6 zq5YF*EV?lbRS^?VLDk8Q9>u`&Tubc@Wz7+-$;Hv}8P|`R*5O+r?9|XfNVYt!MY9=+ zGx4yKf$&zqD*Txe{;|;USILJgf$PnCe`vOnd(elWG&857u4#HO&#L*pQipH7yuBo{ zlk6q~O{Ff2tED=-r2%Sp-KLU;gD#nyRHS-Rq)(#~HRP}mdQoG=N#;x{*RBulqt?`t zl%D8f#nBRclMG+K?7Cm}Zg}JB`$Gl)d&uI$xjQPHE3Xipp8Adi#}-fY%j}S6Wos2L zLYmaZXy`cIFyGaO#O}sFIYj#?(s`7^MV-w2*A~Bz=_v5k(g𝔒yI{IYU4C!Uqz_ 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𝔒yI{IYU4C!Uqz_ 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𝔒yI{IYU4C!Uqz_ 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𝔒yI{IYU4C!Uqz_ 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𝔒yI{IYU4C!Uqz_ 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𝔒yI{IYU4C!Uqz_ zW`lM#BBGFJQmYET)|QTzhM?iv>ua=1cef5Z@0)sXTd>WQH4ix!V1(cP8yJXscz4qjbk`*Qg^|!!Ui#5kVg%pU|7X9hCn%?h zpJLGpd$618PjNzg-@JKq^qt0;_Ih@@-K+N4=FSuKu;a3iv$@>Fo+^U){i{As!+P3Z zRTlj-j&t?;K_BpMH#3}_YGJ!t#l`HYuzhUU5qSGz>1wJWE@Jj( z_d|HT>?SJcY$GgR^H^99f~qE#9gUM=;vTHNdEn^i*x|od)z1+WWxsY$EPnNA*ng8u z{O&lRqwl1ZPh30!^^rTwO5d_ZpFO6!u&m7SaAIQOiy4&y((1XG*n6dqTxP>rVu@BW zSpl@?rs+?_K3)sVZ@Ju4))5c6 z9vn7?`@dSW*00}uzV3fueQo_ zw9?@ESeSKxR&glg`FrAJ*4D_(XtV@F@TX6<=bx-q=NWOk=>h@*#4(PR>EBBkB0aCy z*T1qTkXFyY+E4SjS9VSAg^B2dF*V4mg6{8}H&6b0Mwszg^HBS*(JXadUJAC~Y;fl_ zH8uTSX-xf3?QL6s5lJ5M{uSj-14?_1EaSasmp>yNUN2-nHt@%nniCA2n~+Z zqbWmYGdDL<0s;b4eWU@!pNfmR*{y>$9WA{Ix8~vfy5E7^6{K$~il#1FQ+^z7cs~ft zp1gY9Hi&{lHH-MhcA#TBeBf#*=99+st*Wr8Wz8dhzUev@c+kFpB;_fuqPb&h?N~Zi@cI2qDoBI3HuDDP&84-aMu!oLm|Q zm0g#3R`eQw6QEqQ_cl=~TS{cX+nv6UAjb6Y@{%H#T|arNtfn?T*cxzsP889VU}!j( zx852q#d!2@3tZ>92&rbjebEzFkqcJ>bu>ZN_Ho{6@{z=N^ z58d`q&7yZcqC}`_b*_&&wvXCAx(NRF0kwg{svyPpNVdr+BA5L?L+3WudkuCE7E*os zg#P21;Xumt0y8^b{7=f*$t+#fFgq-8$pfgOWpWD;XMQdR_tRQF9VdUW0(#3J5@E8= z%bN(D!{<&P^RoQ3)cy`w{=r6`kxvBBmCzk}3Mr4vu#<1C`K|1 z<3|)@#!n_%BI#tAw1Q}ngT~vQpbPIM+TRBU>9_a!QVDT!MvnSZ_ku58oQ*teKf;nv z#vJE!J)6|c)8@!&YQjsB$DMI_3`3dQ+7=arHZmXkO6Dx}R6Jyvswq7S?VMb!DBKRr zp4NPM;psE1@!(8vzqvK#CtatnG17=DQYt6dtqGKpkf|vhJ!H5xNBG~rZ~J{Qj(u)U zPEOqE>1kMx`wYuvX z$?e64O6F4)v0`$yReU4Nz%7zQm&)22ou7{bw@tH1#+YOd0hK^ZMitm5=yIg0Ws7(p z3`#H@=_a#e?(gmS4<~aUDyR$c^Hb8&(D?OMm*zpTcvVikRK_pOt8n8js;p3yX$5$o z?r@|g4sVgf_K`p%(BRt#2d{K>bty>I4;d@okmwrzo-U3GB#Xqftn)ve4AofuKJjN) z_vFI5&@>9#LMi+;$n5g z3-Bu9NX2|rE-tP+2OFF1@8(qlHzf@td3kvXkZiQ0LdcXM5=&)Vz37($v&a#F>FyL~ zT6+2`j#Me(Oz=H7skXp&`R(IlpLqcijp0b6SXsl8?(&WMvoCGFUHWai60-5Km8k{nDfFfd}C)KSx!QHW^V`SXk)k>Gf{@ z%orUTlY0Ip!mQFvT0D0&Z(zf1VC#gP93L|e8{#lijg^_1+5TXH=ELMkP#eCkTFBzl z?#lFxYJ+YIPA*kW*3$e&ONSdB!U~^+<9Lb?`nJFzrld}A+~bW>NCfU>`BYa>_g}p z%VrC_O;u#Q*_IQR5~TgE7IdX0`e%T-@odWQlT=P+%39;$L;UbqP{nV2*~zaC3RE)i zI|RZX)6;LE&D*7Kn!us%u~z!D)L^SZ5eV1iPPBJDW?%`f3?wl(uEsno{_v%+5U0zO zxa03n=gP*$sKv$CqPM5xjaR=*o_h4V&KK+0)qOZM;0-=pU%BUhCdIj-|5N2iHOm*j zW!Bj@XV4&}(>`bLd3ph3k~{+yG`FsfqN43Q-6D}^dwW}g?@`}Srbv;RivM9(mn3GG z$B%&jf?+M3G1&actkn;$pm_Y+sIa#ad3}V;Mo(2s0|g1u1?w_+O_h zZSo*XdU`rBE~dON9as*c!#(ggRh98Ot$fYDC*y@`K_cY%w;%8B?xJ5Xzbc`F3kiLy zgzfSot!|$NKjyK2p(5R6gbe|;Icuv64&_tnu}BcZmep|SqtIPm^gH}_0ZWXCcznQ3 zmf?F8j-43t zDB~J72py@@J2FVgL5kEiHtKEsu7VN7uMrbP?mXw^sDJGrtV`{WpaGdtC0bF7atE71kXD^1QX0q&dTjKNiaztI z6R^#uS~RyuM@L^n?&Gay`e7)=L`eq9893C1cB@1Wz!uQFs`N@@f>s{$Wo_jYb9fjR zF0lskzO_w%MKK!?s6k#r-m|MUC52`ea1iKHl0UY~YJ2l4wQH84hhnKA(9f#kp?&FQ z4H*UxiH#&XrG<(+s*=vX!EsBiBW1!vp=yh*_jc>irBYk7;vu=AjRaS}it&tgub@pd|p%P^FwEao`*xWIzcL@P|7AC%%pRC(2LLT@ptE+^!AAjE!u&VhK6fMIf zU&sp@5oiR&m}t%AW;QmsFaq`%&9ftpR7DD9X|C_Li5MXg6odVN0}jUM??1Mv$KtN* znDa>9=((*w!jg1p;&?~X-N{F|<*ePr(_6^4#Wu-v;OAoK#{F=n-GnT7N0heR?vs~p zVq?c{LotcTlvq*QRQ4Cu^?OU@0V?9+XTv9_zJmcVp^))vQv*uDt$>T?2dVGP^ebT) z5msiuQG5og5zRt7>%O--zSln35oW^EchIKv_=bgi)C^9xx24dVVnni+W^aSx1j4|lYJlyfx%(v!mZ();mw2{8;pR<#% zlg8Q<4Tl?QVFabTO%A%j%EVJ^c4;pvX6`O5o=g>Pd5IL_DQ%rH0q-@_dxc&Mrdbi5J ztCn)=;JvM#hQ>nQe*jEY!=w?XyiM|NQ|?Z^QQ`HrZ0XV&6WCbq2$0^i*xrq@`1PO94UI+p6L-t(@E zl(JrL(^-oPjM|5{T_~OQz@awjL<-4f>8K5R(P6ENL|QqRK)-8L|C(Un&E-EDkk?u) zHT?5uCf7$4sM9gI>M~(lLge^Z--_c+)nDanO6F@8tv<~th&F$|cKPKQ=VyBQ9HjGp zcvLIgxJ*j3;!h)iRGSSB-g)bTMMuwDBaA;Tt$}W3ma#1=!M5pqm8U1i_Q#TTPxI-a zn{6hCV#%Fj0r!DqEw6K=+b}gaeTIj_F@m-2ihc)p6Dxg>({t1yA9QtgT4&)r`S5QnpSs88OWyWaQFU;G4!mmQ*FFOu z=0g^-c1ovygMn9p7J3AS6&JL>S+jprr}?Ig4&#<0M_jYrot)w+cg`;^q!EZp7=g+- z11>s#I67%`@8AnpA-5(YJ6l`Z_Po3{M+b+AcvCtYF>-vy>|xzh$;n)nscyOHdMLpQx*HFVY|Q5$*+nEvx-HJIx)8Dofc-_=u^VR(fcdm z9x2#Cp$w+u1uEqmpIy=Ag3Y2T^y&C!+Ot)29*@IEmzEMt)xV$b&w)m&@V4#%?GwO* zC&S_ojHkN@&^saf`}>WzQ*$F@W2+*GfiXP%{I96Z>u!v7-SE_2{$+XWvyAq8c#7L!f2Rr>~z}GDL<5vJ}K0iCV9rD{AVVw6_d+#YUcHq8o^0xJKObOt6bi!p! z$ZWJ*u;Q^9Ils z#+cQZUL`fP2SeH7;@3G30=CD<)I_WJ>lgO+_6$Xbm&`?0v1JsbnvA3vh`;^#t)SU? z#(?YJ*FCcTrEkQuGvr!==Cfdt$B+~|`KzFN?0NqaPS8KVj{Kw?VekMTmiMoYQ6_g| zL@czIuZS>5W@e(x3>(UAqgmTt);ll7>%nyTm`bd6R*wZEA|hOd#V$&VZAvno%O;uY z%EPI`*|PmfABde2r)Om7a_+G{@9yoz`}9eYojfe{;p&@7j~EiI>ZsYcv#MB?O1!NG=ygu_Tj2`d!({ z6+OP&rpGAehlbF^UjEv0_t_9a!|%}f-+$1ntE=Cekb$KQx2Bka&d%2= zVO=9J{P>vZSi!sHEsp^Wg+n{5p?dI~4~l>T0ex!rn$Um!`D5{WMwcTtbWDxvWBXXN zVfU!MRk#X4vy;R)pD?4!I3SkfvhG)npMB)~ZL+o!IATI=_;n0eo$nsgvKJ@bG$q|44Fa_IsD>}eE3;1g@q{H31g?Mtn6|b=P;z8Xkg1T zo%+w}Pf)SRW!Yn-m`$aO5eN$Ijw}2>GqlP*?`%IMT78jWY#~HUWub=bt#{>LK)g0jx zEKP!rpHF(#u)Do)9I19Ef>rbvwisyquGo%P7B4j>Mk)s)NeooY?L+*~VDl>ZrsHZ@ z%C2ADl;B^TfQyTZg#7WH{PJ?H-@GkN1HHpWPO_%z4%#tAmwWdHQig_P-`O4>p$=sk zUg>Fbu-af_NRpG_haYX{B``fs82@4J{bZobD3_gyGIlgSbNvi~=tFUL#PJrYSp)_? zc6YBy%g+ACrLb{u02k1bHH_;sfA*n4=U#C2`dBof<)E1Whlp0MuHUFF(6i3>@U7o} zZGY!tZ66stWk)>kQVfTwmze?-M}e5+3(0w)q7leV#O;ktDX6 z6#IL#K9~aJ6$Dp;ZThbo>j%xkEnhyMOpQ9|q1aCuBwo|@BUI#*eq%>RJ1MYje4UukRy33ZD%%A(xmbk(a$2Zl5^V z6v~M=Xn%=9dPX!{+z8j3YHMptgP$+l)rcHhqzMa)G#?%Hi{oh|5=Uc_5LMaO6Rwcm zzv}e94@4_ECB?>WKKgtAE$m|`oEpO=REp=Xe97}aG%ys?qxa?>9;cVjDq783Ey5{f zkF|@m(T54t5rm@sEx9@^nq7QQoI-4;drN$QHgSAo?zO=~&eh*EA@4IV|EJD4ntFM8fyf0ZMjStqfI zqM)XROiN1(K{z!%M%19Av{c8=^4HJK4j;&kr;cPs6#*57@^de`dv^h8x7e!x!}*hQ zz_OZ;ojF8bOKUtPT5X;%IsNs^1gvqMO51VBW8b45QyAXTT>_r6%GT)kWX$zrlB3?B zOeu}Q<=KGU<0BLD&J$Xnsj?AD7RgZCU+Pr_JIilLnw?DT?Ch>^#4pjVF^bfo48dD(=a!1taWT88eibf<(N_dpAw=)@NRu5Y&kxAd zVb;fC9lPK665~V;e>wVoz0Uw`2=t|M_!hbQQ`oHE8J;ULu1ob$_4% zKvZw4?w(}3UMF|pU-z4ad+GlBBVAjExkr*uQv20{;Nb}Y2EEsZD(36{*w#T7U2tXL z*DOiqEnkFXG&)D~7JUtk?HJ7DEvZgC3+@96Y(0?;&8F;SJ1Ta2U1+(^8G*3Y;6-a zx%Yao`rJTxrYgXpOTFmS+dwLpVUncD@}YKf?zrXu-rv6iDHykni;Mg9OQ=W3tTS8+ zZEHAN&QDHcL!d`1U`=k9MaHk2x}L2X(f8?mF~iWcps;XsW@g7wWM*+uRU;EArj*hggs0DR0b= z^4ICi;Kp)2>L+p7-t7r{aEFJEh8Iy37P3L}Ut+O|vq9#iYHxle46u7BA)$u&yy2}> z>7OKKIpB;LV~HnO0Q*Muv!LXPI08YE&<}9%O2%<)|C*P@`4oQ|(n6v0l0W1)xtdSK z9jWRlYY(aZ-B?uLyK0vn0i1~Xdj6&56pvdNIld_scA;u!cYDBfu{jaX%XN3-XmgNcdAufqBX!L(m5*RZEmp6h)T`p}g!aw5?!Ny`G zn4SuiMBqp0M?@%80>KU}C6~*i6_lFz?Pa zk8wyi0-Al@n5EF!A|RQV;()RN8^j~rP1o{p%4A3%n7`LjM)e9gS3ZC~-IP&q}1tk3+p=$~jg61CnhPtiRPIH)R9z0hu( zp>jf6pjc)q7ub$b{s5x2b18D5xMU&`0sJ5bK%F!r zLx-fbKIIeU&gAJ3ik{k_?{@kk2*h(y(Kv8hl~q*!=0Ytg@UbzLe{JL%G#J*p6_x8u z0XPFJG(Z}SxV8*slm!VxCB>FInKG*D-i2oVr`Bk%3T>PnHo(dZtM~cwvXcqQvO5Lz)O;&!=C5WLY;f+85 z>IR;rNK?G~J2aQQc5=67_+?l~2q)E}N8LqQg(IV*A;319b7~=6QOBj+LmJoL>l$yY z=<-RFCbKAv@CC2=;I!$TJ6h?#VjvD?Q9v{bAET`FBg%JAWi?wZMdw-Nii>q7uVwQz z04`W^(xkP2=FCEh)&t>gJwnIEiA+RoX#W(uQ=Y5S z9e0EvtPsvMxSsGT@0lIZ!ncU)za-2bhPQT3TybL8MMS*zI;~%x=!+irl2yv1;O^8! zwI2zB*Mz7FLI7EU!C)Vpn|BJxtcO0oy}-ZC=ME@3T@HH??>JMPAGRi#_MOL59ccwb z$KTAqo8y7$W#sKST#5t%ygmI6YyPNR?7F1 zeMtRY4I9d)eV}ejaM$z(9p7d>tGix+5!vf!=o<~k?)A|uylXCuoDfC|wDhNuWXz+|CH zk4Q>VqN1Vcb8J|Mmue3l9o0zR%*x8@8`FGLr3a0TJpnk5JjE;mo!T?U7HcxIrD#%WuXl*C|X|b3Txa< zw+C1tLpFpf9td`)L8wSgDhL8i*7>`x#SZd&HnT6KY#xE z**Kn=_(_8QOI>#?w`a8`Rsuy$_Rh|c?D+pI*8s(bJ)mlia$f5pZP}&X`?yzmrppBWy3o|r}P0g+5`Xl%n9c*ZEZc|zh({s zS&!5?pEWMfsF2IzhA#YwgPda?Fk^5ikluE%M{n=%hUKz@bccN5I0E^ZxDZqF%XS0{ z7J~v>vl98+q$Re1*#W;$hA$mK7|P?FV`EHz{#xyQGShn}Wfqky@gBFyNg;W=gJrbK z73L^rX3-j#@@$z7HXSj6J1dnH?svv2PxLAAtFDK$vonR`#ICB(t#w6-BWi3N zOoQjIhsEzjUtTl~BNkv9M&4g4nG}|*%>gPCbl-#m6K#9%2?b$9j)kSigvOJ{&E<@b z-v5g_fba_yJ-r-9YWG@#c)W{X+**Ia8c^8FyVbLOR`CGG(`JMQ?wfMA-`1;qHiwku zYRbo(QT;bOJYKMLR1f(I!rE-V?#s~4ieRSWuo45Z` z9<%lp#w)&;qm->*S^s1TEcw?I=RjA+65T|cSBuKZ=qg(O{1^ev-~L9`h{$@-uST;- z6sgSeoL5BJRbf?^B38C}h6y!WT2AnA@q2eSdYQV{Ql-GC1S#$T4$zidk5^?|@2(^Z zqo(R#oh5uo_Gc%aa6%>J2nZWK?u*l!1$1b5iF+qHrBu#NK^ zOp&U358b@F4hzLoX*y<#n%j(vGXw;Vy3^{TTtCQeEqK3!$U6DEV=2VPMMst=I92uP6S<7G5`D( z_0$lG&-G$2QSzQXAetjIEd>dvw&F1fB*froT~degyCp}j{;b)nDMsgp#vdi%2aVg z3Zx?w6Cpc0)R>ldqHN1RU3P<|$X`qNtWoGAck6F*gWO@th{$qk)2^`RDsWh&dT_Xt z3tXk-N57|lyLSWKN&TW*%2~9t5;+Sckz|n##Da-9G3Udx7c{NJ(?5&{>=T+)1}&*t z0(t{37Gl9V)#{%5Zx3oPH(S|Q`>rpa^}nA(%;{0+lo$%oFY2%n1u7`^@%h}t(b?IE z`g*UzMjvCJ2e0|f;=UfgA72K%Z)Ul~X>P@)vU!IB}fZ*Z%G-XiR zAU%UMz7CJIxx7L`cn^t<1u}1ZFIa6|3ru>IoG!P-?}e~VJ&omxw1M9f%79xd7s=of zPtT49Cw8hZox7Db^&w2hnx8l&+&kzXOCEnFr8x<94Z);m5~l8xXe#v7qyo;@FC$yzcyiJdOQS`c8z~EiKllF9 zoHAqAJ}JBP*OoFjcx_gE*woTO1G++9_L9rm*$Bs@2)3csnb-$w=)>k~VN9Du&T?ot>TZ zqtCYKJ}co50W3Q_%0U5%URqy6U6Wi}dva)JoZ|sxq>D!sia{lE^U?(tDR$U`p=;vZ z(8d~SHD${zv8%TI1t(0>rJN`HdI*2gBE;pBE%XMWdY~lU)VTb=_3P*=U;{x#z~s&+9Z#Py6WpX4yoC z{8?hqg5Gnh+tEFvHaZfYv_4`UXC=4?TDUo$%1`JIMNhUnBd%DGss#(l0=U{t#sxKK zqk}1IRrf=;QQvdhCl4^ANiflp6|GL|Qkx zF7;PDrVqE@oam=NF7N+v5{4g*Ub=2wgNrExWC@&DPUg`MnEgD#R-slx>>Kz6)`g6J zV4IZV-vk4{h+H*XAQ%m~;E2%{fo+ynDoxu8`$x(Vk-30Nh~bqbOUv>?B2L2l=E-m$ zcTd{k5ux##2K(yl+j+W2p1 z=*oahQ>CrdL3l@hvL0V9fi6ErTvSw<6AdM_?*1$D8fArL@IGQ;QM>dSjV%0pZYsoz zS|-oT!^>0C#Lsm6)!t$q0o0niu-Vq!{0&;qN4Do3A9DCK{(Ra0o`UrOgdg zKhu=KiKc3`8kSd9M=`y(5G%ujHoC$K`#MI|>OxJ4vM~J;Bs&&rBr>DX6(9}>U0At+ ztxXR+3ANQ(`Bgm(XHE3M*ijaXI7cc^=H~+_tOssmXBWD@vm}}2nWNshyv*=VK~{VL zhfAcURo+CkZ2tb?@kdN!8=$=Q%;7DiLCfmm8bV27pkwJF`+&vG^9jmj)EEqO6|f_g z6p5rvSh`4~3l{dFUi-5uDOg|Cr;Od@mY;jCouwiNdcz4Gf+%Ifs+nT)`seY}$^)u2 z>@PYF$n4G&pL;s*Nt7F4r#DYlu>d>6CyMIt&NIrw+>!=1nCU(@b54N{g zXI}PPYHbDARK^VpG~JIp3P%THq)9c_XHr=3cZ&PqP+<{~5*@_`slstvko%2`kI&VE zjUlp*9B@VD)k)cy9X!3gJC3v1PnYg*mxf=r`nV>2ctL{2;_{)u7F3yc<-77Mq!ZjM z3M3uNiB|d^-gTX|&@`mNN4SU|8*`?rg^kU(V){sL3nrEEr|^!_L@$B=wCzZknVGlu z_dz_MVE(}$Cay@^T)P(Dh=;_E3lRXw?A?B&z+#Kf?%hzzOUugY>bTk4O3TW0S8VVp zhPnHg}sF1f9DR zP6&g2{qjj6Du=&c{Pm*1_gdwx#~+oNaS$cKSDahxAF<(h2-RLs%Q2ba@6&F z)%a+^a~d*)|9DU@)!9Fk(fE4Ha`Vd*G=v=w>=1}!w_MI=DaOc^ z6?X`gwh>J~;MvA4UZYOAqTI`!AsED%kHe)%Ms2$ZWqf=*QAUZwFQ1c7IVhjIzZR-y<XP`Jhs7J0isBWrB}r{NNy-rTYxWw~?%GUXt!lEH0{2tf-HD#uTRK zh5@w#uwH_6pD*A^N&)Jn{`=@u0hN^V@FxL>JTtB1Pp3|;RFW+k9Ooi{n9wXPy2GWY z!<0ZuA8$}=dn5$~LISVAKPB4}A-`)HCNRANPD?ql|sMB=8` zejmArXsvnAq;eRv>!2uu*GPf$x-e^w+PG&a3gdL?R1satVO6N=I3Rzqq$mIx3v_p`;1OE6xX2JvJGSAkhzNsZj$`3!Di&Q)j9uDAp^$Rp!+~z!3y4fpiXb& z^T41T)|kr5#G3dP->MiL?dH>UGOP2FMYwtgQ6-ME;2wrNODses)(Zy%&6`nQKf5P|kb-VZB;(kjXi1v=~{dDRpp8Kf=%nOj`Rmn)E zRz@e4avHScdCZRQ5y{oDVB5wjwccW>U$;PS$k^KQ!qcNxdYTXvZyfLXZ*^?#cVMcj zPOvw#Qfm!DP}rpUo(}te=K~^HNLEP|9)@9iBCVWpc=$XhLm6~5v=#=b4H=cUUdppE z^%MoM+*MbF`u_G>lOLzA&IrwLU(N50kdj;NDp6iv|9P9KwR(Pv*}If${Gf zz4$4q?_9bT%4r~$JfFHQv~vKi^YO8@9kg?Hwgy|B5f^>$&RcYlJ-4Iu zw+2VJ4P&|0C&Z~9(ke$sdt3D?a|>&$8AH$DQDI23{gtjtTB^3el%z4tCOuxBW$(jr zjhBF~ao$~-V-o?Whb~VV>`i0~d6N0Z&8Xm%rUnJhvh^8CtB$qXbiAZm^2yuEFJrqy zdfQUMc%TdD7z8ynH9o+o{TGudUH;g==IRdy+rEPwH68x`(9fS}|5Z!1%moQO>ly?n z4njt}$3Fi4Ksps$WDQ*tWVZ^xN`qRM0cEn?N~A~||KH(``yLjhGN<$ylc<(z*t^pp zDUon7-u(~!oN7cJ-)1Y`=FD-tEsB4wq^g5K^DG>L-m1$Lo#iP+MN5N&0)$;YHefwj zFDmBBoSe%;usJD1P(}|x@%EQXeimVdquNWai+FEPXT_du+$DFu_O)?=|KjCxAm_xq z<+BW~AET**3(XQ59Jq2)BXy+cZn$8oV{L6sFyM+0wDcdvn@DhFD=Hr3s7GN(fswa3 zEcsB}aro2x7mwa|!{eG37Z;OitcTmZ@o#IgZ=ucYAE z4XWDu2BwdkU$kLB1%MJ|McC@&dX~t0eM%E!LyM6BT-QqU{Fg<$h|b%b+UV%#|NWIAN|zXkv8c_y_X#m)h*9+bw4c- zgTeuJ3{~T6$!a#jh*3xYa{>1p%`PT76D+oi}aFV`O!=1u7x~xE1h@MhK-SHg>(KlM|(qQmm;yL8{wKk>zue zST<8CTY%J8E|1rI?yr~BT&<8+N#5uVua}GLsc|to-Dy1>Kb5A+v$*X2s#^1T_$Qvi z05LfZTz?f6evNRb6P!v03~%LY=DhuzpP$cx%b7B03gS~Z4;}-9FNcnI@Q#h&XBfmV zE$qyZS#v!5AsrXz4=gU~#V-Gt1Q5y=qOn%x8a6nU%`VM4*U0-ta$(WhGh}l73K09e z&nZ7~SiY+FQXHeKTlyJ|sUUX5kl8}>*{=!u-lHQI1cqzJ8~AJc-NvumIr;g7D=y^e23_CZXSkgF6j+&Cx})^00-!XMkviWTZ^3wh zDx2z`n5vp3s*fN}M7`OceI+Cz@{{zmXCd%s1R-x^5H~(&Oh}gzmwjD*JAXn zpP#h-W_EVTS0;b`9|KM!emyg6gW(kU*v8!si)5M499oT;bdCX zZiS_M~ygA}0S<)H(zbrtE(Ro9Nj3_p% zJrgfUaIzL7J~|jVR`HykT|qKnSz4SMToWXJ;ePaf=D7dEyNOz?#UdB$%GQlX`ug&z z{C_`|^4axy<#3s_@6ph<+?Q)}sM0a1jpj-)K=hMGDCgcSsyO~?UXVC^@61%S%e2|A zrA|)x;N>NQrG9AV@v;x)@*XzNUvsn^Q`}_O%2>YAKjT3iM!EAiibX^E8)=UEHx8nh zS9$8>vI~`FJv&RWQbEVDCKFsHkDDq310Hn3&$GgadS#LH=t}vTUKq!~(n>2JT==T_ z)RLEaj^a6Czpq{tfB48F6P)}nYk)2AQ6_+!w_vVxo(omWfFYZPQlN{Jo-#Y z>>$8wUPT1}5BLOnF8B`q+`pBJ+V3(=G(cRe^FcEfzPpO5q_!BsiS3o~ofpdAgZ{0I zVM^@+ONf2AR4(;MhxkM17tL~YDXJd$vL4Z>JZ33F@LF)@@vy|3>&_j+D(kt-M&G5^ zt$%($+Xl}0i|IXS2I5dFNNCC)+MeU0u!u02T&|vhX89cmwH|+`0hPB9+ofrbL!ONU zRSgVCX^vFka`u=jKUX2h@_bWH%Ef~B;ZM>25DR@5)w?V{sfH?<|DowDgW~AAEsQe^ zP6+N2hT!f5C-CCIU4lEo-Q6|#;1Jy1Ex0=b3$DREU*}fcDvILY4BdVD?6dZI*7m9b zL~tlzj~n?)5{8*O4AeIi{4X%#JXoNg@ut{%OdFb6^1I^XZI}VjXqd0-tA9(vP3?OU z-bp(Me~Kz}0qZo`it-X6q2h%W1sG}S$Ye*TM)7MiGyMEI`?;vDiObBUiA+nrLxv>L zhC&cI=RmotRLz&=F*e&4t+K}7w_Ojrhzl*~>8y|qO@_Xi@T;kj+96}A>DhJ6 zEiQ&80SKSh(@{yKTS4Y}`=g5D)YC(bkQZ4-dQO0LZ6+6ctP3;1-hN0@*tH=8)C^$T z1jybYfIK2agJE?>7o_Wf``4TIhXfrUth;S?sgM3m4%XkJfu)+NcXp{sn_xu< zXl_0?Y<-{k{9v^A3!p9D8qSc|oQVaMapOPJV4)$EuX42HNglJaG4iG&5@2L#i}K=1 z-M8I3xXIEkIb3du0=ystzB?pCUVfp9f3`0Jo$Z?mT%5&f?`TProl z)wmL1RROwm^{)^+yVLJ`v%Gf^zm>Q%Io^#RWKO)d7?B4U*}lHO{=+)TbX{g?nU{0d za$0fZ9xAdZzyQ5FI~et_e(>p{;gl2Q&vFf{-zH)?1ALKSCp~_k;ZS_@u}ewT!O}xL{x(L7w{0 zkf7Y^Kik=@54hk!mnP_R<6i!f+cXX_s{q>6yp#Md20b%NWMjsx%H@TFtt{s{=BI7hf)cz%t@4+r={c=x*%^FQW(cjhe@ zUC);T?-Zec5xcQ5WgmB)0Eo&#po$*IXEhST^dC~0w6Ypz3Pmluv&qT<;%F3 z7;6YUtu+1m=-0mje0;E}Ca}eA2{FwqTv}}r`H2*41ZY$^C~JuIBQ%L4dwbn>&+xfm z>}s*Z>$P4J+*(ZpAU6e&E+wfFf@u)dIc1v}`#mZd&-E0rRyu{;MSJ!Vnth&;SJyV_ zV+X&Up8u#I#f(Qe-3W}WP=$ww2gJWVz_40tIrpK%{zSc`%ouQi9Jc6ZiGQ92kVf~M z0z&anBMRiN?Q^9Ra5d$NKo5Tz=n3QbR)b$B?0x4lfI6MVwqgCO9uQ8!om5ehKA%wY zlwh_$qX8$K=3kzuXPe69c=4Lx*>nR3Wih5XU)CnfV_ygEAUh`~l3Mq5nQ6@~S~*|Q zqyyR1%<`5WW1Y`*Z5*-Z`LH}CCVOTnnzfyo&)#<0bbM*Aeo0kic4R|zj zOzlt>F{3zW*X9jw*jqs2gnwY5Y8QbYd@#Tz9U8L$g=pD#xSjx znKW6)81m;cTx>(X1t6}hudidj;PrK_vBbv3$T{1Ah&$|@9(J=5y!3j@I`taT&qix44QYA1S_wWyW&{LbRlD$`bjlJ9q8NyM!PZSkeTOjm3%omv@FQ}Hy` zlZ*&Tliz9L%w`ef3|+jN&{y`5TioQ-Ff6S8+MDI?3{DC>(;WGaa z)yq5lf%tggBnlN21aqcf5C4^G{F^{~J=(W}Q3i7Kdd|tKqG#Q+8LrzcNkq3l76w1J z@lz!&LqAFVJy;BWTW_r=X4afUOw{y;8oU93negk;rgMQtzi`m$(-!il@PDM*@j|)# zu)wc>O;Nq3M<31)AoyTW*!c(LWySL#YDCnPjMh2@1wOhCh^0Gn|Pi4ey|7HPbmek;b*T-ahoRBC0C zZKcgNYbMj_{gpsePX9Gh^d@1!xw)%C^`_71=4nrLr{CM-?bO-H)%LT`pz7L7ZIPa< z-85MbClO9dcL*EOl!%}CRJNl+rO&KtAWh780}oepYa}+Q2JtjBrt{<84ZI&fAwe}6 zcYH3q4E6&_I^ru$8%_5U#+54a#3dH2ZkJi!P5(lD9sGy1lwWu*wKGplOmuEP?NCLA zP|d2(O(3kQJEyK%jv4~P+a3p=O!)Ap2N`cz=#o=3 ztI!`?RwL4U6q%sp0~b5|-iU%$sP11S%R#Hd&&~yZ{mSvrY+LNrw~*qMB3p;Yso6c2 zt8#fyt-0gG8>UT6OcBe=8J3%D+XdbgS_bkeptVs&e==UM*iL|z+H6rd1^RIPNs7V| zKy<_QXv$bIs!c_~Hvz-uHN=1%XJioA2!t3|R>rSgxi}jDkDO|d=#S(N7*I%jfkX1& z(4?vCd7bF=!aG6C3A1nhm|1jCjgRlgCnjv;Q%Tjt4_3Z4TD_-eI;Z*EDuO$FI2VXQ zWQ~p`Hlu0XXHF@C3;Ki14S8*wpGHZ0>E+h3LR;*8^`A_W_E678$FnV!2-WY=o>Arf zbG04EG5SThZ7Dw)E)Q1)H+~2k=!Jxzt-0|#7y9`ZR0(KRs`G?TVSb{y@77>W`vVx8 z@&6eHlq%Jo``B?TA2%)5MNH`2x=jme&oL;YlA+2H z_5s^_jCC5yrQynuh&u>R+s+Gz6>L5m3E;!5f1AquGq4+1FlT8Ui@CNOj3@TJj0V#e zOGI`%2gv++odpfEsENb(ER<{5djM8lk}qS6feTje!Qis3cqFH~!lKj6`+vT8AixJ+ zDiiqnMr-FUbUyuKmuYq7DbTJhp>)n%UP z`MXw;uTIjMTz2KuHIwc0dJq@ih66^;RDzH1bK|R4t!CfT6A@8NBU(2t_b<-Z6qo3U z=JR3FRh>$_k0~GFg3=GPqO~aRom#(o;vwXe&?Zmieu^6$97Ohg*(JC48ew-P8NSfd z)Fe=f`JF{f%(Vg6Tp-jZqS$pIpfde#m~4#x3$4$?3)mTYgp;Ni^IiAP# zK(k`&_sGE(TclX6f3lmXjM?Oj@kQvRDW%Tlb@rYsuA~Kb=DjOFX~$RCf7aBaPdT6b z-ZBB=vaJS6C%1amlrA>?W!8U23xb!OoJ{2}?Q`mT&()yeBlz}!T}VGXJL>{4#joPg z(>y!S#l2A{%cSIjxic}4&!r9bk|@1+{Q@ayzk&~I#5RU_)e<9$ z;YQH-(0bc8nMUW4s!t9cUp(a89V(CZEO&-Gc#>Nrr@a=!JebVw)!BS<-Pk&GO~~+t zrA3IIMh6#bS+H-$^E>?p`2t5~UWOP75LU*@Xw2I&?uG(_801F^d$KCDc%AceSle!_ zz+1^bFz<+#fzS83+3&f%Q~#p-Vxzqoa|1h2O!V4)X>rk6&vvyvn($W;g35@f5?m=v zf#-=JV7-YY6N&`(0KUxX4!+J#t*m*ESUQsKhl8*`XZC)`jyRMu#sijM`m@D@^fs58 zLEG&nZxra?DG{{asSBMPRE-!0lV-oYEk$(OvokVBJo%*b-*y^ZUG5r{#gGlfWrcjU zzOZgy=iyFhwxgeaG|CH?Z45Q5k62hxdpR}#)F0<}_3kF0Ao8%E8sc~pB6u|N7L)Z& z@cFdf{c42H5fJixQB2?NPOIn;mS)i?;u8xtECaDZSQ*7WM)X{20WdPg=KU04KhoQL zHMO?5Nb~Ur%Fhx=QSPCDYVUkLn%%RKL(Xzj$ofe`FH4ApemQKh_~MbvpHAd%Oe@3I z=FT%)W`_{0;1L#{8~bs=TYpRZ{UALKdW!`i!)aBbAvXM;LWtS zT_$QjR=eB95P;A`ZM3^t3x|zhtYpMq04Cx-X>` zc@!4c1Z9uLSL$uJR^y65c6db#YO7?<$buBp?JhndT3NeLHU5U16YUEj>tB@CV8X2` zynCOOlOxuu3dfG0Nd?0-B^{1&9ugv1QNc{fh0Grqo!3DxDYC5}mOPq%{ow0=pqLGG zpJzs>+ze~wM#`6}c7Dzjw0IwZ1*N`SwHy0uTVuKhS|w7AK_jGl=b5K8Bx2s>ULa$U`lk)|AiBjR2{q5B?;{H@9z|)M5ih8|o zSg`3WVC;N2P1hb3anfR9LG z$;vqFu$8#DBm0MFt{WDHuC4+AKZYCz6FyQJnn7vAs$bSRmcd}dUR7pra8PYz`G+5f zBi-Q?ZB*&4Y$iK3kV_>jz3GjpdxKT+n_3S#q#Eu@ZEdyH?C?e3Q;|GjqyExOyo7Fv zj0kbzo&e)m#~>->@S}E{ znh%wWi|?I-Emu9CqH^`pt+jE6fvqXU@$J(XHIyM`)Tw%@UA;`zb&Vof#n{SfREzPZ zEZoXpW*;k(Q&K5=6)K%ZgJRW4Q~{@qO9%9@`o1WBia9IZO(~?0^u-pG(bIVmCx2qi zFAckGqv$utV6PacBQMw>$P5K43a) z;;X3UaWwqv3#{<9WfFL+e%c~5qCnV1!#6{j8sg`>jY!@IXdyc+ra8R%#qw~mkZy}R z(uM+Rm%+fW@Ds{Q+TSaU_()1F2}%aqe=;j)raX_>AfI&kLhyxGIF)s|XttSt!Hh!@ zc@eH-;vwnuX@t*EwiNXEmcJ0ryBlVNHZp~ZKRXtZHdbOUC6bi+hr;h=*zc-7TfnXJ z{&a<7=#o~neg)X%KgBL}p1Ul!yRpo2vT;i8XV5qOXKD&lF~EGV-U$nI7i5o5-y=}& z(9HgRkZaHI7>}O0XS1TGJ@?op{cg|^>q-~81t;KkHb6)IKqDBpayW)CZRl{25aZ~} z)=xwqj0I%IB)R`ikY*JShyq@X|8$Ah3m}$3qUf*JD|92=3C)Be5zVs>`|7zD(>ELy ze^MM2V#PJk<>TeB^YD#gUfjfG0iAcvX~y?MFcxT1nK7j&L?okdm5%MK-95y}pI2dh z$>$HTKYL~NaLljfi!e07#qgkLN$oMa};&0*Hj{;h~CH zkqX{27D+GNuq)WGqn1_KCEVyAJqG6pc;IZ<4cp%P$Ss*k@%dlxhoDJsgwBZ8UmC-yz%42M;t>g|m2Ab#a1psHgf;HQ`1*-y8M(W6S6_u5g+hsXeJjlHj z?d4?d$}M}TI#{=!L|oWTF#RlP41kE|^agRgRHG*t;cf|4B|swPoen5;>BfmmVI@)uo1Z`ufNa zAAgrQWgJKyR5(k%8#$O1k)??6f|=R-Ox{RPsJ~ykMXa@()m+!hetysGHTmKrO?bVW zQcN#fM77gWLJZN}x}=uI9uz9n4OD`&D&DNe4{liIrv=uyPY`NN2!9CHzkkBve7!Xw z0K?e9HOkd8M2%_M(xr-N{iFPj6(`Zu)`!YWoayB0caB*l*ytN9RtRU>^EJ+i33?b^P>-Ko~M(nFIj*HQk+f&lIsCcQd5C#`XQ?o$C-dO@)* zM#mWql3Z^={iuB@bGq;nn?F; zrM*wp+F6ynqTO}y@zitN|UmzSMVC~46r zH|mx354f)#ME!T(Q;pDwJ|tLIy2I}Y(vvI#gNZ(!>KQ#mGe9CG9ssBYCW8Sx>2jx6 z^EZXeoSYea4CQ#;sG4ENXyCP(?XHD*lLiFX{+@a}ol-boYrfdfsM2LqH)Q*vRteKk zR~HC`Q2`SCH@jJ_|IY9npU;}jrJBT)M&pZX(~UvdEgsz!1h~74RC|nHg3K)QwC~i? zE1d3$H+e<6M$8VqDGq`hze|s|jH4y_I8%((!tz;#Ez1(J%LYb!ko~$T=GiX!^jc=U zFG7eLjOMtm2E#sLypEVXSXi%O4v-T)+x>CS84D5FGhuEXo&yBpl42{UKUpj-!oN8o+HH%0{)e0x#a`T_BXO3ZeGe$-{$D zhh+`E(9{Nf@)28Um}4?l&N42+sxi{QYpQztA6Oe25XdAd8f^1)Z3Nq0SI6$)Ps}6X zP(V9T8f1EB?{%WH83~|*)WFhXuPJlDUuuE3d#k<97g%9uDd)TeltV)gkCpFy9tr_> zz^5vFPxx>9@>#Yq(60IUM$fG?@4jwy8m6YL&GS3fRX3I_I-+(uADa)w;q%mcpqZqL zR6l?h^#vb{Xg+T;!HB}GPyw>k9uW&*6Zy$Fo9DuWLDoTP@7_;b>vo}!8<~gqA9-CP zrpah$yeGfG+WAU7@;^ohG($T#p{+CW`_8@%z>*vRlmEY?1JFq3^|<=&e=WK=HQ2b% zAzxCllemCU`yp>d=7v*##;S4su~d_>&7-%mkqhY4Bk##d>P!>TlxQ+;&zBu2`W*fD zSG4OCjz4y{q-}#4Y!tp+T5FBr;Lj<~K{TD?#Zk!?6LNei+8;wx*1;(1ryesaM@$5c zw#tthCh$EIx){t3!^l%FH?``Y2)YfKA1#3MB1pQBBKsTCm1>0lHsz*>PV^^&kWE1$h=OKAw`!j*HgQItoHc}20fzi;|Q|DMW;RC!`82t zeIDvaV~I|($?PtFsRsX)(W&ic%5W9U-`5z4i7FzuG_%3bnkS@})iq&%AcFB<)T)A` zU-|7p%i^8c{n$<;-c=i+z(8rlbps7n15!8_ybV@M3_hB|#lnbT$%TBw zDuba#)2P;4;S|_}aPr8y(EEKRL9CAPoXp#aqON;@Xiij>Yg8Ls{RmZ%My1zpamFSy z6*s77Isx{~`5!J76}rO!Q)wk9IN0;;VzZkZPiD8TW6k(^n4YKETxLti;!L1HN%)8>M5hl_?FJX#gU#GtePAE zrpVcg)TB&~C*}9*F(or`=?X=?@h{i03E2@q%t#vwPQ( z$Z$kUReJsF>sek*1>b%8HC-RI1<40ihU+9M0kRS(mXD*fAWD7?S3XJ&Qft3&J+b!> z0HCAW&}I#Zd~=pyhgS-4bJzV5rb~tj3!$eb5H^X|L@O!5l*Owv9o1%%PT!abFK@n` zZB{j{op~^^K>;U@Y!N$Pfdo7>K$YwHrJO-)_{Z%nmqS%0S|LoEve%(Wb#>+L_@H@j zC)Yzx7$>{`r#cTIp4c&xGeoia}j~>89hGUE_=c? z#2`*Jw%9x!vVsSe_N^x=g-G+7Xf=L%Yb(~7opovS$>``uoTkX{4I+f%L~Jzq5uYn4 z_fJ0m<~N>^_^1;uff^1jU9gJ9k%<{m6jqWFwJj*kd_2v0C6e{Wf$9=*K4Xjddw7%l5efVZqzKLT^yVKHI=hAn73N(fSmj>rWBauGyb-XEE*2%r69_6 zPT4oA=Ii{s9U!}Ude5Xa+NmtqwOq&n4~Y16>No*ztzGjPwwSK>3i1u0qUM5Mda`|Q z1F8;n(;Axd;(+lCM*&JBGj`3eN)O3-8`eZO97#+ly*qt^fmR5UL{A}OV4N8Vsl-qQs3K)1Y*I<-!#HQ`;(fw`U zCFw(e3xOLc$ym*ZdFmb_)+=OQrrNi%k0a6c$$B)^li=RfhzD$q;5dAxSpD zE){z+Pi+eGmKm}vafLd?AHcM8=-OTr!{SwX(%jV;*xmTPHhTkj*aC`^Uz=BKg4i%6 zV3nH>Mu~-@WE}Qn$${V&Sq0S9S>m>hb9ojX{bV#!gx&;5tb3j&D>(*0`3RutC{qF_ zH6G&g7&Qt_9qXQJ!NS0Tv<9RmKUqRtWlj64fD{Cp#e_@Hf*~<(3WdZwJ4niETObZZ zlrp4m%J=Szkhc{lvy^;3+S*h7kB7UzE7~racjHmn2W18GXcgKD5odL_gNTNj6J1(& zP54Q)E=(*eyQ_`Xtm+(g{B#U*mP{FE5cQHdLRRkM=fy**Nb(1ZCY^Ibt@4HGBWK{v zeop3QXE&)#6wXE-nSVGCg+0w9B+kOb;sykJcBz!DzaM53RDAcyfdK2gN=k<<8P09R zi1!~BN*L?4^@ajw%n%XC2rH}L9S@s^EJZxk4ykIOrF*ofgIW0LfL``Tbdhj%q(rem zkMV~OcWQj~{!RAx?)8w%*xJl3)1S5pbh9DJIbVWQ^MNv@;FMW$waLSYRb>K(VIDR_KO4pU# zwKam$R2C|pN=51I>5tTqBpRPvIx+f0&V|@=t6feHZUt$X=U*1|#vBb7&kC$b%3#XE zIhiBHmhV?kU9r(GZn+eo%Vm=|Bil+?`uDCjo3Vbc)t^ic(Vn8GEjUTs{)q;$y8$?Z zKc3)4C>bgCj-CLK;e{dpH_Sg>SK4Mw$KIr<3k`q9we`QTF)XCG=={&bWhM09+C5iS zU}l3hBw2{yKCCJw1h$L3@0tK-K_X8HLDax#?%Ky)9~74ggYEB6_=;KpzoY4G6;%J_ zQ_B+-Vu4Z^BMtZIrRi<{?G*iNGPR6x!9C-~W)`i^?NO!`BbT#k87KI-UTZ1#hvOt{ ze&xq_l1kiHkMZHvReoUawW5iB^p{Ca#sPv-VslN>n&>Ix zW%IbzfFOz4z0KE+P1_D*xTi-Tt#5Yf=MOwEVu_Uus5c^MYAZn+(^?({@-BX;IWGC~ zVNM#GP6(7Y@+!Cok_87C1Ye}}SZcUs&GH9A{d=mZ4Ap`~5rr87K8E&0V{4_T2yCVn zea1ivN3YoKWjht&tr%MPyA&r*AHDCSw2&aDOIWhuT=T;p{(M1b|*zKu;9~SK^3vh;0Gq1tAEEO&zsV<#y(bw)(ZK8 zWIoPGgG@gJmf0))Xk?)H5CT@tz0c-5v7UP$AmMyYS<;14`VK#L8yr0_cs(FIdE}1 zAhPQoNh{uQhJQ!>dM6C_{$ZI!LmwZY*j6ehT+o7pL&s#F@;e^{AL7%Bckhy3Xr4Or zADq7A2pzRC>5KlSX)00srGOM&QmORGCtZ^gMpi@+QHGX)GTv8utUHn(W_J9iPeKYY?{dk;5{I{ zq-9tjRdlhz_>V|wdLY7}F^~in=!TLfD#25ZnyNs~K`Mpdk(^bW?r>l~iqvMR;?-dV)scR9an^Mfh33`+Y92`@WT#RnrFApIanMf-a zaEO>ukMV%;60n^?aV18vktjVoA)W^Un~pE<-%rChoUQf&2+Bf)osPJIPIYJq*6j*C z7L3>3sU*qp>Iq*2_LC`AHB0Y*AlUEzsw67KSYO{e5*75h!hWVS{Q-|gA1o)bg>IXh zL>U0|U+mPUFi`W2virT2_Sc4aX8)|o)zWWjjubGjERD9FkMDbsHfpFxPE)55vKVacuY^m!2 zNF0}C=SsfL8ou*%ckfbAo&Yrln_q#g|g1y9LR z2qSL=;2?=1hUZg6!bxzfsx&BLlq)6rvz8}W3w?gFy8h`PR)=HKFFdU*%2$<2dUpW{ z7-Xbo&TN%dmb4Gf6pEzF?hJ=Ti&oy#Xw{V>p__DFk+1(QV_!xSP6c>VIw7;)>l`mS zf$Un6U*wY55R-q_F(r1$7qbKRm-mFzx1O)E8O7*B%fRHc1uMix?e~E3ejxjPJ%CdI z7NsykSaX@pBNwl?&wH-dd5H$GRE#kbQvd3IB?1al#YuKQ7q@V2NBS>hj$sn%rnJ&y zy_a?BWcgGi9rO1Dg6iujnIB(%Dlfbt7(2U=oX&NVf%T7@LxJgYlcilnDrq+=#%! ziV8no%zwJeyMhzGMuOFyk}XUOQ3(!=Bt-z?RKXtkAl8jA=yUkU`z??X7XeJxxO5CP znr4l=5WH#B65o|tkl_($57i^k8O)P5y|Xbi7cyW(WxdEVhUbs;9MZC$E^(OtA#c6C zB0-%((xOgqW)4Wij7{<4zPM4l2+t&SuxtB`QE z&s9p`A45Uf3}0n`ZOVZ_g-eV3F^<>>!r#G9Qo>~LMx1n*i#!C!nQ$|(vlA_Hd|7%t z!XO^&tgqIGj)Z>o{C-(G%1srcNEWWfgHNP*QIZ>~M#L<46&MXJ|J50P$Lnw6@+_Hi zJfMB{4s9I<5~vRu*r9$G_r6pA+7S+Z<&~{H++^OAB$r2zfx6+qMAOTuJtE z*z}~*?AkHiouQ@42lK|L)n5B+ril96cdS&$i$0Mu6-GSDBD|Q0UC4Eyv+ef*6yAd> zj&TBbYFx|2tv|!$_ZbuW!v+bkuZ`6{F~EU7m%%bi3~f%1M~9|u<0lF-dmKT34sHmA zzgz$mjAft$`VUfATXKN>e&LD4!XGu3DjOd6n;gG?z!P|U&H}k;m59lDk9!pIP1Eqe zk6YHz?CX&sMtMIRTc#**H7*a=gmco=iG7UFBr*2AP(z|$1Q%HQ=r%bltk>xpW zWV0NyeV9DHW=P2P!r<5!*)4zFp#m1dWKfM?6BHiD#`TqVv`nv?TZ^07rVk^Ymm2<(8@5}YN`6BnmG)HKCrvGq?o4$|_fp-uN9SUjrfp!i z1#X&5VoNnLeQ8@^5{_r2u#6sl0#1H=dM%S;)&J7@5EtdXSQ z3>?m9uV!bAYfA^4V)V5eRYVg9KJOqfCef$B0S&}=@9DRY+N9gs%ogJF`X;u#%R^!=7`jWh`$e02_LT?i|Tm&2xm0Xt@vBrSZL4ybCo4#~HQ9TyF5&OJ- zgvKODV?lKjwIu{*h9GDF`^gi1&pgam(-Ll7vyonxOw)ZwqS^iz1smybNL0&oEo7jy zhjdtIW%OcS=X8Z)Qvds&(@KoWO5Hg68#^XABa$K}J4c-<1^&KKukYx{^3|tU`Qwxc z(6Quu`2jkliBLeL{IYrPTo8<<`cVx_4C~g|#}H>g>*0eXc#KF{J#m|YK)Q$hW9dEUb60mEcp&8A^(63&^cjt-Hz_Q3jOzSjns zH}2Nsv^yunbBuD9J182Ar5p}f)ND9b@1-WUJf)0)nMC=#oQ8GjOsFjqkyTOLyn+V+hfn3OyYv zRrzyAylmgrjvAGq3;Q+E0%D-jVT$0-LQ`HY2sd=XfBd8Kf6aLMSoL&I-}^KO*fL=v z@_tdEBc$LHRGWW6`vH?LG6(0WVUEQzKb@T`CTfFhic=vF^~;-dX2FsMwSFt=n<2#i zyH+2Ke9bSL{22?1SQF=Vy@s{3yxqrLtE0-V``%h?%!bmv_L-uNIw9Eg@JI#FpEfdP zC3CiAqGfkD^I6V2Q2wFlzxhY2s}WCj&8VCASfP|Km3wDwn1XwXz&N>Izy*Z`8cB~5 zxpUj;bp?T?_dUH`Z>W64mc@Q$b#4~W6=Cq+_G2k9?(?qF-@9_^@ zp$%A}b25KNIhZelGhK0RqMvpf%O^JMFaixgeD)`l!YdK>OVNbRcUDKwjouAP9qI0^ zF8bef%n0*JD#^;BcG!zl54WnAS0Wc}d38B3D4H5HqExBFi>H35I z_ygq-P@2gm{6ua&H$VtZ(iC;K#moYN7R+3Zo^!!)VotdKQNAc$W8#n*S^WS@;?fkN z7&0Y5Ww@WXKx{u<>)#PSqVWN*?og)=tmnu|PVu3}w&vOO5huPO(U3cj)5{Q_PZgus zPDRkpLnhfoY4d!DSgVcpubgvoci(X9rTyH#YKs|znQOs};3>t#qTyk(Mc_?y_^jyL+Yf?M@c1O13QHcCA89F!;55vNTZ_n!Ccp64OFR?vdB;$5 z#I!@2wCikAU7DT##1Jw6+&oq78id|Hw+mCGnrzE^eHg(+fe~Rjrjo%?{kR|u$KtY5 zS5x!wvz!TvKg+3CI}uY6(b~xPGttNnNP3kI8`pD3?l z;=R^ZF)Z|JY_tp)jAxO0rEN0_sIu=;<{uHMlux_-zK=l%tOd}@_%d#Rcbdk2i!AI> zQ`Q3LLSKy{{#%@j|1XbDBV4R~L99p@>G}z80jT4ForBIG1-7%L<)KALPBXh*wn)%v z%?($IV?ys^N&}fAl1`(n(7IeSaqD0gD-Pk5?%KE+)nBgyx%IH7PHE@ED_A}oUwe*m zukv5JyGj|o2_KvC&V)`MTef0Pi}LtL4`r<+|Ejd26+IzI!1TVnyv%5riY!@u!RI|# zx*Z5+CYPl>tDj{{?mrE7$|&|%*$RZ8UP~K(dN-yb@{W@NIP1e~sEF-NXF!5v*vr z-fBoUOI>%lZGgAZdqqj+)~IkE`KBl^en{{q(mP5lT@K*Ch6|itdV$q=21ClGt(uiG zf3%8xI5!~hP_+5pQNxa`wFiam#*OCQTd$#w6BTTN+qG5y_`>cw+W$bkqSx!hT8HQS zxI|ebmRJZcP~fEtx#1^WVuWufZ9VYV%Hn|;@BRp!1Xj=Pl%u}jh^^yFR+rGl6vZF9 zHilCxwwnDwv8?EiybKZ{he7w#CZ1zx(5{3X)^6Nx5Edl3(k5Ba_T+$ENF5dHP!ikH zPD_)LNxNW$p<{ey5!t*)CX(x~YsSHGOl(23MK-d1Zns4X28RTqe2mQJZuWbremkxn zDCdR(Jz26_!D9^ju8RUC2(QZ6KZDf8TlePR(-VKoR=jM$e*p^3$e+*v5kT-qD|s>w zD+lqC6^}9qHMaglSmLnXD0MogGKTNq+|2q;`3{pO(%EJ)l5EL#ee`Bj-F;5$?pNtE zQdgY*{F(y=i4w=HAgIc%ALz!P++G5~vOAaC{a7k_#J9Rmb>^4(ix2K_-8;7o=!cDs zjY(o4lptqK{1x8V+Et6K+_$4#z{=@(kY30IvIg`VY;23w<{VhBFLf+(cf}B_b*Fu0bhGB-#>j`xl9%KySA$< z$1?wrC!qudxT?Z>#EMXwEhC@#*woMj5PcvG6&t)vFygM3JMUA;$^`ZHt|*j%7@IjJ5$aJV*dCKp9Kc@ zzdRaP2AFv|n1oRGDz&uv@F%{LIi3nTG7yE>4em9b`BT#@+R8^Jm-3_|9or{=9QQ6{ zDZ=A97ia!#*zNR=;WjL7I4u;EIQAQUJvR}?)X4ZBQxmm^UlNO#La z(*l^Of$2ZZ*3n5y;$+C4LQLWMAXErm_l=uk_9r9PYfxB@#o^7t;$k%+eWEhr(1ld_jO@{vW%~Zn;RPbPAV^%;Kf6!lk=}A`t!8yUDIET zuSQ(@sn(j=zSMB+nJ&oEF4V&*6nJek61~@@bGtxQEeZ_oI9R8^^&yvhCNr(|l0RB_ z$@oVA#;fd%rZ50E1U@hx!2j`C^abBk5N@gk#iypG4DiI7Zk)m6u4@Hb#iMdmMEfu8Q(fV;?v==6_*O#>-J zfWc}db5ekB)yX>4uLPh>9Co;{rw#r-Eotx_;8%WSphQ@(T6pwPIwqV9b?vQNDV#gX zpV1Vr)s$*gkt|b1QVe+(ndNjL!i|K{Jr2qnB|umaY3jAUT|fPMW~+%r9twZZ-L191 zZZ+n;yldBpK*-Zubz)?R=I?Je&mqrr?C==VU62*-t#86F|D|BdV8NReOQ2^4c$gJC zKfq}t#@)ZHa4%$#Dhg``#e8KBhon8l!gS#~lVJ?Cqx)mmM!dtCcP0>2v#h^s| zL8Weoox7z{(SX|o)B62E{T_t-7sTj_SX6K*MKaU$#AqTxbP8YSVN_5EJGasO3)qu& zk-iBD@LbK3MFsa>doztgU9MnY(B8>Nh^qRJG#JI>;-sjoVD}N2Vg=?tk9EI{om*2u zfm!z~p1|C)-}dMJzoYDX&7am6bhNzyJmW`)FGCWkNmcfV) z$>*q7C6b*L&wZ_<%1t?A(g{Q(ZX{BpixVf6LcERXbL|gwDIYBj!Y>V7FU$*cqK_7R z=ZLIN|Lp8qrb|8{`gp_g zOQ8gP6w)Vl_(2CIFbbdfoX_X!CSXZ!q}F<=Y7>%HKDHQ^iM4wFJrzc|?dew57Pt5d z)^R@>PcjvJqPl0-G_ol!V3(iaoP%q?W#RJ6Bc!c+dbddKt;vcxHo04Og^IFOX|^*l z)FP#)x%)xGIe*&k1jy4fGdJJ%%5e-z@g$O5u_;HFPoXhPVeU&u!u^kAtai>eU!|(& z9*$|%qN3EmZ#a)--QytplaG9lE6n8qU_~kivKO}E0Lsf=8$+^Ey+4IPqla(!TpY!9 zeN{rb%6M~9VAbjzzP86+2h9ZDHFm~Wk@Bd}@oy@7#G?%uk-qT~HfyR7Km z(%B+Flb^9@kx5Wao+eIFsR8FZlE5p4?~?HY+TyxXie+A#j0W*s978?EVMOZ5&A8B8WE* z6blb9j4ORi(UqFCl32qOJlT}CFqnIiDufMPXnJHf(uBFAwOR0gwkpWmBiiBpwdExS z>Ww88n6_))KzKb={%9*`P^Ny%8IPMTEF1zC5{Q>olDK_Uglpg71=g5Ud3gv^E40PL z1p`pD{?bq7hgf}J<^cd^X#o8JyFVGIhrocijU&I;u)j~=#4bIBGNsT~y7vk-fhllh zapq({w)z~ADEYpB1p*;k5Ch1e`sLPT`b8xFQ6>N|)(jte47=UOcWm$&eUtuA!p)kZfxaq0KZzp?M#jiULE>WsXj7@GzD3O+6^pSc1K&lOQzg%L>C&Vr;U!G zQ+Q6MmXWFOOU}um%?U%fJ>?dnxy+@)8Y0(Y!)%OG2(fh55l(ba9gj5SU`)o7#hCrh zxBue&p6{RV`#sO+`}w`zueZbO96uGxwAMOHFh$Yy+!*-V#Zd{knfu=nZXHQi#Q8d1 zs`72DZt0|*uTvjhGi47QAYpiyw->N{@6uOoboEHhZDC)wh1^oWu0|opXXRq(?>;bIJes=$LT@gqm2P8PgL1>Vo@elT4{8AtmL9@ z<*Zk3K+I#NK7b&*+mzEG@7Dlik~O{C=r68r?SIbLy1)K^umG#*hSbHl^i!?Gd~sm5?d3x%KwZ^1VrLeG;2X>3vvVE zm_$?42jvfmt-fgteJ_KWjt>Om!?TfNdVYGD^*)c0$t~W(j9jC~zPqk8ANX2PweA$#bGa@zn0q&voBe|uq9I6|rEm4_ z=ABdR zWT9=Q)8OD>2(O9JT7Sy4)sP}C^t62Cke&8@!}&d_VjL`BLdGZJJ&*0x217Jko!np#zKqmT zRWp_)+rYEoJEEgzeu%U}^*3*;I=8&*wq44;=o_mdpShbTf(k`PLnyd&ta8zRl{JLH--Tu~5))>>!(|!K@)`iEL5!G)= zBn}O-@FdAe*x(4~pdIu5dpnfFaO5UkIa=_1!089hhR=PDlqV%8EPs+N!SZ2v^B#Tw zP4QHBWWuOj++tZw<(n?iR)h@b;V&mosY-vErFjY9O@Uy*0rxamH{%;Lg#H$@7HllV z3EUUQz*5b%(dWhZqdG56k(>(dAd!lPDPJyWB7RilxxnG`Ln*{JBmQcCNnRFCqboZN zkuo=DB|`!~fj3TzI@_kd=2W3+r7N|6#5r!YZNc&b%ausVik-60BiU>@Eu}>GYZvqk zXnC3w+nXlyj2&`RHFTyvBuf2PPT+37+P_^FjbAjuC#^dv6~JLm_9(Oe$mjEGem+t? z8SxR&#zrDoxt6?SNtO$G>@?fKzNcIyFF#G!MJs1tn%z9EpGh67$?sPhZ8v+J$iitz*r6-EI31kWn}nIV9Q>q^!QNSU&{M`oz8vO=>-rDEh^!?+z&vTRgoLcW1 zYFM?_s@mr|_y6zDr{3h;S3A?o&i(z)r#jQ?B}Yu{p78fMOK0!9Y~-b7Q@h_=HfQM- zBflGQy{TQ-+r@wG-0LrGS|0oMMa6C{#H@>^cK6&dATqT39ArEO8Th|eUP|@h7lRBh zPt5FP2-lm`XrkJBKrg^@#8GEX>MmS)*Py$gb412VsED>6aqjcbe>2#@|5cN#Ru5WH z_Z$&4;=jGDca`dpZD@Ju^;|1$QN+1Fp*%wz`tqjbV{cnjOomp9(DBIZbKB3DRvxq0 zvSO_k;v8sl*iUBrF;}#6KL=t1Abv7)dOhjMDcx7r4bl~%vYq>n_2-nwKeS;MQLZLj)No0kQbOerJCmv_%nnZN8@W!JPTd{mY$)l{fD6YUkCH zZ?BYUm-nyPy{wqy$2>>+SiPr?_Hy!4363rH;3M}&qMFVG4}|g8VeEZ*cx;9^0zOllHU#clJYf9 zLB=LPT=}*|)n2fiKHPRPMFhVacQ|(nR_!$(SypWTgtjPOdhkh48sc~$?%8Wub$9gb z)}jb{rE|8K8=?VDK>qZ&tG%-Bj6zNBik@4+K?j8cI7_a0A zCoMT*iXhle=&zc6rHDOuoZOvtQLr}GYB|ON`)xg`g}8Lt{nycMCbuirUq z?3`XJqoP(yWuFJF;HeGKGpex={5-R~XS~L;JRlHd)QB=FMj6&8Z28O46S|u}IM?qP z%E`w*HDaHNv5z9AZaK00!Y}4|grc28Tv8)0sTh|iFQq#Cwbf*g`p-M}u0LPgP+k9( z+bgB2cA3!q#nW^B&Y2^ypV!#W``ph}hEi!CI*0wd#(v)Cey%NwxcvUr^8LKVe%|MP zu2k3GyIObekzKu3IRg86js3jC{aj@z6}4qH8O8(qd5!(N!~I-a6hYZ3hKsYL;A&Ka zJ##Lp>}Hk>AUK+qr7F6ayB?vul*&F2a~G?&#;Wab)pA8yrl?ekb`JY_js3jfey#|m z3O>fNJH!k%Vg{e9X^SG%CdUY%#?Dr7S5t&iahI?h4tW$1*ry8HqpU>{^zD`#dY=e? z$e&)8530OeMxYLe;4OoNir`LdvJ-tX&b?GG0J@>av}@Ps|ZVVgw&WZhKKnhEi#- zJGbl3ulDbOjE7q?E-NN?Z@4$eplp-p-0rhq?c8zKVdXne15mz7wfD%Bgm!PcVwGa& zID(0)7|EzI8PAqC6xZFgciBHNm!Sx)KOkZS;+sJHu~nH+gjOk>+aJ04yf}9gRWYJe z>GL5(0E$RdV<8G4)bhk@EX#@b*WdO#M_`ulSNqC8KgRKxA^k?gSAW;ppuFajA-YUKGg4AJ#%`wX)(Q2t(5AnYo;W0aBd+h@-qJWh}oWRMwQ8U zFJ|H&Ufi_2xFtgo+K0|<3B-EvK3{+x+L9sencCfKVYF#Xt?m&jMLYM;sCaz~J`pvt zOok#-)rh^jD=JZMLJjNhutQrEam{UObmy0>Goh#5*1z4b{N4tkI;e>BJS20BGWG)X z1whfDL{*FoT{o@!fwkGwsH#aVE0>{trBvy2&fU+WKK2AEcavK+GNn>niWSdeNGvtV{Lo`GyeCOS4ny?@|)u^ z<{t>FDIK??oS-~^nXmPg+L9qQuzsUf+PjKK z&)T~(9zGvTRAB@yn@FE?JfaMbU|$8Qu@IE86L!rfhFD(8A*tNW&s^f~X7DaHrS*GXQL`Hnb zAooMeV6`{KII2l5!vS$L5DS2?>OdQzoSa(=KKDJS`^<02P`*~{3-Q&z193ev;q!se z7DceuZ&`73^5ZK-im+!!dbw8d9A^N*2+8Vjiq2&yFQu~2Lu9Ekj4v&;XHpqDSk4nN z*2!3{WwdRTMx!D^(a!ONjI}sBC9_JZB9xPJjPzM2W2CPw%9k0yk|V6j8S@Wcfz%d7 zFsij`q`8t%tv%uIlM^qoNjc>Rt&6IL87G6#U)9=@@kLzXdS=H*kvCrgtLNZXsWRO& zgjLi+RZVz->ccOF+N;WTZVhA;Jh$U7V=9y0mSJe;KJY-le>SLDVaa%j46XG#ha9Iu zR^;a{Wsn!=PevtZKjsy(J3rcIk3&9Lx%`@hE1T&ci?U3Ddklodm z-8H?dRFJXP=24!zeCXBA<98iaPmWoU@nU>E=l#3+7>>P=5Xd?E$T@4vIZcLAX|MYX zvX2b1W(JwH2w&!(CfjF_ePoceWsr?@AkP12&?-kDgRGE2*32MPhEmxnKo~)sJ6AY& zu6gdPEsFTfyC*e0?W+bAss@}TJw@0v$5~}(2&XNhA;K&{23aA4teHWoCd_MXJaVmY z;$Gpz-LG2XOAD3CP8x#cI6trUf#2o%xwa@mE4TjUfSs}Q6k*TQU1j?d_ZlbeHBa1? z@AS1Nb%(B-@8?x611Ih^PTVV=xEo*Ut5mG8@pLiR!Bd}j#?sRkd!|;($!FUYvhAAL zwrZuls~Y@jfG%jDVFyVudysA z0(otPyq0UQOnp*}O#i^7?gPhjmducTBLdlWg>1WKwyg+O4UT(0AQbI0;R=~>%}iLe zQmXmo#O^h>aReos;4&|Na>JzVnWwUjKVw9x6b%mt{?C4RS@mj5h9a~NeO6Q>E2@|k zX^SE@Ux<^9dw8-DwL-kWpI)ggicoERu2v>C*{)3`M7N3id8CuNs+G#mq}v6mja* z3EiJv6MDqwoHepk<{v#pq~{@-W0Zl6rAE%_GnPbEjC|^{aIV6fGkwmPh`iQhIJHBm z(&t1V+pdvqSIoBcR7R;3ooUrenvA6t?RW(H)1vOH{pXPt=}C<8O`NC|@~9elREK$# zB9tmW$3d=EBUkG%SJM_nP@df!Y3wLCPZCw(d(^1X=hO2IOa)R<$>tS0YUFAKb2V*I1pRTkM;3RSlD(@4d*+U#vYVZA0Kwgo_v~zsN@qnX zLwSuRgXsM1P7(G@D(%BuE7OF1V$Z5o=quiS;62EY-K8@j)k@JmyQ_E)(r#JUIgTQj zEv54)-hSX&QONF6i}Ga#VCOr|#rq}xbV*wj!MMv#nmBIE?D*5m&WcnMw0z)hwQG8?5<>Xr&O8l86w`REmL+Ed4Y;2N*uvlD`a-b9k*LO!!Tmf&uYO)7>4-(8cT+F45!y03f_5B+81W0JhrbZx#L%OKk1XvZ zCZQ?g-H0qV!5;Ou7J?C()!P{X8rr!Hkwei_Bir^7a+nz{8Hle3&ZFoPeY|VcbH=zv zmCKlb+?nUKJbPAs6`{S3D14Je)f<7h9Cm1nBC?ae*jWBtQcIMufJYRyxt>vSxaloL+|d5nFvG?5is6n23nfuV&vglCO6vpuIk}m{PxNT zkFDO_a;0F$=<+Dzt!vMzCU5?7b@sD+X9&vRJ5e{Da_C5g_CmrxVYWB=0P7$^O$T;gg zle>@HGAJXHZ8Cc7U2Rc$$zyQLF?UOwyQ5PTBRK*>z@IuoQxS}Zitvj&x5>~Cv#Ees8IxW{0<;&-99~3#Un|$0u z=;%~o1Qp@M^sINSMKx5}MxDmP5FF<_&Iy_*+9TpWy^{0l@CO2wB62(8Y%e(5l}dXz zml4-s!8NEd6p?YVb?(Q5>+YAY4UR{~iQb34q%`l-nZ%l2K7tu1F}+u6OU4)Le4Cvj zC-d!o6i25DdwW7y*ZQ$nUU)VQRd%CPuZ^JR)Lt-jgTOS}am`!Bmo=yCVYf7@3~fSs*1JZ< zJG+f0G8g<^=ML^U*LK%A++iq2+6d$1MSwqla?2H=qvj zRB?FgzGfAN_i4kqe2!2~zQWQ$g{5YNMO!ky>|K9HgJT|Vl83dfEzR?gzZV|vHbew# zG6RS-HmIryI+vkZDOLKMH5t4;(81dSwY@!H_e(OWOh&vz@3l%);YPgO%g{b-Zryu? zwj^}8Pi?m$d?mF&CADTHRqypAwDuM4h^xi1zGms~4zgycyp&4kaab7sU+$dZos~+_ zVRa}VQo^p>b}{sNY#+p5KgB9znES}EfE>{jt#x1L_E z^!tAQ!FY4oZu}~hqH{Y`Uq$fqR8I_62g|iZ5tNZ`U>}2#yZyd?pZ}+O!NrIo(p_H8 zlHWeRY55-X)%7hqRCn#e=6<`sIiM}+IozkV9%3PV%5fN@K)ACF3zQHeX&a!TNr@`(5s|-aucLESU+jLreW$Siy zhRALe{|N6hT#tK8Yqex3U%f}@c=A)?UduD6H%L9rSrX4CXh$#Yec=SlcAT`s z5rH?{`gp^w<{NH2C2Q_e%1)LzaRlQ@obRjD63)DAUrL`7f%m-nc*m=@_q>{&o-$%g zl@QcQWb}AeWKl+X4reSW0>C?172d(B`3{!y(kLvUDFgNP67}|y^>(d(Wbr37v}ifh z^642_(JT>0n>GKVqbmyuiqq$SYS%ST(#vaw-9;I5TCg~0n5!h>M?6n>4wc4Tx z?YI2?l_Jvfklb{mjCi}v-`Gl2;hv@4ph}-}4Jsntvl$$nNuI<*eB^h}=L zoonpQ1$XBpJ@l^466NG$pBk}G!PrMzw14!}Iv;awQH0J=??r2P(Slx7Whgq?)V5q( z(z9AlMEc3shn|3|JinjU*w0Ju=X&2GX*lF>vD*C!zn|CG&r9y-dfO~RWH-;SpV!#W zOYY|?L+#L;Bh9G{$J~1#tCy%(Q(xJ5(VCSBwpgWzyNsRDs_*jqdBtx^vpd^%w@x+G z+c5stWQkjo9p0MMcgYx2+5N;6KXSI?Zf%LXwFU3ia)-1#6O7yK)&t|9Fn2kE??83% zf4_cu|2wGlov>(X_tqEr-3iNm)=1C!iPN4NdFk8sJu~>+{pLL{SIgI*Q=JRMUVBXK zuKL+QM8?TvbSNX^g}yQwL~Or0zqyGrwm?q1-hYI9uL;o~QNHQ(7NVD^#zORy4DU-4 zuYP82(yEQnmV{pJHB5GJK84?&@7>VSAG!DWsoiTfrL`)LG6J>#FGH}W|F$F`6rCfI zCb^71ueOHoY07i%!TGC|@A&GH{tjpFRVuG@-Z`y%_!o9vy88J`M{Mm1d~)uGdOi z6tUj5Q@c}VnpWS%ed=F46Ygv)B0YyO59@|9PQ|+b`^C2h5> ziVUZAC{_BL2$9iCe8-YOtuFiOebt{%zohyu)?h+_m#jgR=NzetBI0jLrgSgAg107f zM8?U{E6_X8Gi<;5l6s1k0@38oR$lsm#D@<&~lC*dzdm5p&F*o zDI@;$ICqou{>aA2`yal6HmSV!yi$bDB}ID);2)|6NqR2hg{4!vPtFbUoZD>k%Zhr* zL&ZK=AIj@Jo3GJ*@cy0ss?8Bz$|y3FD)mCNgPD`_p((`f| zP0FBOr+=rQM1>a2#MKWBGbVk`@eo8WQH_P54DM*$*|_5*L_T+O89;OlaqEkdN1eMF zC(ic5X8Wq2ojmIL$T-oC!Yog``Xd>Y^n$m%K_sfN5VRcQQP^x(gld>RkFy=)&7WR5 z|Dnmv*d{9NY04mJ`0bTbXHIVBs3MdT0sf~)8EQG7|LLzg`xP}lL^k^b?cBF|OZvBA zXZs}9hw|m~Q8&%<>m!$O$igL^TY>mk3vu`trgRVcT|g+>xpNmT=|2I)wm@XOM8;Vs zPfloe(19cU|G4mjZsBwG7iIIL`k^aKrNu%Zl87IaiC3k4{bK=z>QL6MgwNgZ)8VfkDUlZwG(%%v$x< zUwEY02J2j@+=dgoZo{3u_sJ1^ZSh+5jc4W;?`X+TD(w;HrU0?Qv-68BfzTF39QL~j z-Lp=f6Sexz`kU1!*NcnaK`W*D;YTKPPuXC$*D6OKW2up`beOTI45ixWudvDgB>|4$ zq}^7lZ-IY*FA&ss;%GUf9(vqffFaBO-ha zfGtgqEQpMgd7pyW1p6dpzk@OwPG*PC=o7Cn21b=W7t1{&X*CvtmPhY1fKUw+C(6K2 zFZ|}SBvENkQ%3yhab9u8S*1V`Izv4@sDt-WMAAxaq6}o)HL~qKvu)+2YeG3Whq$L^ z{KMEsTNJ_7WfcT`lg@=7tQr3>_ED2%Vt@2r?9*HYwUyCMrfV7Ri`aj5yx2`8>bwloP%a@N0;DHoL6a4XakA>q=EL zPOy+ooC_Hr2SRx%6*G%x?g;XnyYu)*swbabtDX~MAJfFgKFjC%C?iL_{Pg_ly!XFW zF@sbYO2w@2-seLfI(HB_2GEP>R@H0`V(sRgh!px_PSd$q*u&QF~L(xqwV_f&C>f4*5S-^lFASnC##Ekf5lo~<6i}lak2`ew>6m{_dYoS6_x@OmWmY?m7!GH>%PKL zpu$qI!lEsTV0F0heD2ZXA1PjgPn-^|l+lwi`#rlbApdJ#kt`EZ50`PW^C+L=q?T}&YUuPiWx!YQl*}WNjIj`HU&7Nj%W)Fl{)mn&?q#6D ziONL9%7nJ)TvATHGEty1QL!?iEsD@HPv=mXC{dZHSea0&xtCAte&MmXetqPKYoA`L zoQg=}#umaY$BAoVs zLaEN3y=Hgw?dL6hXzqg}IpRE2oaZC+`bb5{eg_W>jQj{%`Aig;<4@QuC9 z+kAzkM1`f#3X7iCs!httxi4J3Z@K2DAMY=F?6pGquJ_QI-LszE)!UKFVC5VcWQQ4~ z@=_|wOSPqofS7&2Nau)XxwR;QvY*~=PV8OQ^O4tfxEts>u*%D2usY9OhdYiUl!`Mn zogyPkEs&)a%u=;Q5u9(Sa`#5elHa06c1X(()jdai>}wAdmtqh3rEusl`(I0+fR-9MJSPEn;1v3`z=XR2-@-j{i`A32LqhS7_2&H1Y zl1^Wde-y|+3g#c$q6kJG&1sf<8^+>j%&i42J5=`^@px}ZXBFJd*t#VnqeA3l=XkiW z1sNU4podc`mBBd3PMUCkcfTtNdO3PHrP_S^HM)n~uv74G83Nv|LoY`Ur!q3W(5g9a zbMS5*dO3PH?tRwMM%bwwz9sF`k9UrT&-x?%l}JD9S&ZhUK`U}fh@1DlqBsI}+}}c| z9U0pFD>AByQ@gY8*m3EXzyFBO ziW1`K!yoVO0~vE$GAPfe^yClkm>l_d|Fb|m3OlkEK^(p&PJXQy9DHt{zL$PiPZZUr zjFTI#Tr~-H>~ZdC-g47~h%?R%cH}Zj?16irckgLwrBtVEFiFEIeIv4QG}k* zAOiT(YBjwaJ)BZyy33gk&WeCI0*EfhTv`-y(m4~lC!I4Z&Z`e^v|fGe#oh8M%qyk( z>8TUDukE{&pI13z-*0VEzYl(Qhn5Vb(lZ_BjsxPYK)eYEZBfJ_H>{StwnKbXBfcsa zU+Gzq+N7MEJNe>n{jrVKD?6}5`R+1zLU+#GS>BFZ20Twq4@B>yyp-zcKddG(1J-!W zwa#^}EsA(@)783%uQ@07E~35~QC~ry$lA2UB`Qxj;d`A?J*StWhf{=7X;t0Fa5cRg zJ)E{ELTm3nBC8RRbr_K;mFk`&{^RO>>(dTX-95b)+R|x@MRnuoR{wm5) zzVxnE3Bfls0YRTdf2A#opszf4_HI!t#EBK+#F}xUR)MvDloMhf%n(FmH6t=bC{LhvLj2y0M%&El)@7R#;=9P%)~t`lVxh z)uGR#zsgz!!5B4-IikJ}qQ2UqzD7C_ADytk&(|D*ShSB=w6<8(5N$gQ?c>A_;>4P9 zV#Z5kFh*^9fl*(9sIRuDui*v6@DU6As?8DbhXws2eWJ=xD&`Dn)xz@>^g#4J+M)MIcS)r|U>JJ~6c%2Q4_?YsHb;$8P1RPP1vqkJ8r@Ed0YJ8~J!P!YpX(oDN<@7% zqduj&{@Q8X8?K%2waO8nh8;)3jxV$jYKNjxfkbrtCCK=9Ae5I+0QJWsZ`tEJgvL!&GVPu_;1gQDF9<+D_&G^$O?34iPN-wrP?{I8|eJwI7KQ~7Rt)tcR} zoiNYak;_2TS0d`G81*SHrP^!4S`sHdbnI}sP3@{P&pWNq7DWsn5fDDdb%;ev#G-x1 zqFUcmdCJK-M3yBY%MK$;MJSb4rkq1$St7FRFtXGZMNnRf^k0M>w<6xXxMhdxo+Fsk z(#v@dC$&kX%Bo+EIW4^$J)E{Ef}`0~zufwmB{h83Z{m2EzU*C#!gIvh7{R@3S3K52 zs2z&NUlM?f58iTXaR3m?OQ|?}etPQ8aV8#zdG)RTT3Y<_k>xWpsvXwq&U|Thvpy1n z87e&xy^qRJzFhw)uRREe(|{NPLR%EUwQ0E_)(89*V$qO0(_h89p~_QE&M^z7muoy+ zL?{(~aHN@XY&_s3Kzx-0CQrR|*7q6qGyO)bl9 zf*EoqX3EE-C*6rogF*YXirjfkvZM5Zl@(CU|uuWH0s1>-BFQr&aJ zJO1tP`n}7R7S~~3X^SFWyJgj87j^D)s~lW^@e_4%(?0uDO116zt99Rb)z02u<%l2N zaAJKaJkX?;45d2b%uwqK5!o++c>26mieJGqXp18LbV@)l_Qf~j9Xnhj>MI!aX|+ym zQcn055+D#?RgA9`p;TIDat@J9jYy_qB%>{gpu7|z!&lXp!DrptvO{&x5s0s9#8(yL zE0v*CTBY*QQjKV-Vzi_!ir`$ZS{AYij5(sEiqTR=g>nALeFhS_D?PY z@l}oZ3iZAmp;THga}M!Ujrgi&e5EalpntTi*vD5j;;WkRl~SqhIfA($JrKQ*%22AT zK4ZI@uS{r*BDi;1mBKmZf;`dirx{W=RC&tDF(RuFk=2aIlrR1Kc315dd~GHJr|c8f}j;-Bm|4;;WkRRaU>!{!vcu6NnSfhaFoVxKEX70>pKj zE@b>foQ4r(UR~|O&HIo^?_)qK(tgdTGAFpFxGD77-ze$!!d?q{?XL*M4obT zjIRpBS2g1+<;!^2#v_-3_^L#FRWrU)UP`6a9UosY|EL*XX^SGX2IQlq646r4Xi2G< zP1K(Zvm{3h!;TTyv1bdRb|@O(NV@g<<^O|>BY{v}O7)*#oYwu%FU}9M((QlIHd9+fhC9hBI_V1s+^r&0jaC?q8`oJB_hd;DF&LMLdN~KjJoS!2`Tzkg)^;`D^ zLh4D1xb2f`c7MP7yr>nTz7kPi&8RP{MoCpoIpLi1<*mwP7fr5LhaJlI*a_3R$4m%z z|sa8gnBJG@41Mxg!_xrKVwM7y8zp`etC*qwroVyQNxy5fRZul~P^5Y0#b7c8>TZ z5Em_eV|9HCp>`$ADiy~+Wh^fM@vZ~w;+t_MT8kn$$1H~TFC^}5`5O-M?G38)vfnW>mKE1H~uOi&IJF*A?K);4CPCI+|-%eF+jWo z#2Z_g3E z)2=SATE2T}yMf72s;p|{jygRc9JJCFMNGSUO85AycJjS|Is?;k3%7@|2Tvh{$S0WVqd*Bb17HwE1Hnk=2OE zN=9Vbq6n=T`S_|vd{r{OQYzIwM?8wCat=J)S@6`_qKNG`pU`-1yeItaH`n{`_)PJp z*WXbq)rY=6vGG?q;-8l9UY`!1b!SV4Qn5;r_H!Z*1L99WXp16FxN5cT^V8=eDKh+N7MELwr>uzA6}BDMG2VK7$wz2t+akBN=T`#4Znosv6@UWWom>RR8gW z=Q+PNRW^5ai`u76;(+@vcN(QDkjYaGFke`vetUtzCVltG951OJ1KFwL;Wa zBkHRd^=Xw$`zM!y_^L*HRWrU)gi>jpiJ9<@HR7w9@s+kHf~z^@gNUzc#8)-rE2UE1 za|Gh68u3-l_)29cl~!Bu&BH(-zN#5tX^SH0?JO&9PBUtr_GvXr#1J?SfaX&YGxu5UwsrlXxB9aV5OC3Z@wM9z}FQH;QmqrlLQU}pe&1flW5d>pK zlkH=;0x?|87*4BEs(Z%CA-?J$zN#(0YV?JS6HW_u>Y$=7C)O99Fuzu+d$*a=eSGG;r7N8~@%9{X7P6vS5NZ6XB}1v0 zEt!|VcX*Yk5G|F6mMTU|%1f!3O{N{^Y9PKp>zV2pSgtLKSoQTay4AwDVXZjC za3x~6nlT)+ZQIpUo^o;y@l}b4%O@4RO8%7c3!*O z@$DD%Ps6-Ys>f%p(f!pnyZU*RBM>c>h?Y8xmQ;pP(Y_QR-wni{PPw~taRo3S-)z~Ty61@bKpY6f-au%JA~>2u$Ip(IPuq54`N2;fR4k0+VSU2!_?Mr|@#B#r zy5D(o`4X}s?rJJSskk1k&V=t-#yWo%KI>i4GgylvxaO?}Q^hOLN@XY&y{lD?ocm{J zbRH0Y20~jDK_7h1WYcQ>SV2El#08ZRVfhr9ClD~0uWyVLR%EUJ#qb|JICHV5PR*NvHHRN z+$wacyK?gJRR{4^$(g8#j0$_Z)tTVi5dr)Xh;IYIUEf;T2&)?5Zz#O=g3kNlv#xL3 zp}K=pLJYn6g3gPx)-Im~f-b{3p?_RlH7!Ptv zh$G*6LH{YpSl*JMR9ZDc=JnVY9vI-Gd$%sr5N~QH6ACXmv$Vx_J+M)=p8u|FDLVQ&) zzEUdHJxBcgkJnd+0P!~ey8AarZsIOqur&TVsNjW)(_^L*H zRWQC%gi^7tVf(yuh-7L+G6f?UZBfLn=S`3Z;10y>H-6%v;M*`i z8A_$q9Um>#h?Y8xmb66?S_AUYQjKV-!)QsV)?YfY*`0I5Z(zp<4>_nfwuMkT6pgc`4QYSA=i6W%hz^9Xj@=YUi0lozHXs5KXRHZ*up2Z{5Yus~m9_ zWE}mr3;OG|WGEHwv$zz02WjWE>&w=?p#SM;hqWkzvMpwG4pCo?sISkcPpe#NQ!WGX zRgL(nVtl0trP4Z+bBM2M#8(yLD{WB(=UB>E5MR}ZuPVk@N~OBz2*g)4;;V|gn#xcr zt+x31sz!WOF}~6kMR0Ycd=RI7HBS3#p7v=qO64ghACXmv$SOu;%9r!%*H4DHJ(q#g zz6z&(HBbALmr`kU$2mkY6(X6Mk&Lz|g1$0k+la3!#8(yLE2X0M+2BhdOU)68`YJ?y z6{9{ys2z&-5m|+ZtYSo_yp)RG)v{tAUsZ^&D#lkzb;2=|yI(mK-#Wy7Fhd}|st{kH zf}YDzD(+WJ)rj#`h4`vwe5Eal;GSqT2mI|b?1PA}e7!`gTxyeYg5N!CYW2$UE2~e& z{lhHe{_zUF57+kdBm>b>AJJ0HXi0fxnjjjmYKwD-mima6YKxYvrH!~`k5D`DFyB~*+V(|91h z>L9+V8DC{Bg3ua}W3<#kv{YHN)JO+n9o%AN@8*a}vxfS=2jXL}L-lRjVQA-W-)X3G z4iJX}k?|54j53>Ea3{=NIP0B*fP?$51^#^q>M!U(KkG`G9!UEJo4I87acfY zhw7dq5G|F6mMTU|DnqHXx`Xco1OjnM#kfRU6rnXB=Qe-r%Hq01rdEfcca@6S_9Rq_ zeDo?+Ba8=P-G4sy!0OX2gxaBKWRQ??&?l!>3xQDSO7-CyDc|+4=Je z+x2(HyizKiS2+UFQh{ix&uB?yDAmP#guj*+;;WsGyQ%o`M~3<{fzTF3tbM0DT2LVQKoa>-}djFU+%SVCdWgm+T)QBzg~W2amXQ4 zixXQilrQI-)tQ`o8nfiZPfqoDt+ptFbHQpr%`E9qE2UDca>UXpKkIC?!}*;L$9dK8 z5`U%j8RxzV>XU&YB5M%@J&|R4_y+#(e6!d9K5GY9PH$k9E!8CBWL~sGFPiZZ8T77A zmBOtJ{zqUP?h6_8YLTw!-ExI1f$B66)T6ZF?BO{rIwL#;;vRjy=Y4wx-|nMuZBYb!-69TrHx=SgoHSHCY0ykq znE z;yU+;tVL#t=7v5Br-$=Vc-A5a`jwP_VE?GFe^lH*G?!I*87K49K4Zyvi45A*WHJu> zM}_^P;{Kuepz_T)S(M?|2lw-49f*u9`k;s7e(w8`W+t0&zX!awBjFZFn z?^gK!-HPA8tAE=?zm-k@)ugq{PlCm?TNnyu^4v*hlgH2V9%usb~)WYyXJH1H7dee zPV{LlH1w|lf>!*^`QG%%?v1=$2B`4^B>6Vdhllhzp-CEkd-Y9!nbk}HvD4qU`JbCLT|tD@bZo) z{a=K3hOqIlUa-#x?Z{hH_u--EXN|{>M5So8W0#93b$7X#e@S=oNLyY){|o+F$S>pH zYBU7xP=tLxXh+_nx(^Ti<3j#@9Qqi}K>ibc^YxLa6dkGgU)`3Wh&d;XM@FK`wE}zp z)2r{<9Fg$!&{u7F34Jd9s>43LPFmD+iN_>ZhZa~G;5M%dMqEa+W z=#6Fv*SR8=KR6y4iAvFdKmYC3hu=H7`=h_`uk|h-Y1@?0m*ek1ToM1?wjtP8im=bk z@?=NeGCY*{4iA0*nDN+=s1!{DXhqu&_LU;u_L&EUOslcSBT*?j@E=` z`8rQjicZwc8uYv}tuQtT9p{z*>nd?BbvdsTVV_&?rZLZ3l<)A+Nz=z;N1{?R?1(?P z9h_H+xMtV!$VgO*hJar9ZG58dtF}!E9sQN>tLUSAUn#;qAMC5VWq2s@9Uj8IGLA7% zREmxrMN`bTM_$Tzcz9DLV8M`>R*Soy^N<+mz68AM|}?2=VP6ZJ!VJRoFGTEdZdyh&~iVpk(vMoaqb2gqgj`2uTxmKyKVlL}>wdEzWYNZIS zLFBTdplNzQp$9^~9Q8#s+2}qz^p;DAcAIEqks^Ou8UXct% zprSJl8Hs9mD4`+4z3&ZMl{Zaj>Q~L&Rm2-s-Lt#>=8|&~*kcr?Rjxz@f7NL9%&lvF z;H8zfD)Bq8J{0lRgZJ!y_-(A0MPK3{+ATo^w2`Xu=^_bB6 z?YyM(|IV6T;y2fdh=~6D-c!3f{Cbb3cb)sMRkkW8nH?qry^#3QQ%Bh=v?Ea|nkK_~ zMoT@fd&5ilhUY0Kd^PVYfb#L6j6kJmN?4H$MI5@rf^o-GTQ@g*KE2G(8p!n}#Uk##37uQFr zS`kedhIswBJ-esw1^e(bwv0rj=%t@nr6#j~$6h(NRK=GWJ~$-z{-$RkjW#9pPhZ-!ob~oa)tTrkMOendzRJ;Rhaz&m!$T&U^ker`qEf9^BtsD| z-nHvE)<>eswenJW>?^me|GpK^t8G(4e;R%CmHYbrui$@0SYFG%%F$|vBG^}nFL&o% z#$iXIQuK;sDB_;Y#v>z9auTCp98O3`Ko$3wNE z3`Jc2$DPKp&J&fQRffYZyzhE}S6f~}e-r(*nEi#mQiPowu&;9TSTblw;yXNKvRB+! ziAvEclA(xsFYY*wzDiWNRwkua{`rwf-IG5bc}c&~riA{^+ZGiQUf#4k3Vo#rJCE}I zDnpwDj=3UozQaR}YyieygNaJDT9FJz9C^_LLm@9&k&Hx@YvrZ%#Ezxp)wU_2X^6+P zERP6}_Sw?5X#@j(TL$|o@f{xe&ThK|G)0V=J0~hdn}pG1DB_V5#v>z9_1f@kr<;@QJ6-m{uQ|_76`L z_YXfFI!?)o0U7A4#CLe;{BJE7M_(l>MJFjOJ0L?5^~2+lk*E|MW%#~|`>WSC>o>?t z=z%Q|!` z-j~7o%G<3LE}A61$XMR8=hE+;`+wEK6O~$yv!X5I4eU@C?a|tJHX-s7I-V8PJTHn> z=b&$>e|vO1D-t{2xXM=bpHbKM2$O;FNPL;mN7?AA6^utirD#GTs@Im0_y!s8J#LTx znkx!ve_WLV2E(uvgZ#M z6u-Lkz4bR+2&KAalWEPcEY=_+W0NNqEl#2PzSMCmb ziF11UQ>pBkx6N`yyOv?TU8(Y&;WkA2pF{P-Dn+(uC_;BQ{PpZ`FT7+gE0sM{s~n+r z7!@cJ9TR&F(t-E@CZA*soz2<{!cd!1SW!q=Xc&zAdzj{5DGNeTjTYh8h?v~#m zVjwON#QslBYqE)4E1B)(CZAfT`_4NC@)25RO1|~Q5C9DC96?Nb^XVu zHkntBNK$ecN@X)NRD>6x+O-lq^>Hm33-6xl-&*ZtEL964Tm9JS!6sATe2gXM}a z?>rVFX!YBB`~AyyLpvYc>hBGkoJa5Ss(>BxGod zA~xx-+r4skBHBBSA})Obe@!q}(sHe2wr4Uy`;8{~+4aC-G3BINB_h*@i_;osZm+E%o4sJGX+Q&jLyk?O7pmF*a}*LVxtzlo$& z_RN`|%Rm%f+k5mzMNK~S&hTwtMA+xSGpG#ZrBwELK%jqn;kQ>Sm5ruq6%fdyYP^N* zcO2uT{X;7AKEWp{LR$>2h#*6?QYst&Q4s)zs+S_v4n>pL|MUQ=O)K(MDqCqmt9`Ks z`&hLl{FPGK`rz8m5o5_vs@%gJh&8xutt%^fQI%oqjxto9b06NN2ITOmCC$C z@IL24#z|P`j{}kQPh8uiQrY;Hv^x$c5m)8e|u7hUjGh%JF?S~KL5vk z@1`X~^z8HKcQJ4IgF4)8;qS?kSFVX6a3|f9lAH+jR~bS$c|=6zGE_ryvXe%S0RJQ- zwIofvPmE`*&f%1-#tphYZ_p_(dLrDQ3pLA3E7US-)G{j8G8Dlz&u_w@$H~yFOw_1M z^nGPQcqx^6)Znk8-{nl~DV06b8{`PoTx;B#?D$)gB15UP*PYu2h!NCFE^6%`il98a zwHJDUHJN5NP%3+-R-+>PiZUwgAGITRxG;Lbi>kFY=A$A2;!oH=IBKM_@d$jw_%|{< zIT5B+o62To`1~cTi%;&dq>uj*l?ku7Cb+h91l0+@xeTSUz8cg@TNGjIKOoMBFWLL* z1=UON)JkQmmRjYAC*T>L*l|gJ&2w^u6FU@*?{A0qDSx=2VuY-`l*&9&@Nh@teV+|~ zd{>`cY<$(Lc`A{IzqTm|<2x22_+2peyT9*Y`kgncs`# zp97k#iRj@svm>L5h#(`{(Gf(~w+P>8U-+Ebm{!OKgY>}5p7}OU&@kE&W@3jkGU^Uq z4VC8`=R){=G#N_=WH^%%J+(I>^gz;t5o@|# z%?(3AWSksMWh&e-t^EyCp<=ep@8O|VYMDIQeN>LX4Tu`IimSE^rOHPZ=N~oBKPuXxEs8KdA9l_d z>3gk|%AToJj==qr8u!90-V0Y5N~Qa}Kfz)hjxwC_rS#D(51v}Ia?01xs#QRQ8Nz>g zgCNZCHkG2A?9RswD#M%m97AwT;LO7#6pe2;Ztn)M zuat_ui{I!m`fgyF7=kM`M-1!+QHD}!uS2U=K4@>wDI&)6Q7iGgJ*Bc|YLz3}S*pp% zs6y5k$77V7)3+!h<~~s?9rKvcdxS=lx#eRa%nwREAZn!u<)t!o9!Gka?a1gOuiyuL z%$QjYOfTTV`Y?o_ea-tyf_9_i&R&N054AN;gSoS{D1trRyn{Dd?(F;B5H{us(XQ{B z4CR~KG*Cm1)+&N?jNgToMF8GYE0sOl`bda@%662Yd}I6=$EkfXYB9AUxE`DMn)hU~ z`mRYg1hvW$?W(gOMze!xe;22bp}atR9h}c?YtOJCJpA2XfmTgT5ig z^@xm09w_EoS$?@Yuo=(5G0{W!;w4TypJyXFCeDr(sE(E!&+cDL4iiOm@Djh1`a z&PK2d#)rJmOOG^aGBW9-$Os6%_o@hcCROa|s8#!pu=#dF(54)r zp4xOL)o7kNXvOK_`zci>{2Ek*?LG~H0HB%*eatOWE}QSDfqy_~grs||?(LD@|JT&p zy$p*igCm@_P(`lfavu*#}+(;>KBgM`?24q-vA1V{^q}s>S zrU`R>rLxZhBA)OTIN{A?C_?9$bMX|pz$tPzuN0xRljbzsYh_epX%#9H@lKKViKZ`G z?3ub-zYQX^Wi&*vJl-5AaC5-!6nP(R2=Y}<&cz!L1#UoO6&6M0m5F%At7N4}Ta<6S z0TK6)c=N2p%`>}U>RS{MZ*t-Db`?kKB`PnM5mpobZElzb>4@~~o1c_ZwxaBvp8-TJ zqkV2*eCesJ!jj8qpBos0I|JTh@qR_ogV8JAeDPW-g7L0#8jQ${uOYa$a~bV8(Gc8s zafjZoM@45cobpmC`+U&*#CwRIuTm*GI|cCPAJ(IaFn<;NuAG?oa|5eJjfNQ1%Ep#0 z##j4l5Mi^gjZjY6yt12_1D0!#Gz;{ZW$up!1oA6 z8}TJ>#AjM5m94?xOX972@2`xCt5d1$^MHsq;!E6!&txb<`w)L~GTewSaUja2q|K*W2N1@2j9GL*0GkNF5{i_VhV4%N!|j-^%baN4`3 z?^wMX5b-u{$y&J0A72p+?@D;jY2y(P@s4nbJHnaYRe8$Ex%kFNi8n?v8Ok@_feyaX z-eW289*e!z=vx$FvodH!7w!8Po?3Y^Up8--YZa*ZZ;tS}(`~^&Dmu{@uM9?bqY{);T3En^T>s+-mPJ@2e`h7qX zNKrwas52(iVFr!t4kLR8kAP zkJEgIkVPzpAXScNf6I-XU@0QLsT;jd`+JH^hVo@Cqggksy=GM$Yf*%ad9Z^MDhx== zGlX}By(YPgID7=!yT}8+#8yG9u(YaCrd6hicp@K>HGknqb+>1ZM}~GdHz@H&RmC@| z;ycG)D;slKoAtE4ms-&trHXHW`q^inhq;S$gXZs&85Q~3GpP&_dKYIbCGP20+d-@N zMy}V&5Twcx>{e>Tb*`Slyqeb}^H(G#JrTAWkV+BC2`esq=Rk??9LQwYPR7VWIXM@< z*Pz7r8e|AR&b{!>+=|9K4dI>967P&=`=C+z-76-4K+KBii3F z+4`^>5K2X~RX>|=5YYAEr5nQRNQgaVOfQT3`~7pbonAlo%Ea#4_wgoqf8^eECw2Gv zJ)dtKaSz+yALU<)UFpS5%kRHsQ8l}TsP>qIQ<8wl(0t#ZeDlNoK5uj=ubc|#-Y!92 z^dm7Ay%^uj?OXaIs-bc+KtP=G^VPclm>KNI5W*=(IBgMY$?1(t`PT&PZ{!ACug+Qo zL3z)-*ANHKm|lMrCzofUuM~0Nm8*4U-%Tp?uF7`%y|8KhdE8`uR||2%W)l#R^Scvn z9m&w{i|Eyde%bHyf8~`?^{fve&mD&o%Q=^>;%7;sT7p~Gi7I_g1W)14yg!`AsSHJE zuRC`#EWhFIe&?&v4jT_eP{xhZ;~X=s{2EMDOT4uWm1yYPEcDe&h!x-7lA(O3?}UDv z#=qOi5q$geo7PAF^P=LU?WWh-qKMGbM9^~l^!&ewOD4>~9Ni+!E45ZR1zJPs>{Ent z$`RV4e1CK4r0)HfnjHz#tF=WDr%svJJ#`AtplSJ$h%6_4bXherb9#mt{_&*l@Q;JF zD%-h#-)mX%_}0_v*%*73;kKRJt@a2AMLYLH$oOx_m;)KgOR3aLATwQmPI>P`8`iWZ zQ7su!s`NR>WBMzbmgnK-@@6d=iqKxqWhAPxWMCCIXjDS80j)AknqFulQvWO&86818 z&`$;Wt43epn_H|$!E1}j-3c?;yNd-)8IR)oUJrO>)B5c##5(s)?mqTPylWt6=iY)5 zd?#e=0RNjb$z`OGjdz6O)IuI5ywY4+Jdz_A`|N@-Uka^MhEi#-;~jS(&H`c{5Za=M zG<(`wDOH;7i$`+ABbX(>`{zZ~nk^Yhm3ANY?#VA~TAl&K7TZoQwM7wWUQw&A3q&@e#oH-x2qy z=5xx}05QW=f9UtGZ1q*%KV}nU@LNc}@?gKu|5d9D(d?q_F;6=VT7)V?Ta?jZw4pK- z!F~%iQ7gtiC3dxMMLU|7mW;5UQ>)m!zOR&5dS?Hq<#7ZD5PsBd3%#486_Kc-zZyW$ zjz3|x{~o&Axu0Xzo(-QhwF>-;Z)Z?4r?2>PpIUtqMEv z&F*M<{OQpS<(qs7_+~O9`z_>Dlo7Mk4zg5ldD9{Y$__c4*x`3I z<&~Z>1}fV|Z~zfTGh`DPIzuEX^FD0^?TG#gUIDdmpD&Xtc%T1yWfq=oUInzXY`b`O z%W}0=IfdQe3GB6BY1T)Op$I>(e9ppVyNQY|le#Bv7J4^*&NZlrL^T$IpGV(b z!nfD-wIA4teEZ&?+XyC3lyOn;)Mbe*HCfm~2q%1h33h`G5iz~5B}4ggXE^2OJ9*j8 z9gBSP=lDxX_@0S6Z%LNlIDK;W+gB3N@;-IS&kz-fCOIdWC3VWYazw@{0T5+qOU9R{ z01sOYAVK2kYit=nTx^z~i|@+dn?n5crzFP9pLv8;q_Um+_Cx*t;h@HQ+Zp20cTDO2 zYTdZ*1npe;P`|S_sPDjU#!IO7{r%*GcK>wcD#f;P>mJ{_g??W$l2HlTxnH14#J`pD zjh2iI(d4^~UY`KsBE$?Eah6C+hG_D3j`^-nFD;(O&c?0xx=>|k5t7SLM4DFvebuZFw1|u}$B4KYvF^ItOe^<{QFz!hmiYLy*_Q;3RRrJu z1>~I_*pYUY7NXgG*t^HTxBo9re?HKXp;~1<;uwb_y7ar6wxnmSRP*zcG4}_nR3DGu zZk(vl!r9jgJ3#uJXqBP7aw?NSgvv;K$C5#<-i0%q&!eC48~kqc;h7B45bFnsErGZN zh%_7eBLj$LH;5+yB~Js=e1%^UzHeMQMRv|d@$F30A>$?>vKB$izI)0TJE!NXJ5JOj z<79KU=RF+xMubu&FVXg*+M)>e7rYk`qYvy+@IKL()QT9`)l6IWQ&bGLg=hHx82b(| zONy%PCN6PdiAzvHK~Paq28q+n^eXJKu)Cxc0hOFZMMflF1yR!a`5Qh#5wnQ;i3CO6 z+s&{f1rbFB5fns%WRWDG{O?=Ur_WnGbC;P%m;2m0?@3j4>eQ*~z8Ao9MPyg6+*Z#M zH0!%nQ{Sz#TUTzXz|dC^2`8>Nm902VwO}maE9em04bgL|K?sg3R_B{qcu!^c=Y?bE zzH@4GhR{J|NsDOW-*dF%q@ij~8VYY&Ft*vgQ=2mn#E%wD892?To70R0@%(jDn-iMz zQgk*073aUlwHEJgvp(p^XuU2Gj^nCOO+NP2DxOCt2;>YEbB6U8eME-$=6TXLv;%nw z-&M@Kq|p9Qg!g$@E2Z-Bdfr%yKz`M4@~cEfLdAL0tf*lV zM3&ewA%cD0`~~l-9f^0_IoP#4(Osx~1`~n0Pma1z5$isyG`o}qV+oa@O{s8-T&Ro$ z(Z-mrRvxd;OJxudViysJyTeV~Ej;#NGze89kFkBYiS03G=y8=v5eX;mSn^-S9ZMo3 zyVoQjyf{Ho2)l>O}JR7T3nsr-AQKZ+iF3G4X~ zGvv0X`l3l!23F48R%hq6AVtvA=0mQvEh6+m)8c5zXc3f${3>tqt7KJ65TY&Kpp28a zHIVzfyJLs?$45TbsQ2N$>U>lB_E2~xo({JMvc!?${Cz*rk8YPH?lZohs zwN_*(UyqgDwN_gcar0HH${9UQEvx3#vQ~tz4Cn)q9ZnkR<_t1Hl$T&NXl|q=Xr8`S z&FO36tAwhJ;Oujpf7CetsCfS2t4x1PWvI5{+_|>1ZKqlwtL4H3ogjLy$sh#R51bY8 z?Z%;!sxtiZ!m-UCp4!~x=^!#~nHWLKao?xreV^H=Mk!+5IF{N^^cjK;7ow((+woaKM*x$|VghYl?sn^3`$4HN> zfy&7C$9uNJjimF&R9=cuzDnhzopzvlUNm=Dii7u@)>dVeO3^_E|LNg>h00KbkHoI8 zv_%mrhoM^ABDBTP3&;F>YK0TU0w;>BA=mEFenO?_P_1p(bLX`n zLHK&bd5&srj*~c6YhjD6OK54=kMjgg1kTlRoU0W)S5p~^&=C_V+Xc=!bDnd0OKOMO z7b^4x&TDg?*J_JetNql@C{C&*wkvu<1m|F~;wZxBrmTYjp)JbSV~ikzR@$Nnk3>Y^ zRKITSu+)n17`$*yWrv#_b#s#=L9jRNHm0J(U4t5T4S2IA@s(0}1m{S^osYV?`%(J} zKz&_?Y8!4@)OJtCsTRmeM!t?t5Ixsq5P~BSH#sOHLUD6Bf4z2%YIIi_iH4*HHUCf-6~2n_(M~&XYFRXQ zYs1PJ@6$r7&g$IS6xlbHs|-c>NTdv&p*DAGvGcMuBbC9Gp_Of`LB$hAZBaX7B;xH9 z_BrmC6gW|=c%rB+iU@I~Ij?WmC}w?`BK&h)aa^lr#i_dp#$dZ&qUcnH+M!hbJx4q4 z)^a`P&4Czqn|m@!rRZ=P&eb{C;ZzI4irn6gR}%XeWwxAs|P$$J@z4@@0-{x5YSO!(WeDX^SG58Q6WVwmO*euCpST-P>)mRI8=}S@5p2B3Q*M zFNycl6dmq5b2pLmuCww|s;~|=H}=}yUC8>JYC+sPHB|mR$1d(Vb61q}uCvNezUuXM zua@)K3~f<_uSAs5>>$HvcdEE@+U-yOo(S&l@WjY4pBPaY3Ewt?v(KCLgEupi3?M;d zwnkA#^B4NuBQxRT=zk~;yh>NoVUp-%)L0M z&xydTN!BuWYcf=}<9LmA>NqEw-F6r;L^So1g15YV{GbIj61#=wW16u9H?V8mz|MIC zTeVUuA8$n9uNVIxYvHDe&%yIzX4$OsS%w?fHEv+@PHG}U`Kk{o!ZQHX#OF4iS7W89 zT?ZARe3i<3uxp3r_FnJp=SiaD(69a z^4270s&V4yrXm~=YKKz!_e3;1NZ#cP_1&m%+}&ATqUd%fJWhu4^(=#S;D!+QoHcI< zxqmt`T3<1i;D%6+8$xxsA(XVZwXCGayQ4&~-i{kWHE#%|EsjY27QGtRL7p_MyL`N@ z%$=}#A?4JJ_8!+kAG?q)h=dbGfO@=)gfA=G8#Jfct_)H4>xzg1s!e(@dT^j4WWdWQ1R5MMe{}q&!dWH zjcF3kIa?}0wHsB0~`#uc#INdh!2hwxlCJ89hYsuNV4UWF!a~W2qgk$sjv82em)k!a@B(1a1iR zc{|8&2sQg9_F5P*@hmm=CK1hDHIBr1N)|@nf^cIe&MvF~f(|!?c&cCUhLCEdR6Z8Q ztslb6=SMt!ZRKUSAynapP{A8QDkI_B_CM`t?g13xIWK8R5N$towMwYkUISHvXwE;1 z@bsC;P^u)CuzLVu>}rdD#&}gu2|`;YMsT#pQ5gOcPG8N7>Rpd^VmX0@>aJ8ij)`c_ z?rPqR@`wz-i?0%Syi=6pPEj526j?k^5ecWPx%E>2tRo}g%hA(g6lI^=v$fpi#k0oP zG7b^qF70SeEyFsf2>%?X@a1-Ie z-CE-{Zml(Kd2cDly`_TpmQ)6Bg4#|vLECewj91}?Y20&QEfPe+$!^MqSmIRizG%BT z3%b3N8W1jh5Q3wmd4_kK441bsJYQ@3s}$kSrGb}d;@@+$H%~~jY7m}%HD3Cpjiaem z^At8K6A40}P)X3dx0K`F5;K7CoN(-e1>q@N+lBFFrtS1NNJ0j{{}jrLw=rXl1o0z5 zGQ7lvEKt+sY^dEB@Pvo`QmM6*T(7t_0mChfe7_jlXp%98$2gwI;|r;Qkm zuUZ+}G7izM2F+bg#>8;rw~hMb+fXIwL@SjMJ~s%DuGFfzVanK^tWk>an8?x2=O%Cq ziMygit5g$z<}a)Uyp3B!y&iAM`YzQzFAVonTl=_6HAI$5p9sMo#GRrFcZ%w8r>O0< zc<;4cKU&#D$jaGM8U7hm^mNbG^X3LNvy5c@NDv}B+z_g8L#PfngpwAw!)GuvecTYL z`0h5|5K3Dd!CTY5kB(jqU7tp3k(Y8(gpXZF7lcO%*?$n2$WXo>m56BGQo#CE^3-n< zYukuH1naK2&B5$7k&z(UIL00%byKa4?;L2VXBu}M&9N(%C(jS+GlOmi=STBq3RY_q z8TzE2$_v#&zWpLZAC>N(n>PrwwZ7(k83EzXQOEa8SY_M4r{&GtdUD?0@u#~Ngg5Ef z$)6({%Y*rhaH>0>QM0qO)Q)rE-QVEWRv-Q0*|yz);J!_3OVsLW+)g+RPqIFO8nV~L zQiO79PvZDgV{-n%(+qz*jGdTJMsq&Mry7%c83{t_$sr35&vJSe9`9K)Ud5-unn>N= zB{`vIs zjHP#-vGaa+kKKCwy5)OcyX%Zg#{LAVbxOz!-)Gs&xL3=1-)cQicr~E zwlZ!;{|7guX^~MqzWxWsl&^gs`&UEsB192`iqaE6!h<9$jVY%5K=QLVf0gZkN%~pd}N_FE;q5ETV zgH|cx7Wip*j9uo5DnqF(N;KXD;%RvJWFWLf5qnO3UHQ!`cWt!V22Z!$^hCThsR;Yb zepcByk3!}AHr$HmxH2kA*BE8r$5Em(l$TQ3_Yt8ojPD>B(eefnZi^^_GQN5D>@aKX z`zV9Ix%>#?)yF!%QvVnt%HV47_;35ej11bMi2Z;3x)AL+^0Vxw8;>mJ&v&kt`b`5==BF=z}zoH^_NJoZJnN3lvQ-QeuxBdP{8arq$TNFXr@7;NJ)930d zB`aB?vY7ipYaUaI+{@4?uUz$iA*Cpj^oT7}! zf%r2JbAVtBx0Os0G49$5_c_ek!|;3C^p&@zv8sjWWBy@(sDJGH*dJVDk?HrD>8rJh(5yDT-v@bnI6Kf5MQH9DR?ZqL zXVA*1sFhOL_facEYD4slY7m0oCzkh&*C5Ly!hYWw?<}s(Cv3U;H(B}nH|!kN4CRDX zAM@k!z3#4#=peSfajA0Z+h+xYqO)uoqQW$c-MxTNUP`t9eg7HpHR}Iv*r)zzer0vV z>DN?B_59nja*NgZi^t_yiuf{kPyc&QK#~$eA-}iz3t}{5}rGE;4|e8Gs^`imQa} z;j)ZtATofQ8GyDZg0bE9h9M>*9`di3><3kza*DL^-(IpyRRmXR*UB-ejFj)1<>A<| zwi!UrWMrAQq==OTfeavL{u46*N7zn}{hVrr3?N4aP{a(t5g$Ek_44Vv&-0Oh4rw(E=I>OAak{)5b~2gItYtzIrTCR(U6)INy7UA6U_w|E#8=bFl}@1qPw z7}X#|oV7<`N3?%)r^tA*#Xd*A)5<;nWxH)fAVRh+6ComcHfGZ&u@-WTQUpKmy;bCZ@cm zl^48cw-6Ik#5I_)zeNx7O;9RBsnqLP_QP4v^>2cVyE`&2cwxnI_FJP2$~JlUb;q5b z8~!PFUk704rF@m@&}G&V^t&%vCg0I+g|)o$v6M<>>{MKtfB(jPiW53A6ruHpEPGFW zWqtw>J9H`&iqI-WmYwzZqWq+0>^fCGrd0kte|b?6PBjRT1EH2XuR)d*@$vZPuXvkE zd=O`8LXO13`yd~?Yx|YT6aLAX%(kF{cN=t;9gCZQ|Hf&_-9V^T zO106VH3i+oL_|5%kil!i&&~;aQ!175HpG&jVkF+yk)a6nVV1oeh_w*mP6R?*62unk zmVY?OY#OB1kWeW)%Pz-R7^ydH(FC)636(I<_d4qOpP9<<$rf6xACWCR55h*X0RlyM2xz^!(E zu76QefwUc#@^wy>!L=M~dY|jL)({nu))UXhXn#|2Wwm)T+D(S?>-)g;9dDgUagdtU5BsQB6`AcLA{%_MBGVwYsPxtcn-2rL8b_--)^p zVtc5!n+)Y^wZ4cr9EcN8TjITNZBYbk{kAJ^PkxY%#giY_4av*U%=A*Nnsc0S2xdrD zhf{PaLwPBceIGMRm0^6Tm3=0ap`+ywVvZk&osnhwR%tXUA{32VVL)5}#1in8Rvi_= zyxlmV&k=c!K;>XXAhbpKatCniXRXS~%#u%9u&SmlieScR)kyY2`0H`6_T*zzg_moh zoEmzN6QOlc)iCAMV8+Qv`A$O&Hap&mOrN9hxQ-pE?uxLATCA#R%e3+bE5+Jts@3k0 zLFz7|E5p!O2T|?fNguUJdASU&^=29NI2Cq9VeB#^BQK7hl*-XrhTUC--CfPyoytfN zUX4y<^o(kdj5v0io!2<6Ohb-c^TK#U+Tyy~_i;wO7v4R-@s+iZ7xyAZy|hzPPjZiB z*$Wu$&%p9yfl>r_5Knw$WR-# zetqSwJB1vMoE(8YXCHgc+V-5*gG!}d4?D;{GS`|r$h5`za{p*-K6sMc?88!Ey+v!7LV zg2=RGB19Y|*g;mfN>70%D=F94w} ziqOh!xH({FEImcoXX>u9!-;#16Ze`Y?#lP(U8a=PE;GZpN@d{0y~c@qb$&-HrDBE6 z*5KrfrKc_SnOd2K(Q@pzE9|yw?zUAc^{#3d_8&F&A2s(Ms)=7Z1ClnwoLtajJYw zsr-9tMH?DK1>m|2SDJ?AyZaw4#=t+21HxvzDfK z(ReZpzkBxho_ANzVaK8}6rnyutc2Cr6;<37X^SF$u<8=!7F+OSqtOca0{?o2wkSfi z4STg3d$o#tHI<=gKc}E~&xL0fA(CE=-I2B^V)NtvJF?Z>=#jAJtg%bw{-dV||6Ix# zqYUg=YV0|~j>W0+vCX%5F`TP#&*|TDBw}A{GBUM8sr-8)p2JzuwwUW*(=WRO<0<7TW+yP^tt4`k>`jPi9()aq6s_M7?K@ZUNJrAp6n9tPqAvz{BC-PmC# zJc^(^yE)R@k#n3lRUSNQRQ^4+x(~kkIw}(vc4R1DMjyYobS)680`cP}`dEu1=xM6~ z;VhInJ2LV2BDUKp2_v#vo65+5_y`cY17T-3U4(MNQyrL5$6`mZcSnZuvKi3eU$M^byoy-clM57Xr(Rj+=xAxYK7e$Z&<`P zz6+u&gXd9kTw!-NjI1(fmGW{K+?Tj_o84U)SH?GvA4k~tQHCODho6RxM?_9IiDMQ% zPKNTe{vVIfmWdEitIIL2uEe-H2jfZ+%o*(#tD&O|-2AL~1JrgCc86BuhoZyouEOrF z;O{v`+rAklba2{3J36@jkV@l=UbB)3-wU1qD!Ck8At_Y4EJM#=@ zUabtL8YF}3d6T_{aplsHi;8#M3tfb^OpKr%%n^|*7M3SQkLDq>w38S|QwB3vp5<8f zY6xazR&QqpXy`0sR>_(>=eqJzDrT?a&Z8I;L%wU(bEQ&rmVE?~dI}=-DIFP#P_Jj% zV|a7@B8>Jw0HH04NKgJGilR^a>`ti^on@=yR~ME9|2sP}6hTh$OqkxqIcGJ|39nO? zGAg?WwPRug``rKH8Kj+OcD1szNvCIjsO4%cGkxnPJny{BmH9^3tzVZ*Z<+KU(cA6B zQyJ>+K17Xd=_~WI7p-64wG0s}louYv6O%|~h*ZX$Wv;9?Ze%E5J#QH&qoRzvA>-Li z*KTEW5hky-yhqEGN>43Q84YF}LQj`cbSnii^h`(*Dm%;mwe*%XQTT77Ro5olC*nOU zcqQ_sm%q3E;HUrJmM5;UMtSrf=-qwB6rn!E+l_%31A=m#Dn%%#EISy83nQYJwxoR? zy}J+kABdtsK#EbZ#Xjd_XFjrWt1Wd2*;0@F@%k^VR^IYbv}0m<dVmT(QmC(UiZc5 zUG-JUNqwa)DPQYN_Q%6#{x1LfIbW~74jJ<~n2Vc^)w+17o+a zu{$wUK9(XN1N`~N7005_K4Yq(%8sPr-wxvXl~yd5e_)p|N)#PwDZpf~*Ep6Gp|Z2= z7jJwfzX#*@tMHXlX@8_L-gfR%#aZW_-TxX8>HQStT>@RREG9o$_ag5A?}7gUt`}j z+tH_ploQ5Pg(w=v)unr_HQ^jgIl*@LiGO(ShsaRAT<2{Tv>8C?!HKEzkUuyg@{cl< zmujf8ot|1LV%vYM)kY#kk4IR9Q-pE~QM5u74e?5;)Vrw+#Kam=G{i*mG8u|UIW>q7 zciCbqfFe>(h@#Xg#CA%bXdO&B!S-IXzgK9B^5y54Ide7xP)9_};mi)Fian?ZqmTVz zEvli)HfsJiMX;YOe^7La;JC6}R1vNr?Px}O$QhJMy_?EtW>m;zRE8o_PK)zZ9O3FK z#;z{H<^gqAgn4~@-fsE1TdOmQGO#P+j-}v^g}TSMM5^iSDUiy;yI$h1sNl|vh`$~a z&ubK+oZ7uXVS59MiAt5qKx}8GA0mTO#r4B9)QA!Kyhn#|l&DtR3E8gB{I3sU3>oKH5(H1|w1`+#+~@w+OaH zpW{|>AGeBY-YVvfKAy72)zYX^w5ep?H7efObxnLMguBk+8DYEY9PcpXV_k%C3KDuz zPHMR#v^PVAB}av&W`)IXZ{U`<^tqx#6(>g(r)Cw0_i5v~e2P#`p~5nZ3QNrji?*bE z?T!Y0*xV$qqb=HEpUZGB+`Zn^WX2)9Z&+1vbSgu&QY!zRXgobIjHd@`dwRg`m!woG zqq##Lv~sF=Bi`<1s1Ms)_W_|Tj*j=K?KVWHq~@rk)~uxJjU7j;uV@EqmWAClaH@E- z-}v$tbG)6v{!oOrI6B_h_WKN|S>`<7X3bI&te4oCxuYqA_s&tXtnBW&NoTdi&a)LA zYL+=q#96acUP`6oIGrCF$&^abgAq!l8paWee|wzg+QJ*Zb^@-lvy9IH@P-1aIR)@3)7W1KQ%B<9%x56z;I_3575R zohlDcCD;h}?>VEIJM=+@>Z?@#JrT`Q5J85{5C2?-CnDm_WzG*i&w%F|!kr?$3#>8} zjadr>-eD4MQ|V3O1d-e-=6gl(ev#VVEn@eLm9O3-MBWYrPJU{h{Ai0Jd~VWmzU>5O zUf~9v-KXVgnA)VA@S6rWpI-rpuVM|cTfSX{a>5NE+yTHzT+Nd>ZBf2@Hxm63pY03% zp)K~ACw$5&MQF=JhEyd|D_+4|w%6M^Tv z`h0hLcx!gM3R5~{G&z+c_`S&J@jS}14F4R@SUdw@RKPP>HJ`y!UYdnDnleytFHmm} zIki?l()`o&(pbx9WMoaBRCfNMd1;C!r6c_GrHe35q;0EeJ@T@hNh;6kaI~X~u>D{c zVVsDtzx3>G^DX|<+@{*LleZf^Wl?vF`n=a=@m$ePZwT8*DOGwajQ1F}!ISs+Z{fF% zaGOf*jwyOEG6bQw(D2JA`B1$v*1>={BtQc-6*5E-4Gv^&CfU(7Wu!!1_3Kapi8W1aow zCaV_T@7$nE5XsFmtmie~7smBm@06$=dS9bGm0_QU=wtN~jcOVz+b9}NE!kp~BF1(* zqt!?h*7FMMdBOGE?saiJR}J<4Ot>{!;MU|YZ%yj6WX!4Texm1(9PPX>!99rWKkNns z^LD%Sz!f!)UH0HRQBSPSI=jyklc(OiPWjH2_;!f<(Gn~42cPxC*e%D~duI6kQK$|c zy6)`iA|UqPYkK*@g7JuyQzK)TGE!bHgNTLy;+va-46NnPe>>iLbwqzm`TF-AM9--P zA^3L6qoRxuOPp6fvDUTfBDBTP_XiE#4vwez|6cHJZ0V2faKpOgygO*E%A<@(9sZLb z=;>uY91)665w1xpW5H|I3oB~;U75$`O(|A9V?n?8!rq1Q+WUgnl%N0P>=`RvuxKnr z1S!Fmp7dZpp;E86TJ^XNYK!uv>`OP{=%MBJL96FaUogBQv{I_AU%f%lom!;`)k>y%F|GOgy}KJ|OzyO4T{@XxW&zCtP@$WfyMMkD}D3yOtgvjVQ-$62{)pu}q{)qmq@3s{+QOc6Ui~qp^6x2I5Iv_FgrMag z#tph&d=e>Bglg#DQ%3XGsMK; zT!r>*7n-E8n=;+%RiXM36Fp45e}}Gx0>WR9GSqT@ zzHiFhFry}iNJpQe@iz94FX&&5HRK@759Q0x3wD|p=0_^y@G}++F9hO!9mJ*oSfl*n z>mx$Zc>fhv&A$UN1BjHD%b2&;%7Q-Vz_I=hzp_=aZ?$>Q$}}P0r+3+HMsKZ~$5O}tkH7+bvr z;bXTyruNyG;(t@b21~8jthM+p!gg-T*bNBfrBphO(;1~y{`r2H!IXhDs<2hfsrqBC z)%~Is=b$2-Y7l}lusY|qIy)kba4wtQgF3ei;A@vGKVjaUazdt`Tc$ttcgszVhjYd&GJ5$CS#yr&fw^szC@^j%=xDGO|n&s-b^R8Tjjke=$nFv)yuScIQ;;>1LEP zs9tgP)>GOnRT0W5a>u_tjzn#7Yx`q53$pCV1$R_)H~UV`d{UB@LH-9JQxl(0EFI8su&kfNhMSO7cm#Qg`&dcA? zk)c%T5xkWPh_?W-4G`L*h>H(dvON04T^p^2)_GHXc6DBU0<==98{e0eCq6JIXq6(c zW2v!Y8Rm{fWhm9L_be-W9PB3Q&jRsIAhbmhH{QEMyR%4pP!T?^`eQ1)MX=iw8E^me za;+wc4v1dFrQ=Gebd05=U8(%@{W7~acCoK5Z13z;{V~_-{xSca^Ft9%H3&f&*wGhO zHE;xZ`EDYW(I7$%fGxg9c0|gli9R{&4D?Cd{f?L6oEkgAj^26ogSAHG-;3n|;aUws zNc0(pPz{|EW#F$D|DTQ$r&3Q(6n(5xpa>nI6yY*BMh)RwsZEr@`GMVbpV3Eo>6}nb zSkHm@67ruNnmK4P6v5eL6$IQI_{vr_^B?9uO11x&Vx^h6Pl`AIvE(IWGuw7#C>0~$ z)a_#>1W!8w@s3C5RTi(TMG=fK+k9o`Ci(<#1%JgzZ3y*MYPot>r8BnQm_o?8v5%^Aiaxawbg3FX}%GLFcJBe7X)148wk zSOyVI&XBVPpj0}~of8qw>Kx{Wx5V|_X0VRqHj@c5RCkq;%7z`>d4)Tv%+<~~E?TRI zlvA_2D{Mcw(t+a;;yjzmT12sJ>Ip$N4}(V;R?p)ygiGNHVfas2VNSz+EOC!G9% z`YG%WxH>CBXR4x63kUUdplpw0b|@8h7OQU?KFqS|h&(wWknIPpMG@Rz9r>r36GR{7rQTK9X@4k!qdkse z9b?_~gH*42epZM+iby#%m5DGCmC8TIJx(0?l+n~=#vxc$vH79sfM6{nAkWL28A1Nsf9+#d?V%SjDkz}5v&fkkuSUN#C!8;h>0J8R!a5I`RkUKy?bWdc_j$! zQgiH5E9QwRL;14GZCO;>OliD#*X_U|b}5iVm8q8m$i`ewTc z=i49Cv4A^}sBoe(5i)&k(XphQLS-UHWujtbLR%D}XP)?-QPf0HnW$KqP^zuJzF~Rh zIy;B?ks=;?bhY9@WE#hG5ZUKnU1m*|q3A5jA>$OtI1UKqrBw6IeO>wJ$m}2wRh)0{ zTDc~(kJy*@L9|5t?0b~95 z0ii95xOI#8rep5g;(0A9EPdv1dS08@Bxko-cH)orE2e$mq5joS}7Ifd2Q(;Aa*`rY?%F_EsCJ*HL6`3?_ytDU|&1TeXX7Yt32hD zW!RptdMNPZtp}9$T&88p8EMsW>Xz%AK4?;{AEB<6}*&PZ4T| zqO)vi$T$}@%UO`2(i1AquBLv8n@<0`dGU^qPbpS!=7(v*`LWqM=Z0|==3|RsO%!{B zf_np%p;TNS{lo-wJm*~JxJp_?6Rx6jE}qwnE9_Wu>{!C74A*lz$yIp?rwsd#9Q%)) z`wvAZ74sE8eZ~GG$NnR?OvYLi!R*6Nv(77TOv15noo+5Vn_=4e=Fh_==l}b;k z^dxQ%$k+=q4u%Y+QW?yH?4&8n{=DBM`BsQ>$D#+7>atbWFTb?&ZlMQL#9oLBU&UNM zvLhp<@>97i`!1rw{{gWd5M2B0B(96FQ#rg<`~wdSk0NG0fq11<^L~!ryd!EwPLB8( z?DzoeSOIn@LhVS=|2^iR;k_VZMe9aPr%F;VW1> zz6tLh0q^RGqS};lI4#2{ zId~utdjN415Za=MIZrIpj_7tM7e`Hb|kvXnNF5%2gGhbgmEP;ig^A#OO&5DVqP<@ zKDGW@^&wxIQS5|qrBu^jw@kV8H+Ku;Dn;z~znj-@LEL>8$Cb!XDm~N5vJ-%K4G?Ps zp)HEo;rlO+v{5@l%&i%F8F%%pNaZOfydD2*GwPY^uT|t2SIT#@ZL;#pAI}SRq%x3S z)yS`M=2yx~srG;Hr4i2=jsfClnCrJ;erSs#<`vJ4eE#uW8}B0PtC98P%=%cHwv0vP zDJQ%g2Gw)qaKp^u6rogFRS!8_jT~;6Ih?jALTm3KBdd{-4KpKCD%CwjAXe3kSsYi| zqKK{g&xHH*%uDh9#1oFI8M8vX5}(X_`>iP1b6d{K#V>rL#ebz8uF`}5y+yCRR|1yADF_NYL3ahzx5(#ta~omr`*ypZdj_&5ZgO=J}q8SwBF$ zQmT6%e17EmPtR)Ol_Lmma$og_*eKoT_m7!GJGuYh3FCqZJ2*j*UTNJ^J+-EJaz8qO!&8&}mCp$$_dCCdD zyY#b#`Np>%RNvlY;btMT@SU%VcBC?p!xhNkYUXgtE1{CAQOMy6bO>JSnrCupyL+`*uG+N1j+9Ppp|IswNNJwSM{1emjL8 zOtnJHEf{-4+!Z^NO6yu7Pb`op*31*NMG;#43Rz!)tgmL)r&Pbce#3J1oS8wZ6tODo z_yX+Mrh`yB6pi0$Kz6)7Wc(PGD=(#5_1uk1TYc~g_Djz$mbh`f`sF|0zr9jr_itEU zz2nRoKRN2Lu@v$8TMsI3{@KFneH|G}rS&pII3PCr`NHZqKxm61?s#~U^5tiD4qiZo z9y=mruNAXbt;4BJ$_aVmQAZaS{CQDz*B$q7uY8yO@y6wcPoEX+NM&$`imb0<)~CFb z>fjAG31@6EPh19wJ?gC54gH}lin#S>n+8PO<8t53n8kRd^*xoRoU#m=Wr56cn3<&_ zlu9d8IMoLNndLAuOKnjE<$0#hJuRagBb-vH?kNIUUxBPIXV#}Olq#uyW!%#uzsi|k zX^SG*o4${lj!{x0X8peD57U?4wJbbEtPVT&sk8in4nplvG}c7O*y`sC^8-)D?s+HE*w7ho3Iqm##1hT#YSzp1dPh}`y&VS$6VvZM_>o(7= zMG>5vwl~E5K)gaOT7+Cw>U%0LmBC#wqg)%|no6TmF$Q~e5Se9x%(7r+sV$0NbhYXi zMj~vO1zUD#;+5HQ)Ll#1)FSBl<<5wZjjw*a9nib!i&h&(wX5TlP$ZU5Bz<;V|q3tFX!dv92; z_&e;l?vE*gao6lnbe7$4=c4@kka5W`@84c|Db>`su3awmuHAz?{3_xBb^fDe4lDk$ z|Gt${9XfaYvOZ+D8Bad){8)z8qtuEF@ zy!r&w3K2ACBxMvO!m4U&lX8NL&n%f=@$m7*Fzisi*WS5S`Tl349YnYc*iq4rg&nPw z>ZL!gAk|3NQPGZdV0qf&e4n~?1@SH-PsIqt=%dv-)jj2ejI2UNRxl$|gi>i;3ny_{ zHP->+bwFr~BDDIIWn2Rpv%Ub!l}dF_5!c?isQNAtzrxtn7DZgU@-po>#=Ygp#L zSG%J>lxq8pS8V$uMJ$O7<7SNZpJTME45iZQ7oN4dVZHi3ApVBDL|YV*t(UcP1#h!L z-or@BD5_O8m8YCgN!@08y~%+)7Oy&B-%9yjaOpDb{77XW^3;q#j6Ml3(S*BuUkxzF zYtD7f^Q1)(&tLfb$Y)NT+ssksD`aFf zGP0Z*nYJVdseXn0s%Dg9gi|WjUF&68_Wq-euGhS4Q9gF>{o8AcBJR2UUn91PX4!|9 zIjr99pgR8u#+6bn_q!KH?%ZQ;h*v4%vMW!izl8|2LPv&D?SJl5q1G2OvRi<7^!#P= z-(Y@diy~ItDk7NsW*K5t&6ve_l~n7*Kgub~xO?Q;0rM+GD3#WkvJ7#gW;|gm(Ut@O zd7dF7y48$wjBrY&y3^~9Kz>ytzp9vDsSKskDiz`w5XhD)W=qGbaQPwyN?c#8NX?D)s|%T&+Y6Gw?5)DA`CY#TDxx@%E&Uo#R-x>9lUSk}+C zIv!TP>Y%#X=%9TorCM&+XGi8PKRb-86oFV(GiEVfslH0Z`DpvLENkX@eP0t9tVI!w zCAO!^GVbgcvn*a&6;S1+GLT=@$ggVVS6bgwDy^4g8S<+d`BlyQN?R1c_-MQ0kYCk| zau(st4%IzHAit`RU)9X7REAQe^%>+>74oZ^`IWXPf@_ymDY6WwmK9DdYo1za{YvF2 zr??IxBdZy&lrQ6ay~j>rB&IUB7vxC*_k+qSrShs#mT@o0=wO+QRf@U@s~X{MRLo0i z=2uF^RrEhU-?3Q%yv`J|z6x1i&8$xmYDbE0GMU;kGLxQCO)LL)rpZHoRUyBsnO`Xt z*YmG0zf+hW%xWCbm6zRd013*6Z;E{2$xROsA4DW?U< z6VHboTOYV@rJC^bu6OL%=DRL~D;lz;n%R=_Qcal8`}{z*lp|ZJnJsCHBA9F27z;UE zjvTIL4yV;9m8YCSew8D?s+nIYU*@~kAE^w)s)8|#@k)6qRZ`tyepMj9s+nJDiz2iJ z6tblP*;37HNvXJ-7`dPsB~mrQZ_poD=ih)Ge}f&0P&*QIw#PQpi*+I6NXSs>N_EwL zHz;@S&1^>Hwim5fRL^W#U;Cl^Dy4eIf7dN%Y&LVou|HqpniR1yGQM{r^E;v=L#ecC zlx0(Z_#_asVTZOT;-xQcRKETPvl^|qvqRQbGwai8l-i`6u*Z33%VNKaR;=%W9m@Bv z4PR59^<1us)s-s_u zHzhegQpC3~N;bmGy`>{Vso4L%W4Qu|XHaW+9}wE22#zt!;qeAcjH~}3lKv4}OymAC$Rl%5L@ycWHpohR;rDTTEG0|K67WR`SxY6NfEC* z`$zew?%$)hp(8`7(yGxlXGO$nAHJ{B7Da5k*;?f%_t-6X0l!&{xxv^w7o&u$v(?+w zCgqf6cWwHG{PC5CitoV=<@@|<>y*pB9PLPD9F7@#8fNY~9j#KTY31dc?B0y4U-zCE zz7U8bVL9_1Yw04^JI(AsRGD0bHY<}h`GqG3d^qyq4JnNnny6t5#4S8 z;;ryi+Twh*YLsP&Rei=R#w+E^&!&5d_)71I{xLvo3}2-!j=27|6{QE)KmDfuueKg3 z&PRVJUw%IMta)KvrHD1p{!w*2#?{Il8A_E@jk4dK^`q*1Ag+NO+M7I2v{+->JV_seIR=(T-FGvZWf?Qo(FVc`4P*C6IM7p_|$gP3(D z`a`Mi`us9&yh;(DyMK@R5kw%45|yD;tWx-T{&^raJLgCFFFy!`v?$`%gI*k2<)&Sm zc=bQXz;DOuyiHU6u$)2VDJSewv4{G{xl85`A~LXE(jr8j)@QN|ainHEVJy)W<$L%w zPlq}j^C0YN4?d{A3{mdsjvcCdiue&^Jbvzy)$EQ8rPAt7mVFI~GZBFvY3#5}SP|6F z^Ib%qnh}W6N2xZQ@?3s#WjI!dWxd!4z>LM#*%l#2cDJC?nHcmastH6zhl z6u~ieY_@Zw6|%k>SzpDhPpe$&pHv3&s~Y)L&HO4ss3u8`4Ea@!{HhN5m9!{d&Su{a zBEPDUU)9X7luC6^5!?$h0$KF23Y}7EwI$?NHS(*P`IWXPg3+$s6=&QFvO>uHpjM-_ zs-~PmMph#utC^80U&a;N52iA3+E-zRSM#(_c`21vcS0spA(N?@$!LorxcXSlA@0nKI*)c9! zer44&mB)<3IAz)P$V(o>T>oIRo}0d0&wp|L%wPu*E`vKe#w^R0oR?EEpYt9>wls`v zsb;p6wm5=0qsb0AT#g*BW)7#-DAhgXg#2n4`BiQCmFqjLJmaI$j#LKns~q`N&HPGv zDHZc;pHaxKa^zPvS59qF1aoa0l_6WokuBBCmXzwLH?P@xH$^<$yJ`4E*l}bBLCeh! zMdOC)8@`ZN7>PdyLU}0_vwj+IepQr8B2X>`D;?d ze|LH;zY>|o4?8lHin}F?5?S^WAeR2>y7j3*Xp17ar`qb2BWFiOR&iV@LaA8SuvI%EZU%yx zrM4(yjX4{YzMlUTd%;@~v-%x7RQD8d2KF}}M9f+N^Fw7Ql~#A~W(pvVMa()1T4{?S zv<8Hygs>y}`zLPdpA4;(YK`+Z!22?02al$R2Vlp^*n=$SAQC$Son^N`#;ZPlQ~yFB zl$XkQa^nr#tR~A|oVj{&(rdol=eSa;ul{Sj@@?174&y3CaA)`HPuw(oK}UvC(LT?R z5p#>-kKZ)>vBnN-Nf5B(giyCWhg*C?%WB{n587GPXGgqZc`W|UY)ubOB* z2v64l!6;`V(W+;P;287$M~1!NBd9feu44!NX1b?{K6-E;#H>X?Xp17)o7EX}8p}^B zmM=~~%=&fHAI6vc@tf^-4gHZKK80D!O3p7kGL(w*(dtZi{^P6b7K~XIudGE8oby%# z%Cggb`bhp^M4%g?l~P^&+jYy|J{+}55ub$}TfvU&I|#Ky(Rdc%Cy(SWLdFX~C@-Zt zc~YNfgZ&)Tj4U)}N36|YGVZvy{~V9S#o8A`?I zYE`2wyB&z7fcOIt+M)=?;3JwwS}MQ}}gX#2U1cW=kIeIDcY z5R5CX=T@Op-IY_wuZB6-nO`X)rShs#mi3VV+zJHa6<2+$Ky?vTHNvmgz2?iq>(5%f zSk$p2)!pk%cq7nyUmpG^qTHiEP=@j9BEG(tS$^+3%i;dVuF4NXe<;|D-^^e#e zluD~cIB8h#%l$23$3h^|7Uz5Ys#B#ukS+C*Efvg`v>K&0rJR;{ zSK0qF>^J~+s3!cp22L0RGxCmGGt^GGO~ghnIe=*>p>wSs~F`N;j~2&S~Uv!RfYU2=Q^lV zs(XsK=r31PKS#`Z1_*6Y#8+NiPU6*j&N{H#9P|7@^oLU2vHH~VS^VAr`y)jlR#l8y zj8`f{sUBKtDOo@M@smfY_x<&XyaqyB6tVYPrnFHTCqKw_k@e-w`n1ZW@{|*vfUBlLSylonY0*FU|&=y5Jdgv1EDvCGhAZPy+q8vw}QmO7K;u7p6UOeTd z;oCbhluD~RAzP}EEe$jJXp17W1{AWT8rjk?M~PA$xYDxi>YO6ZgdH2fj^A_;YKNjR zH)pM0pSYMWikVa{`<`oTUcmcP4amoTnU#2S$C z1;i|RS7j&_?X$cz%O0P(dj0MVzudpOvBO#vLD`lwBELd^+>e-bcheu1pR2r7#-}k# zE<<#9u!B%4tuw)LAdp{G%&)XX5ga|fV?lmZBfqMcUn!O9o+6N6)yS_Z=2t31skGV> z@~ay8Rb|n~c8ZGN?DG8}PWx({_SHP?(`uB;OJyJ#LCURm}R7 zuiByLkdal$$SP)J%1fyjU2Rt!@~aB@RmJ>Dsh+xfrSg>H@zx>4-4ucRszQEMGrv+9 zO2zfct47GLD&$u+^DAvp1lL5XIlvB#TjWN93Bzf!(GKY10TqtOl`Tn6&1VdPh}@4TdJ5XDKDksZpq>b?i2y>;8#8uysIsW;GW9nJl+9;+zL5d#T<_NGmBR$PdVYn zFLFdiIom-RLaDez_7w*iS&odXVn(Jdis0_mqIQ-&g?;VMkt^DM&@5ElQv|Z50@+f< z^;~5rl~#AM40%a`yrg1YqAiNh8W4Wn@qzE>4;(f%Xr)x#Z9j`j5$8vW$dK!P5O#31 zD?;s1be8P{89N^_wb~B|<)u`6etWI*Ew71L4StbygNKKwJvS2Ohf?XdN)g=IAzSKm zo~sO{I&=Q|l3!f}#LYXEecGWdikNrDS^+^XKsI)E$l?0T;k3%7@|07SAtNi0kqxs4 z6`@pGH3}J7fsAaJ8JV^yg7U0tge)9(Oh=x`$e>iJdy4og5UV0)F~Vt!BIpInGI6%O z!;8Zw&pBgz&U2;e_JSXMf0GRI@sj@=ZA*%gB*s1g#XIRE+apDLNX6 z89>;oW-W?HwQ5$i&>v}w+rhrEDn*t7u@LKEK%^~>;JWLUV|5YUr^Y}J~sJeL9Q z_OV6<@20$5hVIqFdfw-(qUFqF%yQK*<%HF_!s;AqONvk`=8V=)VRf#sI*0zy7Dc35 zVI=l#B&IEH2XkMmE#l{(SN>(+Mtj=gh)wbCc%M;NYb&g^!E)x*?bwxCM#>4RT7^|D zR5=x)RJtq1TUfCAWBmv+v_%oAR#>AdtWiORB9uyZ$YI5)u;S!gakNDdx{nUAq>mLR zj6|iqmoF$a$W&ID(vf9mE<{VT~H*NYp*K%1b#h55;QG z=W3t`rP5t-mSHuhup0C^qqId4saA;X6=HkE*schr(w$z2?G<8s#n`SbilEmm<3ME_ zc_>aADxNgxPFUqBr?vxWXQRw<&H=K+zn_$bl6VaUQ6;X)Rkwm5=u#rGdrKPs#r71s~l%c{JTQxmC! zcT-+2gEsk22J1(K^`o*VYC9I?n{sNhj4(gAp8Gs-8EN*>tmna3T>ISbj^MiMDQl)mZ6a> zo4aV|{m#SZ(Q>CZ&s{X_sdMld+JMr2Pbfu9Iqh3zL@1h=Ex`YB$m#N(SjN`Rt$g{v zm)f#^Y@AlA$!NLtVRIKPcrCT1kN9u=OR2IR?Kmsg;fVh?_KquVSa!>L1IS4&SH7c& zyM`w3#E!N_y^tb;uNtkC3jPr^Kd-dR`-2@MHk48+-}w1eM}Kq@mPaZ@M|DyeQTlj! zCS$x-5uuvI&$n;6`y{lAREi#~mGX_BKYtZ}&HR=6JW?roA{mh?TCO&=GC10szwte& zeltWnN-!cLU)97ubEdua@5L+F;Z$n*`>)^q@(QzQlV!FHGB`V@oHqn@pu9Zsd_$e;h> z_wGKncKOMVnjLDB%DDayCT}^d@cGa^$1Omw)7GNt#!VmE}MXX z&<3|ah0NJ0Ii@Mib(m6mP<6UBV_;tWI6|(O0{aJCzPRxk3=h>W{-HnoA;v2~TyXw+ z0nON+q6f*K9nP28(q!y#Dn&;d_-|?lWhmkc*X}wAUpbYc)ec&?{;TISyxeb;=V-*K z`f03%Hm(f8arK3_?%J$_iXJRO`HqV0#f>YImuf{X#lJXql}bN@Rd`gTKTvN zGv{lOSL(OX($ULf4qk+{@K}pi4TAA%i`$~FQZ#JnnH?&F);izO^5u&rV~0~IdT}xo z(Z6WkBz)ymsa9?WBl7zniM+ZtIr>1v_Wxil`~ZBV2(E)yynjv@S1DTUPy~JDd`DZ^ z^y}bwWg4bvV&Y$12bD@cpY+4sCgCfmO0{xdai#y(KO(QLO^(JISaB`nI;aTdSEt_; zeU+kNL(l9`1g&+x7$uEt(hl~OQz<&~Z;)a~7`rXs(Xu#j_euE5sZy=n4rY)ioz?K_ z$aC~fn15UgnO`Y_dHbwY=EiuHplN!vCGHJc8Ss_!h2 zrCN1l)TURrw&Y$I8gWie-IbwyN6TA}FxiV6yH2I(#mP{_*G`>`45v!9N`3X@u<=rB zM@vV;j)A^%{|t>dr>-5|qI@xl3NzrOo=j{UVi?JTi;DyYHdfxKwr5RhDMyz+pgZ|@`q4&{ZHd7Z&ALZ z<(s#jKjVlScQz`mO(>K^+8_4)UQy0B$r};A$ZOMAHYSNK0&<@vdXv8^v=WnNN zaT{c;F;0f^9WBq@d;W}lMs|1wJDf_<^c&d`HWV96Nu;Rev3M z1sP7I=wHqL>*c4zhJ%_~_z#YmKV#lE$xE&6$QbA=*KlaWIemDG1Fk4n-Lm-RznKAO zi}J|eP#d}^DD$ZRc`pTs%-_dgAkItX*o^?8BEQk8Wlf$4WaO)w*yk&cpFiW9U*)Zi#o6Ih(F+lcJn@PqPaG#h5vyVC`sr=2 zB*UpjOGi_$CQl49R>GS4(D%tJwaL-2!+g~v6;IjQyEy2BsQb`}b9(Dc$VoP6 zZq|6qXz6@MOJ*FGy{fsrQ&6+`m-e|+DSG?IkGgC($oOI-gW2TYE+8+}q$6XX9j@Wf zh;zFCg-tHcus3+Hxr^g1%6GIpZj<>lez?K8-sioE>~JbYZ6drNyxn?K{?-;$SFJ6bw=aeeL@4vjb`JTa+biUW zZ&<=^w;3DdbOP{L`_n^Ir@cfEmIx$n^VF(G=$wFGOg@;vwV<@(bD;jhLa6L z47P*kALc7Zn*@&CRJ!sVE${pDoJovbr&6@auv05)(v|1vE1y_Y<)lZ4&6Kt_($to-i31PL*n9QhK$WhEm_IJV)oZuUB8R z&g|eTL(o@>u% z24w+MFCx=;bmfak{k>f#A;YN@tupLZ5cTcKbMy?v^@}fACiuz_^pzs)d$Zi6 z^y;)lbw{>@J4J>V>?@~Iv`L_^x-t~;(!Xad!M<`TMVkcrDwVE$N6VpWcAmtzaw{dixcEu*FL9W767WK*NTzH%x>n-v^aT^Wk_ z^b(Wtl~bi!nUt9C@-{y$?8K}|um3g4PQp?fjIrh$>&keyo zxBjQK_Ptr|-c4JS@6gCUUiE)IKQIC(w!^6ut#%AuzG549yYd{3SdwF38|*Ly?NEe$ zKi-bCMRgw<@%Xs7{%|TqH+InYx+_BwAKzZ$?m%BTRjQRq881T-|M=WwWH{B(h@)vh z{C}^0`^T4W*X^!Nj>bAzVDB9I!w~EbMcDV_`y*|EM_b*8Mr;+O)tuj^Sz1qYDn%0$ z|57_RyA*NeC6n=$Qz_acP`j=jinw=u$#)0Z;Z#E-j)sh0{C}^0`nOZsoU<#>(a7Nn z?9W4g7=rzw2>X6~f21u#BhGhd#4ONBBaViQUi^Qr{>wGXw)>^7JV#^yQJ@A8_8*2|e<;GfAKxEo3s!(u_n{Hr zQ!TDPoJ!H^tF8=1+JT)p6c2`Un$~!=T1h3Qz?3JG8A#^ zdQw{&*dIJU#I2np~TQwOOPKC2=(JI75 zh>CI7>aE?radZ(an0!d6;nxw`aQ)Vc(DURobGu4~_hB$H~~?REmx^@ZZ!9 z_J<-q^o_~La4JQUIVDgAvq?UwMGLz&Il9S3gRcx>xsQ3;z8~+av}I_-`3{Xd@!iST z;Z%x_HjKA}zEVVf-(+Msm7?jSC@1a*?WD46lcSq`RPYt|PWEh!}$)4_$`8{P0*}ID!oVMREl04!tXPv47I~_A7lr=&$6acM9ZO7v@o`~wX7Q1 z=)s%Ve$($?h-c#7+j)La(JA7(-}Hy^#BcrS&Qo-%p`x=4?-m)xyG3fgTV%nfR%o9r z>>~VWxA_~LlRy6SCiUSRgpGFfLbNaT9r5tNP+r&6@(G~N#7J2Wz9-^s{uDn&OkdX$m%mTsSl?b_sMyzwN* z8&B%^#uG4)X%jErUu%9v&l+;(W zLlN}~v;C>xfp$2RqD=yQMKAhWfZWrR=V-pk0dJrgw)tTQ&JWi5!ulaS>k`JxP`*PV zdvU%pd8t+|rE7=s9U3|LSMnC9fxdDoMK4Z%6K~z@x85@x4?mXaNKpOp%F)$1p11ru)Te)>o-T^O*#eMq?7YaI*MR^#j~Pz z{g8K_nUqup`@{JTwX#V)*bdV$MVo}K9i&pknoCc{S5Bqq#mP{_1#g!({0*ERPK9_S zTA7r%H?TJcs;6m_qxr@<=2-DO#*$zy@AO{`3{Zv_lxTfr&6sJ zCqof0tg`kbV!KnNTA7sbb|~T=vx5!}(+ZK1Sh2g<-$a=t?&{?63J+2K@*RvBU6-@Lt5HRKp` zG~Ng_j5h)m?HhsG_r1n@8H^<<8r6?JSAw?s(ID(DPF$TG9V#rtsIU~Qu%x`4D)Aeu zIPKjJ+QAz_%9r)MaR@$XQP2abiG7Y0LFKeK@A9ULWn}KFS*XeU_32Ftz9m-sRyEN% zpJjUYL#gaDwMr4YA(mW!W=msGBmSLsx+U|b7!Tp&yUriWtx6$DKhM!urDz7opETf*QbKkil_f6%Xah-n7%2w$DSfRx0~U87bmz7*k(H z-RD%u(2AE*aa7tH?Aoy#WGIz=ri>J^xLK%&NB2zh5jgF zfB1Wy4WSxFt@J*%-MVIreWnaWb%HN=B2-PskXnYl9&?h#Z?X%fova<|vw?^Ep7GY5kmoH;f-?K5R4I?J%0S6I*MxSsoaISoM>DdLQLsQ4~= zaIfu$>M#9y+48YB^X5r^Y}r?;5VpS8OoQO{)^v$C8rjF54|9xZ4v)a-s-aN`}b`-lpvnm@5Pay z43Ub~itKFv=QgR&gm)k4ARgNH<&iAoP0590DH?m``ULbK|Es)GsuvpjC~rqR=e2wD zoR?EAK#NoP_e7v>Re$!jP`^rKC_=rSW%tAK)$i;NKhoG?{h~Ku4))qx<@Q$U*k3B^@ zX!%-LH9v?5^hflhB5rwX`SM(x70_Chon`C4`|kY1+pJn|3|}b%&zzR!B@v&j+OgYv?#}PUYOve(%=CrV)hm|IUq|m^{Sevs z<#+7WhMwJ|ep3gr%gm|ey305BJp`R)uR<1cFM4nt#Q21lPkHoH4O68;dJQ=%0+<;N?QLKfZ?8s2Q zzWT5SH+goG;xj;O4ex4;B79s?##@jbFY#o2vRD!Rd7+GB%6LC^^K-r%pRaW)w)ooT z-*c3x4E2>#`S(Pq4CgyYhG^BqUDISi$N=`e)7B{ao-)qIc-r^({r;SeuTuXQf-*jc zemEWLApfgcC5Uzv?e@8^YG@Iv1f8)~xhdADP_t}33h9EN-=a;_s>ywZk^6)`Z(9UG z8F4+QR*iRquauX6rhnA(rU%C%La*%*y_=#H;Z#k$8i$}AH^$MPW3C1%xXg9>BaaHS2aU~dA@4on`#B>2@#A}pI({I;PuB89k{m$<)u_<*7p(Q43A>P zxyy2fMib4*QbdpvMI~9EkEMQ$SFLydAENYY_qx0Kc1Oln{=8)Q;IlKs>a6mR=>u`+ zo_ANz0rCGC`x1Cvr?UN(A!8B}QKW${inNvKeIEM=XTUkeWGEbE=!Bw>>E#TZ(J^MK zC`r_Z&k#EA^Vsi6^ifHwQ(t_ZwN?>o6TYz!pBnM?xYs7C1w+a=z0X-9h;E`94Z)d6{zSp}ZsN6ID7_Br9`1?z%jGOh} zyLg16otuua_}A8}*Z+d2OPYX}$Vk0D%wJ*WTya~@SL{p8Oazsn@!e_|!9GUt)s_rJ zXs=~9ib$_DyQAgt2h`nC`6gdNzA7W;gB_lwCcfmAsMv2Ir{eoD zOYI;_^_HiWgrMw@!-*Y!S5sc;HOIhmH5tKSh%lNV+se^#%snDenfGZUC?onSSnc90 zAyx1`>#oGl3bT0?(AdvIwp}3G&Ma4JRW@c~*bRz@oAnW7D8kPxpL4RW(odX;K7)*F zFj6Vnxwsn?*bU+u3^J52y;87=mdD+oFkfOVilCPW`5?8@zEWQ4we}TdMBnavH&L-= zg>lm#485D)=lClkQH_S+`+tUSKWMwv%YzV?&|CiEHuCLxe{Lg~I8jFQ)FnK%-v=$@ z%`_2C&2CU)H^^itU+xTF-)avp+qt)4{}_)L>+O({wX@FqlR8HPC6EJw`VLCjwBR}ucT3#&+F zJ7<-sP>o75F1TpTaUXj+R1Fl3{R1`Xb-};SII+oPsV~q`#6Etd91wCo7$EX$z zW;&v)Z!z zMJ)|Kx!*%Yx!vmZfh`$|NcnDi1hpltZBU7}X~bEx)Rqh(vog0MX)>A}d|$^yEl;o6 zKQ2?oEqLwc>wM`eB4YN)nFtS*5I6sL%~btp<}^LrM=^IdfQ&nVNScsW zl9A?H+fyr5S|6x>G&7Wlg{URI2j>$Pwq)c~HvW_yf4bbyRfd1<*WLUfm1h9{-z}AI zM%9cUwK@pd$`|0T*2eyk{1T)KRfZNJxeP_5*)y!Kni+={k&)&Y5x4L6Q1wpu_I+a% z9`=j{K0{!g4we7q$?waR+Lv4X>ln_ZwS z={4uB%3uYDb$~X)k6<_K06AJ^D6gE#WKf>UNPOem9VUbCqw>M?72epY(_HEe?{Zl1PIJoBLcFf?Vn z6P5F$!)Zo_c;sF0jwdwphjR4R@IE_WuRXwfhQuqQ+QE8VJRIj$sZ@{r{JklT&Jc(h zsu(lCJ0uxtH0R6M&M_1r+>((~VRiXf zi(2t)FveG~UR&(-qLv+kaG4zqS`i%c_yhjf2c;LY-W8h+5S|9ibQh|$g4tK7`xLBn zhPuysF-ut>o&i*X9$iMx7rhW;lpK-#)%;urd%^oIY6ZXBiGH_CzK{K$sB(E$)ee<`c1a?}v)LL+n%MEy>!vr<=LRNWWQ8 z;3b;moFbyjoinYd9FcJ{5gwr}$~XB++L3-Bqw(jxAw>*4_C7hI$Ejr%Pc1V<+8Hng zY9CJ;YMeCi3^GH!^#|)VH&QY*PhTsZzV6BK5MDWzd2o(7&Od6LfAG|@PP+`E43VMs z`E%#m&bAZP0@*DQEeSe9bdx5dA-MjrV(WMY*-gCQ;e_wcu6cL7$dD`} zf1K4RbHsRz;M);toPvE&Whj;Qx}UjS{Kap#R2i=Of#y?=R9=oyzDkv5JMDNFe&iqU zCuc#cd3$_doYh{HO3_{h|8%L9%1}g_iS5497Dc4>NCfjV}rsEG}fO40r_ zqr_>3uRtchv_RH5?m!ABRGs11k*^iZ)wD(VYL7Ih;l3iQE$Q{5mJB_wO;nttA8c-$ zrT018_4HM>QmXVm5&w-5JQ4ftba;j|Qa#aR(U78j?X^U0)bE^$*Mbb8eV8M(C7~A$ zrT3}TXEB10;RerV;o(w`_A)9(=lgl$wID;J{fd2vlehvWab-A(vwaCI&5ko)&_tkG zTi{%c)!I^JC_?8LJOijb3O*&ZNqtkii;}q?aFsV1lM4; z<0vAnP1y%MLR*w?@-c$&T4{?Sk|!d9XPog4ORb3HwHFPkY=4uZjyE|n1jjji=Gmel zMf2Ni7Tf-k0u_7@Ate5#+s$4B zG7U{DDu*X6%#Qg(ib%7ad(@V&cp_?8cf_4D+^0n^wsz;nCR3~1mZ69=6DflkSF+sp zj9dnNdn4O+gK9=gE43qdBHj<+n7Mf{SZqe+6p+yniulRc>)GF>#6%A5e>2=s~ zl2**qcpBG6&%PrIw2#A z;W&a8izYNVp@Le*`_x#q#usPXijaBSAb8gRcjzttq!%?b&TE?$%=cqtSs}9Yafw;3 z*6KKMZup-rceUhkdKur*5otZ=2<2q_z4ysvC||~?cK0i&guh-ZZBYax1H12q${Qkm z+;uK~2g?<~=-zIdg7G>s;`zv+`0IejkiC_L}U@ zM}3JZ=4z2Dz0bLeyUxst3f^^A8Om3C-9MYbT&>`<8QP+Vv=dQA%pm{FrO+rq?>Jh;W#@xKGVnlfJSY zX50c_%?@iKX4`%|h=}!)lDE9m{6P!q8g>gU&1vo*xPe{c1~%_q*6gB%`)XF22uTrHEY}=vz zqcT)>lYdl}v4q`nL8ghKQ5{4^#5;-yxAt?@D($-*L7a0IybZ{6PHoBguGid+^k=CB za`ZZ!rKXk)fh^4KLpIr+j{vyV?4D(M9WqF>uc_7!L$J#E&Fgq;k}K6X@ilW=-Yeo* zsvSy|-X{Y0eG2qf?eF_E`iAVz;u1wSneZ?f$~Q$B?A@4i@-C;(AZ?#e1oO|(SM*o$ z+<^B*ac4qXlC`X)hr6Rh#Cm(p8$x+YLgf9%KEh8I|9tKBiC4pIWtEq63e*9S<}Rd* zhOFW?oFf0>GIGACg+CHy6TzP@weq#_*fI=p1;?M3+pT`)A&T&?fUPn{Avo=2758h-{AV(OeKp_`Mqk~f4@MuuoS zDlLzveWkx4BrO?2;)mw+)oYcgI7d^Ik>2O}zzv}aH-t)mLr7#OBKa$7g`aNt4V4Lt zqmpL;RmO=B{B-@8OG}23IhNazG#SkfzOUnvEDYz)Y1C{yh=}*dI7`r9+Je`9#)Pxf zfF>f|RVza#oDjS-6V?QGfP_ZugHwIn5Gr{?NVQU`G#7^LAHplGk8t{$tH<8<7hx4?luiFPV&-FJ@wwUX)}0M?}Z?9M+n7p`U%RWf;QyUD^>(Eo=6c zBGT({UK@65%3wu}Rj)RJH-yrDZd!3XR7P%LqDt=*5l^aXAL(;_#C;;CO6WYwNL1mx zHfbfjZs+GU?=7YN>G>1hgh;aey(OPF``lTy(!SyisI;Hs-ck?umNGOQpZ^H%!ACq`nEE+WP&2H)S!?`D0Y!{%+b0?0wFwc(>Lg zlJwCKobB-$-eEG5yhZ-`TFb9;M0zfbypksAeQFh-kY?4uKl^ID^huk9CMVomDsgX# zm5B_YPpIT*+*>MeZ>bFTmQ0fc{wZ9`2YEBI@qFykF8|OcDlgu~46!f#M}~-Zof*lX zzmg24(q3=wQoG=_>3xoQ`Uy8>8-1H~7w+#i&y^9-4X7NERxSI-)_?4)0N}1B zEyEDaZV>Ns(kJ>Gzsc)^Z=}l6s+G#{uOlLPS85gO;PmZ5tFG-{Nk;OC9FO?iM9o`B z+LCJ`Pw?4o+&XBdE%thmztNiPi+5{@@b`C9%SZ^0AZyg9RoDJbQ8Q}c-fP-F5<1&C zyJ|;zO}^-brbl=K8#ja)Wn}wDh7j5QhERnYLbbmkl(i&H(h8<`#SNhfH-uO<$esY@ z4damAFOugVM~S;11@C^O=Z|rdoS*0sYgP%(xr?8!|BE%K zRQk+dvV-d*eli8CwV4ckQcpSg>L5S;0;>t%_1ioN9X>U}D$S~Gj?k8bj-NTuRBLg2 zho9ENig5OfyK1GJg3V^RQt=rzJ4?&$;5{|YM$W_(ZQBiqkkMz=7RS4AxD!`#wx_yS zj!;g`NnETUr}K|=62oy$XCck`UcY^kk{d zG5xHD=5r=^ex7|w0X>}EPS8&*Xg+7cKeLv2(aR)6lE?RX@2Z3B>kF7AkAG)I|CE1B zT0HTGb}0ADXoI+Mz$-L|{fA^8EWaV~O{D_GlrF9h}kMcjth}(EhaV3CQsI zhwxIW{VtjAWq5hMv%(*EQ9-!wyhan%*3+VA`I95oKWJWm#&Wv_-31*;{a+w5UP48* z^@v}C^`^}^PSWI>FU)Ur&k=z?|K>83YKxU-0v&qY(|7$}Ahbmh_rE$<5J%$N`3Yq8 zt6)47q2rO+=RSqq-~`0gYqSs#t~j%Q)K4e+F;_J1cmc645I@CCeD=DT{a4=^^i_n) zcJ4>(Oe#;t=Lpdjqk4Y*FAXVQdq0f1B8+M@1mAa#{E2GIP`*E0byokjgC{N?j?k8o z5J9VdVAp&d{vF>aP%Gk^-%RhnaNPLC*UXzRWauDcZ=Cx40&8Se3vt_8v-)3rV;7H5 zv~!{EYr;TTbw3=bqVQ_45Dzcf0b))B2TC9dY&aezog(eA4Z> zp&W5HY`7J++}M(#RNCt}1%O7+BR@)%cz8Bxv z%vqucd(ClH`R?M<5L9Kf4Xa}ujiy|odySMBX z$6WhLdD(0BkJ{&496{f^MnxGMwQFw=y=(7hW9|_~H5ww=u?^<#HF(M``Q5NDDPQ9h zWNZY)b;zamgXQ$$wv#C$_}#d}xmj4XH{kRY=S6Wh2rbH&9(?7e4RJCM_aPR&H~MyK zQ3SoxMceHjq5&=>{&cykt+n^uhL>uR%kcCO5q7U2T@lJD(vKh``#BD#F-GBL^fKaq^>{;}1&E8dB zO10T*bES8&tJT=mYFcDeoIgrs?}u4}-MPl@Tyb|+8H&(ecZ>jPL;!v!YKtNkR`Z&f z@AvbXno%pGqE<>}?+2~ePl!t@#w9945sYeVPW#BR#!d2yk)^gM;>qpiH{OoA_@6Fk zq9SyysO(4|K-r2?bQW93uT5BYm}25gK2I&-X#x9`D?xcvle``}&=;#?I-r zGAe4NRQ7(*3ZB{!U85Qe!S^%EyT)rY%L9T>m?Fxk7-d+Wuw}!G7xp*%-R^$RP)YQxEK{-uQ`|0 zzGjvTLvS=LOI36;cRfORDV4n+<}ROj!K&?W)pA8yrl?ek#;2oWmS8_GxSuORse+HO zd=N21jhMmbYTBX*waGC8sIjvZ+|?AJRNN&jheI9(1oo-I_9$yn1bw^ZhTbK@AM&T0 z<%23Oml3D~B6!PSp(40bo9sm2mXY!8&gx%`jJ1gXx&g-;Kx)Yma|FSDV#E|8fP}D2 zkK>$cg$STv#vLMngc!fwS^ZTv3c0hQeFRW2#MYQA7m)Ps76DCReR+%%NP5^(Rr4~%n`?61Rq0g`|Xwt zrP5w^Znp`q_3nd=M_Mv&US@9pmivPY$~Jj;;&9??oxAQis{9~o0LoXXcKzqfgm&-8 z`QQXQA8dFPLm5@`{y6Nl&zH9pH{G*;**i6tp$M%%IJYkl=L7L@t1_Voty1878jzb$ zj&nCr6+=pu-ltZINK~UC3Lw<-#A`ImiTDIQp^4u{!{5}SXkq_6!SUEu`i+RQ{?O|o zUMTsih=q^N>7TV4YcktrXq;dz>2GNn>S$W+@5n2Os?gLok zAI7I_aJnR_Vo0gd`_xJiiE1Y>fHG!|F;1$~XqIZ~8@bxbakiTb<;!(r*(AQt3y9syTdF#)C~Hv!=bL4E z&aK3V4;kb^h#9Q*#u!I6$z|Z%>&xSS*b@k=4zv-<$+xYkKh&(>KGMjao=bmm_fW_-V~2uCexrD zvbzqlyV|n5rgxPJGWOdn%5&F@d#&^2JxA56#H`48F}|L(`5r!oV=p8Ga?T!dPJS<$ zpCu+kskGO92H86i)XX5W7U9eM(`5S$vWE<^whXe74#cIO30ma{WRMjy$eJ0X%1|mh z1qdUEbLR@@&Na`SwM7y8Z8pE@Xg@O=_+G4M% zm2&dgc7<%aX11+bY456rKL4nZf7HxBR1>9o`~XzBpX2xCGFn0&RU?n`z9dlqp_KnB3Ju{m)ajkj%bI)cSf7>CYQZzgq_&<*ujrewz zOok$~4}DftBP*(y6={nit~miG8~5>KBjz}W7x>dHwM7xCtxmv+o&CYJx z2<7B+wHmov!CXySlrMJ!p2~#%1G!p_T&-ZPrY(w~KTh|^;*L|YcNJl;x#OtpX6GD+ z;BLu#cD6^Qvm%wDyhf5iH2f}N61%ab2zyN`?ZaFv(}aCuuT`tiSG@hedypZ!OJ_o= zm7;xiSMeUC-LkNA97Ql&O6O6${lK%Lklm#g<;x7f&Uf&wp%KB;C2dgz<1RaC;U z^s}=f)kHaYMEsMVk|}~2S<)(Dx|xiOFCtmjwUanxcRgfxC9^xF%5={V@m_8C{B~`@ zYn~`^1aqyB-Sv>!`J0)H)lGU^hM|3S*FknyGP}!oi40~ksdr=M_#kOM!Uso=pbVr zBAKsZwlgzQ8R|b2?X$ZI*s*c8;AET?Jrbi=(}Z!5-D1rV$T@q+ zIZNi8DkG!PUUxr0RJj@Mr5@Xo!N|$(q^dmJ#er5ohgSWVv6#L}m7U7*JgTx2tVC4| zDOGx(dla(N9V-B!TSi9Ej-wDG zejWAjzr{E)^l0HDOFM~4Xv+8xM3(rbzvAyL1S2x5w=)7XG(P*|W+}g!Ve3aD2bPGC*7dJG4a+*~wpWqR@(CYiD;# zrD*JGxVh8A`QSz^8HymMa3;*&#W`m+(g|;(8Yi=|jZiyAMsUp2Pq4#IL)%)JeTkmq zp_Z$)jPz}socs0iw-jsMwSK+%a$991Nc3H|@l*!7OCLJ7WVu_4DT~*yUs@iB3+DEx zUd|JfKxK$wGAfgyeD%B~m+^s3mkoA|ERQlaSaVXf%4V-r7e2p#hM){S6LssXBZo4y7ZU!2 z+1}_2#Nt;tclRGs*`5{}@h3;DzU%BpL&`I>bIYAGr#E@tvh^Hjm9>agxeOpWhG_FO zJ2FnRyfDkNUKAM_CwJ(AD~n}kK2Ti=tx&24)7%n4|Z8Ey-U2Rc$$zyQLF?UOwyCYK-LpcIMz@I+b4jiJ}871(*zu8t0NCR5tdgO zyk&7~U{3EO^e%as3`Jy|Ttsw;V9QER1g#X2aWbt6t|&_1U?)rsMB~Dg5!MGML`oqdqn)xEjh2I{Wef3 zBDW*X_JXrrskC=<8F393T!Sh@5g8|2=YBl6?tb~k@bSnv(fiPsl;(XpE3>ATk6^}0 zOz)Q3lJUhl-)@)4$$YyX#gVDP-kuQFwSMfC7hao&D!Wmt+eXlHYA+bNLEuHVq}R6* zY$K9Z(Np`rYE#*4=h!3}amVrFp)zy?Gfwoo75uIr^Aq=+)yzIcWSryk*0Q?A!OjY>!At3_)AVYbnhAKPJQ!7OrHfv_%i4;8? zVIEEq%E^1t3SQKYhf-?+%1}hci58FAS7C;0UorD)BWxW|cSSU_XIR{B z@p-aVR}^K$jHP5&MBRg50u}C*Dca=u%!^r3$;^w0_njNgYZRfJn%tng=o29~FrTPY zYEu*Gd(V)l!v0|zs>kqS-erezUa3~hgzQ``)6g==VRj^Whydg)tjQpKUu7-QZ)tZ9 zBPc#mcrmXvtyEiYNBoo9p$O*DcJenmBBO$am#)iO1lwZFajUq8Tg5eR6*Hp`r|e<3 zG^z}3Lb}$wM#Ve3jV3Y|{9We`?m5?X*E!r_D2CbyGlS0dCQn9+E;OS>%L|chxcj2xqOaLPQJp@L4~Deg+*I3zU*CpM}uP?Z<2?#t}V^$ zasFO-)9Y4~8HPw>gQ|+4a~Z0YQl)=TWnJfSHAHOmq;%ZfEimBDI@oo6fB*DU?rLDnplms06G4hzHo z<<2SIS*a8~Izp*b!@wPXyIh0X!W+MK0az%1VYcQHA%s>{C_v83}EK-OLT=YB-52a1vMZBu-nDuimC?p6&DF zp)K~BCw$5&M`+7Ph;TlLlehvWaWzlkR1@tV_2AB(37@zZeByUooS@lBcs4;h zx@qqVCs?-Qq#ce3JmJ>E6K*x1aN{XibDvUnvc!oa7*EN3U!|6C=4Ja*dY=e9=heeA zUbQ{v)$H_?5o4-^pjINI%d;YjGScgC#*!icJcCvJ>7|WpK7*yaGzv>-%0RunM7_Oa zye0oOK^hsss9~#MKXiwQ7jkah_Ijh>~7$u@RT}ZT-DI1`G1b!y)N_TiXM)zOh~EnTVZ^D9?#0~Ir=i)HY$dc zO3|asP=ww>^H1>9c!H!xwfR&YB>?eqLigFS(!VeUGH!IDd=P?oasryvBZBazEGGW*H*8 zd4~PG#(rLMKUW!Qhu$1%PGvae-uqa+M7^5&%EpVAfNeo~s< z*|xiNs-fP7@wX;R+?wq0)}%g5#+b@(F{b#DvmJM9OWdt3c(;~2q}`cd+-|oX7zc&9 z%Mtt_s)PSrIH&h5)cRIDaz=mAOZ@DFr9Nw<=R9oo3q$LC%08nJ@4E*-{7SWSok`Wj zKur1VjQ(4{JRFg6G8rAp$atZzOa>93T9u#NL>XJ)-s{>w3in`)B7z%H&Km- z;HOhY8Qzy9UcJoPq*WWCEeXBUYnbfdd!Aq9~(XaGkmYi@20F!e(I4C|nkf?e?3(uI@ zzsH5OlHTXs6&X(LP^$Dk5hA0T_>LxnT3vnC1J$4BTv>ewYcL_eOV*&ubB@$R5wYr_ zv-;Ou%Nv+EBID%f73dx48BRR>tp1GSha)mhj{QViIFgAMKC4*drT1yMAi9ZaGz2Z@ z=&^?>LlLTBdY>}lPnUByN$(BaiM;=jTWFKYYtJi1=v-2?mjM2uYLKMoGS+{6X8-Bk zgFNRp-R$b3Ua+J%0P90}{cz*y{onm&f?u^c!b=%JhEk6_PrQ0V8I|;cx4c0ls?iX%9OF^gY*&P8 znBI@G9plZPZh7#pW;bJ-sI;dkgQVfNTRy(R+-8m{LOBuOf4Y>Rmh<&{UZ3Ds)YuT& z>=U$e-{>yr-HDy;^H?9sm#@Ea+jze|av4X=SkPGn#AjQGP3F$(AN7ZTP&7VgV8(*p zQ$XwhM8->GEIEEoLc6Jl4)uO?`6tT*sx7=$rV073debh8yKCP!lp~IMZc4Su7H<>- zEg4Fsy^d$%o|#gu1H?f5A%=s>;xdb2gHFuXp18DUNXP&U2%^1xrI9{!Yj?)-jLd7 zbBh1xh+|Ki8~57YkfL*h@=_|D$N7p`|rdYKf{hl(bqZT5%03B2kTo zpbYHJh3(D>k$bo#n=(LMSOjpxhv$tLw`ZIf=@%C1zkboY5p#o#6XTMSJ2d+_@#+mJ zReGOVDI!sghM?u}Ze@(foFY`i^gdmTdOtc};YesI;e}hl{9gdBxQEO_Zt# z^txb4#XX(-xwhz&fVn^JtRB}4gYkKmhVfLQnW zDaDpRXp15?`^7o^3uaD=T77GsP3xKU{NfMvJ|g|{`xo|Stvk_cl_QX`)W}#m%ve;0 zQr&Y-_@w-hO{~1f3iTcE?;im|TNJVW+ZQ&OMLvRxNb{;Uq_P_Xhdq<=cM)NfmOCdZe5XaD)l$)l>q8NVYBU68AW|x=YLF1% zgHcaq#~K1t{DPu7fo82c#Ilk0}3m%E64as=X@it!I)AC;k0^n8C? z94aBsZ4Sg%&rhjnhqfq!KIZPJyGQTid&~D%@YKdj`$}c!y{j_l+qeFA&_vNuLX<(@ zzTrfEHci-N456HweXt}}`KH%lom&m4i5Z3=xa;q?59KZO5l4{6nHcw4k5GL_mO(^} z84A__luFlm;zUH;o&EYqEnz>m6|D2PiDbMC)m>#|vMuxSo`JF2DRYChipV%IA7pk{ zT0Z#lH-{rKPL@aczDm48=4JBI`?Ne}ULKKnjfUVFj8We(8Ok?V9z8=B69m5@-nDs^ z5cwPfZTRUD!FYG=8^cUggw9X{1R07@n-uLU6BVNwi)2hIMjRjBY_eZ>$_bwdcn)Hp zO|P!@z^Ya0x>6O56D(vC7emJ9fKXma#mwTlyMjFD?mqd^>gi|Ks3*nP$29S=&(g_0 z%E%F~JUgYjWb-#FW{@gFshIWM|6=Gve0L@?uM^;bIzVWPBA8!Y^r0yucppV*@2c#4 zJQTs%9_F#mvG)E!s>fEC?7fd7GEP>R@H0`V((91pgqcqnu_iMN!K#X_4@Eb%jA83T zsZuX+MX8L$w>OktgGzd#sr&eK-lnp+Bq1mx)-1g*VI9sqC#ejPak9Fo_gAd-HU3o) z87Heiddm~9P(w6%>HX+SShMtq#A`G}^d+pM4nwGhi4$d{pKi(eo_U5ur9Cb43P3!e zfLf@nb44hpB!LKRN!B8!Mm;gDsDwd;EG>#iBS@_fFBFU$e9RySR&i|Iscc`x=`fn{ zk&Gb7cfl@Ur7GH2SPE2FDppvOmr@;j+YIqOsIU~Mu+*%uDAkf>XZ6>5{~q4^T zip~*ghf?W0_PcYlqLeDV4wdb&f;khh{&@1^*I=UR4JECX`ct6BV`PX#H5!64So2}+ zhY?vq1V3p0D#_+LkLR`C!|@c!G9mSF87DiB@-bX$31_K>PVZ9&E6$96*w0DEXo$8i z;pv-YEQxP#NJkd;GEm_}WujtbLR)k$DJNfOeoc1 zn|J$Pe`0sPK61p3&#qCfhDhVq7Q)?nM&HFKL($F^sJotu`s?vPC@-bD;keWKYgM~> zdALXRz1_<9A9QW?slU8YDAg6eJ+;5trzS66vit9ba>OO5I8Q<5b!bJqj0 z{~<%Y&jO(>irC`5Q~jREyv;dOSV~k_daSVMd9B){oSggm^#_*k_|lWThn{$&P`=lE z`{e!w&+q2#$Yro{jtsKH3{rV173HPc(zk(_c*s!a=xDjMD1x$|9h?+F4(D1u(wP8X4FKetAC@kx&sKZ90E#aU^UyBzU6 zR@8Rb3xCl+(rNE)8pg3LdH@cV=0)ia6h+` zT$Pt`a>zdlc!jGbY*@@mWY{%bpjdF;BCD>gdm`0|c#%q}vj zqi6Of-nH}MGr#w!&x#V_*=bMq4uFi^TQVrmsPyCy&zKzZWbeyBJO(?m7DXI{lV9rv z2cO%c@1@_>6GgQtIyM+$(ULZN|l|x zIC!^;UXC74TNI%uG>8DsSfQquqlZ(fOm{icK@<+e(Ln6TF_#uaEVtLf{%IGDkMnBp z_1CUXykf`lhnQDNb^Or_`fnV#i=S6H;=pfgQGXPEcc+#NrP4DU=S~7*10dc7gtjPR zi+7%vytYGpRU^JC7+>jGk=mr3oSS*Yj`e5PU%TwU4&{5qV+;F}b|3HU$YsFu)bv2~ zKFUj}Hu>4P5;I_p*Iesd=h~u(&9*qdKkXfpV(%jAs}c1T^oguZTU?^@loLMJ8P#)o zIeIunD3w;#eGFIA%hAJWiz2l4?jy1q5m|>3nNq3lIpRmxA6U;m>dDR?Kxm61ZdiD} zj}sY};!|i(I==qXPh9bPjE7Q9d*%H8zh9l`$0J8v1sNU0iQ`)`l#1G>2zfRTQ;&MG z_dvA6S`CVf!dVIKtxs}BC8mYDMG2Veu-~5!Z{~mpNg@MwkU$* zZ<&R2@NPA|ocC~Iq3WI^5Rui0$SOu;DnqHXM(X3MnjXl!k5va0p*2z;U)A(L^gc?( z*>3qqj)2dt>3ivS6`^)yXa`?a(`PmQD&|f~#npV~kyGM|g0HISv*@psYQ>+O*WdPp z$&J5C2>7a+KCAIpQHJuRceP3gKA{N+`Yie@ZBYb$<;4^Ch*}{|tPm&Gj1#pAto@^$ z5c^<;AR?<7ktsr{@)|PYs|xW|O<$rdir{`_btWHQRrGT7a7v}R=Llwx^g#4JDkG!9 zPHpuv$M~v;_^P(}%39ipmv;@-FXwRos)zemwcWq6I0dWvsm<&J3a(%bC;i zbkuHzH5LjLqgtz9I>uKW`YigZtVIxvQPY?s>gyott1aqlqyzDp75DV>HAf&8?I9Me zEfzII+YUqfII)8`v1Xi@@lqLxcbi^d)K?(tt1aqlcmZ+z(R=z;%cwRX;13J>MfyaQ zp;XKn(yE2$Dd>UdeY8apjL6ffMbuXy>Z=*`F?X_4B$cO}aN2kKqGFT#r`G$y`zT+B zDE!uKgB`gHW~hkaycbno8I@Fxd<<98FM6LSEsA*Khh6cB%$pHe)|NY)Z&!I*nesP; zO56~tctePpsUeh#nSMGyhtDnPd+B#olX>T!*3hB36+4tl>smfe zEa`jcceO&=y5(^3JdK-?Gx~z89QhhKlI5V)UwYIJHSR;k$mnIIX<= ze->Bw{dDQ}%GXUkrGL&Tlf50e3`Bh;qP~hzpYl?wD<1y3#EDBzJigqncGbC;pm(K3 z5nJqhl1KO)*C7@y5sUU1i)wvO|Kk(bHth$!ToDjJkdg^9g4;`2|>?^skE0)+BXD$bstojoDW#FH?uzVSbci(fvv zbo-3znUnh4zdW&79|^$>l^%%RM`b8quK$$RP6c8%5aWQ*7DaGvT5gE-0e^*9G~~`w z-&1+Y$vI}h^m2`diMTNFWWXW6}TlkZutoClw^<5R(3S)b5f-MRC4KOQ*(zN(PF_U%t5cmQ%|Ef0@h3s1OHP^~<@h0C77Iy`KXiEp5b~XPH)4W5q6ul{=+fRns07 zPWX0}bCxNtfBJ;7I{1J}`Cf6}%>I=t1v@A^$$%Xd?YN_*RYrB*Tp7VH192M=`_OW2 z5x!@CW3Ke>_1Fp4h8-2=l~(Jt7cx$a$SOo+eqLn=k*9Sn=P(mJ;vmS#S_GlhFXU0! z1JA=OS&Oqos8shHan>IfS2qH&KIX2rC}P8t7NmLXzJEwv{U_$tZ!oWv>fkTUZN?)< zOhJS(AG7^0nC&VE-C*6rogF*YXirjfkvZM5Zl@(CU|u zuWH0s1>-BFQr&aJ2fsM2{>Vd%i<>a7v_%msu6#kWi#qq!woBn6TH955&w0|sr6OxKr6RoDAkh(ULX z>YgJIU)6}OD#lkTL#eb%<)ft<(Ne`|Nm~@bxnQ*{WD^*3L`xN;rHl&W{L@u-_cJ_4 z{2X>Xb;VNVRfx!HMr6vDetz(W zdjwyb$-t>)g;UF#rZw&4{c*L{?iwX1p>g$awEbQ6A%~3h`CV_)4j`pMUPvJ^cD$ zRFe=fPOL4yG8q|_)R~+^d{xkA`S?m(gfC;erWYLIs{-*=&G;&-Uupj+CwCa)#7kkv zHisTiWtsqS)5d!?@otiVXsJN7RQqU2c&R3g=hON?v{WEksu?Y5iy|0nH*<`$-Phq5 z!!iG8YI-71IXT8x1>&ok@s;vryldl;%RqcpBEG5_Unwu8(&~i$2`@P>xS^Skd-qOzz#~r$J`N-Dm;2biSkx@z22PHiQNH1iZ93rw35n08EOc6?@^%>_7k(G$ZDn?}5qKLEC3stock^MJv!8hhD zQ|;5TLv_y)%?6^xcthEi#D$2r6$CE}8Taf!Alf*M*4$hilgm7BjzaogwMMMd8& z4hc0xX4^U9mq2`b{xa3gEri;kXy@(%;!?;sAX;wHm5S)eD@}?s@%x8OEzddih0a$o zuas)xvf-vA*GG;(v{WKmDi|%Pz8Mw9KV>X`17edy>*D-46RjmfV2)V~?_;L_}6HB2$D?Y1PO_WF;c9k`Y`s1d~x!s2&s`PP1p=+3^r_~FvMO4|)ghEio!Blnd#0pXyPwkYC}r)Ks~{^2gZ z7f@%wu68?S{1WsocW0}&Y5yoE=RWx#7Z!KDZJ@jpb|~K&U&FHiF4&RF*zmL$I_F{K z_FGzIRETPJTe5SUS9hHLLgxw~rUAj&$6DHmrCqb*G5C@1!=LOJqa~}JWx5L|$M~v3 zd{tU}WeAnW_|baAxfkHw76EY+d`Z?Ke6?!i+{aFPp?5XxIId*}Wti?c;;PeM=*SLhudg1&yjrCtL#ecC5gb|8ZgUOU$cVV2AR3{h~SjpIj2` z$Ymf}su3;u^`X3!>cG<%iog085U&97AFxAP6!F)E=QLiz$8a@bxYEaPQlV3M%E>uI zWHll(-0nw2CJ3cs9^Lq3Mr1W2vXT**wqyvY8u|FDMtoH=zEUdHUF%GU`Vdu4f`_{R zo?2TJapK13HeMUg34in5^}#zoSG?=rAFP#X;Z_S8f0ZNNvvjX|4t&<#Eg4G1Dn;7Q zi8u;~KLepHidb>u^ZG9iOp5*rQD2RyuVB=tRW7wjIXQ>;sz!WOFuqcRQfYk#F&q$x zWC}(y+Ms)-a>PkMjGy~LXXh3|?NGFHKZfNe&v~JD zXtdmA zV|hOi#{gk7(OMM2Ikw>6yGN}M_0@>_Dn@-;<N_)tvG{#8)-qtD5nZQmO7a0`XOi_^S5tmB>&kt+wEkhk-zRRWrWQ7Ddq8 zSytSfX4E|G(`uAjtDJm9RwE*-8IdVp`W4Fua~U}8t8m&^^R!QSDV0`td?ZsLlBpTV zXp17a`&i8ZQ8;D@;wztRD;0MG%eHd_qP`kYU(Kjb5o(8`aiWNwlQI~QDKDksZZ~tU zJ>pD6d{rU7su^D?)hV;_8B+hA-0bHGf%vM2_^M`nr7|+Uhz6``%45V~obaLNh)e#2wSIQo&rM(M=R192inoJ^Bm>b>2hmb( z(Ne=ps2I8uzS2((-!6X*Beij{d|+v2Fka=XML_^hw7dq5G|F6mU@hqREAP%bq6PL$cPY^ z^ca_Diz2iJgz5(}qPNVux3>^lDbei|7yG4{JhE$h?Yu3OC3f_ zDnqGgUy6|L1>(=M?(NKsc36udD0{~7lj6KW3|AtC>oA7XDwoR3WgsFe5s?*)$P|%L zNj(TRIeKM>lY2#)5slP5;Y zSKnc!@{^yRTFi*!VSU2!_}EV;`SHjRJAUik<;%#5xT~oQrQ&+DI+Jr-W1T+_pS4N! z4A!Cuu6e5gIk&=(pDDKZ-U`~O68e{Pc80iA=C~<O%kiM|({n|}HE#arhdS{!=%(X~>og=cMFMPDuX@hbfs zaV@;)^|wA#yb7&UhEmbHTGhz8_d%mefOs4TZBYb$@I|YbR_ly^u9%A+{%?#2{khfK zRGxCeZZPN2Vux>@U+e`tl<(_D&+4CgLa-y3u`hPDqtL?-x3p3!?sitCK5y;C^luI@Mh{`S_}X_^RYgR76IFz1`|e@a>2IehI`k zf#9xhEp3EVjqn``8(h}e96syjwjHWFI3>imcVE_dY5bby^FUCBwPe=f{m)%%mQUGn zT<7)^Z!3<#cqr9@)mi=P)(+!AP6=_$2AB1ofsCas8A_#9BV=ChzO1(=?6?+)tVQ@< z@!D(|4@65nL`x;3C9OuOO&KS5{Ep*#{{uS?fgP#|Uq6cz46ct{2BM`3(Nf81NqH$1 zqyDr$zIx=;Y8fD&0YY08am7A!Wqlxqs}RGLjNzC~*!oa;%E>uIWECQ^k`b9AluGMC zJ|e3Sk(G?dv_%nGHS+OQh4`vqe5F*Xdye?W!#7t)0P%Mqv_%nHoHSDy_Eo_^L*HRWZKO7DaG%rF;;leKk(|YM%CKHA>|v zCm)ejh{!5NWXhNG>eo+)xILGF)4mF)eKk+}l$TOzb;mhGG8H13nvsmQD1yE+W!s3a zD#TY6<13}2_gVLhkfr7bM12*azKT(wBGe8=`-rSUL{>2(Q(j6%?`m1GkFP4kR~6$c zrCRaaIsNHp<5P#Y4`v9&R~6zbRM2x7O2z%EsTwi9st{k*jIXps5!@54=78@$!#;@k z%GXP@%B40bC-~i?R;ylJdR_JTxPO?1+&^B$=i%CZo@5|e>LFUH87(QVOcO){R&8+( z(NYi5Qf<+awX_je?h|S!K8EWdhN~@xvuc#eW5i*cuxb&PAik;?Un$?K250y8c`DdJ zM3RB{s)P8dw)m>yB~*+V(|91h>L9+V8DC{Bg3ua}W3<#kv{YHN)JO+nE!<*d@8*b= z$B*m%5s1&i4%N49hoPP8?=r4)5fIaW$askiMwv}7xKnnYvHjIM{G+$eil=!Q4KE=0 zX>Y$fcGZ54c>7VS6-zKn+A@@iQNPU|+~hcNwPL#`uB)a}D``>0vn!p|%rR8YkDOW{ z>Z=*`F&{7wpf)Kd+;x6!u=CP}PxtnP9m<#eW_IK<5G@smmMTU|%1f!3Ety}z`T6Wa zi|+z483=7r1am4|^Ef3#Y=s!EVhqRp%sjHnQ%=qyA}bJ)RgB0Kp;XL}(~g6PtUyFo zF(T6zMKF6cuZEcKfhWv0|=F_ zRQvsCX8(alLR5oqciiad&f|X@?CphlrBphvas;BK0?|^B(UQtgsyiP%Q{t;#PP(o5 z$*0Hlwg*C66tU#|nI6Gj@G)G87_P?{PODrhPdOpSLH3Aod-s1?rhV5s|eBf}Y4SJ$wTHx6Uuth0odvmeU(p zWlJ^5IGGpi(2HigLAcgg8$K2hX+Ciy_(gjlyAm~QAU9%qhOSw2&JN*PnDv7 zVf6kD#IZz3iz0HZ;;z==u9mfk9UL30Qs5KicAv2b`=Cc;ErQ^_n=Hrf+`;Z#*zRoA znzpIJ?!TN_gY3WO`nMF87GI`xx(%|453tv8Eu^W?p$Ga zF1R~uiz0HZFcW(=6SEevgR!sG7M;Uv@7Zk6S_JVdK0Cfy1>9>Z?6n1b31jMJ?n*5q zutyc#qZFZ3nj!lgr^1d?aL3UWMQ9%F zeMt{Hj`t->rM@Ibz$f<1CuS|uyPHf4-*_GNkBC@Af0eZef}GMmh&`&p9@XI6?TIjcLQxvM6MNldj;QK(YGr?sWj8`zP*BP_ffdE zD1yCi5eGh-3UMe-8Y-SNXeO-klv6W;K4wt9I)b?joHSH8X{dP8puChyGfVH=EBN+` zzFk`s!Filw(YOYC+&`2`waO83oqI&qBC|wuLm!3H!}%yYYY_zfO3FX5e^l5%P?ZSY z$Fc^MmvJ&r?K75)m&l+^O(x^8e^l5%D()Ye4=Ue`lSLVReQ-Z-)`7^#q7QmF?&rR* zxc4>vE{H6CwEaAchh{&5$T&HC{%(cO->vxhyZYTO`l)RCT^G$KO?7eeC;PTd{UlfR zRrpp+`P6KW;3s8=?_Lg{lx?3j%uoLg-!p57mzLYA=5Lrw`{KJGW`}QTa(q1>_XP(A z-}2sl7mu4Z53diJu%P#U7Yx+=^$4T#mIw5+1M~Vj{d%8>rX`sSLx8W7*Ga}OL^o=c zX##ZfKKqEM@T2+$s(-w8y0=3Sr0v!oA-dDrM5XA!J4ak_8@^Y21ay$MaeYtk@Sh?# z=TD>};!j_g*Z121Iuq!s#Ye$5dS`8-^DYR z?0|lIGZ~30$O!0XZ-2*@am<4ZjPnJzZQJzKa2em3xS;nM<`jN2g!Pq2NFP!w=ayN1 ztNQWfq8%m!BbaH`yf1ci^H~ku8!AP6A^uPJW>Tfn*XIxI9qa>bGakcaBr26h2!8R? zExUW3-v8V)Q&L}vRtX)b!*}r58f5Qg=pD}NU-i@;jaH+`Kwl-k1A|9R8;c!@O3_g( zZ^yBpIl1qynCzuzT0veyU%u_?^;h?Os5qiCP%7f}C#Uy6{+rzve`L?&bDJol%RlTZ zMQ}6|-+{qjtTYxo5|yF@{~%-aKc3iM|Gm3=JKFLR`e!e1T#x_2+~Qo=ks%J5-oJ43 zU`LLo0YOeTL(q=IcVO^~SMJq};OO%zQ7Jm`=U*aE^c4us64j9M68cM>fqMD_z0P#l zp@@Nxhwq2yc;sj@r-ZhQobSNke{MGxI}(*@75E1kl>Ydm6JwtwnUL<@%~AEUa5UvLN~|><6(%L@4#UF$ev>uk3^+f1^)aS=kCE1Jg?j)mGL6x z)wB=Htq!&I5fNM;zt}9;k)z3+6529ohiY}{H^yQ|qEd9=A7pTCU%A$JZ-<}ZQA5g0 z=nJvVzqs#1)t6z1A}+pjMt|2UCi?Nn(KH~)2|m$eyi`Q3sfi@-d`RJ$l>@TiCL0tTYnf+4-LSN-*wL=j(-+{q* zJ+|u@`YKVWR&ORl5s#iS78!{u*D8&9+YUv1Ymc$WNK^xZ32mdn@wjJ4+_e7M&Y@4F zr`c}_{jK-UtyX+x7Mv$>1d9~%K3}F1K$}NuwkM^;|4m*d}k=p-fmdBP{t9!3FcMNtUDn*lf_-WRM z+R?~M=BM(n@WEHk9)lf;O3`m7LlId2 z(WW;W^F)DywIh0&AfqKOp%=hk&DnPK@|fh?!*~SW z?#DyN$=lEkmNdS-u_N&v7=+J{@4s1JC8~kJgbw`qceo5iJoe~VWF)Fwt2D3T?&bB( z`VDg|p@+r02T$;bxS#vJ%F#4{R?rTW!MU6G!ec~Efzks!GWR8kO3{&eL>Y=$b@Ie9 zj7Or%wMurxh{f}2+mz7lm>LmTK!h01_f?Lj0l}6ghKu?R3?{w=8|5W*J2x-{a|7gR!Cy(Qdn>yBFYL%= zDBpoW<3!rg=T)Lobl@M5Z5fJqa+S$r=&MAPYnA4eUpZF_}9Kelr=0IQNTF#?V)ZD%UF6L63}@jOV5O#(9;{?HtDt z%yDl1-0sO=#Xj`C)by3g$oUQo8Ydz~pI3=WwenK@pQg6djE5q&`o~^l=&MAPYnA#c zR--(xwoM65L&7iYL1ckC)o=uBeQw`ItC3}}uM*#Z!KV)0yFrZJSBXl|Q7isu70Ad- z`63FxYAiAmm7?EFh9b^cG!_|&D%WcCzEXtt?&y7$s0IcTns)pMb=PgIhTM#luWUB` zw!z{1?s)o#2lEC~r_{Ms>$V=#WHc{eiA|Js}H}>dw zHW4+19d7NnZdKmDY)b|-OnkZHa3(@Fe%_?78Y)E-(x5~W_Cn$tUO#f-8MzFA^S&Y? zP$_yO8O=G4XqC|MY$D{Hs#SbVbgaEMmJheX%ZPTUR^k1|YN$7o9mCP2y949BDeC$* z=1OI+A6;kP9e22p=TT8cm#^9~5>@D{fX3Ox$K$*TGTgp9`g1O^oSYImo=ucIpD+(c zg!PZ-o1v-8|6pybZ0BkwBjXFLn)lz#jzpzeQAYT|nG~fryp-?2;P`#_3ig56&)sf7 zr8H(8Xqhpbgs0IcT+9Zr*ha#3=W-Kxi)xcmv zznKh0Z2t2-$1om=YG5#--%N%gZaix&G7{CmU_!r{3`H_}9KHVK?pmTggbTV6u%_^VUv zYpz|sBGM47St-KaA8tq9qPo+=jm3^crRdS@U|%U>V6CypNK}ee8MGEBF}~m1HYIfI zEC0RWhG1VQ!rmX=S9#08VB(9@r6`*^jqVc@m7+(pgMFolHKzsp-dskaQnbpj>X6N= zk!5^p#|kFh;(*VN zMMk1hbS5L5D0zL`HYN1MzhAFDVBJZfuOfndr3kCNkI+{lgLWjo1B0gxjKz*brRdS@ zpbSNP@ZI>H5r2p2&DMFMQuLe2P{dAmoj(Q{iE3alq2Ek~B0hcig=3JBs0IcTT4lsj zt1#xRu}SD_o?Bd9JAIlTb3^zs7lgfUy=zjsb>1>CnD`D1e(!|c78_!8zniEOZ4$WG zMj4)0TV6r~(G9;1!dtFrM$VW1VS;}@NodR9yh?m=GWxr**pa9douo8c#XeEK*q!mT z+yB3>5|yG=hMgRfS7teEO6WM|HIatkm@C5GH?2%cx6WIX@4(=s({>+&9f?ZOCV}J8 zmZ6A$T|O2Wi7MC1q(DZzkw6RE@)A1w#L!oAhd~j_$@ugCTn6V=;yW<-;`qJB&{v5{ z(Mig18H(r~J{B2?D%Z-SbnCcVdVOinm-mh z5|yIO3XVsN6GzZQWyJW($L)ro9jc+dKirPIMfoB^{_$AsNK}eeJ7QGq?P$wO=n?Xd z#k4~a$|*@;U*#>T`@rCBkB-HTM5X8?rODO29c_6D-Ode=(Rn)*L7Vvg$m5Y(RCj2F zJC}wSeUD01idH*fO{N(Sm6yR+nKzL60?g89qI2rdD?0$*ep;ZL^{PcTw_wx)Au>&fFtmvnu9Z;P(*t%l%7Z*2YZ1iOi|`5KO&Vo z-oH22`RqnssBDW2r@RcUG6G`q4SQCTV8_>yx$&m5uL9UGutXw-q+5i;*odGH;FRs_ZSu{vYA|g?Ij`}%ica*Dp}dr8lmDIVS8cEZQFvjQ zmr>D|D3!e*5K)S^LuDvJdp*}mTNJ@H|Ah}tj=g*P_m(e?{?(}^u}0;6xKP>qnO30h zW@Dc5t;O#+5ltDUl^-XkeWfk-+O*=B2gL91@AZy_U!R3v z-2n{YsbcR2#B;yxbv_U3lUoQKo7_|X>;7KnLQo%!->gOW+PrG)XlA1Fwb!&GN8tW$ zf&059@9(ONjOxw>@~q5XHkw-u0&xiKkQPPQ8Vp*+QRkRvyMfA6PT4HU_9#WzY9781 zW-X$j`LW@MtVIxa?t5-}-pKs{Ui4pY-LSqGyP6`*bJCw@vfa|$5rbewGfA0 zby0uI^Z3k1+ONWH@F&PP1fF__*3PLi%xedP?1NpUve&vt1;lNKZ&W|?*iL@uG%B{3 zRz%qQe!p^p=o-~%h#=#FZJ(%i{M4%TYTTn<<*@93)=TYHou zloKLL@ZS(}Uck<&Ez0*(yI$P?(A|4PPfd;f2{|3e&=y5(_`XZ}JFd1T5O~hhemHkC z#1XQqscZxA{~WR6yXH3;i=rDumk8yhR5stdCo+gf-1)Xk`!{Sf#apN{)IOholvdL> zDy~kIVebbS$XFVLQH_QO>l}GhX=g0Pi!Jt=d>4Lee)G(i&%7Fhwv2=bS{(+@bNPmI ziyPs6UO(@G=IJv-P@Zyf4!875JS9}{DWUOu;d?&fb9ahRPR`*DWQpgaI($A#TXMb^ zHcyN>M_>5#?|YpS@V|4ZMG^PiH{T;dU&SHh2$pAWbXosv`-i9KRGxCOArE&imKFsht<}-f_`D)>n$Y;ysu5k3Nol$e8*#JXO5jPwweKOjoJw zHP?2Ixb(XpsrSEr&+29PUDa2qwAb-@mWbI)#O^Brp)HE|)ZZ`dU$+;taB8&-@|$C> zxPUdXu2R`+YLz1{#!he=qWve)yDCGeY@LT)?NA^d!XCo?Lt7MK9xiCbvA|Ck|1yNG z6_xF&M?~muspuS`yp&4kagH#bNDEbl+K07*ssx^*EBF+hQmOA!dCuJl>aPMd3=wl2 zu2e%d`FWJEdL=^?Pgf#Ps5wq`rt^Z4C54JOa$V?Kn%7b8AT{3bSeDRmr>7H z76@%ozUKMDEIAoIaVu1Eo(Do(6rsM0ed>R@kd`5AA0%Iu9q9uoL)dOfgrakV@=_{W zgTao7=~64(W!R!J)IR4>Juh(!$=|FoDvd1K=p131jE3O*4Z_bvm0_>Va@B0wtbt?}caF)2^=w<>VZmL@M!ge|2t4 zhHB`2W%KOweTd;++Hh_)2!ysMf+J|paA#wlMH#Aza%vD9^GpVPZS%CW#w!j_pOyHu zg^HDJ<)xZrXcOXPXiI#J=!Ku?Au-XY2xh5Xvi~3NnH`BD&$1m2EHGwwWN1OeqPhzweD){&)X**qI`}`65xqe~``9kLcE3RkcgCazopn+S=cVU}q-_(! zb!d=M*=z3yL;M(J#Q4guTB8!byCV_ye(<6(PV_QjZ0LDqR8dAi#8|Y0Sk(L#_@c%t zR2iB>;p1J}p;Q`++WTQQknw=O3cVPt4gDkXnk?1J=&Fn`f+4;RXoD)wlU zCpOu<>S12lcz~*nP^~04uz9t(-B+2sV1i#&xgF6aFHf~KfbRga!&}H04xdusUuQic zkYt)Cv=;8-DZMK&{PXq^a1om?28{(Li{e?FQ|7iD{KV2Z}HBLcBtd|t1 zmspN73=yja{{1GeEs)n{GL&!3EF&W3wFUB8tJeA!MZ|m%@5dT4=9I6nWC(f&KKn|~ zkZTp^6;RFTtEW;#t`!jc=@Oy56hSY6yDgqmQxW#DiBZwlDwVw-JayndT!tcS6*P!O zD{WB(y#(&eM6F^C+2=S$MXi*|-fv{U>Y$a%P=u|52GMAxEs8KN5fHIDSfDy+QHIyo z)&$2{WjEEq0+oquCMrVbah?yFCbV2NvG*H08q3uVMP#uZt&Tr=l%WX9uqPrKt^BGr zDjN@@viBRUMwFp^IfCi=20b@0Dw~N$W$!mKx)6fjZmqmHUoBe7E!W-I5R{<^dq2of zt*m7^1pXUj@Vn=LX*E8-i3hLTdopVy`KKXs)Orqg?~A9nuh{VM4Ss zdP6ARd{-Nm(Z~Hx5$r>HpP-elbEUG^v?E6h%g>_>rDD{Vp4-QLxDxl_D&B|F7Dbqc z3tELag};b0%!@MqP-~SFDLD)MOw4v?MJOi%5<**)ule>Y_UTe9ZBaz5a>ke;o{Sba z8O;#3FL8fW+4v5Ha9&&Dyf#C`(^ns5C>papoTU~xOU?R9sccUS`+2OSmh1whve)#Y zIU-g$3sgBX8A@e-H}q9JsU9Z7?4S&l*VK1CLis9{y&v{-m0^5op}kfa!SZ+ypu{}@ zyG`Zy50#;4=l)+^*BWcvRh1Vi1T>nfh~c3GlGYXpq{>xe;p}y3CDaycf}kY?t22#85rn?@rVzi-Sj z=J>|i=bYTf%9`UFkNFs5KE_CzrTISm7HQV)=mI&*cTC512ZukL@P`x0b29U#+bmP{urSt5`d zRo9$s_Q>8bgv#@rDVIUg_P1vU?IAoDuOjwj6uvEwED@mQPtW*mC1R~-{5k>|TN`9- z&A)`YTJjBRE28n=mr&C(9lH>mb4 z#~hA#s<~F1f=c-k;kP5)4nYiB5@~5SXvs;4 zrj_UEkI2)HybOy5fgoSy)b9d}xC;=uwR?z|MYS2S=UI-(vn(={Z_GFw!f!#0xCK#U zXuYY1Y=w;HMY_yUV#Zn4I0P20bdBRV!XBMnh9L?skx^zGyzR8Yw^(O>i&go?Jkds% zpzXHP3b&p1=T|yslo@Bg%`xION16L*T@`JIi}=kBSD|L_T_9`}P3^l{iXI02HdQI% zxC4THDc-k!CGAnhppNa(s*Q8M(_r2w{0Hkt5%GQ>5mcuktfnLDo-(H3WhLT$!oxL$ z@8XzNx{8lyYEoL0bDxr}9%n_=kmr%)%lUPjY}t&gWW?he*w*6|q389OQ!n!L13{a3 zcb+l|8V1|X#NO__9^g1&f9+`W#L(91Sx-PX)oBQOUlA%pb>}GP*${iR$iL^T3&D0ID+0FMy-x6 zTi2GmmNAN!2-JvcwY>8ad;?)#O*9#$gBbM<42k7rYjyjlXT4Y(DB{Gd7w;vR zbEAmx;7vyH?c$x4O3_`XeHjuBBKkBLI%f#JtRJO{_xqMB70)J^DQQ%i!^AHL@E%J) zwT#%O2<3FT9g6T18Xr+ABdBOcJX5QX!T0rqS4-lVh_JjNmiOqxi+W!&Pvm{f{gv;q zm`_xyc&3bskXsOgpMWA3T^0ESu(oFo*mKQvV&9Ehrtxfcp!eiA2YgOFV@@6OU2ip; zAsb(xA-fEmV9m%$UA;8-OQ6-2vA1Bp%l91Yx$iUB$!L64gS8mX)XH}d9D$R#8QHi8 z%*OS-43iNEqAS9`;$b^1EQvhbc%}?R+fAh9UPiYg&=nzjGPa8oeV5kqIqV3uWg(S4 znYaxUh_E9OvVS#k2P$Th@k|+twwo4p|H`w613?)TvD_UDZyA1&G8Aq1Kgted%w7XQ z85Q9&T5oT5*f?;it4&7p)b@V=dl@mK4}{4m2(K%X;T9UNcosWc#`3!#u;Xg>-9U&P zj_@|OzUzI-O5$1C!x4Mq!*kUFA?@J^@4Grati*et)s>=$VL3h`k1Pur}%ud8}4uS?)ZKfzWhHg8{hNn3)^cKh+98# z2WHC+QP6f9@R^_9Y+j4etGo);6fz($ep-w=cbDCRqjc3!IR&82uO9otoyY(8l4eIi z2&ak|v_z~Wr!RYe-^hvIW!iAlTuKB%dH?Z(K>YZXXXn>oCVnUCN)dl~`CZ4?K1eE9 ztFnjJJ$l*v2AnorzCb+rd3Rz*kl#x<+7q|K!2V!R>BGw1*-n<4@0e9}BIlwQ{e{TmDnXdJR=TDgsPxpmT`btMvZiu9Ef3=689sh#f{wYK?^!Da=Ki1|S$~QT& zmw0bqp|@L%iW!R{Y^*q^VfZjc?XSaUUB8f_d^t8>@LGN!kh3NC3@dmBiyu*<2zrb= zzMBYYg`dg(MXXg`HqIYze5+QcA?UAu;Ze?(HakTd_bx+uDV5IDhT%z=GkgJ_;a6hL z;F{=+tRk8X{I|{%*~}_3}5%+ zGxIx;o$y|^hgho!kF`m)E`0Mn+d~jjN4>s>y# z@p1kWv}u7rbsZi@$;k+6^^-ST+`a(TzlL#85W|f)F}bgO#U;^{@q|k+Y@dn9dBp

&FWXhfCWGd5alxk)eoO8?bhL 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 XTk#YexduE9hnMJEt2!d(dGz^z?CV)t literal 0 HcmV?d00001 From 3375b53141ee552f94fabd0a165d38e3e12eeea8 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 7 Jan 2025 16:15:00 +0100 Subject: [PATCH 30/33] Qidi Plus4 profile improvements (#7868) * Added new filament (PLA High Speed) * Changed default infill to crosshatch * Added precise wall option --- resources/profiles/Qidi.json | 16 +++++++++++ ... High Speed @Qidi X-Plus 4 0.2 nozzle.json | 24 +++++++++++++++++ ... High Speed @Qidi X-Plus 4 0.4 nozzle.json | 24 +++++++++++++++++ ... High Speed @Qidi X-Plus 4 0.6 nozzle.json | 27 +++++++++++++++++++ ... High Speed @Qidi X-Plus 4 0.8 nozzle.json | 27 +++++++++++++++++++ .../profiles/Qidi/machine/Qidi X-Plus 4.json | 2 +- .../Qidi/process/fdm_process_common.json | 2 +- .../Qidi/process/fdm_process_qidi_common.json | 3 ++- 8 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 resources/profiles/Qidi/filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.4 nozzle.json create mode 100644 resources/profiles/Qidi/filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.6 nozzle.json create mode 100644 resources/profiles/Qidi/filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.8 nozzle.json diff --git a/resources/profiles/Qidi.json b/resources/profiles/Qidi.json index b99f868073a..fb4ed61f386 100644 --- a/resources/profiles/Qidi.json +++ b/resources/profiles/Qidi.json @@ -772,6 +772,22 @@ "name": "Qidi Generic PLA @Qidi X-Smart 3 0.2 nozzle", "sub_path": "filament/Qidi Generic PLA @Qidi X-Smart 3 0.2 nozzle.json" }, + { + "name": "Qidi Generic PLA High Speed @Qidi X-Plus 4 0.2 nozzle", + "sub_path": "filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.2 nozzle.json" + }, + { + "name": "Qidi Generic PLA High Speed @Qidi X-Plus 4 0.4 nozzle", + "sub_path": "filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.4 nozzle.json" + }, + { + "name": "Qidi Generic PLA High Speed @Qidi X-Plus 4 0.6 nozzle", + "sub_path": "filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.6 nozzle.json" + }, + { + "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": "Qidi Generic TPU 95A", "sub_path": "filament/Qidi Generic TPU 95A.json" diff --git a/resources/profiles/Qidi/filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.2 nozzle.json b/resources/profiles/Qidi/filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.2 nozzle.json new file mode 100644 index 00000000000..7154a7ede39 --- /dev/null +++ b/resources/profiles/Qidi/filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.2 nozzle.json @@ -0,0 +1,24 @@ +{ + "type": "filament", + "filament_id": "GFL99", + "setting_id": "GFSL99", + "name": "Qidi Generic PLA High Speed @Qidi X-Plus 4 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Qidi Generic PLA @Qidi X-Plus 4 0.2 nozzle", + "slow_down_layer_time": [ + "6" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "pressure_advance": [ + "0.034" + ], + "nozzle_temperature": [ + "220" + ], + "compatible_printers": [ + "Qidi X-Plus 4 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.4 nozzle.json b/resources/profiles/Qidi/filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.4 nozzle.json new file mode 100644 index 00000000000..457adb293b7 --- /dev/null +++ b/resources/profiles/Qidi/filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.4 nozzle.json @@ -0,0 +1,24 @@ +{ + "type": "filament", + "filament_id": "GFL99", + "setting_id": "GFSL99", + "name": "Qidi Generic PLA High Speed @Qidi X-Plus 4 0.4 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Qidi Generic PLA @Qidi X-Plus 4 0.4 nozzle", + "slow_down_layer_time": [ + "6" + ], + "filament_max_volumetric_speed": [ + "18" + ], + "pressure_advance": [ + "0.034" + ], + "nozzle_temperature": [ + "220" + ], + "compatible_printers": [ + "Qidi X-Plus 4 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/Qidi/filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.6 nozzle.json b/resources/profiles/Qidi/filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.6 nozzle.json new file mode 100644 index 00000000000..7586e3d4b5f --- /dev/null +++ b/resources/profiles/Qidi/filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.6 nozzle.json @@ -0,0 +1,27 @@ +{ + "type": "filament", + "filament_id": "GFL99", + "setting_id": "GFSL99", + "name": "Qidi Generic PLA High Speed @Qidi X-Plus 4 0.6 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Qidi Generic PLA @Qidi X-Plus 4 0.6 nozzle", + "slow_down_layer_time": [ + "6" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.016" + ], + "filament_max_volumetric_speed": [ + "18" + ], + "nozzle_temperature": [ + "220" + ], + "compatible_printers": [ + "Qidi X-Plus 4 0.6 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.8 nozzle.json b/resources/profiles/Qidi/filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.8 nozzle.json new file mode 100644 index 00000000000..6abc3ea405b --- /dev/null +++ b/resources/profiles/Qidi/filament/Qidi Generic PLA High Speed @Qidi X-Plus 4 0.8 nozzle.json @@ -0,0 +1,27 @@ +{ + "type": "filament", + "filament_id": "GFL99", + "setting_id": "GFSL99", + "name": "Qidi Generic PLA High Speed @Qidi X-Plus 4 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Qidi Generic PLA @Qidi X-Plus 4 0.8 nozzle", + "slow_down_layer_time": [ + "6" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.008" + ], + "filament_max_volumetric_speed": [ + "18" + ], + "nozzle_temperature": [ + "220" + ], + "compatible_printers": [ + "Qidi X-Plus 4 0.8 nozzle" + ] +} diff --git a/resources/profiles/Qidi/machine/Qidi X-Plus 4.json b/resources/profiles/Qidi/machine/Qidi X-Plus 4.json index ea5f3d8cebe..c76df889adc 100644 --- a/resources/profiles/Qidi/machine/Qidi X-Plus 4.json +++ b/resources/profiles/Qidi/machine/Qidi X-Plus 4.json @@ -8,5 +8,5 @@ "bed_model": "qidi_xplus4_buildplate_model.stl", "bed_texture": "qidi_xplus4_buildplate_texture.png", "hotend_model": "qidi_xseries_gen3_hotend.stl", - "default_materials": "QIDI PLA Rapido @Qidi X-Plus 4 0.4 nozzle;QIDI PLA Rapido @Qidi X-Plus 4 0.2 nozzle;QIDI PLA Rapido @Qidi X-Plus 4 0.6 nozzle;QIDI PLA Rapido @Qidi X-Plus 4 0.8 nozzle;QIDI ABS Rapido @Qidi X-Plus 4 0.4 nozzle;QIDI ABS Rapido @Qidi X-Plus 4 0.2 nozzle;QIDI ABS Rapido @Qidi X-Plus 4 0.6 nozzle;QIDI ABS Rapido @Qidi X-Plus 4 0.8 nozzle;QIDI PETG Tough @Qidi X-Plus 4 0.4 nozzle;QIDI PETG Tough @Qidi X-Plus 4 0.2 nozzle;QIDI PETG Tough @Qidi X-Plus 4 0.6 nozzle;QIDI PETG Tough @Qidi X-Plus 4 0.8 nozzle;QIDI PLA Rapido Matte @Qidi X-Plus 4 0.4 nozzle;QIDI PLA Rapido Matte @Qidi X-Plus 4 0.2 nozzle;QIDI PLA Rapido Matte @Qidi X-Plus 4 0.6 nozzle;QIDI PLA Rapido Matte @Qidi X-Plus 4 0.8 nozzle;QIDI ASA @Qidi X-Plus 4 0.4 nozzle;QIDI ASA @Qidi X-Plus 4 0.2 nozzle;QIDI ASA @Qidi X-Plus 4 0.6 nozzle;QIDI ASA @Qidi X-Plus 4 0.8 nozzle;Qidi Generic PETG @Qidi X-Plus 4 0.4 nozzle;Qidi Generic PETG @Qidi X-Plus 4 0.2 nozzle;Qidi Generic PETG @Qidi X-Plus 4 0.6 nozzle;Qidi Generic PETG @Qidi X-Plus 4 0.8 nozzle;Qidi Generic PLA Silk @Qidi X-Plus 4 0.4 nozzle;Qidi Generic PLA @Qidi X-Plus 4 0.4 nozzle;Qidi Generic PLA @Qidi X-Plus 4 0.2 nozzle;Qidi Generic PLA @Qidi X-Plus 4 0.6 nozzle;Qidi Generic PLA @Qidi X-Plus 4 0.8 nozzle" + "default_materials": "QIDI PLA Rapido @Qidi X-Plus 4 0.4 nozzle;QIDI PLA Rapido @Qidi X-Plus 4 0.2 nozzle;QIDI PLA Rapido @Qidi X-Plus 4 0.6 nozzle;QIDI PLA Rapido @Qidi X-Plus 4 0.8 nozzle;QIDI ABS Rapido @Qidi X-Plus 4 0.4 nozzle;QIDI ABS Rapido @Qidi X-Plus 4 0.2 nozzle;QIDI ABS Rapido @Qidi X-Plus 4 0.6 nozzle;QIDI ABS Rapido @Qidi X-Plus 4 0.8 nozzle;QIDI PETG Tough @Qidi X-Plus 4 0.4 nozzle;QIDI PETG Tough @Qidi X-Plus 4 0.2 nozzle;QIDI PETG Tough @Qidi X-Plus 4 0.6 nozzle;QIDI PETG Tough @Qidi X-Plus 4 0.8 nozzle;QIDI PLA Rapido Matte @Qidi X-Plus 4 0.4 nozzle;QIDI PLA Rapido Matte @Qidi X-Plus 4 0.2 nozzle;QIDI PLA Rapido Matte @Qidi X-Plus 4 0.6 nozzle;QIDI PLA Rapido Matte @Qidi X-Plus 4 0.8 nozzle;QIDI ASA @Qidi X-Plus 4 0.4 nozzle;QIDI ASA @Qidi X-Plus 4 0.2 nozzle;QIDI ASA @Qidi X-Plus 4 0.6 nozzle;QIDI ASA @Qidi X-Plus 4 0.8 nozzle;Qidi Generic PETG @Qidi X-Plus 4 0.4 nozzle;Qidi Generic PETG @Qidi X-Plus 4 0.2 nozzle;Qidi Generic PETG @Qidi X-Plus 4 0.6 nozzle;Qidi Generic PETG @Qidi X-Plus 4 0.8 nozzle;Qidi Generic PLA Silk @Qidi X-Plus 4 0.4 nozzle;Qidi Generic PLA @Qidi X-Plus 4 0.4 nozzle;Qidi Generic PLA @Qidi X-Plus 4 0.2 nozzle;Qidi Generic PLA @Qidi X-Plus 4 0.6 nozzle;Qidi Generic PLA @Qidi X-Plus 4 0.8 nozzle;Qidi Generic PLA High Speed @Qidi X-Plus 4 0.4 nozzle;Qidi Generic PLA High Speed @Qidi X-Plus 4 0.2 nozzle;Qidi Generic PLA High Speed @Qidi X-Plus 4 0.6 nozzle;Qidi Generic PLA High Speed @Qidi X-Plus 4 0.8 nozzle" } diff --git a/resources/profiles/Qidi/process/fdm_process_common.json b/resources/profiles/Qidi/process/fdm_process_common.json index 42558a5d191..244d5f66135 100644 --- a/resources/profiles/Qidi/process/fdm_process_common.json +++ b/resources/profiles/Qidi/process/fdm_process_common.json @@ -18,7 +18,7 @@ "line_width": "0.45", "infill_direction": "45", "sparse_infill_density": "15%", - "sparse_infill_pattern": "grid", + "sparse_infill_pattern": "crosshatch", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "initial_layer_speed": "20", diff --git a/resources/profiles/Qidi/process/fdm_process_qidi_common.json b/resources/profiles/Qidi/process/fdm_process_qidi_common.json index d776fe2bd1f..041b21dd00b 100644 --- a/resources/profiles/Qidi/process/fdm_process_qidi_common.json +++ b/resources/profiles/Qidi/process/fdm_process_qidi_common.json @@ -27,7 +27,7 @@ "line_width": "0.4", "infill_direction": "45", "sparse_infill_density": "15%", - "sparse_infill_pattern": "grid", + "sparse_infill_pattern": "crosshatch", "initial_layer_acceleration": "500", "travel_acceleration": "700", "inner_wall_acceleration": "500", @@ -89,6 +89,7 @@ "initial_layer_speed": "15", "initial_layer_infill_speed": "20", "outer_wall_speed": "25", + "precise_outer_wall": "1", "inner_wall_speed": "40", "internal_solid_infill_speed": "40", "top_surface_speed": "30", From 4e19c305aeb8a1ef80c243623f6b0c452566375e Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 7 Jan 2025 16:15:48 +0100 Subject: [PATCH 31/33] Added French translations (#7869) * Added French translations --- localization/i18n/fr/OrcaSlicer_fr.po | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/localization/i18n/fr/OrcaSlicer_fr.po b/localization/i18n/fr/OrcaSlicer_fr.po index 607ce9f42ff..fbfd1a150ee 100644 --- a/localization/i18n/fr/OrcaSlicer_fr.po +++ b/localization/i18n/fr/OrcaSlicer_fr.po @@ -11253,7 +11253,7 @@ msgstr "Pressure Advance (Klipper) AKA Linear Advance (Marlin)" msgid "Enable adaptive pressure advance (beta)" msgstr "Activer l’avance de pression adaptative (beta)" -#, fuzzy, no-c-format, no-boost-format +#, no-c-format, no-boost-format msgid "" "With increasing print speeds (and hence increasing volumetric flow through " "the nozzle) and increasing accelerations, it has been observed that the " @@ -11295,6 +11295,7 @@ msgstr "" "remplacée. Cependant, une valeur par défaut raisonnable est fortement " "recommandée pour servir de solution de secours et en cas de changement " "d’outil.\n" +"\n" msgid "Adaptive pressure advance measurements (beta)" msgstr "Mesures adaptatives de l’avance de pression (beta)" @@ -13275,12 +13276,15 @@ msgid "Force a retraction when changes layer" msgstr "Cela force une rétraction sur les changements de couche." msgid "Retract on top layer" -msgstr "" +msgstr "Rétracter sur la couche supérieure" msgid "" "Force a retraction on top layer. Disabling could prevent clog on very slow " "patterns with small movements, like Hilbert curve" msgstr "" +"Force la rétraction de la couche supérieure. La désactivation pourrait " +"empêcher le bouchage des motifs très lents avec de petits mouvements, comme " +"la courbe de Hilbert." msgid "Retraction Length" msgstr "Longueur de Rétraction" From a90cc292e988364ff0829337e1eb52c9aa74b72a Mon Sep 17 00:00:00 2001 From: Arne Keller Date: Tue, 7 Jan 2025 16:25:32 +0100 Subject: [PATCH 32/33] Fix compatibility with newer Boost (#7884) * PrintBase.cpp: fix compatibility with newer Boost * Plater.cpp: fix compatibility with newer Boost * RemovableDriveManager.cpp: fix compatibility with newer Boost * AuxiliaryDataViewModel.cpp: fix compatibility with newer Boost --- src/libslic3r/PrintBase.cpp | 2 +- src/slic3r/GUI/AuxiliaryDataViewModel.cpp | 2 +- src/slic3r/GUI/Plater.cpp | 2 +- src/slic3r/GUI/RemovableDriveManager.cpp | 3 +-- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/PrintBase.cpp b/src/libslic3r/PrintBase.cpp index 25b282c7baf..81ee858c267 100644 --- a/src/libslic3r/PrintBase.cpp +++ b/src/libslic3r/PrintBase.cpp @@ -79,7 +79,7 @@ std::string PrintBase::output_filename(const std::string &format, const std::str cfg.opt_string("input_filename_base") + default_ext : this->placeholder_parser().process(format, 0, &cfg); if (filename.extension().empty()) - filename = boost::filesystem::change_extension(filename, default_ext); + filename.replace_extension(default_ext); return filename.string(); } catch (std::runtime_error &err) { throw Slic3r::PlaceholderParserError(L("Failed processing of the filename_format template.") + "\n" + err.what()); diff --git a/src/slic3r/GUI/AuxiliaryDataViewModel.cpp b/src/slic3r/GUI/AuxiliaryDataViewModel.cpp index 50368b85443..cad5cf5455d 100644 --- a/src/slic3r/GUI/AuxiliaryDataViewModel.cpp +++ b/src/slic3r/GUI/AuxiliaryDataViewModel.cpp @@ -337,7 +337,7 @@ wxDataViewItemArray AuxiliaryModel::ImportFile(AuxiliaryModelNode* sel, wxArrayS dir_path += "\\" + src_bfs_path.filename().generic_wstring(); boost::system::error_code ec; - if (!fs::copy_file(src_bfs_path, fs::path(dir_path.ToStdWstring()), fs::copy_option::overwrite_if_exists, ec)) + if (!fs::copy_file(src_bfs_path, fs::path(dir_path.ToStdWstring()), fs::copy_options::overwrite_existing, ec)) continue; // Update model data diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index f3782be140d..e12f0c321c9 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -10265,7 +10265,7 @@ bool Plater::preview_zip_archive(const boost::filesystem::path& archive_path) std::replace(name.begin(), name.end(), '\\', '/'); // rename if file exists std::string filename = path.filename().string(); - std::string extension = boost::filesystem::extension(path); + std::string extension = path.extension().string(); std::string just_filename = filename.substr(0, filename.size() - extension.size()); std::string final_filename = just_filename; diff --git a/src/slic3r/GUI/RemovableDriveManager.cpp b/src/slic3r/GUI/RemovableDriveManager.cpp index a26e13448da..83ec4695c7d 100644 --- a/src/slic3r/GUI/RemovableDriveManager.cpp +++ b/src/slic3r/GUI/RemovableDriveManager.cpp @@ -22,7 +22,6 @@ #include #include #include -#include #include #endif @@ -202,7 +201,7 @@ namespace search_for_drives_internal stat(path.c_str(), &buf); uid_t uid = buf.st_uid; if (getuid() == uid) - out.emplace_back(DriveData{ boost::filesystem::basename(boost::filesystem::path(path)), path }); + out.emplace_back(DriveData{ boost::filesystem::path(path).stem().string(), path }); } } } From 3e520c713ccfeba711429fe13ea404fc96d215ed Mon Sep 17 00:00:00 2001 From: Co Print 3D Printing Technologies <138680258+coprint@users.noreply.github.com> Date: Tue, 7 Jan 2025 18:26:52 +0300 Subject: [PATCH 33/33] Add New Machine Profiles and Improve Existing Settings for Co Print ChromaSet 0.4 (#7889) Add files via upload Improved the existing 'Co Print ChromaSet 0.4 nozzle' and 'Co Print ChromaSet 0.4 nozzle fast' machine files. Added new machine files: 'Co Print ChromaSet 0.4 nozzle - Ender-3 V3' and 'Co Print ChromaSet 0.4 nozzle - Ender-3 V3 Plus'. Enhanced the '0.2mm Standard @Co Print ChromaSet 0.4' and '0.2mm Fast @Co Print ChromaSet 0.4' process files. Updated the 'CoPrint Generic PLA' file to ensure compatibility with the newly added machine files. Co-authored-by: SoftFever --- resources/profiles/Co Print.json | 8 + .../filament/CoPrint Generic PLA.json | 6 +- .../filament/fdm_filament_common.json | 4 +- .../Co Print/filament/fdm_filament_pla.json | 8 +- ...hromaSet 0.4 nozzle - Ender-3 V3 Plus.json | 150 ++++++++++++++++++ ...int ChromaSet 0.4 nozzle - Ender-3 V3.json | 150 ++++++++++++++++++ .../Co Print ChromaSet 0.4 nozzle fast.json | 15 +- .../Co Print ChromaSet 0.4 nozzle.json | 25 +-- .../Co Print/machine/fdm_coprint_common.json | 25 +-- .../Co Print/machine/fdm_machine_common.json | 12 +- .../0.2mm Fast @Co Print ChromaSet 0.4.json | 13 +- ....2mm Standard @Co Print ChromaSet 0.4.json | 4 +- .../Co Print/process/fdm_process_common.json | 42 ++--- .../process/fdm_process_coprint_common.json | 48 +++--- 14 files changed, 415 insertions(+), 95 deletions(-) create mode 100644 resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle - Ender-3 V3 Plus.json create mode 100644 resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle - Ender-3 V3.json diff --git a/resources/profiles/Co Print.json b/resources/profiles/Co Print.json index 049814d4ede..a21f5940fab 100644 --- a/resources/profiles/Co Print.json +++ b/resources/profiles/Co Print.json @@ -47,6 +47,14 @@ "name": "Co Print ChromaSet 0.4 nozzle", "sub_path": "machine/Co Print ChromaSet 0.4 nozzle.json" }, + { + "name": "Co Print ChromaSet 0.4 nozzle - Ender-3 V3", + "sub_path": "machine/Co Print ChromaSet 0.4 nozzle - Ender-3 V3.json" + }, + { + "name": "Co Print ChromaSet 0.4 nozzle - Ender-3 V3 Plus", + "sub_path": "machine/Co Print ChromaSet 0.4 nozzle - Ender-3 V3 Plus.json" + }, { "name": "Co Print ChromaSet 0.4 nozzle fast", "sub_path": "machine/Co Print ChromaSet 0.4 nozzle fast.json" diff --git a/resources/profiles/Co Print/filament/CoPrint Generic PLA.json b/resources/profiles/Co Print/filament/CoPrint Generic PLA.json index 0c0fde13715..467830fc77d 100644 --- a/resources/profiles/Co Print/filament/CoPrint Generic PLA.json +++ b/resources/profiles/Co Print/filament/CoPrint Generic PLA.json @@ -7,13 +7,15 @@ "instantiation": "true", "inherits": "fdm_filament_pla", "filament_load_time": [ - "10" + "9.75" ], "filament_unload_time": [ - "10" + "9.75" ], "compatible_printers": [ "Co Print ChromaSet 0.4 nozzle", + "Co Print ChromaSet 0.4 nozzle - Ender-3 V3", + "Co Print ChromaSet 0.4 nozzle - Ender-3 V3 Plus", "Co Print ChromaSet 0.4 nozzle fast" ] } diff --git a/resources/profiles/Co Print/filament/fdm_filament_common.json b/resources/profiles/Co Print/filament/fdm_filament_common.json index 6b50d8385b0..27d081eae86 100644 --- a/resources/profiles/Co Print/filament/fdm_filament_common.json +++ b/resources/profiles/Co Print/filament/fdm_filament_common.json @@ -41,7 +41,7 @@ ], "filament_flow_ratio": [ - "0.91" + "0.95" ], "reduce_fan_stop_start_freq": [ "0" @@ -62,7 +62,7 @@ "1.75" ], "filament_max_volumetric_speed": [ - "15" + "14" ], "filament_minimal_purge_on_wipe_tower": [ "15" diff --git a/resources/profiles/Co Print/filament/fdm_filament_pla.json b/resources/profiles/Co Print/filament/fdm_filament_pla.json index e3b8ae5e245..49e6e1fc279 100644 --- a/resources/profiles/Co Print/filament/fdm_filament_pla.json +++ b/resources/profiles/Co Print/filament/fdm_filament_pla.json @@ -56,14 +56,14 @@ "1.75" ], "filament_flow_ratio": [ - "0.91" + "0.95" ], "filament_is_support": [ "0" ], "filament_max_volumetric_speed": [ - "15" + "14" ], "filament_minimal_purge_on_wipe_tower": [ "15" @@ -175,10 +175,10 @@ "90" ], "filament_load_time": [ - "0" + "9.75" ], "filament_unload_time": [ - "0" + "9.75" ], "filament_toolchange_delay": [ "0" diff --git a/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle - Ender-3 V3 Plus.json b/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle - Ender-3 V3 Plus.json new file mode 100644 index 00000000000..d7dbb1cddb8 --- /dev/null +++ b/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle - Ender-3 V3 Plus.json @@ -0,0 +1,150 @@ +{ + "type": "machine", + "setting_id": "GM001", + "name": "Co Print ChromaSet 0.4 nozzle - Ender-3 V3 Plus", + "from": "system", + "instantiation": "true", + "inherits": "fdm_machine_common", + "printer_model": "Co Print ChromaSet", + "default_print_profile": "0.2mm Standard @Co Print ChromaSet 0.4", + "printer_variant": "0.4", + "nozzle_diameter": [ + "0.4" + ], + "retract_before_wipe": [ + "0%" + ], + "printable_area": [ + "0x0", + "290x0", + "290x283", + "0x283" + ], + "printable_height": "330", + "gcode_flavor": "klipper", + "retraction_length": [ + "0.5" + ], + "machine_max_speed_e": [ + "100" + ], + "machine_max_speed_x": [ + "500" + ], + "machine_max_speed_y": [ + "500" + ], + "machine_max_speed_z": [ + "10" + ], + "machine_max_acceleration_e": [ + "2500" + ], + "machine_max_acceleration_extruding": [ + "5000" + ], + "machine_max_acceleration_retracting": [ + "2500" + ], + "machine_max_acceleration_travel": [ + "40000" + ], + "machine_max_acceleration_x": [ + "5000" + ], + "machine_max_acceleration_y": [ + "5000" + ], + "machine_max_acceleration_z": [ + "100" + ], + "machine_max_jerk_e": [ + "2.5" + ], + "machine_max_jerk_x": [ + "8" + ], + "machine_max_jerk_y": [ + "8" + ], + "machine_max_jerk_z": [ + "0.2" + ], + "z_hop": [ + "0.2" + ], + "retraction_speed": [ + "60" + ], + "deretraction_speed": [ + "30" + ], + "retraction_minimum_travel": [ + "1" + ], + "retract_length_toolchange": [ + "2" + ], + "wipe": [ + "1" + ], + "wipe_distance": [ + "2" + ], + "thumbnails": [ + "300x300", + "400x300", + "96x96", + "32x32" + ], + "retract_lift_below": [ + "343" + ], + "thumbnails_format": "PNG", + "machine_start_gcode": "start_print EXTRUDER=[initial_extruder] EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]", + "machine_end_gcode": "end_print", + "change_filament_gcode": "FILAMENT_CHANGE LAYER_NUM=[layer_num] NEXT_EXTRUDER=[next_extruder]", + "default_filament_profile": [ + "Co Print PLA" + ], + "extruder_clearance_radius": [ + "65" + ], + "extruder_clearance_height_to_rod": [ + "36" + ], + "extruder_clearance_height_to_lid": [ + "140" + ], + "min_layer_height": [ + "0.08" + ], + "max_layer_height": [ + "0.32" + ], + "retract_restart_extra": [ + "0" + ], + "cooling_tube_retraction": [ + "0" + ], + "cooling_tube_length": [ + "0" + ], + "parking_pos_retraction": [ + "25" + ], + "retract_when_changing_layer": [ + "0" + ], + "extra_loading_move": [ + "0" + ], + "high_current_on_filament_swap": [ + "1" + ], + + "z_hop_types": "Spiral Lift" + + +} \ No newline at end of file diff --git a/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle - Ender-3 V3.json b/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle - Ender-3 V3.json new file mode 100644 index 00000000000..a93a312ae7f --- /dev/null +++ b/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle - Ender-3 V3.json @@ -0,0 +1,150 @@ +{ + "type": "machine", + "setting_id": "GM001", + "name": "Co Print ChromaSet 0.4 nozzle - Ender-3 V3", + "from": "system", + "instantiation": "true", + "inherits": "fdm_machine_common", + "printer_model": "Co Print ChromaSet", + "default_print_profile": "0.2mm Standard @Co Print ChromaSet 0.4", + "printer_variant": "0.4", + "nozzle_diameter": [ + "0.4" + ], + "retract_before_wipe": [ + "0%" + ], + "printable_area": [ + "0x0", + "180x0", + "180x173", + "0x173" + ], + "printable_height": "250", + "gcode_flavor": "klipper", + "retraction_length": [ + "0.5" + ], + "machine_max_speed_e": [ + "100" + ], + "machine_max_speed_x": [ + "500" + ], + "machine_max_speed_y": [ + "500" + ], + "machine_max_speed_z": [ + "10" + ], + "machine_max_acceleration_e": [ + "2500" + ], + "machine_max_acceleration_extruding": [ + "5000" + ], + "machine_max_acceleration_retracting": [ + "2500" + ], + "machine_max_acceleration_travel": [ + "40000" + ], + "machine_max_acceleration_x": [ + "5000" + ], + "machine_max_acceleration_y": [ + "5000" + ], + "machine_max_acceleration_z": [ + "100" + ], + "machine_max_jerk_e": [ + "2.5" + ], + "machine_max_jerk_x": [ + "8" + ], + "machine_max_jerk_y": [ + "8" + ], + "machine_max_jerk_z": [ + "0.2" + ], + "z_hop": [ + "0.2" + ], + "retraction_speed": [ + "60" + ], + "deretraction_speed": [ + "30" + ], + "retraction_minimum_travel": [ + "1" + ], + "retract_length_toolchange": [ + "2" + ], + "wipe": [ + "1" + ], + "wipe_distance": [ + "2" + ], + "thumbnails": [ + "300x300", + "400x300", + "96x96", + "32x32" + ], + "retract_lift_below": [ + "343" + ], + "thumbnails_format": "PNG", + "machine_start_gcode": "start_print EXTRUDER=[initial_extruder] EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]", + "machine_end_gcode": "end_print", + "change_filament_gcode": "FILAMENT_CHANGE LAYER_NUM=[layer_num] NEXT_EXTRUDER=[next_extruder]", + "default_filament_profile": [ + "Co Print PLA" + ], + "extruder_clearance_radius": [ + "65" + ], + "extruder_clearance_height_to_rod": [ + "36" + ], + "extruder_clearance_height_to_lid": [ + "140" + ], + "min_layer_height": [ + "0.08" + ], + "max_layer_height": [ + "0.32" + ], + "retract_restart_extra": [ + "0" + ], + "cooling_tube_retraction": [ + "0" + ], + "cooling_tube_length": [ + "0" + ], + "parking_pos_retraction": [ + "25" + ], + "retract_when_changing_layer": [ + "0" + ], + "extra_loading_move": [ + "0" + ], + "high_current_on_filament_swap": [ + "1" + ], + + "z_hop_types": "Spiral Lift" + + +} \ No newline at end of file diff --git a/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle fast.json b/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle fast.json index 07be5635322..ab8b3771228 100644 --- a/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle fast.json +++ b/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle fast.json @@ -12,7 +12,7 @@ "0.4" ], "retract_before_wipe": [ - "70%" + "0%" ], "printable_area": [ "0x0", @@ -20,13 +20,13 @@ "225x225", "0x225" ], - "printable_height": "345", + "printable_height": "250", "gcode_flavor": "klipper", "retraction_length": [ - "1" + "0.5" ], "machine_max_speed_e": [ - "20" + "100" ], "machine_max_speed_x": [ "700" @@ -74,7 +74,7 @@ "0.2" ], "retraction_speed": [ - "30" + "60" ], "deretraction_speed": [ "30" @@ -94,6 +94,7 @@ "thumbnails": [ "300x300", "400x300", + "96x96", "32x32" ], "retract_lift_below": [ @@ -134,7 +135,7 @@ "25" ], "retract_when_changing_layer": [ - "1" + "0" ], "extra_loading_move": [ "0" @@ -143,7 +144,7 @@ "1" ], - "z_hop_types": "Normal Lift" + "z_hop_types": "Spiral Lift" } \ No newline at end of file diff --git a/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle.json b/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle.json index b8e02072ee2..5a6858a137f 100644 --- a/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle.json +++ b/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle.json @@ -12,7 +12,7 @@ "0.4" ], "retract_before_wipe": [ - "70%" + "0%" ], "printable_area": [ "0x0", @@ -20,10 +20,10 @@ "225x225", "0x225" ], - "printable_height": "345", + "printable_height": "250", "gcode_flavor": "klipper", "retraction_length": [ - "1" + "0.5" ], "machine_max_speed_e": [ "100" @@ -35,7 +35,7 @@ "500" ], "machine_max_speed_z": [ - "20" + "10" ], "machine_max_acceleration_e": [ "2500" @@ -56,16 +56,16 @@ "5000" ], "machine_max_acceleration_z": [ - "500" + "100" ], "machine_max_jerk_e": [ "2.5" ], "machine_max_jerk_x": [ - "10" + "8" ], "machine_max_jerk_y": [ - "10" + "8" ], "machine_max_jerk_z": [ "0.2" @@ -74,10 +74,10 @@ "0.2" ], "retraction_speed": [ - "50" + "60" ], "deretraction_speed": [ - "50" + "30" ], "retraction_minimum_travel": [ "1" @@ -86,7 +86,7 @@ "2" ], "wipe": [ - "0" + "1" ], "wipe_distance": [ "2" @@ -94,6 +94,7 @@ "thumbnails": [ "300x300", "400x300", + "96x96", "32x32" ], "retract_lift_below": [ @@ -134,7 +135,7 @@ "25" ], "retract_when_changing_layer": [ - "1" + "0" ], "extra_loading_move": [ "0" @@ -143,7 +144,7 @@ "1" ], - "z_hop_types": "Normal Lift" + "z_hop_types": "Spiral Lift" } \ No newline at end of file diff --git a/resources/profiles/Co Print/machine/fdm_coprint_common.json b/resources/profiles/Co Print/machine/fdm_coprint_common.json index 8cfeb1be12b..3d13604e332 100644 --- a/resources/profiles/Co Print/machine/fdm_coprint_common.json +++ b/resources/profiles/Co Print/machine/fdm_coprint_common.json @@ -10,18 +10,18 @@ "0.4" ], "retract_before_wipe": [ - "70%" + "0%" ], "printable_area": [ "0x0", - "350x0", - "350x350", - "0x350" + "225x0", + "225x225", + "0x225" ], - "printable_height": "345", + "printable_height": "250", "gcode_flavor": "klipper", "retraction_length": [ - "1" + "0.5" ], "machine_max_speed_e": [ "100" @@ -33,7 +33,7 @@ "500" ], "machine_max_speed_z": [ - "20" + "10" ], "machine_max_acceleration_e": [ "2500" @@ -54,16 +54,16 @@ "5000" ], "machine_max_acceleration_z": [ - "500" + "100" ], "machine_max_jerk_e": [ "2.5" ], "machine_max_jerk_x": [ - "10" + "8" ], "machine_max_jerk_y": [ - "10" + "8" ], "machine_max_jerk_z": [ "0.2" @@ -72,10 +72,10 @@ "0.2" ], "retraction_speed": [ - "50" + "60" ], "deretraction_speed": [ - "50" + "30" ], "retraction_minimum_travel": [ "1" @@ -89,6 +89,7 @@ "thumbnails": [ "300x300", "400x300", + "96x96", "32x32" ], "retract_lift_below": [ diff --git a/resources/profiles/Co Print/machine/fdm_machine_common.json b/resources/profiles/Co Print/machine/fdm_machine_common.json index 37eae97975a..a24474d89b9 100644 --- a/resources/profiles/Co Print/machine/fdm_machine_common.json +++ b/resources/profiles/Co Print/machine/fdm_machine_common.json @@ -5,7 +5,7 @@ "instantiation": "false", "printer_technology": "FFF", "deretraction_speed": [ - "50" + "30" ], "extruder_colour": [ "#FCE94F" @@ -31,7 +31,7 @@ "10000" ], "machine_max_acceleration_z": [ - "500" + "100" ], "machine_max_speed_e": [ "60" @@ -82,13 +82,13 @@ "2" ], "retract_before_wipe": [ - "70%" + "0%" ], "retract_when_changing_layer": [ - "1" + "0" ], "retraction_length": [ - "1" + "0.5" ], "retract_length_toolchange": [ "1" @@ -103,7 +103,7 @@ "0" ], "retraction_speed": [ - "50" + "60" ], "single_extruder_multi_material": "1", "wipe": [ diff --git a/resources/profiles/Co Print/process/0.2mm Fast @Co Print ChromaSet 0.4.json b/resources/profiles/Co Print/process/0.2mm Fast @Co Print ChromaSet 0.4.json index e5c65b3e7a3..fbf01ea897a 100644 --- a/resources/profiles/Co Print/process/0.2mm Fast @Co Print ChromaSet 0.4.json +++ b/resources/profiles/Co Print/process/0.2mm Fast @Co Print ChromaSet 0.4.json @@ -5,15 +5,15 @@ "from": "system", "instantiation": "true", "inherits": "fdm_process_coprint_common", - "elefant_foot_compensation": "0.15", + "elefant_foot_compensation": "0.1", "initial_layer_speed": "60", "initial_layer_infill_speed": "100", - "inner_wall_speed": "300", + "inner_wall_speed": "200", "small_perimeter_speed": "50%", "internal_solid_infill_speed": "300", "travel_speed": "500", "gap_infill_speed": "300", - "outer_wall_speed":"100", + "outer_wall_speed":"120", "top_surface_speed": "150", "default_acceleration": "10000", "outer_wall_acceleration": "3000", @@ -24,8 +24,11 @@ "internal_solid_infill_acceleration": "80%", "top_surface_acceleration": "2000", "travel_acceleration": "10000", - "default_jerk": "9", + "default_jerk": "0", + "wipe_tower_max_purge_speed": "200", "compatible_printers": [ - "Co Print ChromaSet 0.4 nozzle fast" + "Co Print ChromaSet 0.4 nozzle fast", + "Co Print ChromaSet 0.4 nozzle - Ender-3 V3", + "Co Print ChromaSet 0.4 nozzle - Ender-3 V3 Plus" ] } diff --git a/resources/profiles/Co Print/process/0.2mm Standard @Co Print ChromaSet 0.4.json b/resources/profiles/Co Print/process/0.2mm Standard @Co Print ChromaSet 0.4.json index 3f67140d822..0b485ef04cd 100644 --- a/resources/profiles/Co Print/process/0.2mm Standard @Co Print ChromaSet 0.4.json +++ b/resources/profiles/Co Print/process/0.2mm Standard @Co Print ChromaSet 0.4.json @@ -7,6 +7,8 @@ "inherits": "fdm_process_coprint_common", "default_acceleration": "5000", "compatible_printers": [ - "Co Print ChromaSet 0.4 nozzle" + "Co Print ChromaSet 0.4 nozzle", + "Co Print ChromaSet 0.4 nozzle - Ender-3 V3", + "Co Print ChromaSet 0.4 nozzle - Ender-3 V3 Plus" ] } diff --git a/resources/profiles/Co Print/process/fdm_process_common.json b/resources/profiles/Co Print/process/fdm_process_common.json index 841ddc2ea66..e3d42b5918d 100644 --- a/resources/profiles/Co Print/process/fdm_process_common.json +++ b/resources/profiles/Co Print/process/fdm_process_common.json @@ -4,7 +4,7 @@ "from": "system", "instantiation": "false", "adaptive_layer_height": "0", - "reduce_crossing_wall": "0", + "reduce_crossing_wall": "1", "bridge_flow": "0.9031", "bridge_speed": "25", "internal_bridge_speed": "100", @@ -14,11 +14,11 @@ "default_acceleration": "5000", "bridge_no_support": "0", "elefant_foot_compensation": "0.1", - "outer_wall_line_width": "0.4", + "outer_wall_line_width": "0.42", "outer_wall_speed": "60", - "line_width": "0.4", + "line_width": "0.42", "infill_direction": "45", - "sparse_infill_density": "10%", + "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", "initial_layer_line_width": "0.5", "layer_height": "0.2", @@ -34,53 +34,53 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}{filament_type[0]}{layer_height}_{print_time}.gcode", "wall_loops": "2", - "inner_wall_line_width": "0.4", - "inner_wall_speed": "200", + "inner_wall_line_width": "0.45", + "inner_wall_speed": "100", "print_settings_id": "", "raft_layers": "0", "seam_position": "aligned", "seam_gap": "5%", - "skirt_distance": "4", + "skirt_distance": "2", "skirt_height": "1", "minimum_sparse_infill_area": "0", - "internal_solid_infill_line_width": "0.4", + "internal_solid_infill_line_width": "0.42", "internal_solid_infill_speed": "200", "spiral_mode": "0", "standby_temperature_delta": "-5", "enable_support": "0", "support_filament": "0", - "support_line_width": "0.4", + "support_line_width": "0.42", "support_interface_filament": "0", "support_on_build_plate_only": "0", - "support_top_z_distance": "0", + "support_top_z_distance": "0.2", "support_interface_loop_pattern": "0", - "support_interface_top_layers": "0", - "support_interface_spacing": "0", + "support_interface_top_layers": "2", + "support_interface_spacing": "0.5", "support_interface_speed": "200", "support_base_pattern": "rectilinear", - "support_base_pattern_spacing": "2", + "support_base_pattern_spacing": "2.5", "support_speed": "200", "extra_perimeters_on_overhangs": "0", - "initial_layer_infill_speed": "100", - "support_threshold_angle": "30", - "support_object_xy_distance": "0.5", + "initial_layer_infill_speed": "60", + "support_threshold_angle": "35", + "support_object_xy_distance": "0.35", "detect_thin_wall": "1", "top_surface_line_width": "0.4", "top_surface_speed": "80", "travel_speed": "350", "enable_prime_tower": "1", - "prime_tower_width": "120", + "prime_tower_width": "150", "xy_hole_compensation": "0", "xy_contour_compensation": "0", "resolution": "0.012", - "wall_generator": "classic", + "wall_generator": "arachne", "wall_sequence": "inner wall/outer wall", "print_flow_ratio": "1", "top_shell_layers": "4", "internal_bridge_flow": "0.9031", "slow_down_layers": "3", - "gap_fill_target": "everywhere", - "skirt_loops": "6", + "gap_fill_target": "nowhere", + "skirt_loops": "3", "skirt_speed": "50", "draft_shield": "disabled", "brim_type": "no_brim", @@ -88,7 +88,7 @@ "inner_wall_acceleration": "3000", "top_solid_infill_flow_ratio": "1", "bottom_solid_infill_flow_ratio": "1", - "outer_wall_acceleration": "1000", + "outer_wall_acceleration": "1500", "bridge_acceleration": "800%", "sparse_infill_acceleration": "80%", "internal_solid_infill_acceleration": "80%", diff --git a/resources/profiles/Co Print/process/fdm_process_coprint_common.json b/resources/profiles/Co Print/process/fdm_process_coprint_common.json index c9df5e9979f..5f5d557f44d 100644 --- a/resources/profiles/Co Print/process/fdm_process_coprint_common.json +++ b/resources/profiles/Co Print/process/fdm_process_coprint_common.json @@ -5,10 +5,10 @@ "instantiation": "false", "inherits": "fdm_process_common", "adaptive_layer_height": "0", - "reduce_crossing_wall": "0", + "reduce_crossing_wall": "1", "bridge_flow": "0.9031", "bridge_speed": "25", - "default_jerk": "9", + "default_jerk": "0", "infill_jerk": "12", "inner_wall_jerk": "7", "outer_wall_jerk": "7", @@ -23,11 +23,11 @@ "default_acceleration": "5000", "bridge_no_support": "0", "elefant_foot_compensation": "0.1", - "outer_wall_line_width": "0.4", + "outer_wall_line_width": "0.42", "outer_wall_speed": "60", - "line_width": "0.4", + "line_width": "0.42", "infill_direction": "45", - "sparse_infill_density": "10%", + "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", "initial_layer_line_width": "0.5", "initial_layer_print_height": "0.2", @@ -42,53 +42,55 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}{filament_type[0]}{layer_height}_{print_time}.gcode", "wall_loops": "2", - "inner_wall_line_width": "0.4", - "inner_wall_speed": "200", + "inner_wall_line_width": "0.45", + "inner_wall_speed": "100", "print_settings_id": "", "raft_layers": "0", "seam_position": "aligned", "seam_gap": "5%", - "skirt_distance": "4", + "skirt_distance": "2", "skirt_height": "1", - "support_type": "tree(manual)", + "support_type": "tree(auto)", "minimum_sparse_infill_area": "0", - "internal_solid_infill_line_width": "0.4", + "internal_solid_infill_line_width": "0.42", "internal_solid_infill_speed": "200", "spiral_mode": "0", "standby_temperature_delta": "-5", "enable_support": "0", "support_filament": "0", - "support_line_width": "0.4", + "support_line_width": "0.42", "support_interface_filament": "0", - "initial_layer_infill_speed": "100", + "initial_layer_infill_speed": "60", "support_on_build_plate_only": "0", - "support_top_z_distance": "0", + "support_top_z_distance": "0.2", "support_interface_loop_pattern": "0", - "support_interface_top_layers": "0", - "support_interface_spacing": "0", + "support_interface_top_layers": "2", + "support_interface_bottom_layers": "-1", + "support_interface_spacing": "0.5", "support_interface_speed": "200", "support_base_pattern": "rectilinear", - "support_base_pattern_spacing": "2", + "support_base_pattern_spacing": "2.5", "support_speed": "200", - "support_threshold_angle": "30", - "support_object_xy_distance": "0.5", + "support_threshold_angle": "35", + "support_object_xy_distance": "0.35", "detect_thin_wall": "1", "top_surface_line_width": "0.4", "top_surface_speed": "80", "travel_speed": "350", "enable_prime_tower": "1", - "prime_tower_width": "120", + "prime_tower_width": "150", "xy_hole_compensation": "0", "xy_contour_compensation": "0", "resolution": "0.012", - "wall_generator": "classic", + "wall_generator": "arachne", "wall_sequence": "inner wall/outer wall", + "wipe_tower_max_purge_speed": "150", "print_flow_ratio": "1", "internal_bridge_flow": "0.9031", - "gap_fill_target": "everywhere", + "gap_fill_target": "nowhere", "slow_down_layers": "3", "top_shell_layers": "4", - "skirt_loops": "6", + "skirt_loops": "3", "skirt_speed": "50", "extra_perimeters_on_overhangs": "0", "bottom_solid_infill_flow_ratio": "1", @@ -97,7 +99,7 @@ "brim_type": "no_brim", "exclude_object": "1", "inner_wall_acceleration": "3000", - "outer_wall_acceleration": "1000", + "outer_wall_acceleration": "1500", "bridge_acceleration": "80%", "sparse_infill_acceleration": "80%", "internal_solid_infill_acceleration": "80%",