From 1cf9c8a7682ab78dddf8749abe43401b14f504a3 Mon Sep 17 00:00:00 2001 From: SoftFever <103989404+SoftFever@users.noreply.github.com> Date: Mon, 9 Oct 2023 22:57:40 +0800 Subject: [PATCH 01/18] measure tool init port --- resources/images/copy_menu.svg | 37 + resources/images/measure.svg | 93 + src/imgui/imconfig.h | 3 + src/libslic3r/BuildVolume.hpp | 4 + src/libslic3r/CMakeLists.txt | 6 + src/libslic3r/Color.cpp | 408 ++++ src/libslic3r/Color.hpp | 193 ++ src/libslic3r/Geometry.cpp | 47 + src/libslic3r/Geometry.hpp | 19 + src/libslic3r/Geometry/Circle.cpp | 4 +- src/libslic3r/Geometry/Circle.hpp | 2 +- src/libslic3r/Measure.cpp | 1241 ++++++++++ src/libslic3r/Measure.hpp | 196 ++ src/libslic3r/MeasureUtils.hpp | 386 +++ src/libslic3r/Point.hpp | 1 + src/libslic3r/SurfaceMesh.hpp | 163 ++ src/slic3r/CMakeLists.txt | 6 + src/slic3r/GUI/GLCanvas3D.cpp | 13 +- src/slic3r/GUI/GLCanvas3D.hpp | 23 + src/slic3r/GUI/GLModel.cpp | 614 +++++ src/slic3r/GUI/GLModel.hpp | 149 ++ src/slic3r/GUI/GLShader.cpp | 137 ++ src/slic3r/GUI/GLShader.hpp | 26 + src/slic3r/GUI/GUI_Geometry.cpp | 9 + src/slic3r/GUI/GUI_Geometry.hpp | 78 + src/slic3r/GUI/GUI_ObjectManipulation.cpp | 1300 ++++++++++ src/slic3r/GUI/GUI_ObjectManipulation.hpp | 250 ++ src/slic3r/GUI/GUI_Utils.hpp | 10 + src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 26 + src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 32 +- src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp | 2142 +++++++++++++++++ src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp | 188 ++ .../GUI/Gizmos/GLGizmoMmuSegmentation.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp | 4 + src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 37 +- src/slic3r/GUI/Gizmos/GLGizmosManager.hpp | 1 + src/slic3r/GUI/ImGuiWrapper.cpp | 98 +- src/slic3r/GUI/ImGuiWrapper.hpp | 11 +- src/slic3r/GUI/MeshUtils.cpp | 37 +- src/slic3r/GUI/MeshUtils.hpp | 28 +- src/slic3r/GUI/SceneRaycaster.cpp | 292 +++ src/slic3r/GUI/SceneRaycaster.hpp | 117 + src/slic3r/GUI/Selection.cpp | 19 + src/slic3r/GUI/Selection.hpp | 58 +- 46 files changed, 8433 insertions(+), 81 deletions(-) create mode 100644 resources/images/copy_menu.svg create mode 100644 resources/images/measure.svg create mode 100644 src/libslic3r/Color.cpp create mode 100644 src/libslic3r/Color.hpp create mode 100644 src/libslic3r/Measure.cpp create mode 100644 src/libslic3r/Measure.hpp create mode 100644 src/libslic3r/MeasureUtils.hpp create mode 100644 src/libslic3r/SurfaceMesh.hpp create mode 100644 src/slic3r/GUI/GUI_Geometry.cpp create mode 100644 src/slic3r/GUI/GUI_Geometry.hpp create mode 100644 src/slic3r/GUI/GUI_ObjectManipulation.cpp create mode 100644 src/slic3r/GUI/GUI_ObjectManipulation.hpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp create mode 100644 src/slic3r/GUI/SceneRaycaster.cpp create mode 100644 src/slic3r/GUI/SceneRaycaster.hpp diff --git a/resources/images/copy_menu.svg b/resources/images/copy_menu.svg new file mode 100644 index 00000000000..0d1af6a0a7c --- /dev/null +++ b/resources/images/copy_menu.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/measure.svg b/resources/images/measure.svg new file mode 100644 index 00000000000..3ea137a1ed9 --- /dev/null +++ b/resources/images/measure.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + diff --git a/src/imgui/imconfig.h b/src/imgui/imconfig.h index 1774eb28ac5..2bd30184a56 100644 --- a/src/imgui/imconfig.h +++ b/src/imgui/imconfig.h @@ -197,6 +197,9 @@ namespace ImGui const wchar_t CloseBlockNotifHoverButton = 0x0834; const wchar_t BlockNotifErrorIcon = 0x0835; + const wchar_t ClipboardBtnIcon = 0x2606; + + // void MyFunction(const char* name, const MyMatrix44& v); } diff --git a/src/libslic3r/BuildVolume.hpp b/src/libslic3r/BuildVolume.hpp index 4ab007f8b8c..cfb45371529 100644 --- a/src/libslic3r/BuildVolume.hpp +++ b/src/libslic3r/BuildVolume.hpp @@ -93,6 +93,10 @@ class BuildVolume // Called on initial G-code preview on OpenGL vertex buffer interleaved normals and vertices. bool all_paths_inside_vertices_and_normals_interleaved(const std::vector& paths, const Eigen::AlignedBox& bbox, bool ignore_bottom = true) const; + + const std::pair, std::vector>& top_bottom_convex_hull_decomposition_scene() const { return m_top_bottom_convex_hull_decomposition_scene; } + const std::pair, std::vector>& top_bottom_convex_hull_decomposition_bed() const { return m_top_bottom_convex_hull_decomposition_bed; } + private: // Source definition of the print bed geometry (PrintConfig::printable_area) std::vector m_bed_shape; diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 3365a3e6bea..8498692a0e0 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -47,6 +47,8 @@ set(lisbslic3r_sources Clipper2Utils.hpp Config.cpp Config.hpp + Color.hpp + Color.cpp CurveAnalyzer.cpp CurveAnalyzer.hpp EdgeGrid.cpp @@ -195,6 +197,9 @@ set(lisbslic3r_sources ModelArrange.cpp MultiMaterialSegmentation.cpp MultiMaterialSegmentation.hpp + Measure.hpp + Measure.cpp + MeasureUtils.hpp CustomGCode.cpp CustomGCode.hpp Arrange.hpp @@ -294,6 +299,7 @@ set(lisbslic3r_sources Surface.hpp SurfaceCollection.cpp SurfaceCollection.hpp + SurfaceMesh.hpp SVG.cpp SVG.hpp Technologies.hpp diff --git a/src/libslic3r/Color.cpp b/src/libslic3r/Color.cpp new file mode 100644 index 00000000000..ed4441dbfd3 --- /dev/null +++ b/src/libslic3r/Color.cpp @@ -0,0 +1,408 @@ +#include "libslic3r.h" +#include "Color.hpp" + +#include + +static const float INV_255 = 1.0f / 255.0f; + +namespace Slic3r { + +// Conversion from RGB to HSV color space +// The input RGB values are in the range [0, 1] +// The output HSV values are in the ranges h = [0, 360], and s, v = [0, 1] +static void RGBtoHSV(float r, float g, float b, float& h, float& s, float& v) +{ + assert(0.0f <= r && r <= 1.0f); + assert(0.0f <= g && g <= 1.0f); + assert(0.0f <= b && b <= 1.0f); + + const float max_comp = std::max(std::max(r, g), b); + const float min_comp = std::min(std::min(r, g), b); + const float delta = max_comp - min_comp; + + if (delta > 0.0f) { + if (max_comp == r) + h = 60.0f * (std::fmod(((g - b) / delta), 6.0f)); + else if (max_comp == g) + h = 60.0f * (((b - r) / delta) + 2.0f); + else if (max_comp == b) + h = 60.0f * (((r - g) / delta) + 4.0f); + + s = (max_comp > 0.0f) ? delta / max_comp : 0.0f; + } + else { + h = 0.0f; + s = 0.0f; + } + v = max_comp; + + while (h < 0.0f) { h += 360.0f; } + while (h > 360.0f) { h -= 360.0f; } + + assert(0.0f <= s && s <= 1.0f); + assert(0.0f <= v && v <= 1.0f); + assert(0.0f <= h && h <= 360.0f); +} + +// Conversion from HSV to RGB color space +// The input HSV values are in the ranges h = [0, 360], and s, v = [0, 1] +// The output RGB values are in the range [0, 1] +static void HSVtoRGB(float h, float s, float v, float& r, float& g, float& b) +{ + assert(0.0f <= s && s <= 1.0f); + assert(0.0f <= v && v <= 1.0f); + assert(0.0f <= h && h <= 360.0f); + + const float chroma = v * s; + const float h_prime = std::fmod(h / 60.0f, 6.0f); + const float x = chroma * (1.0f - std::abs(std::fmod(h_prime, 2.0f) - 1.0f)); + const float m = v - chroma; + + if (0.0f <= h_prime && h_prime < 1.0f) { + r = chroma; + g = x; + b = 0.0f; + } + else if (1.0f <= h_prime && h_prime < 2.0f) { + r = x; + g = chroma; + b = 0.0f; + } + else if (2.0f <= h_prime && h_prime < 3.0f) { + r = 0.0f; + g = chroma; + b = x; + } + else if (3.0f <= h_prime && h_prime < 4.0f) { + r = 0.0f; + g = x; + b = chroma; + } + else if (4.0f <= h_prime && h_prime < 5.0f) { + r = x; + g = 0.0f; + b = chroma; + } + else if (5.0f <= h_prime && h_prime < 6.0f) { + r = chroma; + g = 0.0f; + b = x; + } + else { + r = 0.0f; + g = 0.0f; + b = 0.0f; + } + + r += m; + g += m; + b += m; + + assert(0.0f <= r && r <= 1.0f); + assert(0.0f <= g && g <= 1.0f); + assert(0.0f <= b && b <= 1.0f); +} + +class Randomizer +{ + std::random_device m_rd; + +public: + float random_float(float min, float max) { + std::mt19937 rand_generator(m_rd()); + std::uniform_real_distribution distrib(min, max); + return distrib(rand_generator); + } +}; + +ColorRGB::ColorRGB(float r, float g, float b) +: m_data({ std::clamp(r, 0.0f, 1.0f), std::clamp(g, 0.0f, 1.0f), std::clamp(b, 0.0f, 1.0f) }) +{ +} + +ColorRGB::ColorRGB(unsigned char r, unsigned char g, unsigned char b) +: m_data({ std::clamp(r * INV_255, 0.0f, 1.0f), std::clamp(g * INV_255, 0.0f, 1.0f), std::clamp(b * INV_255, 0.0f, 1.0f) }) +{ +} + +bool ColorRGB::operator < (const ColorRGB& other) const +{ + for (size_t i = 0; i < 3; ++i) { + if (m_data[i] < other.m_data[i]) + return true; + else if (m_data[i] > other.m_data[i]) + return false; + } + + return false; +} + +bool ColorRGB::operator > (const ColorRGB& other) const +{ + for (size_t i = 0; i < 3; ++i) { + if (m_data[i] > other.m_data[i]) + return true; + else if (m_data[i] < other.m_data[i]) + return false; + } + + return false; +} + +ColorRGB ColorRGB::operator + (const ColorRGB& other) const +{ + ColorRGB ret; + for (size_t i = 0; i < 3; ++i) { + ret.m_data[i] = std::clamp(m_data[i] + other.m_data[i], 0.0f, 1.0f); + } + return ret; +} + +ColorRGB ColorRGB::operator * (float value) const +{ + assert(value >= 0.0f); + ColorRGB ret; + for (size_t i = 0; i < 3; ++i) { + ret.m_data[i] = std::clamp(value * m_data[i], 0.0f, 1.0f); + } + return ret; +} + +ColorRGBA::ColorRGBA(float r, float g, float b, float a) +: m_data({ std::clamp(r, 0.0f, 1.0f), std::clamp(g, 0.0f, 1.0f), std::clamp(b, 0.0f, 1.0f), std::clamp(a, 0.0f, 1.0f) }) +{ +} + +ColorRGBA::ColorRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a) +: m_data({ std::clamp(r * INV_255, 0.0f, 1.0f), std::clamp(g * INV_255, 0.0f, 1.0f), std::clamp(b * INV_255, 0.0f, 1.0f), std::clamp(a * INV_255, 0.0f, 1.0f) }) +{ +} +ColorRGBA::ColorRGBA(const std::array &data) : m_data(data) {} +bool ColorRGBA::operator < (const ColorRGBA& other) const +{ + for (size_t i = 0; i < 3; ++i) { + if (m_data[i] < other.m_data[i]) + return true; + else if (m_data[i] > other.m_data[i]) + return false; + } + + return false; +} + +bool ColorRGBA::operator > (const ColorRGBA& other) const +{ + for (size_t i = 0; i < 3; ++i) { + if (m_data[i] > other.m_data[i]) + return true; + else if (m_data[i] < other.m_data[i]) + return false; + } + + return false; +} + +ColorRGBA ColorRGBA::operator + (const ColorRGBA& other) const +{ + ColorRGBA ret; + for (size_t i = 0; i < 3; ++i) { + ret.m_data[i] = std::clamp(m_data[i] + other.m_data[i], 0.0f, 1.0f); + } + return ret; +} + +ColorRGBA ColorRGBA::operator * (float value) const +{ + assert(value >= 0.0f); + ColorRGBA ret; + for (size_t i = 0; i < 3; ++i) { + ret.m_data[i] = std::clamp(value * m_data[i], 0.0f, 1.0f); + } + ret.m_data[3] = m_data[3]; + return ret; +} + +ColorRGB operator * (float value, const ColorRGB& other) { return other * value; } +ColorRGBA operator * (float value, const ColorRGBA& other) { return other * value; } + +ColorRGB lerp(const ColorRGB& a, const ColorRGB& b, float t) +{ + assert(0.0f <= t && t <= 1.0f); + return (1.0f - t) * a + t * b; +} + +ColorRGBA lerp(const ColorRGBA& a, const ColorRGBA& b, float t) +{ + assert(0.0f <= t && t <= 1.0f); + return (1.0f - t) * a + t * b; +} + +ColorRGB complementary(const ColorRGB& color) +{ + return { 1.0f - color.r(), 1.0f - color.g(), 1.0f - color.b() }; +} + +ColorRGBA complementary(const ColorRGBA& color) +{ + return { 1.0f - color.r(), 1.0f - color.g(), 1.0f - color.b(), color.a() }; +} + +ColorRGB saturate(const ColorRGB& color, float factor) +{ + float h, s, v; + RGBtoHSV(color.r(), color.g(), color.b(), h, s, v); + s = std::clamp(s * factor, 0.0f, 1.0f); + float r, g, b; + HSVtoRGB(h, s, v, r, g, b); + return { r, g, b }; +} + +ColorRGBA saturate(const ColorRGBA& color, float factor) +{ + return to_rgba(saturate(to_rgb(color), factor), color.a()); +} + +ColorRGB opposite(const ColorRGB& color) +{ + float h, s, v; + RGBtoHSV(color.r(), color.g(), color.b(), h, s, v); + + h += 65.0f; // 65 instead 60 to avoid circle values + if (h > 360.0f) + h -= 360.0f; + + Randomizer rnd; + s = rnd.random_float(0.65f, 1.0f); + v = rnd.random_float(0.65f, 1.0f); + + float r, g, b; + HSVtoRGB(h, s, v, r, g, b); + return { r, g, b }; +} + +ColorRGB opposite(const ColorRGB& a, const ColorRGB& b) +{ + float ha, sa, va; + RGBtoHSV(a.r(), a.g(), a.b(), ha, sa, va); + float hb, sb, vb; + RGBtoHSV(b.r(), b.g(), b.b(), hb, sb, vb); + + float delta_h = std::abs(ha - hb); + float start_h = (delta_h > 180.0f) ? std::min(ha, hb) : std::max(ha, hb); + + start_h += 5.0f; // to avoid circle change of colors for 120 deg + if (delta_h < 180.0f) + delta_h = 360.0f - delta_h; + + Randomizer rnd; + float out_h = start_h + 0.5f * delta_h; + if (out_h > 360.0f) + out_h -= 360.0f; + float out_s = rnd.random_float(0.65f, 1.0f); + float out_v = rnd.random_float(0.65f, 1.0f); + + float out_r, out_g, out_b; + HSVtoRGB(out_h, out_s, out_v, out_r, out_g, out_b); + return { out_r, out_g, out_b }; +} + +bool can_decode_color(const std::string& color) { return color.size() == 7 && color.front() == '#'; } + +bool decode_color(const std::string& color_in, ColorRGB& color_out) +{ + auto hex_digit_to_int = [](const char c) { + return + (c >= '0' && c <= '9') ? int(c - '0') : + (c >= 'A' && c <= 'F') ? int(c - 'A') + 10 : + (c >= 'a' && c <= 'f') ? int(c - 'a') + 10 : -1; + }; + + color_out = ColorRGB::BLACK(); + if (can_decode_color(color_in)) { + const char* c = color_in.data() + 1; + for (unsigned int i = 0; i < 3; ++i) { + const int digit1 = hex_digit_to_int(*c++); + const int digit2 = hex_digit_to_int(*c++); + if (digit1 != -1 && digit2 != -1) + color_out.set(i, float(digit1 * 16 + digit2) * INV_255); + } + } + else + return false; + + assert(0.0f <= color_out.r() && color_out.r() <= 1.0f); + assert(0.0f <= color_out.g() && color_out.g() <= 1.0f); + assert(0.0f <= color_out.b() && color_out.b() <= 1.0f); + return true; +} + +bool decode_color(const std::string& color_in, ColorRGBA& color_out) +{ + ColorRGB rgb; + if (!decode_color(color_in, rgb)) + return false; + + color_out = to_rgba(rgb, color_out.a()); + return true; +} + +bool decode_colors(const std::vector& colors_in, std::vector& colors_out) +{ + colors_out = std::vector(colors_in.size(), ColorRGB::BLACK()); + for (size_t i = 0; i < colors_in.size(); ++i) { + if (!decode_color(colors_in[i], colors_out[i])) + return false; + } + return true; +} + +bool decode_colors(const std::vector& colors_in, std::vector& colors_out) +{ + colors_out = std::vector(colors_in.size(), ColorRGBA::BLACK()); + for (size_t i = 0; i < colors_in.size(); ++i) { + if (!decode_color(colors_in[i], colors_out[i])) + return false; + } + return true; +} + +std::string encode_color(const ColorRGB& color) +{ + char buffer[64]; + ::sprintf(buffer, "#%02X%02X%02X", color.r_uchar(), color.g_uchar(), color.b_uchar()); + return std::string(buffer); +} + +std::string encode_color(const ColorRGBA& color) { return encode_color(to_rgb(color)); } + +ColorRGB to_rgb(const ColorRGBA& other_rgba) { return { other_rgba.r(), other_rgba.g(), other_rgba.b() }; } +ColorRGBA to_rgba(const ColorRGB& other_rgb) { return { other_rgb.r(), other_rgb.g(), other_rgb.b(), 1.0f }; } +ColorRGBA to_rgba(const ColorRGB& other_rgb, float alpha) { return { other_rgb.r(), other_rgb.g(), other_rgb.b(), alpha }; } + +ColorRGBA picking_decode(unsigned int id) +{ + return { + float((id >> 0) & 0xff) * INV_255, // red + float((id >> 8) & 0xff) * INV_255, // green + float((id >> 16) & 0xff) * INV_255, // blue + float(picking_checksum_alpha_channel(id & 0xff, (id >> 8) & 0xff, (id >> 16) & 0xff)) * INV_255 // checksum for validating against unwanted alpha blending and multi sampling + }; +} + +unsigned int picking_encode(unsigned char r, unsigned char g, unsigned char b) { return r + (g << 8) + (b << 16); } + +unsigned char picking_checksum_alpha_channel(unsigned char red, unsigned char green, unsigned char blue) +{ + // 8 bit hash for the color + unsigned char b = ((((37 * red) + green) & 0x0ff) * 37 + blue) & 0x0ff; + // Increase enthropy by a bit reversal + b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; + b = (b & 0xCC) >> 2 | (b & 0x33) << 2; + b = (b & 0xAA) >> 1 | (b & 0x55) << 1; + // Flip every second bit to increase the enthropy even more. + b ^= 0x55; + return b; +} + +} // namespace Slic3r + diff --git a/src/libslic3r/Color.hpp b/src/libslic3r/Color.hpp new file mode 100644 index 00000000000..60b6af9f7c5 --- /dev/null +++ b/src/libslic3r/Color.hpp @@ -0,0 +1,193 @@ +#ifndef slic3r_Color_hpp_ +#define slic3r_Color_hpp_ + +#include +#include + +#include "Point.hpp" + +namespace Slic3r { + +class ColorRGB +{ + std::array m_data{1.0f, 1.0f, 1.0f}; + +public: + ColorRGB() = default; + ColorRGB(float r, float g, float b); + ColorRGB(unsigned char r, unsigned char g, unsigned char b); + ColorRGB(const ColorRGB& other) = default; + + ColorRGB& operator = (const ColorRGB& other) { m_data = other.m_data; return *this; } + + bool operator == (const ColorRGB& other) const { return m_data == other.m_data; } + bool operator != (const ColorRGB& other) const { return !operator==(other); } + bool operator < (const ColorRGB& other) const; + bool operator > (const ColorRGB& other) const; + + ColorRGB operator + (const ColorRGB& other) const; + ColorRGB operator * (float value) const; + + const float* const data() const { return m_data.data(); } + + float r() const { return m_data[0]; } + float g() const { return m_data[1]; } + float b() const { return m_data[2]; } + + void r(float r) { m_data[0] = std::clamp(r, 0.0f, 1.0f); } + void g(float g) { m_data[1] = std::clamp(g, 0.0f, 1.0f); } + void b(float b) { m_data[2] = std::clamp(b, 0.0f, 1.0f); } + + void set(unsigned int comp, float value) { + assert(0 <= comp && comp <= 2); + m_data[comp] = std::clamp(value, 0.0f, 1.0f); + } + + unsigned char r_uchar() const { return static_cast(m_data[0] * 255.0f); } + unsigned char g_uchar() const { return static_cast(m_data[1] * 255.0f); } + unsigned char b_uchar() const { return static_cast(m_data[2] * 255.0f); } + + static const ColorRGB BLACK() { return { 0.0f, 0.0f, 0.0f }; } + static const ColorRGB BLUE() { return { 0.0f, 0.0f, 1.0f }; } + static const ColorRGB BLUEISH() { return { 0.5f, 0.5f, 1.0f }; } + static const ColorRGB CYAN() { return { 0.0f, 1.0f, 1.0f }; } + static const ColorRGB DARK_GRAY() { return { 0.25f, 0.25f, 0.25f }; } + static const ColorRGB DARK_YELLOW() { return { 0.5f, 0.5f, 0.0f }; } + static const ColorRGB GRAY() { return { 0.5f, 0.5f, 0.5f }; } + static const ColorRGB GREEN() { return { 0.0f, 1.0f, 0.0f }; } + static const ColorRGB GREENISH() { return { 0.5f, 1.0f, 0.5f }; } + static const ColorRGB LIGHT_GRAY() { return { 0.75f, 0.75f, 0.75f }; } + static const ColorRGB MAGENTA() { return { 1.0f, 0.0f, 1.0f }; } + static const ColorRGB ORANGE() { return { 0.92f, 0.50f, 0.26f }; } + static const ColorRGB RED() { return { 1.0f, 0.0f, 0.0f }; } + static const ColorRGB REDISH() { return { 1.0f, 0.5f, 0.5f }; } + static const ColorRGB YELLOW() { return { 1.0f, 1.0f, 0.0f }; } + static const ColorRGB WHITE() { return { 1.0f, 1.0f, 1.0f }; } + + static const ColorRGB X() { return { 0.75f, 0.0f, 0.0f }; } + static const ColorRGB Y() { return { 0.0f, 0.75f, 0.0f }; } + static const ColorRGB Z() { return { 0.0f, 0.0f, 0.75f }; } +}; + +class ColorRGBA +{ + std::array m_data{ 1.0f, 1.0f, 1.0f, 1.0f }; + +public: + ColorRGBA() = default; + ColorRGBA(float r, float g, float b, float a); + ColorRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a); + ColorRGBA(const std::array& data); + ColorRGBA(const ColorRGBA& other) = default; + + ColorRGBA& operator = (const ColorRGBA& other) { m_data = other.m_data; return *this; } + + bool operator == (const ColorRGBA& other) const { return m_data == other.m_data; } + bool operator != (const ColorRGBA& other) const { return !operator==(other); } + bool operator < (const ColorRGBA& other) const; + bool operator > (const ColorRGBA& other) const; + + ColorRGBA operator + (const ColorRGBA& other) const; + ColorRGBA operator * (float value) const; + + const float* const data() const { return m_data.data(); } + const std::array& data_array() const { return m_data; } + float r() const { return m_data[0]; } + float g() const { return m_data[1]; } + float b() const { return m_data[2]; } + float a() const { return m_data[3]; } + + void r(float r) { m_data[0] = std::clamp(r, 0.0f, 1.0f); } + void g(float g) { m_data[1] = std::clamp(g, 0.0f, 1.0f); } + void b(float b) { m_data[2] = std::clamp(b, 0.0f, 1.0f); } + void a(float a) { m_data[3] = std::clamp(a, 0.0f, 1.0f); } + + void set(unsigned int comp, float value) { + assert(0 <= comp && comp <= 3); + m_data[comp] = std::clamp(value, 0.0f, 1.0f); + } + + unsigned char r_uchar() const { return static_cast(m_data[0] * 255.0f); } + unsigned char g_uchar() const { return static_cast(m_data[1] * 255.0f); } + unsigned char b_uchar() const { return static_cast(m_data[2] * 255.0f); } + unsigned char a_uchar() const { return static_cast(m_data[3] * 255.0f); } + + bool is_transparent() const { return m_data[3] < 1.0f; } + + static const ColorRGBA BLACK() { return { 0.0f, 0.0f, 0.0f, 1.0f }; } + static const ColorRGBA BLUE() { return { 0.0f, 0.0f, 1.0f, 1.0f }; } + static const ColorRGBA BLUEISH() { return { 0.5f, 0.5f, 1.0f, 1.0f }; } + static const ColorRGBA CYAN() { return { 0.0f, 1.0f, 1.0f, 1.0f }; } + static const ColorRGBA DARK_GRAY() { return { 0.25f, 0.25f, 0.25f, 1.0f }; } + static const ColorRGBA DARK_YELLOW() { return { 0.5f, 0.5f, 0.0f, 1.0f }; } + static const ColorRGBA GRAY() { return { 0.5f, 0.5f, 0.5f, 1.0f }; } + static const ColorRGBA GREEN() { return { 0.0f, 1.0f, 0.0f, 1.0f }; } + static const ColorRGBA GREENISH() { return { 0.5f, 1.0f, 0.5f, 1.0f }; } + static const ColorRGBA LIGHT_GRAY() { return { 0.75f, 0.75f, 0.75f, 1.0f }; } + static const ColorRGBA MAGENTA() { return { 1.0f, 0.0f, 1.0f, 1.0f }; } + static const ColorRGBA ORANGE() { return { 0.923f, 0.504f, 0.264f, 1.0f }; } + static const ColorRGBA RED() { return { 1.0f, 0.0f, 0.0f, 1.0f }; } + static const ColorRGBA REDISH() { return { 1.0f, 0.5f, 0.5f, 1.0f }; } + static const ColorRGBA YELLOW() { return { 1.0f, 1.0f, 0.0f, 1.0f }; } + static const ColorRGBA WHITE() { return { 1.0f, 1.0f, 1.0f, 1.0f }; } + + static const ColorRGBA X() { return { 0.75f, 0.0f, 0.0f, 1.0f }; } + static const ColorRGBA Y() { return { 0.0f, 0.75f, 0.0f, 1.0f }; } + static const ColorRGBA Z() { return { 0.0f, 0.0f, 0.75f, 1.0f }; } +}; + +ColorRGB operator * (float value, const ColorRGB& other); +ColorRGBA operator * (float value, const ColorRGBA& other); + +ColorRGB lerp(const ColorRGB& a, const ColorRGB& b, float t); +ColorRGBA lerp(const ColorRGBA& a, const ColorRGBA& b, float t); + +ColorRGB complementary(const ColorRGB& color); +ColorRGBA complementary(const ColorRGBA& color); + +ColorRGB saturate(const ColorRGB& color, float factor); +ColorRGBA saturate(const ColorRGBA& color, float factor); + +ColorRGB opposite(const ColorRGB& color); +ColorRGB opposite(const ColorRGB& a, const ColorRGB& b); + +bool can_decode_color(const std::string& color); + +bool decode_color(const std::string& color_in, ColorRGB& color_out); +bool decode_color(const std::string& color_in, ColorRGBA& color_out); + +bool decode_colors(const std::vector& colors_in, std::vector& colors_out); +bool decode_colors(const std::vector& colors_in, std::vector& colors_out); + +std::string encode_color(const ColorRGB& color); +std::string encode_color(const ColorRGBA& color); + +ColorRGB to_rgb(const ColorRGBA& other_rgba); +ColorRGBA to_rgba(const ColorRGB& other_rgb); +ColorRGBA to_rgba(const ColorRGB& other_rgb, float alpha); + +// Color mapping of a value into RGB false colors. +inline Vec3f value_to_rgbf(float minimum, float maximum, float value) +{ + float ratio = 2.0f * (value - minimum) / (maximum - minimum); + float b = std::max(0.0f, (1.0f - ratio)); + float r = std::max(0.0f, (ratio - 1.0f)); + float g = 1.0f - b - r; + return Vec3f { r, g, b }; +} + +// Color mapping of a value into RGB false colors. +inline Vec3i value_to_rgbi(float minimum, float maximum, float value) +{ + return (value_to_rgbf(minimum, maximum, value) * 255).cast(); +} + +ColorRGBA picking_decode(unsigned int id); +unsigned int picking_encode(unsigned char r, unsigned char g, unsigned char b); +// Produce an alpha channel checksum for the red green blue components. The alpha channel may then be used to verify, whether the rgb components +// were not interpolated by alpha blending or multi sampling. +unsigned char picking_checksum_alpha_channel(unsigned char red, unsigned char green, unsigned char blue); + +} // namespace Slic3r + +#endif /* slic3r_Color_hpp_ */ diff --git a/src/libslic3r/Geometry.cpp b/src/libslic3r/Geometry.cpp index a2c59ec17d5..5a17e7a0afe 100644 --- a/src/libslic3r/Geometry.cpp +++ b/src/libslic3r/Geometry.cpp @@ -409,6 +409,20 @@ void rotation_from_two_vectors(Vec3d from, Vec3d to, Vec3d& rotation_axis, doubl } } +static Transform3d extract_rotation_matrix(const Transform3d& trafo) +{ + Matrix3d rotation; + Matrix3d scale; + trafo.computeRotationScaling(&rotation, &scale); + return Transform3d(rotation); +} + +void translation_transform(Transform3d& transform, const Vec3d& translation) +{ + transform = Transform3d::Identity(); + transform.translate(translation); +} + Transform3d translation_transform(const Vec3d &translation) { Transform3d transform = Transform3d::Identity(); @@ -416,6 +430,12 @@ Transform3d translation_transform(const Vec3d &translation) return transform; } +void rotation_transform(Transform3d& transform, const Vec3d& rotation) +{ + transform = Transform3d::Identity(); + transform.rotate(Eigen::AngleAxisd(rotation.z(), Vec3d::UnitZ()) * Eigen::AngleAxisd(rotation.y(), Vec3d::UnitY()) * Eigen::AngleAxisd(rotation.x(), Vec3d::UnitX())); +} + Transform3d rotation_transform(const Vec3d& rotation) { Transform3d transform = Transform3d::Identity(); @@ -423,6 +443,29 @@ Transform3d rotation_transform(const Vec3d& rotation) return transform; } +void scale_transform(Transform3d& transform, double scale) +{ + return scale_transform(transform, scale * Vec3d::Ones()); +} + +void scale_transform(Transform3d& transform, const Vec3d& scale) +{ + transform = Transform3d::Identity(); + transform.scale(scale); +} + +Transform3d scale_transform(double scale) +{ + return scale_transform(scale * Vec3d::Ones()); +} + +Transform3d scale_transform(const Vec3d& scale) +{ + Transform3d transform; + scale_transform(transform, scale); + return transform; +} + Transformation::Flags::Flags() : dont_translate(true) , dont_rotate(true) @@ -469,6 +512,10 @@ void Transformation::set_offset(Axis axis, double offset) m_dirty = true; } } +Transform3d Transformation::get_rotation_matrix() const +{ + return extract_rotation_matrix(m_matrix); +} void Transformation::set_rotation(const Vec3d& rotation) { diff --git a/src/libslic3r/Geometry.hpp b/src/libslic3r/Geometry.hpp index 8eb6195a107..4d75217182a 100644 --- a/src/libslic3r/Geometry.hpp +++ b/src/libslic3r/Geometry.hpp @@ -348,15 +348,32 @@ Vec3d extract_euler_angles(const Transform3d& transform); // Euler angles can be obtained by extract_euler_angles() void rotation_from_two_vectors(Vec3d from, Vec3d to, Vec3d& rotation_axis, double& phi, Matrix3d* rotation_matrix = nullptr); +// Sets the given transform by assembling the given translation +void translation_transform(Transform3d& transform, const Vec3d& translation); + // Returns the transform obtained by assembling the given translation Transform3d translation_transform(const Vec3d &translation); +// Sets the given transform by assembling the given rotations in the following order: +// 1) rotate X +// 2) rotate Y +// 3) rotate Z +void rotation_transform(Transform3d& transform, const Vec3d& rotation); + // Returns the transform obtained by assembling the given rotations in the following order: // 1) rotate X // 2) rotate Y // 3) rotate Z Transform3d rotation_transform(const Vec3d &rotation); +// Sets the given transform by assembling the given scale factors +void scale_transform(Transform3d& transform, double scale); +void scale_transform(Transform3d& transform, const Vec3d& scale); + +// Returns the transform obtained by assembling the given scale factors +Transform3d scale_transform(double scale); +Transform3d scale_transform(const Vec3d& scale); + class Transformation { struct Flags @@ -397,6 +414,8 @@ class Transformation const Vec3d& get_rotation() const { return m_rotation; } double get_rotation(Axis axis) const { return m_rotation(axis); } + Transform3d get_rotation_matrix() const; + void set_rotation(const Vec3d& rotation); void set_rotation(Axis axis, double rotation); diff --git a/src/libslic3r/Geometry/Circle.cpp b/src/libslic3r/Geometry/Circle.cpp index 4d7c38ccc23..67966719549 100644 --- a/src/libslic3r/Geometry/Circle.cpp +++ b/src/libslic3r/Geometry/Circle.cpp @@ -108,7 +108,7 @@ Circled circle_taubin_newton(const Vec2ds& input, size_t cycles) return out; } -Circled circle_ransac(const Vec2ds& input, size_t iterations) +Circled circle_ransac(const Vec2ds& input, size_t iterations, double* min_error) { if (input.size() < 3) return Circled::make_invalid(); @@ -132,6 +132,8 @@ Circled circle_ransac(const Vec2ds& input, size_t iterations) circle_best = c; } } + if (min_error) + *min_error = err_min; return circle_best; } diff --git a/src/libslic3r/Geometry/Circle.hpp b/src/libslic3r/Geometry/Circle.hpp index 39973d916d9..653102e2abd 100644 --- a/src/libslic3r/Geometry/Circle.hpp +++ b/src/libslic3r/Geometry/Circle.hpp @@ -102,7 +102,7 @@ inline Vec2d circle_center_taubin_newton(const Vec2ds& input, size_t cycles = 20 Circled circle_taubin_newton(const Vec2ds& input, size_t cycles = 20); // Find circle using RANSAC randomized algorithm. -Circled circle_ransac(const Vec2ds& input, size_t iterations = 20); +Circled circle_ransac(const Vec2ds& input, size_t iterations = 20, double* min_error = nullptr); // Randomized algorithm by Emo Welzl, working with squared radii for efficiency. The returned circle radius is inflated by epsilon. template diff --git a/src/libslic3r/Measure.cpp b/src/libslic3r/Measure.cpp new file mode 100644 index 00000000000..08c17df47be --- /dev/null +++ b/src/libslic3r/Measure.cpp @@ -0,0 +1,1241 @@ +#include "libslic3r/libslic3r.h" +#include "Measure.hpp" +#include "MeasureUtils.hpp" + +#include "libslic3r/Geometry/Circle.hpp" +#include "libslic3r/SurfaceMesh.hpp" +#include + +#include + +#define DEBUG_EXTRACT_ALL_FEATURES_AT_ONCE 0 + +namespace Slic3r { +namespace Measure { + + +constexpr double feature_hover_limit = 0.5; // how close to a feature the mouse must be to highlight it + +static std::tuple get_center_and_radius(const std::vector& points, const Transform3d& trafo, const Transform3d& trafo_inv) +{ + Vec2ds out; + double z = 0.; + for (const Vec3d& pt : points) { + Vec3d pt_transformed = trafo * pt; + z = pt_transformed.z(); + out.emplace_back(pt_transformed.x(), pt_transformed.y()); + } + + const int iter = points.size() < 10 ? 2 : + points.size() < 100 ? 4 : + 6; + + double error = std::numeric_limits::max(); + auto circle = Geometry::circle_ransac(out, iter, &error); + + return std::make_tuple(trafo.inverse() * Vec3d(circle.center.x(), circle.center.y(), z), circle.radius, error); +} + + + +static std::array orthonormal_basis(const Vec3d& v) +{ + std::array ret; + ret[2] = v.normalized(); + int index; + ret[2].cwiseAbs().maxCoeff(&index); + switch (index) + { + case 0: { ret[0] = Vec3d(ret[2].y(), -ret[2].x(), 0.0).normalized(); break; } + case 1: { ret[0] = Vec3d(0.0, ret[2].z(), -ret[2].y()).normalized(); break; } + case 2: { ret[0] = Vec3d(-ret[2].z(), 0.0, ret[2].x()).normalized(); break; } + } + ret[1] = ret[2].cross(ret[0]).normalized(); + return ret; +} + + + +class MeasuringImpl { +public: + explicit MeasuringImpl(const indexed_triangle_set& its); + struct PlaneData { + std::vector facets; + std::vector> borders; // FIXME: should be in fact local in update_planes() + std::vector surface_features; + Vec3d normal; + float area; + bool features_extracted = false; + }; + + std::optional get_feature(size_t face_idx, const Vec3d& point); + int get_num_of_planes() const; + const std::vector& get_plane_triangle_indices(int idx) const; + const std::vector& get_plane_features(unsigned int plane_id); + const TriangleMesh& get_mesh() const; + +private: + void update_planes(); + void extract_features(int plane_idx); + + std::vector m_planes; + std::vector m_face_to_plane; + TriangleMesh m_mesh; +}; + + + + + + +MeasuringImpl::MeasuringImpl(const indexed_triangle_set& its) +: m_mesh(its) +{ + update_planes(); + + // Extracting features will be done as needed. + // To extract all planes at once, run the following: +#if DEBUG_EXTRACT_ALL_FEATURES_AT_ONCE + for (int i=0; i face_normals = its_face_normals(m_mesh.its); + const std::vector face_neighbors = its_face_neighbors(m_mesh.its); + std::vector facet_queue(num_of_facets, 0); + int facet_queue_cnt = 0; + const stl_normal* normal_ptr = nullptr; + size_t seed_facet_idx = 0; + + auto is_same_normal = [](const stl_normal& a, const stl_normal& b) -> bool { + return (std::abs(a(0) - b(0)) < 0.001 && std::abs(a(1) - b(1)) < 0.001 && std::abs(a(2) - b(2)) < 0.001); + }; + + // First go through all the triangles and fill in m_planes vector. For each "plane" + // detected on the model, it will contain list of facets that are part of it. + // We will also fill in m_face_to_plane, which contains index into m_planes + // for each of the source facets. + while (1) { + // Find next unvisited triangle: + for (; seed_facet_idx < num_of_facets; ++ seed_facet_idx) + if (m_face_to_plane[seed_facet_idx] == size_t(-1)) { + facet_queue[facet_queue_cnt ++] = seed_facet_idx; + normal_ptr = &face_normals[seed_facet_idx]; + m_face_to_plane[seed_facet_idx] = m_planes.size(); + m_planes.emplace_back(); + break; + } + if (seed_facet_idx == num_of_facets) + break; // Everything was visited already + + while (facet_queue_cnt > 0) { + int facet_idx = facet_queue[-- facet_queue_cnt]; + const stl_normal& this_normal = face_normals[facet_idx]; + if (is_same_normal(this_normal, *normal_ptr)) { +// const Vec3i& face = m_its.indices[facet_idx]; + + m_face_to_plane[facet_idx] = m_planes.size() - 1; + m_planes.back().facets.emplace_back(facet_idx); + for (int j = 0; j < 3; ++ j) + if (int neighbor_idx = face_neighbors[facet_idx][j]; neighbor_idx >= 0 && m_face_to_plane[neighbor_idx] == size_t(-1)) + facet_queue[facet_queue_cnt ++] = neighbor_idx; + } + } + + m_planes.back().normal = normal_ptr->cast(); + std::sort(m_planes.back().facets.begin(), m_planes.back().facets.end()); + } + + // Check that each facet is part of one of the planes. + assert(std::none_of(m_face_to_plane.begin(), m_face_to_plane.end(), [](size_t val) { return val == size_t(-1); })); + + // Now we will walk around each of the planes and save vertices which form the border. + SurfaceMesh sm(m_mesh.its); + for (int plane_id=0; plane_id < int(m_planes.size()); ++plane_id) { + const auto& facets = m_planes[plane_id].facets; + m_planes[plane_id].borders.clear(); + std::vector> visited(facets.size(), {false, false, false}); + + + + for (int face_id=0; face_id& last_border = m_planes[plane_id].borders.back(); + last_border.emplace_back(sm.point(sm.source(he)).cast()); + //Vertex_index target = sm.target(he); + const Halfedge_index he_start = he; + + Face_index fi = he.face(); + auto face_it = std::lower_bound(facets.begin(), facets.end(), int(fi)); + assert(face_it != facets.end()); + assert(*face_it == int(fi)); + visited[face_it - facets.begin()][he.side()] = true; + + do { + const Halfedge_index he_orig = he; + he = sm.next_around_target(he); + if (he.is_invalid()) + goto PLANE_FAILURE; + + // For broken meshes, the iteration might never get back to he_orig. + // Remember all halfedges we saw to break out of such infinite loops. + boost::container::small_vector he_seen; + + while ( (int)m_face_to_plane[sm.face(he)] == plane_id && he != he_orig) { + he_seen.emplace_back(he); + he = sm.next_around_target(he); + if (he.is_invalid() || std::find(he_seen.begin(), he_seen.end(), he) != he_seen.end()) + goto PLANE_FAILURE; + } + he = sm.opposite(he); + if (he.is_invalid()) + goto PLANE_FAILURE; + + Face_index fi = he.face(); + auto face_it = std::lower_bound(facets.begin(), facets.end(), int(fi)); + if (face_it == facets.end() || *face_it != int(fi)) // This indicates a broken mesh. + goto PLANE_FAILURE; + + if (visited[face_it - facets.begin()][he.side()] && he != he_start) { + last_border.resize(1); + break; + } + visited[face_it - facets.begin()][he.side()] = true; + + last_border.emplace_back(sm.point(sm.source(he)).cast()); + + // In case of broken meshes, this loop might be infinite. Break + // out in case it is clearly going bad. + if (last_border.size() > 3*facets.size()+1) + goto PLANE_FAILURE; + + } while (he != he_start); + + if (last_border.size() == 1) + m_planes[plane_id].borders.pop_back(); + else { + assert(last_border.front() == last_border.back()); + last_border.pop_back(); + } + } + } + continue; // There was no failure. + + PLANE_FAILURE: + m_planes[plane_id].borders.clear(); + } +} + + + + + + +void MeasuringImpl::extract_features(int plane_idx) +{ + assert(! m_planes[plane_idx].features_extracted); + + PlaneData& plane = m_planes[plane_idx]; + plane.surface_features.clear(); + const Vec3d& normal = plane.normal; + + Eigen::Quaterniond q; + q.setFromTwoVectors(plane.normal, Vec3d::UnitZ()); + Transform3d trafo = Transform3d::Identity(); + trafo.rotate(q); + const Transform3d trafo_inv = trafo.inverse(); + + std::vector angles; // placed in outer scope to prevent reallocations + std::vector lengths; + + for (const std::vector& border : plane.borders) { + if (border.size() <= 1) + continue; + + bool done = false; + + if (border.size() > 4) { + const auto& [center, radius, err] = get_center_and_radius(border, trafo, trafo_inv); + + if (err < 0.05) { + // The whole border is one circle. Just add it into the list of features + // and we are done. + + bool is_polygon = border.size()>4 && border.size()<=8; + bool lengths_match = std::all_of(border.begin()+2, border.end(), [is_polygon](const Vec3d& pt) { + return Slic3r::is_approx((pt - *((&pt)-1)).squaredNorm(), (*((&pt)-1) - *((&pt)-2)).squaredNorm(), is_polygon ? 0.01 : 0.01); + }); + + if (lengths_match && (is_polygon || border.size() > 8)) { + if (is_polygon) { + // This is a polygon, add the separate edges with the center. + for (int j=0; j int { + assert(std::abs(offset) < border_size); + int out = idx+offset; + if (out >= border_size) + out = out - border_size; + else if (out < 0) + out = border_size + out; + + return out; + }; + + // First calculate angles at all the vertices. + angles.clear(); + lengths.clear(); + int first_different_angle_idx = 0; + for (int i=0; i M_PI) + angle = 2*M_PI - angle; + + angles.push_back(angle); + lengths.push_back(v2.norm()); + if (first_different_angle_idx == 0 && angles.size() > 1) { + if (! are_angles_same(angles.back(), angles[angles.size()-2])) + first_different_angle_idx = angles.size()-1; + } + } + assert(border.size() == angles.size()); + assert(border.size() == lengths.size()); + + // First go around the border and pick what might be circular segments. + // Save pair of indices to where such potential segments start and end. + // Also remember the length of these segments. + int start_idx = -1; + bool circle = false; + bool first_iter = true; + std::vector circles; + std::vector edges; + std::vector> circles_idxs; + //std::vector circles_lengths; + std::vector single_circle; // could be in loop-scope, but reallocations + double single_circle_length = 0.; + int first_pt_idx = offset_to_index(first_different_angle_idx, 1); + int i = first_pt_idx; + while (i != first_pt_idx || first_iter) { + if (are_angles_same(angles[i], angles[offset_to_index(i,-1)]) + && i != offset_to_index(first_pt_idx, -1) // not the last point + && i != start_idx ) { + // circle + if (! circle) { + circle = true; + single_circle.clear(); + single_circle_length = 0.; + start_idx = offset_to_index(i, -2); + single_circle = { border[start_idx], border[offset_to_index(start_idx,1)] }; + single_circle_length += lengths[offset_to_index(i, -1)]; + } + single_circle.emplace_back(border[i]); + single_circle_length += lengths[i]; + } else { + if (circle && single_circle.size() >= 5) { // Less than 5 vertices? Not a circle. + single_circle.emplace_back(border[i]); + single_circle_length += lengths[i]; + + bool accept_circle = true; + { + // Check that lengths of internal (!!!) edges match. + int j = offset_to_index(start_idx, 3); + while (j != i) { + if (! are_lengths_same(lengths[offset_to_index(j,-1)], lengths[j])) { + accept_circle = false; + break; + } + j = offset_to_index(j, 1); + } + } + + if (accept_circle) { + const auto& [center, radius, err] = get_center_and_radius(single_circle, trafo, trafo_inv); + + // Check that the fit went well. The tolerance is high, only to + // reject complete failures. + accept_circle &= err < 0.05; + + // If the segment subtends less than 90 degrees, throw it away. + accept_circle &= single_circle_length / radius > 0.9*M_PI/2.; + + if (accept_circle) { + // Add the circle and remember indices into borders. + circles_idxs.emplace_back(start_idx, i); + circles.emplace_back(SurfaceFeature(SurfaceFeatureType::Circle, center, plane.normal, std::nullopt, radius)); + } + } + } + circle = false; + } + // Take care of the wrap around. + first_iter = false; + i = offset_to_index(i, 1); + } + + // We have the circles. Now go around again and pick edges, while jumping over circles. + if (circles_idxs.empty()) { + // Just add all edges. + for (int i=1; i 1 || circles_idxs.front().first != circles_idxs.front().second) { + // There is at least one circular segment. Start at its end and add edges until the start of the next one. + int i = circles_idxs.front().second; + int circle_idx = 1; + while (true) { + i = offset_to_index(i, 1); + edges.emplace_back(SurfaceFeature(SurfaceFeatureType::Edge, border[offset_to_index(i,-1)], border[i])); + if (circle_idx < int(circles_idxs.size()) && i == circles_idxs[circle_idx].first) { + i = circles_idxs[circle_idx].second; + ++circle_idx; + } + if (i == circles_idxs.front().first) + break; + } + } + + // Merge adjacent edges where needed. + assert(std::all_of(edges.begin(), edges.end(), + [](const SurfaceFeature& f) { return f.get_type() == SurfaceFeatureType::Edge; })); + for (int i=edges.size()-1; i>=0; --i) { + const auto& [first_start, first_end] = edges[i==0 ? edges.size()-1 : i-1].get_edge(); + const auto& [second_start, second_end] = edges[i].get_edge(); + + if (Slic3r::is_approx(first_end, second_start) + && Slic3r::is_approx((first_end-first_start).normalized().dot((second_end-second_start).normalized()), 1.)) { + // The edges have the same direction and share a point. Merge them. + edges[i==0 ? edges.size()-1 : i-1] = SurfaceFeature(SurfaceFeatureType::Edge, first_start, second_end); + edges.erase(edges.begin() + i); + } + } + + // Now move the circles and edges into the feature list for the plane. + assert(std::all_of(circles.begin(), circles.end(), [](const SurfaceFeature& f) { + return f.get_type() == SurfaceFeatureType::Circle; + })); + assert(std::all_of(edges.begin(), edges.end(), [](const SurfaceFeature& f) { + return f.get_type() == SurfaceFeatureType::Edge; + })); + plane.surface_features.insert(plane.surface_features.end(), std::make_move_iterator(circles.begin()), + std::make_move_iterator(circles.end())); + plane.surface_features.insert(plane.surface_features.end(), std::make_move_iterator(edges.begin()), + std::make_move_iterator(edges.end())); + } + } + + // The last surface feature is the plane itself. + Vec3d cog = Vec3d::Zero(); + size_t counter = 0; + for (const std::vector& b : plane.borders) { + for (size_t i = 1; i < b.size(); ++i) { + cog += b[i]; + ++counter; + } + } + cog /= double(counter); + plane.surface_features.emplace_back(SurfaceFeature(SurfaceFeatureType::Plane, + plane.normal, cog, std::optional(), plane_idx + 0.0001)); + + plane.borders.clear(); + plane.borders.shrink_to_fit(); + + plane.features_extracted = true; +} + + + + + + + + +std::optional MeasuringImpl::get_feature(size_t face_idx, const Vec3d& point) +{ + if (face_idx >= m_face_to_plane.size()) + return std::optional(); + + const PlaneData& plane = m_planes[m_face_to_plane[face_idx]]; + + if (! plane.features_extracted) + extract_features(m_face_to_plane[face_idx]); + + size_t closest_feature_idx = size_t(-1); + double min_dist = std::numeric_limits::max(); + + MeasurementResult res; + SurfaceFeature point_sf(point); + + assert(plane.surface_features.empty() || plane.surface_features.back().get_type() == SurfaceFeatureType::Plane); + + for (size_t i=0; idist; + if (dist < feature_hover_limit && dist < min_dist) { + min_dist = std::min(dist, min_dist); + closest_feature_idx = i; + } + } + } + + if (closest_feature_idx != size_t(-1)) { + const SurfaceFeature& f = plane.surface_features[closest_feature_idx]; + if (f.get_type() == SurfaceFeatureType::Edge) { + // If this is an edge, check if we are not close to the endpoint. If so, + // we will include the endpoint as well. Close = 10% of the lenghth of + // the edge, clamped between 0.025 and 0.5 mm. + const auto& [sp, ep] = f.get_edge(); + double len_sq = (ep-sp).squaredNorm(); + double limit_sq = std::max(0.025*0.025, std::min(0.5*0.5, 0.1 * 0.1 * len_sq)); + + if ((point-sp).squaredNorm() < limit_sq) + return std::make_optional(SurfaceFeature(sp)); + if ((point-ep).squaredNorm() < limit_sq) + return std::make_optional(SurfaceFeature(ep)); + } + return std::make_optional(f); + } + + // Nothing detected, return the plane as a whole. + assert(plane.surface_features.back().get_type() == SurfaceFeatureType::Plane); + return std::make_optional(plane.surface_features.back()); +} + + + + + +int MeasuringImpl::get_num_of_planes() const +{ + return (m_planes.size()); +} + + + +const std::vector& MeasuringImpl::get_plane_triangle_indices(int idx) const +{ + assert(idx >= 0 && idx < int(m_planes.size())); + return m_planes[idx].facets; +} + +const std::vector& MeasuringImpl::get_plane_features(unsigned int plane_id) +{ + assert(plane_id < m_planes.size()); + if (! m_planes[plane_id].features_extracted) + extract_features(plane_id); + return m_planes[plane_id].surface_features; +} + +const TriangleMesh& MeasuringImpl::get_mesh() const +{ + return this->m_mesh; +} + + + + + + + + + + + +Measuring::Measuring(const indexed_triangle_set& its) +: priv{std::make_unique(its)} +{} + +Measuring::~Measuring() {} + + + +std::optional Measuring::get_feature(size_t face_idx, const Vec3d& point) const +{ + return priv->get_feature(face_idx, point); +} + + +int Measuring::get_num_of_planes() const +{ + return priv->get_num_of_planes(); +} + + +const std::vector& Measuring::get_plane_triangle_indices(int idx) const +{ + return priv->get_plane_triangle_indices(idx); +} + +const std::vector& Measuring::get_plane_features(unsigned int plane_id) const +{ + return priv->get_plane_features(plane_id); +} + +const TriangleMesh& Measuring::get_mesh() const +{ + return priv->get_mesh(); +} + +const AngleAndEdges AngleAndEdges::Dummy = { 0.0, Vec3d::Zero(), { Vec3d::Zero(), Vec3d::Zero() }, { Vec3d::Zero(), Vec3d::Zero() }, 0.0, true }; + +static AngleAndEdges angle_edge_edge(const std::pair& e1, const std::pair& e2) +{ + if (are_parallel(e1, e2)) + return AngleAndEdges::Dummy; + + Vec3d e1_unit = edge_direction(e1.first, e1.second); + Vec3d e2_unit = edge_direction(e2.first, e2.second); + + // project edges on the plane defined by them + Vec3d normal = e1_unit.cross(e2_unit).normalized(); + const Eigen::Hyperplane plane(normal, e1.first); + Vec3d e11_proj = plane.projection(e1.first); + Vec3d e12_proj = plane.projection(e1.second); + Vec3d e21_proj = plane.projection(e2.first); + Vec3d e22_proj = plane.projection(e2.second); + + const bool coplanar = (e2.first - e21_proj).norm() < EPSILON && (e2.second - e22_proj).norm() < EPSILON; + + // rotate the plane to become the XY plane + auto qp = Eigen::Quaternion::FromTwoVectors(normal, Vec3d::UnitZ()); + auto qp_inverse = qp.inverse(); + const Vec3d e11_rot = qp * e11_proj; + const Vec3d e12_rot = qp * e12_proj; + const Vec3d e21_rot = qp * e21_proj; + const Vec3d e22_rot = qp * e22_proj; + + // discard Z + const Vec2d e11_rot_2d = Vec2d(e11_rot.x(), e11_rot.y()); + const Vec2d e12_rot_2d = Vec2d(e12_rot.x(), e12_rot.y()); + const Vec2d e21_rot_2d = Vec2d(e21_rot.x(), e21_rot.y()); + const Vec2d e22_rot_2d = Vec2d(e22_rot.x(), e22_rot.y()); + + // find intersection (arc center) of edges in XY plane + const Eigen::Hyperplane e1_rot_2d_line = Eigen::Hyperplane::Through(e11_rot_2d, e12_rot_2d); + const Eigen::Hyperplane e2_rot_2d_line = Eigen::Hyperplane::Through(e21_rot_2d, e22_rot_2d); + const Vec2d center_rot_2d = e1_rot_2d_line.intersection(e2_rot_2d_line); + + // arc center in original coordinate + const Vec3d center = qp_inverse * Vec3d(center_rot_2d.x(), center_rot_2d.y(), e11_rot.z()); + + // ensure the edges are pointing away from the center + std::pair out_e1 = e1; + std::pair out_e2 = e2; + if ((center_rot_2d - e11_rot_2d).squaredNorm() > (center_rot_2d - e12_rot_2d).squaredNorm()) { + std::swap(e11_proj, e12_proj); + std::swap(out_e1.first, out_e1.second); + e1_unit = -e1_unit; + } + if ((center_rot_2d - e21_rot_2d).squaredNorm() > (center_rot_2d - e22_rot_2d).squaredNorm()) { + std::swap(e21_proj, e22_proj); + std::swap(out_e2.first, out_e2.second); + e2_unit = -e2_unit; + } + + // arc angle + const double angle = std::acos(std::clamp(e1_unit.dot(e2_unit), -1.0, 1.0)); + // arc radius + const Vec3d e1_proj_mid = 0.5 * (e11_proj + e12_proj); + const Vec3d e2_proj_mid = 0.5 * (e21_proj + e22_proj); + const double radius = std::min((center - e1_proj_mid).norm(), (center - e2_proj_mid).norm()); + + return { angle, center, out_e1, out_e2, radius, coplanar }; +} + +static AngleAndEdges angle_edge_plane(const std::pair& e, const std::tuple& p) +{ + const auto& [idx, normal, origin] = p; + Vec3d e1e2_unit = edge_direction(e); + if (are_perpendicular(e1e2_unit, normal)) + return AngleAndEdges::Dummy; + + // ensure the edge is pointing away from the intersection + // 1st calculate instersection between edge and plane + const Eigen::Hyperplane plane(normal, origin); + const Eigen::ParametrizedLine line = Eigen::ParametrizedLine::Through(e.first, e.second); + const Vec3d inters = line.intersectionPoint(plane); + + // then verify edge direction and revert it, if needed + Vec3d e1 = e.first; + Vec3d e2 = e.second; + if ((e1 - inters).squaredNorm() > (e2 - inters).squaredNorm()) { + std::swap(e1, e2); + e1e2_unit = -e1e2_unit; + } + + if (are_parallel(e1e2_unit, normal)) { + const std::array basis = orthonormal_basis(e1e2_unit); + const double radius = (0.5 * (e1 + e2) - inters).norm(); + const Vec3d edge_on_plane_dir = (basis[1].dot(origin - inters) >= 0.0) ? basis[1] : -basis[1]; + std::pair edge_on_plane = std::make_pair(inters, inters + radius * edge_on_plane_dir); + if (!inters.isApprox(e1)) { + edge_on_plane.first += radius * edge_on_plane_dir; + edge_on_plane.second += radius * edge_on_plane_dir; + } + return AngleAndEdges(0.5 * double(PI), inters, std::make_pair(e1, e2), edge_on_plane, radius, inters.isApprox(e1)); + } + + const Vec3d e1e2 = e2 - e1; + const double e1e2_len = e1e2.norm(); + + // calculate 2nd edge (on the plane) + const Vec3d temp = normal.cross(e1e2); + const Vec3d edge_on_plane_unit = normal.cross(temp).normalized(); + std::pair edge_on_plane = { origin, origin + e1e2_len * edge_on_plane_unit }; + + // ensure the 2nd edge is pointing in the correct direction + const Vec3d test_edge = (edge_on_plane.second - edge_on_plane.first).cross(e1e2); + if (test_edge.dot(temp) < 0.0) + edge_on_plane = { origin, origin - e1e2_len * edge_on_plane_unit }; + + AngleAndEdges ret = angle_edge_edge({ e1, e2 }, edge_on_plane); + ret.radius = (inters - 0.5 * (e1 + e2)).norm(); + return ret; +} + +static AngleAndEdges angle_plane_plane(const std::tuple& p1, const std::tuple& p2) +{ + const auto& [idx1, normal1, origin1] = p1; + const auto& [idx2, normal2, origin2] = p2; + + // are planes parallel ? + if (are_parallel(normal1, normal2)) + return AngleAndEdges::Dummy; + + auto intersection_plane_plane = [](const Vec3d& n1, const Vec3d& o1, const Vec3d& n2, const Vec3d& o2) { + Eigen::MatrixXd m(2, 3); + m << n1.x(), n1.y(), n1.z(), n2.x(), n2.y(), n2.z(); + Eigen::VectorXd b(2); + b << o1.dot(n1), o2.dot(n2); + Eigen::VectorXd x = m.colPivHouseholderQr().solve(b); + return std::make_pair(n1.cross(n2).normalized(), Vec3d(x(0), x(1), x(2))); + }; + + // Calculate intersection line between planes + const auto [intersection_line_direction, intersection_line_origin] = intersection_plane_plane(normal1, origin1, normal2, origin2); + + // Project planes' origin on intersection line + const Eigen::ParametrizedLine intersection_line = Eigen::ParametrizedLine(intersection_line_origin, intersection_line_direction); + const Vec3d origin1_proj = intersection_line.projection(origin1); + const Vec3d origin2_proj = intersection_line.projection(origin2); + + // Calculate edges on planes + const Vec3d edge_on_plane1_unit = (origin1 - origin1_proj).normalized(); + const Vec3d edge_on_plane2_unit = (origin2 - origin2_proj).normalized(); + const double radius = std::max(10.0, std::max((origin1 - origin1_proj).norm(), (origin2 - origin2_proj).norm())); + const std::pair edge_on_plane1 = { origin1_proj + radius * edge_on_plane1_unit, origin1_proj + 2.0 * radius * edge_on_plane1_unit }; + const std::pair edge_on_plane2 = { origin2_proj + radius * edge_on_plane2_unit, origin2_proj + 2.0 * radius * edge_on_plane2_unit }; + + AngleAndEdges ret = angle_edge_edge(edge_on_plane1, edge_on_plane2); + ret.radius = radius; + return ret; +} + + + + + + + +MeasurementResult get_measurement(const SurfaceFeature& a, const SurfaceFeature& b, const Measuring* measuring) +{ + assert(a.get_type() != SurfaceFeatureType::Undef && b.get_type() != SurfaceFeatureType::Undef); + + const bool swap = int(a.get_type()) > int(b.get_type()); + const SurfaceFeature& f1 = swap ? b : a; + const SurfaceFeature& f2 = swap ? a : b; + + MeasurementResult result; + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + if (f1.get_type() == SurfaceFeatureType::Point) { + if (f2.get_type() == SurfaceFeatureType::Point) { + Vec3d diff = (f2.get_point() - f1.get_point()); + result.distance_strict = std::make_optional(DistAndPoints{diff.norm(), f1.get_point(), f2.get_point()}); + result.distance_xyz = diff.cwiseAbs(); + + /////////////////////////////////////////////////////////////////////////// + } else if (f2.get_type() == SurfaceFeatureType::Edge) { + const auto [s,e] = f2.get_edge(); + const Eigen::ParametrizedLine line(s, (e-s).normalized()); + const double dist_inf = line.distance(f1.get_point()); + const Vec3d proj = line.projection(f1.get_point()); + const double len_sq = (e-s).squaredNorm(); + const double dist_start_sq = (proj-s).squaredNorm(); + const double dist_end_sq = (proj-e).squaredNorm(); + if (dist_start_sq < len_sq && dist_end_sq < len_sq) { + // projection falls on the line - the strict distance is the same as infinite + result.distance_strict = std::make_optional(DistAndPoints{dist_inf, f1.get_point(), proj}); + } else { // the result is the closer of the endpoints + const bool s_is_closer = dist_start_sq < dist_end_sq; + result.distance_strict = std::make_optional(DistAndPoints{std::sqrt(std::min(dist_start_sq, dist_end_sq) + sqr(dist_inf)), f1.get_point(), s_is_closer ? s : e}); + } + result.distance_infinite = std::make_optional(DistAndPoints{dist_inf, f1.get_point(), proj}); + /////////////////////////////////////////////////////////////////////////// + } else if (f2.get_type() == SurfaceFeatureType::Circle) { + // Find a plane containing normal, center and the point. + const auto [c, radius, n] = f2.get_circle(); + const Eigen::Hyperplane circle_plane(n, c); + const Vec3d proj = circle_plane.projection(f1.get_point()); + if (proj.isApprox(c)) { + const Vec3d p_on_circle = c + radius * get_orthogonal(n, true); + result.distance_strict = std::make_optional(DistAndPoints{ radius, c, p_on_circle }); + } + else { + const Eigen::Hyperplane circle_plane(n, c); + const Vec3d proj = circle_plane.projection(f1.get_point()); + const double dist = std::sqrt(std::pow((proj - c).norm() - radius, 2.) + + (f1.get_point() - proj).squaredNorm()); + + const Vec3d p_on_circle = c + radius * (proj - c).normalized(); + result.distance_strict = std::make_optional(DistAndPoints{ dist, f1.get_point(), p_on_circle }); // TODO + } + /////////////////////////////////////////////////////////////////////////// + } else if (f2.get_type() == SurfaceFeatureType::Plane) { + const auto [idx, normal, pt] = f2.get_plane(); + Eigen::Hyperplane plane(normal, pt); + result.distance_infinite = std::make_optional(DistAndPoints{plane.absDistance(f1.get_point()), f1.get_point(), plane.projection(f1.get_point())}); // TODO + // TODO: result.distance_strict = + } + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + } + else if (f1.get_type() == SurfaceFeatureType::Edge) { + if (f2.get_type() == SurfaceFeatureType::Edge) { + std::vector distances; + + auto add_point_edge_distance = [&distances](const Vec3d& v, const std::pair& e) { + const MeasurementResult res = get_measurement(SurfaceFeature(v), SurfaceFeature(SurfaceFeatureType::Edge, e.first, e.second)); + double distance = res.distance_strict->dist; + Vec3d v2 = res.distance_strict->to; + + const Vec3d e1e2 = e.second - e.first; + const Vec3d e1v2 = v2 - e.first; + if (e1v2.dot(e1e2) >= 0.0 && e1v2.norm() < e1e2.norm()) + distances.emplace_back(distance, v, v2); + }; + + std::pair e1 = f1.get_edge(); + std::pair e2 = f2.get_edge(); + + distances.emplace_back((e2.first - e1.first).norm(), e1.first, e2.first); + distances.emplace_back((e2.second - e1.first).norm(), e1.first, e2.second); + distances.emplace_back((e2.first - e1.second).norm(), e1.second, e2.first); + distances.emplace_back((e2.second - e1.second).norm(), e1.second, e2.second); + add_point_edge_distance(e1.first, e2); + add_point_edge_distance(e1.second, e2); + add_point_edge_distance(e2.first, e1); + add_point_edge_distance(e2.second, e1); + auto it = std::min_element(distances.begin(), distances.end(), + [](const DistAndPoints& item1, const DistAndPoints& item2) { + return item1.dist < item2.dist; + }); + result.distance_infinite = std::make_optional(*it); + + result.angle = angle_edge_edge(f1.get_edge(), f2.get_edge()); + /////////////////////////////////////////////////////////////////////////// + } else if (f2.get_type() == SurfaceFeatureType::Circle) { + const std::pair e = f1.get_edge(); + const auto& [center, radius, normal] = f2.get_circle(); + const Vec3d e1e2 = (e.second - e.first); + const Vec3d e1e2_unit = e1e2.normalized(); + + std::vector distances; + distances.emplace_back(*get_measurement(SurfaceFeature(e.first), f2).distance_strict); + distances.emplace_back(*get_measurement(SurfaceFeature(e.second), f2).distance_strict); + + const Eigen::Hyperplane plane(e1e2_unit, center); + const Eigen::ParametrizedLine line = Eigen::ParametrizedLine::Through(e.first, e.second); + const Vec3d inter = line.intersectionPoint(plane); + const Vec3d e1inter = inter - e.first; + if (e1inter.dot(e1e2) >= 0.0 && e1inter.norm() < e1e2.norm()) + distances.emplace_back(*get_measurement(SurfaceFeature(inter), f2).distance_strict); + + auto it = std::min_element(distances.begin(), distances.end(), + [](const DistAndPoints& item1, const DistAndPoints& item2) { + return item1.dist < item2.dist; + }); + result.distance_infinite = std::make_optional(DistAndPoints{it->dist, it->from, it->to}); + /////////////////////////////////////////////////////////////////////////// + } else if (f2.get_type() == SurfaceFeatureType::Plane) { + assert(measuring != nullptr); + + const auto [from, to] = f1.get_edge(); + const auto [idx, normal, origin] = f2.get_plane(); + + const Vec3d edge_unit = (to - from).normalized(); + if (are_perpendicular(edge_unit, normal)) { + std::vector distances; + const Eigen::Hyperplane plane(normal, origin); + distances.push_back(DistAndPoints{ plane.absDistance(from), from, plane.projection(from) }); + distances.push_back(DistAndPoints{ plane.absDistance(to), to, plane.projection(to) }); + auto it = std::min_element(distances.begin(), distances.end(), + [](const DistAndPoints& item1, const DistAndPoints& item2) { + return item1.dist < item2.dist; + }); + result.distance_infinite = std::make_optional(DistAndPoints{ it->dist, it->from, it->to }); + } + else { + const std::vector& plane_features = measuring->get_plane_features(idx); + std::vector distances; + for (const SurfaceFeature& sf : plane_features) { + if (sf.get_type() == SurfaceFeatureType::Edge) { + const auto m = get_measurement(sf, f1); + if (!m.distance_infinite.has_value()) { + distances.clear(); + break; + } + else + distances.push_back(*m.distance_infinite); + } + } + if (!distances.empty()) { + auto it = std::min_element(distances.begin(), distances.end(), + [](const DistAndPoints& item1, const DistAndPoints& item2) { + return item1.dist < item2.dist; + }); + result.distance_infinite = std::make_optional(DistAndPoints{ it->dist, it->from, it->to }); + } + } + result.angle = angle_edge_plane(f1.get_edge(), f2.get_plane()); + } + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + } else if (f1.get_type() == SurfaceFeatureType::Circle) { + if (f2.get_type() == SurfaceFeatureType::Circle) { + const auto [c0, r0, n0] = f1.get_circle(); + const auto [c1, r1, n1] = f2.get_circle(); + + // The following code is an adaptation of the algorithm found in: + // https://github.com/davideberly/GeometricTools/blob/master/GTE/Mathematics/DistCircle3Circle3.h + // and described in: + // https://www.geometrictools.com/Documentation/DistanceToCircle3.pdf + + struct ClosestInfo + { + double sqrDistance{ 0.0 }; + Vec3d circle0Closest{ Vec3d::Zero() }; + Vec3d circle1Closest{ Vec3d::Zero() }; + + inline bool operator < (const ClosestInfo& other) const { return sqrDistance < other.sqrDistance; } + }; + std::array candidates{}; + + const double zero = 0.0; + + const Vec3d D = c1 - c0; + + if (!are_parallel(n0, n1)) { + // Get parameters for constructing the degree-8 polynomial phi. + const double one = 1.0; + const double two = 2.0; + const double r0sqr = sqr(r0); + const double r1sqr = sqr(r1); + + // Compute U1 and V1 for the plane of circle1. + const std::array basis = orthonormal_basis(n1); + const Vec3d U1 = basis[0]; + const Vec3d V1 = basis[1]; + + // Construct the polynomial phi(cos(theta)). + const Vec3d N0xD = n0.cross(D); + const Vec3d N0xU1 = n0.cross(U1); + const Vec3d N0xV1 = n0.cross(V1); + const double a0 = r1 * D.dot(U1); + const double a1 = r1 * D.dot(V1); + const double a2 = N0xD.dot(N0xD); + const double a3 = r1 * N0xD.dot(N0xU1); + const double a4 = r1 * N0xD.dot(N0xV1); + const double a5 = r1sqr * N0xU1.dot(N0xU1); + const double a6 = r1sqr * N0xU1.dot(N0xV1); + const double a7 = r1sqr * N0xV1.dot(N0xV1); + Polynomial1 p0{ a2 + a7, two * a3, a5 - a7 }; + Polynomial1 p1{ two * a4, two * a6 }; + Polynomial1 p2{ zero, a1 }; + Polynomial1 p3{ -a0 }; + Polynomial1 p4{ -a6, a4, two * a6 }; + Polynomial1 p5{ -a3, a7 - a5 }; + Polynomial1 tmp0{ one, zero, -one }; + Polynomial1 tmp1 = p2 * p2 + tmp0 * p3 * p3; + Polynomial1 tmp2 = two * p2 * p3; + Polynomial1 tmp3 = p4 * p4 + tmp0 * p5 * p5; + Polynomial1 tmp4 = two * p4 * p5; + Polynomial1 p6 = p0 * tmp1 + tmp0 * p1 * tmp2 - r0sqr * tmp3; + Polynomial1 p7 = p0 * tmp2 + p1 * tmp1 - r0sqr * tmp4; + + // Parameters for polynomial root finding. The roots[] array + // stores the roots. We need only the unique ones, which is + // the responsibility of the set uniqueRoots. The pairs[] + // array stores the (cosine,sine) information mentioned in the + // PDF. TODO: Choose the maximum number of iterations for root + // finding based on specific polynomial data? + const uint32_t maxIterations = 128; + int32_t degree = 0; + size_t numRoots = 0; + std::array roots{}; + std::set uniqueRoots{}; + size_t numPairs = 0; + std::array, 16> pairs{}; + double temp = zero; + double sn = zero; + + if (p7.GetDegree() > 0 || p7[0] != zero) { + // H(cs,sn) = p6(cs) + sn * p7(cs) + Polynomial1 phi = p6 * p6 - tmp0 * p7 * p7; + degree = static_cast(phi.GetDegree()); + assert(degree > 0); + numRoots = RootsPolynomial::Find(degree, &phi[0], maxIterations, roots.data()); + for (size_t i = 0; i < numRoots; ++i) { + uniqueRoots.insert(roots[i]); + } + + for (auto const& cs : uniqueRoots) { + if (std::fabs(cs) <= one) { + temp = p7(cs); + if (temp != zero) { + sn = -p6(cs) / temp; + pairs[numPairs++] = std::make_pair(cs, sn); + } + else { + temp = std::max(one - sqr(cs), zero); + sn = std::sqrt(temp); + pairs[numPairs++] = std::make_pair(cs, sn); + if (sn != zero) + pairs[numPairs++] = std::make_pair(cs, -sn); + } + } + } + } + else { + // H(cs,sn) = p6(cs) + degree = static_cast(p6.GetDegree()); + assert(degree > 0); + numRoots = RootsPolynomial::Find(degree, &p6[0], maxIterations, roots.data()); + for (size_t i = 0; i < numRoots; ++i) { + uniqueRoots.insert(roots[i]); + } + + for (auto const& cs : uniqueRoots) { + if (std::fabs(cs) <= one) { + temp = std::max(one - sqr(cs), zero); + sn = std::sqrt(temp); + pairs[numPairs++] = std::make_pair(cs, sn); + if (sn != zero) + pairs[numPairs++] = std::make_pair(cs, -sn); + } + } + } + + for (size_t i = 0; i < numPairs; ++i) { + ClosestInfo& info = candidates[i]; + Vec3d delta = D + r1 * (pairs[i].first * U1 + pairs[i].second * V1); + info.circle1Closest = c0 + delta; + const double N0dDelta = n0.dot(delta); + const double lenN0xDelta = n0.cross(delta).norm(); + if (lenN0xDelta > 0.0) { + const double diff = lenN0xDelta - r0; + info.sqrDistance = sqr(N0dDelta) + sqr(diff); + delta -= N0dDelta * n0; + delta.normalize(); + info.circle0Closest = c0 + r0 * delta; + } + else { + const Vec3d r0U0 = r0 * get_orthogonal(n0, true); + const Vec3d diff = delta - r0U0; + info.sqrDistance = diff.dot(diff); + info.circle0Closest = c0 + r0U0; + } + } + + std::sort(candidates.begin(), candidates.begin() + numPairs); + } + else { + ClosestInfo& info = candidates[0]; + + const double N0dD = n0.dot(D); + const Vec3d normProj = N0dD * n0; + const Vec3d compProj = D - normProj; + Vec3d U = compProj; + const double d = U.norm(); + U.normalize(); + + // The configuration is determined by the relative location of the + // intervals of projection of the circles on to the D-line. + // Circle0 projects to [-r0,r0] and circle1 projects to + // [d-r1,d+r1]. + const double dmr1 = d - r1; + double distance; + if (dmr1 >= r0) { + // d >= r0 + r1 + // The circles are separated (d > r0 + r1) or tangent with one + // outside the other (d = r0 + r1). + distance = dmr1 - r0; + info.circle0Closest = c0 + r0 * U; + info.circle1Closest = c1 - r1 * U; + } + else { + // d < r0 + r1 + // The cases implicitly use the knowledge that d >= 0. + const double dpr1 = d + r1; + if (dpr1 <= r0) { + // Circle1 is inside circle0. + distance = r0 - dpr1; + if (d > 0.0) { + info.circle0Closest = c0 + r0 * U; + info.circle1Closest = c1 + r1 * U; + } + else { + // The circles are concentric, so U = (0,0,0). + // Construct a vector perpendicular to N0 to use for + // closest points. + U = get_orthogonal(n0, true); + info.circle0Closest = c0 + r0 * U; + info.circle1Closest = c1 + r1 * U; + } + } + else if (dmr1 <= -r0) { + // Circle0 is inside circle1. + distance = -r0 - dmr1; + if (d > 0.0) { + info.circle0Closest = c0 - r0 * U; + info.circle1Closest = c1 - r1 * U; + } + else { + // The circles are concentric, so U = (0,0,0). + // Construct a vector perpendicular to N0 to use for + // closest points. + U = get_orthogonal(n0, true); + info.circle0Closest = c0 + r0 * U; + info.circle1Closest = c1 + r1 * U; + } + } + else { + distance = (c1 - c0).norm(); + info.circle0Closest = c0; + info.circle1Closest = c1; + } + } + + info.sqrDistance = distance * distance + N0dD * N0dD; + } + + result.distance_infinite = std::make_optional(DistAndPoints{ std::sqrt(candidates[0].sqrDistance), candidates[0].circle0Closest, candidates[0].circle1Closest }); // TODO + /////////////////////////////////////////////////////////////////////////// + } else if (f2.get_type() == SurfaceFeatureType::Plane) { + assert(measuring != nullptr); + + const auto [center, radius, normal1] = f1.get_circle(); + const auto [idx2, normal2, origin2] = f2.get_plane(); + + const bool coplanar = are_parallel(normal1, normal2) && Eigen::Hyperplane(normal1, center).absDistance(origin2) < EPSILON; + if (!coplanar) { + const std::vector& plane_features = measuring->get_plane_features(idx2); + std::vector distances; + for (const SurfaceFeature& sf : plane_features) { + if (sf.get_type() == SurfaceFeatureType::Edge) { + const auto m = get_measurement(sf, f1); + if (!m.distance_infinite.has_value()) { + distances.clear(); + break; + } + else + distances.push_back(*m.distance_infinite); + } + } + if (!distances.empty()) { + auto it = std::min_element(distances.begin(), distances.end(), + [](const DistAndPoints& item1, const DistAndPoints& item2) { + return item1.dist < item2.dist; + }); + result.distance_infinite = std::make_optional(DistAndPoints{ it->dist, it->from, it->to }); + } + } + } + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + } else if (f1.get_type() == SurfaceFeatureType::Plane) { + const auto [idx1, normal1, pt1] = f1.get_plane(); + const auto [idx2, normal2, pt2] = f2.get_plane(); + + if (are_parallel(normal1, normal2)) { + // The planes are parallel, calculate distance. + const Eigen::Hyperplane plane(normal1, pt1); + result.distance_infinite = std::make_optional(DistAndPoints{ plane.absDistance(pt2), pt2, plane.projection(pt2) }); // TODO + } + else + result.angle = angle_plane_plane(f1.get_plane(), f2.get_plane()); + } + + return result; +} + + + + + + + + +} // namespace Measure +} // namespace Slic3r + diff --git a/src/libslic3r/Measure.hpp b/src/libslic3r/Measure.hpp new file mode 100644 index 00000000000..a273135ca8b --- /dev/null +++ b/src/libslic3r/Measure.hpp @@ -0,0 +1,196 @@ +#ifndef Slic3r_Measure_hpp_ +#define Slic3r_Measure_hpp_ + +#include +#include + +#include "Point.hpp" + + +struct indexed_triangle_set; + + + +namespace Slic3r { + +class TriangleMesh; + +namespace Measure { + + +enum class SurfaceFeatureType : int { + Undef = 0, + Point = 1 << 0, + Edge = 1 << 1, + Circle = 1 << 2, + Plane = 1 << 3 +}; + +class SurfaceFeature { +public: + SurfaceFeature(SurfaceFeatureType type, const Vec3d& pt1, const Vec3d& pt2, std::optional pt3 = std::nullopt, double value = 0.0) + : m_type(type), m_pt1(pt1), m_pt2(pt2), m_pt3(pt3), m_value(value) {} + + explicit SurfaceFeature(const Vec3d& pt) + : m_type{SurfaceFeatureType::Point}, m_pt1{pt} {} + + // Get type of this feature. + SurfaceFeatureType get_type() const { return m_type; } + + // For points, return the point. + Vec3d get_point() const { assert(m_type == SurfaceFeatureType::Point); return m_pt1; } + + // For edges, return start and end. + std::pair get_edge() const { assert(m_type == SurfaceFeatureType::Edge); return std::make_pair(m_pt1, m_pt2); } + + // For circles, return center, radius and normal. + std::tuple get_circle() const { assert(m_type == SurfaceFeatureType::Circle); return std::make_tuple(m_pt1, m_value, m_pt2); } + + // For planes, return index into vector provided by Measuring::get_plane_triangle_indices, normal and point. + std::tuple get_plane() const { assert(m_type == SurfaceFeatureType::Plane); return std::make_tuple(int(m_value), m_pt1, m_pt2); } + + // For anything, return an extra point that should also be considered a part of this. + std::optional get_extra_point() const { assert(m_type != SurfaceFeatureType::Undef); return m_pt3; } + + bool operator == (const SurfaceFeature& other) const { + if (this->m_type != other.m_type) return false; + switch (this->m_type) + { + case SurfaceFeatureType::Undef: { break; } + case SurfaceFeatureType::Point: { return (this->m_pt1.isApprox(other.m_pt1)); } + case SurfaceFeatureType::Edge: { + return (this->m_pt1.isApprox(other.m_pt1) && this->m_pt2.isApprox(other.m_pt2)) || + (this->m_pt1.isApprox(other.m_pt2) && this->m_pt2.isApprox(other.m_pt1)); + } + case SurfaceFeatureType::Plane: + case SurfaceFeatureType::Circle: { + return (this->m_pt1.isApprox(other.m_pt1) && this->m_pt2.isApprox(other.m_pt2) && std::abs(this->m_value - other.m_value) < EPSILON); + } + } + + return false; + } + + bool operator != (const SurfaceFeature& other) const { + return !operator == (other); + } + +private: + SurfaceFeatureType m_type{ SurfaceFeatureType::Undef }; + Vec3d m_pt1{ Vec3d::Zero() }; + Vec3d m_pt2{ Vec3d::Zero() }; + std::optional m_pt3; + double m_value{ 0.0 }; +}; + + + +class MeasuringImpl; + + +class Measuring { +public: + // Construct the measurement object on a given its. + explicit Measuring(const indexed_triangle_set& its); + ~Measuring(); + + + // Given a face_idx where the mouse cursor points, return a feature that + // should be highlighted (if any). + std::optional get_feature(size_t face_idx, const Vec3d& point) const; + + // Return total number of planes. + int get_num_of_planes() const; + + // Returns a list of triangle indices for given plane. + const std::vector& get_plane_triangle_indices(int idx) const; + + // Returns the surface features of the plane with the given index + const std::vector& get_plane_features(unsigned int plane_id) const; + + // Returns the mesh used for measuring + const TriangleMesh& get_mesh() const; + +private: + std::unique_ptr priv; +}; + + +struct DistAndPoints { + DistAndPoints(double dist_, Vec3d from_, Vec3d to_) : dist(dist_), from(from_), to(to_) {} + double dist; + Vec3d from; + Vec3d to; +}; + +struct AngleAndEdges { + AngleAndEdges(double angle_, const Vec3d& center_, const std::pair& e1_, const std::pair& e2_, double radius_, bool coplanar_) + : angle(angle_), center(center_), e1(e1_), e2(e2_), radius(radius_), coplanar(coplanar_) {} + double angle; + Vec3d center; + std::pair e1; + std::pair e2; + double radius; + bool coplanar; + + static const AngleAndEdges Dummy; +}; + +struct MeasurementResult { + std::optional angle; + std::optional distance_infinite; + std::optional distance_strict; + std::optional distance_xyz; + + bool has_distance_data() const { + return distance_infinite.has_value() || distance_strict.has_value(); + } + + bool has_any_data() const { + return angle.has_value() || distance_infinite.has_value() || distance_strict.has_value() || distance_xyz.has_value(); + } +}; + +// Returns distance/angle between two SurfaceFeatures. +MeasurementResult get_measurement(const SurfaceFeature& a, const SurfaceFeature& b, const Measuring* measuring = nullptr); + +inline Vec3d edge_direction(const Vec3d& from, const Vec3d& to) { return (to - from).normalized(); } +inline Vec3d edge_direction(const std::pair& e) { return edge_direction(e.first, e.second); } +inline Vec3d edge_direction(const SurfaceFeature& edge) { + assert(edge.get_type() == SurfaceFeatureType::Edge); + return edge_direction(edge.get_edge()); +} + +inline Vec3d plane_normal(const SurfaceFeature& plane) { + assert(plane.get_type() == SurfaceFeatureType::Plane); + return std::get<1>(plane.get_plane()); +} + +inline bool are_parallel(const Vec3d& v1, const Vec3d& v2) { return std::abs(std::abs(v1.dot(v2)) - 1.0) < EPSILON; } +inline bool are_perpendicular(const Vec3d& v1, const Vec3d& v2) { return std::abs(v1.dot(v2)) < EPSILON; } + +inline bool are_parallel(const std::pair& e1, const std::pair& e2) { + return are_parallel(e1.second - e1.first, e2.second - e2.first); +} +inline bool are_parallel(const SurfaceFeature& f1, const SurfaceFeature& f2) { + if (f1.get_type() == SurfaceFeatureType::Edge && f2.get_type() == SurfaceFeatureType::Edge) + return are_parallel(edge_direction(f1), edge_direction(f2)); + else if (f1.get_type() == SurfaceFeatureType::Edge && f2.get_type() == SurfaceFeatureType::Plane) + return are_perpendicular(edge_direction(f1), plane_normal(f2)); + else + return false; +} + +inline bool are_perpendicular(const SurfaceFeature& f1, const SurfaceFeature& f2) { + if (f1.get_type() == SurfaceFeatureType::Edge && f2.get_type() == SurfaceFeatureType::Edge) + return are_perpendicular(edge_direction(f1), edge_direction(f2)); + else if (f1.get_type() == SurfaceFeatureType::Edge && f2.get_type() == SurfaceFeatureType::Plane) + return are_parallel(edge_direction(f1), plane_normal(f2)); + else + return false; +} + +} // namespace Measure +} // namespace Slic3r + +#endif // Slic3r_Measure_hpp_ diff --git a/src/libslic3r/MeasureUtils.hpp b/src/libslic3r/MeasureUtils.hpp new file mode 100644 index 00000000000..0ab4ac121d8 --- /dev/null +++ b/src/libslic3r/MeasureUtils.hpp @@ -0,0 +1,386 @@ +#ifndef Slic3r_MeasureUtils_hpp_ +#define Slic3r_MeasureUtils_hpp_ + +#include + +namespace Slic3r { +namespace Measure { + +// Utility class used to calculate distance circle-circle +// Adaptation of code found in: +// https://github.com/davideberly/GeometricTools/blob/master/GTE/Mathematics/Polynomial1.h + +class Polynomial1 +{ +public: + Polynomial1(std::initializer_list values) + { + // C++ 11 will call the default constructor for + // Polynomial1 p{}, so it is guaranteed that + // values.size() > 0. + m_coefficient.resize(values.size()); + std::copy(values.begin(), values.end(), m_coefficient.begin()); + EliminateLeadingZeros(); + } + + // Construction and destruction. The first constructor creates a + // polynomial of the specified degree but sets all coefficients to + // zero (to ensure initialization). You are responsible for setting + // the coefficients, presumably with the degree-term set to a nonzero + // number. In the second constructor, the degree is the number of + // initializers plus 1, but then adjusted so that coefficient[degree] + // is not zero (unless all initializer values are zero). + explicit Polynomial1(uint32_t degree) + : m_coefficient(static_cast(degree) + 1, 0.0) + {} + + // Eliminate any leading zeros in the polynomial, except in the case + // the degree is 0 and the coefficient is 0. The elimination is + // necessary when arithmetic operations cause a decrease in the degree + // of the result. For example, (1 + x + x^2) + (1 + 2*x - x^2) = + // (2 + 3*x). The inputs both have degree 2, so the result is created + // with degree 2. After the addition we find that the degree is in + // fact 1 and resize the array of coefficients. This function is + // called internally by the arithmetic operators, but it is exposed in + // the public interface in case you need it for your own purposes. + void EliminateLeadingZeros() + { + const size_t size = m_coefficient.size(); + if (size > 1) { + const double zero = 0.0; + int32_t leading; + for (leading = static_cast(size) - 1; leading > 0; --leading) { + if (m_coefficient[leading] != zero) + break; + } + + m_coefficient.resize(++leading); + } + } + + // Set all coefficients to the specified value. + void SetCoefficients(double value) + { + std::fill(m_coefficient.begin(), m_coefficient.end(), value); + } + + inline uint32_t GetDegree() const + { + // By design, m_coefficient.size() > 0. + return static_cast(m_coefficient.size() - 1); + } + + inline const double& operator[](uint32_t i) const { return m_coefficient[i]; } + inline double& operator[](uint32_t i) { return m_coefficient[i]; } + + // Evaluate the polynomial. If the polynomial is invalid, the + // function returns zero. + double operator()(double t) const + { + int32_t i = static_cast(m_coefficient.size()); + double result = m_coefficient[--i]; + for (--i; i >= 0; --i) { + result *= t; + result += m_coefficient[i]; + } + return result; + } + +protected: + // The class is designed so that m_coefficient.size() >= 1. + std::vector m_coefficient; +}; + +inline Polynomial1 operator * (const Polynomial1& p0, const Polynomial1& p1) +{ + const uint32_t p0Degree = p0.GetDegree(); + const uint32_t p1Degree = p1.GetDegree(); + Polynomial1 result(p0Degree + p1Degree); + result.SetCoefficients(0.0); + for (uint32_t i0 = 0; i0 <= p0Degree; ++i0) { + for (uint32_t i1 = 0; i1 <= p1Degree; ++i1) { + result[i0 + i1] += p0[i0] * p1[i1]; + } + } + return result; +} + +inline Polynomial1 operator + (const Polynomial1& p0, const Polynomial1& p1) +{ + const uint32_t p0Degree = p0.GetDegree(); + const uint32_t p1Degree = p1.GetDegree(); + uint32_t i; + if (p0Degree >= p1Degree) { + Polynomial1 result(p0Degree); + for (i = 0; i <= p1Degree; ++i) { + result[i] = p0[i] + p1[i]; + } + for (/**/; i <= p0Degree; ++i) { + result[i] = p0[i]; + } + result.EliminateLeadingZeros(); + return result; + } + else { + Polynomial1 result(p1Degree); + for (i = 0; i <= p0Degree; ++i) { + result[i] = p0[i] + p1[i]; + } + for (/**/; i <= p1Degree; ++i) { + result[i] = p1[i]; + } + result.EliminateLeadingZeros(); + return result; + } +} + +inline Polynomial1 operator - (const Polynomial1& p0, const Polynomial1& p1) +{ + const uint32_t p0Degree = p0.GetDegree(); + const uint32_t p1Degree = p1.GetDegree(); + uint32_t i; + if (p0Degree >= p1Degree) { + Polynomial1 result(p0Degree); + for (i = 0; i <= p1Degree; ++i) { + result[i] = p0[i] - p1[i]; + } + for (/**/; i <= p0Degree; ++i) { + result[i] = p0[i]; + } + result.EliminateLeadingZeros(); + return result; + } + else { + Polynomial1 result(p1Degree); + for (i = 0; i <= p0Degree; ++i) { + result[i] = p0[i] - p1[i]; + } + for (/**/; i <= p1Degree; ++i) { + result[i] = -p1[i]; + } + result.EliminateLeadingZeros(); + return result; + } +} + +inline Polynomial1 operator * (double scalar, const Polynomial1& p) +{ + const uint32_t degree = p.GetDegree(); + Polynomial1 result(degree); + for (uint32_t i = 0; i <= degree; ++i) { + result[i] = scalar * p[i]; + } + return result; +} + +// Utility class used to calculate distance circle-circle +// Adaptation of code found in: +// https://github.com/davideberly/GeometricTools/blob/master/GTE/Mathematics/RootsPolynomial.h + +class RootsPolynomial +{ +public: + // General equations: sum_{i=0}^{d} c(i)*t^i = 0. The input array 'c' + // must have at least d+1 elements and the output array 'root' must + // have at least d elements. + + // Find the roots on (-infinity,+infinity). + static int32_t Find(int32_t degree, const double* c, uint32_t maxIterations, double* roots) + { + if (degree >= 0 && c != nullptr) { + const double zero = 0.0; + while (degree >= 0 && c[degree] == zero) { + --degree; + } + + if (degree > 0) { + // Compute the Cauchy bound. + const double one = 1.0; + const double invLeading = one / c[degree]; + double maxValue = zero; + for (int32_t i = 0; i < degree; ++i) { + const double value = std::fabs(c[i] * invLeading); + if (value > maxValue) + maxValue = value; + } + const double bound = one + maxValue; + + return FindRecursive(degree, c, -bound, bound, maxIterations, roots); + } + else if (degree == 0) + // The polynomial is a nonzero constant. + return 0; + else { + // The polynomial is identically zero. + roots[0] = zero; + return 1; + } + } + else + // Invalid degree or c. + return 0; + } + + // If you know that p(tmin) * p(tmax) <= 0, then there must be at + // least one root in [tmin, tmax]. Compute it using bisection. + static bool Find(int32_t degree, const double* c, double tmin, double tmax, uint32_t maxIterations, double& root) + { + const double zero = 0.0; + double pmin = Evaluate(degree, c, tmin); + if (pmin == zero) { + root = tmin; + return true; + } + double pmax = Evaluate(degree, c, tmax); + if (pmax == zero) { + root = tmax; + return true; + } + + if (pmin * pmax > zero) + // It is not known whether the interval bounds a root. + return false; + + if (tmin >= tmax) + // Invalid ordering of interval endpoitns. + return false; + + for (uint32_t i = 1; i <= maxIterations; ++i) { + root = 0.5 * (tmin + tmax); + + // This test is designed for 'float' or 'double' when tmin + // and tmax are consecutive floating-point numbers. + if (root == tmin || root == tmax) + break; + + const double p = Evaluate(degree, c, root); + const double product = p * pmin; + if (product < zero) { + tmax = root; + pmax = p; + } + else if (product > zero) { + tmin = root; + pmin = p; + } + else + break; + } + + return true; + } + + // Support for the Find functions. + static int32_t FindRecursive(int32_t degree, double const* c, double tmin, double tmax, uint32_t maxIterations, double* roots) + { + // The base of the recursion. + const double zero = 0.0; + double root = zero; + if (degree == 1) { + int32_t numRoots; + if (c[1] != zero) { + root = -c[0] / c[1]; + numRoots = 1; + } + else if (c[0] == zero) { + root = zero; + numRoots = 1; + } + else + numRoots = 0; + + if (numRoots > 0 && tmin <= root && root <= tmax) { + roots[0] = root; + return 1; + } + return 0; + } + + // Find the roots of the derivative polynomial scaled by 1/degree. + // The scaling avoids the factorial growth in the coefficients; + // for example, without the scaling, the high-order term x^d + // becomes (d!)*x through multiple differentiations. With the + // scaling we instead get x. This leads to better numerical + // behavior of the root finder. + const int32_t derivDegree = degree - 1; + std::vector derivCoeff(static_cast(derivDegree) + 1); + std::vector derivRoots(derivDegree); + for (int32_t i = 0, ip1 = 1; i <= derivDegree; ++i, ++ip1) { + derivCoeff[i] = c[ip1] * (double)(ip1) / (double)degree; + } + const int32_t numDerivRoots = FindRecursive(degree - 1, &derivCoeff[0], tmin, tmax, maxIterations, &derivRoots[0]); + + int32_t numRoots = 0; + if (numDerivRoots > 0) { + // Find root on [tmin,derivRoots[0]]. + if (Find(degree, c, tmin, derivRoots[0], maxIterations, root)) + roots[numRoots++] = root; + + // Find root on [derivRoots[i],derivRoots[i+1]]. + for (int32_t i = 0, ip1 = 1; i <= numDerivRoots - 2; ++i, ++ip1) { + if (Find(degree, c, derivRoots[i], derivRoots[ip1], maxIterations, root)) + roots[numRoots++] = root; + } + + // Find root on [derivRoots[numDerivRoots-1],tmax]. + if (Find(degree, c, derivRoots[static_cast(numDerivRoots) - 1], tmax, maxIterations, root)) + roots[numRoots++] = root; + } + else { + // The polynomial is monotone on [tmin,tmax], so has at most one root. + if (Find(degree, c, tmin, tmax, maxIterations, root)) + roots[numRoots++] = root; + } + return numRoots; + } + + static double Evaluate(int32_t degree, const double* c, double t) + { + int32_t i = degree; + double result = c[i]; + while (--i >= 0) { + result = t * result + c[i]; + } + return result; + } +}; + +// Adaptation of code found in: +// https://github.com/davideberly/GeometricTools/blob/master/GTE/Mathematics/Vector.h + +// Construct a single vector orthogonal to the nonzero input vector. If +// the maximum absolute component occurs at index i, then the orthogonal +// vector U has u[i] = v[i+1], u[i+1] = -v[i], and all other components +// zero. The index addition i+1 is computed modulo N. +inline Vec3d get_orthogonal(const Vec3d& v, bool unitLength) +{ + double cmax = std::fabs(v[0]); + int32_t imax = 0; + for (int32_t i = 1; i < 3; ++i) { + double c = std::fabs(v[i]); + if (c > cmax) { + cmax = c; + imax = i; + } + } + + Vec3d result = Vec3d::Zero(); + int32_t inext = imax + 1; + if (inext == 3) + inext = 0; + + result[imax] = v[inext]; + result[inext] = -v[imax]; + if (unitLength) { + const double sqrDistance = result[imax] * result[imax] + result[inext] * result[inext]; + const double invLength = 1.0 / std::sqrt(sqrDistance); + result[imax] *= invLength; + result[inext] *= invLength; + } + return result; +} + +} // namespace Slic3r +} // namespace Measure + +#endif // Slic3r_MeasureUtils_hpp_ diff --git a/src/libslic3r/Point.hpp b/src/libslic3r/Point.hpp index dacf49b0803..47750d9e688 100644 --- a/src/libslic3r/Point.hpp +++ b/src/libslic3r/Point.hpp @@ -42,6 +42,7 @@ using Vec3i64 = Eigen::Matrix; // Vector types with a double coordinate base type. using Vec2f = Eigen::Matrix; using Vec3f = Eigen::Matrix; +using Vec4f = Eigen::Matrix; using Vec2d = Eigen::Matrix; using Vec3d = Eigen::Matrix; // BBS diff --git a/src/libslic3r/SurfaceMesh.hpp b/src/libslic3r/SurfaceMesh.hpp new file mode 100644 index 00000000000..93eb9fdaa6e --- /dev/null +++ b/src/libslic3r/SurfaceMesh.hpp @@ -0,0 +1,163 @@ +#ifndef slic3r_SurfaceMesh_hpp_ +#define slic3r_SurfaceMesh_hpp_ + +#include +#include + +#include "boost/container/small_vector.hpp" + +namespace Slic3r { + +class TriangleMesh; + + + +enum Face_index : int; + +class Halfedge_index { + friend class SurfaceMesh; + +public: + Halfedge_index() : m_face(Face_index(-1)), m_side(0) {} + Face_index face() const { return m_face; } + unsigned char side() const { return m_side; } + bool is_invalid() const { return int(m_face) < 0; } + bool operator!=(const Halfedge_index& rhs) const { return ! ((*this) == rhs); } + bool operator==(const Halfedge_index& rhs) const { return m_face == rhs.m_face && m_side == rhs.m_side; } + +private: + Halfedge_index(int face_idx, unsigned char side_idx) : m_face(Face_index(face_idx)), m_side(side_idx) {} + + Face_index m_face; + unsigned char m_side; +}; + + + +class Vertex_index { + friend class SurfaceMesh; + +public: + Vertex_index() : m_face(Face_index(-1)), m_vertex_idx(0) {} + bool is_invalid() const { return int(m_face) < 0; } + bool operator==(const Vertex_index& rhs) const = delete; // Use SurfaceMesh::is_same_vertex. + +private: + Vertex_index(int face_idx, unsigned char vertex_idx) : m_face(Face_index(face_idx)), m_vertex_idx(vertex_idx) {} + + Face_index m_face; + unsigned char m_vertex_idx; +}; + + + +class SurfaceMesh { +public: + explicit SurfaceMesh(const indexed_triangle_set& its) + : m_its(its), + m_face_neighbors(its_face_neighbors_par(its)) + {} + SurfaceMesh(const SurfaceMesh&) = delete; + SurfaceMesh& operator=(const SurfaceMesh&) = delete; + + Vertex_index source(Halfedge_index h) const { assert(! h.is_invalid()); return Vertex_index(h.m_face, h.m_side); } + Vertex_index target(Halfedge_index h) const { assert(! h.is_invalid()); return Vertex_index(h.m_face, h.m_side == 2 ? 0 : h.m_side + 1); } + Face_index face(Halfedge_index h) const { assert(! h.is_invalid()); return h.m_face; } + + Halfedge_index next(Halfedge_index h) const { assert(! h.is_invalid()); h.m_side = (h.m_side + 1) % 3; return h; } + Halfedge_index prev(Halfedge_index h) const { assert(! h.is_invalid()); h.m_side = (h.m_side == 0 ? 2 : h.m_side - 1); return h; } + Halfedge_index halfedge(Vertex_index v) const { return Halfedge_index(v.m_face, (v.m_vertex_idx == 0 ? 2 : v.m_vertex_idx - 1)); } + Halfedge_index halfedge(Face_index f) const { return Halfedge_index(f, 0); } + Halfedge_index opposite(Halfedge_index h) const { + if (h.is_invalid()) + return h; + + int face_idx = m_face_neighbors[h.m_face][h.m_side]; + Halfedge_index h_candidate = halfedge(Face_index(face_idx)); + + if (h_candidate.is_invalid()) + return Halfedge_index(); // invalid + + for (int i=0; i<3; ++i) { + if (is_same_vertex(source(h_candidate), target(h))) { + // Meshes in PrusaSlicer should be fixed enough for the following not to happen. + assert(is_same_vertex(target(h_candidate), source(h))); + return h_candidate; + } + h_candidate = next(h_candidate); + } + return Halfedge_index(); // invalid + } + + Halfedge_index next_around_target(Halfedge_index h) const { return opposite(next(h)); } + Halfedge_index prev_around_target(Halfedge_index h) const { Halfedge_index op = opposite(h); return (op.is_invalid() ? Halfedge_index() : prev(op)); } + Halfedge_index next_around_source(Halfedge_index h) const { Halfedge_index op = opposite(h); return (op.is_invalid() ? Halfedge_index() : next(op)); } + Halfedge_index prev_around_source(Halfedge_index h) const { return opposite(prev(h)); } + Halfedge_index halfedge(Vertex_index source, Vertex_index target) const + { + Halfedge_index hi(source.m_face, source.m_vertex_idx); + assert(! hi.is_invalid()); + + const Vertex_index orig_target = this->target(hi); + Vertex_index current_target = orig_target; + + while (! is_same_vertex(current_target, target)) { + hi = next_around_source(hi); + if (hi.is_invalid()) + break; + current_target = this->target(hi); + if (is_same_vertex(current_target, orig_target)) + return Halfedge_index(); // invalid + } + + return hi; + } + + const stl_vertex& point(Vertex_index v) const { return m_its.vertices[m_its.indices[v.m_face][v.m_vertex_idx]]; } + + size_t degree(Vertex_index v) const + { + // In case the mesh is broken badly, the loop might end up to be infinite, + // never getting back to the first halfedge. Remember list of all half-edges + // and trip if any is encountered for the second time. + Halfedge_index h_first = halfedge(v); + boost::container::small_vector he_visited; + Halfedge_index h = next_around_target(h_first); + size_t degree = 2; + while (! h.is_invalid() && h != h_first) { + he_visited.emplace_back(h); + h = next_around_target(h); + if (std::find(he_visited.begin(), he_visited.end(), h) == he_visited.end()) + return 0; + ++degree; + } + return h.is_invalid() ? 0 : degree - 1; + } + + size_t degree(Face_index f) const { + size_t total = 0; + for (unsigned char i=0; i<3; ++i) { + size_t d = degree(Vertex_index(f, i)); + if (d == 0) + return 0; + total += d; + } + assert(total - 6 >= 0); + return total - 6; // we counted 3 halfedges from f, and one more for each neighbor + } + + bool is_border(Halfedge_index h) const { return m_face_neighbors[h.m_face][h.m_side] == -1; } + + bool is_same_vertex(const Vertex_index& a, const Vertex_index& b) const { return m_its.indices[a.m_face][a.m_vertex_idx] == m_its.indices[b.m_face][b.m_vertex_idx]; } + Vec3i get_face_neighbors(Face_index face_id) const { assert(int(face_id) < int(m_face_neighbors.size())); return m_face_neighbors[face_id]; } + + + +private: + const std::vector m_face_neighbors; + const indexed_triangle_set& m_its; +}; + +} //namespace Slic3r + +#endif // slic3r_SurfaceMesh_hpp_ diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 61dc8c9491f..331e89128bd 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -99,6 +99,8 @@ set(SLIC3R_GUI_SOURCES GUI/GLShader.hpp GUI/GLCanvas3D.hpp GUI/GLCanvas3D.cpp + GUI/SceneRaycaster.hpp + GUI/SceneRaycaster.cpp GUI/OpenGLManager.hpp GUI/OpenGLManager.cpp GUI/Selection.hpp @@ -139,6 +141,8 @@ set(SLIC3R_GUI_SOURCES GUI/Gizmos/GLGizmoText.hpp GUI/Gizmos/GLGizmoMeshBoolean.cpp GUI/Gizmos/GLGizmoMeshBoolean.hpp + GUI/Gizmos/GLGizmoMeasure.cpp + GUI/Gizmos/GLGizmoMeasure.hpp GUI/GLSelectionRectangle.cpp GUI/GLSelectionRectangle.hpp GUI/Gizmos/GizmoObjectManipulation.cpp @@ -205,6 +209,8 @@ set(SLIC3R_GUI_SOURCES GUI/GUI_AuxiliaryList.hpp GUI/GUI_ObjectSettings.cpp GUI/GUI_ObjectSettings.hpp + GUI/GUI_Geometry.cpp + GUI/GUI_Geometry.hpp GUI/GUI_ObjectTable.cpp GUI/GUI_ObjectTable.hpp GUI/GUI_ObjectTableSettings.cpp diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index e68df3e3829..284398c8f86 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4044,7 +4044,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_layers_editing.state = LayersEditing::Editing; _perform_layer_editing_action(&evt); } - else { // BBS: define Alt key to enable volume selection mode m_selection.set_volume_selection_mode(evt.AltDown() ? Selection::Volume : Selection::Instance); @@ -4052,6 +4051,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports && m_gizmos.get_current_type() != GLGizmosManager::FdmSupports && m_gizmos.get_current_type() != GLGizmosManager::Seam + && m_gizmos.get_current_type() != GLGizmosManager::Measure && m_gizmos.get_current_type() != GLGizmosManager::MmuSegmentation) { m_rectangle_selection.start_dragging(m_mouse.position, evt.ShiftDown() ? GLSelectionRectangle::Select : GLSelectionRectangle::Deselect); m_dirty = true; @@ -4327,7 +4327,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // if right clicking on volume, propagate event through callback (shows context menu) int volume_idx = get_first_hover_volume_idx(); if (!m_volumes.volumes[volume_idx]->is_wipe_tower // no context menu for the wipe tower - && m_gizmos.get_current_type() != GLGizmosManager::SlaSupports) // disable context menu when the gizmo is open + && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports && m_gizmos.get_current_type() != GLGizmosManager::Measure)) // disable context menu when the gizmo is open { // forces the selection of the volume /* m_selection.add(volume_idx); // #et_FIXME_if_needed @@ -4368,7 +4368,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) else { // do not post the event if the user is panning the scene // or if right click was done over the wipe tower - bool post_right_click_event = m_hover_volume_idxs.empty() || !m_volumes.volumes[get_first_hover_volume_idx()]->is_wipe_tower; + bool post_right_click_event = (m_hover_volume_idxs.empty() || + !m_volumes.volumes[get_first_hover_volume_idx()]->is_wipe_tower) && + m_gizmos.get_current_type() != GLGizmosManager::Measure; if (post_right_click_event) post_event(RBtnEvent(EVT_GLCANVAS_RIGHT_CLICK, { logical_pos, m_hover_volume_idxs.empty() })); } @@ -6953,6 +6955,7 @@ void GLCanvas3D::_render_sequential_clearance() { case GLGizmosManager::EType::Flatten: case GLGizmosManager::EType::Cut: + case GLGizmosManager::EType::Measure: case GLGizmosManager::EType::Hollow: case GLGizmosManager::EType::SlaSupports: case GLGizmosManager::EType::FdmSupports: @@ -8224,6 +8227,10 @@ void GLCanvas3D::_render_selection_sidebar_hints() const void GLCanvas3D::_update_volumes_hover_state() { + // skip update if the Gizmo Measure is active + if (m_gizmos.get_current_type() == GLGizmosManager::Measure) + return; + for (GLVolume* v : m_volumes.volumes) { v->hover = GLVolume::HS_None; } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 303a2d04b4c..14d657bc573 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -19,6 +19,7 @@ #include "IMToolbar.hpp" #include "libslic3r/Slicing.hpp" +#include "slic3r/GUI/SceneRaycaster.hpp" #include @@ -506,6 +507,8 @@ class GLCanvas3D bool m_is_dark = false; wxGLCanvas* m_canvas; wxGLContext* m_context; + SceneRaycaster m_scene_raycaster; + Bed3D &m_bed; #if ENABLE_RETINA_GL std::unique_ptr m_retina_helper; @@ -724,6 +727,26 @@ class GLCanvas3D bool init(); void post_event(wxEvent &&event); + std::shared_ptr add_raycaster_for_picking(SceneRaycaster::EType type, int id, const MeshRaycaster& raycaster, + const Transform3d& trafo = Transform3d::Identity(), bool use_back_faces = false) { + return m_scene_raycaster.add_raycaster(type, id, raycaster, trafo, use_back_faces); + } + void remove_raycasters_for_picking(SceneRaycaster::EType type, int id) { + m_scene_raycaster.remove_raycasters(type, id); + } + void remove_raycasters_for_picking(SceneRaycaster::EType type) { + m_scene_raycaster.remove_raycasters(type); + } + + std::vector>* get_raycasters_for_picking(SceneRaycaster::EType type) { + return m_scene_raycaster.get_raycasters(type); + } + + void set_raycaster_gizmos_on_top(bool value) { + m_scene_raycaster.set_gizmos_on_top(value); + } + + void reset_explosion_ratio() { m_explosion_ratio = 1.0; } void on_change_color_mode(bool is_dark, bool reinit = true); const bool get_dark_mode_status() { return m_is_dark; } diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index 422b6540807..dc93009cc9f 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -35,6 +35,429 @@ size_t GLModel::InitializationData::indices_count() const return ret; } + +void GLModel::Geometry::add_vertex(const Vec2f& position) +{ + assert(format.vertex_layout == EVertexLayout::P2); + vertices.emplace_back(position.x()); + vertices.emplace_back(position.y()); +} + +void GLModel::Geometry::add_vertex(const Vec2f& position, const Vec2f& tex_coord) +{ + assert(format.vertex_layout == EVertexLayout::P2T2); + vertices.emplace_back(position.x()); + vertices.emplace_back(position.y()); + vertices.emplace_back(tex_coord.x()); + vertices.emplace_back(tex_coord.y()); +} + +void GLModel::Geometry::add_vertex(const Vec3f& position) +{ + assert(format.vertex_layout == EVertexLayout::P3); + vertices.emplace_back(position.x()); + vertices.emplace_back(position.y()); + vertices.emplace_back(position.z()); +} + +void GLModel::Geometry::add_vertex(const Vec3f& position, const Vec2f& tex_coord) +{ + assert(format.vertex_layout == EVertexLayout::P3T2); + vertices.insert(vertices.end(), position.data(), position.data() + 3); + vertices.insert(vertices.end(), tex_coord.data(), tex_coord.data() + 2); +} + +void GLModel::Geometry::add_vertex(const Vec3f& position, const Vec3f& normal, const Vec2f& tex_coord) +{ + assert(format.vertex_layout == EVertexLayout::P3N3T2); + vertices.emplace_back(position.x()); + vertices.emplace_back(position.y()); + vertices.emplace_back(position.z()); + vertices.emplace_back(normal.x()); + vertices.emplace_back(normal.y()); + vertices.emplace_back(normal.z()); + vertices.emplace_back(tex_coord.x()); + vertices.emplace_back(tex_coord.y()); +} + +#if ENABLE_OPENGL_ES +void GLModel::Geometry::add_vertex(const Vec3f& position, const Vec3f& normal, const Vec3f& extra) +{ + assert(format.vertex_layout == EVertexLayout::P3N3E3); + vertices.emplace_back(position.x()); + vertices.emplace_back(position.y()); + vertices.emplace_back(position.z()); + vertices.emplace_back(normal.x()); + vertices.emplace_back(normal.y()); + vertices.emplace_back(normal.z()); + vertices.emplace_back(extra.x()); + vertices.emplace_back(extra.y()); + vertices.emplace_back(extra.z()); +} +#endif // ENABLE_OPENGL_ES + +void GLModel::Geometry::add_vertex(const Vec4f& position) +{ + assert(format.vertex_layout == EVertexLayout::P4); + vertices.emplace_back(position.x()); + vertices.emplace_back(position.y()); + vertices.emplace_back(position.z()); + vertices.emplace_back(position.w()); +} + +void GLModel::Geometry::add_index(unsigned int id) +{ + indices.emplace_back(id); +} + +void GLModel::Geometry::add_line(unsigned int id1, unsigned int id2) +{ + indices.emplace_back(id1); + indices.emplace_back(id2); +} + +Vec2f GLModel::Geometry::extract_position_2(size_t id) const +{ + const size_t p_stride = position_stride_floats(format); + if (p_stride != 2) { + assert(false); + return { FLT_MAX, FLT_MAX }; + } + + if (vertices_count() <= id) { + assert(false); + return { FLT_MAX, FLT_MAX }; + } + + const float* start = &vertices[id * vertex_stride_floats(format) + position_offset_floats(format)]; + return { *(start + 0), *(start + 1) }; +} + +Vec3f GLModel::Geometry::extract_position_3(size_t id) const +{ + const size_t p_stride = position_stride_floats(format); + if (p_stride != 3) { + assert(false); + return { FLT_MAX, FLT_MAX, FLT_MAX }; + } + + if (vertices_count() <= id) { + assert(false); + return { FLT_MAX, FLT_MAX, FLT_MAX }; + } + + const float* start = &vertices[id * vertex_stride_floats(format) + position_offset_floats(format)]; + return { *(start + 0), *(start + 1), *(start + 2) }; +} + +Vec3f GLModel::Geometry::extract_normal_3(size_t id) const +{ + const size_t n_stride = normal_stride_floats(format); + if (n_stride != 3) { + assert(false); + return { FLT_MAX, FLT_MAX, FLT_MAX }; + } + + if (vertices_count() <= id) { + assert(false); + return { FLT_MAX, FLT_MAX, FLT_MAX }; + } + + const float* start = &vertices[id * vertex_stride_floats(format) + normal_offset_floats(format)]; + return { *(start + 0), *(start + 1), *(start + 2) }; +} + +Vec2f GLModel::Geometry::extract_tex_coord_2(size_t id) const +{ + const size_t t_stride = tex_coord_stride_floats(format); + if (t_stride != 2) { + assert(false); + return { FLT_MAX, FLT_MAX }; + } + + if (vertices_count() <= id) { + assert(false); + return { FLT_MAX, FLT_MAX }; + } + + const float* start = &vertices[id * vertex_stride_floats(format) + tex_coord_offset_floats(format)]; + return { *(start + 0), *(start + 1) }; +} + +void GLModel::Geometry::set_vertex(size_t id, const Vec3f& position, const Vec3f& normal) +{ + assert(format.vertex_layout == EVertexLayout::P3N3); + assert(id < vertices_count()); + if (id < vertices_count()) { + float* start = &vertices[id * vertex_stride_floats(format)]; + *(start + 0) = position.x(); + *(start + 1) = position.y(); + *(start + 2) = position.z(); + *(start + 3) = normal.x(); + *(start + 4) = normal.y(); + *(start + 5) = normal.z(); + } +} + +void GLModel::Geometry::set_index(size_t id, unsigned int index) +{ + assert(id < indices_count()); + if (id < indices_count()) + indices[id] = index; +} + +unsigned int GLModel::Geometry::extract_index(size_t id) const +{ + if (indices_count() <= id) { + assert(false); + return -1; + } + + return indices[id]; +} + +void GLModel::Geometry::remove_vertex(size_t id) +{ + assert(id < vertices_count()); + if (id < vertices_count()) { + const size_t stride = vertex_stride_floats(format); + std::vector::const_iterator it = vertices.begin() + id * stride; + vertices.erase(it, it + stride); + } +} + +indexed_triangle_set GLModel::Geometry::get_as_indexed_triangle_set() const +{ + indexed_triangle_set its; + its.vertices.reserve(vertices_count()); + for (size_t i = 0; i < vertices_count(); ++i) { + its.vertices.emplace_back(extract_position_3(i)); + } + its.indices.reserve(indices_count() / 3); + for (size_t i = 0; i < indices_count() / 3; ++i) { + const size_t tri_id = i * 3; + its.indices.emplace_back(extract_index(tri_id), extract_index(tri_id + 1), extract_index(tri_id + 2)); + } + return its; +} + +size_t GLModel::Geometry::vertex_stride_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P2: { return 2; } + case EVertexLayout::P2T2: { return 4; } + case EVertexLayout::P3: { return 3; } + case EVertexLayout::P3T2: { return 5; } + case EVertexLayout::P3N3: { return 6; } + case EVertexLayout::P3N3T2: { return 8; } +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3E3: { return 9; } +#endif // ENABLE_OPENGL_ES + case EVertexLayout::P4: { return 4; } + default: { assert(false); return 0; } + }; +} + +size_t GLModel::Geometry::position_stride_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P2: + case EVertexLayout::P2T2: { return 2; } + case EVertexLayout::P3: + case EVertexLayout::P3T2: + case EVertexLayout::P3N3: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3T2: + case EVertexLayout::P3N3E3: { return 3; } +#else + case EVertexLayout::P3N3T2: { return 3; } +#endif // ENABLE_OPENGL_ES + case EVertexLayout::P4: { return 4; } + default: { assert(false); return 0; } + }; +} + +size_t GLModel::Geometry::position_offset_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P2: + case EVertexLayout::P2T2: + case EVertexLayout::P3: + case EVertexLayout::P3T2: + case EVertexLayout::P3N3: + case EVertexLayout::P3N3T2: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3E3: +#endif // ENABLE_OPENGL_ES + case EVertexLayout::P4: { return 0; } + default: { assert(false); return 0; } + }; +} + +size_t GLModel::Geometry::normal_stride_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P3N3: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3T2: + case EVertexLayout::P3N3E3: { return 3; } +#else + case EVertexLayout::P3N3T2: { return 3; } +#endif // ENABLE_OPENGL_ES + default: { assert(false); return 0; } + }; +} + +size_t GLModel::Geometry::normal_offset_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P3N3: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3T2: + case EVertexLayout::P3N3E3: { return 3; } +#else + case EVertexLayout::P3N3T2: { return 3; } +#endif // ENABLE_OPENGL_ES + default: { assert(false); return 0; } + }; +} + +size_t GLModel::Geometry::tex_coord_stride_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P2T2: + case EVertexLayout::P3T2: + case EVertexLayout::P3N3T2: { return 2; } + default: { assert(false); return 0; } + }; +} + +size_t GLModel::Geometry::tex_coord_offset_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P2T2: { return 2; } + case EVertexLayout::P3T2: { return 3; } + case EVertexLayout::P3N3T2: { return 6; } + default: { assert(false); return 0; } + }; +} + +#if ENABLE_OPENGL_ES +size_t GLModel::Geometry::extra_stride_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P3N3E3: { return 3; } + default: { assert(false); return 0; } + }; +} + +size_t GLModel::Geometry::extra_offset_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P3N3E3: { return 6; } + default: { assert(false); return 0; } + }; +} +#endif // ENABLE_OPENGL_ES + +size_t GLModel::Geometry::index_stride_bytes(const Geometry& data) +{ + switch (data.index_type) + { + case EIndexType::UINT: { return sizeof(unsigned int); } + case EIndexType::USHORT: { return sizeof(unsigned short); } + case EIndexType::UBYTE: { return sizeof(unsigned char); } + default: { assert(false); return 0; } + }; +} + +bool GLModel::Geometry::has_position(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P2: + case EVertexLayout::P2T2: + case EVertexLayout::P3: + case EVertexLayout::P3T2: + case EVertexLayout::P3N3: + case EVertexLayout::P3N3T2: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3E3: +#endif // ENABLE_OPENGL_ES + case EVertexLayout::P4: { return true; } + default: { assert(false); return false; } + }; +} + +bool GLModel::Geometry::has_normal(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P2: + case EVertexLayout::P2T2: + case EVertexLayout::P3: + case EVertexLayout::P3T2: + case EVertexLayout::P4: { return false; } + case EVertexLayout::P3N3: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3T2: + case EVertexLayout::P3N3E3: { return true; } +#else + case EVertexLayout::P3N3T2: { return true; } +#endif // ENABLE_OPENGL_ES + default: { assert(false); return false; } + }; +} + +bool GLModel::Geometry::has_tex_coord(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P2T2: + case EVertexLayout::P3T2: + case EVertexLayout::P3N3T2: { return true; } + case EVertexLayout::P2: + case EVertexLayout::P3: + case EVertexLayout::P3N3: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3E3: +#endif // ENABLE_OPENGL_ES + case EVertexLayout::P4: { return false; } + default: { assert(false); return false; } + }; +} + +#if ENABLE_OPENGL_ES +bool GLModel::Geometry::has_extra(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P3N3E3: { return true; } + case EVertexLayout::P2: + case EVertexLayout::P2T2: + case EVertexLayout::P3: + case EVertexLayout::P3T2: + case EVertexLayout::P3N3: + case EVertexLayout::P3N3T2: + case EVertexLayout::P4: { return false; } + default: { assert(false); return false; } + }; +} +#endif // ENABLE_OPENGL_ES + +#if ENABLE_GLMODEL_STATISTICS +GLModel::Statistics GLModel::s_statistics; +#endif // ENABLE_GLMODEL_STATISTICS + void GLModel::init_from(const InitializationData& data) { if (!m_render_data.empty()) // call reset() if you want to reuse this model @@ -74,6 +497,11 @@ void GLModel::init_from(const InitializationData& data) } } +void GLModel::init_from(Geometry& data) +{ + init_from(data.get_as_indexed_triangle_set()); +} + void GLModel::init_from(const indexed_triangle_set& its, const BoundingBoxf3 &bbox) { if (!m_render_data.empty()) // call reset() if you want to reuse this model @@ -744,5 +1172,191 @@ GLModel::InitializationData diamond(int resolution) return data; } + +GLModel::Geometry smooth_sphere(unsigned int resolution, float radius) +{ + resolution = std::max(4, resolution); + + const unsigned int sectorCount = resolution; + const unsigned int stackCount = resolution; + + const float sectorStep = float(2.0 * M_PI / sectorCount); + const float stackStep = float(M_PI / stackCount); + + GLModel::Geometry data; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices((stackCount - 1) * sectorCount + 2); + data.reserve_indices((2 * (stackCount - 1) * sectorCount) * 3); + + // vertices + for (unsigned int i = 0; i <= stackCount; ++i) { + // from pi/2 to -pi/2 + const double stackAngle = 0.5 * M_PI - stackStep * i; + const double xy = double(radius) * ::cos(stackAngle); + const double z = double(radius) * ::sin(stackAngle); + if (i == 0 || i == stackCount) { + const Vec3f v(float(xy), 0.0f, float(z)); + data.add_vertex(v, (Vec3f)v.normalized()); + } + else { + for (unsigned int j = 0; j < sectorCount; ++j) { + // from 0 to 2pi + const double sectorAngle = sectorStep * j; + const Vec3f v(float(xy * std::cos(sectorAngle)), float(xy * std::sin(sectorAngle)), float(z)); + data.add_vertex(v, (Vec3f)v.normalized()); + } + } + } + + // triangles + for (unsigned int i = 0; i < stackCount; ++i) { + // Beginning of current stack. + unsigned int k1 = (i == 0) ? 0 : (1 + (i - 1) * sectorCount); + const unsigned int k1_first = k1; + // Beginning of next stack. + unsigned int k2 = (i == 0) ? 1 : (k1 + sectorCount); + const unsigned int k2_first = k2; + for (unsigned int j = 0; j < sectorCount; ++j) { + // 2 triangles per sector excluding first and last stacks + unsigned int k1_next = k1; + unsigned int k2_next = k2; + if (i != 0) { + k1_next = (j + 1 == sectorCount) ? k1_first : (k1 + 1); + data.add_triangle(k1, k2, k1_next); + } + if (i + 1 != stackCount) { + k2_next = (j + 1 == sectorCount) ? k2_first : (k2 + 1); + data.add_triangle(k1_next, k2, k2_next); + } + k1 = k1_next; + k2 = k2_next; + } + } + + return data; +} + +GLModel::Geometry smooth_cylinder(unsigned int resolution, float radius, float height) +{ + resolution = std::max(4, resolution); + + const unsigned int sectorCount = resolution; + const float sectorStep = 2.0f * float(M_PI) / float(sectorCount); + + GLModel::Geometry data; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices(sectorCount * 4 + 2); + data.reserve_indices(sectorCount * 4 * 3); + + auto generate_vertices_on_circle = [sectorCount, sectorStep](float radius) { + std::vector ret; + ret.reserve(sectorCount); + for (unsigned int i = 0; i < sectorCount; ++i) { + // from 0 to 2pi + const float sectorAngle = sectorStep * i; + ret.emplace_back(radius * std::cos(sectorAngle), radius * std::sin(sectorAngle), 0.0f); + } + return ret; + }; + + const std::vector base_vertices = generate_vertices_on_circle(radius); + const Vec3f h = height * Vec3f::UnitZ(); + + // stem vertices + for (unsigned int i = 0; i < sectorCount; ++i) { + const Vec3f& v = base_vertices[i]; + const Vec3f n = v.normalized(); + data.add_vertex(v, n); + data.add_vertex(v + h, n); + } + + // stem triangles + for (unsigned int i = 0; i < sectorCount; ++i) { + unsigned int v1 = i * 2; + unsigned int v2 = (i < sectorCount - 1) ? v1 + 2 : 0; + unsigned int v3 = v2 + 1; + unsigned int v4 = v1 + 1; + data.add_triangle(v1, v2, v3); + data.add_triangle(v1, v3, v4); + } + + // bottom cap vertices + Vec3f cap_center = Vec3f::Zero(); + unsigned int cap_center_id = data.vertices_count(); + Vec3f normal = -Vec3f::UnitZ(); + + data.add_vertex(cap_center, normal); + for (unsigned int i = 0; i < sectorCount; ++i) { + data.add_vertex(base_vertices[i], normal); + } + + // bottom cap triangles + for (unsigned int i = 0; i < sectorCount; ++i) { + data.add_triangle(cap_center_id, (i < sectorCount - 1) ? cap_center_id + i + 2 : cap_center_id + 1, cap_center_id + i + 1); + } + + // top cap vertices + cap_center += h; + cap_center_id = data.vertices_count(); + normal = -normal; + + data.add_vertex(cap_center, normal); + for (unsigned int i = 0; i < sectorCount; ++i) { + data.add_vertex(base_vertices[i] + h, normal); + } + + // top cap triangles + for (unsigned int i = 0; i < sectorCount; ++i) { + data.add_triangle(cap_center_id, cap_center_id + i + 1, (i < sectorCount - 1) ? cap_center_id + i + 2 : cap_center_id + 1); + } + + return data; +} + +GLModel::Geometry smooth_torus(unsigned int primary_resolution, unsigned int secondary_resolution, float radius, float thickness) +{ + const unsigned int torus_sector_count = std::max(4, primary_resolution); + const float torus_sector_step = 2.0f * float(M_PI) / float(torus_sector_count); + const unsigned int section_sector_count = std::max(4, secondary_resolution); + const float section_sector_step = 2.0f * float(M_PI) / float(section_sector_count); + + GLModel::Geometry data; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices(torus_sector_count * section_sector_count); + data.reserve_indices(torus_sector_count * section_sector_count * 2 * 3); + + // vertices + for (unsigned int i = 0; i < torus_sector_count; ++i) { + const float section_angle = torus_sector_step * i; + const float csa = std::cos(section_angle); + const float ssa = std::sin(section_angle); + const Vec3f section_center(radius * csa, radius * ssa, 0.0f); + for (unsigned int j = 0; j < section_sector_count; ++j) { + const float circle_angle = section_sector_step * j; + const float thickness_xy = thickness * std::cos(circle_angle); + const float thickness_z = thickness * std::sin(circle_angle); + const Vec3f v(thickness_xy * csa, thickness_xy * ssa, thickness_z); + data.add_vertex(section_center + v, (Vec3f)v.normalized()); + } + } + + // triangles + for (unsigned int i = 0; i < torus_sector_count; ++i) { + const unsigned int ii = i * section_sector_count; + const unsigned int ii_next = ((i + 1) % torus_sector_count) * section_sector_count; + for (unsigned int j = 0; j < section_sector_count; ++j) { + const unsigned int j_next = (j + 1) % section_sector_count; + const unsigned int i0 = ii + j; + const unsigned int i1 = ii_next + j; + const unsigned int i2 = ii_next + j_next; + const unsigned int i3 = ii + j_next; + data.add_triangle(i0, i1, i2); + data.add_triangle(i0, i2, i3); + } + } + + return data; +} + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/GLModel.hpp b/src/slic3r/GUI/GLModel.hpp index d47c56fd93c..1e218df1463 100644 --- a/src/slic3r/GUI/GLModel.hpp +++ b/src/slic3r/GUI/GLModel.hpp @@ -3,6 +3,8 @@ #include "libslic3r/Point.hpp" #include "libslic3r/BoundingBox.hpp" +#include "libslic3r/Color.hpp" +#include "libslic3r/Utils.hpp" #include #include @@ -27,6 +29,139 @@ namespace GUI { LineLoop }; + struct Geometry + { + enum class EPrimitiveType : unsigned char + { + Points, + Triangles, + TriangleStrip, + TriangleFan, + Lines, + LineStrip, + LineLoop + }; + + enum class EVertexLayout : unsigned char + { + P2, // position 2 floats + P2T2, // position 2 floats + texture coords 2 floats + P3, // position 3 floats + P3T2, // position 3 floats + texture coords 2 floats + P3N3, // position 3 floats + normal 3 floats + P3N3T2, // position 3 floats + normal 3 floats + texture coords 2 floats +#if ENABLE_OPENGL_ES + P3N3E3, // position 3 floats + normal 3 floats + extra 3 floats +#endif // ENABLE_OPENGL_ES + P4, // position 4 floats + }; + + enum class EIndexType : unsigned char + { + UINT, // unsigned int + USHORT, // unsigned short + UBYTE // unsigned byte + }; + + struct Format + { + EPrimitiveType type{ EPrimitiveType::Triangles }; + EVertexLayout vertex_layout{ EVertexLayout::P3N3 }; + }; + + Format format; + std::vector vertices; + std::vector indices; + EIndexType index_type{ EIndexType::UINT }; + ColorRGBA color{ ColorRGBA::BLACK() }; + + void reserve_vertices(size_t vertices_count) { vertices.reserve(vertices_count * vertex_stride_floats(format)); } + void reserve_more_vertices(size_t vertices_count) { vertices.reserve(next_highest_power_of_2(vertices.size() + vertices_count * vertex_stride_floats(format))); } + void reserve_indices(size_t indices_count) { indices.reserve(indices_count); } + void reserve_more_indices(size_t indices_count) { indices.reserve(next_highest_power_of_2(indices.size() + indices_count)); } + + void add_vertex(const Vec2f& position); // EVertexLayout::P2 + void add_vertex(const Vec2f& position, const Vec2f& tex_coord); // EVertexLayout::P2T2 + void add_vertex(const Vec3f& position); // EVertexLayout::P3 + void add_vertex(const Vec3f& position, const Vec2f& tex_coord); // EVertexLayout::P3T2 + void add_vertex(const Vec3f& position, const Vec3f& normal) { // EVertexLayout::P3N3 + assert(format.vertex_layout == EVertexLayout::P3N3); + vertices.insert(vertices.end(), position.data(), position.data() + 3); + vertices.insert(vertices.end(), normal.data(), normal.data() + 3); + } + void add_vertex(const Vec3f& position, const Vec3f& normal, const Vec2f& tex_coord); // EVertexLayout::P3N3T2 +#if ENABLE_OPENGL_ES + void add_vertex(const Vec3f& position, const Vec3f& normal, const Vec3f& extra); // EVertexLayout::P3N3E3 +#endif // ENABLE_OPENGL_ES + void add_vertex(const Vec4f& position); // EVertexLayout::P4 + + void set_vertex(size_t id, const Vec3f& position, const Vec3f& normal); // EVertexLayout::P3N3 + + void set_index(size_t id, unsigned int index); + + void add_index(unsigned int id); + void add_line(unsigned int id1, unsigned int id2); + void add_triangle(unsigned int id1, unsigned int id2, unsigned int id3){ + indices.emplace_back(id1); + indices.emplace_back(id2); + indices.emplace_back(id3); + } + + Vec2f extract_position_2(size_t id) const; + Vec3f extract_position_3(size_t id) const; + Vec3f extract_normal_3(size_t id) const; + Vec2f extract_tex_coord_2(size_t id) const; + + unsigned int extract_index(size_t id) const; + + void remove_vertex(size_t id); + + bool is_empty() const { return vertices_count() == 0 || indices_count() == 0; } + + size_t vertices_count() const { return vertices.size() / vertex_stride_floats(format); } + size_t indices_count() const { return indices.size(); } + + size_t vertices_size_floats() const { return vertices.size(); } + size_t vertices_size_bytes() const { return vertices_size_floats() * sizeof(float); } + size_t indices_size_bytes() const { return indices.size() * index_stride_bytes(*this); } + + indexed_triangle_set get_as_indexed_triangle_set() const; + + static size_t vertex_stride_floats(const Format& format); + static size_t vertex_stride_bytes(const Format& format) { return vertex_stride_floats(format) * sizeof(float); } + + static size_t position_stride_floats(const Format& format); + static size_t position_stride_bytes(const Format& format) { return position_stride_floats(format) * sizeof(float); } + static size_t position_offset_floats(const Format& format); + static size_t position_offset_bytes(const Format& format) { return position_offset_floats(format) * sizeof(float); } + + static size_t normal_stride_floats(const Format& format); + static size_t normal_stride_bytes(const Format& format) { return normal_stride_floats(format) * sizeof(float); } + static size_t normal_offset_floats(const Format& format); + static size_t normal_offset_bytes(const Format& format) { return normal_offset_floats(format) * sizeof(float); } + + static size_t tex_coord_stride_floats(const Format& format); + static size_t tex_coord_stride_bytes(const Format& format) { return tex_coord_stride_floats(format) * sizeof(float); } + static size_t tex_coord_offset_floats(const Format& format); + static size_t tex_coord_offset_bytes(const Format& format) { return tex_coord_offset_floats(format) * sizeof(float); } + +#if ENABLE_OPENGL_ES + static size_t extra_stride_floats(const Format& format); + static size_t extra_stride_bytes(const Format& format) { return extra_stride_floats(format) * sizeof(float); } + static size_t extra_offset_floats(const Format& format); + static size_t extra_offset_bytes(const Format& format) { return extra_offset_floats(format) * sizeof(float); } +#endif // ENABLE_OPENGL_ES + + static size_t index_stride_bytes(const Geometry& data); + + static bool has_position(const Format& format); + static bool has_normal(const Format& format); + static bool has_tex_coord(const Format& format); +#if ENABLE_OPENGL_ES + static bool has_extra(const Format& format); +#endif // ENABLE_OPENGL_ES + }; + struct RenderData { PrimitiveType type; @@ -69,12 +204,14 @@ namespace GUI { void init_from(const InitializationData& data); void init_from(const indexed_triangle_set& its, const BoundingBoxf3& bbox); + void init_from(Geometry& data); void init_from(const indexed_triangle_set& its); void init_from(const Polygons& polygons, float z); bool init_from_file(const std::string& filename); // if entity_id == -1 set the color of all entities void set_color(int entity_id, const std::array& color); + void set_color(const ColorRGBA& color) { set_color(-1, color.data_array()); } void reset(); void render() const; @@ -112,6 +249,18 @@ namespace GUI { // the diamond is contained into a box with size [1, 1, 1] GLModel::InitializationData diamond(int resolution); + // create a sphere with smooth normals + // the origin of the sphere is in its center + GLModel::Geometry smooth_sphere(unsigned int resolution, float radius); + // create a cylinder with smooth normals + // the axis of the cylinder is the Z axis + // the origin of the cylinder is the center of its bottom cap face + GLModel::Geometry smooth_cylinder(unsigned int resolution, float radius, float height); + // create a torus with smooth normals + // the axis of the torus is the Z axis + // the origin of the torus is in its center + GLModel::Geometry smooth_torus(unsigned int primary_resolution, unsigned int secondary_resolution, float radius, float thickness); + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/GLShader.cpp b/src/slic3r/GUI/GLShader.cpp index 9c1e936525e..4bd2264ab73 100644 --- a/src/slic3r/GUI/GLShader.cpp +++ b/src/slic3r/GUI/GLShader.cpp @@ -206,6 +206,140 @@ void GLShaderProgram::stop_using() const glsafe(::glUseProgram(0)); } + +void GLShaderProgram::set_uniform(int id, int value) const +{ + if (id >= 0) + glsafe(::glUniform1i(id, value)); +} + +void GLShaderProgram::set_uniform(int id, bool value) const +{ + set_uniform(id, value ? 1 : 0); +} + +void GLShaderProgram::set_uniform(int id, float value) const +{ + if (id >= 0) + glsafe(::glUniform1f(id, value)); +} + +void GLShaderProgram::set_uniform(int id, double value) const +{ + set_uniform(id, static_cast(value)); +} + +void GLShaderProgram::set_uniform(int id, const std::array& value) const +{ + if (id >= 0) + glsafe(::glUniform2iv(id, 1, static_cast(value.data()))); +} + +void GLShaderProgram::set_uniform(int id, const std::array& value) const +{ + if (id >= 0) + glsafe(::glUniform3iv(id, 1, static_cast(value.data()))); +} + +void GLShaderProgram::set_uniform(int id, const std::array& value) const +{ + if (id >= 0) + glsafe(::glUniform4iv(id, 1, static_cast(value.data()))); +} + +void GLShaderProgram::set_uniform(int id, const std::array& value) const +{ + if (id >= 0) + glsafe(::glUniform2fv(id, 1, static_cast(value.data()))); +} + +void GLShaderProgram::set_uniform(int id, const std::array& value) const +{ + if (id >= 0) + glsafe(::glUniform3fv(id, 1, static_cast(value.data()))); +} + +void GLShaderProgram::set_uniform(int id, const std::array& value) const +{ + if (id >= 0) + glsafe(::glUniform4fv(id, 1, static_cast(value.data()))); +} + +void GLShaderProgram::set_uniform(int id, const std::array& value) const +{ + const std::array f_value = { float(value[0]), float(value[1]), float(value[2]), float(value[3]) }; + set_uniform(id, f_value); +} + +void GLShaderProgram::set_uniform(int id, const float* value, size_t size) const +{ + if (id >= 0) { + if (size == 1) + set_uniform(id, value[0]); + else if (size == 2) + glsafe(::glUniform2fv(id, 1, static_cast(value))); + else if (size == 3) + glsafe(::glUniform3fv(id, 1, static_cast(value))); + else if (size == 4) + glsafe(::glUniform4fv(id, 1, static_cast(value))); + } +} + +void GLShaderProgram::set_uniform(int id, const Transform3f& value) const +{ + if (id >= 0) + glsafe(::glUniformMatrix4fv(id, 1, GL_FALSE, static_cast(value.matrix().data()))); +} + +void GLShaderProgram::set_uniform(int id, const Transform3d& value) const +{ + set_uniform(id, value.cast()); +} + +void GLShaderProgram::set_uniform(int id, const Matrix3f& value) const +{ + if (id >= 0) + glsafe(::glUniformMatrix3fv(id, 1, GL_FALSE, static_cast(value.data()))); +} + +void GLShaderProgram::set_uniform(int id, const Matrix3d& value) const +{ + set_uniform(id, (Matrix3f)value.cast()); +} + +void GLShaderProgram::set_uniform(int id, const Matrix4f& value) const +{ + if (id >= 0) + glsafe(::glUniformMatrix4fv(id, 1, GL_FALSE, static_cast(value.data()))); +} + +void GLShaderProgram::set_uniform(int id, const Matrix4d& value) const +{ + set_uniform(id, (Matrix4f)value.cast()); +} + +void GLShaderProgram::set_uniform(int id, const Vec2f& value) const +{ + if (id >= 0) + glsafe(::glUniform2fv(id, 1, static_cast(value.data()))); +} + +void GLShaderProgram::set_uniform(int id, const Vec2d& value) const +{ + set_uniform(id, static_cast(value.cast())); +} + +void GLShaderProgram::set_uniform(int id, const Vec3f& value) const +{ + if (id >= 0) + glsafe(::glUniform3fv(id, 1, static_cast(value.data()))); +} + +void GLShaderProgram::set_uniform(int id, const Vec3d& value) const +{ + set_uniform(id, static_cast(value.cast())); +} + bool GLShaderProgram::set_uniform(const char* name, int value) const { int id = get_uniform_location(name); @@ -340,6 +474,9 @@ bool GLShaderProgram::set_uniform(const char* name, const Matrix3f& value) const } return false; } +void GLShaderProgram::set_uniform(const char *name, const Matrix3d &value) const { + set_uniform(get_uniform_location(name), value); +} bool GLShaderProgram::set_uniform(const char* name, const Vec3f& value) const { diff --git a/src/slic3r/GUI/GLShader.hpp b/src/slic3r/GUI/GLShader.hpp index d7b92000dfc..8e26fd8050c 100644 --- a/src/slic3r/GUI/GLShader.hpp +++ b/src/slic3r/GUI/GLShader.hpp @@ -58,9 +58,35 @@ class GLShaderProgram bool set_uniform(const char* name, const Transform3f& value) const; bool set_uniform(const char* name, const Transform3d& value) const; bool set_uniform(const char* name, const Matrix3f& value) const; + void set_uniform(const char* name, const Matrix3d& value) const; bool set_uniform(const char* name, const Vec3f& value) const; bool set_uniform(const char* name, const Vec3d& value) const; + void set_uniform(int id, int value) const; + void set_uniform(int id, bool value) const; + void set_uniform(int id, float value) const; + void set_uniform(int id, double value) const; + void set_uniform(int id, const std::array& value) const; + void set_uniform(int id, const std::array& value) const; + void set_uniform(int id, const std::array& value) const; + void set_uniform(int id, const std::array& value) const; + void set_uniform(int id, const std::array& value) const; + void set_uniform(int id, const std::array& value) const; + void set_uniform(int id, const std::array& value) const; + void set_uniform(int id, const float* value, size_t size) const; + void set_uniform(int id, const Transform3f& value) const; + void set_uniform(int id, const Transform3d& value) const; + void set_uniform(int id, const Matrix3f& value) const; + void set_uniform(int id, const Matrix3d& value) const; + void set_uniform(int id, const Matrix4f& value) const; + void set_uniform(int id, const Matrix4d& value) const; + void set_uniform(int id, const Vec2f& value) const; + void set_uniform(int id, const Vec2d& value) const; + void set_uniform(int id, const Vec3f& value) const; + void set_uniform(int id, const Vec3d& value) const; + // void set_uniform(int id, const ColorRGB& value) const; + // void set_uniform(int id, const ColorRGBA& value) const; + // returns -1 if not found int get_attrib_location(const char* name) const; // returns -1 if not found diff --git a/src/slic3r/GUI/GUI_Geometry.cpp b/src/slic3r/GUI/GUI_Geometry.cpp new file mode 100644 index 00000000000..b0ed0e04fc5 --- /dev/null +++ b/src/slic3r/GUI/GUI_Geometry.cpp @@ -0,0 +1,9 @@ +#include "libslic3r/libslic3r.h" +#include "GUI_Geometry.hpp" + +namespace Slic3r { +namespace GUI { + + +} // namespace Slic3r +} // namespace GUI diff --git a/src/slic3r/GUI/GUI_Geometry.hpp b/src/slic3r/GUI/GUI_Geometry.hpp new file mode 100644 index 00000000000..b18e4ae5a53 --- /dev/null +++ b/src/slic3r/GUI/GUI_Geometry.hpp @@ -0,0 +1,78 @@ +#ifndef slic3r_GUI_Geometry_hpp_ +#define slic3r_GUI_Geometry_hpp_ + +namespace Slic3r { +namespace GUI { + +enum class ECoordinatesType : unsigned char +{ + World, + Instance, + Local +}; + +class TransformationType +{ +public: + enum Enum { + // Transforming in a world coordinate system + World = 0, + // Transforming in a instance coordinate system + Instance = 1, + // Transforming in a local coordinate system + Local = 2, + // Absolute transformations, allowed in local coordinate system only. + Absolute = 0, + // Relative transformations, allowed in both local and world coordinate system. + Relative = 4, + // For group selection, the transformation is performed as if the group made a single solid body. + Joint = 0, + // For group selection, the transformation is performed on each object independently. + Independent = 8, + + World_Relative_Joint = World | Relative | Joint, + World_Relative_Independent = World | Relative | Independent, + Instance_Absolute_Joint = Instance | Absolute | Joint, + Instance_Absolute_Independent = Instance | Absolute | Independent, + Instance_Relative_Joint = Instance | Relative | Joint, + Instance_Relative_Independent = Instance | Relative | Independent, + Local_Absolute_Joint = Local | Absolute | Joint, + Local_Absolute_Independent = Local | Absolute | Independent, + Local_Relative_Joint = Local | Relative | Joint, + Local_Relative_Independent = Local | Relative | Independent, + }; + + TransformationType() : m_value(World) {} + TransformationType(Enum value) : m_value(value) {} + TransformationType& operator=(Enum value) { m_value = value; return *this; } + + Enum operator()() const { return m_value; } + bool has(Enum v) const { return ((unsigned int)m_value & (unsigned int)v) != 0; } + + void set_world() { this->remove(Instance); this->remove(Local); } + void set_instance() { this->remove(Local); this->add(Instance); } + void set_local() { this->remove(Instance); this->add(Local); } + void set_absolute() { this->remove(Relative); } + void set_relative() { this->add(Relative); } + void set_joint() { this->remove(Independent); } + void set_independent() { this->add(Independent); } + + bool world() const { return !this->has(Instance) && !this->has(Local); } + bool instance() const { return this->has(Instance); } + bool local() const { return this->has(Local); } + bool absolute() const { return !this->has(Relative); } + bool relative() const { return this->has(Relative); } + bool joint() const { return !this->has(Independent); } + bool independent() const { return this->has(Independent); } + +private: + void add(Enum v) { m_value = Enum((unsigned int)m_value | (unsigned int)v); } + void remove(Enum v) { m_value = Enum((unsigned int)m_value & (~(unsigned int)v)); } + + Enum m_value; +}; + +} // namespace Slic3r +} // namespace GUI + +#endif // slic3r_GUI_Geometry_hpp_ diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp new file mode 100644 index 00000000000..0cc6416a84c --- /dev/null +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -0,0 +1,1300 @@ +#include "GUI_ObjectManipulation.hpp" +#include "I18N.hpp" +#include "format.hpp" +#include "BitmapComboBox.hpp" + +#include "GLCanvas3D.hpp" +#include "OptionsGroup.hpp" +#include "GUI_App.hpp" +#include "wxExtensions.hpp" +#include "libslic3r/PresetBundle.hpp" +#include "libslic3r/Model.hpp" +#include "libslic3r/Geometry.hpp" +#include "Selection.hpp" +#include "Plater.hpp" +#include "MainFrame.hpp" +#include "MsgDialog.hpp" + +#include + +#include +#include "slic3r/Utils/FixModelByWin10.hpp" + +namespace Slic3r +{ +namespace GUI +{ + +const double ObjectManipulation::in_to_mm = 25.4; +const double ObjectManipulation::mm_to_in = 1 / ObjectManipulation::in_to_mm; + +// Helper function to be used by drop to bed button. Returns lowest point of this +// volume in world coordinate system. +static double get_volume_min_z(const GLVolume& volume) +{ + return volume.transformed_convex_hull_bounding_box().min.z(); +} + +static choice_ctrl* create_word_local_combo(wxWindow *parent) +{ + wxSize size(15 * wxGetApp().em_unit(), -1); + + choice_ctrl* temp = nullptr; +#ifdef __WXOSX__ + /* wxBitmapComboBox with wxCB_READONLY style return NULL for GetTextCtrl(), + * so ToolTip doesn't shown. + * Next workaround helps to solve this problem + */ + temp = new wxBitmapComboBox(); + temp->SetTextCtrlStyle(wxTE_READONLY); + temp->Create(parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr); +#else + temp = new choice_ctrl(parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr, wxCB_READONLY | wxBORDER_SIMPLE); +#endif //__WXOSX__ + + temp->SetFont(Slic3r::GUI::wxGetApp().normal_font()); + if (!wxOSX) temp->SetBackgroundStyle(wxBG_STYLE_PAINT); + + temp->Append(ObjectManipulation::coordinate_type_str(ECoordinatesType::World)); + temp->Append(ObjectManipulation::coordinate_type_str(ECoordinatesType::Instance)); + temp->Append(ObjectManipulation::coordinate_type_str(ECoordinatesType::Local)); + temp->Select((int)ECoordinatesType::World); + + temp->SetToolTip(_L("Select coordinate space, in which the transformation will be performed.")); + return temp; +} + +void msw_rescale_word_local_combo(choice_ctrl* combo) +{ +#ifdef __WXOSX__ + const wxString selection = combo->GetString(combo->GetSelection()); + + /* To correct scaling (set new controll size) of a wxBitmapCombobox + * we need to refill control with new bitmaps. So, in our case : + * 1. clear control + * 2. add content + * 3. add scaled "empty" bitmap to the at least one item + */ + combo->Clear(); + wxSize size(wxDefaultSize); + size.SetWidth(15 * wxGetApp().em_unit()); + + // Set rescaled min height to correct layout + combo->SetMinSize(wxSize(-1, int(1.5f*combo->GetFont().GetPixelSize().y + 0.5f))); + // Set rescaled size + combo->SetSize(size); + + combo->Append(ObjectManipulation::coordinate_type_str(ECoordinatesType::World)); + combo->Append(ObjectManipulation::coordinate_type_str(ECoordinatesType::Instance)); + combo->Append(ObjectManipulation::coordinate_type_str(ECoordinatesType::Local)); + + combo->SetValue(selection); +#else +#ifdef _WIN32 + combo->Rescale(); +#endif + combo->SetMinSize(wxSize(15 * wxGetApp().em_unit(), -1)); +#endif +} + +static void set_font_and_background_style(wxWindow* win, const wxFont& font) +{ + win->SetFont(font); + win->SetBackgroundStyle(wxBG_STYLE_PAINT); +} + +static const wxString axes_color_text[] = { "#990000", "#009900", "#000099" }; +static const wxString axes_color_back[] = { "#f5dcdc", "#dcf5dc", "#dcdcf5" }; + +ObjectManipulation::ObjectManipulation(wxWindow* parent) : + OG_Settings(parent, true) +{ + m_imperial_units = wxGetApp().app_config->get("use_inches") == "1"; + m_use_colors = wxGetApp().app_config->get("color_mapinulation_panel") == "1"; + + m_manifold_warning_bmp = ScalableBitmap(parent, "exclamation"); + + // Load bitmaps to be used for the mirroring buttons: + m_mirror_bitmap_on = ScalableBitmap(parent, "mirroring_on"); + + const int border = wxOSX ? 0 : 4; + const int em = wxGetApp().em_unit(); + m_main_grid_sizer = new wxFlexGridSizer(2, 3, 3); // "Name/label", "String name / Editors" + m_main_grid_sizer->SetFlexibleDirection(wxBOTH); + + // Add "Name" label with warning icon + auto sizer = new wxBoxSizer(wxHORIZONTAL); + + m_fix_throught_netfab_bitmap = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap); + if (is_windows10()) + m_fix_throught_netfab_bitmap->Bind(wxEVT_CONTEXT_MENU, [this](wxCommandEvent& e) + { + // if object/sub-object has no errors + if (m_fix_throught_netfab_bitmap->GetBitmap().GetRefData() == wxNullBitmap.GetRefData()) + return; + + wxGetApp().obj_list()->fix_through_netfabb(); + update_warning_icon_state(wxGetApp().obj_list()->get_mesh_errors_info()); + }); + + sizer->Add(m_fix_throught_netfab_bitmap); + + auto name_label = new wxStaticText(m_parent, wxID_ANY, _L("Name")+":"); + set_font_and_background_style(name_label, wxGetApp().normal_font()); + name_label->SetToolTip(_L("Object name")); + sizer->Add(name_label); + + m_main_grid_sizer->Add(sizer); + + // Add name of the item + const wxSize name_size = wxSize(20 * em, wxDefaultCoord); + m_item_name = new wxStaticText(m_parent, wxID_ANY, "", wxDefaultPosition, name_size, wxST_ELLIPSIZE_MIDDLE); + set_font_and_background_style(m_item_name, wxGetApp().bold_font()); + + m_main_grid_sizer->Add(m_item_name, 0, wxEXPAND); + + // Add labels grid sizer + m_labels_grid_sizer = new wxFlexGridSizer(1, 3, 3); // "Name/label", "String name / Editors" + m_labels_grid_sizer->SetFlexibleDirection(wxBOTH); + + // Add world local combobox + m_word_local_combo = create_word_local_combo(parent); + m_word_local_combo->Bind(wxEVT_COMBOBOX, ([this](wxCommandEvent& evt) { this->set_coordinates_type(evt.GetString()); }), m_word_local_combo->GetId()); + + // Small trick to correct layouting in different view_mode : + // Show empty string of a same height as a m_word_local_combo, when m_word_local_combo is hidden + m_word_local_combo_sizer = new wxBoxSizer(wxHORIZONTAL); + m_empty_str = new wxStaticText(parent, wxID_ANY, ""); + m_word_local_combo_sizer->Add(m_word_local_combo); + m_word_local_combo_sizer->Add(m_empty_str); + m_word_local_combo_sizer->SetMinSize(wxSize(-1, m_word_local_combo->GetBestHeight(-1))); + m_labels_grid_sizer->Add(m_word_local_combo_sizer); + + // Text trick to grid sizer layout: + // Height of labels should be equivalent to the edit boxes + int height = wxTextCtrl(parent, wxID_ANY, "Br").GetBestHeight(-1); +#ifdef __WXGTK__ + // On Linux button with bitmap has bigger height then regular button or regular TextCtrl + // It can cause a wrong alignment on show/hide of a reset buttons + const int bmp_btn_height = ScalableButton(parent, wxID_ANY, "undo") .GetBestHeight(-1); + if (bmp_btn_height > height) + height = bmp_btn_height; +#endif //__WXGTK__ + + auto add_label = [this, height](wxStaticText** label, const std::string& name, wxSizer* reciver = nullptr) + { + *label = new wxStaticText(m_parent, wxID_ANY, _(name) + ":"); + set_font_and_background_style(*label, wxGetApp().normal_font()); + + wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->SetMinSize(wxSize(-1, height)); + sizer->Add(*label, 0, wxALIGN_CENTER_VERTICAL); + + if (reciver) + reciver->Add(sizer); + else + m_labels_grid_sizer->Add(sizer); + + m_rescalable_sizers.push_back(sizer); + }; + + // Add labels + add_label(&m_move_Label, L("Position")); + add_label(&m_rotate_Label, L("Rotation")); + + // additional sizer for lock and labels "Scale" & "Size" + sizer = new wxBoxSizer(wxHORIZONTAL); + + m_lock_bnt = new LockButton(parent, wxID_ANY); + m_lock_bnt->Bind(wxEVT_BUTTON, [this](wxCommandEvent& event) { + event.Skip(); + wxTheApp->CallAfter([this]() { set_uniform_scaling(m_lock_bnt->IsLocked()); }); + }); + sizer->Add(m_lock_bnt, 0, wxALIGN_CENTER_VERTICAL); + + auto v_sizer = new wxGridSizer(1, 3, 3); + + add_label(&m_scale_Label, L("Scale"), v_sizer); + wxStaticText* size_Label {nullptr}; + add_label(&size_Label, L("Size [World]"), v_sizer); + if (wxOSX) set_font_and_background_style(size_Label, wxGetApp().normal_font()); + + sizer->Add(v_sizer, 0, wxLEFT, border); + m_labels_grid_sizer->Add(sizer); + m_main_grid_sizer->Add(m_labels_grid_sizer, 0, wxEXPAND); + + + // Add editors grid sizer + wxFlexGridSizer* editors_grid_sizer = new wxFlexGridSizer(5, 3, 3); // "Name/label", "String name / Editors" + editors_grid_sizer->SetFlexibleDirection(wxBOTH); + + // Add Axes labels with icons + static const char axes[] = { 'X', 'Y', 'Z' }; +// std::vector axes_color = {"#EE0000", "#00EE00", "#0000EE"}; + for (size_t axis_idx = 0; axis_idx < sizeof(axes); axis_idx++) { + const char label = axes[axis_idx]; + + wxStaticText* axis_name = new wxStaticText(m_parent, wxID_ANY, wxString(label)); + set_font_and_background_style(axis_name, wxGetApp().bold_font()); + //if (m_use_colors) + // axis_name->SetForegroundColour(wxColour(axes_color_text[axis_idx])); + + sizer = new wxBoxSizer(wxHORIZONTAL); + // Under OSX or Linux with GTK3 we use font, smaller than default font, so + // there is a next trick for an equivalent layout of coordinates combobox and axes labels in they own sizers + // if (wxOSX || wxGTK3) + sizer->SetMinSize(-1, m_word_local_combo->GetBestHeight(-1)); + sizer->Add(axis_name, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, border); + + // We will add a button to toggle mirroring to each axis: + auto btn = new ScalableButton(parent, wxID_ANY, "mirroring_off", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER | wxTRANSPARENT_WINDOW); + btn->SetToolTip(format_wxstr(_L("Mirror along %1% axis"), label)); + m_mirror_buttons[axis_idx] = btn; + + sizer->AddStretchSpacer(2); + sizer->Add(btn, 0, wxALIGN_CENTER_VERTICAL); + + btn->Bind(wxEVT_BUTTON, [this, axis_idx](wxCommandEvent&) { + GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); + Selection& selection = canvas->get_selection(); + TransformationType transformation_type; + if (is_local_coordinates()) + transformation_type.set_local(); + else if (is_instance_coordinates()) + transformation_type.set_instance(); + + transformation_type.set_relative(); + + selection.setup_cache(); + selection.mirror((Axis)axis_idx); + + // Copy mirroring values from GLVolumes into Model (ModelInstance / ModelVolume), trigger background processing. + canvas->do_mirror(L("Set Mirror")); + UpdateAndShow(true); + }); + + editors_grid_sizer->Add(sizer, 0, wxALIGN_CENTER_HORIZONTAL); + } + + m_mirror_warning_bitmap = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap); + editors_grid_sizer->Add(m_mirror_warning_bitmap, 0, wxALIGN_CENTER_VERTICAL); + editors_grid_sizer->AddStretchSpacer(1); + + // add EditBoxes + auto add_edit_boxes = [this, editors_grid_sizer](const std::string& opt_key, int axis) + { + ManipulationEditor* editor = new ManipulationEditor(this, opt_key, axis); + m_editors.push_back(editor); + + editors_grid_sizer->Add(editor, 0, wxALIGN_CENTER_VERTICAL); + }; + + // add Units + auto add_unit_text = [this, parent, editors_grid_sizer, height](std::string unit, wxStaticText** unit_text) + { + *unit_text = new wxStaticText(parent, wxID_ANY, _(unit)); + set_font_and_background_style(*unit_text, wxGetApp().normal_font()); + + // Unit text should be the same height as labels + wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->SetMinSize(wxSize(-1, height)); + sizer->Add(*unit_text, 0, wxALIGN_CENTER_VERTICAL); + + editors_grid_sizer->Add(sizer); + m_rescalable_sizers.push_back(sizer); + }; + + for (size_t axis_idx = 0; axis_idx < sizeof(axes); axis_idx++) + add_edit_boxes("position", axis_idx); + add_unit_text(m_imperial_units ? L("in") : L("mm"), &m_position_unit); + + // Add drop to bed button + m_drop_to_bed_button = new ScalableButton(parent, wxID_ANY, ScalableBitmap(parent, "drop_to_bed")); + m_drop_to_bed_button->SetToolTip(_L("Drop to bed")); + m_drop_to_bed_button->Bind(wxEVT_BUTTON, [=](wxCommandEvent& e) { + // ??? + GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); + Selection& selection = canvas->get_selection(); + + if (selection.is_single_volume_or_modifier()) { + const GLVolume* volume = selection.get_first_volume(); + const double min_z = get_volume_min_z(*volume); + if (!is_world_coordinates()) { + const Vec3d diff = m_cache.position - volume->get_instance_transformation().get_matrix_no_offset().inverse() * (min_z * Vec3d::UnitZ()); + + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Drop to bed")); + change_position_value(0, diff.x()); + change_position_value(1, diff.y()); + change_position_value(2, diff.z()); + } + else { + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Drop to bed")); + change_position_value(2, m_cache.position.z() - min_z); + } + } + else if (selection.is_single_full_instance()) { + const double min_z = selection.get_scaled_instance_bounding_box().min.z(); + if (!is_world_coordinates()) { + const GLVolume* volume = selection.get_first_volume(); + const Vec3d diff = m_cache.position - volume->get_instance_transformation().get_matrix_no_offset().inverse() * (min_z * Vec3d::UnitZ()); + + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Drop to bed")); + change_position_value(0, diff.x()); + change_position_value(1, diff.y()); + change_position_value(2, diff.z()); + } + else { + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Drop to bed")); + change_position_value(2, m_cache.position.z() - min_z); + } + } + }); + editors_grid_sizer->Add(m_drop_to_bed_button); + + for (size_t axis_idx = 0; axis_idx < sizeof(axes); axis_idx++) + add_edit_boxes("rotation", axis_idx); + wxStaticText* rotation_unit{ nullptr }; + add_unit_text("°", &rotation_unit); + + // Add reset rotation button + m_reset_rotation_button = new ScalableButton(parent, wxID_ANY, ScalableBitmap(parent, "undo")); + m_reset_rotation_button->SetToolTip(_L("Reset rotation")); + m_reset_rotation_button->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { + GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); + Selection& selection = canvas->get_selection(); + selection.setup_cache(); + if (selection.is_single_volume_or_modifier()) { + GLVolume* vol = const_cast(selection.get_first_volume()); + Geometry::Transformation trafo = vol->get_volume_transformation(); + trafo.reset_rotation(); + vol->set_volume_transformation(trafo); + } + else if (selection.is_single_full_instance()) { + Geometry::Transformation trafo = selection.get_first_volume()->get_instance_transformation(); + trafo.reset_rotation(); + for (unsigned int idx : selection.get_volume_idxs()) { + const_cast(selection.get_volume(idx))->set_instance_transformation(trafo); + } + } + else + return; + + // Synchronize instances/volumes. + + selection.synchronize_unselected_instances(Selection::SyncRotationType::RESET); + selection.synchronize_unselected_volumes(); + + // Copy rotation values from GLVolumes into Model (ModelInstance / ModelVolume), trigger background processing. + canvas->do_rotate(L("Reset Rotation")); + + UpdateAndShow(true); + }); + editors_grid_sizer->Add(m_reset_rotation_button); + + for (size_t axis_idx = 0; axis_idx < sizeof(axes); axis_idx++) + add_edit_boxes("scale", axis_idx); + wxStaticText* scale_unit{ nullptr }; + add_unit_text("%", &scale_unit); + + // Add reset scale button + m_reset_scale_button = new ScalableButton(parent, wxID_ANY, ScalableBitmap(parent, "undo")); + m_reset_scale_button->SetToolTip(_L("Reset scale")); + m_reset_scale_button->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { + GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); + Selection& selection = canvas->get_selection(); + selection.setup_cache(); + if (selection.is_single_volume_or_modifier()) { + GLVolume* vol = const_cast(selection.get_first_volume()); + Geometry::Transformation trafo = vol->get_volume_transformation(); + trafo.reset_scaling_factor(); + vol->set_volume_transformation(trafo); + } + else if (selection.is_single_full_instance()) { + Geometry::Transformation trafo = selection.get_first_volume()->get_instance_transformation(); + trafo.reset_scaling_factor(); + for (unsigned int idx : selection.get_volume_idxs()) { + const_cast(selection.get_volume(idx))->set_instance_transformation(trafo); + } + } + else + return; + + // Synchronize instances/volumes. + selection.synchronize_unselected_instances(Selection::SyncRotationType::GENERAL); + selection.synchronize_unselected_volumes(); + + canvas->do_scale(L("Reset scale")); + UpdateAndShow(true); + }); + editors_grid_sizer->Add(m_reset_scale_button); + + for (size_t axis_idx = 0; axis_idx < sizeof(axes); axis_idx++) + add_edit_boxes("size", axis_idx); + add_unit_text(m_imperial_units ? L("in") : L("mm"), &m_size_unit); + editors_grid_sizer->AddStretchSpacer(1); + + m_main_grid_sizer->Add(editors_grid_sizer, 1, wxEXPAND); + + m_skew_label = new wxStaticText(parent, wxID_ANY, _L("Skew [World]")); + m_main_grid_sizer->Add(m_skew_label, 1, wxEXPAND); + + m_reset_skew_button = new ScalableButton(parent, wxID_ANY, ScalableBitmap(parent, "undo")); + m_reset_skew_button->SetToolTip(_L("Reset skew")); + m_reset_skew_button->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { + GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); + Selection& selection = canvas->get_selection(); + if (selection.is_single_full_instance() || selection.is_single_volume_or_modifier()) { + selection.setup_cache(); + selection.reset_skew(); + canvas->do_reset_skew(L("Reset skew")); + UpdateAndShow(true); + } + }); + m_main_grid_sizer->Add(m_reset_skew_button); + + m_check_inch = new wxCheckBox(parent, wxID_ANY, _L("Inches")); + m_check_inch->SetFont(wxGetApp().normal_font()); + + m_check_inch->SetValue(m_imperial_units); + m_check_inch->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent&) { + wxGetApp().app_config->set("use_inches", m_check_inch->GetValue() ? "1" : "0"); + wxGetApp().sidebar().update_ui_from_settings(); + }); + + m_main_grid_sizer->Add(m_check_inch, 1, wxEXPAND); + + m_og->activate(); + m_og->sizer->Clear(true); + m_og->sizer->Add(m_main_grid_sizer, 1, wxEXPAND | wxALL, border); +} + +void ObjectManipulation::Show(const bool show) +{ + if (show != IsShown()) { + // Show all lines of the panel. Some of these lines will be hidden in the lines below. + m_og->Show(show); + + if (show && wxGetApp().get_mode() != comSimple) { + // Show the label and the name of the STL in simple mode only. + // Label "Name: " + m_main_grid_sizer->Show(size_t(0), false); + // The actual name of the STL. + m_main_grid_sizer->Show(size_t(1), false); + } + } + + if (show) { + ECoordinatesType coordinates_type = m_coordinates_type; + + // Show the "World Coordinates" / "Local Coordintes" Combo in Advanced / Expert mode only. + const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + bool show_world_local_combo = wxGetApp().get_mode() != comSimple && (selection.is_single_full_instance() || selection.is_single_volume_or_modifier()); + if (selection.is_single_volume_or_modifier() && m_word_local_combo->GetCount() < 3) { +#ifdef __linux__ + m_word_local_combo->Insert(coordinate_type_str(ECoordinatesType::Local), 2); +#else + m_word_local_combo->Insert(coordinate_type_str(ECoordinatesType::Local), wxNullBitmap, 2); +#endif // __linux__ + } + else if (selection.is_single_full_instance() && m_word_local_combo->GetCount() > 2) { + m_word_local_combo->Delete(2); + if (coordinates_type > ECoordinatesType::Instance) + coordinates_type = ECoordinatesType::World; + } + m_word_local_combo->Show(show_world_local_combo); + m_empty_str->Show(!show_world_local_combo); + } +} + +bool ObjectManipulation::IsShown() +{ + return dynamic_cast(m_og->sizer)->GetStaticBox()->IsShown(); // m_og->get_grid_sizer()->IsShown(2); +} + +void ObjectManipulation::UpdateAndShow(const bool show) +{ + if (show) { + this->set_dirty(); + this->update_if_dirty(); + } + + OG_Settings::UpdateAndShow(show); +} + +void ObjectManipulation::Enable(const bool enable) +{ + m_is_enabled = m_is_enabled_size_and_scale = enable; + for (wxWindow* win : std::initializer_list{ m_reset_scale_button, m_reset_rotation_button, m_drop_to_bed_button, m_check_inch, m_lock_bnt + , m_reset_skew_button }) + win->Enable(enable); +} + +void ObjectManipulation::DisableScale() +{ + m_is_enabled = true; + m_is_enabled_size_and_scale = false; + for (wxWindow* win : std::initializer_list{ m_reset_scale_button, m_lock_bnt, m_reset_skew_button }) + win->Enable(false); +} + +void ObjectManipulation::DisableUnuniformScale() +{ + m_lock_bnt->Enable(false); +} + +void ObjectManipulation::update_ui_from_settings() +{ + if (m_imperial_units != wxGetApp().app_config->get_bool("use_inches")) { + m_imperial_units = wxGetApp().app_config->get_bool("use_inches"); + + auto update_unit_text = [](const wxString& new_unit_text, wxStaticText* widget) { + widget->SetLabel(new_unit_text); + if (wxOSX) set_font_and_background_style(widget, wxGetApp().normal_font()); + }; + update_unit_text(m_imperial_units ? _L("in") : _L("mm"), m_position_unit); + update_unit_text(m_imperial_units ? _L("in") : _L("mm"), m_size_unit); + + for (int i = 0; i < 3; ++i) { + auto update = [this, i](/*ManipulationEditorKey*/int key_id, const Vec3d& new_value) { + double value = new_value(i); + if (m_imperial_units) + value *= mm_to_in; + wxString new_text = double_to_string(value, m_imperial_units && key_id == 3/*meSize*/ ? 4 : 2); + const int id = key_id * 3 + i; + if (id >= 0) m_editors[id]->set_value(new_text); + }; + update(0/*mePosition*/, m_new_position); + update(3/*meSize*/, m_new_size); + } + } + m_check_inch->SetValue(m_imperial_units); + + if (m_use_colors != wxGetApp().app_config->get_bool("color_mapinulation_panel")) { + m_use_colors = wxGetApp().app_config->get_bool("color_mapinulation_panel"); + // update colors for edit-boxes + int axis_id = 0; + for (ManipulationEditor* editor : m_editors) { +// editor->SetForegroundColour(m_use_colors ? wxColour(axes_color_text[axis_id]) : wxGetApp().get_label_clr_default()); + if (m_use_colors) { + editor->SetBackgroundColour(wxColour(axes_color_back[axis_id])); + if (wxGetApp().dark_mode()) + editor->SetForegroundColour(*wxBLACK); + } + else { +#ifdef _WIN32 + wxGetApp().UpdateDarkUI(editor); +#else + editor->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); + editor->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); +#endif /* _WIN32 */ + } + editor->Refresh(); + if (++axis_id == 3) + axis_id = 0; + } + } +} + +void ObjectManipulation::update_settings_value(const Selection& selection) +{ + if (selection.is_empty()) { + // No selection, reset the cache. + reset_settings_value(); + return; + } + + m_new_move_label_string = L("Position"); + m_new_rotate_label_string = L("Rotation"); + m_new_scale_label_string = L("Scale factors"); + + ObjectList* obj_list = wxGetApp().obj_list(); + if (selection.is_single_full_instance()) { + // all volumes in the selection belongs to the same instance, any of them contains the needed instance data, so we take the first one + const GLVolume* volume = selection.get_first_volume(); + + if (is_world_coordinates()) { + m_new_position = volume->get_instance_offset(); + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); + m_new_scale = m_new_size.cwiseQuotient(selection.get_unscaled_instance_bounding_box().size()) * 100.0; + m_new_rotate_label_string = L("Rotate (relative)"); + m_new_rotation = Vec3d::Zero(); + } + else { + m_new_move_label_string = L("Translate (relative) [World]"); + m_new_rotate_label_string = L("Rotate (relative)"); + m_new_position = Vec3d::Zero(); + m_new_rotation = Vec3d::Zero(); + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); + m_new_scale = m_new_size.cwiseQuotient(selection.get_full_unscaled_instance_local_bounding_box().size()) * 100.0; + } + + m_new_enabled = true; + } + else if (selection.is_single_full_object() && obj_list->is_selected(itObject)) { + const BoundingBoxf3& box = selection.get_bounding_box(); + m_new_position = box.center(); + m_new_rotation = Vec3d::Zero(); + m_new_scale = Vec3d(100.0, 100.0, 100.0); + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); + m_new_rotate_label_string = L("Rotate"); + m_new_scale_label_string = L("Scale"); + m_new_enabled = true; + } + else if (selection.is_single_volume_or_modifier()) { + // the selection contains a single volume + const GLVolume* volume = selection.get_first_volume(); + if (is_world_coordinates()) { + const Geometry::Transformation trafo(volume->world_matrix()); + + const Vec3d& offset = trafo.get_offset(); + + m_new_position = offset; + m_new_rotate_label_string = L("Rotate (relative)"); + m_new_scale_label_string = L("Scale"); + m_new_scale = Vec3d(100.0, 100.0, 100.0); + m_new_rotation = Vec3d::Zero(); + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); + } + else if (is_local_coordinates()) { + m_new_move_label_string = L("Translate (relative) [World]"); + m_new_rotate_label_string = L("Rotate (relative)"); + m_new_position = Vec3d::Zero(); + m_new_rotation = Vec3d::Zero(); + m_new_scale = volume->get_volume_scaling_factor() * 100.0; + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); + } + else { + m_new_position = volume->get_volume_offset(); + m_new_rotate_label_string = L("Rotate (relative)"); + m_new_rotation = Vec3d::Zero(); + m_new_scale_label_string = L("Scale"); + m_new_scale = Vec3d(100.0, 100.0, 100.0); + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); + } + m_new_enabled = true; + } + else if (obj_list->is_connectors_item_selected() || obj_list->multiple_selection() || obj_list->is_selected(itInstanceRoot)) { + reset_settings_value(); + m_new_move_label_string = L("Translate"); + m_new_rotate_label_string = L("Rotate"); + m_new_scale_label_string = L("Scale"); + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); + m_new_enabled = true; + } +} + +void ObjectManipulation::update_if_dirty() +{ + if (! m_dirty) + return; + + const Selection &selection = wxGetApp().plater()->canvas3D()->get_selection(); + this->update_settings_value(selection); + + auto update_label = [](wxString &label_cache, const std::string &new_label, wxStaticText *widget) { + wxString new_label_localized = _(new_label) + ":"; + if (label_cache != new_label_localized) { + label_cache = new_label_localized; + widget->SetLabel(new_label_localized); + if (wxOSX) set_font_and_background_style(widget, wxGetApp().normal_font()); + } + }; + update_label(m_cache.move_label_string, m_new_move_label_string, m_move_Label); + update_label(m_cache.rotate_label_string, m_new_rotate_label_string, m_rotate_Label); + update_label(m_cache.scale_label_string, m_new_scale_label_string, m_scale_Label); + + enum ManipulationEditorKey + { + mePosition = 0, + meRotation, + meScale, + meSize + }; + + for (int i = 0; i < 3; ++ i) { + auto update = [this, i](Vec3d &cached, Vec3d &cached_rounded, ManipulationEditorKey key_id, const Vec3d &new_value) { + wxString new_text = double_to_string(new_value(i), m_imperial_units && key_id == meSize ? 4 : 2); + double new_rounded; + new_text.ToDouble(&new_rounded); + if (std::abs(cached_rounded(i) - new_rounded) > EPSILON) { + cached_rounded(i) = new_rounded; + const int id = key_id*3+i; + if (m_imperial_units) { + double inch_value = new_value(i) * mm_to_in; + if (key_id == mePosition) + new_text = double_to_string(inch_value, 2); + if (key_id == meSize) { + if(std::abs(m_cache.size_inches(i) - inch_value) > EPSILON) + m_cache.size_inches(i) = inch_value; + new_text = double_to_string(inch_value, 4); + } + } + if (id >= 0) m_editors[id]->set_value(new_text); + } + cached(i) = new_value(i); + }; + update(m_cache.position, m_cache.position_rounded, mePosition, m_new_position); + update(m_cache.scale, m_cache.scale_rounded, meScale, m_new_scale); + update(m_cache.size, m_cache.size_rounded, meSize, m_new_size); + update(m_cache.rotation, m_cache.rotation_rounded, meRotation, m_new_rotation); + } + + m_lock_bnt->SetLock(m_uniform_scale); + m_lock_bnt->SetToolTip(wxEmptyString); + m_lock_bnt->enable(); + + if (m_new_enabled) + m_og->enable(); + else + m_og->disable(); + + if (!wxGetApp().plater()->canvas3D()->is_dragging()) { + update_reset_buttons_visibility(); + update_mirror_buttons_visibility(); + } + + m_dirty = false; +} + +void ObjectManipulation::update_reset_buttons_visibility() +{ + GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); + if (!canvas) + return; + + bool show_drop_to_bed = false; + bool show_rotation = false; + bool show_scale = false; + bool show_mirror = false; + bool show_skew = false; + + const Selection& selection = canvas->get_selection(); + if (selection.is_single_full_instance() || selection.is_single_volume_or_modifier()) { + const double min_z = selection.is_single_full_instance() ? selection.get_scaled_instance_bounding_box().min.z() : + get_volume_min_z(*selection.get_first_volume()); + + show_drop_to_bed = std::abs(min_z) > EPSILON; + const GLVolume* volume = selection.get_first_volume(); + const Geometry::Transformation trafo = selection.is_single_full_instance() ? volume->get_instance_transformation() : volume->get_volume_transformation(); + + const Geometry::TransformationSVD trafo_svd(trafo); + show_rotation = trafo_svd.rotation; + show_scale = trafo_svd.scale; + show_mirror = trafo_svd.mirror; + show_skew = Geometry::TransformationSVD(volume->world_matrix()).skew; + } + + wxGetApp().CallAfter([this, show_drop_to_bed, show_rotation, show_scale, show_mirror, show_skew] { + // There is a case (under OSX), when this function is called after the Manipulation panel is hidden + // So, let check if Manipulation panel is still shown for this moment + if (!this->IsShown()) + return; + m_drop_to_bed_button->Show(show_drop_to_bed); + m_reset_rotation_button->Show(show_rotation); + m_reset_scale_button->Show(show_scale); + m_mirror_warning_bitmap->SetBitmap(show_mirror ? m_manifold_warning_bmp.bmp() : wxNullBitmap); + m_mirror_warning_bitmap->SetMinSize(show_mirror ? m_manifold_warning_bmp.GetSize() : wxSize(0, 0)); + m_mirror_warning_bitmap->SetToolTip(show_mirror ? _L("Left handed") : ""); + m_reset_skew_button->Show(show_skew); + m_skew_label->Show(show_skew); + + // Because of CallAfter we need to layout sidebar after Show/hide of reset buttons one more time + Sidebar& panel = wxGetApp().sidebar(); + if (!panel.IsFrozen()) { + panel.Freeze(); + panel.Layout(); + panel.Thaw(); + } + }); +} + +void ObjectManipulation::update_mirror_buttons_visibility() +{ + const bool can_mirror = wxGetApp().plater()->can_mirror(); + for (ScalableButton* button : m_mirror_buttons) { + button->Enable(can_mirror); + } +} + + + + +#ifndef __APPLE__ +void ObjectManipulation::emulate_kill_focus() +{ + if (!m_focused_editor) + return; + + m_focused_editor->kill_focus(this); +} +#endif // __APPLE__ + +void ObjectManipulation::update_item_name(const wxString& item_name) +{ + m_item_name->SetLabel(item_name); +} + +void ObjectManipulation::update_warning_icon_state(const MeshErrorsInfo& warning) +{ + if (const std::string& warning_icon_name = warning.warning_icon_name; + !warning_icon_name.empty()) + m_manifold_warning_bmp = ScalableBitmap(m_parent, warning_icon_name); + const wxString& tooltip = warning.tooltip; + m_fix_throught_netfab_bitmap->SetBitmap(tooltip.IsEmpty() ? wxNullBitmap : m_manifold_warning_bmp.bmp()); + m_fix_throught_netfab_bitmap->SetMinSize(tooltip.IsEmpty() ? wxSize(0,0) : m_manifold_warning_bmp.GetSize()); + m_fix_throught_netfab_bitmap->SetToolTip(tooltip); +} + +wxString ObjectManipulation::coordinate_type_str(ECoordinatesType type) +{ + switch (type) + { + case ECoordinatesType::World: { return _L("World coordinates"); } + case ECoordinatesType::Instance: { return _L("Object coordinates"); } + case ECoordinatesType::Local: { return _L("Part coordinates"); } + default: { assert(false); return _L("Unknown"); } + } +} + +#if ENABLE_OBJECT_MANIPULATION_DEBUG +void ObjectManipulation::render_debug_window() +{ + ImGuiWrapper& imgui = *wxGetApp().imgui(); +// ImGui::SetNextWindowCollapsed(true, ImGuiCond_Once); + imgui.begin(std::string("ObjectManipulation"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Coordinates type"); + ImGui::SameLine(); + imgui.text(coordinate_type_str(m_coordinates_type)); + imgui.end(); +} +#endif // ENABLE_OBJECT_MANIPULATION_DEBUG + +void ObjectManipulation::reset_settings_value() +{ + m_new_position = Vec3d::Zero(); + m_new_rotation = Vec3d::Zero(); + m_new_scale = Vec3d::Ones() * 100.; + m_new_size = Vec3d::Zero(); + m_new_enabled = false; + // no need to set the dirty flag here as this method is called from update_settings_value(), + // which is called from update_if_dirty(), which resets the dirty flag anyways. +// m_dirty = true; +} + +void ObjectManipulation::change_position_value(int axis, double value) +{ + if (std::abs(m_cache.position_rounded(axis) - value) < EPSILON) + return; + + Vec3d position = m_cache.position; + position(axis) = value; + + auto canvas = wxGetApp().plater()->canvas3D(); + Selection& selection = canvas->get_selection(); + selection.setup_cache(); + TransformationType trafo_type; + trafo_type.set_relative(); + switch (get_coordinates_type()) + { + case ECoordinatesType::Instance: { trafo_type.set_instance(); break; } + case ECoordinatesType::Local: { trafo_type.set_local(); break; } + default: { break; } + } + selection.translate(position - m_cache.position, trafo_type); + canvas->do_move(L("Set Position")); + + m_cache.position = position; + m_cache.position_rounded(axis) = DBL_MAX; + this->UpdateAndShow(true); +} + +void ObjectManipulation::change_rotation_value(int axis, double value) +{ + if (std::abs(m_cache.rotation_rounded(axis) - value) < EPSILON) + return; + + Vec3d rotation = m_cache.rotation; + rotation(axis) = value; + + GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); + Selection& selection = canvas->get_selection(); + + TransformationType transformation_type; + transformation_type.set_relative(); + if (selection.is_single_full_instance()) + transformation_type.set_independent(); + + if (is_local_coordinates()) + transformation_type.set_local(); + + if (is_instance_coordinates()) + transformation_type.set_instance(); + + selection.setup_cache(); + selection.rotate( + (M_PI / 180.0) * (transformation_type.absolute() ? rotation : rotation - m_cache.rotation), + transformation_type); + canvas->do_rotate(L("Set Orientation")); + + m_cache.rotation = rotation; + m_cache.rotation_rounded(axis) = DBL_MAX; + this->UpdateAndShow(true); +} + +void ObjectManipulation::change_scale_value(int axis, double value) +{ + if (value <= 0.0) + return; + + if (std::abs(m_cache.scale_rounded(axis) - value) < EPSILON) + return; + + Vec3d scale = m_cache.scale; + scale(axis) = value; + + const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + Vec3d ref_scale = m_cache.scale; + if (selection.is_single_volume_or_modifier()) { + scale = scale.cwiseQuotient(ref_scale); + ref_scale = Vec3d::Ones(); + } + else if (selection.is_single_full_instance()) + ref_scale = 100.0 * Vec3d::Ones(); + + this->do_scale(axis, scale.cwiseQuotient(ref_scale)); + + m_cache.scale = scale; + m_cache.scale_rounded(axis) = DBL_MAX; + this->UpdateAndShow(true); +} + + +void ObjectManipulation::change_size_value(int axis, double value) +{ + if (value <= 0.0) + return; + + if (m_imperial_units) { + if (std::abs(m_cache.size_inches(axis) - value) < EPSILON) + return; + m_cache.size_inches(axis) = value; + value *= in_to_mm; + } + + if (std::abs(m_cache.size_rounded(axis) - value) < EPSILON) + return; + + Vec3d size = m_cache.size; + size(axis) = value; + + const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + + Vec3d ref_size = m_cache.size; + if (selection.is_single_volume_or_modifier()) { + size = size.cwiseQuotient(ref_size); + ref_size = Vec3d::Ones(); + } + else if (selection.is_single_full_instance()) { + if (is_world_coordinates()) + ref_size = selection.get_full_unscaled_instance_bounding_box().size(); + else + ref_size = selection.get_full_unscaled_instance_local_bounding_box().size(); + } + + this->do_size(axis, size.cwiseQuotient(ref_size)); + + m_cache.size = size; + m_cache.size_rounded(axis) = DBL_MAX; + this->UpdateAndShow(true); +} + +void ObjectManipulation::do_scale(int axis, const Vec3d &scale) const +{ + TransformationType transformation_type; + if (is_local_coordinates()) + transformation_type.set_local(); + else if (is_instance_coordinates()) + transformation_type.set_instance(); + + Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + if (selection.is_single_volume_or_modifier() && !is_local_coordinates()) + transformation_type.set_relative(); + + const Vec3d scaling_factor = m_uniform_scale ? scale(axis) * Vec3d::Ones() : scale; + selection.setup_cache(); + selection.scale(scaling_factor, transformation_type); + wxGetApp().plater()->canvas3D()->do_scale(L("Set Scale")); +} + +void ObjectManipulation::do_size(int axis, const Vec3d& scale) const +{ + Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + + TransformationType transformation_type; + if (is_local_coordinates()) + transformation_type.set_local(); + else if (is_instance_coordinates()) + transformation_type.set_instance(); + + const Vec3d scaling_factor = m_uniform_scale ? scale(axis) * Vec3d::Ones() : scale; + selection.setup_cache(); + selection.scale(scaling_factor, transformation_type); + wxGetApp().plater()->canvas3D()->do_scale(L("Set Size")); +} + +void ObjectManipulation::on_change(const std::string& opt_key, int axis, double new_value) +{ + if (!m_cache.is_valid()) + return; + + if (opt_key == "position") { + if (m_imperial_units) + new_value *= in_to_mm; + change_position_value(axis, new_value); + } + else if (opt_key == "rotation") + change_rotation_value(axis, new_value); + else if (opt_key == "scale") { + if (new_value > 0.0) + change_scale_value(axis, new_value); + else { + new_value = m_cache.scale(axis); + m_cache.scale(axis) = 0.0; + m_cache.scale_rounded(axis) = DBL_MAX; + change_scale_value(axis, new_value); + } + } + else if (opt_key == "size") { + if (new_value > 0.0) + change_size_value(axis, new_value); + else { + Vec3d& size = m_imperial_units ? m_cache.size_inches : m_cache.size; + new_value = size(axis); + size(axis) = 0.0; + m_cache.size_rounded(axis) = DBL_MAX; + change_size_value(axis, new_value); + } + } +} + +void ObjectManipulation::set_uniform_scaling(const bool use_uniform_scale) +{ + if (!use_uniform_scale) + // Recalculate cached values at this panel, refresh the screen. + this->UpdateAndShow(true); + + m_uniform_scale = use_uniform_scale; + set_dirty(); +} + +void ObjectManipulation::set_coordinates_type(ECoordinatesType type) +{ + if (wxGetApp().get_mode() == comSimple) + type = ECoordinatesType::World; + + if (m_coordinates_type == type) + return; + + m_coordinates_type = type; + m_word_local_combo->SetSelection((int)m_coordinates_type); + this->UpdateAndShow(true); + GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); + canvas->get_gizmos_manager().update_data(); + canvas->set_as_dirty(); + canvas->request_extra_frame(); +} + +ECoordinatesType ObjectManipulation::get_coordinates_type() const +{ + return m_coordinates_type; +} + +void ObjectManipulation::msw_rescale() +{ + const int em = wxGetApp().em_unit(); + m_item_name->SetMinSize(wxSize(20*em, wxDefaultCoord)); + msw_rescale_word_local_combo(m_word_local_combo); + m_word_local_combo_sizer->SetMinSize(wxSize(-1, m_word_local_combo->GetBestHeight(-1))); + + const wxString& tooltip = m_fix_throught_netfab_bitmap->GetToolTipText(); + m_fix_throught_netfab_bitmap->SetBitmap(tooltip.IsEmpty() ? wxNullBitmap : m_manifold_warning_bmp.bmp()); + m_fix_throught_netfab_bitmap->SetMinSize(tooltip.IsEmpty() ? wxSize(0, 0) : m_manifold_warning_bmp.GetSize()); + + // rescale label-heights + // Text trick to grid sizer layout: + // Height of labels should be equivalent to the edit boxes + const int height = wxTextCtrl(parent(), wxID_ANY, "Br").GetBestHeight(-1); + for (wxBoxSizer* sizer : m_rescalable_sizers) + sizer->SetMinSize(wxSize(-1, height)); + + // rescale edit-boxes + for (ManipulationEditor* editor : m_editors) + editor->msw_rescale(); + + // rescale "inches" checkbox + m_check_inch->SetInitialSize(m_check_inch->GetBestSize()); + + get_og()->msw_rescale(); +} + +void ObjectManipulation::sys_color_changed() +{ +#ifdef _WIN32 + get_og()->sys_color_changed(); + wxGetApp().UpdateDarkUI(m_word_local_combo); + wxGetApp().UpdateDarkUI(m_check_inch); +#endif + for (ManipulationEditor* editor : m_editors) + editor->sys_color_changed(this); + + m_mirror_bitmap_on.sys_color_changed(); + m_reset_scale_button->sys_color_changed(); + m_reset_rotation_button->sys_color_changed(); + m_drop_to_bed_button->sys_color_changed(); + m_lock_bnt->sys_color_changed(); + + for (int id = 0; id < 3; ++id) { + m_mirror_buttons[id]->sys_color_changed(); + } +} + +void ObjectManipulation::set_coordinates_type(const wxString& type_string) +{ + if (type_string == coordinate_type_str(ECoordinatesType::Instance)) + this->set_coordinates_type(ECoordinatesType::Instance); + else if (type_string == coordinate_type_str(ECoordinatesType::Local)) + this->set_coordinates_type(ECoordinatesType::Local); + else + this->set_coordinates_type(ECoordinatesType::World); +} + +static const char axes[] = { 'x', 'y', 'z' }; +ManipulationEditor::ManipulationEditor(ObjectManipulation* parent, + const std::string& opt_key, + int axis) : + wxTextCtrl(parent->parent(), wxID_ANY, wxEmptyString, wxDefaultPosition, + wxSize((wxOSX ? 5 : 6)*int(wxGetApp().em_unit()), wxDefaultCoord), wxTE_PROCESS_ENTER +#ifdef _WIN32 + | wxBORDER_SIMPLE +#endif + ), + m_opt_key(opt_key), + m_axis(axis) +{ + set_font_and_background_style(this, wxGetApp().normal_font()); +#ifdef __WXOSX__ + this->OSXDisableAllSmartSubstitutions(); +#endif // __WXOSX__ + if (parent->use_colors()) { + this->SetBackgroundColour(wxColour(axes_color_back[axis])); + this->SetForegroundColour(*wxBLACK); + } else { + wxGetApp().UpdateDarkUI(this); + } + + // A name used to call handle_sidebar_focus_event() + m_full_opt_name = m_opt_key+"_"+axes[axis]; + + // Reset m_enter_pressed flag to _false_, when value is editing + this->Bind(wxEVT_TEXT, [this](wxEvent&) { m_enter_pressed = false; }, this->GetId()); + + this->Bind(wxEVT_TEXT_ENTER, [this, parent](wxEvent&) + { + m_enter_pressed = true; + parent->on_change(m_opt_key, m_axis, get_value()); + }, this->GetId()); + + this->Bind(wxEVT_KILL_FOCUS, [this, parent](wxFocusEvent& e) + { + parent->set_focused_editor(nullptr); + + if (!m_enter_pressed) + kill_focus(parent); + + e.Skip(); + }, this->GetId()); + + this->Bind(wxEVT_SET_FOCUS, [this, parent](wxFocusEvent& e) + { + parent->set_focused_editor(this); + + // needed to show the visual hints in 3D scene + wxGetApp().plater()->canvas3D()->handle_sidebar_focus_event(m_full_opt_name, true); + e.Skip(); + }, this->GetId()); + + this->Bind(wxEVT_CHAR, ([this](wxKeyEvent& event) + { + // select all text using Ctrl+A + if (wxGetKeyState(wxKeyCode('A')) && wxGetKeyState(WXK_CONTROL)) + this->SetSelection(-1, -1); //select all + event.Skip(); + })); + + this->Bind(wxEVT_UPDATE_UI, [parent, this](wxUpdateUIEvent& evt) { + const bool is_gizmo_in_editing_mode = wxGetApp().plater()->canvas3D()->get_gizmos_manager().is_in_editing_mode(); + const bool is_enabled_editing = has_opt_key("scale") || has_opt_key("size") ? parent->is_enabled_size_and_scale() : true; + evt.Enable(!is_gizmo_in_editing_mode && parent->is_enabled() && is_enabled_editing); + }); +} + +void ManipulationEditor::msw_rescale() +{ + const int em = wxGetApp().em_unit(); + SetMinSize(wxSize(5 * em, wxDefaultCoord)); +} + +void ManipulationEditor::sys_color_changed(ObjectManipulation* parent) +{ + if (parent->use_colors()) + SetForegroundColour(*wxBLACK); + else +#ifdef _WIN32 + wxGetApp().UpdateDarkUI(this); +#else + SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); +#endif // _WIN32 +} + +double ManipulationEditor::get_value() +{ + wxString str = GetValue(); + + double value; + const char dec_sep = is_decimal_separator_point() ? '.' : ','; + const char dec_sep_alt = dec_sep == '.' ? ',' : '.'; + // Replace the first incorrect separator in decimal number. + if (str.Replace(dec_sep_alt, dec_sep, false) != 0) + SetValue(str); + + if (str == ".") + value = 0.0; + + if ((str.IsEmpty() || !str.ToDouble(&value)) && !m_valid_value.IsEmpty()) { + str = m_valid_value; + SetValue(str); + str.ToDouble(&value); + } + + return value; +} + +void ManipulationEditor::set_value(const wxString& new_value) +{ + if (new_value.IsEmpty()) + return; + m_valid_value = new_value; + SetValue(m_valid_value); +} + +void ManipulationEditor::kill_focus(ObjectManipulation* parent) +{ + parent->on_change(m_opt_key, m_axis, get_value()); + + // if the change does not come from the user pressing the ENTER key + // we need to hide the visual hints in 3D scene + wxGetApp().plater()->canvas3D()->handle_sidebar_focus_event(m_full_opt_name, false); +} + +} //namespace GUI +} //namespace Slic3r diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp new file mode 100644 index 00000000000..139171d999a --- /dev/null +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -0,0 +1,250 @@ +#ifndef slic3r_GUI_ObjectManipulation_hpp_ +#define slic3r_GUI_ObjectManipulation_hpp_ + +#include + +#include "GUI_ObjectSettings.hpp" +#include "GUI_ObjectList.hpp" +#include "GUI_Geometry.hpp" +#include "libslic3r/Point.hpp" +#include + +#ifdef __WXOSX__ +class wxBitmapComboBox; +#else +class wxComboBox; +#endif // __WXOSX__ +class wxStaticText; +class LockButton; +class wxStaticBitmap; +class wxCheckBox; + +namespace Slic3r { +namespace GUI { + +#ifdef _WIN32 +class BitmapComboBox; +#endif + +#ifdef __WXOSX__ + static_assert(wxMAJOR_VERSION >= 3, "Use of wxBitmapComboBox on Manipulation panel requires wxWidgets 3.0 and newer"); + using choice_ctrl = wxBitmapComboBox; +#else +#ifdef _WIN32 + using choice_ctrl = BitmapComboBox; +#else + using choice_ctrl = wxComboBox; +#endif +#endif // __WXOSX__ + +class Selection; + +class ObjectManipulation; +class ManipulationEditor : public wxTextCtrl +{ + std::string m_opt_key; + int m_axis; + bool m_enter_pressed { false }; + wxString m_valid_value {wxEmptyString}; + + std::string m_full_opt_name; + +public: + ManipulationEditor(ObjectManipulation* parent, const std::string& opt_key, int axis); + ~ManipulationEditor() {} + + void msw_rescale(); + void sys_color_changed(ObjectManipulation* parent); + void set_value(const wxString& new_value); + void kill_focus(ObjectManipulation *parent); + + const std::string& get_full_opt_name() const { return m_full_opt_name; } + + bool has_opt_key(const std::string& key) { return m_opt_key == key; } + +private: + double get_value(); +}; + + +class ObjectManipulation : public OG_Settings +{ +public: + static const double in_to_mm; + static const double mm_to_in; + +private: + struct Cache + { + Vec3d position; + Vec3d position_rounded; + Vec3d rotation; + Vec3d rotation_rounded; + Vec3d scale; + Vec3d scale_rounded; + Vec3d size; + Vec3d size_inches; + Vec3d size_rounded; + + wxString move_label_string; + wxString rotate_label_string; + wxString scale_label_string; + + Cache() { reset(); } + void reset() + { + position = position_rounded = Vec3d(DBL_MAX, DBL_MAX, DBL_MAX); + rotation = rotation_rounded = Vec3d(DBL_MAX, DBL_MAX, DBL_MAX); + scale = scale_rounded = Vec3d(DBL_MAX, DBL_MAX, DBL_MAX); + size = size_rounded = Vec3d(DBL_MAX, DBL_MAX, DBL_MAX); + move_label_string = wxString(); + rotate_label_string = wxString(); + scale_label_string = wxString(); + } + bool is_valid() const { return position != Vec3d(DBL_MAX, DBL_MAX, DBL_MAX); } + }; + + Cache m_cache; + + wxStaticText* m_move_Label = nullptr; + wxStaticText* m_scale_Label = nullptr; + wxStaticText* m_rotate_Label = nullptr; + + bool m_imperial_units { false }; + bool m_use_colors { false }; + wxStaticText* m_position_unit { nullptr }; + wxStaticText* m_size_unit { nullptr }; + + wxStaticText* m_item_name = nullptr; + wxStaticText* m_empty_str = nullptr; + + // Non-owning pointers to the reset buttons, so we can hide and show them. + ScalableButton* m_reset_scale_button{ nullptr }; + ScalableButton* m_reset_rotation_button{ nullptr }; + ScalableButton* m_reset_skew_button{ nullptr }; + ScalableButton* m_drop_to_bed_button{ nullptr }; + + wxCheckBox* m_check_inch {nullptr}; + + std::array m_mirror_buttons; + + // Bitmaps for the mirroring buttons. + ScalableBitmap m_mirror_bitmap_on; + + // Needs to be updated from OnIdle? + bool m_dirty = false; + // Cached labels for the delayed update, not localized! + std::string m_new_move_label_string; + std::string m_new_rotate_label_string; + std::string m_new_scale_label_string; + Vec3d m_new_position; + Vec3d m_new_rotation; + Vec3d m_new_scale; + Vec3d m_new_size; + bool m_new_enabled {true}; + bool m_uniform_scale {true}; + ECoordinatesType m_coordinates_type{ ECoordinatesType::World }; + LockButton* m_lock_bnt{ nullptr }; + choice_ctrl* m_word_local_combo { nullptr }; + + ScalableBitmap m_manifold_warning_bmp; + wxStaticBitmap* m_fix_throught_netfab_bitmap{ nullptr }; + wxStaticBitmap* m_mirror_warning_bitmap{ nullptr }; + + // Currently focused editor (nullptr if none) + ManipulationEditor* m_focused_editor{ nullptr }; + + wxFlexGridSizer* m_main_grid_sizer; + wxFlexGridSizer* m_labels_grid_sizer; + + wxStaticText* m_skew_label{ nullptr }; + + // sizers, used for msw_rescale + wxBoxSizer* m_word_local_combo_sizer; + std::vector m_rescalable_sizers; + + std::vector m_editors; + + // parameters for enabling/disabling of editors + bool m_is_enabled { true }; + bool m_is_enabled_size_and_scale { true }; + + +public: + ObjectManipulation(wxWindow* parent); + ~ObjectManipulation() {} + + void Show(const bool show) override; + bool IsShown() override; + void UpdateAndShow(const bool show) override; + void Enable(const bool enadle = true); + void Disable() { Enable(false); } + void DisableScale(); + void DisableUnuniformScale(); + void update_ui_from_settings(); + bool use_colors() { return m_use_colors; } + + void set_dirty() { m_dirty = true; } + // Called from the App to update the UI if dirty. + void update_if_dirty(); + + void set_uniform_scaling(const bool use_uniform_scale); + bool get_uniform_scaling() const { return m_uniform_scale; } + + void set_coordinates_type(ECoordinatesType type); + ECoordinatesType get_coordinates_type() const; + bool is_world_coordinates() const { return m_coordinates_type == ECoordinatesType::World; } + bool is_instance_coordinates() const { return m_coordinates_type == ECoordinatesType::Instance; } + bool is_local_coordinates() const { return m_coordinates_type == ECoordinatesType::Local; } + + void reset_cache() { m_cache.reset(); } +#ifndef __APPLE__ + // On Windows and Linux, emulates a kill focus event on the currently focused option (if any) + // Used only in ObjectList wxEVT_DATAVIEW_SELECTION_CHANGED handler which is called before the regular kill focus event + // bound to this class when changing selection in the objects list + void emulate_kill_focus(); +#endif // __APPLE__ + + void update_item_name(const wxString &item_name); + void update_warning_icon_state(const MeshErrorsInfo& warning); + void msw_rescale(); + void sys_color_changed(); + void on_change(const std::string& opt_key, int axis, double new_value); + void set_focused_editor(ManipulationEditor* focused_editor) { + m_focused_editor = focused_editor; + } + + ManipulationEditor* get_focused_editor() { return m_focused_editor; } + + static wxString coordinate_type_str(ECoordinatesType type); + + bool is_enabled() const { return m_is_enabled; } + bool is_enabled_size_and_scale()const { return m_is_enabled_size_and_scale; } + +#if ENABLE_OBJECT_MANIPULATION_DEBUG + void render_debug_window(); +#endif // ENABLE_OBJECT_MANIPULATION_DEBUG + +private: + void reset_settings_value(); + void update_settings_value(const Selection& selection); + + // Show or hide scale/rotation reset buttons if needed + void update_reset_buttons_visibility(); + //Show or hide mirror buttons + void update_mirror_buttons_visibility(); + + // change values + void change_position_value(int axis, double value); + void change_rotation_value(int axis, double value); + void change_scale_value(int axis, double value); + void change_size_value(int axis, double value); + void do_scale(int axis, const Vec3d &scale) const; + void do_size(int axis, const Vec3d& scale) const; + + void set_coordinates_type(const wxString& type_string); +}; + +}} + +#endif // slic3r_GUI_ObjectManipulation_hpp_ diff --git a/src/slic3r/GUI/GUI_Utils.hpp b/src/slic3r/GUI/GUI_Utils.hpp index bf2c4277b88..f0c3d30a6fb 100644 --- a/src/slic3r/GUI/GUI_Utils.hpp +++ b/src/slic3r/GUI/GUI_Utils.hpp @@ -501,6 +501,16 @@ bool generate_image(const std::string &filename, wxImage &image, wxSize img_size int get_dpi_for_window(const wxWindow *window); +class KeyAutoRepeatFilter +{ + size_t m_count{ 0 }; + +public: + void increase_count() { ++m_count; } + void reset_count() { m_count = 0; } + bool is_first() const { return m_count == 0; } +}; + }} #endif diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index b1d98d3dc2f..fd678f303e1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -5,6 +5,7 @@ #include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/GUI_Colors.hpp" +#include "slic3r/GUI/Plater.hpp" // TODO: Display tooltips quicker on Linux @@ -99,6 +100,18 @@ float GLGizmoBase::Grabber::get_dragging_half_size(float size) const { return get_half_size(size) * DraggingScaleFactor; } +void GLGizmoBase::Grabber::register_raycasters_for_picking(int id) +{ + picking_id = id; + // registration will happen on next call to render() +} + +void GLGizmoBase::Grabber::unregister_raycasters_for_picking() +{ + wxGetApp().plater()->canvas3D()->remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, picking_id); + picking_id = -1; + raycasters = { nullptr }; +} const GLModel& GLGizmoBase::Grabber::get_cube() const { @@ -238,7 +251,19 @@ bool GLGizmoBase::update_items_state() m_dirty = false; return res; }; +void GLGizmoBase::register_grabbers_for_picking() +{ + for (size_t i = 0; i < m_grabbers.size(); ++i) { + m_grabbers[i].register_raycasters_for_picking((m_group_id >= 0) ? m_group_id : i); + } +} +void GLGizmoBase::unregister_grabbers_for_picking() +{ + for (size_t i = 0; i < m_grabbers.size(); ++i) { + m_grabbers[i].unregister_raycasters_for_picking(); + } +} bool GLGizmoBase::GizmoImguiBegin(const std::string &name, int flags) { return m_imgui->begin(name, flags); @@ -283,6 +308,7 @@ std::array GLGizmoBase::picking_color_component(unsigned int id) const }; } + void GLGizmoBase::render_grabbers(const BoundingBoxf3& box) const { #if ENABLE_FIXED_GRABBER diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index c725809bbae..5bfac2a9fb7 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -5,6 +5,7 @@ #include "slic3r/GUI/I18N.hpp" #include "slic3r/GUI/GLModel.hpp" +#include "slic3r/GUI/SceneRaycaster.hpp" #include @@ -34,6 +35,7 @@ class GLGizmoBase // Starting value for ids to avoid clashing with ids used by GLVolumes // (254 is choosen to leave some space for forward compatibility) static const unsigned int BASE_ID = 255 * 255 * 254; + static const unsigned int GRABBER_ELEMENTS_MAX_COUNT = 7; static float INV_ZOOM; @@ -69,6 +71,8 @@ class GLGizmoBase std::array hover_color; bool enabled; bool dragging; + int picking_id{ -1 }; + std::array, GRABBER_ELEMENTS_MAX_COUNT> raycasters = { nullptr }; Grabber(); @@ -79,6 +83,9 @@ class GLGizmoBase float get_dragging_half_size(float size) const; const GLModel& get_cube() const; + void register_raycasters_for_picking(int id); + void unregister_raycasters_for_picking(); + private: void render(float size, const std::array& render_color, bool picking) const; @@ -159,7 +166,7 @@ class GLGizmoBase virtual bool wants_enter_leave_snapshots() const { return false; } virtual std::string get_gizmo_entering_text() const { assert(false); return ""; } virtual std::string get_gizmo_leaving_text() const { assert(false); return ""; } - virtual std::string get_action_snapshot_name() { return "Gizmo action"; } + virtual std::string get_action_snapshot_name() const { return "Gizmo action"; } void set_common_data_pool(CommonGizmosDataPool* ptr) { m_c = ptr; } virtual bool apply_clipping_plane() { return true; } @@ -189,8 +196,27 @@ class GLGizmoBase void render_input_window(float x, float y, float bottom_limit); virtual void on_change_color_mode(bool is_dark) { m_is_dark_mode = is_dark; } + /// + /// Mouse tooltip text + /// + /// Text to be visible in mouse tooltip virtual std::string get_tooltip() const { return ""; } + /// + /// Is called when data (Selection) is changed + /// + virtual void data_changed(bool is_serializing){}; + + /// + /// Implement when want to process mouse events in gizmo + /// Click, Right click, move, drag, ... + /// + /// Keep information about mouse click + /// Return True when use the information and don't want to propagate it otherwise False. + virtual bool on_mouse(const wxMouseEvent &mouse_event) { return false; } + void register_raycasters_for_picking() { register_grabbers_for_picking(); on_register_raycasters_for_picking(); } + void unregister_raycasters_for_picking() { unregister_grabbers_for_picking(); on_unregister_raycasters_for_picking(); } + int get_count() { return ++count; } std::string get_gizmo_name() { return on_get_name(); } @@ -213,6 +239,10 @@ class GLGizmoBase virtual void on_render() = 0; virtual void on_render_for_picking() = 0; virtual void on_render_input_window(float x, float y, float bottom_limit) {} + void register_grabbers_for_picking(); + void unregister_grabbers_for_picking(); + virtual void on_register_raycasters_for_picking() {} + virtual void on_unregister_raycasters_for_picking() {} bool GizmoImguiBegin(const std::string& name, int flags); void GizmoImguiEnd(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp index 6960a81dc62..5651d247a68 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp @@ -39,7 +39,7 @@ class GLGizmoFdmSupports : public GLGizmoPainterBase std::string get_gizmo_entering_text() const override { return "Entering Paint-on supports"; } std::string get_gizmo_leaving_text() const override { return "Leaving Paint-on supports"; } - std::string get_action_snapshot_name() override { return "Paint-on supports editing"; } + std::string get_action_snapshot_name() const override { return "Paint-on supports editing"; } // BBS wchar_t m_current_tool = 0; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp new file mode 100644 index 00000000000..7fd85d6729f --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp @@ -0,0 +1,2142 @@ +#include "GLGizmoMeasure.hpp" +#include "libslic3r/Color.hpp" +#include "libslic3r/Format/STL.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp" + + +#include "libslic3r/PresetBundle.hpp" +#include "libslic3r/MeasureUtils.hpp" + +#include + +#include + +#include + +#include + +namespace Slic3r { +namespace GUI { + +static const Slic3r::ColorRGBA SELECTED_1ST_COLOR = { 0.25f, 0.75f, 0.75f, 1.0f }; +static const Slic3r::ColorRGBA SELECTED_2ND_COLOR = { 0.75f, 0.25f, 0.75f, 1.0f }; +static const Slic3r::ColorRGBA NEUTRAL_COLOR = { 0.5f, 0.5f, 0.5f, 1.0f }; + +static const int POINT_ID = 100; +static const int EDGE_ID = 200; +static const int CIRCLE_ID = 300; +static const int PLANE_ID = 400; +static const int SEL_SPHERE_1_ID = 501; +static const int SEL_SPHERE_2_ID = 502; + +static const float TRIANGLE_BASE = 10.0f; +static const float TRIANGLE_HEIGHT = TRIANGLE_BASE * 1.618033f; + +const auto SELECTED_COLOR = ColorRGBA::BLUE(); +static const std::string CTRL_STR = +#ifdef __APPLE__ +"⌘" +#else +"Ctrl" +#endif //__APPLE__ +; + +static std::string format_double(double value) +{ + char buf[1024]; + sprintf(buf, "%.3f", value); + return std::string(buf); +} + +static std::string format_vec3(const Vec3d& v) +{ + char buf[1024]; + sprintf(buf, "X: %.3f, Y: %.3f, Z: %.3f", v.x(), v.y(), v.z()); + return std::string(buf); +} + +static std::string surface_feature_type_as_string(Measure::SurfaceFeatureType type) +{ + switch (type) + { + default: + case Measure::SurfaceFeatureType::Undef: { return ("No feature"); } + case Measure::SurfaceFeatureType::Point: { return _u8L("Vertex"); } + case Measure::SurfaceFeatureType::Edge: { return _u8L("Edge"); } + case Measure::SurfaceFeatureType::Circle: { return _u8L("Circle"); } + case Measure::SurfaceFeatureType::Plane: { return _u8L("Plane"); } + } +} + +static std::string point_on_feature_type_as_string(Measure::SurfaceFeatureType type, int hover_id) +{ + std::string ret; + switch (type) { + case Measure::SurfaceFeatureType::Point: { ret = _u8L("Vertex"); break; } + case Measure::SurfaceFeatureType::Edge: { ret = _u8L("Point on edge"); break; } + case Measure::SurfaceFeatureType::Circle: { ret = _u8L("Point on circle"); break; } + case Measure::SurfaceFeatureType::Plane: { ret = _u8L("Point on plane"); break; } + default: { assert(false); break; } + } + return ret; +} + +static std::string center_on_feature_type_as_string(Measure::SurfaceFeatureType type) +{ + std::string ret; + switch (type) { + case Measure::SurfaceFeatureType::Edge: { ret = _u8L("Center of edge"); break; } + case Measure::SurfaceFeatureType::Circle: { ret = _u8L("Center of circle"); break; } + default: { assert(false); break; } + } + return ret; +} + +static GLModel::Geometry init_plane_data(const indexed_triangle_set& its, const std::vector& triangle_indices) +{ + GLModel::Geometry init_data; + init_data.format = { GUI::GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + unsigned int i = 0; + for (int idx : triangle_indices) { + const Vec3f& v0 = its.vertices[its.indices[idx][0]]; + const Vec3f& v1 = its.vertices[its.indices[idx][1]]; + const Vec3f& v2 = its.vertices[its.indices[idx][2]]; + + const Vec3f n = (v1 - v0).cross(v2 - v0).normalized(); + init_data.add_vertex(v0, n); + init_data.add_vertex(v1, n); + init_data.add_vertex(v2, n); + init_data.add_triangle(i, i + 1, i + 2); + i += 3; + } + + return init_data; +} + +static GLModel::Geometry init_torus_data(unsigned int primary_resolution, unsigned int secondary_resolution, const Vec3f& center, + float radius, float thickness, const Vec3f& model_axis, const Transform3f& world_trafo) +{ + const unsigned int torus_sector_count = std::max(4, primary_resolution); + const unsigned int section_sector_count = std::max(4, secondary_resolution); + const float torus_sector_step = 2.0f * float(M_PI) / float(torus_sector_count); + const float section_sector_step = 2.0f * float(M_PI) / float(section_sector_count); + + GLModel::Geometry data; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices(torus_sector_count * section_sector_count); + data.reserve_indices(torus_sector_count * section_sector_count * 2 * 3); + + // vertices + const Transform3f local_to_world_matrix = world_trafo * Geometry::translation_transform(center.cast()).cast() * + Eigen::Quaternion::FromTwoVectors(Vec3f::UnitZ(), model_axis); + for (unsigned int i = 0; i < torus_sector_count; ++i) { + const float section_angle = torus_sector_step * i; + const Vec3f radius_dir(std::cos(section_angle), std::sin(section_angle), 0.0f); + const Vec3f local_section_center = radius * radius_dir; + const Vec3f world_section_center = local_to_world_matrix * local_section_center; + const Vec3f local_section_normal = local_section_center.normalized().cross(Vec3f::UnitZ()).normalized(); + const Vec3f world_section_normal = (Vec3f)(local_to_world_matrix.matrix().block(0, 0, 3, 3) * local_section_normal).normalized(); + const Vec3f base_v = thickness * radius_dir; + for (unsigned int j = 0; j < section_sector_count; ++j) { + const Vec3f v = Eigen::AngleAxisf(section_sector_step * j, world_section_normal) * base_v; + data.add_vertex(world_section_center + v, (Vec3f)v.normalized()); + } + } + + // triangles + for (unsigned int i = 0; i < torus_sector_count; ++i) { + const unsigned int ii = i * section_sector_count; + const unsigned int ii_next = ((i + 1) % torus_sector_count) * section_sector_count; + for (unsigned int j = 0; j < section_sector_count; ++j) { + const unsigned int j_next = (j + 1) % section_sector_count; + const unsigned int i0 = ii + j; + const unsigned int i1 = ii_next + j; + const unsigned int i2 = ii_next + j_next; + const unsigned int i3 = ii + j_next; + data.add_triangle(i0, i1, i2); + data.add_triangle(i0, i2, i3); + } + } + + return data; +} + +static bool is_feature_with_center(const Measure::SurfaceFeature& feature) +{ + const Measure::SurfaceFeatureType type = feature.get_type(); + return (type == Measure::SurfaceFeatureType::Circle || (type == Measure::SurfaceFeatureType::Edge && feature.get_extra_point().has_value())); +} + +static Vec3d get_feature_offset(const Measure::SurfaceFeature& feature) +{ + Vec3d ret; + switch (feature.get_type()) + { + case Measure::SurfaceFeatureType::Circle: + { + const auto [center, radius, normal] = feature.get_circle(); + ret = center; + break; + } + case Measure::SurfaceFeatureType::Edge: + { + std::optional p = feature.get_extra_point(); + assert(p.has_value()); + ret = *p; + break; + } + case Measure::SurfaceFeatureType::Point: + { + ret = feature.get_point(); + break; + } + default: { assert(false); } + } + + return ret; +} + +class TransformHelper +{ + struct Cache + { + std::array viewport; + Matrix4d ndc_to_ss_matrix; + Transform3d ndc_to_ss_matrix_inverse; + }; + + static Cache s_cache; + +public: + static Vec3d model_to_world(const Vec3d& model, const Transform3d& world_matrix) { + return world_matrix * model; + } + + static Vec4d world_to_clip(const Vec3d& world, const Matrix4d& projection_view_matrix) { + return projection_view_matrix * Vec4d(world.x(), world.y(), world.z(), 1.0); + } + + static Vec3d clip_to_ndc(const Vec4d& clip) { + return Vec3d(clip.x(), clip.y(), clip.z()) / clip.w(); + } + + static Vec2d ndc_to_ss(const Vec3d& ndc, const std::array& viewport) { + const double half_w = 0.5 * double(viewport[2]); + const double half_h = 0.5 * double(viewport[3]); + return { half_w * ndc.x() + double(viewport[0]) + half_w, half_h * ndc.y() + double(viewport[1]) + half_h }; + }; + + static Vec4d model_to_clip(const Vec3d& model, const Transform3d& world_matrix, const Matrix4d& projection_view_matrix) { + return world_to_clip(model_to_world(model, world_matrix), projection_view_matrix); + } + + static Vec3d model_to_ndc(const Vec3d& model, const Transform3d& world_matrix, const Matrix4d& projection_view_matrix) { + return clip_to_ndc(world_to_clip(model_to_world(model, world_matrix), projection_view_matrix)); + } + + static Vec2d model_to_ss(const Vec3d& model, const Transform3d& world_matrix, const Matrix4d& projection_view_matrix, const std::array& viewport) { + return ndc_to_ss(clip_to_ndc(world_to_clip(model_to_world(model, world_matrix), projection_view_matrix)), viewport); + } + + static Vec2d world_to_ss(const Vec3d& world, const Matrix4d& projection_view_matrix, const std::array& viewport) { + return ndc_to_ss(clip_to_ndc(world_to_clip(world, projection_view_matrix)), viewport); + } + + static const Matrix4d& ndc_to_ss_matrix(const std::array& viewport) { + update(viewport); + return s_cache.ndc_to_ss_matrix; + } + + static const Transform3d ndc_to_ss_matrix_inverse(const std::array& viewport) { + update(viewport); + return s_cache.ndc_to_ss_matrix_inverse; + } + +private: + static void update(const std::array& viewport) { + if (s_cache.viewport == viewport) + return; + + const double half_w = 0.5 * double(viewport[2]); + const double half_h = 0.5 * double(viewport[3]); + s_cache.ndc_to_ss_matrix << half_w, 0.0, 0.0, double(viewport[0]) + half_w, + 0.0, half_h, 0.0, double(viewport[1]) + half_h, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0; + + s_cache.ndc_to_ss_matrix_inverse = s_cache.ndc_to_ss_matrix.inverse(); + s_cache.viewport = viewport; + } +}; + +TransformHelper::Cache TransformHelper::s_cache = { { 0, 0, 0, 0 }, Matrix4d::Identity(), Transform3d::Identity() }; + +GLGizmoMeasure::GLGizmoMeasure(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) +: GLGizmoBase(parent, icon_filename, sprite_id) +{ + GLModel::Geometry sphere_geometry = smooth_sphere(16, 7.5f); + m_sphere.mesh_raycaster = std::make_unique(TriangleMesh(sphere_geometry.get_as_indexed_triangle_set())); + m_sphere.model.init_from(sphere_geometry); + + GLModel::Geometry cylinder_geometry = smooth_cylinder(16, 5.0f, 1.0f); + m_cylinder.mesh_raycaster = std::make_unique(TriangleMesh(cylinder_geometry.get_as_indexed_triangle_set())); + m_cylinder.model.init_from(cylinder_geometry); +} + +bool GLGizmoMeasure::on_mouse(const wxMouseEvent &mouse_event) +{ + m_mouse_pos = { double(mouse_event.GetX()), double(mouse_event.GetY()) }; + + if (mouse_event.Moving()) { + // only for sure + m_mouse_left_down = false; + return false; + } + else if (mouse_event.Dragging()) { + // Enable/Disable panning/rotating the 3D scene + // Ctrl is pressed or the mouse is not hovering a selected volume + bool unlock_dragging = mouse_event.CmdDown() || (m_hover_id == -1 && !m_parent.get_selection().contains_volume(m_parent.get_first_hover_volume_idx())); + // mode is not center selection or mouse is not hovering a center + unlock_dragging &= !mouse_event.ShiftDown() || (m_hover_id != SEL_SPHERE_1_ID && m_hover_id != SEL_SPHERE_2_ID && m_hover_id != POINT_ID); + return !unlock_dragging; + } + else if (mouse_event.LeftDown()) { + // let the event pass through to allow panning/rotating the 3D scene + if (mouse_event.CmdDown()) + return false; + + if (m_hover_id != -1) { + m_mouse_left_down = true; + + auto detect_current_item = [this]() { + SelectedFeatures::Item item; + if (m_hover_id == SEL_SPHERE_1_ID) { + if (m_selected_features.first.is_center) + // mouse is hovering over a selected center + item = { true, m_selected_features.first.source, { Measure::SurfaceFeature(get_feature_offset(*m_selected_features.first.source)) } }; + else if (is_feature_with_center(*m_selected_features.first.feature)) + // mouse is hovering over a unselected center + item = { true, m_selected_features.first.feature, { Measure::SurfaceFeature(get_feature_offset(*m_selected_features.first.feature)) } }; + else + // mouse is hovering over a point + item = m_selected_features.first; + } + else if (m_hover_id == SEL_SPHERE_2_ID) { + if (m_selected_features.second.is_center) + // mouse is hovering over a selected center + item = { true, m_selected_features.second.source, { Measure::SurfaceFeature(get_feature_offset(*m_selected_features.second.source)) } }; + else if (is_feature_with_center(*m_selected_features.second.feature)) + // mouse is hovering over a center + item = { true, m_selected_features.second.feature, { Measure::SurfaceFeature(get_feature_offset(*m_selected_features.second.feature)) } }; + else + // mouse is hovering over a point + item = m_selected_features.second; + } + else { + switch (m_mode) + { + case EMode::FeatureSelection: { item = { false, m_curr_feature, m_curr_feature }; break; } + case EMode::PointSelection: { item = { false, m_curr_feature, Measure::SurfaceFeature(*m_curr_point_on_feature_position) }; break; } + } + } + return item; + }; + + auto requires_sphere_raycaster_for_picking = [this](const SelectedFeatures::Item& item) { + if (m_mode == EMode::PointSelection || item.feature->get_type() == Measure::SurfaceFeatureType::Point) + return true; + else if (m_mode == EMode::FeatureSelection) { + if (is_feature_with_center(*item.feature)) + return true; + } + return false; + }; + + if (m_selected_features.first.feature.has_value()) { + const SelectedFeatures::Item item = detect_current_item(); + if (m_selected_features.first != item) { + bool processed = false; + if (item.is_center) { + if (item.source == m_selected_features.first.feature) { + // switch 1st selection from feature to its center + m_selected_features.first = item; + processed = true; + } + else if (item.source == m_selected_features.second.feature) { + // switch 2nd selection from feature to its center + m_selected_features.second = item; + processed = true; + } + } + else if (is_feature_with_center(*item.feature)) { + if (m_selected_features.first.is_center && m_selected_features.first.source == item.feature) { + // switch 1st selection from center to its feature + m_selected_features.first = item; + processed = true; + } + else if (m_selected_features.second.is_center && m_selected_features.second.source == item.feature) { + // switch 2nd selection from center to its feature + m_selected_features.second = item; + processed = true; + } + } + + if (!processed) { + remove_selected_sphere_raycaster(SEL_SPHERE_2_ID); + if (m_selected_features.second == item) + // 2nd feature deselection + m_selected_features.second.reset(); + else { + // 2nd feature selection + m_selected_features.second = item; + if (requires_sphere_raycaster_for_picking(item)) + m_selected_sphere_raycasters.push_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, SEL_SPHERE_2_ID, *m_sphere.mesh_raycaster)); + } + } + } + else { + remove_selected_sphere_raycaster(SEL_SPHERE_1_ID); + if (m_selected_features.second.feature.has_value()) { + // promote 2nd feature to 1st feature + remove_selected_sphere_raycaster(SEL_SPHERE_2_ID); + m_selected_features.first = m_selected_features.second; + if (requires_sphere_raycaster_for_picking(m_selected_features.first)) + m_selected_sphere_raycasters.push_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, SEL_SPHERE_1_ID, *m_sphere.mesh_raycaster)); + m_selected_features.second.reset(); + } + else + // 1st feature deselection + m_selected_features.first.reset(); + } + } + else { + // 1st feature selection + const SelectedFeatures::Item item = detect_current_item(); + m_selected_features.first = item; + if (requires_sphere_raycaster_for_picking(item)) + m_selected_sphere_raycasters.push_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, SEL_SPHERE_1_ID, *m_sphere.mesh_raycaster)); + } + + update_measurement_result(); + + m_imgui->set_requires_extra_frame(); + + return true; + } + else + // if the mouse pointer is on any volume, filter out the event to prevent the user to move it + // equivalent tp: return (m_parent.get_first_hover_volume_idx() != -1); + return m_curr_feature.has_value(); + + // fix: prevent restart gizmo when reselect object + // take responsibility for left up + if (m_parent.get_first_hover_volume_idx() >= 0) + m_mouse_left_down = true; + } + else if (mouse_event.LeftUp()) { + if (m_mouse_left_down) { + // responsible for mouse left up after selecting plane + m_mouse_left_down = false; + return true; + } + if (m_hover_id == -1 && !m_parent.is_mouse_dragging()) + // avoid closing the gizmo if the user clicks outside of any volume + return true; + } + else if (mouse_event.RightDown()) { + // let the event pass through to allow panning/rotating the 3D scene + if (mouse_event.CmdDown()) + return false; + } + else if (mouse_event.Leaving()) + m_mouse_left_down = false; + + return false; +} + +void GLGizmoMeasure::data_changed(bool is_serializing) +{ + m_parent.toggle_sla_auxiliaries_visibility(false, nullptr, -1); + + update_if_needed(); + + m_last_inv_zoom = 0.0f; + m_last_plane_idx = -1; + if (m_pending_scale) { + update_measurement_result(); + m_pending_scale = false; + } + else + m_selected_features.reset(); + m_selected_sphere_raycasters.clear(); + m_editing_distance = false; + m_is_editing_distance_first_frame = true; +} + +bool GLGizmoMeasure::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down) +{ + if (action == SLAGizmoEventType::ShiftDown) { + if (m_shift_kar_filter.is_first()) { + m_mode = EMode::PointSelection; + disable_scene_raycasters(); + } + m_shift_kar_filter.increase_count(); + } + else if (action == SLAGizmoEventType::ShiftUp) { + m_shift_kar_filter.reset_count(); + m_mode = EMode::FeatureSelection; + restore_scene_raycasters_state(); + } + else if (action == SLAGizmoEventType::Delete) { + m_selected_features.reset(); + m_selected_sphere_raycasters.clear(); + m_parent.request_extra_frame(); + } + else if (action == SLAGizmoEventType::Escape) { + if (!m_selected_features.first.feature.has_value()) { + update_measurement_result(); + return false; + } + else { + if (m_selected_features.second.feature.has_value()) { + remove_selected_sphere_raycaster(SEL_SPHERE_2_ID); + m_selected_features.second.feature.reset(); + } + else { + remove_selected_sphere_raycaster(SEL_SPHERE_1_ID); + m_selected_features.first.feature.reset(); + } + + update_measurement_result(); + } + } + + return true; +} + +bool GLGizmoMeasure::on_init() +{ + m_shortcut_key = WXK_CONTROL_U; + return true; +} + +void GLGizmoMeasure::on_set_state() +{ + if (m_state == Off) { + m_parent.toggle_sla_auxiliaries_visibility(true, nullptr, -1); + m_shift_kar_filter.reset_count(); + m_curr_feature.reset(); + m_curr_point_on_feature_position.reset(); + restore_scene_raycasters_state(); + m_editing_distance = false; + m_is_editing_distance_first_frame = true; + m_measuring.reset(); + m_raycaster.reset(); + } + else { + m_mode = EMode::FeatureSelection; + // store current state of scene raycaster for later use + m_scene_raycasters.clear(); + auto scene_raycasters = m_parent.get_raycasters_for_picking(SceneRaycaster::EType::Volume); + if (scene_raycasters != nullptr) { + m_scene_raycasters.reserve(scene_raycasters->size()); + for (auto r : *scene_raycasters) { + SceneRaycasterState state = { r, r->is_active() }; + m_scene_raycasters.emplace_back(state); + } + } + } +} + +std::string GLGizmoMeasure::on_get_name() const +{ + return _u8L("Measure"); +} + +bool GLGizmoMeasure::on_is_activable() const +{ + const Selection& selection = m_parent.get_selection(); + bool res = (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA) ? + selection.is_single_full_instance() : + selection.is_single_full_instance() || selection.is_single_volume() || selection.is_single_modifier(); + if (res) + res &= !selection.contains_sinking_volumes(); + + return res; +} + +void GLGizmoMeasure::on_render() +{ +#if ENABLE_MEASURE_GIZMO_DEBUG + render_debug_dialog(); +#endif // ENABLE_MEASURE_GIZMO_DEBUG + +// // do not render if the user is panning/rotating the 3d scene +// if (m_parent.is_mouse_dragging()) +// return; + + update_if_needed(); + + const Camera& camera = wxGetApp().plater()->get_camera(); + const float inv_zoom = (float)camera.get_inv_zoom(); + + Vec3f position_on_model; + Vec3f normal_on_model; + size_t model_facet_idx; + const bool mouse_on_object = m_raycaster->unproject_on_mesh(m_mouse_pos, Transform3d::Identity(), camera, position_on_model, normal_on_model, nullptr, &model_facet_idx); + const bool is_hovering_on_feature = m_mode == EMode::PointSelection && m_hover_id != -1; + + auto update_circle = [this, inv_zoom]() { + if (m_last_inv_zoom != inv_zoom || m_last_circle != m_curr_feature) { + m_last_inv_zoom = inv_zoom; + m_last_circle = m_curr_feature; + m_circle.reset(); + const auto [center, radius, normal] = m_curr_feature->get_circle(); + GLModel::Geometry circle_geometry = init_torus_data(64, 16, center.cast(), float(radius), 5.0f * inv_zoom, normal.cast(), Transform3f::Identity()); + m_circle.mesh_raycaster = std::make_unique(TriangleMesh(circle_geometry.get_as_indexed_triangle_set())); + m_circle.model.init_from(circle_geometry); + return true; + } + return false; + }; + + if (m_mode == EMode::FeatureSelection || m_mode == EMode::PointSelection) { + if (m_hover_id == SEL_SPHERE_1_ID || m_hover_id == SEL_SPHERE_2_ID) { + // Skip feature detection if hovering on a selected point/center + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, POINT_ID); + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, EDGE_ID); + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, PLANE_ID); + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, CIRCLE_ID); + m_curr_feature.reset(); + m_curr_point_on_feature_position.reset(); + } + else { + std::optional curr_feature = wxGetMouseState().LeftIsDown() ? m_curr_feature : + mouse_on_object ? m_measuring->get_feature(model_facet_idx, position_on_model.cast()) : std::nullopt; + + if (m_curr_feature != curr_feature || + (curr_feature.has_value() && curr_feature->get_type() == Measure::SurfaceFeatureType::Circle && (m_curr_feature != curr_feature || m_last_inv_zoom != inv_zoom))) { + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, POINT_ID); + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, EDGE_ID); + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, PLANE_ID); + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, CIRCLE_ID); + m_raycasters.clear(); + m_curr_feature = curr_feature; + if (!m_curr_feature.has_value()) + return; + + switch (m_curr_feature->get_type()) { + default: { assert(false); break; } + case Measure::SurfaceFeatureType::Point: + { + m_raycasters.insert({ POINT_ID, m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, POINT_ID, *m_sphere.mesh_raycaster) }); + break; + } + case Measure::SurfaceFeatureType::Edge: + { + m_raycasters.insert({ EDGE_ID, m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, EDGE_ID, *m_cylinder.mesh_raycaster) }); + break; + } + case Measure::SurfaceFeatureType::Circle: + { + update_circle(); + m_raycasters.insert({ CIRCLE_ID, m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, CIRCLE_ID, *m_circle.mesh_raycaster) }); + break; + } + case Measure::SurfaceFeatureType::Plane: + { + const auto [idx, normal, point] = m_curr_feature->get_plane(); + if (m_last_plane_idx != idx) { + m_last_plane_idx = idx; + const indexed_triangle_set& its = m_measuring->get_mesh().its; + const std::vector& plane_triangles = m_measuring->get_plane_triangle_indices(idx); + GLModel::Geometry init_data = init_plane_data(its, plane_triangles); + m_plane.reset(); + m_plane.mesh_raycaster = std::make_unique(TriangleMesh(init_data.get_as_indexed_triangle_set())); + } + + m_raycasters.insert({ PLANE_ID, m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, PLANE_ID, *m_plane.mesh_raycaster) }); + break; + } + } + } + } + } + + if (m_mode != EMode::PointSelection) + m_curr_point_on_feature_position.reset(); + else if (is_hovering_on_feature) { + auto position_on_feature = [this](int feature_type_id, const Camera& camera, std::function callback = nullptr) -> Vec3d { + auto it = m_raycasters.find(feature_type_id); + if (it != m_raycasters.end() && it->second != nullptr) { + Vec3f p; + Vec3f n; + const Transform3d& trafo = it->second->get_transform(); + bool res = it->second->get_raycaster()->closest_hit(m_mouse_pos, trafo, camera, p, n); + if (res) { + if (callback) + p = callback(p); + return trafo * p.cast(); + } + } + return Vec3d(DBL_MAX, DBL_MAX, DBL_MAX); + }; + + if (m_curr_feature.has_value()) { + switch (m_curr_feature->get_type()) + { + default: { assert(false); break; } + case Measure::SurfaceFeatureType::Point: + { + m_curr_point_on_feature_position = m_curr_feature->get_point(); + break; + } + case Measure::SurfaceFeatureType::Edge: + { + const std::optional extra = m_curr_feature->get_extra_point(); + if (extra.has_value() && m_hover_id == POINT_ID) + m_curr_point_on_feature_position = *extra; + else { + const Vec3d pos = position_on_feature(EDGE_ID, camera, [](const Vec3f& v) { return Vec3f(0.0f, 0.0f, v.z()); }); + if (!pos.isApprox(Vec3d(DBL_MAX, DBL_MAX, DBL_MAX))) + m_curr_point_on_feature_position = pos; + } + break; + } + case Measure::SurfaceFeatureType::Plane: + { + m_curr_point_on_feature_position = position_on_feature(PLANE_ID, camera); + break; + } + case Measure::SurfaceFeatureType::Circle: + { + const auto [center, radius, normal] = m_curr_feature->get_circle(); + if (m_hover_id == POINT_ID) + m_curr_point_on_feature_position = center; + else { + const Vec3d world_pof = position_on_feature(CIRCLE_ID, camera, [](const Vec3f& v) { return v; }); + const Eigen::Hyperplane plane(normal, center); + const Transform3d local_to_model_matrix = Geometry::translation_transform(center) * Eigen::Quaternion::FromTwoVectors(Vec3d::UnitZ(), normal); + const Vec3d local_proj = local_to_model_matrix.inverse() * plane.projection(world_pof); + double angle = std::atan2(local_proj.y(), local_proj.x()); + if (angle < 0.0) + angle += 2.0 * double(M_PI); + + const Vec3d local_pos = radius * Vec3d(std::cos(angle), std::sin(angle), 0.0); + m_curr_point_on_feature_position = local_to_model_matrix * local_pos; + } + break; + } + } + } + } + else { + m_curr_point_on_feature_position.reset(); + if (m_curr_feature.has_value() && m_curr_feature->get_type() == Measure::SurfaceFeatureType::Circle) { + if (update_circle()) { + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, CIRCLE_ID); + auto it = m_raycasters.find(CIRCLE_ID); + if (it != m_raycasters.end()) + m_raycasters.erase(it); + m_raycasters.insert({ CIRCLE_ID, m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, CIRCLE_ID, *m_circle.mesh_raycaster) }); + } + } + } + + if (!m_curr_feature.has_value() && !m_selected_features.first.feature.has_value()) + return; + + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + if (shader == nullptr) + return; + + shader->start_using(); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + + glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); + glsafe(::glEnable(GL_DEPTH_TEST)); + const bool old_cullface = ::glIsEnabled(GL_CULL_FACE); + glsafe(::glDisable(GL_CULL_FACE)); + + const Transform3d& view_matrix = camera.get_view_matrix(); + + auto set_matrix_uniforms = [shader, &view_matrix](const Transform3d& model_matrix) { + const Transform3d view_model_matrix = view_matrix * model_matrix; + shader->set_uniform("view_model_matrix", view_model_matrix); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); + }; + + auto set_emission_uniform = [shader](const ColorRGBA& color, bool hover) { + shader->set_uniform("emission_factor", (color == SELECTED_COLOR) ? 0.0f : + hover ? 0.5f : 0.25f); + }; + + auto render_feature = [this, set_matrix_uniforms, set_emission_uniform](const Measure::SurfaceFeature& feature, const std::vector& colors, + float inv_zoom, bool hover, bool update_raycasters_transform) { + switch (feature.get_type()) + { + default: { assert(false); break; } + case Measure::SurfaceFeatureType::Point: + { + const Transform3d feature_matrix = Geometry::translation_transform(feature.get_point()) * Geometry::scale_transform(inv_zoom); + set_matrix_uniforms(feature_matrix); + set_emission_uniform(colors.front(), hover); + m_sphere.model.set_color(-1, colors.front().data_array()); + m_sphere.model.render(); + if (update_raycasters_transform) { + auto it = m_raycasters.find(POINT_ID); + if (it != m_raycasters.end() && it->second != nullptr) + it->second->set_transform(feature_matrix); + } + break; + } + case Measure::SurfaceFeatureType::Circle: + { + const auto& [center, radius, normal] = feature.get_circle(); + // render circle + const Transform3d circle_matrix = Transform3d::Identity(); + set_matrix_uniforms(circle_matrix); + if (update_raycasters_transform) { + set_emission_uniform(colors.front(), hover); + m_circle.model.set_color(-1, colors.front().data_array()); + m_circle.model.render(); + auto it = m_raycasters.find(CIRCLE_ID); + if (it != m_raycasters.end() && it->second != nullptr) + it->second->set_transform(circle_matrix); + } + else { + GLModel circle; + GLModel::Geometry circle_geometry = init_torus_data(64, 16, center.cast(), float(radius), 5.0f * inv_zoom, normal.cast(), Transform3f::Identity()); + circle.init_from(circle_geometry); + set_emission_uniform(colors.front(), hover); + circle.set_color(-1, colors.front().data_array()); + circle.render(); + } + // render center + if (colors.size() > 1) { + const Transform3d center_matrix = Geometry::translation_transform(center) * Geometry::scale_transform(inv_zoom); + set_matrix_uniforms(center_matrix); + set_emission_uniform(colors.back(), hover); + m_sphere.model.set_color(-1, colors.back().data_array()); + m_sphere.model.render(); + auto it = m_raycasters.find(POINT_ID); + if (it != m_raycasters.end() && it->second != nullptr) + it->second->set_transform(center_matrix); + } + break; + } + case Measure::SurfaceFeatureType::Edge: + { + const auto& [from, to] = feature.get_edge(); + // render edge + const Transform3d edge_matrix = Geometry::translation_transform(from) * + Eigen::Quaternion::FromTwoVectors(Vec3d::UnitZ(), to - from) * + Geometry::scale_transform({ (double)inv_zoom, (double)inv_zoom, (to - from).norm() }); + set_matrix_uniforms(edge_matrix); + set_emission_uniform(colors.front(), hover); + m_cylinder.model.set_color(-1, colors.front().data_array()); + m_cylinder.model.render(); + if (update_raycasters_transform) { + auto it = m_raycasters.find(EDGE_ID); + if (it != m_raycasters.end() && it->second != nullptr) + it->second->set_transform(edge_matrix); + } + + // render extra point + if (colors.size() > 1) { + const std::optional extra = feature.get_extra_point(); + if (extra.has_value()) { + const Transform3d point_matrix = Geometry::translation_transform(*extra) * Geometry::scale_transform(inv_zoom); + set_matrix_uniforms(point_matrix); + set_emission_uniform(colors.back(), hover); + m_sphere.model.set_color(-1, colors.back().data_array()); + m_sphere.model.render(); + auto it = m_raycasters.find(POINT_ID); + if (it != m_raycasters.end() && it->second != nullptr) + it->second->set_transform(point_matrix); + } + } + break; + } + case Measure::SurfaceFeatureType::Plane: + { + const auto& [idx, normal, pt] = feature.get_plane(); + assert(idx < m_plane_models_cache.size()); + set_matrix_uniforms(Transform3d::Identity()); + set_emission_uniform(colors.front(), hover); + m_plane_models_cache[idx].set_color(-1, colors.front().data_array()); + m_plane_models_cache[idx].render(); + if (update_raycasters_transform) { + auto it = m_raycasters.find(PLANE_ID); + if (it != m_raycasters.end() && it->second != nullptr) + it->second->set_transform(Transform3d::Identity()); + } + break; + } + } + }; + + auto hover_selection_color = [this]() { + return ((m_mode == EMode::PointSelection && !m_selected_features.first.feature.has_value()) || + (m_mode != EMode::PointSelection && (!m_selected_features.first.feature.has_value() || *m_curr_feature == *m_selected_features.first.feature))) ? + SELECTED_1ST_COLOR : SELECTED_2ND_COLOR; + }; + + auto hovering_color = [this, hover_selection_color]() { + return (m_mode == EMode::PointSelection) ? SELECTED_COLOR : hover_selection_color(); + }; + + if (m_curr_feature.has_value()) { + // render hovered feature + + std::vector colors; + if (m_selected_features.first.feature.has_value() && *m_curr_feature == *m_selected_features.first.feature) { + // hovering over the 1st selected feature + if (m_selected_features.first.is_center) + // hovering over a center + colors = { NEUTRAL_COLOR, hovering_color() }; + else if (is_feature_with_center(*m_selected_features.first.feature)) + // hovering over a feature with center + colors = { hovering_color(), NEUTRAL_COLOR }; + else + colors = { hovering_color() }; + } + else if (m_selected_features.second.feature.has_value() && *m_curr_feature == *m_selected_features.second.feature) { + // hovering over the 2nd selected feature + if (m_selected_features.second.is_center) + // hovering over a center + colors = { NEUTRAL_COLOR, hovering_color() }; + else if (is_feature_with_center(*m_selected_features.second.feature)) + // hovering over a feature with center + colors = { hovering_color(), NEUTRAL_COLOR }; + else + colors = { hovering_color() }; + } + else { + switch (m_curr_feature->get_type()) + { + default: { assert(false); break; } + case Measure::SurfaceFeatureType::Point: + { + colors.emplace_back(hover_selection_color()); + break; + } + case Measure::SurfaceFeatureType::Edge: + case Measure::SurfaceFeatureType::Circle: + { + if (m_selected_features.first.is_center && m_curr_feature == m_selected_features.first.source) + colors = { SELECTED_1ST_COLOR, NEUTRAL_COLOR }; + else if (m_selected_features.second.is_center && m_curr_feature == m_selected_features.second.source) + colors = { SELECTED_2ND_COLOR, NEUTRAL_COLOR }; + else + colors = { hovering_color(), hovering_color() }; + break; + } + case Measure::SurfaceFeatureType::Plane: + { + colors.emplace_back(hovering_color()); + break; + } + } + } + + render_feature(*m_curr_feature, colors, inv_zoom, true, true); + } + + if (m_selected_features.first.feature.has_value() && (!m_curr_feature.has_value() || *m_curr_feature != *m_selected_features.first.feature)) { + // render 1st selected feature + + std::optional feature_to_render; + std::vector colors; + bool requires_raycaster_update = false; + if (m_hover_id == SEL_SPHERE_1_ID && (m_selected_features.first.is_center || is_feature_with_center(*m_selected_features.first.feature))) { + // hovering over a center + feature_to_render = m_selected_features.first.source; + colors = { NEUTRAL_COLOR, SELECTED_1ST_COLOR }; + requires_raycaster_update = true; + } + else if (is_feature_with_center(*m_selected_features.first.feature)) { + // hovering over a feature with center + feature_to_render = m_selected_features.first.feature; + colors = { SELECTED_1ST_COLOR, NEUTRAL_COLOR }; + requires_raycaster_update = true; + } + else { + feature_to_render = m_selected_features.first.feature; + colors = { SELECTED_1ST_COLOR }; + requires_raycaster_update = m_selected_features.first.feature->get_type() == Measure::SurfaceFeatureType::Point; + } + + render_feature(*feature_to_render, colors, inv_zoom, m_hover_id == SEL_SPHERE_1_ID, false); + + if (requires_raycaster_update) { + auto it = std::find_if(m_selected_sphere_raycasters.begin(), m_selected_sphere_raycasters.end(), + [](std::shared_ptr item) { return SceneRaycaster::decode_id(SceneRaycaster::EType::Gizmo, item->get_id()) == SEL_SPHERE_1_ID; }); + if (it != m_selected_sphere_raycasters.end()) + (*it)->set_transform(Geometry::translation_transform(get_feature_offset(*m_selected_features.first.feature)) * Geometry::scale_transform(inv_zoom)); + } + } + + if (m_selected_features.second.feature.has_value() && (!m_curr_feature.has_value() || *m_curr_feature != *m_selected_features.second.feature)) { + // render 2nd selected feature + + std::optional feature_to_render; + std::vector colors; + bool requires_raycaster_update = false; + if (m_hover_id == SEL_SPHERE_2_ID && (m_selected_features.second.is_center || is_feature_with_center(*m_selected_features.second.feature))) { + // hovering over a center + feature_to_render = m_selected_features.second.source; + colors = { NEUTRAL_COLOR, SELECTED_2ND_COLOR }; + requires_raycaster_update = true; + } + else if (is_feature_with_center(*m_selected_features.second.feature)) { + // hovering over a feature with center + feature_to_render = m_selected_features.second.feature; + colors = { SELECTED_2ND_COLOR, NEUTRAL_COLOR }; + requires_raycaster_update = true; + } + else { + feature_to_render = m_selected_features.second.feature; + colors = { SELECTED_2ND_COLOR }; + requires_raycaster_update = m_selected_features.second.feature->get_type() == Measure::SurfaceFeatureType::Point; + } + + render_feature(*feature_to_render, colors, inv_zoom, m_hover_id == SEL_SPHERE_2_ID, false); + + if (requires_raycaster_update) { + auto it = std::find_if(m_selected_sphere_raycasters.begin(), m_selected_sphere_raycasters.end(), + [](std::shared_ptr item) { return SceneRaycaster::decode_id(SceneRaycaster::EType::Gizmo, item->get_id()) == SEL_SPHERE_2_ID; }); + if (it != m_selected_sphere_raycasters.end()) + (*it)->set_transform(Geometry::translation_transform(get_feature_offset(*m_selected_features.second.feature)) * Geometry::scale_transform(inv_zoom)); + } + } + + if (is_hovering_on_feature && m_curr_point_on_feature_position.has_value()) { + if (m_hover_id != POINT_ID) { + // render point on feature while SHIFT is pressed + const Transform3d matrix = Geometry::translation_transform(*m_curr_point_on_feature_position) * Geometry::scale_transform(inv_zoom); + set_matrix_uniforms(matrix); + const ColorRGBA color = hover_selection_color(); + set_emission_uniform(color, true); + m_sphere.model.set_color(-1, color.data_array()); + m_sphere.model.render(); + } + } + + shader->stop_using(); + + if (old_cullface) + glsafe(::glEnable(GL_CULL_FACE)); + + render_dimensioning(); +} + +void GLGizmoMeasure::update_if_needed() +{ + auto update_plane_models_cache = [this](const indexed_triangle_set& its) { + m_plane_models_cache.clear(); + for (int idx = 0; idx < m_measuring->get_num_of_planes(); ++idx) { + m_plane_models_cache.emplace_back(GLModel()); + GLModel::Geometry init_data = init_plane_data(its, m_measuring->get_plane_triangle_indices(idx)); + m_plane_models_cache.back().init_from(init_data); + } + }; + + auto do_update = [this, update_plane_models_cache](const std::vector& volumes_cache, const Selection& selection) { + TriangleMesh composite_mesh; + for (const auto& vol : volumes_cache) { +// if (selection.is_single_full_instance() && vol.volume->is_modifier()) +// continue; + + TriangleMesh volume_mesh = vol.volume->mesh(); + volume_mesh.transform(vol.world_trafo); + + if (vol.world_trafo.matrix().determinant() < 0.0) + volume_mesh.flip_triangles(); + + composite_mesh.merge(volume_mesh); + } + + m_measuring.reset(new Measure::Measuring(composite_mesh.its)); + update_plane_models_cache(m_measuring->get_mesh().its); + m_raycaster.reset(new MeshRaycaster(m_measuring->get_mesh())); + m_volumes_cache = volumes_cache; + }; + + const Selection& selection = m_parent.get_selection(); + if (selection.is_empty()) + return; + + const Selection::IndicesList& idxs = selection.get_volume_idxs(); + std::vector volumes_cache; + volumes_cache.reserve(idxs.size()); + for (unsigned int idx : idxs) { + const GLVolume* v = selection.get_volume(idx); + const int volume_idx = v->volume_idx(); + if (volume_idx < 0) + continue; + + const ModelObject* obj = selection.get_model()->objects[v->object_idx()]; + const ModelInstance* inst = obj->instances[v->instance_idx()]; + const ModelVolume* vol = obj->volumes[volume_idx]; + const VolumeCacheItem item = { + obj, inst, vol, + Geometry::translation_transform(selection.get_first_volume()->get_sla_shift_z() * Vec3d::UnitZ()) * inst->get_matrix() * vol->get_matrix() + }; + volumes_cache.emplace_back(item); + } + + if (m_state != On || volumes_cache.empty()) + return; + + if (m_measuring == nullptr || m_volumes_cache != volumes_cache) + do_update(volumes_cache, selection); +} + +void GLGizmoMeasure::disable_scene_raycasters() +{ + for (auto r : m_scene_raycasters) { + r.raycaster->set_active(false); + } +} + +void GLGizmoMeasure::restore_scene_raycasters_state() +{ + for (auto r : m_scene_raycasters) { + r.raycaster->set_active(r.state); + } +} + +void GLGizmoMeasure::render_dimensioning() +{ + static SelectedFeatures last_selected_features; + + if (!m_selected_features.first.feature.has_value()) + return; + + if (!m_selected_features.second.feature.has_value() && m_selected_features.first.feature->get_type() != Measure::SurfaceFeatureType::Circle) + return; + + GLShaderProgram* shader = wxGetApp().get_shader("flat"); + if (shader == nullptr) + return; + + auto point_point = [this, &shader](const Vec3d& v1, const Vec3d& v2, float distance) { + if ((v2 - v1).squaredNorm() < 0.000001 || distance < 0.001f) + return; + + const Camera& camera = wxGetApp().plater()->get_camera(); + const Matrix4d projection_view_matrix = camera.get_projection_matrix().matrix() * camera.get_view_matrix().matrix(); + const std::array& viewport = camera.get_viewport(); + + // screen coordinates + const Vec2d v1ss = TransformHelper::world_to_ss(v1, projection_view_matrix, viewport); + const Vec2d v2ss = TransformHelper::world_to_ss(v2, projection_view_matrix, viewport); + + if (v1ss.isApprox(v2ss)) + return; + + const Vec2d v12ss = v2ss - v1ss; + const double v12ss_len = v12ss.norm(); + + const bool overlap = v12ss_len - 2.0 * TRIANGLE_HEIGHT < 0.0; + + const auto q12ss = Eigen::Quaternion::FromTwoVectors(Vec3d::UnitX(), Vec3d(v12ss.x(), v12ss.y(), 0.0)); + const auto q21ss = Eigen::Quaternion::FromTwoVectors(Vec3d::UnitX(), Vec3d(-v12ss.x(), -v12ss.y(), 0.0)); + + shader->set_uniform("projection_matrix", Transform3d::Identity()); + + const Vec3d v1ss_3 = { v1ss.x(), v1ss.y(), 0.0 }; + const Vec3d v2ss_3 = { v2ss.x(), v2ss.y(), 0.0 }; + + const Transform3d ss_to_ndc_matrix = TransformHelper::ndc_to_ss_matrix_inverse(viewport); + +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_core_profile()) { + shader->stop_using(); + + shader = wxGetApp().get_shader("dashed_thick_lines"); + if (shader == nullptr) + return; + + shader->start_using(); + shader->set_uniform("projection_matrix", Transform3d::Identity()); + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 1.0f); + shader->set_uniform("gap_size", 0.0f); + } + else +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(2.0f)); + + // stem + shader->set_uniform("view_model_matrix", overlap ? + ss_to_ndc_matrix * Geometry::translation_transform(v1ss_3) * q12ss * Geometry::translation_transform(-2.0 * TRIANGLE_HEIGHT * Vec3d::UnitX()) * Geometry::scale_transform({ v12ss_len + 4.0 * TRIANGLE_HEIGHT, 1.0f, 1.0f }) : + ss_to_ndc_matrix * Geometry::translation_transform(v1ss_3) * q12ss * Geometry::scale_transform({ v12ss_len, 1.0f, 1.0f })); + m_dimensioning.line.set_color(-1, ColorRGBA::WHITE().data_array()); + m_dimensioning.line.render(); + +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_core_profile()) { + shader->stop_using(); + + shader = wxGetApp().get_shader("flat"); + if (shader == nullptr) + return; + + shader->start_using(); + } + else +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(1.0f)); + + // arrow 1 + shader->set_uniform("view_model_matrix", overlap ? + ss_to_ndc_matrix * Geometry::translation_transform(v1ss_3) * q12ss : + ss_to_ndc_matrix * Geometry::translation_transform(v1ss_3) * q21ss); + m_dimensioning.triangle.render(); + + // arrow 2 + shader->set_uniform("view_model_matrix", overlap ? + ss_to_ndc_matrix * Geometry::translation_transform(v2ss_3) * q21ss : + ss_to_ndc_matrix * Geometry::translation_transform(v2ss_3) * q12ss); + m_dimensioning.triangle.render(); + + const bool use_inches = wxGetApp().app_config->get("use_inches") == "1"; + const double curr_value = use_inches ? GizmoObjectManipulation::mm_to_in * distance : distance; + const std::string curr_value_str = format_double(curr_value); + const std::string units = use_inches ? _u8L("in") : _u8L("mm"); + const float value_str_width = 20.0f + ImGui::CalcTextSize(curr_value_str.c_str()).x; + static double edit_value = 0.0; + + const Vec2d label_position = 0.5 * (v1ss + v2ss); + m_imgui->set_next_window_pos(label_position.x(), viewport[3] - label_position.y(), ImGuiCond_Always, 0.0f, 1.0f); + m_imgui->set_next_window_bg_alpha(0.0f); + + if (!m_editing_distance) { + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, { 1.0f, 1.0f }); + m_imgui->begin(std::string("distance"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration); + ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); + ImGui::AlignTextToFramePadding(); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + const ImVec2 pos = ImGui::GetCursorScreenPos(); + const std::string txt = curr_value_str + " " + units; + ImVec2 txt_size = ImGui::CalcTextSize(txt.c_str()); + const ImGuiStyle& style = ImGui::GetStyle(); + draw_list->AddRectFilled({ pos.x - style.FramePadding.x, pos.y + style.FramePadding.y }, { pos.x + txt_size.x + 2.0f * style.FramePadding.x , pos.y + txt_size.y + 2.0f * style.FramePadding.y }, + ImGuiWrapper::to_ImU32(ColorRGBA(0.5f, 0.5f, 0.5f, 0.5f))); + ImGui::SetCursorScreenPos({ pos.x + style.FramePadding.x, pos.y }); + m_imgui->text(txt); + ImGui::SameLine(); + if (m_imgui->image_button(ImGui::SliderFloatEditBtnIcon, _L("Edit to scale"))) { + m_editing_distance = true; + edit_value = curr_value; + m_imgui->requires_extra_frame(); + } + m_imgui->end(); + ImGui::PopStyleVar(3); + } + + if (m_editing_distance && !ImGui::IsPopupOpen("distance_popup")) + ImGui::OpenPopup("distance_popup"); + + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, { 1.0f, 1.0f }); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, { 4.0f, 0.0f }); + if (ImGui::BeginPopupModal("distance_popup", nullptr, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration)) { + auto perform_scale = [this](double new_value, double old_value) { + if (new_value == old_value || new_value <= 0.0) + return; + + const double ratio = new_value / old_value; + wxGetApp().plater()->take_snapshot("Scale"); + + struct TrafoData + { + double ratio; + Vec3d old_pivot; + Vec3d new_pivot; + Transform3d scale_matrix; + + TrafoData(double ratio, const Vec3d& old_pivot, const Vec3d& new_pivot) { + this->ratio = ratio; + this->scale_matrix = Geometry::scale_transform(ratio); + this->old_pivot = old_pivot; + this->new_pivot = new_pivot; + } + + Vec3d transform(const Vec3d& point) const { return this->scale_matrix * (point - this->old_pivot) + this->new_pivot; } + }; + + auto scale_feature = [](Measure::SurfaceFeature& feature, const TrafoData& trafo_data) { + switch (feature.get_type()) + { + case Measure::SurfaceFeatureType::Point: + { + feature = Measure::SurfaceFeature(trafo_data.transform(feature.get_point())); + break; + } + case Measure::SurfaceFeatureType::Edge: + { + const auto [from, to] = feature.get_edge(); + const std::optional extra = feature.get_extra_point(); + const std::optional new_extra = extra.has_value() ? trafo_data.transform(*extra) : extra; + feature = Measure::SurfaceFeature(Measure::SurfaceFeatureType::Edge, trafo_data.transform(from), trafo_data.transform(to), new_extra); + break; + } + case Measure::SurfaceFeatureType::Circle: + { + const auto [center, radius, normal] = feature.get_circle(); + feature = Measure::SurfaceFeature(Measure::SurfaceFeatureType::Circle, trafo_data.transform(center), normal, std::nullopt, trafo_data.ratio * radius); + break; + } + case Measure::SurfaceFeatureType::Plane: + { + const auto [idx, normal, origin] = feature.get_plane(); + feature = Measure::SurfaceFeature(Measure::SurfaceFeatureType::Plane, normal, trafo_data.transform(origin), std::nullopt, idx); + break; + } + default: { break; } + } + }; + + // apply scale + TransformationType type; + type.set_world(); + type.set_relative(); + type.set_joint(); + + // scale selection + Selection& selection = m_parent.get_selection(); + const Vec3d old_center = selection.get_bounding_box().center(); + selection.setup_cache(); + selection.scale(ratio * Vec3d::Ones(), type); + wxGetApp().plater()->canvas3D()->do_scale(""); // avoid storing another snapshot + // ORCA TODO + // wxGetApp().obj_manipul()->set_dirty(); + + // scale dimensioning + const Vec3d new_center = selection.get_bounding_box().center(); + const TrafoData trafo_data(ratio, old_center, new_center); + scale_feature(*m_selected_features.first.feature, trafo_data); + if (m_selected_features.second.feature.has_value()) + scale_feature(*m_selected_features.second.feature, trafo_data); + + // update measure on next call to data_changed() + m_pending_scale = true; + }; + auto action_exit = [this]() { + m_editing_distance = false; + m_is_editing_distance_first_frame = true; + ImGui::CloseCurrentPopup(); + }; + auto action_scale = [perform_scale, action_exit](double new_value, double old_value) { + perform_scale(new_value, old_value); + action_exit(); + }; + + // ORCA TODO + // m_imgui->disable_background_fadeout_animation(); + ImGui::PushItemWidth(value_str_width); + if (ImGui::InputDouble("##distance", &edit_value, 0.0f, 0.0f, "%.3f")) { + } + + // trick to auto-select text in the input widgets on 1st frame + if (m_is_editing_distance_first_frame) { + ImGui::SetKeyboardFocusHere(0); + m_is_editing_distance_first_frame = false; + m_imgui->set_requires_extra_frame(); + } + + // handle keys input + if (ImGui::IsKeyPressedMap(ImGuiKey_Enter) || ImGui::IsKeyPressedMap(ImGuiKey_KeyPadEnter)) + action_scale(edit_value, curr_value); + else if (ImGui::IsKeyPressedMap(ImGuiKey_Escape)) + action_exit(); + + ImGui::SameLine(); + if (m_imgui->button(_CTX(L_CONTEXT("Scale", "Verb"), "Verb"))) + action_scale(edit_value, curr_value); + ImGui::SameLine(); + if (m_imgui->button(_L("Cancel"))) + action_exit(); + ImGui::EndPopup(); + } + ImGui::PopStyleVar(4); + }; + + auto point_edge = [this, shader](const Measure::SurfaceFeature& f1, const Measure::SurfaceFeature& f2) { + assert(f1.get_type() == Measure::SurfaceFeatureType::Point && f2.get_type() == Measure::SurfaceFeatureType::Edge); + std::pair e = f2.get_edge(); + const Vec3d v_proj = m_measurement_result.distance_infinite->to; + const Vec3d e1e2 = e.second - e.first; + const Vec3d v_proje1 = v_proj - e.first; + const bool on_e1_side = v_proje1.dot(e1e2) < -EPSILON; + const bool on_e2_side = !on_e1_side && v_proje1.norm() > e1e2.norm(); + if (on_e1_side || on_e2_side) { + const Camera& camera = wxGetApp().plater()->get_camera(); + const Matrix4d projection_view_matrix = camera.get_projection_matrix().matrix() * camera.get_view_matrix().matrix(); + const std::array& viewport = camera.get_viewport(); + const Transform3d ss_to_ndc_matrix = TransformHelper::ndc_to_ss_matrix_inverse(viewport); + + const Vec2d v_projss = TransformHelper::world_to_ss(v_proj, projection_view_matrix, viewport); + auto render_extension = [this, &v_projss, &projection_view_matrix, &viewport, &ss_to_ndc_matrix, shader](const Vec3d& p) { + const Vec2d pss = TransformHelper::world_to_ss(p, projection_view_matrix, viewport); + if (!pss.isApprox(v_projss)) { + const Vec2d pv_projss = v_projss - pss; + const double pv_projss_len = pv_projss.norm(); + + const auto q = Eigen::Quaternion::FromTwoVectors(Vec3d::UnitX(), Vec3d(pv_projss.x(), pv_projss.y(), 0.0)); + + shader->set_uniform("projection_matrix", Transform3d::Identity()); + shader->set_uniform("view_model_matrix", ss_to_ndc_matrix * Geometry::translation_transform({ pss.x(), pss.y(), 0.0 }) * q * + Geometry::scale_transform({ pv_projss_len, 1.0f, 1.0f })); + m_dimensioning.line.set_color(ColorRGBA::LIGHT_GRAY()); + m_dimensioning.line.render(); + } + }; + + render_extension(on_e1_side ? e.first : e.second); + } + }; + + auto arc_edge_edge = [this, &shader](const Measure::SurfaceFeature& f1, const Measure::SurfaceFeature& f2, double radius = 0.0) { + assert(f1.get_type() == Measure::SurfaceFeatureType::Edge && f2.get_type() == Measure::SurfaceFeatureType::Edge); + if (!m_measurement_result.angle.has_value()) + return; + + const double angle = m_measurement_result.angle->angle; + const Vec3d center = m_measurement_result.angle->center; + const std::pair e1 = m_measurement_result.angle->e1; + const std::pair e2 = m_measurement_result.angle->e2; + const double calc_radius = m_measurement_result.angle->radius; + const bool coplanar = m_measurement_result.angle->coplanar; + + if (std::abs(angle) < EPSILON || std::abs(calc_radius) < EPSILON) + return; + + const double draw_radius = (radius > 0.0) ? radius : calc_radius; + + const Vec3d e1_unit = Measure::edge_direction(e1); + const Vec3d e2_unit = Measure::edge_direction(e2); + + const unsigned int resolution = std::max(2, 64 * angle / double(PI)); + const double step = angle / double(resolution); + const Vec3d normal = e1_unit.cross(e2_unit).normalized(); + + if (!m_dimensioning.arc.is_initialized()) { + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::LineStrip, GLModel::Geometry::EVertexLayout::P3 }; + init_data.color = ColorRGBA::WHITE(); + init_data.reserve_vertices(resolution + 1); + init_data.reserve_indices(resolution + 1); + + // vertices + indices + for (unsigned int i = 0; i <= resolution; ++i) { + const double a = step * double(i); + const Vec3d v = draw_radius * (Eigen::Quaternion(Eigen::AngleAxisd(a, normal)) * e1_unit); + init_data.add_vertex((Vec3f)v.cast()); + init_data.add_index(i); + } + + m_dimensioning.arc.init_from(init_data); + } + + const Camera& camera = wxGetApp().plater()->get_camera(); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_core_profile()) { + shader->stop_using(); + + shader = wxGetApp().get_shader("dashed_thick_lines"); + if (shader == nullptr) + return; + + shader->start_using(); + shader->set_uniform("projection_matrix", Transform3d::Identity()); + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 1.0f); + shader->set_uniform("gap_size", 0.0f); + } + else +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(2.0f)); + + // arc + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * Geometry::translation_transform(center)); + m_dimensioning.arc.render(); + +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_core_profile()) { + shader->stop_using(); + + shader = wxGetApp().get_shader("flat"); + if (shader == nullptr) + return; + + shader->start_using(); + } + else +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(1.0f)); + + // arrows + auto render_arrow = [this, shader, &camera, &normal, ¢er, &e1_unit, draw_radius, step, resolution](unsigned int endpoint_id) { + const double angle = (endpoint_id == 1) ? 0.0 : step * double(resolution); + const Vec3d position_model = Geometry::translation_transform(center) * (draw_radius * (Eigen::Quaternion(Eigen::AngleAxisd(angle, normal)) * e1_unit)); + const Vec3d direction_model = (endpoint_id == 1) ? -normal.cross(position_model - center).normalized() : normal.cross(position_model - center).normalized(); + const auto qz = Eigen::Quaternion::FromTwoVectors(Vec3d::UnitZ(), (endpoint_id == 1) ? normal : -normal); + const auto qx = Eigen::Quaternion::FromTwoVectors(qz * Vec3d::UnitX(), direction_model); + const Transform3d view_model_matrix = camera.get_view_matrix() * Geometry::translation_transform(position_model) * + qx * qz * Geometry::scale_transform(camera.get_inv_zoom()); + shader->set_uniform("view_model_matrix", view_model_matrix); + m_dimensioning.triangle.render(); + }; + + glsafe(::glDisable(GL_CULL_FACE)); + render_arrow(1); + render_arrow(2); + glsafe(::glEnable(GL_CULL_FACE)); + + // edge 1 extension + const Vec3d e11e12 = e1.second - e1.first; + const Vec3d e11center = center - e1.first; + const double e11center_len = e11center.norm(); + if (e11center_len > EPSILON && e11center.dot(e11e12) < 0.0) { + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * Geometry::translation_transform(center) * + Eigen::Quaternion::FromTwoVectors(Vec3d::UnitX(), Measure::edge_direction(e1.first, e1.second)) * + Geometry::scale_transform({ e11center_len, 1.0f, 1.0f })); + m_dimensioning.line.set_color(ColorRGBA::LIGHT_GRAY()); + m_dimensioning.line.render(); + } + + // edge 2 extension + const Vec3d e21center = center - e2.first; + const double e21center_len = e21center.norm(); + if (e21center_len > EPSILON) { + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * Geometry::translation_transform(center) * + Eigen::Quaternion::FromTwoVectors(Vec3d::UnitX(), Measure::edge_direction(e2.first, e2.second)) * + Geometry::scale_transform({ (coplanar && radius > 0.0) ? e21center_len : draw_radius, 1.0f, 1.0f })); + m_dimensioning.line.set_color(ColorRGBA::LIGHT_GRAY()); + m_dimensioning.line.render(); + } + + // label + // label world coordinates + const Vec3d label_position_world = Geometry::translation_transform(center) * (draw_radius * (Eigen::Quaternion(Eigen::AngleAxisd(step * 0.5 * double(resolution), normal)) * e1_unit)); + + // label screen coordinates + const std::array& viewport = camera.get_viewport(); + const Vec2d label_position_ss = TransformHelper::world_to_ss(label_position_world, + camera.get_projection_matrix().matrix() * camera.get_view_matrix().matrix(), viewport); + + m_imgui->set_next_window_pos(label_position_ss.x(), viewport[3] - label_position_ss.y(), ImGuiCond_Always, 0.0f, 1.0f); + m_imgui->set_next_window_bg_alpha(0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + m_imgui->begin(wxString("##angle"), ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove); + ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); + ImGui::AlignTextToFramePadding(); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + const ImVec2 pos = ImGui::GetCursorScreenPos(); + const std::string txt = format_double(Geometry::rad2deg(angle)) + "°"; + ImVec2 txt_size = ImGui::CalcTextSize(txt.c_str()); + const ImGuiStyle& style = ImGui::GetStyle(); + draw_list->AddRectFilled({ pos.x - style.FramePadding.x, pos.y + style.FramePadding.y }, { pos.x + txt_size.x + 2.0f * style.FramePadding.x , pos.y + txt_size.y + 2.0f * style.FramePadding.y }, + ImGuiWrapper::to_ImU32(ColorRGBA(0.5f, 0.5f, 0.5f, 0.5f))); + ImGui::SetCursorScreenPos({ pos.x + style.FramePadding.x, pos.y }); + m_imgui->text(txt); + m_imgui->end(); + ImGui::PopStyleVar(); + }; + + auto arc_edge_plane = [this, arc_edge_edge](const Measure::SurfaceFeature& f1, const Measure::SurfaceFeature& f2) { + assert(f1.get_type() == Measure::SurfaceFeatureType::Edge && f2.get_type() == Measure::SurfaceFeatureType::Plane); + if (!m_measurement_result.angle.has_value()) + return; + + const std::pair e1 = m_measurement_result.angle->e1; + const std::pair e2 = m_measurement_result.angle->e2; + const double calc_radius = m_measurement_result.angle->radius; + + if (calc_radius == 0.0) + return; + + arc_edge_edge(Measure::SurfaceFeature(Measure::SurfaceFeatureType::Edge, e1.first, e1.second), + Measure::SurfaceFeature(Measure::SurfaceFeatureType::Edge, e2.first, e2.second), calc_radius); + }; + + auto arc_plane_plane = [this, arc_edge_edge](const Measure::SurfaceFeature& f1, const Measure::SurfaceFeature& f2) { + assert(f1.get_type() == Measure::SurfaceFeatureType::Plane && f2.get_type() == Measure::SurfaceFeatureType::Plane); + if (!m_measurement_result.angle.has_value()) + return; + + const std::pair e1 = m_measurement_result.angle->e1; + const std::pair e2 = m_measurement_result.angle->e2; + const double calc_radius = m_measurement_result.angle->radius; + + if (calc_radius == 0.0) + return; + + arc_edge_edge(Measure::SurfaceFeature(Measure::SurfaceFeatureType::Edge, e1.first, e1.second), + Measure::SurfaceFeature(Measure::SurfaceFeatureType::Edge, e2.first, e2.second), calc_radius); + }; + + shader->start_using(); + + if (!m_dimensioning.line.is_initialized()) { + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; + init_data.color = ColorRGBA::WHITE(); + init_data.reserve_vertices(2); + init_data.reserve_indices(2); + + // vertices + init_data.add_vertex(Vec3f(0.0f, 0.0f, 0.0f)); + init_data.add_vertex(Vec3f(1.0f, 0.0f, 0.0f)); + + // indices + init_data.add_line(0, 1); + + m_dimensioning.line.init_from(init_data); + } + + if (!m_dimensioning.triangle.is_initialized()) { + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3 }; + init_data.color = ColorRGBA::WHITE(); + init_data.reserve_vertices(3); + init_data.reserve_indices(3); + + // vertices + init_data.add_vertex(Vec3f(0.0f, 0.0f, 0.0f)); + init_data.add_vertex(Vec3f(-TRIANGLE_HEIGHT, 0.5f * TRIANGLE_BASE, 0.0f)); + init_data.add_vertex(Vec3f(-TRIANGLE_HEIGHT, -0.5f * TRIANGLE_BASE, 0.0f)); + + // indices + init_data.add_triangle(0, 1, 2); + + m_dimensioning.triangle.init_from(init_data); + } + + if (last_selected_features != m_selected_features) + m_dimensioning.arc.reset(); + + glsafe(::glDisable(GL_DEPTH_TEST)); + + const bool has_distance = m_measurement_result.has_distance_data(); + + const Measure::SurfaceFeature* f1 = &(*m_selected_features.first.feature); + const Measure::SurfaceFeature* f2 = nullptr; + std::unique_ptr temp_feature; + if (m_selected_features.second.feature.has_value()) + f2 = &(*m_selected_features.second.feature); + else { + assert(m_selected_features.first.feature->get_type() == Measure::SurfaceFeatureType::Circle); + temp_feature = std::make_unique(std::get<0>(m_selected_features.first.feature->get_circle())); + f2 = temp_feature.get(); + } + + if (!m_selected_features.second.feature.has_value() && m_selected_features.first.feature->get_type() != Measure::SurfaceFeatureType::Circle) + return; + + Measure::SurfaceFeatureType ft1 = f1->get_type(); + Measure::SurfaceFeatureType ft2 = f2->get_type(); + + // Order features by type so following conditions are simple. + if (ft1 > ft2) { + std::swap(ft1, ft2); + std::swap(f1, f2); + } + + // If there is an angle to show, draw the arc: + if (ft1 == Measure::SurfaceFeatureType::Edge && ft2 == Measure::SurfaceFeatureType::Edge) + arc_edge_edge(*f1, *f2); + else if (ft1 == Measure::SurfaceFeatureType::Edge && ft2 == Measure::SurfaceFeatureType::Plane) + arc_edge_plane(*f1, *f2); + else if (ft1 == Measure::SurfaceFeatureType::Plane && ft2 == Measure::SurfaceFeatureType::Plane) + arc_plane_plane(*f1, *f2); + + if (has_distance){ + // Where needed, draw the extension of the edge to where the dist is measured: + if (ft1 == Measure::SurfaceFeatureType::Point && ft2 == Measure::SurfaceFeatureType::Edge) + point_edge(*f1, *f2); + + // Render the arrow between the points that the backend passed: + const Measure::DistAndPoints& dap = m_measurement_result.distance_infinite.has_value() + ? *m_measurement_result.distance_infinite + : *m_measurement_result.distance_strict; + point_point(dap.from, dap.to, dap.dist); + } + + glsafe(::glEnable(GL_DEPTH_TEST)); + + shader->stop_using(); +} + +static void add_row_to_table(std::function col_1 = nullptr, std::function col_2 = nullptr) +{ + assert(col_1 != nullptr && col_2 != nullptr); + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + col_1(); + ImGui::TableSetColumnIndex(1); + col_2(); +} + +static void add_strings_row_to_table(ImGuiWrapper& imgui, const std::string& col_1, const ImVec4& col_1_color, const std::string& col_2, const ImVec4& col_2_color) +{ + add_row_to_table([&]() { imgui.text_colored(col_1_color, col_1); }, [&]() { imgui.text_colored(col_2_color, col_2); }); +}; + +#if ENABLE_MEASURE_GIZMO_DEBUG +void GLGizmoMeasure::render_debug_dialog() +{ + auto add_feature_data = [this](const SelectedFeatures::Item& item) { + const std::string text = (item.source == item.feature) ? surface_feature_type_as_string(item.feature->get_type()) : point_on_feature_type_as_string(item.source->get_type(), m_hover_id); + add_strings_row_to_table(*m_imgui, "Type", ImGuiWrapper::COL_ORANGE_LIGHT, text, ImGui::GetStyleColorVec4(ImGuiCol_Text)); + switch (item.feature->get_type()) + { + case Measure::SurfaceFeatureType::Point: + { + add_strings_row_to_table(*m_imgui, "m_pt1", ImGuiWrapper::COL_ORANGE_LIGHT, format_vec3(item.feature->get_point()), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + break; + } + case Measure::SurfaceFeatureType::Edge: + { + auto [from, to] = item.feature->get_edge(); + add_strings_row_to_table(*m_imgui, "m_pt1", ImGuiWrapper::COL_ORANGE_LIGHT, format_vec3(from), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + add_strings_row_to_table(*m_imgui, "m_pt2", ImGuiWrapper::COL_ORANGE_LIGHT, format_vec3(to), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + break; + } + case Measure::SurfaceFeatureType::Plane: + { + auto [idx, normal, origin] = item.feature->get_plane(); + add_strings_row_to_table(*m_imgui, "m_pt1", ImGuiWrapper::COL_ORANGE_LIGHT, format_vec3(normal), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + add_strings_row_to_table(*m_imgui, "m_pt2", ImGuiWrapper::COL_ORANGE_LIGHT, format_vec3(origin), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + add_strings_row_to_table(*m_imgui, "m_value", ImGuiWrapper::COL_ORANGE_LIGHT, format_double(idx), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + break; + } + case Measure::SurfaceFeatureType::Circle: + { + auto [center, radius, normal] = item.feature->get_circle(); + const Vec3d on_circle = center + radius * Measure::get_orthogonal(normal, true); + radius = (on_circle - center).norm(); + add_strings_row_to_table(*m_imgui, "m_pt1", ImGuiWrapper::COL_ORANGE_LIGHT, format_vec3(center), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + add_strings_row_to_table(*m_imgui, "m_pt2", ImGuiWrapper::COL_ORANGE_LIGHT, format_vec3(normal), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + add_strings_row_to_table(*m_imgui, "m_value", ImGuiWrapper::COL_ORANGE_LIGHT, format_double(radius), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + break; + } + } + std::optional extra_point = item.feature->get_extra_point(); + if (extra_point.has_value()) + add_strings_row_to_table(*m_imgui, "m_pt3", ImGuiWrapper::COL_ORANGE_LIGHT, format_vec3(*extra_point), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + }; + + m_imgui->begin("Measure tool debug", ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + if (ImGui::BeginTable("Mode", 2)) { + std::string txt; + switch (m_mode) + { + case EMode::FeatureSelection: { txt = "Feature selection"; break; } + case EMode::PointSelection: { txt = "Point selection"; break; } + default: { assert(false); break; } + } + add_strings_row_to_table(*m_imgui, "Mode", ImGuiWrapper::COL_ORANGE_LIGHT, txt, ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ImGui::EndTable(); + } + + ImGui::Separator(); + if (ImGui::BeginTable("Hover", 2)) { + add_strings_row_to_table(*m_imgui, "Hover id", ImGuiWrapper::COL_ORANGE_LIGHT, std::to_string(m_hover_id), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + const std::string txt = m_curr_feature.has_value() ? surface_feature_type_as_string(m_curr_feature->get_type()) : "None"; + add_strings_row_to_table(*m_imgui, "Current feature", ImGuiWrapper::COL_ORANGE_LIGHT, txt, ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ImGui::EndTable(); + } + + ImGui::Separator(); + if (!m_selected_features.first.feature.has_value() && !m_selected_features.second.feature.has_value()) + m_imgui->text("Empty selection"); + else { + const ImGuiTableFlags flags = ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersH; + if (m_selected_features.first.feature.has_value()) { + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Selection 1"); + if (ImGui::BeginTable("Selection 1", 2, flags)) { + add_feature_data(m_selected_features.first); + ImGui::EndTable(); + } + } + if (m_selected_features.second.feature.has_value()) { + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Selection 2"); + if (ImGui::BeginTable("Selection 2", 2, flags)) { + add_feature_data(m_selected_features.second); + ImGui::EndTable(); + } + } + } + m_imgui->end(); +} +#endif // ENABLE_MEASURE_GIZMO_DEBUG + +void GLGizmoMeasure::on_render_input_window(float x, float y, float bottom_limit) +{ + static std::optional last_feature; + static EMode last_mode = EMode::FeatureSelection; + static SelectedFeatures last_selected_features; + + static float last_y = 0.0f; + static float last_h = 0.0f; + + if (m_editing_distance) + return; + + m_imgui->begin(get_name(), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + + // adjust window position to avoid overlap the view toolbar + const float win_h = ImGui::GetWindowHeight(); + y = std::min(y, bottom_limit - win_h); + ImGui::SetWindowPos(ImVec2(x, y), ImGuiCond_Always); + if (last_h != win_h || last_y != y) { + // ask canvas for another frame to render the window in the correct position + m_imgui->set_requires_extra_frame(); + if (last_h != win_h) + last_h = win_h; + if (last_y != y) + last_y = y; + } + + if (ImGui::BeginTable("Commands", 2)) { + unsigned int row_count = 1; + add_row_to_table( + [this]() { + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _u8L("Left mouse button")); + }, + [this]() { + std::string text; + ColorRGBA color; + if (m_selected_features.second.feature.has_value()) { + if (m_selected_features.first.feature == m_curr_feature && m_mode == EMode::FeatureSelection) { + // hovering over 1st selected feature + text = _u8L("Unselect feature"); + color = SELECTED_1ST_COLOR; + } + else if (m_hover_id == SEL_SPHERE_1_ID) { + if (m_selected_features.first.is_center) { + // hovering over center selected as 1st feature + text = _u8L("Unselect center"); + color = SELECTED_1ST_COLOR; + } + else if (is_feature_with_center(*m_selected_features.first.feature)) { + // hovering over center of 1st selected feature + text = _u8L("Select center"); + color = SELECTED_1ST_COLOR; + } + else { + // hovering over point selected as 1st feature + text = _u8L("Unselect point"); + color = SELECTED_1ST_COLOR; + } + } + else if (m_selected_features.first.is_center && m_selected_features.first.source == m_curr_feature) { + // hovering over feature whose center is selected as 1st feature + text = _u8L("Select feature"); + color = SELECTED_1ST_COLOR; + } + else if (m_selected_features.second.feature == m_curr_feature && m_mode == EMode::FeatureSelection) { + // hovering over 2nd selected feature + text = _u8L("Unselect feature"); + color = SELECTED_2ND_COLOR; + } + else if (m_hover_id == SEL_SPHERE_2_ID) { + if (m_selected_features.second.is_center) { + // hovering over center selected as 2nd feature + text = _u8L("Unselect feature"); + color = SELECTED_2ND_COLOR; + } + else if (is_feature_with_center(*m_selected_features.second.feature)) { + // hovering over center of 2nd selected feature + text = _u8L("Select center"); + color = SELECTED_2ND_COLOR; + } + else { + // hovering over point selected as 2nd feature + text = _u8L("Unselect point"); + color = SELECTED_2ND_COLOR; + } + } + else if (m_selected_features.second.is_center && m_selected_features.second.source == m_curr_feature) { + // hovering over feature whose center is selected as 2nd feature + text = _u8L("Select feature"); + color = SELECTED_2ND_COLOR; + } + else { + // 1st feature selected + text = (m_mode == EMode::PointSelection) ? _u8L("Select point") : _u8L("Select feature"); + color = SELECTED_2ND_COLOR; + } + } + else { + if (m_selected_features.first.feature.has_value()) { + if (m_selected_features.first.feature == m_curr_feature && m_mode == EMode::FeatureSelection) { + // hovering over 1st selected feature + text = _u8L("Unselect feature"); + color = SELECTED_1ST_COLOR; + } + else { + if (m_hover_id == SEL_SPHERE_1_ID) { + if (m_selected_features.first.is_center) { + // hovering over center selected as 1st feature + text = _u8L("Unselect feature"); + color = SELECTED_1ST_COLOR; + } + else if (is_feature_with_center(*m_selected_features.first.feature)) { + // hovering over center of 1st selected feature + text = _u8L("Select center"); + color = SELECTED_1ST_COLOR; + } + else { + // hovering over point selected as 1st feature + text = _u8L("Unselect point"); + color = SELECTED_1ST_COLOR; + } + } + else { + if (m_selected_features.first.is_center && m_selected_features.first.source == m_curr_feature) { + // hovering over feature whose center is selected as 1st feature + text = _u8L("Select feature"); + color = SELECTED_1ST_COLOR; + } + else { + // 1st feature selected + text = (m_mode == EMode::PointSelection) ? _u8L("Select point") : _u8L("Select feature"); + color = SELECTED_2ND_COLOR; + } + } + } + } + else { + // nothing is selected + text = (m_mode == EMode::PointSelection) ? _u8L("Select point") : _u8L("Select feature"); + color = SELECTED_1ST_COLOR; + } + } + + assert(!text.empty()); + + m_imgui->text_colored(ImGui::GetStyleColorVec4(ImGuiCol_Text), text); + ImGui::SameLine(); + const ImVec2 pos = ImGui::GetCursorScreenPos(); + const float rect_size = ImGui::GetTextLineHeight(); + ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(pos.x + 1.0f, pos.y + 1.0f), ImVec2(pos.x + rect_size, pos.y + rect_size), ImGuiWrapper::to_ImU32(color)); + ImGui::Dummy(ImVec2(rect_size, rect_size)); + } + ); + + if (m_mode == EMode::FeatureSelection && m_hover_id != -1) { + add_strings_row_to_table(*m_imgui, "Shift", ImGuiWrapper::COL_ORANGE_LIGHT, _u8L("Enable point selection"), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ++row_count; + } + + if (m_selected_features.first.feature.has_value()) { + add_strings_row_to_table(*m_imgui, "Delete", ImGuiWrapper::COL_ORANGE_LIGHT, _u8L("Restart selection"), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ++row_count; + } + + if (m_selected_features.first.feature.has_value() || m_selected_features.second.feature.has_value()) { + add_row_to_table( + [this]() { + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Esc"); + }, + [this]() { + m_imgui->text_colored(ImGui::GetStyleColorVec4(ImGuiCol_Text), _u8L("Unselect")); + ImGui::SameLine(); + const ImVec2 pos = ImGui::GetCursorScreenPos(); + const float rect_size = ImGui::GetTextLineHeight(); + const ColorRGBA color = m_selected_features.second.feature.has_value() ? SELECTED_2ND_COLOR : SELECTED_1ST_COLOR; + ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(pos.x + 1.0f, pos.y + 1.0f), ImVec2(pos.x + rect_size, pos.y + rect_size), ImGuiWrapper::to_ImU32(color)); + ImGui::Dummy(ImVec2(rect_size, rect_size)); + } + ); + + ++row_count; + } + + // add dummy rows to keep dialog size fixed + for (unsigned int i = row_count; i < 4; ++i) { + add_strings_row_to_table(*m_imgui, " ", ImGuiWrapper::COL_ORANGE_LIGHT, " ", ImGui::GetStyleColorVec4(ImGuiCol_Text)); + } + + ImGui::EndTable(); + } + + const bool use_inches = wxGetApp().app_config->get("use_inches") == "1"; + const std::string units = use_inches ? " " + _u8L("in") : " " + _u8L("mm"); + + ImGui::Separator(); + const ImGuiTableFlags flags = ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersH; + if (ImGui::BeginTable("Selection", 2, flags)) { + auto format_item_text = [this, use_inches, &units](const SelectedFeatures::Item& item) { + if (!item.feature.has_value()) + return _u8L("None"); + + std::string text = (item.source == item.feature) ? surface_feature_type_as_string(item.feature->get_type()) : + item.is_center ? center_on_feature_type_as_string(item.source->get_type()) : point_on_feature_type_as_string(item.source->get_type(), m_hover_id); + if (item.feature.has_value() && item.feature->get_type() == Measure::SurfaceFeatureType::Circle) { + auto [center, radius, normal] = item.feature->get_circle(); + const Vec3d on_circle = center + radius * Measure::get_orthogonal(normal, true); + radius = (on_circle - center).norm(); + if (use_inches) + radius = GizmoObjectManipulation::mm_to_in * radius; + text += " (" + _u8L("Diameter") + ": " + format_double(2.0 * radius) + units + ")"; + } + else if (item.feature.has_value() && item.feature->get_type() == Measure::SurfaceFeatureType::Edge) { + auto [start, end] = item.feature->get_edge(); + double length = (end - start).norm(); + if (use_inches) + length = GizmoObjectManipulation::mm_to_in * length; + text += " (" + _u8L("Length") + ": " + format_double(length) + units + ")"; + } + return text; + }; + + add_strings_row_to_table(*m_imgui, _u8L("Selection") + " 1:", ImGuiWrapper::to_ImVec4(SELECTED_1ST_COLOR), format_item_text(m_selected_features.first), + ImGuiWrapper::to_ImVec4(SELECTED_1ST_COLOR)); + add_strings_row_to_table(*m_imgui, _u8L("Selection") + " 2:", ImGuiWrapper::to_ImVec4(SELECTED_2ND_COLOR), format_item_text(m_selected_features.second), + ImGuiWrapper::to_ImVec4(SELECTED_2ND_COLOR)); + ImGui::EndTable(); + } + + m_imgui->disabled_begin(!m_selected_features.first.feature.has_value()); + if (m_imgui->button(_L("Restart selection"))) { + m_selected_features.reset(); + m_selected_sphere_raycasters.clear(); + m_imgui->set_requires_extra_frame(); + } + m_imgui->disabled_end(); + + auto add_measure_row_to_table = [this](const std::string& col_1, const ImVec4& col_1_color, const std::string& col_2, const ImVec4& col_2_color) { + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + m_imgui->text_colored(col_1_color, col_1); + ImGui::TableSetColumnIndex(1); + m_imgui->text_colored(col_2_color, col_2); + ImGui::TableSetColumnIndex(2); + if (m_imgui->image_button(ImGui::ClipboardBtnIcon, _L("Copy to clipboard"))) { + wxTheClipboard->Open(); + wxTheClipboard->SetData(new wxTextDataObject(col_1 + ": " + col_2)); + wxTheClipboard->Close(); + } + }; + + ImGui::Separator(); + m_imgui->text(_u8L("Measure")); + + const unsigned int max_measure_row_count = 2; + unsigned int measure_row_count = 0; + if (ImGui::BeginTable("Measure", 4)) { + if (m_selected_features.second.feature.has_value()) { + const Measure::MeasurementResult& measure = m_measurement_result; + if (measure.angle.has_value()) { + ImGui::PushID("ClipboardAngle"); + add_measure_row_to_table(_u8L("Angle"), ImGuiWrapper::COL_ORANGE_LIGHT, format_double(Geometry::rad2deg(measure.angle->angle)) + "°", + ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ++measure_row_count; + ImGui::PopID(); + } + + const bool show_strict = measure.distance_strict.has_value() && + (!measure.distance_infinite.has_value() || std::abs(measure.distance_strict->dist - measure.distance_infinite->dist) > EPSILON); + + if (measure.distance_infinite.has_value()) { + double distance = measure.distance_infinite->dist; + if (use_inches) + distance = GizmoObjectManipulation::mm_to_in * distance; + ImGui::PushID("ClipboardDistanceInfinite"); + add_measure_row_to_table(show_strict ? _u8L("Perpendicular distance") : _u8L("Distance"), ImGuiWrapper::COL_ORANGE_LIGHT, format_double(distance) + units, + ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ++measure_row_count; + ImGui::PopID(); + } + if (show_strict) { + double distance = measure.distance_strict->dist; + if (use_inches) + distance = GizmoObjectManipulation::mm_to_in * distance; + ImGui::PushID("ClipboardDistanceStrict"); + add_measure_row_to_table(_u8L("Direct distance"), ImGuiWrapper::COL_ORANGE_LIGHT, format_double(distance) + units, + ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ++measure_row_count; + ImGui::PopID(); + } + if (measure.distance_xyz.has_value() && measure.distance_xyz->norm() > EPSILON) { + Vec3d distance = *measure.distance_xyz; + if (use_inches) + distance = GizmoObjectManipulation::mm_to_in * distance; + ImGui::PushID("ClipboardDistanceXYZ"); + add_measure_row_to_table(_u8L("Distance XYZ"), ImGuiWrapper::COL_ORANGE_LIGHT, format_vec3(distance), + ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ++measure_row_count; + ImGui::PopID(); + } + } + + // add dummy rows to keep dialog size fixed + for (unsigned int i = measure_row_count; i < max_measure_row_count; ++i) { + add_strings_row_to_table(*m_imgui, " ", ImGuiWrapper::COL_ORANGE_LIGHT, " ", ImGui::GetStyleColorVec4(ImGuiCol_Text)); + } + ImGui::EndTable(); + } + + if (last_feature != m_curr_feature || last_mode != m_mode || last_selected_features != m_selected_features) { + // the dialog may have changed its size, ask for an extra frame to render it properly + last_feature = m_curr_feature; + last_mode = m_mode; + last_selected_features = m_selected_features; + m_imgui->set_requires_extra_frame(); + } + + m_imgui->end(); +} + +void GLGizmoMeasure::on_register_raycasters_for_picking() +{ + // the features are rendered on top of the scene, so the raytraced picker should take it into account + m_parent.set_raycaster_gizmos_on_top(true); +} + +void GLGizmoMeasure::on_unregister_raycasters_for_picking() +{ + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo); + m_parent.set_raycaster_gizmos_on_top(false); + m_raycasters.clear(); + m_selected_sphere_raycasters.clear(); +} + +void GLGizmoMeasure::remove_selected_sphere_raycaster(int id) +{ + auto it = std::find_if(m_selected_sphere_raycasters.begin(), m_selected_sphere_raycasters.end(), + [id](std::shared_ptr item) { return SceneRaycaster::decode_id(SceneRaycaster::EType::Gizmo, item->get_id()) == id; }); + if (it != m_selected_sphere_raycasters.end()) + m_selected_sphere_raycasters.erase(it); + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, id); +} + +void GLGizmoMeasure::update_measurement_result() +{ + if (!m_selected_features.first.feature.has_value()) + m_measurement_result = Measure::MeasurementResult(); + else if (m_selected_features.second.feature.has_value()) + m_measurement_result = Measure::get_measurement(*m_selected_features.first.feature, *m_selected_features.second.feature, m_measuring.get()); + else if (!m_selected_features.second.feature.has_value() && m_selected_features.first.feature->get_type() == Measure::SurfaceFeatureType::Circle) + m_measurement_result = Measure::get_measurement(*m_selected_features.first.feature, Measure::SurfaceFeature(std::get<0>(m_selected_features.first.feature->get_circle())), m_measuring.get()); +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp new file mode 100644 index 00000000000..f432d8ba83b --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp @@ -0,0 +1,188 @@ +#ifndef slic3r_GLGizmoMeasure_hpp_ +#define slic3r_GLGizmoMeasure_hpp_ + +#include "GLGizmoBase.hpp" +#include "slic3r/GUI/GLModel.hpp" +#include "slic3r/GUI/GUI_Utils.hpp" +#include "slic3r/GUI/MeshUtils.hpp" +#include "slic3r/GUI/I18N.hpp" +#include "libslic3r/Measure.hpp" +#include "libslic3r/Model.hpp" +#include "slic3r/GUI/SceneRaycaster.hpp" + +namespace Slic3r { + +enum class ModelVolumeType : int; + +namespace Measure { class Measuring; } + + +namespace GUI { + +enum class SLAGizmoEventType : unsigned char; + +class GLGizmoMeasure : public GLGizmoBase +{ + enum class EMode : unsigned char + { + FeatureSelection, + PointSelection + }; + + struct SelectedFeatures + { + struct Item + { + bool is_center{ false }; + std::optional source; + std::optional feature; + + bool operator == (const Item& other) const { + return this->is_center == other.is_center && this->source == other.source && this->feature == other.feature; + } + + bool operator != (const Item& other) const { + return !operator == (other); + } + + void reset() { + is_center = false; + source.reset(); + feature.reset(); + } + }; + + Item first; + Item second; + + void reset() { + first.reset(); + second.reset(); + } + + bool operator == (const SelectedFeatures & other) const { + if (this->first != other.first) return false; + return this->second == other.second; + } + + bool operator != (const SelectedFeatures & other) const { + return !operator == (other); + } + }; + + struct VolumeCacheItem + { + const ModelObject* object{ nullptr }; + const ModelInstance* instance{ nullptr }; + const ModelVolume* volume{ nullptr }; + Transform3d world_trafo; + + bool operator == (const VolumeCacheItem& other) const { + return this->object == other.object && this->instance == other.instance && this->volume == other.volume && + this->world_trafo.isApprox(other.world_trafo); + } + }; + + std::vector m_volumes_cache; + + EMode m_mode{ EMode::FeatureSelection }; + Measure::MeasurementResult m_measurement_result; + + std::unique_ptr m_measuring; // PIMPL + + PickingModel m_sphere; + PickingModel m_cylinder; + PickingModel m_circle; + PickingModel m_plane; + struct Dimensioning + { + GLModel line; + GLModel triangle; + GLModel arc; + }; + Dimensioning m_dimensioning; + + // Uses a standalone raycaster and not the shared one because of the + // difference in how the mesh is updated + std::unique_ptr m_raycaster; + + std::vector m_plane_models_cache; + std::map> m_raycasters; + // used to keep the raycasters for point/center spheres + std::vector> m_selected_sphere_raycasters; + std::optional m_curr_feature; + std::optional m_curr_point_on_feature_position; + struct SceneRaycasterState + { + std::shared_ptr raycaster{ nullptr }; + bool state{true}; + + }; + std::vector m_scene_raycasters; + + // These hold information to decide whether recalculation is necessary: + float m_last_inv_zoom{ 0.0f }; + std::optional m_last_circle; + int m_last_plane_idx{ -1 }; + + bool m_mouse_left_down{ false }; // for detection left_up of this gizmo + + Vec2d m_mouse_pos{ Vec2d::Zero() }; + + KeyAutoRepeatFilter m_shift_kar_filter; + + SelectedFeatures m_selected_features; + bool m_pending_scale{ false }; + bool m_editing_distance{ false }; + bool m_is_editing_distance_first_frame{ true }; + + void update_if_needed(); + + void disable_scene_raycasters(); + void restore_scene_raycasters_state(); + + void render_dimensioning(); + +#if ENABLE_MEASURE_GIZMO_DEBUG + void render_debug_dialog(); +#endif // ENABLE_MEASURE_GIZMO_DEBUG + +public: + GLGizmoMeasure(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); + + /// + /// Apply rotation on select plane + /// + /// Keep information about mouse click + /// Return True when use the information otherwise False. + bool on_mouse(const wxMouseEvent &mouse_event) override; + + void data_changed(bool is_serializing) override; + + bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); + + bool wants_enter_leave_snapshots() const override { return true; } + std::string get_gizmo_entering_text() const override { return _u8L("Entering Measure gizmo"); } + std::string get_gizmo_leaving_text() const override { return _u8L("Leaving Measure gizmo"); } + std::string get_action_snapshot_name() const override { return _u8L("Measure gizmo editing"); } + +protected: + bool on_init() override; + std::string on_get_name() const override; + bool on_is_activable() const override; + void on_render() override; + void on_set_state() override; + + virtual void on_render_input_window(float x, float y, float bottom_limit) override; + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; + virtual void on_render_for_picking() override {} + + void remove_selected_sphere_raycaster(int id); + void update_measurement_result(); +}; + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_GLGizmoMeasure_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp index 6b5cde25c73..399931c15d8 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp @@ -103,7 +103,7 @@ class GLGizmoMmuSegmentation : public GLGizmoPainterBase std::string get_gizmo_entering_text() const override { return "Entering color painting"; } std::string get_gizmo_leaving_text() const override { return "Leaving color painting"; } - std::string get_action_snapshot_name() override { return "Color painting editing"; } + std::string get_action_snapshot_name() const override { return "Color painting editing"; } // BBS size_t m_selected_extruder_idx = 0; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp index 3f724deaf75..31ee94f388b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp @@ -34,7 +34,7 @@ class GLGizmoSeam : public GLGizmoPainterBase std::string get_gizmo_entering_text() const override { return "Entering Seam painting"; } std::string get_gizmo_leaving_text() const override { return "Leaving Seam painting"; } - std::string get_action_snapshot_name() override { return "Paint-on seam editing"; } + std::string get_action_snapshot_name() const override { return "Paint-on seam editing"; } private: bool on_init() override; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp b/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp index f4211dfb59c..8dd8ef5a01a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp @@ -24,8 +24,12 @@ enum class SLAGizmoEventType : unsigned char { Dragging, Delete, SelectAll, + CtrlDown, + CtrlUp, + ShiftDown, ShiftUp, AltUp, + Escape, ApplyChanges, DiscardChanges, AutomaticGeneration, diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 87c9a00c9ea..682153f8425 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -5,6 +5,7 @@ #include "slic3r/GUI/Camera.hpp" #include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/GUI_ObjectList.hpp" +#include "slic3r/GUI/Gizmos/GLGizmosManager.hpp" #include "slic3r/GUI/Plater.hpp" #include "slic3r/Utils/UndoRedo.hpp" #include "slic3r/GUI/NotificationManager.hpp" @@ -15,7 +16,6 @@ #include "slic3r/GUI/Gizmos/GLGizmoFlatten.hpp" #include "slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp" #include "slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp" -// BBS #include "slic3r/GUI/Gizmos/GLGizmoAdvancedCut.hpp" #include "slic3r/GUI/Gizmos/GLGizmoFaceDetector.hpp" #include "slic3r/GUI/Gizmos/GLGizmoHollow.hpp" @@ -24,6 +24,7 @@ #include "slic3r/GUI/Gizmos/GLGizmoSimplify.hpp" #include "slic3r/GUI/Gizmos/GLGizmoText.hpp" #include "slic3r/GUI/Gizmos/GLGizmoMeshBoolean.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoMeasure.hpp" #include "libslic3r/format.hpp" #include "libslic3r/Model.hpp" @@ -171,6 +172,9 @@ void GLGizmosManager::switch_gizmos_icon_filename() case(EType::MmuSegmentation): gizmo->set_icon_filename(m_is_dark ? "mmu_segmentation_dark.svg" : "mmu_segmentation.svg"); break; + case(EType::Measure): + gizmo->set_icon_filename(m_is_dark ? "measure.svg" : "measure.svg"); + break; case(EType::MeshBoolean): gizmo->set_icon_filename(m_is_dark ? "toolbar_meshboolean_dark.svg" : "toolbar_meshboolean.svg"); break; @@ -210,6 +214,8 @@ bool GLGizmosManager::init() m_gizmos.emplace_back(new GLGizmoSeam(m_parent, m_is_dark ? "toolbar_seam_dark.svg" : "toolbar_seam.svg", EType::Seam)); m_gizmos.emplace_back(new GLGizmoText(m_parent, m_is_dark ? "toolbar_text_dark.svg" : "toolbar_text.svg", EType::Text)); m_gizmos.emplace_back(new GLGizmoMmuSegmentation(m_parent, m_is_dark ? "mmu_segmentation_dark.svg" : "mmu_segmentation.svg", EType::MmuSegmentation)); + m_gizmos.emplace_back(new GLGizmoMeasure(m_parent, m_is_dark ? "measure.svg" : "measure.svg", EType::Measure)); + m_gizmos.emplace_back(new GLGizmoSimplify(m_parent, "reduce_triangles.svg", EType::Simplify)); //m_gizmos.emplace_back(new GLGizmoSlaSupports(m_parent, "sla_supports.svg", sprite_id++)); //m_gizmos.emplace_back(new GLGizmoFaceDetector(m_parent, "face recognition.svg", sprite_id++)); @@ -646,6 +652,8 @@ bool GLGizmosManager::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_p return dynamic_cast(m_gizmos[Cut].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); else if (m_current == MeshBoolean) return dynamic_cast(m_gizmos[MeshBoolean].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); + else if (m_current == Measure) + return dynamic_cast(m_gizmos[Measure].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); else return false; } @@ -762,6 +770,9 @@ bool GLGizmosManager::on_mouse_wheel(wxMouseEvent& evt) bool GLGizmosManager::on_mouse(wxMouseEvent& evt) { + if (m_current == Measure) { + return dynamic_cast(m_gizmos[Measure].get())->on_mouse(evt); + } // used to set a right up event as processed when needed static bool pending_right_up = false; @@ -1045,7 +1056,9 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) { if (m_current != Undefined) { - if ((m_current != SlaSupports) || !gizmo_event(SLAGizmoEventType::DiscardChanges)) + if (m_current == Measure && gizmo_event(SLAGizmoEventType::Escape)) { + // do nothing + } else if ((m_current != SlaSupports) || !gizmo_event(SLAGizmoEventType::DiscardChanges)) reset_all_states(); processed = true; @@ -1079,14 +1092,14 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) //} - //case WXK_BACK: - //case WXK_DELETE: - //{ - // if ((m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::Delete)) - // processed = true; + case WXK_BACK: + case WXK_DELETE: + { + if ((m_current == SlaSupports || m_current == Hollow || m_current == Measure) && gizmo_event(SLAGizmoEventType::Delete)) + processed = true; - // break; - //} + break; + } //case 'A': //case 'a': //{ @@ -1190,6 +1203,12 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) processed = true; } } + else if (m_current == Measure) { + if (keyCode == WXK_CONTROL) + gizmo_event(SLAGizmoEventType::CtrlUp, Vec2d::Zero(), evt.ShiftDown(), evt.AltDown(), evt.CmdDown()); + else if (keyCode == WXK_SHIFT) + gizmo_event(SLAGizmoEventType::ShiftUp, Vec2d::Zero(), evt.ShiftDown(), evt.AltDown(), evt.CmdDown()); + } // if (processed) // m_parent.set_cursor(GLCanvas3D::Standard); diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index fefb85b6b9c..794d06ce5c2 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -76,6 +76,7 @@ class GLGizmosManager : public Slic3r::ObjectBase // BBS Text, MmuSegmentation, + Measure, Simplify, SlaSupports, // BBS diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index 05ef3a4c950..e134b610425 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -785,9 +785,96 @@ bool ImGuiWrapper::radio_button(const wxString &label, bool active) return ImGui::RadioButton(label_utf8.c_str(), active); } -bool ImGuiWrapper::image_button() +ImU32 ImGuiWrapper::to_ImU32(const ColorRGBA& color) { - return false; + return ImGui::GetColorU32({ color.r(), color.g(), color.b(), color.a() }); +} + +ImVec4 ImGuiWrapper::to_ImVec4(const ColorRGBA& color) +{ + return { color.r(), color.g(), color.b(), color.a() }; +} + +ColorRGBA ImGuiWrapper::from_ImU32(const ImU32& color) +{ + return from_ImVec4(ImGui::ColorConvertU32ToFloat4(color)); +} + +ColorRGBA ImGuiWrapper::from_ImVec4(const ImVec4& color) +{ + return { color.x, color.y, color.z, color.w }; +} + + +static bool image_button_ex(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec2& padding, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = ImGui::GetCurrentWindow(); + if (window->SkipItems) + return false; + + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size + padding * 2); + ImGui::ItemSize(bb); + if (!ImGui::ItemAdd(bb, id)) + return false; + + bool hovered, held; + bool pressed = ImGui::ButtonBehavior(bb, id, &hovered, &held, flags); + + // Render + const ImU32 col = ImGui::GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + ImGui::RenderNavHighlight(bb, id); + ImGui::RenderFrame(bb.Min, bb.Max, col, true, ImClamp((float)ImMin(padding.x, padding.y), 0.0f, g.Style.FrameRounding)); + if (bg_col.w > 0.0f) + window->DrawList->AddRectFilled(bb.Min + padding, bb.Max - padding, ImGui::GetColorU32(bg_col)); + window->DrawList->AddImage(texture_id, bb.Min + padding, bb.Max - padding, uv0, uv1, ImGui::GetColorU32(tint_col)); + + return pressed; +} + +bool ImGuiWrapper::image_button(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, int frame_padding, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + // Default to using texture ID as ID. User can still push string/integer prefixes. + ImGui::PushID((void*)(intptr_t)user_texture_id); + const ImGuiID id = window->GetID("#image"); + ImGui::PopID(); + + const ImVec2 padding = (frame_padding >= 0) ? ImVec2((float)frame_padding, (float)frame_padding) : g.Style.FramePadding; + return image_button_ex(id, user_texture_id, size, uv0, uv1, padding, bg_col, tint_col, flags); +} + +bool ImGuiWrapper::image_button(const wchar_t icon, const wxString& tooltip) +{ + const ImGuiIO& io = ImGui::GetIO(); + const ImTextureID tex_id = io.Fonts->TexID; + assert(io.Fonts->TexWidth > 0 && io.Fonts->TexHeight > 0); + const float inv_tex_w = 1.0f / float(io.Fonts->TexWidth); + const float inv_tex_h = 1.0f / float(io.Fonts->TexHeight); + const ImFontAtlasCustomRect* const rect = GetTextureCustomRect(icon); + const ImVec2 size = { float(rect->Width), float(rect->Height) }; + const ImVec2 uv0 = ImVec2(float(rect->X) * inv_tex_w, float(rect->Y) * inv_tex_h); + const ImVec2 uv1 = ImVec2(float(rect->X + rect->Width) * inv_tex_w, float(rect->Y + rect->Height) * inv_tex_h); + ImGui::PushStyleColor(ImGuiCol_Button, { 0.25f, 0.25f, 0.25f, 0.0f }); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, { 0.4f, 0.4f, 0.4f, 1.0f }); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, { 0.25f, 0.25f, 0.25f, 1.0f }); + const bool res = image_button(tex_id, size, uv0, uv1); + ImGui::PopStyleColor(3); + + if (!tooltip.empty() && ImGui::IsItemHovered()) + this->tooltip(tooltip, ImGui::GetFontSize() * 20.0f); + + return res; +} + +ImFontAtlasCustomRect* ImGuiWrapper::GetTextureCustomRect(const wchar_t& tex_id) +{ + auto item = m_custom_glyph_rects_ids.find(tex_id); + return (item != m_custom_glyph_rects_ids.end()) ? ImGui::GetIO().Fonts->GetCustomRectByIndex(m_custom_glyph_rects_ids[tex_id]) : nullptr; } bool ImGuiWrapper::input_double(const std::string &label, const double &value, const std::string &format) @@ -2128,11 +2215,12 @@ void ImGuiWrapper::init_font(bool compress) int rect_id = io.Fonts->CustomRects.Size; // id of the rectangle added next // add rectangles for the icons to the font atlas for (auto& icon : font_icons) - io.Fonts->AddCustomRectFontGlyph(default_font, icon.first, icon_sz, icon_sz, 3.0 * font_scale + icon_sz); + m_custom_glyph_rects_ids[icon.first] = io.Fonts->AddCustomRectFontGlyph(default_font, icon.first, icon_sz, icon_sz, 3.0 * font_scale + icon_sz); for (auto& icon : font_icons_large) - io.Fonts->AddCustomRectFontGlyph(default_font, icon.first, icon_sz * 2, icon_sz * 2, 3.0 * font_scale + icon_sz * 2); + m_custom_glyph_rects_ids[icon.first] = io.Fonts->AddCustomRectFontGlyph(default_font, icon.first, icon_sz * 2, icon_sz * 2, 3.0 * font_scale + icon_sz * 2); for (auto& icon : font_icons_extra_large) - io.Fonts->AddCustomRectFontGlyph(default_font, icon.first, icon_sz * 4, icon_sz * 4, 3.0 * font_scale + icon_sz * 4); + m_custom_glyph_rects_ids[icon.first] = io.Fonts->AddCustomRectFontGlyph(default_font, icon.first, icon_sz * 4, icon_sz * 4, 3.0 * font_scale + icon_sz * 4); + // Build texture atlas unsigned char* pixels; diff --git a/src/slic3r/GUI/ImGuiWrapper.hpp b/src/slic3r/GUI/ImGuiWrapper.hpp index 052ea00e5ef..0ba07a2f4bb 100644 --- a/src/slic3r/GUI/ImGuiWrapper.hpp +++ b/src/slic3r/GUI/ImGuiWrapper.hpp @@ -8,6 +8,7 @@ #include +#include "libslic3r/Color.hpp" #include "libslic3r/Point.hpp" #include "libslic3r/GCode/ThumbnailData.hpp" @@ -59,6 +60,7 @@ class ImGuiWrapper bool m_requires_extra_frame{ false }; #endif // ENABLE_ENHANCED_IMGUI_SLIDER_FLOAT std::string m_clipboard_text; + std::map m_custom_glyph_rects_ids; public: struct LastSliderStatus { @@ -114,7 +116,8 @@ class ImGuiWrapper bool bbl_button(const wxString &label); bool button(const wxString& label, float width, float height); bool radio_button(const wxString &label, bool active); - bool image_button(); + bool image_button(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0.0, 0.0), const ImVec2& uv1 = ImVec2(1.0, 1.0), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0.0, 0.0, 0.0, 0.0), const ImVec4& tint_col = ImVec4(1.0, 1.0, 1.0, 1.0), ImGuiButtonFlags flags = 0); + bool image_button(const wchar_t icon, const wxString& tooltip = L""); bool input_double(const std::string &label, const double &value, const std::string &format = "%.3f"); bool input_double(const wxString &label, const double &value, const std::string &format = "%.3f"); bool input_vec3(const std::string &label, const Vec3d &value, float width, const std::string &format = "%.3f"); @@ -134,6 +137,12 @@ class ImGuiWrapper void tooltip(const char *label, float wrap_width); void tooltip(const wxString &label, float wrap_width); + static ImU32 to_ImU32(const ColorRGBA& color); + static ImVec4 to_ImVec4(const ColorRGBA& color); + static ColorRGBA from_ImU32(const ImU32& color); + static ColorRGBA from_ImVec4(const ImVec4& color); + + ImFontAtlasCustomRect* GetTextureCustomRect(const wchar_t& tex_id); // Float sliders: Manually inserted values aren't clamped by ImGui.Using this wrapper function does (when clamp==true). #if ENABLE_ENHANCED_IMGUI_SLIDER_FLOAT diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index cd9a617f4bb..3c81d43ce4f 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -247,7 +247,7 @@ bool MeshRaycaster::unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d& Vec3d direction; line_from_mouse_pos(mouse_pos, trafo, camera, point, direction); - std::vector hits = m_emesh.query_ray_hits(point, direction); + std::vector hits = m_emesh.query_ray_hits(point, direction); if (hits.empty()) return false; // no intersection found @@ -298,7 +298,7 @@ std::vector MeshRaycaster::get_unobscured_idxs(const Geometry::Transfo bool is_obscured = false; // Cast a ray in the direction of the camera and look for intersection with the mesh: - std::vector hits; + std::vector hits; // Offset the start of the ray by EPSILON to account for numerical inaccuracies. hits = m_emesh.query_ray_hits((inverse_trafo * pt.cast() + direction_to_camera_mesh * EPSILON), direction_to_camera_mesh); @@ -328,6 +328,39 @@ std::vector MeshRaycaster::get_unobscured_idxs(const Geometry::Transfo return out; } +bool MeshRaycaster::closest_hit(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, + Vec3f& position, Vec3f& normal, const ClippingPlane* clipping_plane, size_t* facet_idx) const +{ + Vec3d point; + Vec3d direction; + line_from_mouse_pos(mouse_pos, trafo, camera, point, direction); + + const std::vector hits = m_emesh.query_ray_hits(point, direction.normalized()); + + if (hits.empty()) + return false; // no intersection found + + size_t hit_id = 0; + if (clipping_plane != nullptr) { + while (hit_id < hits.size() && clipping_plane->is_point_clipped(trafo * hits[hit_id].position())) { + ++hit_id; + } + } + + if (hit_id == hits.size()) + return false; // all points are obscured or cut by the clipping plane. + + const AABBMesh::hit_result& hit = hits[hit_id]; + + position = hit.position().cast(); + normal = hit.normal().cast(); + + if (facet_idx != nullptr) + *facet_idx = hit.face(); + + return true; +} + Vec3f MeshRaycaster::get_closest_point(const Vec3f& point, Vec3f* normal) const { diff --git a/src/slic3r/GUI/MeshUtils.hpp b/src/slic3r/GUI/MeshUtils.hpp index 123b8a78525..b57aaf3a5dd 100644 --- a/src/slic3r/GUI/MeshUtils.hpp +++ b/src/slic3r/GUI/MeshUtils.hpp @@ -5,6 +5,7 @@ #include "libslic3r/Geometry.hpp" #include "libslic3r/SLA/IndexedMesh.hpp" #include "admesh/stl.h" +#include "libslic3r/AABBMesh.hpp" #include "slic3r/GUI/3DScene.hpp" @@ -169,18 +170,39 @@ class MeshRaycaster { // normal* can be used to also get normal of the respective triangle. Vec3f get_closest_point(const Vec3f& point, Vec3f* normal = nullptr) const; - + // Returns true if the ray, built from mouse position and camera direction, intersects the mesh. + // In this case, position and normal contain the position and normal, in model coordinates, of the intersection closest to the camera, + // depending on the position/orientation of the clipping_plane, if specified + bool closest_hit( + const Vec2d& mouse_pos, + const Transform3d& trafo, // how to get the mesh into world coords + const Camera& camera, // current camera position + Vec3f& position, // where to save the positibon of the hit (mesh coords) + Vec3f& normal, // normal of the triangle that was hit + const ClippingPlane* clipping_plane = nullptr, // clipping plane (if active) + size_t* facet_idx = nullptr // index of the facet hit + ) const; // Given a point in mesh coords, the method returns the closest facet from mesh. int get_closest_facet(const Vec3f &point) const; Vec3f get_triangle_normal(size_t facet_idx) const; private: - sla::IndexedMesh m_emesh; + AABBMesh m_emesh; std::vector m_normals; }; - +struct PickingModel +{ + GLModel model; + std::unique_ptr mesh_raycaster; + + void reset() { + model.reset(); + mesh_raycaster.reset(); + } +}; + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/SceneRaycaster.cpp b/src/slic3r/GUI/SceneRaycaster.cpp new file mode 100644 index 00000000000..64493d86b49 --- /dev/null +++ b/src/slic3r/GUI/SceneRaycaster.cpp @@ -0,0 +1,292 @@ +#include "libslic3r/libslic3r.h" +#include "SceneRaycaster.hpp" + +#include "Camera.hpp" +#include "GUI_App.hpp" +#include "Selection.hpp" +#include "Plater.hpp" + +namespace Slic3r { +namespace GUI { + +SceneRaycaster::SceneRaycaster() { +#if ENABLE_RAYCAST_PICKING_DEBUG + // hit point + m_sphere.init_from(its_make_sphere(1.0, double(PI) / 16.0)); + m_sphere.set_color(ColorRGBA::YELLOW()); + + // hit normal + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; + init_data.color = ColorRGBA::YELLOW(); + init_data.reserve_vertices(2); + init_data.reserve_indices(2); + + // vertices + init_data.add_vertex((Vec3f)Vec3f::Zero()); + init_data.add_vertex((Vec3f)Vec3f::UnitZ()); + + // indices + init_data.add_line(0, 1); + + m_line.init_from(std::move(init_data)); +#endif // ENABLE_RAYCAST_PICKING_DEBUG +} + +std::shared_ptr SceneRaycaster::add_raycaster(EType type, int id, const MeshRaycaster& raycaster, + const Transform3d& trafo, bool use_back_faces) +{ + switch (type) { + case EType::Bed: { return m_bed.emplace_back(std::make_shared(encode_id(type, id), raycaster, trafo, use_back_faces)); } + case EType::Volume: { return m_volumes.emplace_back(std::make_shared(encode_id(type, id), raycaster, trafo, use_back_faces)); } + case EType::Gizmo: { return m_gizmos.emplace_back(std::make_shared(encode_id(type, id), raycaster, trafo, use_back_faces)); } + default: { assert(false); return nullptr; } + }; +} + +void SceneRaycaster::remove_raycasters(EType type, int id) +{ + std::vector>* raycasters = get_raycasters(type); + auto it = raycasters->begin(); + while (it != raycasters->end()) { + if ((*it)->get_id() == encode_id(type, id)) + it = raycasters->erase(it); + else + ++it; + } +} + +void SceneRaycaster::remove_raycasters(EType type) +{ + switch (type) { + case EType::Bed: { m_bed.clear(); break; } + case EType::Volume: { m_volumes.clear(); break; } + case EType::Gizmo: { m_gizmos.clear(); break; } + default: { break; } + }; +} + +void SceneRaycaster::remove_raycaster(std::shared_ptr item) +{ + for (auto it = m_bed.begin(); it != m_bed.end(); ++it) { + if (*it == item) { + m_bed.erase(it); + return; + } + } + for (auto it = m_volumes.begin(); it != m_volumes.end(); ++it) { + if (*it == item) { + m_volumes.erase(it); + return; + } + } + for (auto it = m_gizmos.begin(); it != m_gizmos.end(); ++it) { + if (*it == item) { + m_gizmos.erase(it); + return; + } + } +} + +SceneRaycaster::HitResult SceneRaycaster::hit(const Vec2d& mouse_pos, const Camera& camera, const ClippingPlane* clipping_plane) const +{ + // helper class used to return currently selected volume as hit when overlapping with other volumes + // to allow the user to click and drag on a selected volume + class VolumeKeeper + { + std::optional m_selected_volume_id; + Vec3f m_closest_hit_pos{ std::numeric_limits::max(), std::numeric_limits::max(), std::numeric_limits::max() }; + bool m_selected_volume_already_found{ false }; + + public: + VolumeKeeper() { + const Selection& selection = wxGetApp().plater()->get_selection(); + if (selection.is_single_volume() || selection.is_single_modifier()) { + const GLVolume* volume = selection.get_first_volume(); + if (!volume->is_wipe_tower && !volume->is_sla_pad() && !volume->is_sla_support()) + m_selected_volume_id = *selection.get_volume_idxs().begin(); + } + } + + bool is_active() const { return m_selected_volume_id.has_value(); } + const Vec3f& get_closest_hit_pos() const { return m_closest_hit_pos; } + bool check_hit_result(const HitResult& hit) { + assert(is_active()); + + if (m_selected_volume_already_found && hit.type == SceneRaycaster::EType::Volume && hit.position.isApprox(m_closest_hit_pos)) + return false; + + if (hit.type == SceneRaycaster::EType::Volume) + m_selected_volume_already_found = *m_selected_volume_id == (unsigned int)decode_id(hit.type, hit.raycaster_id); + + m_closest_hit_pos = hit.position; + return true; + } + }; + + VolumeKeeper volume_keeper; + + double closest_hit_squared_distance = std::numeric_limits::max(); + auto is_closest = [&closest_hit_squared_distance, &volume_keeper](const Camera& camera, const Vec3f& hit) { + const double hit_squared_distance = (camera.get_position() - hit.cast()).squaredNorm(); + bool ret = hit_squared_distance < closest_hit_squared_distance; + if (volume_keeper.is_active()) + ret |= hit.isApprox(volume_keeper.get_closest_hit_pos()); + if (ret) + closest_hit_squared_distance = hit_squared_distance; + return ret; + }; + +#if ENABLE_RAYCAST_PICKING_DEBUG + const_cast*>(&m_last_hit)->reset(); +#endif // ENABLE_RAYCAST_PICKING_DEBUG + + HitResult ret; + + auto test_raycasters = [this, is_closest, clipping_plane, &volume_keeper](EType type, const Vec2d& mouse_pos, const Camera& camera, HitResult& ret) { + const ClippingPlane* clip_plane = (clipping_plane != nullptr && type == EType::Volume) ? clipping_plane : nullptr; + const std::vector>* raycasters = get_raycasters(type); + const Vec3f camera_forward = camera.get_dir_forward().cast(); + HitResult current_hit = { type }; + for (std::shared_ptr item : *raycasters) { + if (!item->is_active()) + continue; + + current_hit.raycaster_id = item->get_id(); + const Transform3d& trafo = item->get_transform(); + if (item->get_raycaster()->closest_hit(mouse_pos, trafo, camera, current_hit.position, current_hit.normal, clip_plane)) { + current_hit.position = (trafo * current_hit.position.cast()).cast(); + current_hit.normal = (trafo.matrix().block(0, 0, 3, 3).inverse().transpose() * current_hit.normal.cast()).normalized().cast(); + if (item->use_back_faces() || current_hit.normal.dot(camera_forward) < 0.0f) { + if (is_closest(camera, current_hit.position)) { + if (volume_keeper.is_active()) { + if (volume_keeper.check_hit_result(current_hit)) + ret = current_hit; + } + else + ret = current_hit; + } + } + } + } + }; + + if (!m_gizmos.empty()) + test_raycasters(EType::Gizmo, mouse_pos, camera, ret); + + if (!m_gizmos_on_top || !ret.is_valid()) { + if (camera.is_looking_downward() && !m_bed.empty()) + test_raycasters(EType::Bed, mouse_pos, camera, ret); + if (!m_volumes.empty()) + test_raycasters(EType::Volume, mouse_pos, camera, ret); + } + + if (ret.is_valid()) + ret.raycaster_id = decode_id(ret.type, ret.raycaster_id); + +#if ENABLE_RAYCAST_PICKING_DEBUG + *const_cast*>(&m_last_hit) = ret; +#endif // ENABLE_RAYCAST_PICKING_DEBUG + return ret; +} + +#if ENABLE_RAYCAST_PICKING_DEBUG +void SceneRaycaster::render_hit(const Camera& camera) +{ + if (!m_last_hit.has_value() || !(*m_last_hit).is_valid()) + return; + + GLShaderProgram* shader = wxGetApp().get_shader("flat"); + shader->start_using(); + + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + + const Transform3d sphere_view_model_matrix = camera.get_view_matrix() * Geometry::translation_transform((*m_last_hit).position.cast()) * + Geometry::scale_transform(4.0 * camera.get_inv_zoom()); + shader->set_uniform("view_model_matrix", sphere_view_model_matrix); + m_sphere.render(); + + Eigen::Quaterniond q; + Transform3d m = Transform3d::Identity(); + m.matrix().block(0, 0, 3, 3) = q.setFromTwoVectors(Vec3d::UnitZ(), (*m_last_hit).normal.cast()).toRotationMatrix(); + + const Transform3d line_view_model_matrix = sphere_view_model_matrix * m * Geometry::scale_transform(10.0); + shader->set_uniform("view_model_matrix", line_view_model_matrix); + m_line.render(); + + shader->stop_using(); +} + +size_t SceneRaycaster::active_beds_count() const { + size_t count = 0; + for (const auto& b : m_bed) { + if (b->is_active()) + ++count; + } + return count; +} +size_t SceneRaycaster::active_volumes_count() const { + size_t count = 0; + for (const auto& v : m_volumes) { + if (v->is_active()) + ++count; + } + return count; +} +size_t SceneRaycaster::active_gizmos_count() const { + size_t count = 0; + for (const auto& g : m_gizmos) { + if (g->is_active()) + ++count; + } + return count; +} +#endif // ENABLE_RAYCAST_PICKING_DEBUG + +std::vector>* SceneRaycaster::get_raycasters(EType type) +{ + std::vector>* ret = nullptr; + switch (type) + { + case EType::Bed: { ret = &m_bed; break; } + case EType::Volume: { ret = &m_volumes; break; } + case EType::Gizmo: { ret = &m_gizmos; break; } + default: { break; } + } + assert(ret != nullptr); + return ret; +} + +const std::vector>* SceneRaycaster::get_raycasters(EType type) const +{ + const std::vector>* ret = nullptr; + switch (type) + { + case EType::Bed: { ret = &m_bed; break; } + case EType::Volume: { ret = &m_volumes; break; } + case EType::Gizmo: { ret = &m_gizmos; break; } + default: { break; } + } + assert(ret != nullptr); + return ret; +} + +int SceneRaycaster::base_id(EType type) +{ + switch (type) + { + case EType::Bed: { return int(EIdBase::Bed); } + case EType::Volume: { return int(EIdBase::Volume); } + case EType::Gizmo: { return int(EIdBase::Gizmo); } + default: { break; } + }; + + assert(false); + return -1; +} + +int SceneRaycaster::encode_id(EType type, int id) { return base_id(type) + id; } +int SceneRaycaster::decode_id(EType type, int id) { return id - base_id(type); } + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/SceneRaycaster.hpp b/src/slic3r/GUI/SceneRaycaster.hpp new file mode 100644 index 00000000000..df44b1701c0 --- /dev/null +++ b/src/slic3r/GUI/SceneRaycaster.hpp @@ -0,0 +1,117 @@ +#ifndef slic3r_SceneRaycaster_hpp_ +#define slic3r_SceneRaycaster_hpp_ + +#include "MeshUtils.hpp" +#include "GLModel.hpp" +#include +#include +#include + +namespace Slic3r { +namespace GUI { + +struct Camera; + +class SceneRaycasterItem +{ + int m_id{ -1 }; + bool m_active{ true }; + bool m_use_back_faces{ false }; + const MeshRaycaster* m_raycaster; + Transform3d m_trafo; + +public: + SceneRaycasterItem(int id, const MeshRaycaster& raycaster, const Transform3d& trafo, bool use_back_faces = false) + : m_id(id), m_raycaster(&raycaster), m_trafo(trafo), m_use_back_faces(use_back_faces) + {} + + int get_id() const { return m_id; } + bool is_active() const { return m_active; } + void set_active(bool active) { m_active = active; } + bool use_back_faces() const { return m_use_back_faces; } + const MeshRaycaster* get_raycaster() const { return m_raycaster; } + const Transform3d& get_transform() const { return m_trafo; } + void set_transform(const Transform3d& trafo) { m_trafo = trafo; } +}; + +class SceneRaycaster +{ +public: + enum class EType + { + None, + Bed, + Volume, + Gizmo + }; + + enum class EIdBase + { + Bed = 0, + Volume = 1000, + Gizmo = 1000000 + }; + + struct HitResult + { + EType type{ EType::None }; + int raycaster_id{ -1 }; + Vec3f position{ Vec3f::Zero() }; + Vec3f normal{ Vec3f::Zero() }; + + bool is_valid() const { return raycaster_id != -1; } + }; + +private: + std::vector> m_bed; + std::vector> m_volumes; + std::vector> m_gizmos; + + // When set to true, if checking gizmos returns a valid hit, + // the search is not performed on other types + bool m_gizmos_on_top{ false }; + +#if ENABLE_RAYCAST_PICKING_DEBUG + GLModel m_sphere; + GLModel m_line; + std::optional m_last_hit; +#endif // ENABLE_RAYCAST_PICKING_DEBUG + +public: + SceneRaycaster(); + + std::shared_ptr add_raycaster(EType type, int picking_id, const MeshRaycaster& raycaster, + const Transform3d& trafo, bool use_back_faces = false); + void remove_raycasters(EType type, int id); + void remove_raycasters(EType type); + void remove_raycaster(std::shared_ptr item); + + std::vector>* get_raycasters(EType type); + const std::vector>* get_raycasters(EType type) const; + + void set_gizmos_on_top(bool value) { m_gizmos_on_top = value; } + + HitResult hit(const Vec2d& mouse_pos, const Camera& camera, const ClippingPlane* clipping_plane = nullptr) const; + +#if ENABLE_RAYCAST_PICKING_DEBUG + void render_hit(const Camera& camera); + + size_t beds_count() const { return m_bed.size(); } + size_t volumes_count() const { return m_volumes.size(); } + size_t gizmos_count() const { return m_gizmos.size(); } + size_t active_beds_count() const; + size_t active_volumes_count() const; + size_t active_gizmos_count() const; +#endif // ENABLE_RAYCAST_PICKING_DEBUG + + static int decode_id(EType type, int id); + +private: + static int encode_id(EType type, int id); + static int base_id(EType type); +}; + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_SceneRaycaster_hpp_ diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index c9e8fb9b4c1..0683bb48923 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -710,6 +710,17 @@ bool Selection::contains_any_volume(const std::vector& volume_idxs return false; } +bool Selection::contains_sinking_volumes(bool ignore_modifiers) const +{ + for (const GLVolume* v : *m_volumes) { + if (!ignore_modifiers || !v->is_modifier) { + if (v->is_sinking()) + return true; + } + } + return false; +} + bool Selection::matches(const std::vector& volume_idxs) const { unsigned int count = 0; @@ -853,6 +864,14 @@ void Selection::move_to_center(const Vec3d& displacement, bool local) this->set_bounding_boxes_dirty(); } +void Selection::setup_cache() +{ + if (!m_valid) + return; + + set_caches(); +} + void Selection::translate(const Vec3d& displacement, bool local) { if (!m_valid) diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp index bfee49bd2ba..1801ee7dc0c 100644 --- a/src/slic3r/GUI/Selection.hpp +++ b/src/slic3r/GUI/Selection.hpp @@ -3,6 +3,7 @@ #include "libslic3r/Geometry.hpp" #include "GLModel.hpp" +#include "GUI_Geometry.hpp" #include #include @@ -26,58 +27,6 @@ using ModelObjectPtrs = std::vector; namespace GUI { -class TransformationType -{ -public: - enum Enum { - // Transforming in a world coordinate system - World = 0, - // Transforming in a local coordinate system - Local = 1, - // Absolute transformations, allowed in local coordinate system only. - Absolute = 0, - // Relative transformations, allowed in both local and world coordinate system. - Relative = 2, - // For group selection, the transformation is performed as if the group made a single solid body. - Joint = 0, - // For group selection, the transformation is performed on each object independently. - Independent = 4, - - World_Relative_Joint = World | Relative | Joint, - World_Relative_Independent = World | Relative | Independent, - Local_Absolute_Joint = Local | Absolute | Joint, - Local_Absolute_Independent = Local | Absolute | Independent, - Local_Relative_Joint = Local | Relative | Joint, - Local_Relative_Independent = Local | Relative | Independent, - }; - - TransformationType() : m_value(World) {} - TransformationType(Enum value) : m_value(value) {} - TransformationType& operator=(Enum value) { m_value = value; return *this; } - - Enum operator()() const { return m_value; } - bool has(Enum v) const { return ((unsigned int)m_value & (unsigned int)v) != 0; } - - void set_world() { this->remove(Local); } - void set_local() { this->add(Local); } - void set_absolute() { this->remove(Relative); } - void set_relative() { this->add(Relative); } - void set_joint() { this->remove(Independent); } - void set_independent() { this->add(Independent); } - - bool world() const { return !this->has(Local); } - bool local() const { return this->has(Local); } - bool absolute() const { return !this->has(Relative); } - bool relative() const { return this->has(Relative); } - bool joint() const { return !this->has(Independent); } - bool independent() const { return this->has(Independent); } - -private: - void add(Enum v) { m_value = Enum((unsigned int)m_value | (unsigned int)v); } - void remove(Enum v) { m_value = Enum((unsigned int)m_value & (~(unsigned int)v)); } - - Enum m_value; -}; class Selection { @@ -301,6 +250,8 @@ class Selection bool contains_all_volumes(const std::vector& volume_idxs) const; // returns true if the selection contains at least one of the given indices bool contains_any_volume(const std::vector& volume_idxs) const; + // returns true if the selection contains any sinking volume + bool contains_sinking_volumes(bool ignore_modifiers = true) const; // returns true if the selection contains all and only the given indices bool matches(const std::vector& volume_idxs) const; @@ -316,6 +267,7 @@ class Selection const IndicesList& get_volume_idxs() const { return m_list; } const GLVolume* get_volume(unsigned int volume_idx) const; + const GLVolume* get_first_volume() const { return get_volume(*m_list.begin()); } const ObjectIdxsToInstanceIdxsMap& get_content() const { return m_cache.content; } @@ -366,6 +318,8 @@ class Selection m_scale_factor = scale; render_bounding_box(box, color); } + + void setup_cache(); //BBS void cut_to_clipboard(); From d55e8acfdbf13cfd983788009c11b9fedc01911d Mon Sep 17 00:00:00 2001 From: SoftFever Date: Tue, 10 Oct 2023 22:46:32 +0800 Subject: [PATCH 02/18] bed axes and pick is not correct --- resources/shaders/gouraud_light.vs | 15 +- resources/shaders/gouraud_light_instanced.vs | 12 +- src/libslic3r/Measure.cpp | 63 +- src/libslic3r/Measure.hpp | 2 +- src/libslic3r/Technologies.hpp | 3 + src/slic3r/CMakeLists.txt | 2 + src/slic3r/GUI/3DBed.cpp | 147 +- src/slic3r/GUI/3DBed.hpp | 36 +- src/slic3r/GUI/3DScene.cpp | 51 +- src/slic3r/GUI/3DScene.hpp | 11 +- src/slic3r/GUI/CoordAxes.cpp | 69 + src/slic3r/GUI/CoordAxes.hpp | 57 + src/slic3r/GUI/GCodeViewer.cpp | 67 +- src/slic3r/GUI/GCodeViewer.hpp | 6 +- src/slic3r/GUI/GLCanvas3D.cpp | 384 +++-- src/slic3r/GUI/GLCanvas3D.hpp | 8 +- src/slic3r/GUI/GLModel.cpp | 1266 +++++++++++------ src/slic3r/GUI/GLModel.hpp | 138 +- src/slic3r/GUI/GLSelectionRectangle.hpp | 1 + src/slic3r/GUI/GLShader.cpp | 9 + src/slic3r/GUI/GLShader.hpp | 7 + src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp | 6 +- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 16 +- src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 8 +- src/slic3r/GUI/Gizmos/GLGizmoCut.cpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 4 +- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp | 68 +- src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp | 1 - .../GUI/Gizmos/GLGizmoMmuSegmentation.cpp | 2 +- .../GUI/Gizmos/GLGizmoMmuSegmentation.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 4 +- src/slic3r/GUI/Gizmos/GLGizmoMove.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 9 +- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp | 8 +- src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 4 +- src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 8 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 6 +- src/slic3r/GUI/Gizmos/GLGizmosManager.hpp | 2 +- src/slic3r/GUI/ImGuiWrapper.cpp | 1 + src/slic3r/GUI/MeshUtils.cpp | 52 +- src/slic3r/GUI/MeshUtils.hpp | 43 +- src/slic3r/GUI/SceneRaycaster.cpp | 22 + src/slic3r/GUI/SceneRaycaster.hpp | 9 +- src/slic3r/GUI/Selection.cpp | 32 +- src/slic3r/GUI/Selection.hpp | 18 +- 54 files changed, 1765 insertions(+), 936 deletions(-) create mode 100644 src/slic3r/GUI/CoordAxes.cpp create mode 100644 src/slic3r/GUI/CoordAxes.hpp diff --git a/resources/shaders/gouraud_light.vs b/resources/shaders/gouraud_light.vs index d4f71938a99..135a23b3da8 100644 --- a/resources/shaders/gouraud_light.vs +++ b/resources/shaders/gouraud_light.vs @@ -14,25 +14,32 @@ const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); #define INTENSITY_AMBIENT 0.3 +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + +attribute vec3 v_position; +attribute vec3 v_normal; + // x = tainted, y = specular; varying vec2 intensity; void main() { // First transform the normal into camera space and normalize the result. - vec3 normal = normalize(gl_NormalMatrix * gl_Normal); + vec3 normal = normalize(view_normal_matrix * v_normal); // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - vec3 position = (gl_ModelViewMatrix * gl_Vertex).xyz; - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); // Perform the same lighting calculation for the 2nd light source (no specular applied). NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - gl_Position = ftransform(); + gl_Position = projection_matrix * position; } diff --git a/resources/shaders/gouraud_light_instanced.vs b/resources/shaders/gouraud_light_instanced.vs index a42f8e9a4e2..f512a9cafcf 100644 --- a/resources/shaders/gouraud_light_instanced.vs +++ b/resources/shaders/gouraud_light_instanced.vs @@ -14,6 +14,10 @@ const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); #define INTENSITY_AMBIENT 0.3 +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + // vertex attributes attribute vec3 v_position; attribute vec3 v_normal; @@ -27,7 +31,7 @@ varying vec2 intensity; void main() { // First transform the normal into camera space and normalize the result. - vec3 eye_normal = normalize(gl_NormalMatrix * v_normal); + vec3 eye_normal = normalize(view_normal_matrix * v_normal); // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. @@ -35,12 +39,12 @@ void main() intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; vec4 world_position = vec4(v_position * vec3(vec2(1.5 * i_scales.x), 1.5 * i_scales.y) + i_offset - vec3(0.0, 0.0, 0.5 * i_scales.y), 1.0); - vec3 eye_position = (gl_ModelViewMatrix * world_position).xyz; - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(eye_position), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + vec4 eye_position = view_model_matrix * world_position; + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(eye_position.xyz), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); // Perform the same lighting calculation for the 2nd light source (no specular applied). NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - gl_Position = gl_ProjectionMatrix * vec4(eye_position, 1.0); + gl_Position = projection_matrix * eye_position; } diff --git a/src/libslic3r/Measure.cpp b/src/libslic3r/Measure.cpp index 08c17df47be..5593362949b 100644 --- a/src/libslic3r/Measure.cpp +++ b/src/libslic3r/Measure.cpp @@ -72,7 +72,7 @@ class MeasuringImpl { int get_num_of_planes() const; const std::vector& get_plane_triangle_indices(int idx) const; const std::vector& get_plane_features(unsigned int plane_id); - const TriangleMesh& get_mesh() const; + const indexed_triangle_set& get_its() const; private: void update_planes(); @@ -80,7 +80,7 @@ class MeasuringImpl { std::vector m_planes; std::vector m_face_to_plane; - TriangleMesh m_mesh; + indexed_triangle_set m_its; }; @@ -89,7 +89,7 @@ class MeasuringImpl { MeasuringImpl::MeasuringImpl(const indexed_triangle_set& its) -: m_mesh(its) +: m_its(its) { update_planes(); @@ -104,14 +104,12 @@ MeasuringImpl::MeasuringImpl(const indexed_triangle_set& its) void MeasuringImpl::update_planes() { - m_planes.clear(); - // Now we'll go through all the facets and append Points of facets sharing the same normal. // This part is still performed in mesh coordinate system. - const size_t num_of_facets = m_mesh.its.indices.size(); + const size_t num_of_facets = m_its.indices.size(); m_face_to_plane.resize(num_of_facets, size_t(-1)); - const std::vector face_normals = its_face_normals(m_mesh.its); - const std::vector face_neighbors = its_face_neighbors(m_mesh.its); + const std::vector face_normals = its_face_normals(m_its); + const std::vector face_neighbors = its_face_neighbors(m_its); std::vector facet_queue(num_of_facets, 0); int facet_queue_cnt = 0; const stl_normal* normal_ptr = nullptr; @@ -121,6 +119,10 @@ void MeasuringImpl::update_planes() return (std::abs(a(0) - b(0)) < 0.001 && std::abs(a(1) - b(1)) < 0.001 && std::abs(a(2) - b(2)) < 0.001); }; + m_planes.clear(); + m_planes.reserve(num_of_facets / 5); // empty plane data object is quite lightweight, let's save the initial reallocations + + // First go through all the triangles and fill in m_planes vector. For each "plane" // detected on the model, it will contain list of facets that are part of it. // We will also fill in m_face_to_plane, which contains index into m_planes @@ -132,7 +134,7 @@ void MeasuringImpl::update_planes() facet_queue[facet_queue_cnt ++] = seed_facet_idx; normal_ptr = &face_normals[seed_facet_idx]; m_face_to_plane[seed_facet_idx] = m_planes.size(); - m_planes.emplace_back(); + m_planes.emplace_back(); break; } if (seed_facet_idx == num_of_facets) @@ -160,16 +162,21 @@ void MeasuringImpl::update_planes() assert(std::none_of(m_face_to_plane.begin(), m_face_to_plane.end(), [](size_t val) { return val == size_t(-1); })); // Now we will walk around each of the planes and save vertices which form the border. - SurfaceMesh sm(m_mesh.its); - for (int plane_id=0; plane_id < int(m_planes.size()); ++plane_id) { - const auto& facets = m_planes[plane_id].facets; - m_planes[plane_id].borders.clear(); + const SurfaceMesh sm(m_its); + + const auto& face_to_plane = m_face_to_plane; + auto& planes = m_planes; + + tbb::parallel_for(tbb::blocked_range(0, m_planes.size()), + [&planes, &face_to_plane, &face_neighbors, &sm](const tbb::blocked_range& range) { + for (size_t plane_id = range.begin(); plane_id != range.end(); ++plane_id) { + + const auto& facets = planes[plane_id].facets; + planes[plane_id].borders.clear(); std::vector> visited(facets.size(), {false, false, false}); - - for (int face_id=0; face_id& last_border = m_planes[plane_id].borders.back(); + planes[plane_id].borders.emplace_back(); + std::vector& last_border = planes[plane_id].borders.back(); + last_border.reserve(4); last_border.emplace_back(sm.point(sm.source(he)).cast()); //Vertex_index target = sm.target(he); const Halfedge_index he_start = he; @@ -210,7 +218,7 @@ void MeasuringImpl::update_planes() // Remember all halfedges we saw to break out of such infinite loops. boost::container::small_vector he_seen; - while ( (int)m_face_to_plane[sm.face(he)] == plane_id && he != he_orig) { + while ( (int)face_to_plane[sm.face(he)] == plane_id && he != he_orig) { he_seen.emplace_back(he); he = sm.next_around_target(he); if (he.is_invalid() || std::find(he_seen.begin(), he_seen.end(), he) != he_seen.end()) @@ -241,7 +249,7 @@ void MeasuringImpl::update_planes() } while (he != he_start); if (last_border.size() == 1) - m_planes[plane_id].borders.pop_back(); + planes[plane_id].borders.pop_back(); else { assert(last_border.front() == last_border.back()); last_border.pop_back(); @@ -251,8 +259,9 @@ void MeasuringImpl::update_planes() continue; // There was no failure. PLANE_FAILURE: - m_planes[plane_id].borders.clear(); - } + planes[plane_id].borders.clear(); + }}); + m_planes.shrink_to_fit(); } @@ -581,9 +590,9 @@ const std::vector& MeasuringImpl::get_plane_features(unsigned in return m_planes[plane_id].surface_features; } -const TriangleMesh& MeasuringImpl::get_mesh() const +const indexed_triangle_set& MeasuringImpl::get_its() const { - return this->m_mesh; + return this->m_its; } @@ -626,9 +635,9 @@ const std::vector& Measuring::get_plane_features(unsigned int pl return priv->get_plane_features(plane_id); } -const TriangleMesh& Measuring::get_mesh() const +const indexed_triangle_set& Measuring::get_its() const { - return priv->get_mesh(); + return priv->get_its(); } const AngleAndEdges AngleAndEdges::Dummy = { 0.0, Vec3d::Zero(), { Vec3d::Zero(), Vec3d::Zero() }, { Vec3d::Zero(), Vec3d::Zero() }, 0.0, true }; diff --git a/src/libslic3r/Measure.hpp b/src/libslic3r/Measure.hpp index a273135ca8b..70f446afd99 100644 --- a/src/libslic3r/Measure.hpp +++ b/src/libslic3r/Measure.hpp @@ -109,7 +109,7 @@ class Measuring { const std::vector& get_plane_features(unsigned int plane_id) const; // Returns the mesh used for measuring - const TriangleMesh& get_mesh() const; + const indexed_triangle_set& get_its() const; private: std::unique_ptr priv; diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index aa014a6dc9c..28c1ac27f7e 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -62,5 +62,8 @@ // Enable fit print volume command for circular printbeds #define ENABLE_ENHANCED_PRINT_VOLUME_FIT (1 && ENABLE_2_4_0_BETA2) +// Enable picking using raytracing +#define ENABLE_RAYCAST_PICKING (1 && ENABLE_LEGACY_OPENGL_REMOVAL) +#define ENABLE_RAYCAST_PICKING_DEBUG (0 && ENABLE_RAYCAST_PICKING) #endif // _prusaslicer_technologies_h_ diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 331e89128bd..f1e658b23d2 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -277,6 +277,8 @@ set(SLIC3R_GUI_SOURCES GUI/2DBed.hpp GUI/3DBed.cpp GUI/3DBed.hpp + GUI/CoordAxes.cpp + GUI/CoordAxes.hpp GUI/Camera.cpp GUI/Camera.hpp GUI/CameraUtils.cpp diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index a7b6e050ebc..447519d3d64 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -12,6 +12,7 @@ #include "GUI_App.hpp" #include "GUI_Colors.hpp" #include "GLCanvas3D.hpp" +#include "Plater.hpp" #include @@ -155,7 +156,7 @@ void Bed3D::load_render_colors() RenderColor::colors[RenderCol_Axis_Z] = IMColor(Bed3D::AXIS_Z_COLOR); } -void Bed3D::Axes::render() const +void Bed3D::Axes::render() { auto render_axis = [this](const Transform3f& transform) { glsafe(::glPushMatrix()); @@ -177,15 +178,15 @@ void Bed3D::Axes::render() const shader->set_uniform("emission_factor", 0.0f); // x axis - const_cast(&m_arrow)->set_color(-1, AXIS_X_COLOR); + const_cast(&m_arrow)->set_color(AXIS_X_COLOR); render_axis(Geometry::assemble_transform(m_origin, { 0.0, 0.5 * M_PI, 0.0 }).cast()); // y axis - const_cast(&m_arrow)->set_color(-1, AXIS_Y_COLOR); + const_cast(&m_arrow)->set_color(AXIS_Y_COLOR); render_axis(Geometry::assemble_transform(m_origin, { -0.5 * M_PI, 0.0, 0.0 }).cast()); // z axis - const_cast(&m_arrow)->set_color(-1, AXIS_Z_COLOR); + const_cast(&m_arrow)->set_color(AXIS_Z_COLOR); render_axis(Geometry::assemble_transform(m_origin).cast()); shader->stop_using(); @@ -290,6 +291,9 @@ bool Bed3D::set_shape(const Pointfs& printable_area, const double printable_heig m_axes.set_origin({ 0.0, 0.0, static_cast(GROUND_Z) }); m_axes.set_stem_length(0.1f * static_cast(m_build_volume.bounding_volume().max_size())); + // unregister from picking + wxGetApp().plater()->canvas3D()->remove_raycasters_for_picking(SceneRaycaster::EType::Bed); + // Let the calee to update the UI. return true; } @@ -325,38 +329,66 @@ void Bed3D::on_change_color_mode(bool is_dark) m_is_dark = is_dark; } -void Bed3D::render(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes) +void Bed3D::render(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor, bool show_axes) +{ + render_internal(canvas, view_matrix, projection_matrix, bottom, scale_factor, show_axes, false); +} + +void Bed3D::render_for_picking(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor) { - render_internal(canvas, bottom, scale_factor, show_axes); + render_internal(canvas, view_matrix, projection_matrix, bottom, scale_factor, false, true); } + /*void Bed3D::render_for_picking(GLCanvas3D& canvas, bool bottom, float scale_factor) { render_internal(canvas, bottom, scale_factor, false, false, true); }*/ -void Bed3D::render_internal(GLCanvas3D& canvas, bool bottom, float scale_factor, - bool show_axes) -{ - float* factor = const_cast(&m_scale_factor); - *factor = scale_factor; +// void Bed3D::render_internal(GLCanvas3D& canvas, bool bottom, float scale_factor, +// bool show_axes) +// { +// float* factor = const_cast(&m_scale_factor); +// *factor = scale_factor; +// if (show_axes) +// render_axes(); +// glsafe(::glEnable(GL_DEPTH_TEST)); + +// m_model.model.set_color(m_is_dark ? DEFAULT_MODEL_COLOR_DARK : DEFAULT_MODEL_COLOR); + +// switch (m_type) +// { +// case Type::System: { render_system(canvas, bottom); break; } +// default: +// case Type::Custom: { render_custom(canvas, bottom); break; } +// } + +// glsafe(::glDisable(GL_DEPTH_TEST)); +// } + +void Bed3D::render_internal(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor, + bool show_axes, bool picking) +{ + m_scale_factor = scale_factor; + if (show_axes) render_axes(); glsafe(::glEnable(GL_DEPTH_TEST)); - m_model.set_color(-1, m_is_dark ? DEFAULT_MODEL_COLOR_DARK : DEFAULT_MODEL_COLOR); + m_model.model.set_color(picking ? PICKING_MODEL_COLOR : m_is_dark ? DEFAULT_MODEL_COLOR_DARK : DEFAULT_MODEL_COLOR); switch (m_type) { - case Type::System: { render_system(canvas, bottom); break; } + case Type::System: { render_system(canvas, view_matrix, projection_matrix, bottom); break; } default: - case Type::Custom: { render_custom(canvas, bottom); break; } + case Type::Custom: { render_custom(canvas, view_matrix, projection_matrix, bottom, picking); break; } } glsafe(::glDisable(GL_DEPTH_TEST)); } + //BBS: add partplate related logic // Calculate an extended bounding box from axes and current model for visualization purposes. BoundingBoxf3 Bed3D::calc_extended_bounding_box(bool consider_model_offset) const @@ -379,7 +411,7 @@ BoundingBoxf3 Bed3D::calc_extended_bounding_box(bool consider_model_offset) cons //BBS: add part plate related logic. if (consider_model_offset) { // extend to contain model, if any - BoundingBoxf3 model_bb = m_model.get_bounding_box(); + BoundingBoxf3 model_bb = m_model.model.get_bounding_box(); if (model_bb.defined) { model_bb.translate(m_model_offset); out.merge(model_bb); @@ -454,21 +486,32 @@ std::tuple Bed3D::detect_type(const Point return { Type::Custom, {}, {} }; } -void Bed3D::render_axes() const +void Bed3D::render_axes() { if (m_build_volume.valid()) m_axes.render(); } -void Bed3D::render_system(GLCanvas3D& canvas, bool bottom) const +void Bed3D::render_system(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom) { if (!bottom) - render_model(); + render_model(view_matrix, projection_matrix); - /*if (show_texture) - render_texture(bottom, canvas);*/ + // if (show_texture) + // render_texture(bottom, canvas, view_matrix, projection_matrix); + // else if (bottom) + // render_contour(view_matrix, projection_matrix); } +// void Bed3D::render_system(GLCanvas3D& canvas, bool bottom) +// { +// if (!bottom) +// render_model(); + +// /*if (show_texture) +// render_texture(bottom, canvas);*/ +// } + /*void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) const { GLTexture* texture = const_cast(&m_texture); @@ -624,7 +667,7 @@ void Bed3D::update_model_offset() const const_cast(m_extended_bounding_box) = calc_extended_bounding_box(); } -GeometryBuffer Bed3D::update_bed_triangles() const +GeometryBuffer Bed3D::update_bed_triangles() { GeometryBuffer new_triangles; Vec3d shift = m_extended_bounding_box.center(); @@ -649,22 +692,37 @@ GeometryBuffer Bed3D::update_bed_triangles() const if (!new_triangles.set_from_triangles(triangulate_expolygon_2f(poly, NORMALS_UP), GROUND_Z)) { ; } + if (m_model.model.get_filename().empty() && m_model.mesh_raycaster == nullptr) + // register for picking + register_raycasters_for_picking(m_model.model.get_geometry(), Transform3d::Identity()); + // update extended bounding box const_cast(m_extended_bounding_box) = calc_extended_bounding_box(); return new_triangles; } -void Bed3D::render_model() const +void Bed3D::render_model(const Transform3d& view_matrix, const Transform3d& projection_matrix) { if (m_model_filename.empty()) return; - GLModel* model = const_cast(&m_model); + GLModel* model = const_cast(&m_model.model); if (model->get_filename() != m_model_filename && model->init_from_file(m_model_filename)) { - model->set_color(-1, m_is_dark ? DEFAULT_MODEL_COLOR_DARK : DEFAULT_MODEL_COLOR); + model->set_color(m_is_dark ? DEFAULT_MODEL_COLOR_DARK : DEFAULT_MODEL_COLOR); update_model_offset(); + // register for picking + const std::vector>* const raycaster = wxGetApp().plater()->canvas3D()->get_raycasters_for_picking(SceneRaycaster::EType::Bed); + if (!raycaster->empty()) { + // The raycaster may have been set by the call to init_triangles() made from render_texture() if the printbed was + // changed while the camera was pointing upward. + // In this case we need to remove it before creating a new using the model geometry + wxGetApp().plater()->canvas3D()->remove_raycasters_for_picking(SceneRaycaster::EType::Bed); + m_model.mesh_raycaster.reset(); + } + register_raycasters_for_picking(m_model.model.get_geometry(), Geometry::translation_transform(m_model_offset)); + } if (!model->get_filename().empty()) { @@ -672,38 +730,37 @@ void Bed3D::render_model() const if (shader != nullptr) { shader->start_using(); shader->set_uniform("emission_factor", 0.0f); - glsafe(::glPushMatrix()); - glsafe(::glTranslated(m_model_offset.x(), m_model_offset.y(), m_model_offset.z())); - model->render(); - glsafe(::glPopMatrix()); + const Transform3d model_matrix = Geometry::translation_transform(m_model_offset); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); + shader->set_uniform("projection_matrix", projection_matrix); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); + m_model.model.render(); shader->stop_using(); } } } -void Bed3D::render_custom(GLCanvas3D& canvas, bool bottom) const +void Bed3D::render_custom(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool picking) { if (m_model_filename.empty()) { - render_default(bottom); + render_default(bottom, picking, view_matrix, projection_matrix); return; } if (!bottom) - render_model(); + render_model(view_matrix, projection_matrix); - /*if (show_texture) - render_texture(bottom, canvas);*/ } -void Bed3D::render_default(bool bottom) const +void Bed3D::render_default(bool bottom, bool picking, const Transform3d& view_matrix, const Transform3d& projection_matrix) { - bool picking = false; const_cast(&m_texture)->reset(); unsigned int triangles_vcount = m_triangles.get_vertices_count(); GeometryBuffer default_triangles = update_bed_triangles(); if (triangles_vcount > 0) { - bool has_model = !m_model.get_filename().empty(); + bool has_model = !m_model.model.get_filename().empty(); glsafe(::glEnable(GL_DEPTH_TEST)); glsafe(::glEnable(GL_BLEND)); @@ -746,5 +803,23 @@ void Bed3D::release_VBOs() } } +void Bed3D::register_raycasters_for_picking(const GLModel::Geometry& geometry, const Transform3d& trafo) +{ + assert(m_model.mesh_raycaster == nullptr); + + indexed_triangle_set its; + its.vertices.reserve(geometry.vertices_count()); + for (size_t i = 0; i < geometry.vertices_count(); ++i) { + its.vertices.emplace_back(geometry.extract_position_3(i)); + } + its.indices.reserve(geometry.indices_count() / 3); + for (size_t i = 0; i < geometry.indices_count() / 3; ++i) { + const size_t tri_id = i * 3; + its.indices.emplace_back(geometry.extract_index(tri_id), geometry.extract_index(tri_id + 1), geometry.extract_index(tri_id + 2)); + } + + m_model.mesh_raycaster = std::make_unique(std::make_shared(std::move(its))); + wxGetApp().plater()->canvas3D()->add_raycaster_for_picking(SceneRaycaster::EType::Bed, 0, *m_model.mesh_raycaster, trafo); +} } // GUI } // Slic3r diff --git a/src/slic3r/GUI/3DBed.hpp b/src/slic3r/GUI/3DBed.hpp index f6daadddf13..8140b71355b 100644 --- a/src/slic3r/GUI/3DBed.hpp +++ b/src/slic3r/GUI/3DBed.hpp @@ -3,7 +3,8 @@ #include "GLTexture.hpp" #include "3DScene.hpp" -#include "GLModel.hpp" +#include "CoordAxes.hpp" +#include "MeshUtils.hpp" #include @@ -70,7 +71,7 @@ class Bed3D m_arrow.reset(); } float get_total_length() const { return m_stem_length + DefaultTipLength; } - void render() const; + void render(); }; public: @@ -96,7 +97,7 @@ class Bed3D GLTexture m_texture; // temporary texture shown until the main texture has still no levels compressed //GLTexture m_temp_texture; - GLModel m_model; + PickingModel m_model; Vec3d m_model_offset{ Vec3d::Zero() }; unsigned int m_vbo_id{ 0 }; Axes m_axes; @@ -142,8 +143,10 @@ class Bed3D bool contains(const Point& point) const; Point point_projection(const Point& point) const; - void render(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes); - //void render_for_picking(GLCanvas3D& canvas, bool bottom, float scale_factor); + void render(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor, bool show_axes); + void render_axes(); + void render_for_picking(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor); + void on_change_color_mode(bool is_dark); @@ -155,17 +158,24 @@ class Bed3D void calc_gridlines(const ExPolygon& poly, const BoundingBox& bed_bbox); void update_model_offset() const; //BBS: with offset - GeometryBuffer update_bed_triangles() const; + GeometryBuffer update_bed_triangles(); static std::tuple detect_type(const Pointfs& shape); - void render_internal(GLCanvas3D& canvas, bool bottom, float scale_factor, - bool show_axes); - void render_axes() const; - void render_system(GLCanvas3D& canvas, bool bottom) const; + void render_system(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom); + + void render_internal(GLCanvas3D &canvas, + const Transform3d &view_matrix, + const Transform3d &projection_matrix, + bool bottom, + float scale_factor, + bool show_axes, + bool picking); //void render_texture(bool bottom, GLCanvas3D& canvas) const; - void render_model() const; - void render_custom(GLCanvas3D& canvas, bool bottom) const; - void render_default(bool bottom) const; + void render_model(const Transform3d& view_matrix, const Transform3d& projection_matrix); + // void render_model(); + void render_custom(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool picking); + void render_default(bool bottom, bool picking, const Transform3d& view_matrix, const Transform3d& projection_matrix); void release_VBOs(); + void register_raycasters_for_picking(const GLModel::Geometry& geometry, const Transform3d& trafo); }; } // GUI diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index be821f64fed..1b644a98a3e 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -1,6 +1,6 @@ #include "slic3r/GUI/3DScene.hpp" #include - +#include "MeshUtils.hpp" #if ENABLE_SMOOTH_NORMALS #include #include @@ -353,28 +353,30 @@ void GLVolume::SinkingContours::update() const TriangleMesh& mesh = model.objects[object_idx]->volumes[m_parent.volume_idx()]->mesh(); m_model.reset(); - GUI::GLModel::InitializationData init_data; + GUI::GLModel::Geometry init_data; + init_data.format = {GUI::GLModel::Geometry::EPrimitiveType::Triangles, GUI::GLModel::Geometry::EVertexLayout::P3}; + init_data.color = ColorRGBA::WHITE(); + unsigned int vertices_counter = 0; MeshSlicingParams slicing_params; - slicing_params.trafo = m_parent.world_matrix(); - Polygons polygons = union_(slice_mesh(mesh.its, 0.0f, slicing_params)); - for (ExPolygon &expoly : diff_ex(expand(polygons, float(scale_(HalfWidth))), shrink(polygons, float(scale_(HalfWidth))))) { - GUI::GLModel::InitializationData::Entity entity; - entity.type = GUI::GLModel::PrimitiveType::Triangles; + slicing_params.trafo = m_parent.world_matrix(); + const Polygons polygons = union_(slice_mesh(mesh.its, 0.0f, slicing_params)); + if (polygons.empty()) + return; + + for (const ExPolygon &expoly : diff_ex(expand(polygons, float(scale_(HalfWidth))), shrink(polygons, float(scale_(HalfWidth))))) { const std::vector triangulation = triangulate_expolygon_3d(expoly); - for (const Vec3d& v : triangulation) { - entity.positions.emplace_back(v.cast() + Vec3f(0.0f, 0.0f, 0.015f)); // add a small positive z to avoid z-fighting - entity.normals.emplace_back(Vec3f::UnitZ()); - const size_t positions_count = entity.positions.size(); - if (positions_count % 3 == 0) { - entity.indices.emplace_back(positions_count - 3); - entity.indices.emplace_back(positions_count - 2); - entity.indices.emplace_back(positions_count - 1); - } + init_data.reserve_vertices(init_data.vertices_count() + triangulation.size()); + init_data.reserve_indices(init_data.indices_count() + triangulation.size()); + for (const Vec3d &v : triangulation) { + init_data.add_vertex((Vec3f) (v.cast() + 0.015f * Vec3f::UnitZ())); // add a small positive z to avoid z-fighting + ++vertices_counter; + if (vertices_counter % 3 == 0) + init_data.add_triangle(vertices_counter - 3, vertices_counter - 2, vertices_counter - 1); } - init_data.entities.emplace_back(entity); } - m_model.init_from(init_data); + if (init_data.vertices_count() > 0) + m_model.init_from(std::move(init_data)); } else m_shift = box.center() - m_old_box.center(); @@ -453,12 +455,19 @@ GLVolume::GLVolume(float r, float g, float b, float a) , force_sinking_contours(false) , tverts_range(0, size_t(-1)) , qverts_range(0, size_t(-1)) + , mesh_raycaster(nullptr) { color = { r, g, b, a }; set_render_color(color); mmuseg_ts = 0; } +GLVolume::~GLVolume(){ + if(mesh_raycaster){ + delete mesh_raycaster; + mesh_raycaster = nullptr; + } +} void GLVolume::set_color(const std::array& rgba) { color = rgba; @@ -1105,6 +1114,9 @@ int GLVolumeCollection::load_object_volume( else v.model_object_ID = instance->id().id; + if (m_use_raycasters) + v.mesh_raycaster = new GUI::MeshRaycaster(std::make_shared(mesh)); + return int(this->volumes.size() - 1); } @@ -1140,6 +1152,7 @@ void GLVolumeCollection::load_object_auxiliary( v.indexed_vertex_array.finalize_geometry(opengl_initialized); v.composite_id = GLVolume::CompositeID(obj_idx, -int(milestone), (int)instance_idx.first); v.geometry_id = std::pair(timestamp, model_instance.id().id); + v.mesh_raycaster = new GUI::MeshRaycaster(std::make_shared(mesh)); // Create a copy of the convex hull mesh for each instance. Use a move operator on the last instance. if (&instance_idx == &instances.back()) v.set_convex_hull(std::move(convex_hull)); @@ -1198,6 +1211,7 @@ int GLVolumeCollection::load_wipe_tower_preview( v.indexed_vertex_array.load_mesh(wipe_tower_shell); v.indexed_vertex_array.finalize_geometry(opengl_initialized); v.set_convex_hull(wipe_tower_shell); + v.mesh_raycaster = new GUI::MeshRaycaster(std::make_shared(wipe_tower_shell)); v.set_volume_offset(Vec3d(pos_x, pos_y, 0.0)); v.set_volume_rotation(Vec3d(0., 0., (M_PI / 180.) * rotation_angle)); v.composite_id = GLVolume::CompositeID(obj_idx, 0, 0); @@ -2322,5 +2336,4 @@ void _3DScene::point3_to_verts(const Vec3crd& point, double width, double height { thick_point_to_verts(point, width, height, volume); } - } // namespace Slic3r diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index c850884da84..cde588dae36 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -35,7 +35,10 @@ extern float FullyTransparentMaterialThreshold; extern float FullTransparentModdifiedToFixAlpha; extern std::array adjust_color_for_rendering(const std::array &colors); - +namespace Slic3r { +namespace GUI { + class MeshRaycaster; +}} namespace Slic3r { class SLAPrintObject; enum SLAPrintObjectStep : unsigned int; @@ -289,7 +292,7 @@ class GLVolume { GLVolume(float r = 1.f, float g = 1.f, float b = 1.f, float a = 1.f); GLVolume(const std::array& rgba) : GLVolume(rgba[0], rgba[1], rgba[2], rgba[3]) {} - virtual ~GLVolume() = default; + virtual ~GLVolume(); // BBS protected: @@ -398,6 +401,8 @@ class GLVolume { // Is mouse or rectangle selection over this object to select/deselect it ? EHoverState hover; + // raycaster used for picking + GUI::MeshRaycaster* mesh_raycaster; // Interleaved triangles & normals with indexed triangles & quads. GLIndexedVertexArray indexed_vertex_array; @@ -614,6 +619,7 @@ class GLVolumeCollection Slope m_slope; bool m_show_sinking_contours = false; + bool m_use_raycasters{ true }; public: GLVolumePtrs volumes; @@ -681,6 +687,7 @@ class GLVolumeCollection bool empty() const { return volumes.empty(); } void set_range(double low, double high) { for (GLVolume *vol : this->volumes) vol->set_range(low, high); } + void set_use_raycasters(bool value) { m_use_raycasters = value; } void set_print_volume(const PrintVolume& print_volume) { m_print_volume = print_volume; } diff --git a/src/slic3r/GUI/CoordAxes.cpp b/src/slic3r/GUI/CoordAxes.cpp new file mode 100644 index 00000000000..734f8ddfaf4 --- /dev/null +++ b/src/slic3r/GUI/CoordAxes.cpp @@ -0,0 +1,69 @@ +#include "libslic3r/libslic3r.h" + +#include "CoordAxes.hpp" +#include "GUI_App.hpp" +#include "3DScene.hpp" +#include "Plater.hpp" +#include "Camera.hpp" + +#include + +namespace Slic3r { +namespace GUI { + +const float CoordAxes::DefaultStemRadius = 0.5f; +const float CoordAxes::DefaultStemLength = 25.0f; +const float CoordAxes::DefaultTipRadius = 2.5f * CoordAxes::DefaultStemRadius; +const float CoordAxes::DefaultTipLength = 5.0f; + +void CoordAxes::render(const Transform3d& trafo, float emission_factor) +{ + auto render_axis = [this](GLShaderProgram& shader, const Transform3d& transform) { + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + const Transform3d matrix = view_matrix * transform; + shader.set_uniform("view_model_matrix", matrix); + shader.set_uniform("projection_matrix", camera.get_projection_matrix()); + shader.set_uniform("view_normal_matrix", (Matrix3d)(view_matrix.matrix().block(0, 0, 3, 3) * transform.matrix().block(0, 0, 3, 3).inverse().transpose())); + m_arrow.render(); + }; + + if (!m_arrow.is_initialized()) + m_arrow.init_from(stilized_arrow(16, m_tip_radius, m_tip_length, m_stem_radius, m_stem_length)); + + GLShaderProgram* curr_shader = wxGetApp().get_current_shader(); + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + if (shader == nullptr) + return; + + if (curr_shader != nullptr) + curr_shader->stop_using(); + + shader->start_using(); + shader->set_uniform("emission_factor", emission_factor); + + // Scale the axes if the camera is close to them to avoid issues + // such as https://github.com/prusa3d/PrusaSlicer/issues/9483 + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d scale_tr = Transform3d::Identity(); + scale_tr.scale(std::min(1., camera.get_inv_zoom() * 10.)); + + // x axis + m_arrow.set_color(ColorRGBA::X()); + render_axis(*shader, trafo * Geometry::translation_transform(m_origin) * Geometry::rotation_transform({ 0.0, 0.5 * M_PI, 0.0 }) * scale_tr); + + // y axis + m_arrow.set_color(ColorRGBA::Y()); + render_axis(*shader, trafo * Geometry::translation_transform(m_origin) * Geometry::rotation_transform({ -0.5 * M_PI, 0.0, 0.0 }) * scale_tr); + + // z axis + m_arrow.set_color(ColorRGBA::Z()); + render_axis(*shader, trafo * Geometry::translation_transform(m_origin) * scale_tr); + + shader->stop_using(); + if (curr_shader != nullptr) + curr_shader->start_using(); +} + +} // GUI +} // Slic3r diff --git a/src/slic3r/GUI/CoordAxes.hpp b/src/slic3r/GUI/CoordAxes.hpp new file mode 100644 index 00000000000..1d934751f23 --- /dev/null +++ b/src/slic3r/GUI/CoordAxes.hpp @@ -0,0 +1,57 @@ +#ifndef slic3r_CoordAxes_hpp_ +#define slic3r_CoordAxes_hpp_ + +#include "GLModel.hpp" + +namespace Slic3r { +namespace GUI { + +class CoordAxes +{ +public: + static const float DefaultStemRadius; + static const float DefaultStemLength; + static const float DefaultTipRadius; + static const float DefaultTipLength; + +private: + Vec3d m_origin{ Vec3d::Zero() }; + float m_stem_radius{ DefaultStemRadius }; + float m_stem_length{ DefaultStemLength }; + float m_tip_radius{ DefaultTipRadius }; + float m_tip_length{ DefaultTipLength }; + GLModel m_arrow; + +public: + const Vec3d& get_origin() const { return m_origin; } + void set_origin(const Vec3d& origin) { m_origin = origin; } + void set_stem_radius(float radius) { + m_stem_radius = radius; + m_arrow.reset(); + } + void set_stem_length(float length) { + m_stem_length = length; + m_arrow.reset(); + } + void set_tip_radius(float radius) { + m_tip_radius = radius; + m_arrow.reset(); + } + void set_tip_length(float length) { + m_tip_length = length; + m_arrow.reset(); + } + + float get_stem_radius() const { return m_stem_radius; } + float get_stem_length() const { return m_stem_length; } + float get_tip_radius() const { return m_tip_radius; } + float get_tip_length() const { return m_tip_length; } + float get_total_length() const { return m_stem_length + m_tip_length; } + + void render(const Transform3d& trafo, float emission_factor = 0.0f); +}; + +} // GUI +} // Slic3r + +#endif // slic3r_CoordAxes_hpp_ diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 3d0e4f2b9cd..5aed6b8ef13 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1,3 +1,4 @@ +#include "libslic3r/Color.hpp" #include "libslic3r/libslic3r.h" #include "GCodeViewer.hpp" @@ -331,7 +332,7 @@ void GCodeViewer::SequentialView::Marker::init(std::string filename) } else { m_model.init_from_file(filename); } - m_model.set_color(-1, {1.0f, 1.0f, 1.0f, 0.5f}); + m_model.set_color(ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f)); } void GCodeViewer::SequentialView::Marker::set_world_position(const Vec3f& position) @@ -345,7 +346,7 @@ void GCodeViewer::SequentialView::Marker::update_curr_move(const GCodeProcessorR } //BBS: GUI refactor: add canvas size from parameters -void GCodeViewer::SequentialView::Marker::render(int canvas_width, int canvas_height, const EViewType& view_type) const +void GCodeViewer::SequentialView::Marker::render(int canvas_width, int canvas_height, const EViewType& view_type) { if (!m_visible) return; @@ -359,14 +360,16 @@ void GCodeViewer::SequentialView::Marker::render(int canvas_width, int canvas_he shader->start_using(); shader->set_uniform("emission_factor", 0.0f); - - glsafe(::glPushMatrix()); - glsafe(::glMultMatrixf(m_world_transform.data())); + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + const Transform3d model_matrix = m_world_transform.cast(); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); m_model.render(); - glsafe(::glPopMatrix()); - shader->stop_using(); glsafe(::glDisable(GL_BLEND)); @@ -713,7 +716,7 @@ void GCodeViewer::SequentialView::GCodeWindow::stop_mapping_file() BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": finished mapping file " << m_filename; } } -void GCodeViewer::SequentialView::render(const bool has_render_path, float legend_height, int canvas_width, int canvas_height, int right_margin, const EViewType& view_type) const +void GCodeViewer::SequentialView::render(const bool has_render_path, float legend_height, int canvas_width, int canvas_height, int right_margin, const EViewType& view_type) { if (has_render_path) marker.render(canvas_width, canvas_height, view_type); @@ -790,6 +793,7 @@ GCodeViewer::GCodeViewer() m_moves_slider = new IMSlider(0, 0, 0, 100, wxSL_HORIZONTAL); m_layers_slider = new IMSlider(0, 0, 0, 100, wxSL_VERTICAL); m_extrusions.reset_role_visibility_flags(); + m_shells.volumes.set_use_raycasters(false); // m_sequential_view.skip_invisible_moves = true; } @@ -1387,7 +1391,7 @@ void GCodeViewer::_render_calibration_thumbnail_internal(ThumbnailData& thumbnai } if (range.vbo > 0) { - buffer.model.model.set_color(-1, range.color); + buffer.model.model.set_color(range.color); buffer.model.model.render_instanced(range.vbo, range.count); #if ENABLE_GCODE_VIEWER_STATISTICS ++m_statistics.gl_instanced_models_calls_count; @@ -2332,28 +2336,28 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result, const }; // format data into the buffers to be rendered as batched model - auto add_vertices_as_model_batch = [](const GCodeProcessorResult::MoveVertex& curr, const GLModel::InitializationData& data, VertexBuffer& vertices, InstanceBuffer& instances, InstanceIdBuffer& instances_ids, size_t move_id) { + auto add_vertices_as_model_batch = [](const GCodeProcessorResult::MoveVertex& curr, const GLModel::Geometry& data, VertexBuffer& vertices, InstanceBuffer& instances, InstanceIdBuffer& instances_ids, size_t move_id) { const double width = static_cast(1.5f * curr.width); const double height = static_cast(1.5f * curr.height); - const Transform3d trafo = Geometry::assemble_transform((curr.position - 0.5f * curr.height * Vec3f::UnitZ()).cast(), Vec3d::Zero(), { width, width, height }); + const Transform3d trafo = Geometry::translation_transform((curr.position - 0.5f * curr.height * Vec3f::UnitZ()).cast()) * + Geometry::scale_transform({ width, width, height }); const Eigen::Matrix normal_matrix = trafo.matrix().template block<3, 3>(0, 0).inverse().transpose(); - for (const auto& entity : data.entities) { - // append vertices - for (size_t i = 0; i < entity.positions.size(); ++i) { - // append position - const Vec3d position = trafo * entity.positions[i].cast(); - vertices.push_back(static_cast(position.x())); - vertices.push_back(static_cast(position.y())); - vertices.push_back(static_cast(position.z())); - - // append normal - const Vec3d normal = normal_matrix * entity.normals[i].cast(); - vertices.push_back(static_cast(normal.x())); - vertices.push_back(static_cast(normal.y())); - vertices.push_back(static_cast(normal.z())); - } + // append vertices + const size_t vertices_count = data.vertices_count(); + for (size_t i = 0; i < vertices_count; ++i) { + // append position + const Vec3d position = trafo * data.extract_position_3(i).cast(); + vertices.push_back(float(position.x())); + vertices.push_back(float(position.y())); + vertices.push_back(float(position.z())); + + // append normal + const Vec3d normal = normal_matrix * data.extract_normal_3(i).cast(); + vertices.push_back(float(normal.x())); + vertices.push_back(float(normal.y())); + vertices.push_back(float(normal.z())); } // append instance position @@ -2364,11 +2368,10 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result, const instances_ids.push_back(move_id); }; - auto add_indices_as_model_batch = [](const GLModel::InitializationData& data, IndexBuffer& indices, IBufferType base_index) { - for (const auto& entity : data.entities) { - for (size_t i = 0; i < entity.indices.size(); ++i) { - indices.push_back(static_cast(entity.indices[i] + base_index)); - } + auto add_indices_as_model_batch = [](const GLModel::Geometry& data, IndexBuffer& indices, IBufferType base_index) { + const size_t indices_count = data.indices_count(); + for (size_t i = 0; i < indices_count; ++i) { + indices.push_back(static_cast(data.extract_index(i) + base_index)); } }; @@ -3909,7 +3912,7 @@ void GCodeViewer::render_toolpaths() } if (range.vbo > 0) { - buffer.model.model.set_color(-1, range.color); + buffer.model.model.set_color(range.color); buffer.model.model.render_instanced(range.vbo, range.count); #if ENABLE_GCODE_VIEWER_STATISTICS ++m_statistics.gl_instanced_models_calls_count; diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 818f3a3e5eb..74172b43b30 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -314,7 +314,7 @@ class GCodeViewer GLModel model; Color color; InstanceVBuffer instances; - GLModel::InitializationData data; + GLModel::Geometry data; void reset(); }; @@ -645,7 +645,7 @@ Range layer_duration_log; bool is_visible() const { return m_visible; } void set_visible(bool visible) { m_visible = visible; } - void render(int canvas_width, int canvas_height, const EViewType& view_type) const; + void render(int canvas_width, int canvas_height, const EViewType& view_type); void on_change_color_mode(bool is_dark) { m_is_dark = is_dark; } void update_curr_move(const GCodeProcessorResult::MoveVertex move); @@ -712,7 +712,7 @@ Range layer_duration_log; std::vector gcode_ids; float m_scale = 1.0; bool m_show_gcode_window = false; - void render(const bool has_render_path, float legend_height, int canvas_width, int canvas_height, int right_margin, const EViewType& view_type) const; + void render(const bool has_render_path, float legend_height, int canvas_width, int canvas_height, int right_margin, const EViewType& view_type); }; struct ETools diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 284398c8f86..05c5e93f0b2 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1,3 +1,4 @@ +#include "libslic3r/Point.hpp" #include "libslic3r/libslic3r.h" #include "GLCanvas3D.hpp" @@ -884,50 +885,45 @@ void GLCanvas3D::SequentialPrintClearance::set_polygons(const Polygons& polygons const size_t vertices_count = 3 * triangles_count; if (m_render_fill) { - GLModel::InitializationData fill_data; - GLModel::InitializationData::Entity entity; - entity.type = GLModel::PrimitiveType::Triangles; - entity.color = {0.8f, 0.8f, 1.0f, 0.5f}; - entity.positions.reserve(vertices_count); - entity.normals.reserve(vertices_count); - entity.indices.reserve(vertices_count); - - const ExPolygons polygons_union = union_ex(polygons); + GLModel::Geometry fill_data; + fill_data.format = {GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3}; + fill_data.color = {0.3333f, 0.0f, 0.0f, 0.5f}; + + // vertices + indices + const ExPolygons polygons_union = union_ex(polygons); + unsigned int vertices_counter = 0; for (const ExPolygon &poly : polygons_union) { const std::vector triangulation = triangulate_expolygon_3d(poly); for (const Vec3d &v : triangulation) { - entity.positions.emplace_back(v.cast() + Vec3f(0.0f, 0.0f, 0.0125f)); // add a small positive z to avoid z-fighting - entity.normals.emplace_back(Vec3f::UnitZ()); - const size_t positions_count = entity.positions.size(); - if (positions_count % 3 == 0) { - entity.indices.emplace_back(positions_count - 3); - entity.indices.emplace_back(positions_count - 2); - entity.indices.emplace_back(positions_count - 1); - } + fill_data.add_vertex( + (Vec3f) (v.cast() + 0.0125f * Vec3f::UnitZ())); // add a small positive z to avoid z-fighting + ++vertices_counter; + if (vertices_counter % 3 == 0) + fill_data.add_triangle(vertices_counter - 3, vertices_counter - 2, vertices_counter - 1); } } - fill_data.entities.emplace_back(entity); - m_fill.init_from(fill_data); + m_fill.init_from(std::move(fill_data)); } - GLModel::InitializationData perimeter_data; + GLModel::Geometry perimeter_data; + perimeter_data.format = {GLModel::Geometry::EPrimitiveType::LineLoop, GLModel::Geometry::EVertexLayout::P3N3}; for (const Polygon &poly : polygons) { - GLModel::InitializationData::Entity ent; - ent.type = GLModel::PrimitiveType::LineLoop; - ent.positions.reserve(poly.points.size()); - ent.indices.reserve(poly.points.size()); + // GLModel::Geometry::Entity ent; + // ent.type = GLModel::EPrimitiveType::LineLoop; + // ent.positions.reserve(poly.points.size()); + // ent.indices.reserve(poly.points.size()); + perimeter_data.reserve_vertices(perimeter_data.vertices_count() + poly.points.size()); + perimeter_data.reserve_indices(perimeter_data.indices_count() + poly.points.size()); unsigned int id_count = 0; for (const Point &p : poly.points) { - ent.positions.emplace_back(unscale(p.x()), unscale(p.y()), 0.025f); // add a small positive z to avoid z-fighting - ent.normals.emplace_back(Vec3f::UnitZ()); - ent.indices.emplace_back(id_count++); + perimeter_data.add_vertex(Vec3f(unscale(p.x()), unscale(p.y()), 0.025f), + Vec3f(0, 0, 1)); // add a small positive z to avoid z-fighting + perimeter_data.indices.emplace_back(id_count++); } - - perimeter_data.entities.emplace_back(ent); } - m_perimeter.init_from(perimeter_data); + m_perimeter.init_from(std::move(perimeter_data)); } //BBS: add the height limit compute logic @@ -936,32 +932,27 @@ void GLCanvas3D::SequentialPrintClearance::set_polygons(const Polygons& polygons for (const auto &poly : height_polygons) { height_triangles_count += poly.first.points.size() - 2; } const size_t height_vertices_count = 3 * height_triangles_count; - GLModel::InitializationData height_fill_data; - GLModel::InitializationData::Entity height_entity; - height_entity.type = GLModel::PrimitiveType::Triangles; - height_entity.color = {0.8f, 0.8f, 1.0f, 0.5f}; - height_entity.positions.reserve(height_vertices_count); - height_entity.normals.reserve(height_vertices_count); - height_entity.indices.reserve(height_vertices_count); + GLModel::Geometry height_fill_data; + height_fill_data.format = {GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3}; + height_fill_data.color = {0.8f, 0.8f, 1.0f, 0.5f}; + height_fill_data.reserve_vertices(height_vertices_count); + height_fill_data.reserve_indices(height_vertices_count); for (const auto &poly : height_polygons) { ExPolygon ex_poly(poly.first); const std::vector height_triangulation = triangulate_expolygon_3d(ex_poly); for (const Vec3d &v : height_triangulation) { Vec3d point{v.x(), v.y(), poly.second}; - height_entity.positions.emplace_back(point.cast()); - height_entity.normals.emplace_back(Vec3f::UnitZ()); - const size_t height_positions_count = height_entity.positions.size(); + height_fill_data.add_vertex(point.cast(), Vec3f(0,0,1)); // add a small positive z to avoid z-fighting + const size_t height_positions_count = height_fill_data.vertices_count(); if (height_positions_count % 3 == 0) { - height_entity.indices.emplace_back(height_positions_count - 3); - height_entity.indices.emplace_back(height_positions_count - 2); - height_entity.indices.emplace_back(height_positions_count - 1); + height_fill_data.add_triangle(height_positions_count - 3, height_positions_count - 2, + height_positions_count - 1); } } } - height_fill_data.entities.emplace_back(height_entity); - m_height_limit.init_from(height_fill_data); + m_height_limit.init_from(std::move(height_fill_data)); } } @@ -981,11 +972,11 @@ void GLCanvas3D::SequentialPrintClearance::render() glsafe(::glEnable(GL_BLEND)); glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); - m_perimeter.set_color(-1, m_render_fill ? FILL_COLOR : NO_FILL_COLOR); + m_perimeter.set_color(m_render_fill ? FILL_COLOR : NO_FILL_COLOR); m_perimeter.render(); m_fill.render(); //BBS: add height limit - m_height_limit.set_color(-1, m_render_fill ? FILL_COLOR : NO_FILL_COLOR); + m_height_limit.set_color(m_render_fill ? FILL_COLOR : NO_FILL_COLOR); m_height_limit.render(); glsafe(::glDisable(GL_BLEND)); @@ -1868,14 +1859,20 @@ void GLCanvas3D::render(bool only_init) wxGetApp().imgui()->new_frame(); if (m_picking_enabled) { - if (m_rectangle_selection.is_dragging()) + if (m_rectangle_selection.is_dragging() && !m_rectangle_selection.is_empty()) // picking pass using rectangle selection _rectangular_selection_picking_pass(); - //BBS: enable picking when no volumes for partplate logic - //else if (!m_volumes.empty()) - else + else if (!m_volumes.empty()) // regular picking pass _picking_pass(); +#if ENABLE_RAYCAST_PICKING_DEBUG + else { + ImGuiWrapper& imgui = *wxGetApp().imgui(); + imgui.begin(std::string("Hit result"), ImGuiWindowFlags_AlwaysAutoResize); + imgui.text("Picking disabled"); + imgui.end(); + } +#endif // ENABLE_RAYCAST_PICKING_DEBUG } #if ENABLE_RENDER_PICKING_PASS @@ -1903,7 +1900,7 @@ void GLCanvas3D::render(bool only_init) _render_sla_slices(); _render_selection(); if (!no_partplate) - _render_bed(!camera.is_looking_downward(), show_axes); + _render_bed(camera.get_view_matrix(), camera.get_projection_matrix(), !camera.is_looking_downward(), show_axes); if (!no_partplate) //BBS: add outline logic _render_platelist(!camera.is_looking_downward(), only_current, only_body, hover_id, true); _render_objects(GLVolumeCollection::ERenderType::Transparent, !m_gizmos.is_running()); @@ -1913,7 +1910,7 @@ void GLCanvas3D::render(bool only_init) _render_objects(GLVolumeCollection::ERenderType::Opaque, !m_gizmos.is_running()); _render_sla_slices(); _render_selection(); - _render_bed(!camera.is_looking_downward(), show_axes); + _render_bed(camera.get_view_matrix(), camera.get_projection_matrix(), !camera.is_looking_downward(), show_axes); _render_platelist(!camera.is_looking_downward(), only_current, true, hover_id); // BBS: GUI refactor: add canvas size as parameters _render_gcode(cnv_size.get_width(), cnv_size.get_height()); @@ -2684,6 +2681,8 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re else m_selection.volumes_changed(map_glvolume_old_to_new); + // @Enrico suggest this solution to preven accessing pointer on caster without data + m_scene_raycaster.remove_raycasters(SceneRaycaster::EType::Volume); m_gizmos.update_data(); m_gizmos.update_assemble_view_data(); m_gizmos.refresh_on_off_state(); @@ -2737,6 +2736,22 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re manip->set_dirty(); #endif } + + // refresh volume raycasters for picking + for (size_t i = 0; i < m_volumes.volumes.size(); ++i) { + const GLVolume* v = m_volumes.volumes[i]; + assert(v->mesh_raycaster != nullptr); + std::shared_ptr raycaster = add_raycaster_for_picking(SceneRaycaster::EType::Volume, i, *v->mesh_raycaster, v->world_matrix()); + raycaster->set_active(v->is_active); + } + // refresh gizmo elements raycasters for picking + GLGizmoBase* curr_gizmo = m_gizmos.get_current(); + if (curr_gizmo != nullptr) + curr_gizmo->unregister_raycasters_for_picking(); + m_scene_raycaster.remove_raycasters(SceneRaycaster::EType::Gizmo); + m_scene_raycaster.remove_raycasters(SceneRaycaster::EType::FallbackGizmo); + if (curr_gizmo != nullptr && !m_selection.is_empty()) + curr_gizmo->register_raycasters_for_picking(); // and force this canvas to be redrawn. m_dirty = true; @@ -6472,94 +6487,166 @@ void GLCanvas3D::_refresh_if_shown_on_screen() void GLCanvas3D::_picking_pass() { - std::vector* hover_volume_idxs = const_cast*>(&m_hover_volume_idxs); - std::vector* hover_plate_idxs = const_cast*>(&m_hover_plate_idxs); - - if (m_picking_enabled && !m_mouse.dragging && m_mouse.position != Vec2d(DBL_MAX, DBL_MAX)) { - hover_volume_idxs->clear(); - hover_plate_idxs->clear(); - - // Render the object for picking. - // FIXME This cannot possibly work in a multi - sampled context as the color gets mangled by the anti - aliasing. - // Better to use software ray - casting on a bounding - box hierarchy. - - if (m_multisample_allowed) - // This flag is often ignored by NVIDIA drivers if rendering into a screen buffer. - glsafe(::glDisable(GL_MULTISAMPLE)); + if (!m_picking_enabled || m_mouse.dragging || m_mouse.position == Vec2d(DBL_MAX, DBL_MAX) || m_gizmos.is_dragging()) { +#if ENABLE_RAYCAST_PICKING_DEBUG + ImGuiWrapper& imgui = *wxGetApp().imgui(); + imgui.begin(std::string("Hit result"), ImGuiWindowFlags_AlwaysAutoResize); + imgui.text("Picking disabled"); + imgui.end(); +#endif // ENABLE_RAYCAST_PICKING_DEBUG + return; + } - glsafe(::glDisable(GL_BLEND)); - glsafe(::glEnable(GL_DEPTH_TEST)); + m_hover_volume_idxs.clear(); - glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); + const ClippingPlane clipping_plane = m_gizmos.get_clipping_plane().inverted_normal(); + const SceneRaycaster::HitResult hit = m_scene_raycaster.hit(m_mouse.position, wxGetApp().plater()->get_camera(), &clipping_plane); + if (hit.is_valid()) { + switch (hit.type) + { + case SceneRaycaster::EType::Volume: + { + if (0 <= hit.raycaster_id && hit.raycaster_id < (int)m_volumes.volumes.size()) { + const GLVolume* volume = m_volumes.volumes[hit.raycaster_id]; + if (volume->is_active && !volume->disabled && (volume->composite_id.volume_id >= 0 || m_render_sla_auxiliaries)) { + // do not add the volume id if any gizmo is active and CTRL is pressed + if (m_gizmos.get_current_type() == GLGizmosManager::EType::Undefined || !wxGetKeyState(WXK_CONTROL)) + m_hover_volume_idxs.emplace_back(hit.raycaster_id); + m_gizmos.set_hover_id(-1); + } + } + else + assert(false); - //BBS: only render plate in view 3D - if (m_canvas_type == ECanvasType::CanvasView3D) { - _render_plates_for_picking(); + break; } - - m_camera_clipping_plane = m_gizmos.get_clipping_plane(); - if (m_camera_clipping_plane.is_active()) { - ::glClipPlane(GL_CLIP_PLANE0, (GLdouble*)m_camera_clipping_plane.get_data()); - ::glEnable(GL_CLIP_PLANE0); + case SceneRaycaster::EType::Gizmo: + case SceneRaycaster::EType::FallbackGizmo: + { + const Size& cnv_size = get_canvas_size(); + const bool inside = 0 <= m_mouse.position.x() && m_mouse.position.x() < cnv_size.get_width() && + 0 <= m_mouse.position.y() && m_mouse.position.y() < cnv_size.get_height(); + m_gizmos.set_hover_id(inside ? hit.raycaster_id : -1); + break; } - _render_volumes_for_picking(); - if (m_camera_clipping_plane.is_active()) - ::glDisable(GL_CLIP_PLANE0); + case SceneRaycaster::EType::Bed: + { + m_gizmos.set_hover_id(-1); + break; + } + default: + { + assert(false); + break; + } + } + } + else + m_gizmos.set_hover_id(-1); - //BBS: remove the bed picking logic - //_render_bed_for_picking(!wxGetApp().plater()->get_camera().is_looking_downward()); + _update_volumes_hover_state(); - m_gizmos.render_current_gizmo_for_picking_pass(); +#if ENABLE_RAYCAST_PICKING_DEBUG + ImGuiWrapper& imgui = *wxGetApp().imgui(); + imgui.begin(std::string("Hit result"), ImGuiWindowFlags_AlwaysAutoResize); + std::string object_type = "None"; + switch (hit.type) + { + case SceneRaycaster::EType::Bed: { object_type = "Bed"; break; } + case SceneRaycaster::EType::Gizmo: { object_type = "Gizmo element"; break; } + case SceneRaycaster::EType::FallbackGizmo: { object_type = "Gizmo2 element"; break; } + case SceneRaycaster::EType::Volume: + { + if (m_volumes.volumes[hit.raycaster_id]->is_wipe_tower) + object_type = "Volume (Wipe tower)"; + else if (m_volumes.volumes[hit.raycaster_id]->volume_idx() == -int(slaposPad)) + object_type = "Volume (SLA pad)"; + else if (m_volumes.volumes[hit.raycaster_id]->volume_idx() == -int(slaposSupportTree)) + object_type = "Volume (SLA supports)"; + else if (m_volumes.volumes[hit.raycaster_id]->is_modifier) + object_type = "Volume (Modifier)"; + else + object_type = "Volume (Part)"; + break; + } + default: { break; } + } - if (m_multisample_allowed) - glsafe(::glEnable(GL_MULTISAMPLE)); + auto add_strings_row_to_table = [&imgui](const std::string& col_1, const ImVec4& col_1_color, const std::string& col_2, const ImVec4& col_2_color, + const std::string& col_3 = "", const ImVec4& col_3_color = ImGui::GetStyleColorVec4(ImGuiCol_Text)) { + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + imgui.text_colored(col_1_color, col_1.c_str()); + ImGui::TableSetColumnIndex(1); + imgui.text_colored(col_2_color, col_2.c_str()); + if (!col_3.empty()) { + ImGui::TableSetColumnIndex(2); + imgui.text_colored(col_3_color, col_3.c_str()); + } + }; - int volume_id = -1; - int gizmo_id = -1; + char buf[1024]; + if (hit.type != SceneRaycaster::EType::None) { + if (ImGui::BeginTable("Hit", 2)) { + add_strings_row_to_table("Object ID", ImGuiWrapper::COL_ORANGE_LIGHT, std::to_string(hit.raycaster_id), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + add_strings_row_to_table("Type", ImGuiWrapper::COL_ORANGE_LIGHT, object_type, ImGui::GetStyleColorVec4(ImGuiCol_Text)); + sprintf(buf, "%.3f, %.3f, %.3f", hit.position.x(), hit.position.y(), hit.position.z()); + add_strings_row_to_table("Position", ImGuiWrapper::COL_ORANGE_LIGHT, std::string(buf), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + sprintf(buf, "%.3f, %.3f, %.3f", hit.normal.x(), hit.normal.y(), hit.normal.z()); + add_strings_row_to_table("Normal", ImGuiWrapper::COL_ORANGE_LIGHT, std::string(buf), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ImGui::EndTable(); + } + } + else + imgui.text("NO HIT"); - GLubyte color[4] = { 0, 0, 0, 0 }; - const Size& cnv_size = get_canvas_size(); - bool inside = 0 <= m_mouse.position(0) && m_mouse.position(0) < cnv_size.get_width() && 0 <= m_mouse.position(1) && m_mouse.position(1) < cnv_size.get_height(); - if (inside) { - glsafe(::glReadPixels(m_mouse.position(0), cnv_size.get_height() - m_mouse.position(1) - 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)color)); - if (picking_checksum_alpha_channel(color[0], color[1], color[2]) == color[3]) { - // Only non-interpolated colors are valid, those have their lowest three bits zeroed. - // we reserve color = (0,0,0) for occluders (as the printbed) - // volumes' id are shifted by 1 - // see: _render_volumes_for_picking() - //BBS: remove the bed picking logic - //volume_id = color[0] + (color[1] << 8) + (color[2] << 16) - 1; - volume_id = color[0] + (color[1] << 8) + (color[2] << 16); - // gizmos' id are instead properly encoded by the color - gizmo_id = color[0] + (color[1] << 8) + (color[2] << 16); + ImGui::Separator(); + imgui.text("Registered for picking:"); + if (ImGui::BeginTable("Raycasters", 2)) { + sprintf(buf, "%d (%d)", (int)m_scene_raycaster.beds_count(), (int)m_scene_raycaster.active_beds_count()); + add_strings_row_to_table("Beds", ImGuiWrapper::COL_ORANGE_LIGHT, std::string(buf), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + sprintf(buf, "%d (%d)", (int)m_scene_raycaster.volumes_count(), (int)m_scene_raycaster.active_volumes_count()); + add_strings_row_to_table("Volumes", ImGuiWrapper::COL_ORANGE_LIGHT, std::string(buf), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + sprintf(buf, "%d (%d)", (int)m_scene_raycaster.gizmos_count(), (int)m_scene_raycaster.active_gizmos_count()); + add_strings_row_to_table("Gizmo elements", ImGuiWrapper::COL_ORANGE_LIGHT, std::string(buf), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + sprintf(buf, "%d (%d)", (int)m_scene_raycaster.fallback_gizmos_count(), (int)m_scene_raycaster.active_fallback_gizmos_count()); + add_strings_row_to_table("Gizmo2 elements", ImGuiWrapper::COL_ORANGE_LIGHT, std::string(buf), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ImGui::EndTable(); + } + + std::vector>* gizmo_raycasters = m_scene_raycaster.get_raycasters(SceneRaycaster::EType::Gizmo); + if (gizmo_raycasters != nullptr && !gizmo_raycasters->empty()) { + ImGui::Separator(); + imgui.text("Gizmo raycasters IDs:"); + if (ImGui::BeginTable("GizmoRaycasters", 3)) { + for (size_t i = 0; i < gizmo_raycasters->size(); ++i) { + add_strings_row_to_table(std::to_string(i), ImGuiWrapper::COL_ORANGE_LIGHT, + std::to_string(SceneRaycaster::decode_id(SceneRaycaster::EType::Gizmo, (*gizmo_raycasters)[i]->get_id())), ImGui::GetStyleColorVec4(ImGuiCol_Text), + to_string(Geometry::Transformation((*gizmo_raycasters)[i]->get_transform()).get_offset()), ImGui::GetStyleColorVec4(ImGuiCol_Text)); } + ImGui::EndTable(); } - else - m_gizmos.set_hover_id(inside && (unsigned int)gizmo_id <= GLGizmoBase::BASE_ID ? ((int)GLGizmoBase::BASE_ID - gizmo_id) : -1); + } - //BBS: add plate picking logic - int plate_hover_id = PartPlate::PLATE_BASE_ID - volume_id; - if (plate_hover_id >= 0 && plate_hover_id < PartPlateList::MAX_PLATES_COUNT * PartPlate::GRABBER_COUNT) { - wxGetApp().plater()->get_partplate_list().set_hover_id(plate_hover_id); - hover_plate_idxs->emplace_back(plate_hover_id); - const_cast(&m_gizmos)->set_hover_id(-1); - } - else { - wxGetApp().plater()->get_partplate_list().reset_hover_id(); - if (0 <= volume_id && volume_id < (int)m_volumes.volumes.size()) { - // do not add the volume id if any gizmo is active and CTRL is pressed - if (m_gizmos.get_current_type() == GLGizmosManager::EType::Undefined || !wxGetKeyState(WXK_CONTROL)) - hover_volume_idxs->emplace_back(volume_id); - const_cast(&m_gizmos)->set_hover_id(-1); + std::vector>* gizmo2_raycasters = m_scene_raycaster.get_raycasters(SceneRaycaster::EType::FallbackGizmo); + if (gizmo2_raycasters != nullptr && !gizmo2_raycasters->empty()) { + ImGui::Separator(); + imgui.text("Gizmo2 raycasters IDs:"); + if (ImGui::BeginTable("Gizmo2Raycasters", 3)) { + for (size_t i = 0; i < gizmo2_raycasters->size(); ++i) { + add_strings_row_to_table(std::to_string(i), ImGuiWrapper::COL_ORANGE_LIGHT, + std::to_string(SceneRaycaster::decode_id(SceneRaycaster::EType::FallbackGizmo, (*gizmo2_raycasters)[i]->get_id())), ImGui::GetStyleColorVec4(ImGuiCol_Text), + to_string(Geometry::Transformation((*gizmo2_raycasters)[i]->get_transform()).get_offset()), ImGui::GetStyleColorVec4(ImGuiCol_Text)); } - else - const_cast(&m_gizmos)->set_hover_id(inside && (unsigned int)volume_id <= GLGizmoBase::BASE_ID ? ((int)GLGizmoBase::BASE_ID - volume_id) : -1); + ImGui::EndTable(); } - - _update_volumes_hover_state(); } + + imgui.end(); +#endif // ENABLE_RAYCAST_PICKING_DEBUG } + void GLCanvas3D::_rectangular_selection_picking_pass() { m_gizmos.set_hover_id(-1); @@ -6701,35 +6788,26 @@ void GLCanvas3D::_render_background() const glsafe(::glPopMatrix()); } -void GLCanvas3D::_render_bed(bool bottom, bool show_axes) +void GLCanvas3D::_render_bed(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_axes) { float scale_factor = 1.0; #if ENABLE_RETINA_GL scale_factor = m_retina_helper->get_scale_factor(); #endif // ENABLE_RETINA_GL - /* - bool show_texture = ! bottom || - (m_gizmos.get_current_type() != GLGizmosManager::FdmSupports - && m_gizmos.get_current_type() != GLGizmosManager::SlaSupports - && m_gizmos.get_current_type() != GLGizmosManager::Hollow - && m_gizmos.get_current_type() != GLGizmosManager::Seam - && m_gizmos.get_current_type() != GLGizmosManager::MmuSegmentation); - */ - //bool show_texture = true; - //BBS set axes mode m_bed.set_axes_mode(m_main_toolbar.is_enabled()); - m_bed.render(*this, bottom, scale_factor, show_axes); + m_bed.render(*this, view_matrix, projection_matrix, bottom, scale_factor, show_axes); } -void GLCanvas3D::_render_bed_for_picking(bool bottom) + +void GLCanvas3D::_render_bed_for_picking(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom) { float scale_factor = 1.0; #if ENABLE_RETINA_GL scale_factor = m_retina_helper->get_scale_factor(); #endif // ENABLE_RETINA_GL - //m_bed.render_for_picking(*this, bottom, scale_factor); + m_bed.render_for_picking(*this, view_matrix, projection_matrix, bottom, scale_factor); } void GLCanvas3D::_render_platelist(bool bottom, bool only_current, bool only_body, int hover_id, bool render_cali) const @@ -6822,7 +6900,7 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type, bool with default: case GLVolumeCollection::ERenderType::Opaque: { - const GLGizmosManager& gm = get_gizmos_manager(); + GLGizmosManager& gm = get_gizmos_manager(); if (dynamic_cast(gm.get_current()) == nullptr) { if (m_picking_enabled && m_layers_editing.is_enabled() && (m_layers_editing.last_object_id != -1) && (m_layers_editing.object_max_z() > 0.0f)) { @@ -6935,7 +7013,7 @@ void GLCanvas3D::_render_gcode(int canvas_width, int canvas_height) } } -void GLCanvas3D::_render_selection() const +void GLCanvas3D::_render_selection() { float scale_factor = 1.0; #if ENABLE_RETINA_GL @@ -8220,7 +8298,7 @@ void GLCanvas3D::_render_sla_slices() } } -void GLCanvas3D::_render_selection_sidebar_hints() const +void GLCanvas3D::_render_selection_sidebar_hints() { m_selection.render_sidebar_hints(m_sidebar_field, m_gizmos.get_uniform_scaling()); } @@ -8334,21 +8412,17 @@ Vec3d GLCanvas3D::_mouse_to_3d(const Point& mouse_pos, float* z) if (m_canvas == nullptr) return Vec3d(DBL_MAX, DBL_MAX, DBL_MAX); - const Camera& camera = wxGetApp().plater()->get_camera(); - Matrix4d modelview = camera.get_view_matrix().matrix(); - Matrix4d projection= camera.get_projection_matrix().matrix(); - Vec4i viewport(camera.get_viewport().data()); - - GLint y = viewport[3] - (GLint)mouse_pos(1); - GLfloat mouse_z; - if (z == nullptr) - glsafe(::glReadPixels((GLint)mouse_pos(0), y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, (void*)&mouse_z)); - else - mouse_z = *z; - - Vec3d out; - igl::unproject(Vec3d(mouse_pos(0), y, mouse_z), modelview, projection, viewport, out); - return out; + if (z == nullptr) { + const SceneRaycaster::HitResult hit = m_scene_raycaster.hit(mouse_pos.cast(), wxGetApp().plater()->get_camera(), nullptr); + return hit.is_valid() ? hit.position.cast() : _mouse_to_bed_3d(mouse_pos); + } + else { + const Camera& camera = wxGetApp().plater()->get_camera(); + const Vec4i viewport(camera.get_viewport().data()); + Vec3d out; + igl::unproject(Vec3d(mouse_pos.x(), viewport[3] - mouse_pos.y(), *z), camera.get_view_matrix().matrix(), camera.get_projection_matrix().matrix(), viewport, out); + return out; + } } Vec3d GLCanvas3D::_mouse_to_bed_3d(const Point& mouse_pos) diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 14d657bc573..a47ab739f8e 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -1137,8 +1137,8 @@ class GLCanvas3D void _picking_pass(); void _rectangular_selection_picking_pass(); void _render_background() const; - void _render_bed(bool bottom, bool show_axes); - void _render_bed_for_picking(bool bottom); + void _render_bed(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_axes); + void _render_bed_for_picking(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom); //BBS: add part plate related logic void _render_platelist(bool bottom, bool only_current, bool only_body = false, int hover_id = -1, bool render_cali = false) const; void _render_plates_for_picking() const; @@ -1148,7 +1148,7 @@ class GLCanvas3D void _render_gcode(int canvas_width, int canvas_height); //BBS: render a plane for assemble void _render_plane() const; - void _render_selection() const; + void _render_selection(); void _render_sequential_clearance(); #if ENABLE_RENDER_SELECTION_CENTER void _render_selection_center() const; @@ -1175,7 +1175,7 @@ class GLCanvas3D void _render_camera_target() const; #endif // ENABLE_SHOW_CAMERA_TARGET void _render_sla_slices(); - void _render_selection_sidebar_hints() const; + void _render_selection_sidebar_hints(); //BBS: GUI refactor: adjust main toolbar position bool _render_orient_menu(float left, float right, float bottom, float top); bool _render_arrange_menu(float left, float right, float bottom, float top); diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index dc93009cc9f..7b168c0f76a 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -4,37 +4,61 @@ #include "3DScene.hpp" #include "GUI_App.hpp" #include "GLShader.hpp" +#if ENABLE_GLMODEL_STATISTICS +#include "Plater.hpp" +#include "GLCanvas3D.hpp" +#endif // ENABLE_GLMODEL_STATISTICS #include "libslic3r/TriangleMesh.hpp" #include "libslic3r/Model.hpp" #include "libslic3r/Polygon.hpp" +#include "libslic3r/BuildVolume.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" + +#if ENABLE_GLMODEL_STATISTICS +#include +#endif // ENABLE_GLMODEL_STATISTICS #include #include +#if ENABLE_SMOOTH_NORMALS +#include +#include +#include +#endif // ENABLE_SMOOTH_NORMALS + #include namespace Slic3r { namespace GUI { -size_t GLModel::InitializationData::vertices_count() const +#if ENABLE_SMOOTH_NORMALS +static void smooth_normals_corner(const TriangleMesh& mesh, std::vector& normals) { - size_t ret = 0; - for (const Entity& entity : entities) { - ret += entity.positions.size(); - } - return ret; -} + using MapMatrixXfUnaligned = Eigen::Map>; + using MapMatrixXiUnaligned = Eigen::Map>; -size_t GLModel::InitializationData::indices_count() const -{ - size_t ret = 0; - for (const Entity& entity : entities) { - ret += entity.indices.size(); + std::vector face_normals = its_face_normals(mesh.its); + + Eigen::MatrixXd vertices = MapMatrixXfUnaligned(mesh.its.vertices.front().data(), + Eigen::Index(mesh.its.vertices.size()), 3).cast(); + Eigen::MatrixXi indices = MapMatrixXiUnaligned(mesh.its.indices.front().data(), + Eigen::Index(mesh.its.indices.size()), 3); + Eigen::MatrixXd in_normals = MapMatrixXfUnaligned(face_normals.front().data(), + Eigen::Index(face_normals.size()), 3).cast(); + Eigen::MatrixXd out_normals; + + igl::per_corner_normals(vertices, indices, in_normals, 1.0, out_normals); + + normals = std::vector(mesh.its.vertices.size()); + for (size_t i = 0; i < mesh.its.indices.size(); ++i) { + for (size_t j = 0; j < 3; ++j) { + normals[mesh.its.indices[i][j]] = out_normals.row(i * 3 + j).cast(); + } } - return ret; } - +#endif // ENABLE_SMOOTH_NORMALS void GLModel::Geometry::add_vertex(const Vec2f& position) { @@ -458,113 +482,193 @@ bool GLModel::Geometry::has_extra(const Format& format) GLModel::Statistics GLModel::s_statistics; #endif // ENABLE_GLMODEL_STATISTICS -void GLModel::init_from(const InitializationData& data) +void GLModel::init_from(Geometry&& data) { - if (!m_render_data.empty()) // call reset() if you want to reuse this model + if (is_initialized()) { + // call reset() if you want to reuse this model + assert(false); return; + } - for (const InitializationData::Entity& entity : data.entities) { - if (entity.positions.empty() || entity.indices.empty()) - continue; + if (data.vertices.empty() || data.indices.empty()) { + assert(false); + return; + } - assert(entity.normals.empty() || entity.normals.size() == entity.positions.size()); + m_render_data.geometry = std::move(data); + + // update bounding box + for (size_t i = 0; i < vertices_count(); ++i) { + const size_t position_stride = Geometry::position_stride_floats(data.format); + if (position_stride == 3) + m_bounding_box.merge(m_render_data.geometry.extract_position_3(i).cast()); + else if (position_stride == 2) { + const Vec2f position = m_render_data.geometry.extract_position_2(i); + m_bounding_box.merge(Vec3f(position.x(), position.y(), 0.0f).cast()); + } + } +} - RenderData rdata; - rdata.type = entity.type; - rdata.color = entity.color; +#if ENABLE_SMOOTH_NORMALS +void GLModel::init_from(const TriangleMesh& mesh, bool smooth_normals) +{ + if (smooth_normals) { + if (is_initialized()) { + // call reset() if you want to reuse this model + assert(false); + return; + } - // vertices/normals data - std::vector vertices(6 * entity.positions.size()); - for (size_t i = 0; i < entity.positions.size(); ++i) { - const size_t offset = i * 6; - ::memcpy(static_cast(&vertices[offset]), static_cast(entity.positions[i].data()), 3 * sizeof(float)); - if (!entity.normals.empty()) - ::memcpy(static_cast(&vertices[3 + offset]), static_cast(entity.normals[i].data()), 3 * sizeof(float)); + if (mesh.its.vertices.empty() || mesh.its.indices.empty()) { + assert(false); + return; } - // indices data - std::vector indices = entity.indices; + std::vector normals; + smooth_normals_corner(mesh, normals); - rdata.indices_count = static_cast(indices.size()); + const indexed_triangle_set& its = mesh.its; + Geometry& data = m_render_data.geometry; + data.format = { Geometry::EPrimitiveType::Triangles, Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices(3 * its.indices.size()); + data.reserve_indices(3 * its.indices.size()); - // update bounding box - for (size_t i = 0; i < entity.positions.size(); ++i) { - m_bounding_box.merge(entity.positions[i].cast()); + // vertices + for (size_t i = 0; i < its.vertices.size(); ++i) { + data.add_vertex(its.vertices[i], normals[i]); + } + + // indices + for (size_t i = 0; i < its.indices.size(); ++i) { + const stl_triangle_vertex_indices& idx = its.indices[i]; + data.add_triangle((unsigned int)idx(0), (unsigned int)idx(1), (unsigned int)idx(2)); } - send_to_gpu(rdata, vertices, indices); - m_render_data.emplace_back(rdata); + // update bounding box + for (size_t i = 0; i < vertices_count(); ++i) { + m_bounding_box.merge(m_render_data.geometry.extract_position_3(i).cast()); + } } + else + init_from(mesh.its); } - -void GLModel::init_from(Geometry& data) +#else +void GLModel::init_from(const TriangleMesh& mesh) { - init_from(data.get_as_indexed_triangle_set()); + init_from(mesh.its); } +#endif // ENABLE_SMOOTH_NORMALS -void GLModel::init_from(const indexed_triangle_set& its, const BoundingBoxf3 &bbox) +void GLModel::init_from(const indexed_triangle_set& its) { - if (!m_render_data.empty()) // call reset() if you want to reuse this model + if (is_initialized()) { + // call reset() if you want to reuse this model + assert(false); return; + } - RenderData data; - data.type = PrimitiveType::Triangles; + if (its.vertices.empty() || its.indices.empty()){ + assert(false); + return; + } - std::vector vertices = std::vector(18 * its.indices.size()); - std::vector indices = std::vector(3 * its.indices.size()); + Geometry& data = m_render_data.geometry; + data.format = { Geometry::EPrimitiveType::Triangles, Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices(3 * its.indices.size()); + data.reserve_indices(3 * its.indices.size()); - unsigned int vertices_count = 0; + // vertices + indices + unsigned int vertices_counter = 0; for (uint32_t i = 0; i < its.indices.size(); ++i) { - stl_triangle_vertex_indices face = its.indices[i]; - stl_vertex vertex[3] = { its.vertices[face[0]], its.vertices[face[1]], its.vertices[face[2]] }; - stl_vertex n = face_normal_normalized(vertex); - for (size_t j = 0; j < 3; ++ j) { - size_t offset = i * 18 + j * 6; - ::memcpy(static_cast(&vertices[offset]), static_cast(vertex[j].data()), 3 * sizeof(float)); - ::memcpy(static_cast(&vertices[3 + offset]), static_cast(n.data()), 3 * sizeof(float)); + const stl_triangle_vertex_indices face = its.indices[i]; + const stl_vertex vertex[3] = { its.vertices[face[0]], its.vertices[face[1]], its.vertices[face[2]] }; + const stl_vertex n = face_normal_normalized(vertex); + for (size_t j = 0; j < 3; ++j) { + data.add_vertex(vertex[j], n); } - for (size_t j = 0; j < 3; ++j) - indices[i * 3 + j] = vertices_count + j; - vertices_count += 3; + vertices_counter += 3; + data.add_triangle(vertices_counter - 3, vertices_counter - 2, vertices_counter - 1); } - data.indices_count = static_cast(indices.size()); - m_bounding_box = bbox; - - send_to_gpu(data, vertices, indices); - m_render_data.emplace_back(data); + // update bounding box + for (size_t i = 0; i < vertices_count(); ++i) { + m_bounding_box.merge(data.extract_position_3(i).cast()); + } } -void GLModel::init_from(const indexed_triangle_set& its) +void GLModel::init_from(const Polygon& polygon, float z) { - this->init_from(its, bounding_box(its)); + if (is_initialized()) { + // call reset() if you want to reuse this model + assert(false); + return; + } + + Geometry& data = m_render_data.geometry; + data.format = { Geometry::EPrimitiveType::Lines, Geometry::EVertexLayout::P3 }; + + const size_t segments_count = polygon.points.size(); + data.reserve_vertices(2 * segments_count); + data.reserve_indices(2 * segments_count); + + // vertices + indices + unsigned int vertices_counter = 0; + for (size_t i = 0; i < segments_count; ++i) { + const Point& p0 = polygon.points[i]; + const Point& p1 = (i == segments_count - 1) ? polygon.points.front() : polygon.points[i + 1]; + data.add_vertex(Vec3f(unscale(p0.x()), unscale(p0.y()), z)); + data.add_vertex(Vec3f(unscale(p1.x()), unscale(p1.y()), z)); + vertices_counter += 2; + data.add_line(vertices_counter - 2, vertices_counter - 1); + } + + // update bounding box + for (size_t i = 0; i < vertices_count(); ++i) { + m_bounding_box.merge(data.extract_position_3(i).cast()); + } } void GLModel::init_from(const Polygons& polygons, float z) { - auto append_polygon = [](const Polygon& polygon, float z, GUI::GLModel::InitializationData& data) { - if (!polygon.empty()) { - GUI::GLModel::InitializationData::Entity entity; - entity.type = GUI::GLModel::PrimitiveType::LineLoop; - // contour - entity.positions.reserve(polygon.size() + 1); - entity.indices.reserve(polygon.size() + 1); - unsigned int id = 0; - for (const Point& p : polygon) { - Vec3f position = unscale(p.x(), p.y(), 0.0).cast(); - position.z() = z; - entity.positions.emplace_back(position); - entity.indices.emplace_back(id++); - } - data.entities.emplace_back(entity); - } - }; + if (is_initialized()) { + // call reset() if you want to reuse this model + assert(false); + return; + } + + if (polygons.empty()) { + assert(false); + return; + } + + Geometry& data = m_render_data.geometry; + data.format = { Geometry::EPrimitiveType::Lines, Geometry::EVertexLayout::P3 }; - InitializationData init_data; + size_t segments_count = 0; for (const Polygon& polygon : polygons) { - append_polygon(polygon, z, init_data); + segments_count += polygon.points.size(); + } + + data.reserve_vertices(2 * segments_count); + data.reserve_indices(2 * segments_count); + + // vertices + indices + unsigned int vertices_counter = 0; + for (const Polygon& poly : polygons) { + for (size_t i = 0; i < poly.points.size(); ++i) { + const Point& p0 = poly.points[i]; + const Point& p1 = (i == poly.points.size() - 1) ? poly.points.front() : poly.points[i + 1]; + data.add_vertex(Vec3f(unscale(p0.x()), unscale(p0.y()), z)); + data.add_vertex(Vec3f(unscale(p1.x()), unscale(p1.y()), z)); + vertices_counter += 2; + data.add_line(vertices_counter - 2, vertices_counter - 1); + } + } + + // update bounding box + for (size_t i = 0; i < vertices_count(); ++i) { + m_bounding_box.merge(data.extract_position_3(i).cast()); } - init_from(init_data); } bool GLModel::init_from_file(const std::string& filename) @@ -576,206 +680,494 @@ bool GLModel::init_from_file(const std::string& filename) return false; Model model; - try - { + try { model = Model::read_from_file(filename); } - catch (std::exception&) - { + catch (std::exception&) { return false; } - TriangleMesh mesh = model.mesh(); - init_from(mesh.its, mesh.bounding_box()); + init_from(model.mesh()); m_filename = filename; return true; } -void GLModel::set_color(int entity_id, const std::array& color) +void GLModel::reset() { - for (size_t i = 0; i < m_render_data.size(); ++i) { - if (entity_id == -1 || static_cast(i) == entity_id) - m_render_data[i].color = color; + // release gpu memory + if (m_render_data.ibo_id > 0) { + glsafe(::glDeleteBuffers(1, &m_render_data.ibo_id)); + m_render_data.ibo_id = 0; +#if ENABLE_GLMODEL_STATISTICS + s_statistics.gpu_memory.indices.current -= indices_size_bytes(); +#endif // ENABLE_GLMODEL_STATISTICS } + if (m_render_data.vbo_id > 0) { + glsafe(::glDeleteBuffers(1, &m_render_data.vbo_id)); + m_render_data.vbo_id = 0; +#if ENABLE_GLMODEL_STATISTICS + s_statistics.gpu_memory.vertices.current -= vertices_size_bytes(); +#endif // ENABLE_GLMODEL_STATISTICS + } +#if ENABLE_GL_CORE_PROFILE + if (m_render_data.vao_id > 0) { + glsafe(::glDeleteVertexArrays(1, &m_render_data.vao_id)); + m_render_data.vao_id = 0; + } +#endif // ENABLE_GL_CORE_PROFILE + + m_render_data.vertices_count = 0; + m_render_data.indices_count = 0; + m_render_data.geometry.vertices = std::vector(); + m_render_data.geometry.indices = std::vector(); + m_bounding_box = BoundingBoxf3(); + m_filename = std::string(); } -void GLModel::reset() +static GLenum get_primitive_mode(const GLModel::Geometry::Format& format) { - for (RenderData& data : m_render_data) { - // release gpu memory - if (data.ibo_id > 0) - glsafe(::glDeleteBuffers(1, &data.ibo_id)); - if (data.vbo_id > 0) - glsafe(::glDeleteBuffers(1, &data.vbo_id)); + switch (format.type) + { + case GLModel::Geometry::EPrimitiveType::Points: { return GL_POINTS; } + default: + case GLModel::Geometry::EPrimitiveType::Triangles: { return GL_TRIANGLES; } + case GLModel::Geometry::EPrimitiveType::TriangleStrip: { return GL_TRIANGLE_STRIP; } + case GLModel::Geometry::EPrimitiveType::TriangleFan: { return GL_TRIANGLE_FAN; } + case GLModel::Geometry::EPrimitiveType::Lines: { return GL_LINES; } + case GLModel::Geometry::EPrimitiveType::LineStrip: { return GL_LINE_STRIP; } + case GLModel::Geometry::EPrimitiveType::LineLoop: { return GL_LINE_LOOP; } } +} - m_render_data.clear(); - m_bounding_box = BoundingBoxf3(); - m_filename = std::string(); +static GLenum get_index_type(const GLModel::Geometry& data) +{ + switch (data.index_type) + { + default: + case GLModel::Geometry::EIndexType::UINT: { return GL_UNSIGNED_INT; } + case GLModel::Geometry::EIndexType::USHORT: { return GL_UNSIGNED_SHORT; } + case GLModel::Geometry::EIndexType::UBYTE: { return GL_UNSIGNED_BYTE; } + } +} + +void GLModel::render() +{ + render(std::make_pair(0, indices_count())); } -void GLModel::render() const +void GLModel::render(const std::pair& range) { + if (m_render_disabled) + return; + + if (range.second == range.first) + return; + GLShaderProgram* shader = wxGetApp().get_current_shader(); + if (shader == nullptr) + return; - for (const RenderData& data : m_render_data) { - if (data.vbo_id == 0 || data.ibo_id == 0) - continue; - - GLenum mode; - switch (data.type) - { - default: - case PrimitiveType::Triangles: { mode = GL_TRIANGLES; break; } - case PrimitiveType::Lines: { mode = GL_LINES; break; } - case PrimitiveType::LineStrip: { mode = GL_LINE_STRIP; break; } - case PrimitiveType::LineLoop: { mode = GL_LINE_LOOP; break; } - } + // sends data to gpu if not done yet + if (m_render_data.vbo_id == 0 || m_render_data.ibo_id == 0) { + if (m_render_data.geometry.vertices_count() > 0 && m_render_data.geometry.indices_count() > 0 && !send_to_gpu()) + return; + } - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, data.vbo_id)); - glsafe(::glVertexPointer(3, GL_FLOAT, 6 * sizeof(float), (const void*)0)); - glsafe(::glNormalPointer(GL_FLOAT, 6 * sizeof(float), (const void*)(3 * sizeof(float)))); + const Geometry& data = m_render_data.geometry; - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); + const GLenum mode = get_primitive_mode(data.format); + const GLenum index_type = get_index_type(data); - if (shader != nullptr) - shader->set_uniform("uniform_color", data.color); - else - glsafe(::glColor4fv(data.color.data())); + const size_t vertex_stride_bytes = Geometry::vertex_stride_bytes(data.format); + const bool position = Geometry::has_position(data.format); + const bool normal = Geometry::has_normal(data.format); + const bool tex_coord = Geometry::has_tex_coord(data.format); +#if ENABLE_OPENGL_ES + const bool extra = Geometry::has_extra(data.format); +#endif // ENABLE_OPENGL_ES - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.ibo_id)); - glsafe(::glDrawElements(mode, static_cast(data.indices_count), GL_UNSIGNED_INT, (const void*)0)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(m_render_data.vao_id)); + // the following binding is needed to set the vertex attributes +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_render_data.vbo_id)); - glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); + int position_id = -1; + int normal_id = -1; + int tex_coord_id = -1; +#if ENABLE_OPENGL_ES + int extra_id = -1; +#endif // ENABLE_OPENGL_ES - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + if (position) { + position_id = shader->get_attrib_location("v_position"); + if (position_id != -1) { + glsafe(::glVertexAttribPointer(position_id, Geometry::position_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::position_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(position_id)); + } } + if (normal) { + normal_id = shader->get_attrib_location("v_normal"); + if (normal_id != -1) { + glsafe(::glVertexAttribPointer(normal_id, Geometry::normal_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::normal_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(normal_id)); + } + } + if (tex_coord) { + tex_coord_id = shader->get_attrib_location("v_tex_coord"); + if (tex_coord_id != -1) { + glsafe(::glVertexAttribPointer(tex_coord_id, Geometry::tex_coord_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::tex_coord_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(tex_coord_id)); + } + } +#if ENABLE_OPENGL_ES + if (extra) { + extra_id = shader->get_attrib_location("v_extra"); + if (extra_id != -1) { + glsafe(::glVertexAttribPointer(extra_id, Geometry::extra_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::extra_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(extra_id)); + } + } +#endif // ENABLE_OPENGL_ES + + shader->set_uniform("uniform_color", data.color); + +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id)); + glsafe(::glDrawElements(mode, range.second - range.first, index_type, (const void*)(range.first * Geometry::index_stride_bytes(data)))); +#if !ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); +#endif // !ENABLE_GL_CORE_PROFILE + +#if ENABLE_OPENGL_ES + if (extra_id != -1) + glsafe(::glDisableVertexAttribArray(extra_id)); +#endif // ENABLE_OPENGL_ES + if (tex_coord_id != -1) + glsafe(::glDisableVertexAttribArray(tex_coord_id)); + if (normal_id != -1) + glsafe(::glDisableVertexAttribArray(normal_id)); + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); + + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE + +#if ENABLE_GLMODEL_STATISTICS + ++s_statistics.render_calls; +#endif // ENABLE_GLMODEL_STATISTICS } -void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instances_count) const +void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instances_count) { - if (instances_vbo == 0) + if (instances_vbo == 0 || instances_count == 0) return; GLShaderProgram* shader = wxGetApp().get_current_shader(); - assert(shader == nullptr || boost::algorithm::iends_with(shader->get_name(), "_instanced")); + if (shader == nullptr || !boost::algorithm::iends_with(shader->get_name(), "_instanced")) + return; // vertex attributes - GLint position_id = (shader != nullptr) ? shader->get_attrib_location("v_position") : -1; - GLint normal_id = (shader != nullptr) ? shader->get_attrib_location("v_normal") : -1; - assert(position_id != -1 && normal_id != -1); + const GLint position_id = shader->get_attrib_location("v_position"); + const GLint normal_id = shader->get_attrib_location("v_normal"); + if (position_id == -1 || normal_id == -1) + return; // instance attributes - GLint offset_id = (shader != nullptr) ? shader->get_attrib_location("i_offset") : -1; - GLint scales_id = (shader != nullptr) ? shader->get_attrib_location("i_scales") : -1; - assert(offset_id != -1 && scales_id != -1); + const GLint offset_id = shader->get_attrib_location("i_offset"); + const GLint scales_id = shader->get_attrib_location("i_scales"); + if (offset_id == -1 || scales_id == -1) + return; + + if (m_render_data.vbo_id == 0 || m_render_data.ibo_id == 0) { + if (!send_to_gpu()) + return; + } + +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(m_render_data.vao_id)); +#endif // ENABLE_GL_CORE_PROFILE glsafe(::glBindBuffer(GL_ARRAY_BUFFER, instances_vbo)); - if (offset_id != -1) { - glsafe(::glVertexAttribPointer(offset_id, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (GLvoid*)0)); - glsafe(::glEnableVertexAttribArray(offset_id)); - glsafe(::glVertexAttribDivisor(offset_id, 1)); - } - if (scales_id != -1) { - glsafe(::glVertexAttribPointer(scales_id, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (GLvoid*)(3 * sizeof(float)))); - glsafe(::glEnableVertexAttribArray(scales_id)); - glsafe(::glVertexAttribDivisor(scales_id, 1)); - } - - for (const RenderData& data : m_render_data) { - if (data.vbo_id == 0 || data.ibo_id == 0) - continue; - - GLenum mode; - switch (data.type) - { - default: - case PrimitiveType::Triangles: { mode = GL_TRIANGLES; break; } - case PrimitiveType::Lines: { mode = GL_LINES; break; } - case PrimitiveType::LineStrip: { mode = GL_LINE_STRIP; break; } - case PrimitiveType::LineLoop: { mode = GL_LINE_LOOP; break; } - } + const size_t instance_stride = 5 * sizeof(float); + glsafe(::glVertexAttribPointer(offset_id, 3, GL_FLOAT, GL_FALSE, instance_stride, (const void*)0)); + glsafe(::glEnableVertexAttribArray(offset_id)); + glsafe(::glVertexAttribDivisor(offset_id, 1)); - if (shader != nullptr) - shader->set_uniform("uniform_color", data.color); - else - glsafe(::glColor4fv(data.color.data())); + glsafe(::glVertexAttribPointer(scales_id, 2, GL_FLOAT, GL_FALSE, instance_stride, (const void*)(3 * sizeof(float)))); + glsafe(::glEnableVertexAttribArray(scales_id)); + glsafe(::glVertexAttribDivisor(scales_id, 1)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, data.vbo_id)); - if (position_id != -1) { - glsafe(::glVertexAttribPointer(position_id, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (GLvoid*)0)); - glsafe(::glEnableVertexAttribArray(position_id)); - } - if (normal_id != -1) { - glsafe(::glVertexAttribPointer(normal_id, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (GLvoid*)(3 * sizeof(float)))); - glsafe(::glEnableVertexAttribArray(normal_id)); - } + const Geometry& data = m_render_data.geometry; - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.ibo_id)); - glsafe(::glDrawElementsInstanced(mode, static_cast(data.indices_count), GL_UNSIGNED_INT, (const void*)0, instances_count)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + const GLenum mode = get_primitive_mode(data.format); + const GLenum index_type = get_index_type(data); + + const size_t vertex_stride_bytes = Geometry::vertex_stride_bytes(data.format); + const bool position = Geometry::has_position(data.format); + const bool normal = Geometry::has_normal(data.format); + +#if ENABLE_GL_CORE_PROFILE + // the following binding is needed to set the vertex attributes +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_render_data.vbo_id)); + + if (position) { + glsafe(::glVertexAttribPointer(position_id, Geometry::position_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::position_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(position_id)); + } - if (normal_id != -1) - glsafe(::glDisableVertexAttribArray(normal_id)); - if (position_id != -1) - glsafe(::glDisableVertexAttribArray(position_id)); + if (normal) { + glsafe(::glVertexAttribPointer(normal_id, Geometry::normal_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::normal_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(normal_id)); } - if (scales_id != -1) - glsafe(::glDisableVertexAttribArray(scales_id)); - if (offset_id != -1) - glsafe(::glDisableVertexAttribArray(offset_id)); + shader->set_uniform("uniform_color", data.color); + +#if !ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id)); +#endif // !ENABLE_GL_CORE_PROFILE + glsafe(::glDrawElementsInstanced(mode, indices_count(), index_type, (const void*)0, instances_count)); +#if !ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); +#endif // !ENABLE_GL_CORE_PROFILE + + if (normal) + glsafe(::glDisableVertexAttribArray(normal_id)); + if (position) + glsafe(::glDisableVertexAttribArray(position_id)); + + glsafe(::glDisableVertexAttribArray(scales_id)); + glsafe(::glDisableVertexAttribArray(offset_id)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE + +#if ENABLE_GLMODEL_STATISTICS + ++s_statistics.render_instanced_calls; +#endif // ENABLE_GLMODEL_STATISTICS } -void GLModel::send_to_gpu(RenderData& data, const std::vector& vertices, const std::vector& indices) +bool GLModel::send_to_gpu() { - assert(data.vbo_id == 0); - assert(data.ibo_id == 0); + if (m_render_data.vbo_id > 0 || m_render_data.ibo_id > 0) { + assert(false); + return false; + } + + Geometry& data = m_render_data.geometry; + if (data.vertices.empty() || data.indices.empty()) { + assert(false); + return false; + } - // vertex data -> send to gpu - glsafe(::glGenBuffers(1, &data.vbo_id)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, data.vbo_id)); - glsafe(::glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), vertices.data(), GL_STATIC_DRAW)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) { + glsafe(::glGenVertexArrays(1, &m_render_data.vao_id)); + glsafe(::glBindVertexArray(m_render_data.vao_id)); + } +#endif // ENABLE_GL_CORE_PROFILE + + // vertices + glsafe(::glGenBuffers(1, &m_render_data.vbo_id)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_render_data.vbo_id)); + glsafe(::glBufferData(GL_ARRAY_BUFFER, data.vertices_size_bytes(), data.vertices.data(), GL_STATIC_DRAW)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + m_render_data.vertices_count = vertices_count(); +#if ENABLE_GLMODEL_STATISTICS + s_statistics.gpu_memory.vertices.current += data.vertices_size_bytes(); + s_statistics.gpu_memory.vertices.max = std::max(s_statistics.gpu_memory.vertices.current, s_statistics.gpu_memory.vertices.max); +#endif // ENABLE_GLMODEL_STATISTICS + data.vertices = std::vector(); + + // indices + const size_t indices_count = data.indices.size(); + glsafe(::glGenBuffers(1, &m_render_data.ibo_id)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id)); + if (m_render_data.vertices_count <= 256) { + // convert indices to unsigned char to save gpu memory + std::vector reduced_indices(indices_count); + for (size_t i = 0; i < indices_count; ++i) { + reduced_indices[i] = (unsigned char)data.indices[i]; + } + data.index_type = Geometry::EIndexType::UBYTE; + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices_count * sizeof(unsigned char), reduced_indices.data(), GL_STATIC_DRAW)); + } + else if (m_render_data.vertices_count <= 65536) { + // convert indices to unsigned short to save gpu memory + std::vector reduced_indices(indices_count); + for (size_t i = 0; i < data.indices.size(); ++i) { + reduced_indices[i] = (unsigned short)data.indices[i]; + } + data.index_type = Geometry::EIndexType::USHORT; + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices_count * sizeof(unsigned short), reduced_indices.data(), GL_STATIC_DRAW)); + } + else { + data.index_type = Geometry::EIndexType::UINT; + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, data.indices_size_bytes(), data.indices.data(), GL_STATIC_DRAW)); + } - // indices data -> send to gpu - glsafe(::glGenBuffers(1, &data.ibo_id)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.ibo_id)); - glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), indices.data(), GL_STATIC_DRAW)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + + m_render_data.indices_count = indices_count; +#if ENABLE_GLMODEL_STATISTICS + s_statistics.gpu_memory.indices.current += data.indices_size_bytes(); + s_statistics.gpu_memory.indices.max = std::max(s_statistics.gpu_memory.indices.current, s_statistics.gpu_memory.indices.max); +#endif // ENABLE_GLMODEL_STATISTICS + data.indices = std::vector(); + +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE + + return true; } -GLModel::InitializationData stilized_arrow(int resolution, float tip_radius, float tip_height, float stem_radius, float stem_height) +#if ENABLE_GLMODEL_STATISTICS +void GLModel::render_statistics() { - auto append_vertex = [](GLModel::InitializationData::Entity& entity, const Vec3f& position, const Vec3f& normal) { - entity.positions.emplace_back(position); - entity.normals.emplace_back(normal); + static const float offset = 175.0f; + ImGuiWrapper& imgui = *wxGetApp().imgui(); + + auto add_memory = [&imgui](const std::string& label, int64_t memory) { + auto format_string = [memory](const std::string& units, float value) { + return std::to_string(memory) + " bytes (" + + Slic3r::float_to_string_decimal_point(float(memory) * value, 3) + + " " + units + ")"; + }; + + static const float kb = 1024.0f; + static const float inv_kb = 1.0f / kb; + static const float mb = 1024.0f * kb; + static const float inv_mb = 1.0f / mb; + static const float gb = 1024.0f * mb; + static const float inv_gb = 1.0f / gb; + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label); + ImGui::SameLine(offset); + if (static_cast(memory) < mb) + imgui.text(format_string("KB", inv_kb)); + else if (static_cast(memory) < gb) + imgui.text(format_string("MB", inv_mb)); + else + imgui.text(format_string("GB", inv_gb)); }; - auto append_indices = [](GLModel::InitializationData::Entity& entity, unsigned int v1, unsigned int v2, unsigned int v3) { - entity.indices.emplace_back(v1); - entity.indices.emplace_back(v2); - entity.indices.emplace_back(v3); + + auto add_counter = [&imgui](const std::string& label, int64_t counter) { + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label); + ImGui::SameLine(offset); + imgui.text(std::to_string(counter)); }; - resolution = std::max(4, resolution); + imgui.set_next_window_pos(0.5f * wxGetApp().plater()->get_current_canvas3D()->get_canvas_size().get_width(), 0.0f, ImGuiCond_Once, 0.5f, 0.0f); + ImGui::SetNextWindowSizeConstraints({ 300.0f, 100.0f }, { 600.0f, 900.0f }); + imgui.begin(std::string("GLModel Statistics"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize); + ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); + + add_counter(std::string("Render calls:"), s_statistics.render_calls); + add_counter(std::string("Render instanced calls:"), s_statistics.render_instanced_calls); + + if (ImGui::CollapsingHeader("GPU memory")) { + ImGui::Indent(10.0f); + if (ImGui::CollapsingHeader("Vertices")) { + add_memory(std::string("Current:"), s_statistics.gpu_memory.vertices.current); + add_memory(std::string("Max:"), s_statistics.gpu_memory.vertices.max); + } + if (ImGui::CollapsingHeader("Indices")) { + add_memory(std::string("Current:"), s_statistics.gpu_memory.indices.current); + add_memory(std::string("Max:"), s_statistics.gpu_memory.indices.max); + } + ImGui::Unindent(10.0f); + } + + imgui.end(); +} +#endif // ENABLE_GLMODEL_STATISTICS + +template +inline bool all_vertices_inside(const GLModel::Geometry& geometry, Fn fn) +{ + const size_t position_stride_floats = geometry.position_stride_floats(geometry.format); + const size_t position_offset_floats = geometry.position_offset_floats(geometry.format); + assert(position_stride_floats == 3); + if (geometry.vertices.empty() || position_stride_floats != 3) + return false; + + for (auto it = geometry.vertices.begin(); it != geometry.vertices.end(); ) { + it += position_offset_floats; + if (!fn({ *it, *(it + 1), *(it + 2) })) + return false; + it += (geometry.vertex_stride_floats(geometry.format) - position_offset_floats - position_stride_floats); + } + return true; +} + +bool contains(const BuildVolume& volume, const GLModel& model, bool ignore_bottom) +{ + static constexpr const double epsilon = BuildVolume::BedEpsilon; + switch (volume.type()) { + case BuildVolume_Type::Rectangle: + { + BoundingBox3Base build_volume = volume.bounding_volume().inflated(epsilon); + if (volume.printable_height() == 0.0) + build_volume.max.z() = std::numeric_limits::max(); + if (ignore_bottom) + build_volume.min.z() = -std::numeric_limits::max(); + const BoundingBoxf3& model_box = model.get_bounding_box(); + return build_volume.contains(model_box.min) && build_volume.contains(model_box.max); + } + case BuildVolume_Type::Circle: + { + const Geometry::Circled& circle = volume.circle(); + const Vec2f c = unscaled(circle.center); + const float r = unscaled(circle.radius) + float(epsilon); + const float r2 = sqr(r); + return volume.printable_height() == 0.0 ? + all_vertices_inside(model.get_geometry(), [c, r2](const Vec3f& p) { return (to_2d(p) - c).squaredNorm() <= r2; }) : + + all_vertices_inside(model.get_geometry(), [c, r2, z = volume.printable_height() + epsilon](const Vec3f& p) { return (to_2d(p) - c).squaredNorm() <= r2 && p.z() <= z; }); + } + case BuildVolume_Type::Convex: + //FIXME doing test on convex hull until we learn to do test on non-convex polygons efficiently. + case BuildVolume_Type::Custom: + return volume.printable_height() == 0.0 ? + all_vertices_inside(model.get_geometry(), [&volume](const Vec3f& p) { return Geometry::inside_convex_polygon(volume.top_bottom_convex_hull_decomposition_bed(), to_2d(p).cast()); }) : + all_vertices_inside(model.get_geometry(), [&volume, z = volume.printable_height() + epsilon](const Vec3f& p) { return Geometry::inside_convex_polygon(volume.top_bottom_convex_hull_decomposition_bed(), to_2d(p).cast()) && p.z() <= z; }); + default: + return true; + } +} + +GLModel::Geometry stilized_arrow(unsigned int resolution, float tip_radius, float tip_height, float stem_radius, float stem_height) +{ + resolution = std::max(4, resolution); - GLModel::InitializationData data; - GLModel::InitializationData::Entity entity; - entity.type = GLModel::PrimitiveType::Triangles; + GLModel::Geometry data; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices(6 * resolution + 2); + data.reserve_indices(6 * resolution * 3); - const float angle_step = 2.0f * M_PI / static_cast(resolution); + const float angle_step = 2.0f * float(PI) / float(resolution); std::vector cosines(resolution); std::vector sines(resolution); - for (int i = 0; i < resolution; ++i) { - const float angle = angle_step * static_cast(i); + for (unsigned int i = 0; i < resolution; ++i) { + const float angle = angle_step * float(i); cosines[i] = ::cos(angle); sines[i] = -::sin(angle); } @@ -783,86 +1175,76 @@ GLModel::InitializationData stilized_arrow(int resolution, float tip_radius, flo const float total_height = tip_height + stem_height; // tip vertices/normals - append_vertex(entity, { 0.0f, 0.0f, total_height }, Vec3f::UnitZ()); - for (int i = 0; i < resolution; ++i) { - append_vertex(entity, { tip_radius * sines[i], tip_radius * cosines[i], stem_height }, { sines[i], cosines[i], 0.0f }); + data.add_vertex(Vec3f(0.0f, 0.0f, total_height), (Vec3f)Vec3f::UnitZ()); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_vertex(Vec3f(tip_radius * sines[i], tip_radius * cosines[i], stem_height), Vec3f(sines[i], cosines[i], 0.0f)); } // tip triangles - for (int i = 0; i < resolution; ++i) { - const int v3 = (i < resolution - 1) ? i + 2 : 1; - append_indices(entity, 0, i + 1, v3); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int v3 = (i < resolution - 1) ? i + 2 : 1; + data.add_triangle(0, i + 1, v3); } // tip cap outer perimeter vertices - for (int i = 0; i < resolution; ++i) { - append_vertex(entity, { tip_radius * sines[i], tip_radius * cosines[i], stem_height }, -Vec3f::UnitZ()); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_vertex(Vec3f(tip_radius * sines[i], tip_radius * cosines[i], stem_height), (Vec3f)(-Vec3f::UnitZ())); } // tip cap inner perimeter vertices - for (int i = 0; i < resolution; ++i) { - append_vertex(entity, { stem_radius * sines[i], stem_radius * cosines[i], stem_height }, -Vec3f::UnitZ()); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_vertex(Vec3f(stem_radius * sines[i], stem_radius * cosines[i], stem_height), (Vec3f)(-Vec3f::UnitZ())); } // tip cap triangles - for (int i = 0; i < resolution; ++i) { - const int v2 = (i < resolution - 1) ? i + resolution + 2 : resolution + 1; - const int v3 = (i < resolution - 1) ? i + 2 * resolution + 2 : 2 * resolution + 1; - append_indices(entity, i + resolution + 1, v3, v2); - append_indices(entity, i + resolution + 1, i + 2 * resolution + 1, v3); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int v2 = (i < resolution - 1) ? i + resolution + 2 : resolution + 1; + const unsigned int v3 = (i < resolution - 1) ? i + 2 * resolution + 2 : 2 * resolution + 1; + data.add_triangle(i + resolution + 1, v3, v2); + data.add_triangle(i + resolution + 1, i + 2 * resolution + 1, v3); } // stem bottom vertices - for (int i = 0; i < resolution; ++i) { - append_vertex(entity, { stem_radius * sines[i], stem_radius * cosines[i], stem_height }, { sines[i], cosines[i], 0.0f }); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_vertex(Vec3f(stem_radius * sines[i], stem_radius * cosines[i], stem_height), Vec3f(sines[i], cosines[i], 0.0f)); } // stem top vertices - for (int i = 0; i < resolution; ++i) { - append_vertex(entity, { stem_radius * sines[i], stem_radius * cosines[i], 0.0f }, { sines[i], cosines[i], 0.0f }); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_vertex(Vec3f(stem_radius * sines[i], stem_radius * cosines[i], 0.0f), Vec3f(sines[i], cosines[i], 0.0f)); } // stem triangles - for (int i = 0; i < resolution; ++i) { - const int v2 = (i < resolution - 1) ? i + 3 * resolution + 2 : 3 * resolution + 1; - const int v3 = (i < resolution - 1) ? i + 4 * resolution + 2 : 4 * resolution + 1; - append_indices(entity, i + 3 * resolution + 1, v3, v2); - append_indices(entity, i + 3 * resolution + 1, i + 4 * resolution + 1, v3); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int v2 = (i < resolution - 1) ? i + 3 * resolution + 2 : 3 * resolution + 1; + const unsigned int v3 = (i < resolution - 1) ? i + 4 * resolution + 2 : 4 * resolution + 1; + data.add_triangle(i + 3 * resolution + 1, v3, v2); + data.add_triangle(i + 3 * resolution + 1, i + 4 * resolution + 1, v3); } // stem cap vertices - append_vertex(entity, Vec3f::Zero(), -Vec3f::UnitZ()); - for (int i = 0; i < resolution; ++i) { - append_vertex(entity, { stem_radius * sines[i], stem_radius * cosines[i], 0.0f }, -Vec3f::UnitZ()); + data.add_vertex((Vec3f)Vec3f::Zero(), (Vec3f)(-Vec3f::UnitZ())); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_vertex(Vec3f(stem_radius * sines[i], stem_radius * cosines[i], 0.0f), (Vec3f)(-Vec3f::UnitZ())); } // stem cap triangles - for (int i = 0; i < resolution; ++i) { - const int v3 = (i < resolution - 1) ? i + 5 * resolution + 3 : 5 * resolution + 2; - append_indices(entity, 5 * resolution + 1, v3, i + 5 * resolution + 2); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int v3 = (i < resolution - 1) ? i + 5 * resolution + 3 : 5 * resolution + 2; + data.add_triangle(5 * resolution + 1, v3, i + 5 * resolution + 2); } - data.entities.emplace_back(entity); return data; } -GLModel::InitializationData circular_arrow(int resolution, float radius, float tip_height, float tip_width, float stem_width, float thickness) +GLModel::Geometry circular_arrow(unsigned int resolution, float radius, float tip_height, float tip_width, float stem_width, float thickness) { - auto append_vertex = [](GLModel::InitializationData::Entity& entity, const Vec3f& position, const Vec3f& normal) { - entity.positions.emplace_back(position); - entity.normals.emplace_back(normal); - }; - auto append_indices = [](GLModel::InitializationData::Entity& entity, unsigned int v1, unsigned int v2, unsigned int v3) { - entity.indices.emplace_back(v1); - entity.indices.emplace_back(v2); - entity.indices.emplace_back(v3); - }; - - resolution = std::max(2, resolution); + resolution = std::max(2, resolution); - GLModel::InitializationData data; - GLModel::InitializationData::Entity entity; - entity.type = GLModel::PrimitiveType::Triangles; + GLModel::Geometry data; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices(8 * (resolution + 1) + 30); + data.reserve_indices((8 * resolution + 16) * 3); const float half_thickness = 0.5f * thickness; const float half_stem_width = 0.5f * stem_width; @@ -870,171 +1252,161 @@ GLModel::InitializationData circular_arrow(int resolution, float radius, float t const float outer_radius = radius + half_stem_width; const float inner_radius = radius - half_stem_width; - const float step_angle = 0.5f * PI / static_cast(resolution); + const float step_angle = 0.5f * float(PI) / float(resolution); // tip // top face vertices - append_vertex(entity, { 0.0f, outer_radius, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { 0.0f, radius + half_tip_width, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { -tip_height, radius, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { 0.0f, radius - half_tip_width, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { 0.0f, inner_radius, half_thickness }, Vec3f::UnitZ()); + data.add_vertex(Vec3f(0.0f, outer_radius, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(0.0f, radius + half_tip_width, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(-tip_height, radius, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(0.0f, radius - half_tip_width, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(0.0f, inner_radius, half_thickness), (Vec3f)Vec3f::UnitZ()); // top face triangles - append_indices(entity, 0, 1, 2); - append_indices(entity, 0, 2, 4); - append_indices(entity, 4, 2, 3); + data.add_triangle(0, 1, 2); + data.add_triangle(0, 2, 4); + data.add_triangle(4, 2, 3); // bottom face vertices - append_vertex(entity, { 0.0f, outer_radius, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { 0.0f, radius + half_tip_width, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { -tip_height, radius, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { 0.0f, radius - half_tip_width, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { 0.0f, inner_radius, -half_thickness }, -Vec3f::UnitZ()); + data.add_vertex(Vec3f(0.0f, outer_radius, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(0.0f, radius + half_tip_width, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(-tip_height, radius, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(0.0f, radius - half_tip_width, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(0.0f, inner_radius, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); // bottom face triangles - append_indices(entity, 5, 7, 6); - append_indices(entity, 5, 9, 7); - append_indices(entity, 9, 8, 7); + data.add_triangle(5, 7, 6); + data.add_triangle(5, 9, 7); + data.add_triangle(9, 8, 7); // side faces vertices - append_vertex(entity, { 0.0f, outer_radius, -half_thickness }, Vec3f::UnitX()); - append_vertex(entity, { 0.0f, radius + half_tip_width, -half_thickness }, Vec3f::UnitX()); - append_vertex(entity, { 0.0f, outer_radius, half_thickness }, Vec3f::UnitX()); - append_vertex(entity, { 0.0f, radius + half_tip_width, half_thickness }, Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, outer_radius, -half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, radius + half_tip_width, -half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, outer_radius, half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, radius + half_tip_width, half_thickness), (Vec3f)Vec3f::UnitX()); Vec3f normal(-half_tip_width, tip_height, 0.0f); normal.normalize(); - append_vertex(entity, { 0.0f, radius + half_tip_width, -half_thickness }, normal); - append_vertex(entity, { -tip_height, radius, -half_thickness }, normal); - append_vertex(entity, { 0.0f, radius + half_tip_width, half_thickness }, normal); - append_vertex(entity, { -tip_height, radius, half_thickness }, normal); + data.add_vertex(Vec3f(0.0f, radius + half_tip_width, -half_thickness), normal); + data.add_vertex(Vec3f(-tip_height, radius, -half_thickness), normal); + data.add_vertex(Vec3f(0.0f, radius + half_tip_width, half_thickness), normal); + data.add_vertex(Vec3f(-tip_height, radius, half_thickness), normal); - normal = Vec3f(-half_tip_width, -tip_height, 0.0f); + normal = { -half_tip_width, -tip_height, 0.0f }; normal.normalize(); - append_vertex(entity, { -tip_height, radius, -half_thickness }, normal); - append_vertex(entity, { 0.0f, radius - half_tip_width, -half_thickness }, normal); - append_vertex(entity, { -tip_height, radius, half_thickness }, normal); - append_vertex(entity, { 0.0f, radius - half_tip_width, half_thickness }, normal); + data.add_vertex(Vec3f(-tip_height, radius, -half_thickness), normal); + data.add_vertex(Vec3f(0.0f, radius - half_tip_width, -half_thickness), normal); + data.add_vertex(Vec3f(-tip_height, radius, half_thickness), normal); + data.add_vertex(Vec3f(0.0f, radius - half_tip_width, half_thickness), normal); - append_vertex(entity, { 0.0f, radius - half_tip_width, -half_thickness }, Vec3f::UnitX()); - append_vertex(entity, { 0.0f, inner_radius, -half_thickness }, Vec3f::UnitX()); - append_vertex(entity, { 0.0f, radius - half_tip_width, half_thickness }, Vec3f::UnitX()); - append_vertex(entity, { 0.0f, inner_radius, half_thickness }, Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, radius - half_tip_width, -half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, inner_radius, -half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, radius - half_tip_width, half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, inner_radius, half_thickness), (Vec3f)Vec3f::UnitX()); // side face triangles - for (int i = 0; i < 4; ++i) { - const int ii = i * 4; - append_indices(entity, 10 + ii, 11 + ii, 13 + ii); - append_indices(entity, 10 + ii, 13 + ii, 12 + ii); + for (unsigned int i = 0; i < 4; ++i) { + const unsigned int ii = i * 4; + data.add_triangle(10 + ii, 11 + ii, 13 + ii); + data.add_triangle(10 + ii, 13 + ii, 12 + ii); } // stem // top face vertices - for (int i = 0; i <= resolution; ++i) { - const float angle = static_cast(i) * step_angle; - append_vertex(entity, { inner_radius * ::sin(angle), inner_radius * ::cos(angle), half_thickness }, Vec3f::UnitZ()); + for (unsigned int i = 0; i <= resolution; ++i) { + const float angle = float(i) * step_angle; + data.add_vertex(Vec3f(inner_radius * ::sin(angle), inner_radius * ::cos(angle), half_thickness), (Vec3f)Vec3f::UnitZ()); } - for (int i = 0; i <= resolution; ++i) { - const float angle = static_cast(i) * step_angle; - append_vertex(entity, { outer_radius * ::sin(angle), outer_radius * ::cos(angle), half_thickness }, Vec3f::UnitZ()); + for (unsigned int i = 0; i <= resolution; ++i) { + const float angle = float(i) * step_angle; + data.add_vertex(Vec3f(outer_radius * ::sin(angle), outer_radius * ::cos(angle), half_thickness), (Vec3f)Vec3f::UnitZ()); } // top face triangles - for (int i = 0; i < resolution; ++i) { - append_indices(entity, 26 + i, 27 + i, 27 + resolution + i); - append_indices(entity, 27 + i, 28 + resolution + i, 27 + resolution + i); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_triangle(26 + i, 27 + i, 27 + resolution + i); + data.add_triangle(27 + i, 28 + resolution + i, 27 + resolution + i); } // bottom face vertices - for (int i = 0; i <= resolution; ++i) { - const float angle = static_cast(i) * step_angle; - append_vertex(entity, { inner_radius * ::sin(angle), inner_radius * ::cos(angle), -half_thickness }, -Vec3f::UnitZ()); + for (unsigned int i = 0; i <= resolution; ++i) { + const float angle = float(i) * step_angle; + data.add_vertex(Vec3f(inner_radius * ::sin(angle), inner_radius * ::cos(angle), -half_thickness), (Vec3f)(-Vec3f::UnitZ())); } - for (int i = 0; i <= resolution; ++i) { - const float angle = static_cast(i) * step_angle; - append_vertex(entity, { outer_radius * ::sin(angle), outer_radius * ::cos(angle), -half_thickness }, -Vec3f::UnitZ()); + for (unsigned int i = 0; i <= resolution; ++i) { + const float angle = float(i) * step_angle; + data.add_vertex(Vec3f(outer_radius * ::sin(angle), outer_radius * ::cos(angle), -half_thickness), (Vec3f)(-Vec3f::UnitZ())); } // bottom face triangles - for (int i = 0; i < resolution; ++i) { - append_indices(entity, 28 + 2 * resolution + i, 29 + 3 * resolution + i, 29 + 2 * resolution + i); - append_indices(entity, 29 + 2 * resolution + i, 29 + 3 * resolution + i, 30 + 3 * resolution + i); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_triangle(28 + 2 * resolution + i, 29 + 3 * resolution + i, 29 + 2 * resolution + i); + data.add_triangle(29 + 2 * resolution + i, 29 + 3 * resolution + i, 30 + 3 * resolution + i); } // side faces vertices and triangles - for (int i = 0; i <= resolution; ++i) { - const float angle = static_cast(i) * step_angle; + for (unsigned int i = 0; i <= resolution; ++i) { + const float angle = float(i) * step_angle; const float c = ::cos(angle); const float s = ::sin(angle); - append_vertex(entity, { inner_radius * s, inner_radius * c, -half_thickness }, { -s, -c, 0.0f }); + data.add_vertex(Vec3f(inner_radius * s, inner_radius * c, -half_thickness), Vec3f(-s, -c, 0.0f)); } - for (int i = 0; i <= resolution; ++i) { - const float angle = static_cast(i) * step_angle; + for (unsigned int i = 0; i <= resolution; ++i) { + const float angle = float(i) * step_angle; const float c = ::cos(angle); const float s = ::sin(angle); - append_vertex(entity, { inner_radius * s, inner_radius * c, half_thickness }, { -s, -c, 0.0f }); + data.add_vertex(Vec3f(inner_radius * s, inner_radius * c, half_thickness), Vec3f(-s, -c, 0.0f)); } - int first_id = 26 + 4 * (resolution + 1); - for (int i = 0; i < resolution; ++i) { - const int ii = first_id + i; - append_indices(entity, ii, ii + 1, ii + resolution + 2); - append_indices(entity, ii, ii + resolution + 2, ii + resolution + 1); + unsigned int first_id = 26 + 4 * (resolution + 1); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int ii = first_id + i; + data.add_triangle(ii, ii + 1, ii + resolution + 2); + data.add_triangle(ii, ii + resolution + 2, ii + resolution + 1); } - append_vertex(entity, { inner_radius, 0.0f, -half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { outer_radius, 0.0f, -half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { inner_radius, 0.0f, half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { outer_radius, 0.0f, half_thickness }, -Vec3f::UnitY()); + data.add_vertex(Vec3f(inner_radius, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(outer_radius, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(inner_radius, 0.0f, half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(outer_radius, 0.0f, half_thickness), (Vec3f)(-Vec3f::UnitY())); first_id = 26 + 6 * (resolution + 1); - append_indices(entity, first_id, first_id + 1, first_id + 3); - append_indices(entity, first_id, first_id + 3, first_id + 2); + data.add_triangle(first_id, first_id + 1, first_id + 3); + data.add_triangle(first_id, first_id + 3, first_id + 2); for (int i = resolution; i >= 0; --i) { - const float angle = static_cast(i) * step_angle; + const float angle = float(i) * step_angle; const float c = ::cos(angle); const float s = ::sin(angle); - append_vertex(entity, { outer_radius * s, outer_radius * c, -half_thickness }, { s, c, 0.0f }); + data.add_vertex(Vec3f(outer_radius * s, outer_radius * c, -half_thickness), Vec3f(s, c, 0.0f)); } for (int i = resolution; i >= 0; --i) { - const float angle = static_cast(i) * step_angle; + const float angle = float(i) * step_angle; const float c = ::cos(angle); const float s = ::sin(angle); - append_vertex(entity, { outer_radius * s, outer_radius * c, +half_thickness }, { s, c, 0.0f }); + data.add_vertex(Vec3f(outer_radius * s, outer_radius * c, +half_thickness), Vec3f(s, c, 0.0f)); } first_id = 30 + 6 * (resolution + 1); - for (int i = 0; i < resolution; ++i) { - const int ii = first_id + i; - append_indices(entity, ii, ii + 1, ii + resolution + 2); - append_indices(entity, ii, ii + resolution + 2, ii + resolution + 1); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int ii = first_id + i; + data.add_triangle(ii, ii + 1, ii + resolution + 2); + data.add_triangle(ii, ii + resolution + 2, ii + resolution + 1); } - data.entities.emplace_back(entity); return data; } -GLModel::InitializationData straight_arrow(float tip_width, float tip_height, float stem_width, float stem_height, float thickness) +GLModel::Geometry straight_arrow(float tip_width, float tip_height, float stem_width, float stem_height, float thickness) { - auto append_vertex = [](GLModel::InitializationData::Entity& entity, const Vec3f& position, const Vec3f& normal) { - entity.positions.emplace_back(position); - entity.normals.emplace_back(normal); - }; - auto append_indices = [](GLModel::InitializationData::Entity& entity, unsigned int v1, unsigned int v2, unsigned int v3) { - entity.indices.emplace_back(v1); - entity.indices.emplace_back(v2); - entity.indices.emplace_back(v3); - }; - - GLModel::InitializationData data; - GLModel::InitializationData::Entity entity; - entity.type = GLModel::PrimitiveType::Triangles; + GLModel::Geometry data; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices(42); + data.reserve_indices(72); const float half_thickness = 0.5f * thickness; const float half_stem_width = 0.5f * stem_width; @@ -1042,137 +1414,125 @@ GLModel::InitializationData straight_arrow(float tip_width, float tip_height, fl const float total_height = tip_height + stem_height; // top face vertices - append_vertex(entity, { half_stem_width, 0.0, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { half_stem_width, stem_height, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { half_tip_width, stem_height, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { 0.0, total_height, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { -half_tip_width, stem_height, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { -half_stem_width, stem_height, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { -half_stem_width, 0.0, half_thickness }, Vec3f::UnitZ()); + data.add_vertex(Vec3f(half_stem_width, 0.0f, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(half_stem_width, stem_height, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(half_tip_width, stem_height, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(0.0f, total_height, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(-half_tip_width, stem_height, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(-half_stem_width, stem_height, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(-half_stem_width, 0.0f, half_thickness), (Vec3f)Vec3f::UnitZ()); // top face triangles - append_indices(entity, 0, 1, 6); - append_indices(entity, 6, 1, 5); - append_indices(entity, 4, 5, 3); - append_indices(entity, 5, 1, 3); - append_indices(entity, 1, 2, 3); + data.add_triangle(0, 1, 6); + data.add_triangle(6, 1, 5); + data.add_triangle(4, 5, 3); + data.add_triangle(5, 1, 3); + data.add_triangle(1, 2, 3); // bottom face vertices - append_vertex(entity, { half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { half_tip_width, stem_height, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { 0.0, total_height, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { -half_tip_width, stem_height, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { -half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { -half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitZ()); + data.add_vertex(Vec3f(half_stem_width, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(half_stem_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(half_tip_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(0.0f, total_height, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(-half_tip_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(-half_stem_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(-half_stem_width, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); // bottom face triangles - append_indices(entity, 7, 13, 8); - append_indices(entity, 13, 12, 8); - append_indices(entity, 12, 11, 10); - append_indices(entity, 8, 12, 10); - append_indices(entity, 9, 8, 10); + data.add_triangle(7, 13, 8); + data.add_triangle(13, 12, 8); + data.add_triangle(12, 11, 10); + data.add_triangle(8, 12, 10); + data.add_triangle(9, 8, 10); // side faces vertices - append_vertex(entity, { half_stem_width, 0.0, -half_thickness }, Vec3f::UnitX()); - append_vertex(entity, { half_stem_width, stem_height, -half_thickness }, Vec3f::UnitX()); - append_vertex(entity, { half_stem_width, 0.0, half_thickness }, Vec3f::UnitX()); - append_vertex(entity, { half_stem_width, stem_height, half_thickness }, Vec3f::UnitX()); + data.add_vertex(Vec3f(half_stem_width, 0.0f, -half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(half_stem_width, stem_height, -half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(half_stem_width, 0.0f, half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(half_stem_width, stem_height, half_thickness), (Vec3f)Vec3f::UnitX()); - append_vertex(entity, { half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { half_tip_width, stem_height, -half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { half_stem_width, stem_height, half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { half_tip_width, stem_height, half_thickness }, -Vec3f::UnitY()); + data.add_vertex(Vec3f(half_stem_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(half_tip_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(half_stem_width, stem_height, half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(half_tip_width, stem_height, half_thickness), (Vec3f)(-Vec3f::UnitY())); Vec3f normal(tip_height, half_tip_width, 0.0f); normal.normalize(); - append_vertex(entity, { half_tip_width, stem_height, -half_thickness }, normal); - append_vertex(entity, { 0.0, total_height, -half_thickness }, normal); - append_vertex(entity, { half_tip_width, stem_height, half_thickness }, normal); - append_vertex(entity, { 0.0, total_height, half_thickness }, normal); + data.add_vertex(Vec3f(half_tip_width, stem_height, -half_thickness), normal); + data.add_vertex(Vec3f(0.0f, total_height, -half_thickness), normal); + data.add_vertex(Vec3f(half_tip_width, stem_height, half_thickness), normal); + data.add_vertex(Vec3f(0.0f, total_height, half_thickness), normal); - normal = Vec3f(-tip_height, half_tip_width, 0.0f); + normal = { -tip_height, half_tip_width, 0.0f }; normal.normalize(); - append_vertex(entity, { 0.0, total_height, -half_thickness }, normal); - append_vertex(entity, { -half_tip_width, stem_height, -half_thickness }, normal); - append_vertex(entity, { 0.0, total_height, half_thickness }, normal); - append_vertex(entity, { -half_tip_width, stem_height, half_thickness }, normal); - - append_vertex(entity, { -half_tip_width, stem_height, -half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { -half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { -half_tip_width, stem_height, half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { -half_stem_width, stem_height, half_thickness }, -Vec3f::UnitY()); - - append_vertex(entity, { -half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitX()); - append_vertex(entity, { -half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitX()); - append_vertex(entity, { -half_stem_width, stem_height, half_thickness }, -Vec3f::UnitX()); - append_vertex(entity, { -half_stem_width, 0.0, half_thickness }, -Vec3f::UnitX()); - - append_vertex(entity, { -half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { -half_stem_width, 0.0, half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { half_stem_width, 0.0, half_thickness }, -Vec3f::UnitY()); + data.add_vertex(Vec3f(0.0f, total_height, -half_thickness), normal); + data.add_vertex(Vec3f(-half_tip_width, stem_height, -half_thickness), normal); + data.add_vertex(Vec3f(0.0f, total_height, half_thickness), normal); + data.add_vertex(Vec3f(-half_tip_width, stem_height, half_thickness), normal); + + data.add_vertex(Vec3f(-half_tip_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(-half_stem_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(-half_tip_width, stem_height, half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(-half_stem_width, stem_height, half_thickness), (Vec3f)(-Vec3f::UnitY())); + + data.add_vertex(Vec3f(-half_stem_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitX())); + data.add_vertex(Vec3f(-half_stem_width, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitX())); + data.add_vertex(Vec3f(-half_stem_width, stem_height, half_thickness), (Vec3f)(-Vec3f::UnitX())); + data.add_vertex(Vec3f(-half_stem_width, 0.0f, half_thickness), (Vec3f)(-Vec3f::UnitX())); + + data.add_vertex(Vec3f(-half_stem_width, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(half_stem_width, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(-half_stem_width, 0.0f, half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(half_stem_width, 0.0f, half_thickness), (Vec3f)(-Vec3f::UnitY())); // side face triangles - for (int i = 0; i < 7; ++i) { - const int ii = i * 4; - append_indices(entity, 14 + ii, 15 + ii, 17 + ii); - append_indices(entity, 14 + ii, 17 + ii, 16 + ii); + for (unsigned int i = 0; i < 7; ++i) { + const unsigned int ii = i * 4; + data.add_triangle(14 + ii, 15 + ii, 17 + ii); + data.add_triangle(14 + ii, 17 + ii, 16 + ii); } - data.entities.emplace_back(entity); return data; } -GLModel::InitializationData diamond(int resolution) +GLModel::Geometry diamond(unsigned int resolution) { - resolution = std::max(4, resolution); + resolution = std::max(4, resolution); - GLModel::InitializationData data; - GLModel::InitializationData::Entity entity; - entity.type = GLModel::PrimitiveType::Triangles; + GLModel::Geometry data; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices(resolution + 2); + data.reserve_indices((2 * (resolution + 1)) * 3); const float step = 2.0f * float(PI) / float(resolution); - // positions - for (int i = 0; i < resolution; ++i) { - float ii = float(i) * step; - entity.positions.emplace_back(0.5f * ::cos(ii), 0.5f * ::sin(ii), 0.0f); - } - entity.positions.emplace_back(0.0f, 0.0f, 0.5f); - entity.positions.emplace_back(0.0f, 0.0f, -0.5f); - - // normals - for (const Vec3f& v : entity.positions) { - entity.normals.emplace_back(v.normalized()); + // vertices + for (unsigned int i = 0; i < resolution; ++i) { + const float ii = float(i) * step; + const Vec3f p = { 0.5f * ::cos(ii), 0.5f * ::sin(ii), 0.0f }; + data.add_vertex(p, (Vec3f)p.normalized()); } + Vec3f p = { 0.0f, 0.0f, 0.5f }; + data.add_vertex(p, (Vec3f)p.normalized()); + p = { 0.0f, 0.0f, -0.5f }; + data.add_vertex(p, (Vec3f)p.normalized()); // triangles // top - for (int i = 0; i < resolution; ++i) { - entity.indices.push_back(i + 0); - entity.indices.push_back(i + 1); - entity.indices.push_back(resolution); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_triangle(i + 0, i + 1, resolution); } - entity.indices.push_back(resolution - 1); - entity.indices.push_back(0); - entity.indices.push_back(resolution); + data.add_triangle(resolution - 1, 0, resolution); // bottom - for (int i = 0; i < resolution; ++i) { - entity.indices.push_back(i + 0); - entity.indices.push_back(resolution + 1); - entity.indices.push_back(i + 1); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_triangle(i + 0, resolution + 1, i + 1); } - entity.indices.push_back(resolution - 1); - entity.indices.push_back(resolution + 1); - entity.indices.push_back(0); + data.add_triangle(resolution - 1, resolution + 1, 0); - data.entities.emplace_back(entity); return data; } - GLModel::Geometry smooth_sphere(unsigned int resolution, float radius) { resolution = std::max(4, resolution); diff --git a/src/slic3r/GUI/GLModel.hpp b/src/slic3r/GUI/GLModel.hpp index 1e218df1463..685fd6e1169 100644 --- a/src/slic3r/GUI/GLModel.hpp +++ b/src/slic3r/GUI/GLModel.hpp @@ -15,20 +15,14 @@ namespace Slic3r { class TriangleMesh; class Polygon; using Polygons = std::vector; +// using Polygons = std::vector>; +class BuildVolume; namespace GUI { class GLModel { public: - enum class PrimitiveType : unsigned char - { - Triangles, - Lines, - LineStrip, - LineLoop - }; - struct Geometry { enum class EPrimitiveType : unsigned char @@ -164,37 +158,50 @@ namespace GUI { struct RenderData { - PrimitiveType type; + Geometry geometry; +#if ENABLE_GL_CORE_PROFILE + unsigned int vao_id{ 0 }; +#endif // ENABLE_GL_CORE_PROFILE unsigned int vbo_id{ 0 }; unsigned int ibo_id{ 0 }; + size_t vertices_count{ 0 }; size_t indices_count{ 0 }; - std::array color{ 1.0f, 1.0f, 1.0f, 1.0f }; }; - struct InitializationData + private: +#if ENABLE_GLMODEL_STATISTICS + struct Statistics { - struct Entity + struct Buffers { - PrimitiveType type; - std::vector positions; - std::vector normals; - std::vector indices; - std::array color{ 1.0f, 1.0f, 1.0f, 1.0f }; + struct Data + { + size_t current{ 0 }; + size_t max{ 0 }; + }; + Data indices; + Data vertices; }; - std::vector entities; + Buffers gpu_memory; - size_t vertices_count() const; - size_t vertices_size_floats() const { return vertices_count() * 6; } - size_t vertices_size_bytes() const { return vertices_size_floats() * sizeof(float); } - - size_t indices_count() const; - size_t indices_size_bytes() const { return indices_count() * sizeof(unsigned int); } + int64_t render_calls{ 0 }; + int64_t render_instanced_calls{ 0 }; }; - private: - std::vector m_render_data; + static Statistics s_statistics; +#endif // ENABLE_GLMODEL_STATISTICS + + RenderData m_render_data; + // By default the vertex and index buffers data are sent to gpu at the first call to render() method. + // If you need to initialize a model from outside the main thread, so that a call to render() may happen + // before the initialization is complete, use the methods: + // disable_render() + // ... do your initialization ... + // enable_render() + // to keep the data on cpu side until needed. + bool m_render_disabled{ false }; BoundingBoxf3 m_bounding_box; std::string m_filename; @@ -202,52 +209,103 @@ namespace GUI { GLModel() = default; virtual ~GLModel() { reset(); } - void init_from(const InitializationData& data); - void init_from(const indexed_triangle_set& its, const BoundingBoxf3& bbox); - void init_from(Geometry& data); + size_t vertices_count() const { return m_render_data.vertices_count > 0 ? + m_render_data.vertices_count : m_render_data.geometry.vertices_count(); } + size_t indices_count() const { return m_render_data.indices_count > 0 ? + m_render_data.indices_count : m_render_data.geometry.indices_count(); } + + size_t vertices_size_floats() const { return vertices_count() * Geometry::vertex_stride_floats(m_render_data.geometry.format); } + size_t vertices_size_bytes() const { return vertices_size_floats() * sizeof(float); } + + size_t indices_size_bytes() const { return indices_count() * Geometry::index_stride_bytes(m_render_data.geometry); } + + const Geometry& get_geometry() const { return m_render_data.geometry; } + + void init_from(Geometry&& data); +#if ENABLE_SMOOTH_NORMALS + void init_from(const TriangleMesh& mesh, bool smooth_normals = false); +#else + void init_from(const TriangleMesh& mesh); +#endif // ENABLE_SMOOTH_NORMALS void init_from(const indexed_triangle_set& its); + void init_from(const Polygon& polygon, float z); void init_from(const Polygons& polygons, float z); bool init_from_file(const std::string& filename); - // if entity_id == -1 set the color of all entities - void set_color(int entity_id, const std::array& color); - void set_color(const ColorRGBA& color) { set_color(-1, color.data_array()); } + void set_color(const ColorRGBA& color) { m_render_data.geometry.color = color; } + const ColorRGBA& get_color() const { return m_render_data.geometry.color; } + void set_color(const std::array& color){ + m_render_data.geometry.color = color; + } void reset(); - void render() const; - void render_instanced(unsigned int instances_vbo, unsigned int instances_count) const; + void render(); + void render(const std::pair& range); + void render_instanced(unsigned int instances_vbo, unsigned int instances_count); - bool is_initialized() const { return !m_render_data.empty(); } + bool is_initialized() const { return vertices_count() > 0 && indices_count() > 0; } + bool is_empty() const { return m_render_data.geometry.is_empty(); } const BoundingBoxf3& get_bounding_box() const { return m_bounding_box; } const std::string& get_filename() const { return m_filename; } + bool is_render_disabled() const { return m_render_disabled; } + void enable_render() { m_render_disabled = false; } + void disable_render() { m_render_disabled = true; } + + size_t cpu_memory_used() const { + size_t ret = 0; + if (!m_render_data.geometry.vertices.empty()) + ret += vertices_size_bytes(); + if (!m_render_data.geometry.indices.empty()) + ret += indices_size_bytes(); + return ret; + } + size_t gpu_memory_used() const { + size_t ret = 0; + if (m_render_data.geometry.vertices.empty()) + ret += vertices_size_bytes(); + if (m_render_data.geometry.indices.empty()) + ret += indices_size_bytes(); + return ret; + } + +#if ENABLE_GLMODEL_STATISTICS + static void render_statistics(); + static void reset_statistics_counters() { + s_statistics.render_calls = 0; + s_statistics.render_instanced_calls = 0; + } +#endif // ENABLE_GLMODEL_STATISTICS + private: - void send_to_gpu(RenderData& data, const std::vector& vertices, const std::vector& indices); + bool send_to_gpu(); }; + bool contains(const BuildVolume& volume, const GLModel& model, bool ignore_bottom = true); + // create an arrow with cylindrical stem and conical tip, with the given dimensions and resolution // the origin of the arrow is in the center of the stem cap // the arrow has its axis of symmetry along the Z axis and is pointing upward // used to render bed axes and sequential marker - GLModel::InitializationData stilized_arrow(int resolution, float tip_radius, float tip_height, float stem_radius, float stem_height); + GLModel::Geometry stilized_arrow(unsigned int resolution, float tip_radius, float tip_height, float stem_radius, float stem_height); // create an arrow whose stem is a quarter of circle, with the given dimensions and resolution // the origin of the arrow is in the center of the circle // the arrow is contained in the 1st quadrant of the XY plane and is pointing counterclockwise // used to render sidebar hints for rotations - GLModel::InitializationData circular_arrow(int resolution, float radius, float tip_height, float tip_width, float stem_width, float thickness); + GLModel::Geometry circular_arrow(unsigned int resolution, float radius, float tip_height, float tip_width, float stem_width, float thickness); // create an arrow with the given dimensions // the origin of the arrow is in the center of the stem cap // the arrow is contained in XY plane and has its main axis along the Y axis // used to render sidebar hints for position and scale - GLModel::InitializationData straight_arrow(float tip_width, float tip_height, float stem_width, float stem_height, float thickness); + GLModel::Geometry straight_arrow(float tip_width, float tip_height, float stem_width, float stem_height, float thickness); // create a diamond with the given resolution // the origin of the diamond is in its center // the diamond is contained into a box with size [1, 1, 1] - GLModel::InitializationData diamond(int resolution); + GLModel::Geometry diamond(unsigned int resolution); // create a sphere with smooth normals // the origin of the sphere is in its center diff --git a/src/slic3r/GUI/GLSelectionRectangle.hpp b/src/slic3r/GUI/GLSelectionRectangle.hpp index d9869771ef9..38568fe27c2 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.hpp +++ b/src/slic3r/GUI/GLSelectionRectangle.hpp @@ -33,6 +33,7 @@ class GLSelectionRectangle { void render(const GLCanvas3D& canvas) const; bool is_dragging() const { return m_state != Off; } + bool is_empty() const { return m_state == EState::Off || m_start_corner.isApprox(m_end_corner); } EState get_state() const { return m_state; } float get_width() const { return std::abs(m_start_corner(0) - m_end_corner(0)); } diff --git a/src/slic3r/GUI/GLShader.cpp b/src/slic3r/GUI/GLShader.cpp index 4bd2264ab73..5d2f16f4473 100644 --- a/src/slic3r/GUI/GLShader.cpp +++ b/src/slic3r/GUI/GLShader.cpp @@ -4,6 +4,7 @@ #include "3DScene.hpp" #include "libslic3r/Utils.hpp" #include "libslic3r/format.hpp" +#include "libslic3r/Color.hpp" #include #include @@ -492,7 +493,15 @@ bool GLShaderProgram::set_uniform(const char* name, const Vec3d& value) const { return set_uniform(name, static_cast(value.cast())); } +void GLShaderProgram::set_uniform(int id, const ColorRGB& value) const +{ + set_uniform(id, value.data(), 3); +} +void GLShaderProgram::set_uniform(int id, const ColorRGBA& value) const +{ + set_uniform(id, value.data(), 4); +} int GLShaderProgram::get_attrib_location(const char* name) const { assert(m_id > 0); diff --git a/src/slic3r/GUI/GLShader.hpp b/src/slic3r/GUI/GLShader.hpp index 8e26fd8050c..1c40cdcbf6e 100644 --- a/src/slic3r/GUI/GLShader.hpp +++ b/src/slic3r/GUI/GLShader.hpp @@ -9,6 +9,9 @@ namespace Slic3r { +class ColorRGB; +class ColorRGBA; + class GLShaderProgram { public: @@ -61,7 +64,11 @@ class GLShaderProgram void set_uniform(const char* name, const Matrix3d& value) const; bool set_uniform(const char* name, const Vec3f& value) const; bool set_uniform(const char* name, const Vec3d& value) const; + void set_uniform(const char* name, const ColorRGB& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const ColorRGBA& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(int id, const ColorRGB& value) const; + void set_uniform(int id, const ColorRGBA& value) const; void set_uniform(int id, int value) const; void set_uniform(int id, bool value) const; void set_uniform(int id, float value) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp index ba978050134..054b24c5e06 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp @@ -926,7 +926,7 @@ void GLGizmoAdvancedCut::render_cut_plane_and_grabbers() else render_color = GrabberColor; - const GLModel &cube = m_move_grabber.get_cube(); + GLModel &cube = m_move_grabber.get_cube(); // BBS set to fixed size grabber // float fullsize = 2 * (dragging ? get_dragging_half_size(size) : get_half_size(size)); float fullsize = 8.0f; @@ -934,7 +934,7 @@ void GLGizmoAdvancedCut::render_cut_plane_and_grabbers() fullsize = m_move_grabber.FixedGrabberSize * GLGizmoBase::INV_ZOOM; } - const_cast(&cube)->set_color(-1, render_color); + cube.set_color(render_color); glsafe(::glPushMatrix()); glsafe(::glTranslated(m_move_grabber.center.x(), m_move_grabber.center.y(), m_move_grabber.center.z())); @@ -1049,7 +1049,7 @@ void GLGizmoAdvancedCut::render_connector_model(GLModel &model, const std::array glsafe(::glMultMatrixd(view_model_matrix.data())); - model.set_color(-1, color); + model.set_color(color); model.render(); shader->stop_using(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index fd678f303e1..8d46a0ae07b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -79,7 +79,7 @@ GLGizmoBase::Grabber::Grabber() hover_color = GRABBER_HOVER_COL; } -void GLGizmoBase::Grabber::render(bool hover, float size) const +void GLGizmoBase::Grabber::render(bool hover, float size) { std::array render_color; if (hover) { @@ -113,28 +113,28 @@ void GLGizmoBase::Grabber::unregister_raycasters_for_picking() raycasters = { nullptr }; } -const GLModel& GLGizmoBase::Grabber::get_cube() const +GLModel& GLGizmoBase::Grabber::get_cube() { if (! cube_initialized) { // This cannot be done in constructor, OpenGL is not yet // initialized at that point (on Linux at least). indexed_triangle_set mesh = its_make_cube(1., 1., 1.); its_translate(mesh, Vec3f(-0.5, -0.5, -0.5)); - const_cast(cube).init_from(mesh, BoundingBoxf3{ { -0.5, -0.5, -0.5 }, { 0.5, 0.5, 0.5 } }); - const_cast(cube_initialized) = true; + cube.init_from(mesh); + cube_initialized = true; } return cube; } -void GLGizmoBase::Grabber::render(float size, const std::array& render_color, bool picking) const +void GLGizmoBase::Grabber::render(float size, const std::array& render_color, bool picking) { if (! cube_initialized) { // This cannot be done in constructor, OpenGL is not yet // initialized at that point (on Linux at least). indexed_triangle_set mesh = its_make_cube(1., 1., 1.); its_translate(mesh, Vec3f(-0.5, -0.5, -0.5)); - const_cast(cube).init_from(mesh, BoundingBoxf3{ { -0.5, -0.5, -0.5 }, { 0.5, 0.5, 0.5 } }); - const_cast(cube_initialized) = true; + cube.init_from(mesh); + cube_initialized = true; } //BBS set to fixed size grabber @@ -145,7 +145,7 @@ void GLGizmoBase::Grabber::render(float size, const std::array& render } - const_cast(&cube)->set_color(-1, render_color); + cube.set_color(render_color); glsafe(::glPushMatrix()); glsafe(::glTranslated(center.x(), center.y(), center.z())); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 5bfac2a9fb7..491468ef45b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -76,18 +76,18 @@ class GLGizmoBase Grabber(); - void render(bool hover, float size) const; - void render_for_picking(float size) const { render(size, color, true); } + void render(bool hover, float size); + void render_for_picking(float size) { render(size, color, true); } float get_half_size(float size) const; float get_dragging_half_size(float size) const; - const GLModel& get_cube() const; + GLModel& get_cube(); void register_raycasters_for_picking(int id); void unregister_raycasters_for_picking(); private: - void render(float size, const std::array& render_color, bool picking) const; + void render(float size, const std::array& render_color, bool picking); GLModel cube; bool cube_initialized = false; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index d5008725e4d..a05fb9fa67e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -328,7 +328,7 @@ void GLGizmoCut::update_contours() const Polygons polys = slice_mesh(m_cut_contours.mesh.its, m_cut_z, slicing_params); if (!polys.empty()) { m_cut_contours.contours.init_from(polys, static_cast(m_cut_z)); - m_cut_contours.contours.set_color(-1, { 1.0f, 1.0f, 1.0f, 1.0f }); + m_cut_contours.contours.set_color({ 1.0f, 1.0f, 1.0f, 1.0f }); } } else if (box.center() != m_cut_contours.position) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp index c095c0915e0..1fbbf0ec37f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp @@ -105,7 +105,7 @@ bool GLGizmoFdmSupports::on_init() return true; } -void GLGizmoFdmSupports::render_painter_gizmo() const +void GLGizmoFdmSupports::render_painter_gizmo() { const Selection& selection = m_parent.get_selection(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp index 5651d247a68..c24fe578589 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp @@ -15,7 +15,7 @@ class GLGizmoFdmSupports : public GLGizmoPainterBase public: GLGizmoFdmSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); - void render_painter_gizmo() const override; + void render_painter_gizmo() override; //BBS: add edit state enum EditState { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 39bc98d7fbb..142ffb5a1d6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -99,7 +99,7 @@ void GLGizmoHollow::on_render_for_picking() render_points(selection, true); } -void GLGizmoHollow::render_points(const Selection& selection, bool picking) const +void GLGizmoHollow::render_points(const Selection& selection, bool picking) { GLShaderProgram* shader = picking ? nullptr : wxGetApp().get_shader("gouraud_light"); if (shader) @@ -148,7 +148,7 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons } } - const_cast(&m_vbo_cylinder)->set_color(-1, render_color); + m_vbo_cylinder.set_color(render_color); // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. glsafe(::glPushMatrix()); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index 2cf08de2a0a..89bd060cc13 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -42,7 +42,7 @@ class GLGizmoHollow : public GLGizmoBase void on_render() override; void on_render_for_picking() override; - void render_points(const Selection& selection, bool picking = false) const; + void render_points(const Selection& selection, bool picking = false); void hollow_mesh(bool postpone_error_messages = false); bool unsaved_changes() const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp index 7fd85d6729f..40b1fd9caf5 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp @@ -16,6 +16,8 @@ #include +#include + #include namespace Slic3r { @@ -99,6 +101,8 @@ static GLModel::Geometry init_plane_data(const indexed_triangle_set& its, const { GLModel::Geometry init_data; init_data.format = { GUI::GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + init_data.reserve_indices(3 * triangle_indices.size()); + init_data.reserve_vertices(3 * triangle_indices.size()); unsigned int i = 0; for (int idx : triangle_indices) { const Vec3f& v0 = its.vertices[its.indices[idx][0]]; @@ -278,12 +282,12 @@ GLGizmoMeasure::GLGizmoMeasure(GLCanvas3D& parent, const std::string& icon_filen : GLGizmoBase(parent, icon_filename, sprite_id) { GLModel::Geometry sphere_geometry = smooth_sphere(16, 7.5f); - m_sphere.mesh_raycaster = std::make_unique(TriangleMesh(sphere_geometry.get_as_indexed_triangle_set())); - m_sphere.model.init_from(sphere_geometry); + m_sphere.mesh_raycaster = std::make_unique(std::make_shared(sphere_geometry.get_as_indexed_triangle_set())); + m_sphere.model.init_from(std::move(sphere_geometry)); GLModel::Geometry cylinder_geometry = smooth_cylinder(16, 5.0f, 1.0f); - m_cylinder.mesh_raycaster = std::make_unique(TriangleMesh(cylinder_geometry.get_as_indexed_triangle_set())); - m_cylinder.model.init_from(cylinder_geometry); + m_cylinder.mesh_raycaster = std::make_unique(std::make_shared(cylinder_geometry.get_as_indexed_triangle_set())); + m_cylinder.model.init_from(std::move(cylinder_geometry)); } bool GLGizmoMeasure::on_mouse(const wxMouseEvent &mouse_event) @@ -596,8 +600,8 @@ void GLGizmoMeasure::on_render() m_circle.reset(); const auto [center, radius, normal] = m_curr_feature->get_circle(); GLModel::Geometry circle_geometry = init_torus_data(64, 16, center.cast(), float(radius), 5.0f * inv_zoom, normal.cast(), Transform3f::Identity()); - m_circle.mesh_raycaster = std::make_unique(TriangleMesh(circle_geometry.get_as_indexed_triangle_set())); - m_circle.model.init_from(circle_geometry); + m_circle.mesh_raycaster = std::make_unique(std::make_shared(circle_geometry.get_as_indexed_triangle_set())); + m_circle.model.init_from(std::move(circle_geometry)); return true; } return false; @@ -651,11 +655,11 @@ void GLGizmoMeasure::on_render() const auto [idx, normal, point] = m_curr_feature->get_plane(); if (m_last_plane_idx != idx) { m_last_plane_idx = idx; - const indexed_triangle_set& its = m_measuring->get_mesh().its; + const indexed_triangle_set& its = m_measuring->get_its(); const std::vector& plane_triangles = m_measuring->get_plane_triangle_indices(idx); GLModel::Geometry init_data = init_plane_data(its, plane_triangles); m_plane.reset(); - m_plane.mesh_raycaster = std::make_unique(TriangleMesh(init_data.get_as_indexed_triangle_set())); + m_plane.mesh_raycaster = std::make_unique(std::make_shared(init_data.get_as_indexed_triangle_set())); } m_raycasters.insert({ PLANE_ID, m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, PLANE_ID, *m_plane.mesh_raycaster) }); @@ -785,7 +789,7 @@ void GLGizmoMeasure::on_render() const Transform3d feature_matrix = Geometry::translation_transform(feature.get_point()) * Geometry::scale_transform(inv_zoom); set_matrix_uniforms(feature_matrix); set_emission_uniform(colors.front(), hover); - m_sphere.model.set_color(-1, colors.front().data_array()); + m_sphere.model.set_color(colors.front().data_array()); m_sphere.model.render(); if (update_raycasters_transform) { auto it = m_raycasters.find(POINT_ID); @@ -802,7 +806,7 @@ void GLGizmoMeasure::on_render() set_matrix_uniforms(circle_matrix); if (update_raycasters_transform) { set_emission_uniform(colors.front(), hover); - m_circle.model.set_color(-1, colors.front().data_array()); + m_circle.model.set_color(colors.front().data_array()); m_circle.model.render(); auto it = m_raycasters.find(CIRCLE_ID); if (it != m_raycasters.end() && it->second != nullptr) @@ -811,9 +815,9 @@ void GLGizmoMeasure::on_render() else { GLModel circle; GLModel::Geometry circle_geometry = init_torus_data(64, 16, center.cast(), float(radius), 5.0f * inv_zoom, normal.cast(), Transform3f::Identity()); - circle.init_from(circle_geometry); + circle.init_from(std::move(circle_geometry)); set_emission_uniform(colors.front(), hover); - circle.set_color(-1, colors.front().data_array()); + circle.set_color(colors.front().data_array()); circle.render(); } // render center @@ -821,7 +825,7 @@ void GLGizmoMeasure::on_render() const Transform3d center_matrix = Geometry::translation_transform(center) * Geometry::scale_transform(inv_zoom); set_matrix_uniforms(center_matrix); set_emission_uniform(colors.back(), hover); - m_sphere.model.set_color(-1, colors.back().data_array()); + m_sphere.model.set_color(colors.back().data_array()); m_sphere.model.render(); auto it = m_raycasters.find(POINT_ID); if (it != m_raycasters.end() && it->second != nullptr) @@ -838,7 +842,7 @@ void GLGizmoMeasure::on_render() Geometry::scale_transform({ (double)inv_zoom, (double)inv_zoom, (to - from).norm() }); set_matrix_uniforms(edge_matrix); set_emission_uniform(colors.front(), hover); - m_cylinder.model.set_color(-1, colors.front().data_array()); + m_cylinder.model.set_color(colors.front().data_array()); m_cylinder.model.render(); if (update_raycasters_transform) { auto it = m_raycasters.find(EDGE_ID); @@ -853,7 +857,7 @@ void GLGizmoMeasure::on_render() const Transform3d point_matrix = Geometry::translation_transform(*extra) * Geometry::scale_transform(inv_zoom); set_matrix_uniforms(point_matrix); set_emission_uniform(colors.back(), hover); - m_sphere.model.set_color(-1, colors.back().data_array()); + m_sphere.model.set_color(colors.back().data_array()); m_sphere.model.render(); auto it = m_raycasters.find(POINT_ID); if (it != m_raycasters.end() && it->second != nullptr) @@ -868,7 +872,7 @@ void GLGizmoMeasure::on_render() assert(idx < m_plane_models_cache.size()); set_matrix_uniforms(Transform3d::Identity()); set_emission_uniform(colors.front(), hover); - m_plane_models_cache[idx].set_color(-1, colors.front().data_array()); + m_plane_models_cache[idx].set_color(colors.front().data_array()); m_plane_models_cache[idx].render(); if (update_raycasters_transform) { auto it = m_raycasters.find(PLANE_ID); @@ -1022,7 +1026,7 @@ void GLGizmoMeasure::on_render() set_matrix_uniforms(matrix); const ColorRGBA color = hover_selection_color(); set_emission_uniform(color, true); - m_sphere.model.set_color(-1, color.data_array()); + m_sphere.model.set_color(color.data_array()); m_sphere.model.render(); } } @@ -1039,11 +1043,19 @@ void GLGizmoMeasure::update_if_needed() { auto update_plane_models_cache = [this](const indexed_triangle_set& its) { m_plane_models_cache.clear(); - for (int idx = 0; idx < m_measuring->get_num_of_planes(); ++idx) { - m_plane_models_cache.emplace_back(GLModel()); - GLModel::Geometry init_data = init_plane_data(its, m_measuring->get_plane_triangle_indices(idx)); - m_plane_models_cache.back().init_from(init_data); - } + m_plane_models_cache.resize(m_measuring->get_num_of_planes(), GLModel()); + + auto& plane_models_cache = m_plane_models_cache; + const auto& measuring = m_measuring; + + //for (int idx = 0; idx < m_measuring->get_num_of_planes(); ++idx) { + tbb::parallel_for(tbb::blocked_range(0, m_measuring->get_num_of_planes()), + [&plane_models_cache, &measuring, &its](const tbb::blocked_range& range) { + for (size_t idx = range.begin(); idx != range.end(); ++idx) { + GLModel::Geometry init_data = init_plane_data(its, measuring->get_plane_triangle_indices(idx)); + plane_models_cache[idx].init_from(std::move(init_data)); + } + }); }; auto do_update = [this, update_plane_models_cache](const std::vector& volumes_cache, const Selection& selection) { @@ -1062,8 +1074,8 @@ void GLGizmoMeasure::update_if_needed() } m_measuring.reset(new Measure::Measuring(composite_mesh.its)); - update_plane_models_cache(m_measuring->get_mesh().its); - m_raycaster.reset(new MeshRaycaster(m_measuring->get_mesh())); + update_plane_models_cache(m_measuring->get_its()); + m_raycaster.reset(new MeshRaycaster(std::make_shared(composite_mesh))); m_volumes_cache = volumes_cache; }; @@ -1178,7 +1190,7 @@ void GLGizmoMeasure::render_dimensioning() shader->set_uniform("view_model_matrix", overlap ? ss_to_ndc_matrix * Geometry::translation_transform(v1ss_3) * q12ss * Geometry::translation_transform(-2.0 * TRIANGLE_HEIGHT * Vec3d::UnitX()) * Geometry::scale_transform({ v12ss_len + 4.0 * TRIANGLE_HEIGHT, 1.0f, 1.0f }) : ss_to_ndc_matrix * Geometry::translation_transform(v1ss_3) * q12ss * Geometry::scale_transform({ v12ss_len, 1.0f, 1.0f })); - m_dimensioning.line.set_color(-1, ColorRGBA::WHITE().data_array()); + m_dimensioning.line.set_color(ColorRGBA::WHITE().data_array()); m_dimensioning.line.render(); #if ENABLE_GL_CORE_PROFILE @@ -1447,7 +1459,7 @@ void GLGizmoMeasure::render_dimensioning() init_data.add_index(i); } - m_dimensioning.arc.init_from(init_data); + m_dimensioning.arc.init_from(std::move(init_data)); } const Camera& camera = wxGetApp().plater()->get_camera(); @@ -1606,7 +1618,7 @@ void GLGizmoMeasure::render_dimensioning() // indices init_data.add_line(0, 1); - m_dimensioning.line.init_from(init_data); + m_dimensioning.line.init_from(std::move(init_data)); } if (!m_dimensioning.triangle.is_initialized()) { @@ -1624,7 +1636,7 @@ void GLGizmoMeasure::render_dimensioning() // indices init_data.add_triangle(0, 1, 2); - m_dimensioning.triangle.init_from(init_data); + m_dimensioning.triangle.init_from(std::move(init_data)); } if (last_selected_features != m_selected_features) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp index f432d8ba83b..0e3524f087e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp @@ -8,7 +8,6 @@ #include "slic3r/GUI/I18N.hpp" #include "libslic3r/Measure.hpp" #include "libslic3r/Model.hpp" -#include "slic3r/GUI/SceneRaycaster.hpp" namespace Slic3r { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp index 8ad89a9f2de..1c338d60c41 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp @@ -146,7 +146,7 @@ GLGizmoMmuSegmentation::GLGizmoMmuSegmentation(GLCanvas3D& parent, const std::st { } -void GLGizmoMmuSegmentation::render_painter_gizmo() const +void GLGizmoMmuSegmentation::render_painter_gizmo() { const Selection& selection = m_parent.get_selection(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp index 399931c15d8..8decc813c50 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp @@ -67,7 +67,7 @@ class GLGizmoMmuSegmentation : public GLGizmoPainterBase GLGizmoMmuSegmentation(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); ~GLGizmoMmuSegmentation() override = default; - void render_painter_gizmo() const override; + void render_painter_gizmo() override; void set_painter_gizmo_data(const Selection& selection) override; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index 747d8ec89e2..46986e54899 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -214,7 +214,7 @@ double GLGizmoMove3D::calc_projection(const UpdateData& data) const return projection; } -void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box, bool picking) const +void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box, bool picking) { #if ENABLE_FIXED_GRABBER float mean_size = (float)(GLGizmoBase::Grabber::FixedGrabberSize); @@ -235,7 +235,7 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box if (shader == nullptr) return; - const_cast(&m_vbo_cone)->set_color(-1, color); + m_vbo_cone.set_color(color); if (!picking) { shader->start_using(); shader->set_uniform("emission_factor", 0.1f); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp index 21d19b4465a..16f4a98903d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp @@ -55,7 +55,7 @@ class GLGizmoMove3D : public GLGizmoBase private: double calc_projection(const UpdateData& data) const; - void render_grabber_extension(Axis axis, const BoundingBoxf3& box, bool picking) const; + void render_grabber_extension(Axis axis, const BoundingBoxf3& box, bool picking); }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index 6b421b1531b..f7bff0faf58 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -1,4 +1,5 @@ // Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. +#include "libslic3r/Color.hpp" #include "GLGizmoPainterBase.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" @@ -117,7 +118,7 @@ void GLGizmoPainterBase::render_triangles(const Selection& selection) const } -void GLGizmoPainterBase::render_cursor() const +void GLGizmoPainterBase::render_cursor() { // First check that the mouse pointer is on an object. const ModelObject* mo = m_c->selection_info()->model_object(); @@ -239,7 +240,7 @@ void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const } // BBS -void GLGizmoPainterBase::render_cursor_height_range(const Transform3d& trafo) const +void GLGizmoPainterBase::render_cursor_height_range(const Transform3d& trafo) { const BoundingBoxf3 box = bounding_box(); Vec3d hit_world = trafo * Vec3d(m_rr.hit(0), m_rr.hit(1), m_rr.hit(2)); @@ -289,7 +290,7 @@ BoundingBoxf3 GLGizmoPainterBase::bounding_box() const return ret; } -void GLGizmoPainterBase::update_contours(const TriangleMesh& vol_mesh, float cursor_z, float max_z, float min_z) const +void GLGizmoPainterBase::update_contours(const TriangleMesh& vol_mesh, float cursor_z, float max_z, float min_z) { const Selection& selection = m_parent.get_selection(); const GLVolume* first_glvolume = selection.get_volume(*selection.get_volume_idxs().begin()); @@ -315,7 +316,7 @@ void GLGizmoPainterBase::update_contours(const TriangleMesh& vol_mesh, float cur const Polygons polys = slice_mesh(m_cut_contours.mesh.its, cursor_z, slicing_params); if (!polys.empty()) { m_cut_contours.contours.init_from(polys, static_cast(cursor_z)); - m_cut_contours.contours.set_color(-1, { 1.0f, 1.0f, 1.0f, 1.0f }); + m_cut_contours.contours.set_color(ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f )); } } else if (box.center() != m_cut_contours.position) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp index db56d586569..5e472c5b049 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp @@ -225,7 +225,7 @@ class GLGizmoPainterBase : public GLGizmoBase // from usual on_render method allows to render them before transparent // objects, so they can be seen inside them. The usual on_render is called // after all volumes (including transparent ones) are rendered. - virtual void render_painter_gizmo() const = 0; + virtual void render_painter_gizmo() = 0; virtual const float get_cursor_radius_min() const { return CursorRadiusMin; } virtual const float get_cursor_radius_max() const { return CursorRadiusMax; } @@ -238,11 +238,11 @@ class GLGizmoPainterBase : public GLGizmoBase protected: virtual void render_triangles(const Selection& selection) const; - void render_cursor() const; + void render_cursor(); void render_cursor_circle() const; void render_cursor_sphere(const Transform3d& trafo) const; // BBS - void render_cursor_height_range(const Transform3d& trafo) const; + void render_cursor_height_range(const Transform3d& trafo); //BBS: add logic to distinguish the first_time_update and later_update virtual void update_model_object() = 0; virtual void update_from_model_object(bool first_update) = 0; @@ -368,7 +368,7 @@ class GLGizmoPainterBase : public GLGizmoBase mutable CutContours m_cut_contours; BoundingBoxf3 bounding_box() const; - void update_contours(const TriangleMesh& vol_mesh, float cursor_z, float max_z, float min_z) const; + void update_contours(const TriangleMesh& vol_mesh, float cursor_z, float max_z, float min_z); protected: void on_set_state() override; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 65479b064e9..3537f0ee8ec 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -325,7 +325,7 @@ void GLGizmoRotate::render_grabber(const BoundingBoxf3& box) const render_grabbers(box); } -void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool picking) const +void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool picking) { double size = 0.75 * GLGizmoBase::Grabber::FixedGrabberSize * GLGizmoBase::INV_ZOOM; //float mean_size = (float)((box.size()(0) + box.size()(1) + box.size()(2)) / 3.0); @@ -343,7 +343,7 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick if (shader == nullptr) return; - const_cast(&m_cone)->set_color(-1, color); + m_cone.set_color(color); if (!picking) { shader->start_using(); shader->set_uniform("emission_factor", 0.1f); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp index 9862ec29014..2cbed7c9676 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp @@ -70,7 +70,7 @@ class GLGizmoRotate : public GLGizmoBase void render_reference_radius() const; void render_angle() const; void render_grabber(const BoundingBoxf3& box) const; - void render_grabber_extension(const BoundingBoxf3& box, bool picking) const; + void render_grabber_extension(const BoundingBoxf3& box, bool picking); void transform_to_local(const Selection& selection) const; // returns the intersection of the mouse ray with the plane perpendicular to the gizmo axis, in local coordinate diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp index 6729de61401..cfa9e8e2982 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp @@ -62,7 +62,7 @@ std::string GLGizmoSeam::on_get_name() const -void GLGizmoSeam::render_painter_gizmo() const +void GLGizmoSeam::render_painter_gizmo() { const Selection& selection = m_parent.get_selection(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp index 31ee94f388b..f1c308f18a7 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp @@ -10,7 +10,7 @@ class GLGizmoSeam : public GLGizmoPainterBase public: GLGizmoSeam(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); - void render_painter_gizmo() const override; + void render_painter_gizmo(); //BBS bool on_key_down_select_tool_type(int keyCode); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp index 7b7cc2065de..aca431750d0 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp @@ -622,7 +622,7 @@ void GLGizmoSimplify::init_model(const indexed_triangle_set& its) m_c->selection_info()->get_active_instance(), m_volume); if (const Selection&sel = m_parent.get_selection(); sel.get_volume_idxs().size() == 1) - m_glmodel.set_color(-1, sel.get_volume(*sel.get_volume_idxs().begin())->color); + m_glmodel.set_color(sel.get_volume(*sel.get_volume_idxs().begin())->color); m_triangle_count = its.indices.size(); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 73ed826fc6a..a9e289b4dee 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -109,7 +109,7 @@ void GLGizmoSlaSupports::on_render_for_picking() render_points(selection, true); } -void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) const +void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) { size_t cache_size = m_editing_mode ? m_editing_cache.size() : m_normal_cache.size(); @@ -167,8 +167,8 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) } } - const_cast(&m_cone)->set_color(-1, render_color); - const_cast(&m_sphere)->set_color(-1, render_color); + const_cast(&m_cone)->set_color(render_color); + const_cast(&m_sphere)->set_color(render_color); if (shader && !picking) shader->set_uniform("emission_factor", 0.5f); @@ -223,7 +223,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) render_color[1] = 0.7f; render_color[2] = 0.7f; render_color[3] = 0.7f; - const_cast(&m_cylinder)->set_color(-1, render_color); + const_cast(&m_cylinder)->set_color(render_color); if (shader) shader->set_uniform("emission_factor", 0.5f); for (const sla::DrainHole& drain_hole : m_c->selection_info()->model_object()->sla_drain_holes) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index 8dd76336a35..20dea8d8ebd 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -77,7 +77,7 @@ class GLGizmoSlaSupports : public GLGizmoBase void on_render() override; void on_render_for_picking() override; - void render_points(const Selection& selection, bool picking = false) const; + void render_points(const Selection& selection, bool picking = false); bool unsaved_changes() const; bool m_lock_unique_islands = false; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp b/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp index 8dd8ef5a01a..72dce7c03ea 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp @@ -6,7 +6,7 @@ #include "slic3r/GUI/MeshUtils.hpp" #include "libslic3r/SLA/Hollowing.hpp" - +#include "slic3r/GUI/GLModel.hpp" namespace Slic3r { class ModelObject; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 682153f8425..8707f7a0dff 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -700,7 +700,7 @@ void GLGizmosManager::render_current_gizmo() const m_gizmos[m_current]->render(); } -void GLGizmosManager::render_painter_gizmo() const +void GLGizmosManager::render_painter_gizmo() { // This function shall only be called when current gizmo is // derived from GLGizmoPainterBase. @@ -1648,6 +1648,8 @@ bool GLGizmosManager::activate_gizmo(EType type) if (old_gizmo->get_state() != GLGizmoBase::Off) return false; // gizmo refused to be turned off, do nothing. + old_gizmo->unregister_raycasters_for_picking(); + if (! m_parent.get_gizmos_manager().is_serializing() && old_gizmo->wants_enter_leave_snapshots()) Plater::TakeSnapshot snapshot(wxGetApp().plater(), @@ -1668,7 +1670,9 @@ bool GLGizmosManager::activate_gizmo(EType type) // wxGetApp().imgui()->load_fonts_texture(); //} new_gizmo->set_state(GLGizmoBase::On); + new_gizmo->register_raycasters_for_picking(); } + return true; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index 794d06ce5c2..70d276b9865 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -288,7 +288,7 @@ class GLGizmosManager : public Slic3r::ObjectBase void on_change_color_mode(bool is_dark); void render_current_gizmo() const; void render_current_gizmo_for_picking_pass() const; - void render_painter_gizmo() const; + void render_painter_gizmo(); void render_painter_assemble_view() const; void render_overlay(); diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index e134b610425..1c11acb1148 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -84,6 +84,7 @@ static const std::map font_icons = { {ImGui::TextSearchIcon , "im_text_search" }, {ImGui::TextSearchCloseIcon , "im_text_search_close" }, + {ImGui::ClipboardBtnIcon , "copy_menu" }, {ImGui::ExpandBtn , "expand_btn" }, {ImGui::CollapseBtn , "collapse_btn" }, diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index 3c81d43ce4f..56a682eaff4 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -216,36 +216,24 @@ void MeshRaycaster::line_from_mouse_pos_static(const Vec2d &mouse_pos, const Tra direction = inv.linear() * direction; } -void MeshRaycaster::line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, - Vec3d& point, Vec3d& direction) const +void MeshRaycaster::line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, Vec3d& point, Vec3d& direction) { - Matrix4d modelview = camera.get_view_matrix().matrix(); - Matrix4d projection= camera.get_projection_matrix().matrix(); - Vec4i viewport(camera.get_viewport().data()); - - Vec3d pt1; - Vec3d pt2; - igl::unproject(Vec3d(mouse_pos(0), viewport[3] - mouse_pos(1), 0.), - modelview, projection, viewport, pt1); - igl::unproject(Vec3d(mouse_pos(0), viewport[3] - mouse_pos(1), 1.), - modelview, projection, viewport, pt2); - + CameraUtils::ray_from_screen_pos(camera, mouse_pos, point, direction); Transform3d inv = trafo.inverse(); - pt1 = inv * pt1; - pt2 = inv * pt2; - - point = pt1; - direction = pt2-pt1; + point = inv*point; + direction = inv.linear()*direction; } - bool MeshRaycaster::unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, Vec3f& position, Vec3f& normal, const ClippingPlane* clipping_plane, size_t* facet_idx, bool sinking_limit) const { Vec3d point; Vec3d direction; - line_from_mouse_pos(mouse_pos, trafo, camera, point, direction); + CameraUtils::ray_from_screen_pos(camera, mouse_pos, point, direction); + Transform3d inv = trafo.inverse(); + point = inv*point; + direction = inv.linear()*direction; std::vector hits = m_emesh.query_ray_hits(point, direction); @@ -259,7 +247,7 @@ bool MeshRaycaster::unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d& for (i=0; i= (sinking_limit ? SINKING_Z_THRESHOLD : -std::numeric_limits::max()) && - (!clipping_plane || !clipping_plane->is_point_clipped(transformed_hit))) + (! clipping_plane || ! clipping_plane->is_point_clipped(transformed_hit))) break; } @@ -280,12 +268,27 @@ bool MeshRaycaster::unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d& } + +bool MeshRaycaster::intersects_line(Vec3d point, Vec3d direction, const Transform3d& trafo) const +{ + Transform3d trafo_inv = trafo.inverse(); + Vec3d to = trafo_inv * (point + direction); + point = trafo_inv * point; + direction = (to-point).normalized(); + + std::vector hits = m_emesh.query_ray_hits(point, direction); + std::vector neg_hits = m_emesh.query_ray_hits(point, -direction); + + return !hits.empty() || !neg_hits.empty(); +} + + std::vector MeshRaycaster::get_unobscured_idxs(const Geometry::Transformation& trafo, const Camera& camera, const std::vector& points, const ClippingPlane* clipping_plane) const { std::vector out; - const Transform3d& instance_matrix_no_translation_no_scaling = trafo.get_matrix(true,false,true); + const Transform3d instance_matrix_no_translation_no_scaling = trafo.get_rotation_matrix(); Vec3d direction_to_camera = -camera.get_dir_forward(); Vec3d direction_to_camera_mesh = (instance_matrix_no_translation_no_scaling.inverse() * direction_to_camera).normalized().eval(); direction_to_camera_mesh = direction_to_camera_mesh.cwiseProduct(trafo.get_scaling_factor()); @@ -361,13 +364,14 @@ bool MeshRaycaster::closest_hit(const Vec2d& mouse_pos, const Transform3d& trafo return true; } - Vec3f MeshRaycaster::get_closest_point(const Vec3f& point, Vec3f* normal) const { int idx = 0; Vec3d closest_point; - m_emesh.squared_distance(point.cast(), idx, closest_point); + Vec3d pointd = point.cast(); + m_emesh.squared_distance(pointd, idx, closest_point); if (normal) + // TODO: consider: get_normal(m_emesh, pointd).cast(); *normal = m_normals[idx]; return closest_point.cast(); diff --git a/src/slic3r/GUI/MeshUtils.hpp b/src/slic3r/GUI/MeshUtils.hpp index b57aaf3a5dd..5133f915562 100644 --- a/src/slic3r/GUI/MeshUtils.hpp +++ b/src/slic3r/GUI/MeshUtils.hpp @@ -56,6 +56,8 @@ class ClippingPlane void set_offset(double offset) { m_data[3] = offset; } double get_offset() const { return m_data[3]; } Vec3d get_normal() const { return Vec3d(m_data[0], m_data[1], m_data[2]); } + void invert_normal() { m_data[0] *= -1.0; m_data[1] *= -1.0; m_data[2] *= -1.0; } + ClippingPlane inverted_normal() const { return ClippingPlane(-get_normal(), get_offset()); } bool is_active() const { return m_data[3] != DBL_MAX; } static ClippingPlane ClipsNothing() { return ClippingPlane(Vec3d(0., 0., 1.), DBL_MAX); } const double* get_data() const { return m_data; } @@ -129,19 +131,23 @@ class MeshClipper { // whether certain points are visible or obscured by the mesh etc. class MeshRaycaster { public: - // The class references extern TriangleMesh, which must stay alive - // during MeshRaycaster existence. - MeshRaycaster(const TriangleMesh& mesh) - : m_emesh(mesh, true) // calculate epsilon for triangle-ray intersection from an average edge length - , m_normals(its_face_normals(mesh.its)) + explicit MeshRaycaster(std::shared_ptr mesh) + : m_mesh(std::move(mesh)) + , m_emesh(*m_mesh, true) // calculate epsilon for triangle-ray intersection from an average edge length + , m_normals(its_face_normals(m_mesh->its)) { + assert(m_mesh); } + explicit MeshRaycaster(const TriangleMesh &mesh) + : MeshRaycaster(std::make_unique(mesh)) + {} static void line_from_mouse_pos_static(const Vec2d &mouse_pos, const Transform3d &trafo, const Camera &camera, Vec3d &point, Vec3d &direction); - - void line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, - Vec3d& point, Vec3d& direction) const; + + // DEPRICATED - use CameraUtils::ray_from_screen_pos + static void line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, + Vec3d& point, Vec3d& direction); // Given a mouse position, this returns true in case it is on the mesh. bool unproject_on_mesh( @@ -152,8 +158,14 @@ class MeshRaycaster { Vec3f& normal, // normal of the triangle that was hit const ClippingPlane* clipping_plane = nullptr, // clipping plane (if active) size_t* facet_idx = nullptr, // index of the facet hit - bool sinking_limit = true +bool sinking_limit = true ) const; + + const AABBMesh &get_aabb_mesh() const { return m_emesh; } + + // Given a point and direction in world coords, returns whether the respective line + // intersects the mesh if it is transformed into world by trafo. + bool intersects_line(Vec3d point, Vec3d direction, const Transform3d& trafo) const; // Given a vector of points in woorld coordinates, this returns vector // of indices of points that are visible (i.e. not cut by clipping plane @@ -165,11 +177,6 @@ class MeshRaycaster { const ClippingPlane* clipping_plane = nullptr // clipping plane (if active) ) const; - // Given a point in world coords, the method returns closest point on the mesh. - // The output is in mesh coords. - // normal* can be used to also get normal of the respective triangle. - - Vec3f get_closest_point(const Vec3f& point, Vec3f* normal = nullptr) const; // Returns true if the ray, built from mouse position and camera direction, intersects the mesh. // In this case, position and normal contain the position and normal, in model coordinates, of the intersection closest to the camera, // depending on the position/orientation of the clipping_plane, if specified @@ -182,16 +189,22 @@ class MeshRaycaster { const ClippingPlane* clipping_plane = nullptr, // clipping plane (if active) size_t* facet_idx = nullptr // index of the facet hit ) const; + + // Given a point in world coords, the method returns closest point on the mesh. + // The output is in mesh coords. + // normal* can be used to also get normal of the respective triangle. + Vec3f get_closest_point(const Vec3f& point, Vec3f* normal = nullptr) const; + // Given a point in mesh coords, the method returns the closest facet from mesh. int get_closest_facet(const Vec3f &point) const; Vec3f get_triangle_normal(size_t facet_idx) const; private: + std::shared_ptr m_mesh; AABBMesh m_emesh; std::vector m_normals; }; - struct PickingModel { GLModel model; diff --git a/src/slic3r/GUI/SceneRaycaster.cpp b/src/slic3r/GUI/SceneRaycaster.cpp index 64493d86b49..08c34076329 100644 --- a/src/slic3r/GUI/SceneRaycaster.cpp +++ b/src/slic3r/GUI/SceneRaycaster.cpp @@ -40,6 +40,7 @@ std::shared_ptr SceneRaycaster::add_raycaster(EType type, in case EType::Bed: { return m_bed.emplace_back(std::make_shared(encode_id(type, id), raycaster, trafo, use_back_faces)); } case EType::Volume: { return m_volumes.emplace_back(std::make_shared(encode_id(type, id), raycaster, trafo, use_back_faces)); } case EType::Gizmo: { return m_gizmos.emplace_back(std::make_shared(encode_id(type, id), raycaster, trafo, use_back_faces)); } + case EType::FallbackGizmo: { return m_fallback_gizmos.emplace_back(std::make_shared(encode_id(type, id), raycaster, trafo, use_back_faces)); } default: { assert(false); return nullptr; } }; } @@ -62,6 +63,7 @@ void SceneRaycaster::remove_raycasters(EType type) case EType::Bed: { m_bed.clear(); break; } case EType::Volume: { m_volumes.clear(); break; } case EType::Gizmo: { m_gizmos.clear(); break; } + case EType::FallbackGizmo: { m_fallback_gizmos.clear(); break; } default: { break; } }; } @@ -86,6 +88,12 @@ void SceneRaycaster::remove_raycaster(std::shared_ptr item) return; } } + for (auto it = m_fallback_gizmos.begin(); it != m_fallback_gizmos.end(); ++it) { + if (*it == item) { + m_fallback_gizmos.erase(it); + return; + } + } } SceneRaycaster::HitResult SceneRaycaster::hit(const Vec2d& mouse_pos, const Camera& camera, const ClippingPlane* clipping_plane) const @@ -174,6 +182,9 @@ SceneRaycaster::HitResult SceneRaycaster::hit(const Vec2d& mouse_pos, const Came if (!m_gizmos.empty()) test_raycasters(EType::Gizmo, mouse_pos, camera, ret); + if (!m_fallback_gizmos.empty() && !ret.is_valid()) + test_raycasters(EType::FallbackGizmo, mouse_pos, camera, ret); + if (!m_gizmos_on_top || !ret.is_valid()) { if (camera.is_looking_downward() && !m_bed.empty()) test_raycasters(EType::Bed, mouse_pos, camera, ret); @@ -241,6 +252,14 @@ size_t SceneRaycaster::active_gizmos_count() const { } return count; } +size_t SceneRaycaster::active_fallback_gizmos_count() const { + size_t count = 0; + for (const auto& g : m_fallback_gizmos) { + if (g->is_active()) + ++count; + } + return count; +} #endif // ENABLE_RAYCAST_PICKING_DEBUG std::vector>* SceneRaycaster::get_raycasters(EType type) @@ -251,6 +270,7 @@ std::vector>* SceneRaycaster::get_raycasters case EType::Bed: { ret = &m_bed; break; } case EType::Volume: { ret = &m_volumes; break; } case EType::Gizmo: { ret = &m_gizmos; break; } + case EType::FallbackGizmo: { ret = &m_fallback_gizmos; break; } default: { break; } } assert(ret != nullptr); @@ -265,6 +285,7 @@ const std::vector>* SceneRaycaster::get_rayc case EType::Bed: { ret = &m_bed; break; } case EType::Volume: { ret = &m_volumes; break; } case EType::Gizmo: { ret = &m_gizmos; break; } + case EType::FallbackGizmo: { ret = &m_fallback_gizmos; break; } default: { break; } } assert(ret != nullptr); @@ -278,6 +299,7 @@ int SceneRaycaster::base_id(EType type) case EType::Bed: { return int(EIdBase::Bed); } case EType::Volume: { return int(EIdBase::Volume); } case EType::Gizmo: { return int(EIdBase::Gizmo); } + case EType::FallbackGizmo: { return int(EIdBase::FallbackGizmo); } default: { break; } }; diff --git a/src/slic3r/GUI/SceneRaycaster.hpp b/src/slic3r/GUI/SceneRaycaster.hpp index df44b1701c0..8102e20de4e 100644 --- a/src/slic3r/GUI/SceneRaycaster.hpp +++ b/src/slic3r/GUI/SceneRaycaster.hpp @@ -42,14 +42,16 @@ class SceneRaycaster None, Bed, Volume, - Gizmo + Gizmo, + FallbackGizmo // Is used for gizmo grabbers which will be hit after all grabbers of Gizmo type }; enum class EIdBase { Bed = 0, Volume = 1000, - Gizmo = 1000000 + Gizmo = 1000000, + FallbackGizmo = 2000000 }; struct HitResult @@ -66,6 +68,7 @@ class SceneRaycaster std::vector> m_bed; std::vector> m_volumes; std::vector> m_gizmos; + std::vector> m_fallback_gizmos; // When set to true, if checking gizmos returns a valid hit, // the search is not performed on other types @@ -99,9 +102,11 @@ class SceneRaycaster size_t beds_count() const { return m_bed.size(); } size_t volumes_count() const { return m_volumes.size(); } size_t gizmos_count() const { return m_gizmos.size(); } + size_t fallback_gizmos_count() const { return m_fallback_gizmos.size(); } size_t active_beds_count() const; size_t active_volumes_count() const; size_t active_gizmos_count() const; + size_t active_fallback_gizmos_count() const; #endif // ENABLE_RAYCAST_PICKING_DEBUG static int decode_id(EType type, int id); diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 0683bb48923..1e29a7e2ab2 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -1571,7 +1571,7 @@ void Selection::erase() } } -void Selection::render(float scale_factor) const +void Selection::render(float scale_factor) { if (!m_valid || is_empty()) return; @@ -1602,7 +1602,7 @@ void Selection::render_center(bool gizmo_is_dragging) const #endif // ENABLE_RENDER_SELECTION_CENTER //BBS: GUI refactor, add uniform scale from gizmo -void Selection::render_sidebar_hints(const std::string& sidebar_field, bool uniform_scale) const +void Selection::render_sidebar_hints(const std::string& sidebar_field, bool uniform_scale) //void Selection::render_sidebar_hints(const std::string& sidebar_field) const { if (sidebar_field.empty()) @@ -2150,13 +2150,13 @@ void Selection::do_remove_object(unsigned int object_idx) } } -void Selection::render_selected_volumes() const +void Selection::render_selected_volumes() { float color[3] = { 1.0f, 1.0f, 1.0f }; render_bounding_box(get_bounding_box(), color); } -void Selection::render_synchronized_volumes() const +void Selection::render_synchronized_volumes() { if (m_mode == Instance) return; @@ -2180,7 +2180,7 @@ void Selection::render_synchronized_volumes() const } } -void Selection::render_bounding_box(const BoundingBoxf3& box, float* color) const +void Selection::render_bounding_box(const BoundingBoxf3& box, float* color) { if (color == nullptr) return; @@ -2239,25 +2239,25 @@ static std::array get_color(Axis axis) GLGizmoBase::AXES_COLOR[axis][3] }; }; -void Selection::render_sidebar_position_hints(const std::string& sidebar_field) const +void Selection::render_sidebar_position_hints(const std::string& sidebar_field) { if (boost::ends_with(sidebar_field, "x")) { glsafe(::glRotated(-90.0, 0.0, 0.0, 1.0)); - const_cast(&m_arrow)->set_color(-1, get_color(X)); + const_cast(&m_arrow)->set_color(get_color(X)); m_arrow.render(); } else if (boost::ends_with(sidebar_field, "y")) { - const_cast(&m_arrow)->set_color(-1, get_color(Y)); + const_cast(&m_arrow)->set_color(get_color(Y)); m_arrow.render(); } else if (boost::ends_with(sidebar_field, "z")) { glsafe(::glRotated(90.0, 1.0, 0.0, 0.0)); - const_cast(&m_arrow)->set_color(-1, get_color(Z)); + const_cast(&m_arrow)->set_color(get_color(Z)); m_arrow.render(); } } -void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field) const +void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field) { auto render_sidebar_rotation_hint = [this]() { m_curved_arrow.render(); @@ -2267,29 +2267,29 @@ void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field) if (boost::ends_with(sidebar_field, "x")) { glsafe(::glRotated(90.0, 0.0, 1.0, 0.0)); - const_cast(&m_curved_arrow)->set_color(-1, get_color(X)); + const_cast(&m_curved_arrow)->set_color(get_color(X)); render_sidebar_rotation_hint(); } else if (boost::ends_with(sidebar_field, "y")) { glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); - const_cast(&m_curved_arrow)->set_color(-1, get_color(Y)); + const_cast(&m_curved_arrow)->set_color(get_color(Y)); render_sidebar_rotation_hint(); } else if (boost::ends_with(sidebar_field, "z")) { - const_cast(&m_curved_arrow)->set_color(-1, get_color(Z)); + const_cast(&m_curved_arrow)->set_color(get_color(Z)); render_sidebar_rotation_hint(); } } //BBS: GUI refactor: add gizmo uniform_scale -void Selection::render_sidebar_scale_hints(const std::string& sidebar_field, bool gizmo_uniform_scale) const +void Selection::render_sidebar_scale_hints(const std::string& sidebar_field, bool gizmo_uniform_scale) { // BBS //bool uniform_scale = requires_uniform_scale() || wxGetApp().obj_manipul()->get_uniform_scaling(); bool uniform_scale = requires_uniform_scale() || gizmo_uniform_scale; auto render_sidebar_scale_hint = [this, uniform_scale](Axis axis) { - const_cast(&m_arrow)->set_color(-1, uniform_scale ? UNIFORM_SCALE_COLOR : get_color(axis)); + const_cast(&m_arrow)->set_color(uniform_scale ? UNIFORM_SCALE_COLOR : get_color(axis)); GLShaderProgram* shader = wxGetApp().get_current_shader(); if (shader != nullptr) shader->set_uniform("emission_factor", 0.0f); @@ -2323,7 +2323,7 @@ void Selection::render_sidebar_scale_hints(const std::string& sidebar_field, boo } } -void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) const +void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) { static const double Margin = 10.0; diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp index 1801ee7dc0c..01013a0fa01 100644 --- a/src/slic3r/GUI/Selection.hpp +++ b/src/slic3r/GUI/Selection.hpp @@ -305,12 +305,12 @@ class Selection void erase(); - void render(float scale_factor = 1.0) const; + void render(float scale_factor = 1.0); #if ENABLE_RENDER_SELECTION_CENTER void render_center(bool gizmo_is_dragging) const; #endif // ENABLE_RENDER_SELECTION_CENTER //BBS: GUI refactor: add uniform scale from gizmo - void render_sidebar_hints(const std::string& sidebar_field, bool uniform_scale) const; + void render_sidebar_hints(const std::string& sidebar_field, bool uniform_scale); bool requires_local_axes() const; @@ -353,14 +353,14 @@ class Selection void do_remove_instance(unsigned int object_idx, unsigned int instance_idx); void do_remove_object(unsigned int object_idx); void set_bounding_boxes_dirty() { m_bounding_box.reset(); m_unscaled_instance_bounding_box.reset(); m_scaled_instance_bounding_box.reset(); } - void render_selected_volumes() const; - void render_synchronized_volumes() const; - void render_bounding_box(const BoundingBoxf3& box, float* color) const; - void render_sidebar_position_hints(const std::string& sidebar_field) const; - void render_sidebar_rotation_hints(const std::string& sidebar_field) const; + void render_selected_volumes(); + void render_synchronized_volumes(); + void render_bounding_box(const BoundingBoxf3& box, float* color); + void render_sidebar_position_hints(const std::string& sidebar_field); + void render_sidebar_rotation_hints(const std::string& sidebar_field); //BBS: GUI refactor: add uniform_scale from gizmo - void render_sidebar_scale_hints(const std::string& sidebar_field, bool gizmo_uniform_scale) const; - void render_sidebar_layers_hints(const std::string& sidebar_field) const; + void render_sidebar_scale_hints(const std::string& sidebar_field, bool gizmo_uniform_scale); + void render_sidebar_layers_hints(const std::string& sidebar_field); public: enum SyncRotationType { From cdbe19870e6743d53382b96aa0df511ebeb58809 Mon Sep 17 00:00:00 2001 From: ZeroG <78506178+ZeroGDesign@users.noreply.github.com> Date: Tue, 10 Oct 2023 01:53:32 +0200 Subject: [PATCH 03/18] Update OrcaSlicer_nl.po (#2364) Fixes/Updates: 1. Shift typo fixed 2. "Pengrootte" is supposed to be one word. 3. "Gebied" doesn't sound right for a shape, "Bol" is better. 4. "Sectie weergave" is two words --- localization/i18n/nl/OrcaSlicer_nl.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/localization/i18n/nl/OrcaSlicer_nl.po b/localization/i18n/nl/OrcaSlicer_nl.po index 7b552634a32..30e0d2d1351 100644 --- a/localization/i18n/nl/OrcaSlicer_nl.po +++ b/localization/i18n/nl/OrcaSlicer_nl.po @@ -26,7 +26,7 @@ msgid "Ctrl + Mouse wheel" msgstr "Ctrl + muiswiel" msgid "Pen size" -msgstr "Pen grootte" +msgstr "Pengrootte" msgid "Left mouse button" msgstr "Linker muisknop" @@ -41,7 +41,7 @@ msgid "Block supports" msgstr "Support blokkeren" msgid "Shift + Left mouse button" -msgstr "Shit + linker muisknop" +msgstr "Shift + linker muisknop" msgid "Erase" msgstr "Wissen" @@ -77,7 +77,7 @@ msgid "Circle" msgstr "Cirkel" msgid "Sphere" -msgstr "Gebied" +msgstr "Bol" msgid "Fill" msgstr "Vullen" @@ -3101,7 +3101,7 @@ msgid "Explosion Ratio" msgstr "Vergrotings ratio" msgid "Section View" -msgstr "Sectieweergave" +msgstr "Sectie weergave" msgid "Assemble Control" msgstr "Assemblage controle" From 954a21110788e983b1d269f36911da4fd7b8b5c1 Mon Sep 17 00:00:00 2001 From: ZdDroid <43038779+ZdDroid@users.noreply.github.com> Date: Wed, 11 Oct 2023 21:54:55 +0800 Subject: [PATCH 04/18] =?UTF-8?q?=E9=80=89=E6=8B=A9=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E6=9C=BA=E5=A2=9E=E5=8A=A0=E5=85=B3=E9=94=AE=E5=AD=97=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=20(#2376)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ZdDroid <601865048@qq.com> --- resources/web/guide/24/24.css | 28 ++ resources/web/guide/24/24.js | 432 +++++++++++++++++------------- resources/web/guide/24/index.html | 95 +++---- 3 files changed, 326 insertions(+), 229 deletions(-) diff --git a/resources/web/guide/24/24.css b/resources/web/guide/24/24.css index eeb78189fe9..c1e19b485d0 100644 --- a/resources/web/guide/24/24.css +++ b/resources/web/guide/24/24.css @@ -147,3 +147,31 @@ display: flex; justify-content:space-around; } + +.search { + width: 100%; + position: relative; + display: flex; + } + + .searchTerm { + width: 100%; + border: 3px solid #009688; + /*border-right: none;*/ + padding: 5px; + height: 20px; + border-radius: 5px 5px 5px 5px; + outline: none; + color: #9DBFAF; + } + + .searchTerm:focus{ + color: #009688; + } + + /*Resize the wrap to see the search bar change!*/ + .wrap{ + width: 30%; + padding-bottom: 5px; + padding-left: 42px; + } \ No newline at end of file diff --git a/resources/web/guide/24/24.js b/resources/web/guide/24/24.js index 880d83ca492..b7e16b7850e 100644 --- a/resources/web/guide/24/24.js +++ b/resources/web/guide/24/24.js @@ -1,142 +1,129 @@ -function OnInit() -{ +function OnInit() { + //let strInput=JSON.stringify(cData); - //HandleStudio(strInput); - + //HandleModelList(cData); + TranslatePage(); - + RequestProfile(); } -function RequestProfile() -{ - var tSend={}; - tSend['sequence_id']=Math.round(new Date() / 1000); - tSend['command']="request_userguide_profile"; - - SendWXMessage( JSON.stringify(tSend) ); +function RequestProfile() { + var tSend = {}; + tSend['sequence_id'] = Math.round(new Date() / 1000); + tSend['command'] = "request_userguide_profile"; + + SendWXMessage(JSON.stringify(tSend)); } -function HandleStudio( pVal ) -{ -// alert(strInput); -// alert(JSON.stringify(strInput)); -// -// let pVal=IsJson(strInput); -// if(pVal==null) -// { -// alert("Msg Format Error is not Json"); -// return; -// } - - let strCmd=pVal['command']; +function HandleStudio(pVal) { + // alert(strInput); + // alert(JSON.stringify(strInput)); + // + // let pVal=IsJson(strInput); + // if(pVal==null) + // { + // alert("Msg Format Error is not Json"); + // return; + // } + + let strCmd = pVal['command']; //alert(strCmd); - - if(strCmd=='response_userguide_profile') - { + + if (strCmd == 'response_userguide_profile') { HandleModelList(pVal['response']); } } -function ShowPrinterThumb(pItem, strImg) -{ - $(pItem).attr('src',strImg); - $(pItem).attr('onerror',null); +function ShowPrinterThumb(pItem, strImg) { + $(pItem).attr('src', strImg); + $(pItem).attr('onerror', null); } -function HandleModelList( pVal ) -{ - if( !pVal.hasOwnProperty("model") ) +function HandleModelList(pVal) { + if (!pVal.hasOwnProperty("model")) return; - let pModel=pVal['model']; - - let nTotal=pModel.length; - let ModelHtml={}; - for(let n=0;n'+ -'
'+ -'
'+ -'
all
'+ -'
none
'+ -'
'+ -' '+sVV+''+ -'
'+ -'
'+ -'
'+ -''; - + if ($(".OneVendorBlock[vendor='" + strVendor + "']").length == 0) { + let sVV = strVendor; + if (sVV == "BBL") + sVV = "Bambu Lab"; + if (sVV == "Custom") + sVV = "Custom Printer"; + if (sVV == "Other") + sVV = "Orca colosseum"; + + let HtmlNewVendor = '
' + + '
' + + '
' + + '
all
' + + '
none
' + + '
' + + ' ' + sVV + '' + + '
' + + '
' + + '
' + + '
'; + $('#Content').append(HtmlNewVendor); } - - let ModelName=OneModel['model']; - + + let ModelName = OneModel['model']; + //Collect Html Node Nozzel Html - if( !ModelHtml.hasOwnProperty(strVendor)) - ModelHtml[strVendor]=''; - - let NozzleArray=OneModel['nozzle_diameter'].split(';'); - let HtmlNozzel=''; - for(let m=0;m'+nNozzel+'mm nozzle'; + if (!ModelHtml.hasOwnProperty(strVendor)) + ModelHtml[strVendor] = ''; + + let NozzleArray = OneModel['nozzle_diameter'].split(';'); + let HtmlNozzel = ''; + for (let m = 0; m < NozzleArray.length; m++) { + let nNozzel = NozzleArray[m]; + HtmlNozzel += '
' + nNozzel + 'mm nozzle
'; } - - let CoverImage=OneModel['cover']; - ModelHtml[strVendor]+='
'+ -'
'+ -'
'+OneModel['model']+'
'+ HtmlNozzel +'
'; + + let CoverImage = OneModel['cover']; + ModelHtml[strVendor] += '
' + + '
' + + '
' + OneModel['model'] + '
' + HtmlNozzel + '
'; } - + //Update Nozzel Html Append - for( let key in ModelHtml ) - { - $(".OneVendorBlock[vendor='"+key+"'] .PrinterArea").append( ModelHtml[key] ); + for (let key in ModelHtml) { + $(".OneVendorBlock[vendor='" + key + "'] .PrinterArea").append(ModelHtml[key]); } - - + + //Update Checkbox $('input').prop("checked", false); - for(let m=0;m' + + '
' + + '
' + + '
all
' + + '
none
' + + '
' + + ' ' + sVV + '' + + '
' + + '
' + + '
' + + ''; + + $('#Content').append(HtmlNewVendor); + } + + //Collect Html Node Nozzel Html + if (!ModelHtml.hasOwnProperty(strVendor)) + ModelHtml[strVendor] = ''; + + let NozzleArray = OneModel['nozzle_diameter'].split(';'); + let HtmlNozzel = ''; + for (let m = 0; m < NozzleArray.length; m++) { + let nNozzel = NozzleArray[m]; + HtmlNozzel += '
' + nNozzel + 'mm nozzle
'; + } + + let CoverImage = OneModel['cover']; + ModelHtml[strVendor] += '
' + + '
' + + '
' + OneModel['model'] + '
' + HtmlNozzel + '
'; + } + + //Update Nozzel Html Append + for (let key in ModelHtml) { + let obj = $(".OneVendorBlock[vendor='" + key + "'] .PrinterArea"); + obj.empty(); + obj.append(ModelHtml[key]); + } + + + //Update Checkbox + $('input').prop("checked", false); + for (let m = 0; m < nTotal; m++) { + let OneModel = pModel[m]; + + let SelectList = OneModel['nozzle_selected']; + if (SelectList != '') { + SelectList = OneModel['nozzle_selected'].split(';'); + let nLen = SelectList.length; + + for (let a = 0; a < nLen; a++) { + let nNozzel = SelectList[a]; + $("input[vendor='" + OneModel['vendor'] + "'][model='" + OneModel['model'] + "'][nozzel='" + nNozzel + "']").prop("checked", true); + } + } + else { + $("input[vendor='" + OneModel['vendor'] + "'][model='" + OneModel['model'] + "']").prop("checked", false); + } + } + + // let AlreadySelect=$("input:checked"); + // let nSelect=AlreadySelect.length; + // if(nSelect==0) + // { + // $("input[nozzel='0.4'][vendor='Custom']").prop("checked", true); + // } + + TranslatePage(); } -function SelectPrinterNone( sVendor ) -{ - $("input[vendor='"+sVendor+"']").prop("checked", false); +function SelectPrinterAll(sVendor) { + $("input[vendor='" + sVendor + "']").prop("checked", true); +} + + +function SelectPrinterNone(sVendor) { + $("input[vendor='" + sVendor + "']").prop("checked", false); } // -function OnExit() -{ - let ModelAll={}; - - let ModelSelect=$("input:checked"); - let nTotal=ModelSelect.length; - - if( nTotal==0 ) - { +function OnExit() { + let ModelAll = {}; + + let ModelSelect = $("input:checked"); + let nTotal = ModelSelect.length; + + if (nTotal == 0) { ShowNotice(1); - + return 0; } - - for(let n=0;n0) - { - var tSend={}; - tSend['sequence_id']=Math.round(new Date() / 1000); - tSend['command']="user_guide_finish"; - tSend['data']={}; - tSend['data']['action']="finish"; - - SendWXMessage( JSON.stringify(tSend) ); +function ConfirmSelect() { + let nChoose = OnExit(); + + if (nChoose > 0) { + var tSend = {}; + tSend['sequence_id'] = Math.round(new Date() / 1000); + tSend['command'] = "user_guide_finish"; + tSend['data'] = {}; + tSend['data']['action'] = "finish"; + + SendWXMessage(JSON.stringify(tSend)); } } diff --git a/resources/web/guide/24/index.html b/resources/web/guide/24/index.html index 87a538f478f..d4c66983698 100644 --- a/resources/web/guide/24/index.html +++ b/resources/web/guide/24/index.html @@ -1,27 +1,34 @@ + - - -引导_P21 - - - - - - - - - - + + + 引导_P21 + + + + + + + + + + + -
-
Printer Selection
-
-
+
+
Printer Selection
+
+
+ +
+
- - -
-
-
Confirm
-
Cancel
-
- -
-
-
error
-
-
At least one printer must be selected.
-
-
ok
+
+
+
Confirm
+
Cancel
-
- - - - - + + \ No newline at end of file From 68180875e0294a654754762956ad67abdf9ca51a Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Wed, 11 Oct 2023 09:14:21 -0500 Subject: [PATCH 05/18] Show as much information as possible in crash log (#2386) --- src/StackWalker.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/StackWalker.cpp b/src/StackWalker.cpp index f625d23e732..2d20cbd0dac 100644 --- a/src/StackWalker.cpp +++ b/src/StackWalker.cpp @@ -492,7 +492,8 @@ LPSTACKINFO CStackWalker::StackWalker(HANDLE hThread, const CONTEXT* context) { //调用错误一般是487(地址无效或者没有访问的权限、在符号表中未找到指定地址的相关信息) this->OutputString(_T("Call SymGetSymFromAddr64 ,Address %08x Error:%08x\r\n"), sf.AddrPC.Offset, GetLastError()); - continue; + + StringCchCopy(pCallStack->undFullName, STACKWALK_MAX_NAMELEN, textconv_helper::A2T_("Unknown")); } if (SymGetLineFromAddr64(m_hProcess, sf.AddrPC.Offset, (DWORD*)&dwDisplayment, pLine)) @@ -502,7 +503,9 @@ LPSTACKINFO CStackWalker::StackWalker(HANDLE hThread, const CONTEXT* context) }else { this->OutputString(_T("Call SymGetLineFromAddr64 ,Address %08x Error:%08x\r\n"), sf.AddrPC.Offset, GetLastError()); - continue; + + StringCchCopy(pCallStack->szFileName, MAX_PATH, textconv_helper::A2T_("Unknown file")); + pCallStack->uFileNum = -1; } //这里为了将获取函数信息失败的情况与正常的情况一起输出,防止用户在查看时出现误解 From b8fa9af0e8480a4041d6e2ac65081c4dc32254bd Mon Sep 17 00:00:00 2001 From: Anna Date: Wed, 11 Oct 2023 16:15:39 +0200 Subject: [PATCH 06/18] Update OrcaSlicer_nl.po (#2387) Did what I could for now! --- localization/i18n/nl/OrcaSlicer_nl.po | 284 ++++++++++++++------------ 1 file changed, 148 insertions(+), 136 deletions(-) diff --git a/localization/i18n/nl/OrcaSlicer_nl.po b/localization/i18n/nl/OrcaSlicer_nl.po index 30e0d2d1351..9669724c7f8 100644 --- a/localization/i18n/nl/OrcaSlicer_nl.po +++ b/localization/i18n/nl/OrcaSlicer_nl.po @@ -11,7 +11,7 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n==1) ? 0 : 1;\n" msgid "Supports Painting" -msgstr "Onderteuning (Support) tekenen" +msgstr "Ondersteuning (Support) tekenen" msgid "Alt + Mouse wheel" msgstr "Alt + muiswiel" @@ -20,7 +20,7 @@ msgid "Section view" msgstr "Doorsnede" msgid "Reset direction" -msgstr "Richting resetten" +msgstr "Richting terugzetten" msgid "Ctrl + Mouse wheel" msgstr "Ctrl + muiswiel" @@ -32,13 +32,13 @@ msgid "Left mouse button" msgstr "Linker muisknop" msgid "Enforce supports" -msgstr "Support afdwingen" +msgstr "Ondersteuning afdwingen" msgid "Right mouse button" msgstr "Rechter muisknop" msgid "Block supports" -msgstr "Support blokkeren" +msgstr "Ondersteuning blokkeren" msgid "Shift + Left mouse button" msgstr "Shift + linker muisknop" @@ -53,16 +53,16 @@ msgid "Highlight overhang areas" msgstr "Overhangende gebieden markeren" msgid "Gap fill" -msgstr "Gat vullen" +msgstr "Gatvulling" msgid "Perform" msgstr "Uitvoeren" msgid "Gap area" -msgstr "Gap gebied" +msgstr "Gat gebied" msgid "Tool type" -msgstr "Gereedschap type" +msgstr "Hulpmiddel type" msgid "Smart fill angle" msgstr "Slim vullen hoek" @@ -71,7 +71,7 @@ msgid "On overhangs only" msgstr "Alleen op overhangen" msgid "Auto support threshold angle: " -msgstr "Maximale hoek automatische support: " +msgstr "Maximale hoek automatische ondersteuning: " msgid "Circle" msgstr "Cirkel" @@ -93,13 +93,13 @@ msgid "Highlight faces according to overhang angle." msgstr "Gebieden markeren op basis van overhangende hoek." msgid "No auto support" -msgstr "Geen automatisch support" +msgstr "Geen automatische ondersteuning" msgid "Support Generated" -msgstr "Support gegenereerd" +msgstr "Ondersteuning gegenereerd" msgid "Lay on face" -msgstr "Deze zijde op de printplaat plaatsen" +msgstr "Op deze zijde neerleggen." #, boost-format msgid "" @@ -107,7 +107,7 @@ msgid "" "the first %1% filaments will be available in painting tool." msgstr "" "Het aantal filamenten overschrijdt het maximale aantal dat het " -"tekengereedschap ondersteunt. alleen de eerste %1% filamenten zijn " +"tekengereedschap ondersteunt. Alleen de eerste %1% filamenten zijn " "beschikbaar in de tekentool." msgid "Color Painting" @@ -150,7 +150,7 @@ msgid "Ctrl + Shift + Enter" msgstr "Ctrl + Shift + Enter" msgid "Toggle Wireframe" -msgstr "Schakel Wireframe in of uit" +msgstr "Schakel draadmodel in of uit" msgid "Shortcut Key " msgstr "Sneltoest " @@ -162,20 +162,20 @@ msgid "Height Range" msgstr "Hoogtebereik" msgid "Remove painted color" -msgstr "Getekende kleur verwijderen" +msgstr "Geschilderd kleur verwijderen" #, boost-format msgid "Painted using: Filament %1%" -msgstr "Getekend met filament %1%" +msgstr "Geschilderd met filament %1%" msgid "Move" -msgstr "Verplaatsen" +msgstr "Verplaats" msgid "Rotate" -msgstr "Roteren" +msgstr "Draai" msgid "Optimize orientation" -msgstr "Orientatie optimaliseren" +msgstr "Oriëntatie optimaliseren" msgid "Apply" msgstr "Toepassen" @@ -184,10 +184,10 @@ msgid "Scale" msgstr "Schalen" msgid "Error: Please close all toolbar menus first" -msgstr "Fout: sluit eerst alle openstaande gereedschap menu's" +msgstr "Fout: sluit eerst alle openstaande hulpmiddelmenu's" msgid "Tool-Lay on Face" -msgstr "Gereedschap op zijde plaatsen" +msgstr "Hulpmiddel op zijde plaatsen" msgid "in" msgstr "in" @@ -232,7 +232,7 @@ msgid "Reset Rotation" msgstr "Rotatie herstellen" msgid "World coordinates" -msgstr "Wereld coördinaten" +msgstr "Wereldcoördinaten" msgid "°" msgstr "°" @@ -247,37 +247,37 @@ msgid "uniform scale" msgstr "Uniform schalen" msgid "Left click" -msgstr "Left click" +msgstr "Linker muisklik" msgid "Add connector" -msgstr "Add connector" +msgstr "Verbinding toevoegen" msgid "Right click" -msgstr "Right click" +msgstr "Rechter muisklik" msgid "Remove connector" -msgstr "Remove connector" +msgstr "Verbinding verwijderen" msgid "Drag" -msgstr "Drag" +msgstr "Sleep" msgid "Move connector" -msgstr "Move connector" +msgstr "Verbinding verplaatsen" msgid "Add connector to selection" -msgstr "Add connector to selection" +msgstr "Verbinding toevoegen aan selectie" msgid "Remove connector from selection" -msgstr "Remove connector from selection" +msgstr "Verbinding verwijderen uit selectie" msgid "Select all connectors" -msgstr "Select all connectors" +msgstr "Selecteer alle verbindingen" msgid "Cut" msgstr "Knippen" msgid "Connector" -msgstr "Connector" +msgstr "Verbinding" msgid "Movement:" msgstr "Beweging:" @@ -289,28 +289,28 @@ msgid "Height" msgstr "Hoogte" msgid "Edit connectors" -msgstr "Edit connectors" +msgstr "Verbindingen bewerken" msgid "Add connectors" -msgstr "Add connectors" +msgstr "Verbindingen toevoegen" msgid "Upper part" -msgstr "Upper part" +msgstr "Bovenste deel" msgid "Lower part" -msgstr "Lower part" +msgstr "Onderste deel" msgid "Keep" -msgstr "Keep" +msgstr "Behouden" msgid "Place on cut" -msgstr "Place on cut" +msgstr "Op kniplijn plaatsen" msgid "Flip" -msgstr "Flip" +msgstr "Omdraaien" msgid "After cut" -msgstr "After cut" +msgstr "Na knippen" msgid "Cut to parts" msgstr "In delen knippen" @@ -325,7 +325,7 @@ msgid "Reset" msgstr "Terugzetten" msgid "Connectors" -msgstr "Connectors" +msgstr "Verbindingen" msgid "Type" msgstr "Type" @@ -337,25 +337,25 @@ msgid "Shape" msgstr "Vorm" msgid "Depth ratio" -msgstr "Depth ratio" +msgstr "Diepteratio" msgid "Remove connectors" -msgstr "Remove connectors" +msgstr "Verbindingen verwijderen" msgid "Prizm" -msgstr "Prizm" +msgstr "Prisma" msgid "Frustum" msgstr "Frustum" msgid "Square" -msgstr "Square" +msgstr "Vierkant" msgid "Hexagon" -msgstr "Hexagon" +msgstr "Zeskant" msgid "Confirm connectors" -msgstr "Confirm connectors" +msgstr "Verbindingen bevestigen" msgid "Cancel" msgstr "Annuleren" @@ -364,41 +364,42 @@ msgid "Warning" msgstr "Waarschuwing" msgid "Invalid connectors detected" -msgstr "Invalid connectors detected" +msgstr "Onjuiste verbindingen gevonden" msgid "connector is out of cut contour" -msgstr "connector is out of cut contour" +msgstr "Verbinding ligt buiten knipcontour" msgid "connectors are out of cut contour" -msgstr "connectors are out of cut contour" +msgstr "Verbindingen liggen buiten knipcontour" msgid "connector is out of object" -msgstr "connector is out of object" +msgstr "Verbinding ligt buiten object" +# Source and destination string both English, but different. Please clarify! msgid "connectors is out of object" msgstr "Connectors must be on object surface." msgid "Some connectors are overlapped" -msgstr "Some connectors are overlapped" +msgstr "Sommige verbindingen overlappen" msgid "" "Invalid state. \n" "No one part is selected for keep after cut" msgstr "" -"Invalid state. \n" -"No one part is selected to keep after cut" +"Foutieve staat. \n" +"Geen onderdelen geselecteerd om te behouden na knippen" msgid "Plug" msgstr "Plug" msgid "Dowel" -msgstr "Dowel" +msgstr "Deuvel" msgid "Tolerance" -msgstr "Tolerance" +msgstr "Speling" msgid "Mesh name" -msgstr "Constructie name" +msgstr "Meshnaam" msgid "Detail level" msgstr "Detailniveau" @@ -422,7 +423,7 @@ msgstr "Vereenvoudigen" msgid "Simplification is currently only allowed when a single part is selected" msgstr "" -"Vereenvoudiging is momenteel alleen toegestaan wanneer een enkel onderdeel " +"Vereenvoudiging is momenteel alleen toegestaan wanneer één enkel onderdeel " "is geselecteerd" msgid "Error" @@ -445,7 +446,7 @@ msgstr "Extra laag" #, c-format, boost-format msgid "%d triangles" -msgstr "%d -driehoeken" +msgstr "%d driehoeken" msgid "Show wireframe" msgstr "Draadmodel tonen" @@ -455,7 +456,7 @@ msgid "%1%" msgstr "%1%" msgid "Can't apply when proccess preview." -msgstr "Toepassen is niet mogelijk bij een voorvertoning." +msgstr "Kan niet toepassen bij een voorvertoning." msgid "Operation already cancelling. Please wait few seconds." msgstr "De toepassing wordt al geannuleerd. Wacht even alstublieft." @@ -477,18 +478,19 @@ msgstr "Naad versterken" msgid "Block seam" msgstr "Bloknaad" +# msgstr "Blokkeer naad" # in case of "to block" msgid "Seam painting" msgstr "Naad schilderen" msgid "Remove selection" -msgstr "Verwijder selectie" +msgstr "Selectie verwijderen" msgid "Shift + Mouse move up or dowm" -msgstr "Shift + Mouse move up or dowm" +msgstr "Shift + Muis op of neer" msgid "Rotate text" -msgstr "Rotate text" +msgstr "Draai tekst" msgid "Text shape" msgstr "Tekstvorm" @@ -502,14 +504,15 @@ msgstr "Dikte" msgid "Input text" msgstr "Tekst invoeren" +# Source and destination string both English but don't match! msgid "Embeded" msgstr "Embedded" msgid "Text Gap" -msgstr "Text Gap" +msgstr "Tekstruimte" msgid "Angle" -msgstr "Angle" +msgstr "Hoek" msgid "" "Embeded\n" @@ -517,10 +520,10 @@ msgid "" msgstr "Embedded depth" msgid "Surface" -msgstr "Surface" +msgstr "Oppervlak" msgid "Horizontal text" -msgstr "Horizontal text" +msgstr "Horizontale tekst" msgid "Ctrl+" msgstr "Ctrl+" @@ -533,10 +536,10 @@ msgstr "Niet gedefinieerd" #, boost-format msgid "%1% was replaced with %2%" -msgstr "%1% is vervangen door %2%" +msgstr "%1% werd vervangen door %2%" msgid "The configuration may be generated by a newer version of OrcaSlicer." -msgstr "" +msgstr "De configuratie was mogelijks met een nieuwere versie Orcaslicer gemaakt." msgid "Some values have been replaced. Please check them:" msgstr "Sommige waarden zijn aangepast. Controleer deze alstublieft:" @@ -552,13 +555,13 @@ msgstr "Machine" msgid "Configuration package was loaded, but some values were not recognized." msgstr "" -"Het onfiguratiepakket is geladen, maar sommige waarden zijn niet herkend." +"Het onfiguratiepakket werd geladen, maar sommige waarden werden niet herkend." #, boost-format msgid "" "Configuration file \"%1%\" was loaded, but some values were not recognized." msgstr "" -"Het configuratiebestand “%1%” is geladen, maar sommige waarden zijn niet " +"Configuratiebestand “%1%” werd geladen, maar sommige waarden werden niet " "herkend." msgid "V" @@ -568,6 +571,8 @@ 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 "" +"OrcaSlicer zal sluiten, omdat het geen geheugen meer heeft. Dit kan een bug zijn. " +"Ons team een rapport schrijven over deze fout wordt erg gewaardeerd." msgid "Fatal error" msgstr "Fatale fout" @@ -576,19 +581,21 @@ msgid "" "OrcaSlicer will terminate because of a localization error. It will be " "appreciated if you report the specific scenario this issue happened." msgstr "" +"OrcaSlicer zal sluiten door een vertalingsfout. Ons team een rapport " +"schrijven over de situatie waar dit zich voor deed wordt erg gewaardeerd." msgid "Critical error" -msgstr "Kritische fout" +msgstr "Kritieke fout" #, boost-format msgid "OrcaSlicer got an unhandled exception: %1%" -msgstr "" +msgstr "OrcaSlicer kreeg een onbehandelde uitzondering: %1%" msgid "Downloading Bambu Network Plug-in" msgstr "Bambu Netwerk Plug-in downloaden" msgid "Login information expired. Please login again." -msgstr "Uw inlog is verlopen. Log alstublieft opnieuw in." +msgstr "Uw login informatie is verlopen. Log alstublieft opnieuw in." msgid "Incorrect password" msgstr "Onjuist wachtwoord" @@ -602,14 +609,19 @@ msgid "" "features.\n" "Click Yes to install it now." msgstr "" +"OrcaSlicer heeft het MicroSoft WebView2 Runtime nodig om bepaalde " +"functies in werking te stellen.\n" +"Klik Ja om het nu te installeren." msgid "WebView2 Runtime" -msgstr "" +msgstr "WebView2 Runtime" msgid "" "OrcaSlicer configuration file may be corrupted and is not abled to be parsed." "Please delete the file and try again." msgstr "" +"OrcaSlicer configuratiebestand is mogelijks corrupt, en kan niet verwerkt worden." +"Verwijder het configuratiebestand en probeer het opnieuw." #, c-format, boost-format msgid "" @@ -649,16 +661,16 @@ msgid "Loading a mode view" msgstr "Een modusweergave laden" msgid "Choose one file (3mf):" -msgstr "Kies een bestand (3mf):" +msgstr "Kies één bestand (3mf):" msgid "Choose one or more files (3mf/step/stl/svg/obj/amf/usd*/abc/ply):" -msgstr "" +msgstr "Kies één of meer bestanden (3mf/step/stl/svg/obj/amf/usd*/abc/ply):" msgid "Choose one or more files (3mf/step/stl/svg/obj/amf):" -msgstr "Kies een of meer bestanden (3mf/step/stl/svg/obj/amf):" +msgstr "Kies één of meer bestanden (3mf/step/stl/svg/obj/amf):" msgid "Choose one file (gcode/3mf):" -msgstr "" +msgstr "Kies één bestand (gcode/3mf):" msgid "Some presets are modified." msgstr "Sommige voorinstellingen zijn aangepast." @@ -720,7 +732,7 @@ msgid "Select a G-code file:" msgstr "Selecteer een G-code bestand:" msgid "Import File" -msgstr "Import File" +msgstr "Importeer bestand" msgid "Delete" msgstr "Verwijderen" @@ -729,7 +741,7 @@ msgid "Choose files" msgstr "Kies bestanden" msgid "New Folder" -msgstr "New Folder" +msgstr "Nieuwe map" msgid "Open" msgstr "Open" @@ -742,22 +754,22 @@ msgstr "Initialisatie van Orca Slicer GUI is mislukt" #, boost-format msgid "Fatal error, exception catched: %1%" -msgstr "Fatale fout, uitzondering: %1%" +msgstr "Fatale fout, uitzondering tegengehouden: %1%" msgid "Quality" msgstr "Kwaliteit" msgid "Shell" -msgstr "Schaal" +msgstr "Buitenlaag" msgid "Infill" msgstr "Vulling" msgid "Support" -msgstr "Support" +msgstr "Ondersteuning" msgid "Flush options" -msgstr "Flush-opties" +msgstr "Uitspoel-opties" msgid "Speed" msgstr "Snelheid" @@ -766,28 +778,28 @@ msgid "Strength" msgstr "Sterkte" msgid "Top Solid Layers" -msgstr "Aantal solide bovenste lagen" +msgstr "Aantal solide bovenste lagen" msgid "Top Minimum Shell Thickness" -msgstr "Minimale dikte van de toplaag" +msgstr "Minimale dikte van de bovenste laag" msgid "Bottom Solid Layers" -msgstr "Aantal gesloten bodem lagen" +msgstr "Aantal gesloten bodemlagen" msgid "Bottom Minimum Shell Thickness" -msgstr "Minimale bodem dikte" +msgstr "Minimale bodemdikte" msgid "Ironing" msgstr "Strijken" msgid "Fuzzy Skin" -msgstr "Fuzzy skin" +msgstr "Vage buitenkant" msgid "Extruders" msgstr "Extruders" msgid "Extrusion Width" -msgstr "Extrusie breedte" +msgstr "Extrusiebreedte" msgid "Wipe options" msgstr "Veeg opties" @@ -808,10 +820,10 @@ msgid "Add modifier" msgstr "Aanpasser toevoegen" msgid "Add support blocker" -msgstr "Support blokkering toevoegen" +msgstr "Ondersteuningsblokkade toevoegen" msgid "Add support enforcer" -msgstr "Support toevoegen" +msgstr "Ondersteuning toevoegen" msgid "Select settings" msgstr "Selecteer instellingen" @@ -829,22 +841,22 @@ msgid "Delete the selected object" msgstr "Verwijder het geselecteerde object" msgid "Edit Text" -msgstr "Edit Text" +msgstr "Pas tekst aan" msgid "Load..." msgstr "Laden..." msgid "Orca Cube" -msgstr "" +msgstr "Orca-kubus" msgid "3DBenchy" -msgstr "" +msgstr "3DBenchy" msgid "Autodesk FDM Test" -msgstr "" +msgstr "Autodesk FDM Test" msgid "Voron Cube" -msgstr "" +msgstr "Voron-kubus" msgid "Cube" msgstr "Kubus" @@ -856,7 +868,7 @@ msgid "Cone" msgstr "Kegel" msgid "Height range Modifier" -msgstr "Height Range Modifier" +msgstr "Hoogtebereikaanpasser" msgid "Add settings" msgstr "Instellingen toevoegen" @@ -871,10 +883,10 @@ msgid "Set as individual objects" msgstr "Instellen als individuele objecten" msgid "Fill bed with copies" -msgstr "Fill bed with copies" +msgstr "Vul bed met kopieën" msgid "Fill the remaining area of bed with copies of the selected object" -msgstr "Fill the remaining area of bed with copies of the selected object" +msgstr "Vul de overige ruimte met kopieën van het geselecteerde object" msgid "Printable" msgstr "Afdrukbaar" @@ -883,7 +895,7 @@ msgid "Fix model" msgstr "Repareer model" msgid "Export as STL" -msgstr "Exporteer als STL bestand" +msgstr "Exporteer als STL-bestand" msgid "Reload from disk" msgstr "Opnieuw laden vanaf schijf" @@ -914,34 +926,34 @@ msgid "active" msgstr "Actief" msgid "Scale to build volume" -msgstr "Schaal aanpassen aan printbed formaat" +msgstr "Schalen naar bruikbaar volume" msgid "Scale an object to fit the build volume" -msgstr "Object schalen zodat het op het prinbed past" +msgstr "Object schalen zodat het in het bruikbaar volume past" msgid "Flush Options" -msgstr "Flush-opties" +msgstr "Uitspoel-opties" msgid "Flush into objects' infill" -msgstr "Flush in de opvulling van objecten" +msgstr "Uitspoelen in de opvulling van objecten" msgid "Flush into this object" -msgstr "Flush in dit object" +msgstr "Uitspoelen in dit object" msgid "Flush into objects' support" -msgstr "Flush in de support van objecten" +msgstr "Uitspoelen in de ondersteuning van objecten" msgid "Edit in Parameter Table" msgstr "Bewerken in de parametertabel" msgid "Convert from inch" -msgstr "Converenten vanuit inch" +msgstr "Omzetten vanuit inch" msgid "Restore to inch" msgstr "Terugzetten naar inch" msgid "Convert from meter" -msgstr "Converteren vanuit meter" +msgstr "Omzetten vanuit meter" msgid "Restore to meter" msgstr "Terugzetten naar meter" @@ -958,10 +970,10 @@ msgstr "" "Monteer de geselecteerde objecten tot een object bestaande uit 1 onderdeel" msgid "Mesh boolean" -msgstr "" +msgstr "Mesh booleaan" msgid "Mesh boolean operations including union and subtraction" -msgstr "" +msgstr "Booleane mesh-operaties inclusief samenvoegen en aftrekken" msgid "Along X axis" msgstr "Langs de X as" @@ -988,7 +1000,7 @@ msgid "Mirror object" msgstr "Spiegel object" msgid "Invalidate cut info" -msgstr "Invalidate cut info" +msgstr "Invalideer knipsnede-info" msgid "Add Primitive" msgstr "Primitief toevoegen" @@ -1052,7 +1064,7 @@ msgid "auto rotate current plate" msgstr "Huidig printbed automatisch roteren" msgid "Delete Plate" -msgstr "Delete Plate" +msgstr "Verwijder printbed" msgid "Remove the selected plate" msgstr "Verwijder het huidige printbed" @@ -1088,7 +1100,7 @@ msgid "Lock" msgstr "Vergrendelen" msgid "Edit Plate Name" -msgstr "" +msgstr "Pas printbed naam aan" msgid "Name" msgstr "Naam" @@ -1119,11 +1131,11 @@ msgstr[1] "%1$d non-manifold edges@%1$d non-manifold edges" msgid "Right click the icon to fix model object" msgstr "" -"Klik met de rechtermuisknop op het pictogram om het modelobject te repareren" +"Klik met de rechter muisknop op het pictogram om het modelobject te repareren" msgid "Right button click the icon to drop the object settings" msgstr "" -"Klik met de rechtermuisknop op het pictogram om de objectinstellingen te " +"Klik met de rechter muisknop op het pictogram om de objectinstellingen te " "verwijderen" msgid "Click the icon to reset all settings of the object" @@ -1131,7 +1143,7 @@ msgstr "Klik op het icoon om alle instellingen van het object terug te zetten" msgid "Right button click the icon to drop the object printable property" msgstr "" -"Klik met de rechtermuisknop op het pictogram om de printbare eigenschap van " +"Klik met de rechter muisknop op het pictogram om de printbare eigenschap van " "het object te verwijderen" msgid "Click the icon to toggle printable property of the object" @@ -1145,7 +1157,7 @@ msgid "Click the icon to edit color painting of the object" msgstr "Klik op het pictogram om de kleur van het object te bewerken" msgid "Click the icon to shift this object to the bed" -msgstr "Click the icon to shift this object to the bed" +msgstr "Klik op het pictogram om dit object te verschuiven op het printbed" msgid "Loading file" msgstr "Bestand laden" @@ -1154,7 +1166,7 @@ msgid "Error!" msgstr "Fout!" msgid "Failed to get the model data in the current file." -msgstr "" +msgstr "Kon de modelinformatie niet laden uit het huidige bestand." msgid "Generic" msgstr "Algemeen" @@ -1175,20 +1187,20 @@ msgstr "" "geselecteerde objecten te bewerken." msgid "Delete connector from object which is a part of cut" -msgstr "Delete connector from object which is a part of cut" +msgstr "Verwijder verbinding van object dat deel is van een knipbewerking" msgid "Delete solid part from object which is a part of cut" -msgstr "Delete solid part from object which is a part of cut" +msgstr "Verwijder vast onderdeel van object dat deel is van een knipbewerking" msgid "Delete negative volume from object which is a part of cut" -msgstr "Delete negative volume from object which is a part of cut" +msgstr "Verwijder negatief volume van object dat deel is van een knipbewerking" msgid "" "To save cut correspondence you can delete all connectors from all related " "objects." msgstr "" -"To save cut correspondence you can delete all connectors from all related " -"objects." +"Om de knipovereenkomst op te slaan kan je alle verbindingen verwijderen uit " +"gerelateerde objecten." msgid "" "This action will break a cut correspondence.\n" @@ -1204,7 +1216,7 @@ msgstr "" "cut information first." msgid "Delete all connectors" -msgstr "Delete all connectors" +msgstr "Verwijder alle vberbindingen" msgid "Deleting the last solid part is not allowed." msgstr "Het is niet toegestaand om het laaste vaste deel te verwijderen." @@ -1221,31 +1233,31 @@ msgid "Cut Connectors information" msgstr "Cut Connectors information" msgid "Object manipulation" -msgstr "Object manipulation" +msgstr "Objectmanipulatie" msgid "Group manipulation" -msgstr "Group manipulation" +msgstr "Groupsmanipulatie" msgid "Object Settings to modify" -msgstr "Object Settings to Modify" +msgstr "Voorwerpopties om aan te passen" msgid "Part Settings to modify" -msgstr "Part Settings to Modify" +msgstr "Onderdeelopties om aan te passen" msgid "Layer range Settings to modify" -msgstr "Layer Range Settings to Modify" +msgstr "lagenreeksopties om aan te passen" msgid "Part manipulation" -msgstr "Part manipulation" +msgstr "Onderdeelmanipulatie" msgid "Instance manipulation" -msgstr "Instance manipulation" +msgstr "Instantiemanipulatie" msgid "Height ranges" -msgstr "Height ranges" +msgstr "Hoogtebereiken" msgid "Settings for height range" -msgstr "Settings for height range" +msgstr "Instellingen voor hoogtebereik" msgid "Object" msgstr "Voorwerp" @@ -1283,10 +1295,10 @@ msgid "Modifier" msgstr "Aanpasser" msgid "Support Blocker" -msgstr "Support blokkade" +msgstr "Ondersteuningsblokkade" msgid "Support Enforcer" -msgstr "Support handhaven" +msgstr "Ondersteuning handhaven" msgid "Type:" msgstr "Type:" From 103aac47791b967a9d1adce606a755ea82328497 Mon Sep 17 00:00:00 2001 From: Hotsolidinfill <138652683+Hotsolidinfill@users.noreply.github.com> Date: Wed, 11 Oct 2023 23:18:39 +0900 Subject: [PATCH 07/18] update korean (#2368) --- localization/i18n/ko/OrcaSlicer_ko.po | 1994 +++++++++++++------------ 1 file changed, 1001 insertions(+), 993 deletions(-) diff --git a/localization/i18n/ko/OrcaSlicer_ko.po b/localization/i18n/ko/OrcaSlicer_ko.po index 08e272ec981..41ecfd19047 100644 --- a/localization/i18n/ko/OrcaSlicer_ko.po +++ b/localization/i18n/ko/OrcaSlicer_ko.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-30 10:27+0800\n" -"PO-Revision-Date: 2023-10-08 20:22+0900\n" +"PO-Revision-Date: 2023-10-09 12:04+0900\n" "Last-Translator: Hotsolidinfill, crwusiz \n" "Language-Team: \n" "Language: ko_KR\n" @@ -19,7 +19,7 @@ msgstr "" "X-Generator: Poedit 3.4\n" msgid "Supports Painting" -msgstr "서포트 칠하기" +msgstr "지지대 칠하기" msgid "Alt + Mouse wheel" msgstr "Alt + 마우스 휠" @@ -40,13 +40,13 @@ msgid "Left mouse button" msgstr "마우스 왼쪽 버튼" msgid "Enforce supports" -msgstr "서포트 강제" +msgstr "지지대 강제" msgid "Right mouse button" msgstr "마우스 오른쪽 버튼" msgid "Block supports" -msgstr "서포트 차단" +msgstr "지지대 차단" msgid "Shift + Left mouse button" msgstr "Shift + 마우스 왼쪽 버튼" @@ -58,10 +58,10 @@ msgid "Erase all painting" msgstr "모든 페인팅 삭제" msgid "Highlight overhang areas" -msgstr "오버행 영역 강조" +msgstr "돌출부 영역 강조" msgid "Gap fill" -msgstr "갭 내부채움" +msgstr "갭 채움" msgid "Perform" msgstr "수행" @@ -73,13 +73,13 @@ msgid "Tool type" msgstr "도구 유형" msgid "Smart fill angle" -msgstr "스마트 내부채움 각도" +msgstr "스마트 채움 각도" msgid "On overhangs only" -msgstr "오버행에만 칠하기" +msgstr "돌출부에만 칠하기" msgid "Auto support threshold angle: " -msgstr "자동 서포트 임계값 각도: " +msgstr "자동 지지대 임계값 각도: " msgid "Circle" msgstr "원" @@ -88,23 +88,23 @@ msgid "Sphere" msgstr "구" msgid "Fill" -msgstr "내부채움" +msgstr "채움" msgid "Gap Fill" -msgstr "갭 내부채움" +msgstr "갭 채움" #, boost-format msgid "Allows painting only on facets selected by: \"%1%\"" msgstr "\"%1%\"에서 선택한 영역에만 칠하기 허용" msgid "Highlight faces according to overhang angle." -msgstr "오버행 각도에 따라 면을 강조 표시합니다." +msgstr "돌출부 각도에 따라 면을 강조 표시합니다." msgid "No auto support" -msgstr "자동 서포트 비활성" +msgstr "자동 지지대 비활성" msgid "Support Generated" -msgstr "서포트 생성됨" +msgstr "지지대 생성됨" msgid "Lay on face" msgstr "바닥면 선택" @@ -114,8 +114,8 @@ msgid "" "Filament count exceeds the maximum number that painting tool supports. only " "the first %1% filaments will be available in painting tool." msgstr "" -"필라멘트수가 페인팅 도구가 지원하는 최대수를 초과합니다. 첫 번째 %1% 필라멘트만" -"페인팅 도구에서 사용할수 있습니다." +"필라멘트 수가 페인팅 도구가 지원하는 최대 수를 초과합니다. 첫 번째 %1% 필라멘" +"트만 페인팅 도구에서 사용할 수 있습니다." msgid "Color Painting" msgstr "색 칠하기" @@ -145,10 +145,10 @@ msgid "Brush" msgstr "붓" msgid "Smart fill" -msgstr "스마트 내부채움" +msgstr "스마트 채움" msgid "Bucket fill" -msgstr "버킷 내부채움" +msgstr "버킷 채움" msgid "Height range" msgstr "높이 범위" @@ -418,7 +418,7 @@ msgid "" "Processing model '%1%' with more than 1M triangles could be slow. It is " "highly recommended to simplify the model." msgstr "" -"1백만 개가 넘는 삼각형이 있는 모델 '%1%'의 처리 속도가 느릴수 있습니다. 모델" +"1백만 개가 넘는 삼각형이 있는 모델 '%1%'의 처리 속도가 느릴 수 있습니다. 모델" "을 단순화하는 것이 좋습니다." msgid "Simplify model" @@ -460,7 +460,7 @@ msgid "%1%" msgstr "%1%" msgid "Can't apply when proccess preview." -msgstr "미리 보기 진행 시 적용할수 없습니다." +msgstr "미리 보기 진행 시 적용할 수 없습니다." msgid "Operation already cancelling. Please wait few seconds." msgstr "작업이 이미 취소중입니다. 몇 초만 기다려 주십시오." @@ -543,7 +543,7 @@ msgid "%1% was replaced with %2%" msgstr "%1% 가 %2% 로 교체되었습니다" msgid "The configuration may be generated by a newer version of OrcaSlicer." -msgstr "최신 버전의 Orca Slicer에서 설정을 생성할수 있습니다." +msgstr "최신 버전의 OrcaSlicer에서 설정을 생성할 수 있습니다." msgid "Some values have been replaced. Please check them:" msgstr "일부 값이 변경되었습니다. 다음을 확인하십시오:" @@ -563,8 +563,7 @@ msgstr "구성 패키지가 로드되었지만, 일부 값이 인식되지 않 #, boost-format msgid "" "Configuration file \"%1%\" was loaded, but some values were not recognized." -msgstr "" -"구성 파일 \"%1%\"가 로드되었지만 일부 값이 인식되지 않았습니다." +msgstr "구성 파일 \"%1%\"이(가) 로드되었지만 일부 값이 인식되지 않았습니다." msgid "V" msgstr "V" @@ -573,7 +572,7 @@ 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가 종료됩니다. 버그일수 있습니다. 저희 팀에 문제" +"메모리 부족으로 OrcaSlicer가 종료됩니다. 버그일 수 있습니다. 저희 팀에 문제" "를 보고해 주시면 감사하겠습니다." msgid "Fatal error" @@ -611,7 +610,8 @@ msgid "" "features.\n" "Click Yes to install it now." msgstr "" -"Orca Slicer의 특정 기능이 작동하려면 Microsoft WebView2 Runtime이 필요합니다.\n" +"Orca Slicer의 특정 기능이 작동하려면 Microsoft WebView2 Runtime이 필요합니" +"다.\n" "지금 설치하려면 예를 클릭하세요." msgid "WebView2 Runtime" @@ -621,8 +621,8 @@ msgid "" "OrcaSlicer configuration file may be corrupted and is not abled to be parsed." "Please delete the file and try again." msgstr "" -"OrcaSlicer 구성 파일이 손상되어 구문 분석할수 없습니다. 파일을 삭제하고 다시 " -"시도하십시오." +"OrcaSlicer 구성 파일이 손상되어 구문 분석할 수 없습니다. 파일을 삭제하고 다" +"시 시도하십시오." #, c-format, boost-format msgid "" @@ -661,16 +661,16 @@ msgid "Loading a mode view" msgstr "모드 보기 로드 중" msgid "Choose one file (3mf):" -msgstr "하나 이상의 파일 선택 (3mf):" +msgstr "하나의 파일을 선택 (3mf):" 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)" +msgstr "하나 이상의 파일 선택 (3mf/step/stl/svg/obj/amf/usd*/abc/ply):" msgid "Choose one or more files (3mf/step/stl/svg/obj/amf):" msgstr "하나 이상의 파일 선택 (3mf/step/stl/svg/obj/amf):" msgid "Choose one file (gcode/3mf):" -msgstr "하나 이상의 파일 선택 (gcode/3mf):" +msgstr "하나의 파일 선택 (gcode/3mf):" msgid "Some presets are modified." msgstr "일부 사전 설정이 수정 되었습니다." @@ -680,7 +680,7 @@ msgid "" "changes as new presets." msgstr "" "수정된 사전 설정을 새 프로젝트에 유지하거나, 변경 내용을 삭제 또는 새 사전 설" -"정으로 저장할수 있습니다." +"정으로 저장할 수 있습니다." msgid "User logged out" msgstr "사용자가 로그아웃됨" @@ -704,7 +704,7 @@ msgid "Privacy Policy Update" msgstr "개인 정보 보호 정책 업데이트" msgid "Loading" -msgstr "로딩중" +msgstr "로드 중" msgid "Loading user preset" msgstr "사용자 사전 설정 로드 중" @@ -765,10 +765,10 @@ msgid "Shell" msgstr "쉘" msgid "Infill" -msgstr "내부채움" +msgstr "내부 채움" msgid "Support" -msgstr "서포트" +msgstr "지지대" msgid "Flush options" msgstr "버리기 옵션" @@ -795,7 +795,7 @@ msgid "Ironing" msgstr "다림질" msgid "Fuzzy Skin" -msgstr "흐린 스킨" +msgstr "흐트러진 스킨" msgid "Extruders" msgstr "압출기" @@ -822,10 +822,10 @@ msgid "Add modifier" msgstr "수정자 추가" msgid "Add support blocker" -msgstr "서포트 차단기 추가" +msgstr "지지대 차단기 추가" msgid "Add support enforcer" -msgstr "서포트 강제기 추가" +msgstr "지지대 강제기 추가" msgid "Select settings" msgstr "설정 선택" @@ -938,13 +938,13 @@ msgid "Flush Options" msgstr "버리기 옵션" msgid "Flush into objects' infill" -msgstr "개체의 내부채움에서 버리기" +msgstr "개체의 내부 채움에서 버리기" msgid "Flush into this object" msgstr "개체에서 버리기" msgid "Flush into objects' support" -msgstr "개체의 서포트에서 버리기" +msgstr "개체의 지지대에서 버리기" msgid "Edit in Parameter Table" msgstr "개체/부품 설정에서 편집" @@ -1043,31 +1043,31 @@ msgid "Select All" msgstr "모두 선택" msgid "select all objects on current plate" -msgstr "현재 베드의 모든 개체 선택" +msgstr "현재 플레이트의 모든 개체 선택" msgid "Delete All" msgstr "모두 삭제" msgid "delete all objects on current plate" -msgstr "현재 베드의 모든 개체 삭제" +msgstr "현재 플레이트의 모든 개체 삭제" msgid "Arrange" msgstr "정렬" msgid "arrange current plate" -msgstr "현재 베드 정렬" +msgstr "현재 플레이트 정렬" msgid "Auto Rotate" msgstr "자동 회전" msgid "auto rotate current plate" -msgstr "현재 베드 자동 정렬" +msgstr "현재 플레이트 자동 정렬" msgid "Delete Plate" -msgstr "베드 삭제" +msgstr "플레이트 삭제" msgid "Remove the selected plate" -msgstr "선택된 베드 삭제" +msgstr "선택된 플레이트 삭제" msgid "Clone" msgstr "복제" @@ -1100,7 +1100,7 @@ msgid "Lock" msgstr "잠금" msgid "Edit Plate Name" -msgstr "베드 이름 편집" +msgstr "플레이트 이름 편집" msgid "Name" msgstr "이름" @@ -1116,7 +1116,7 @@ msgstr[0] "%1$d 오류 수정됨" #, c-format, boost-format msgid "Error: %1$d non-manifold edge." msgid_plural "Error: %1$d non-manifold edges." -msgstr[0] "오류: %1$d 비다양체 가장자리." +msgstr[0] "오류: %1$d 비 다양체 가장자리." msgid "Remaining errors" msgstr "남은 오류" @@ -1142,7 +1142,7 @@ msgid "Click the icon to toggle printable property of the object" msgstr "아이콘을 쿨릭하여 개체의 출력 가능한 속성을 전환합니다" msgid "Click the icon to edit support painting of the object" -msgstr "아이콘을 클릭하여 개체의 서포트 칠하기를 편집합니다" +msgstr "아이콘을 클릭하여 개체의 지지대 칠하기를 편집합니다" msgid "Click the icon to edit color painting of the object" msgstr "아이콘을 클릭하여 개체의 색상 칠하기를 편집합니다" @@ -1171,8 +1171,7 @@ msgstr "개체별 설정 모드로 전환하여 수정자 설정을 편집합니 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 "잘라내기의 일부인 개체에서 커넥터 삭제" @@ -1187,7 +1186,7 @@ msgid "" "To save cut correspondence you can delete all connectors from all related " "objects." msgstr "" -"잘라내기 연결을 저장하기 위해 모든 관련 개체에서 모든 커넥터를 삭제할수 있습" +"잘라내기 연결을 저장하기 위해 모든 관련 개체에서 모든 커넥터를 삭제할 수 있습" "니다." msgid "" @@ -1198,18 +1197,19 @@ msgid "" "cut infornation first." msgstr "" "이 조치는 잘라내기 연결을 끊습니다.\n" -"그 이후에는 모델 일관성을 보장할수 없습니다.\n" +"그 이후에는 모델 일관성을 보장할 수 없습니다.\n" "\n" -"꽉찬 부품 또는 비우기 용량으로 조작하려면 먼저 잘라내기 정보를 무효화해야 합니다." +"꽉찬 부품 또는 비우기 부피로 조작하려면 먼저 잘라내기 정보를 무효화해야 합" +"니다." msgid "Delete all connectors" msgstr "모든 커넥터 삭제" msgid "Deleting the last solid part is not allowed." -msgstr "마지막 꽉찬 부품을 삭제할수 없습니다." +msgstr "마지막 꽉찬 부품을 삭제할 수 없습니다." msgid "The target object contains only one part and can not be splited." -msgstr "대상 개체는 한 부품만 포함하고 있어 분할할수 없습니다." +msgstr "대상 개체는 한 부품만 포함하고 있어 분할할 수 없습니다." msgid "Assembly" msgstr "조립" @@ -1277,10 +1277,10 @@ msgid "Modifier" msgstr "수정자" msgid "Support Blocker" -msgstr "서포트 차단기" +msgstr "지지대 차단기" msgid "Support Enforcer" -msgstr "서포트 강제기" +msgstr "지지대 강제기" msgid "Type:" msgstr "유형:" @@ -1327,7 +1327,7 @@ msgid "Invalid numeric." msgstr "잘못된 숫자입니다." msgid "one cell can only be copied to one or multiple cells in the same column" -msgstr "하나의 셀은 동일한 열에 있는 하나 이상의 셀에만 복사할수 있습니다" +msgstr "하나의 셀은 동일한 열에 있는 하나 이상의 셀에만 복사할 수 있습니다" msgid "multiple cells copy is not supported" msgstr "다중 셀 복사는 지원되지 않습니다" @@ -1345,10 +1345,10 @@ msgid "Wall loops" msgstr "벽 루프" msgid "Infill density(%)" -msgstr "내부채움 밀도(%)" +msgstr "내부 채움 밀도(%)" msgid "Auto Brim" -msgstr "자동 브림" +msgstr "자동 챙(브림)" msgid "Auto" msgstr "자동" @@ -1357,25 +1357,25 @@ msgid "Mouse ear" msgstr "생쥐 귀" msgid "Outer brim only" -msgstr "외부 브림만" +msgstr "외부 챙만" msgid "Inner brim only" -msgstr "내부 브림만" +msgstr "내부 챙만" msgid "Outer and inner brim" -msgstr "내부와 외부 브림" +msgstr "내부와 외부 챙" msgid "No-brim" -msgstr "브림 비활성화" +msgstr "챙 비활성화" msgid "Outer wall speed" msgstr "외벽 속도" msgid "Plate" -msgstr "베드" +msgstr "플레이트" msgid "Brim" -msgstr "브림" +msgstr "챙(브림)" msgid "Object/Part Setting" msgstr "개체/부품 설정" @@ -1549,7 +1549,7 @@ msgid "Cancel calibration" msgstr "교정 취소" msgid "Idling..." -msgstr "공회전 중..." +msgstr "대기 중..." msgid "Heat the nozzle" msgstr "노즐 가열" @@ -1573,7 +1573,7 @@ msgid "Confirm extruded" msgstr "압출 확인" msgid "Check filament location" -msgstr "필라멘트 위치확인" +msgstr "필라멘트 위치 확인" msgid "Grab new filament" msgstr "새 필라멘트 가져오기" @@ -1592,8 +1592,8 @@ msgid "" "All the selected objects are on the locked plate,\n" "We can not do auto-arrange on these objects." msgstr "" -"선택한 모든 물체는 잠긴 베드에 있습니다,\n" -"이러한 개체에 대해 자동 정렬을 수행할수 없습니다." +"선택한 모든 물체는 잠긴 플레이트에 있습니다,\n" +"이러한 개체에 대해 자동 정렬을 수행할 수 없습니다." msgid "No arrangable objects are selected." msgstr "정렬 가능한 개체를 선택하지 않았습니다." @@ -1602,16 +1602,15 @@ msgid "" "This plate is locked,\n" "We can not do auto-arrange on this plate." msgstr "" -"이 베드는 잠겨 있습니다,\n" -"이 베드에서 자동 정렬을 할수 없습니다." +"이 플레이트는 잠겨 있습니다,\n" +"이 플레이트에서 자동 정렬을 할 수 없습니다." msgid "Arranging..." msgstr "정렬 중..." msgid "" "Arrange failed. Found some exceptions when processing object geometries." -msgstr "" -"정렬에 실패했습니다. 개체 형상을 처리할 때 일부 예외를 발견했습니다." +msgstr "정렬에 실패했습니다. 개체 형상을 처리할 때 일부 예외를 발견했습니다." msgid "Arranging" msgstr "정렬 중" @@ -1634,22 +1633,22 @@ msgid "" "bed:\n" "%s" msgstr "" -"정렬이 단일 베드에 들어갈수 없는 다음 개체를 무시했습니다:\n" +"정렬이 단일 플레이트에 들어갈 수 없는 다음 개체를 무시했습니다:\n" "%s" msgid "" "All the selected objects are on the locked plate,\n" "We can not do auto-orient on these objects." msgstr "" -"선택한 모든 물체는 잠긴 베드에 있습니다,\n" -"이러한 개체에 대해 자동 방향 지정을 수행할수 없습니다." +"선택한 모든 물체는 잠긴 플레이트에 있습니다,\n" +"이러한 개체에 대해 자동 방향 지정을 수행할 수 없습니다." msgid "" "This plate is locked,\n" "We can not do auto-orient on this plate." msgstr "" -"이 베드는 잠겨 있습니다,\n" -"이 베드에서 자동 방향 지정을 할수 없습니다." +"이 플레이트는 잠겨 있습니다,\n" +"이 플레이트에서 자동 방향 지정을 할 수 없습니다." msgid "Orienting..." msgstr "방향 지정 중..." @@ -1667,7 +1666,7 @@ msgid "Bed filling done." msgstr "베드 채움 완료." msgid "Error! Unable to create thread!" -msgstr "오류! 스레드를 만들수 없습니다!" +msgstr "오류! 스레드를 만들 수 없습니다!" msgid "Exception" msgstr "예외" @@ -1695,7 +1694,7 @@ msgid "Cloud service connection failed. Please try again." msgstr "클라우드 서비스 연결에 실패했습니다. 다시 시도하십시오." msgid "Print file not found. please slice again." -msgstr "출력파일을 찾을수 없습니다. 다시 슬라이스하세요." +msgstr "출력파일을 찾을 수 없습니다. 다시 슬라이스하세요." msgid "" "The print file exceeds the maximum allowable size (1GB). Please simplify the " @@ -1712,8 +1711,7 @@ msgstr "Ftp에 파일을 업로드하지 못했습니다. 다시 시도해 주 msgid "" "Check the current status of the bambu server by clicking on the link above." -msgstr "" -"위의 링크를 클릭하여 Bambu Lab 서버의 현재 상태를 확인하십시오." +msgstr "위의 링크를 클릭하여 Bambu Lab 서버의 현재 상태를 확인하십시오." msgid "" "The size of the print file is too large. Please adjust the file size and try " @@ -1722,7 +1720,7 @@ msgstr "" "출력 파일의 크기가 너무 큽니다. 파일 크기를 조정한 후 다시 시도하십시오." msgid "Print file not found, Please slice it again and send it for printing." -msgstr "출력 파일을 찾을수 없습니다. 다시 슬라이스하여 출력전송하십시오." +msgstr "출력 파일을 찾을 수 없습니다. 다시 슬라이스하여 출력전송하십시오." msgid "" "Failed to upload print file to FTP. Please check the network status and try " @@ -1741,7 +1739,7 @@ msgid "Service Unavailable" msgstr "서비스 사용 불가" msgid "Unkown Error." -msgstr "알수없는 오류." +msgstr "알 수 없는 오류." msgid "Sending print configuration" msgstr "출력 구성 전송 중" @@ -1818,7 +1816,7 @@ msgstr "" "되었습니다." 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 "사전 설정을 변경하기 전에 개체 목록을 확인하십시오." @@ -1865,8 +1863,8 @@ msgid "" "the RepRap community" msgstr "" "Orca Slicer는 Prusa Research의 PrusaSlicer에서 나온 Bambulab의 BambuStudio를 " -"기반으로 합니다. PrusaSlicer는 Alessandro Ranellucci와 RepRap 커뮤니티의 " -"Slic3r에서 제작되었습니다." +"기반으로 합니다. PrusaSlicer는 Alessandro Ranellucci와 RepRap 커뮤니티의 " +"Slic3r에서 제작되었습니다" msgid "Libraries" msgstr "라이브러리" @@ -1876,7 +1874,7 @@ msgid "" "proprietary rights belong to their respective owners" msgstr "" "이 소프트웨어는 저작권 및 기타 소유권이 해당 소유자에게 속한 오픈 소스 구성 " -"요소를 사용합니다." +"요소를 사용합니다" #, c-format, boost-format msgid "About %s" @@ -1890,10 +1888,10 @@ msgstr "" "OrcaSlicer는 BambuStudio, PrusaSlicer 및 SuperSlicer를 기반으로 합니다." msgid "BambuStudio is originally based on PrusaSlicer by PrusaResearch." -msgstr "BambuStudio는 원래 PrusaResearch의 PrusaSlicer를 기반으로 합니다." +msgstr "BambuStudio는 PrusaResearch의 PrusaSlicer를 기반으로 합니다." msgid "PrusaSlicer is originally based on Slic3r by Alessandro Ranellucci." -msgstr "PrusaSlicer는 원래 Alessandro Ranellucci의 Slic3r을 기반으로 합니다." +msgstr "PrusaSlicer는 Alessandro Ranellucci의 Slic3r을 기반으로 합니다." msgid "" "Slic3r was created by Alessandro Ranellucci with the help of many other " @@ -1941,16 +1939,16 @@ msgid "Setting AMS slot information while printing is not supported" msgstr "출력 중에는 AMS 슬롯 정보 설정이 지원되지 않습니다" msgid "Factors of Flow Dynamics Calibration" -msgstr "동적 압출량 교정 계수" +msgstr "동적 유량 교정 계수" msgid "PA Profile" msgstr "PA 프로필" msgid "Factor K" -msgstr "K 계수" +msgstr "Factor K" msgid "Factor N" -msgstr "N 계수" +msgstr "Factor N" msgid "Setting Virtual slot information while printing is not supported" msgstr "출력 중에는 가상 슬롯 정보 설정이 지원되지 않습니다" @@ -1974,7 +1972,7 @@ msgid "Custom Color" msgstr "맞춤 색상" msgid "Dynamic flow calibration" -msgstr "동적 압출량 교정" +msgstr "동적 유량 교정" msgid "" "The nozzle temp and max volumetric speed will affect the calibration " @@ -1982,7 +1980,7 @@ msgid "" "auto-filled by selecting a filament preset." msgstr "" "노즐 온도와 최대 체적 속도는 교정 결과에 영향을 미칩니다. 실제 출력과 동일한 " -"값을 입력하십시오. 필라멘트 사전 설정을 선택하여 자동으로 입력할수 있습니다." +"값을 입력하십시오. 필라멘트 사전 설정을 선택하여 자동으로 입력할 수 있습니다." msgid "Nozzle Diameter" msgstr "노즐 직경" @@ -2040,10 +2038,10 @@ msgstr "교정 완료" #, c-format, boost-format msgid "%s does not support %s" -msgstr "%s는 %s를 지원하지 않습니다" +msgstr "%s은(는) %s을(를) 지원하지 않습니다" msgid "Dynamic flow Calibration" -msgstr "동적 압출량 교정" +msgstr "동적 유량 교정" msgid "Step" msgstr "단계" @@ -2053,8 +2051,7 @@ msgstr "AMS 슬롯" msgid "" "Note: Only the AMS slots loaded with the same material type can be selected." -msgstr "" -"참고: 동일한 재료 유형으로 장착된 AMS 슬롯만 선택할수 있습니다." +msgstr "참고: 동일한 재료 유형으로 장착된 AMS 슬롯만 선택할 수 있습니다." msgid "Enable AMS" msgstr "AMS 사용" @@ -2085,8 +2082,8 @@ 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 " @@ -2095,13 +2092,12 @@ msgid "" "accurately." msgstr "" "참고: 뚜껑이 열려 있거나 건조제 팩을 교체한 경우 수분을 흡수하는 데 몇 시간 " -"또는 하룻밤이 걸릴수 있습니다. 온도가 낮으면 흡수 속도도 느려집니다. 이 시간 " -"동안 표시기가 챔버를 정확하게 나타내지 못할수 있습니다." +"또는 하룻밤이 걸릴 수 있습니다. 온도가 낮으면 흡수 속도도 느려집니다. 이 시" +"간 동안 표시기가 챔버를 정확하게 나타내지 못할 수 있습니다." 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 "이 출력 작업에 사용된 필라멘트" @@ -2127,8 +2123,7 @@ msgstr "섀시 뒷면에 필라멘트를 장착하여 출력" msgid "" "When the current material run out, the printer will continue to print in the " "following order." -msgstr "" -"현재 재료가 소진되면 프린터는 다음 순서로 계속 출력합니다." +msgstr "현재 재료가 소진되면 프린터는 다음 순서로 계속 출력합니다." msgid "Group" msgstr "그룹" @@ -2139,7 +2134,7 @@ msgid "" "(Currently supporting automatic supply of consumables with the same brand, " "material type, and color)" msgstr "" -"현재 동일한 예비 소모품을 사용할수 없으며 자동 보충도 현재 불가능합니다.\n" +"현재 동일한 예비 소모품을 사용할 수 없으며 자동 보충도 현재 불가능합니다.\n" "(현재 동일한 브랜드, 재질, 색상의 소모품 자동공급 지원)" msgid "AMS Settings" @@ -2167,7 +2162,7 @@ msgid "" "information, leaving it blank for you to enter manually." msgstr "" "새 필라멘트를 삽입할 때 AMS는 정보를 자동으로 읽지 않고 사용자가 수동으로 입" -"력할수 있도록 비워 둡니다." +"력할 수 있도록 비워 둡니다." msgid "Power on update" msgstr "업데이트 전원 유지" @@ -2240,7 +2235,7 @@ msgid "" "printable boundary and causing equipment wear." msgstr "" ")을 클릭하여 툴헤드의 위치를 찾습니다. 이렇게 하면 장치가 출력 가능한 경계를 " -"벗어나 장치가 마모되는 것을 방지할수 있습니다." +"벗어나 장치가 마모되는 것을 방지할 수 있습니다." msgid "Go Home" msgstr "홈으로 이동" @@ -2249,7 +2244,7 @@ msgid "" "A error occurred. Maybe memory of system is not enough or it's a bug of the " "program" msgstr "" -"오류가 발생했습니다. 시스템 메모리가 부족하거나 프로그램의 버그일수 있습니다" +"오류가 발생했습니다. 시스템 메모리가 부족하거나 프로그램의 버그일 수 있습니다" msgid "Please save project and restart the program. " msgstr "프로젝트를 저장하고 프로그램을 다시 시작하십시오. " @@ -2282,7 +2277,7 @@ msgid "Stack overflow" msgstr "스택 오버플로" msgid "Unknown error when export G-code." -msgstr "G코드를 내보낼 때 알수 없는 오류가 발생했습니다." +msgstr "G코드를 내보낼 때 알 수 없는 오류가 발생했습니다." #, boost-format msgid "" @@ -2315,7 +2310,7 @@ msgid "Diameter" msgstr "직경" msgid "Size in X and Y of the rectangular plate." -msgstr "직사각형 베드의 X 및 Y 크기." +msgstr "직사각형 플레이트의 X 및 Y 크기." msgid "" "Distance of the 0,0 G-code coordinate from the front left corner of the " @@ -2349,7 +2344,7 @@ msgid "Remove" msgstr "제거" msgid "Not found:" -msgstr "찾을수 없음:" +msgstr "찾을 수 없음:" msgid "Model" msgstr "모델" @@ -2368,8 +2363,7 @@ msgstr "선택한 파일에 형상이 없습니다." msgid "" "The selected file contains several disjoint areas. This is not supported." -msgstr "" -"선택한 파일에 여러 개의 분리된 영역이 있습니다. 지원되지 않습니다." +msgstr "선택한 파일에 여러 개의 분리된 영역이 있습니다. 지원되지 않습니다." msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "베드 텍스쳐를 불러올 파일 선택(PNG/SVG):" @@ -2385,16 +2379,15 @@ msgid "" "Please make sure whether to use the temperature to print.\n" "\n" msgstr "" -"온도가 권장 범위를 벗어나면 노즐이 막힐수 있습니다.\n" -"출력시 어떤 온도를 사용할지 확인하십시오.\n" +"온도가 권장 범위를 벗어나면 노즐이 막힐 수 있습니다.\n" +"출력 시 어떤 온도를 사용할지 확인하십시오.\n" "\n" #, c-format, boost-format msgid "" "Recommended nozzle temperature of this filament type is [%d, %d] degree " "centigrade" -msgstr "" -"이 필라멘트 유형의 권장 노즐 온도는 [%d, %d]°C입니다" +msgstr "이 필라멘트 유형의 권장 노즐 온도는 [%d, %d]°C입니다" msgid "" "Too small max volumetric speed.\n" @@ -2409,7 +2402,7 @@ msgid "" "it may result in material softening and clogging.The maximum safe " "temperature for the material is %d" msgstr "" -"현재 챔버 온도가 재료의 안전 온도보다 높으므로 재료가 부드러워지고 막힐수 있" +"현재 챔버 온도가 재료의 안전 온도보다 높으므로 재료가 부드러워지고 막힐 수 있" "습니다. 재료의 최대 안전 온도는 %d입니다" msgid "" @@ -2466,11 +2459,11 @@ 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 구조의 기계는 타임랩스 비디오를 생성하지 않습니다." +msgstr " 그러나 I3 구조의 장치는 타임랩스 비디오를 생성하지 않습니다." msgid "" "Change these settings automatically? \n" @@ -2488,11 +2481,11 @@ msgid "" "YES - Keep Prime Tower\n" "NO - Keep Adaptive Layer Height and Independent Support Layer Height" msgstr "" -"적응형 레이어 높이 또는 독립적 서포트 레이어 높이가 켜져 있으면 프라임 타워" +"적응형 레이어 높이 또는 독립적 지지대 레이어 높이가 켜져 있으면 프라임 타워" "가 작동하지 않습니다.\n" "어떤 것을 유지하시겠습니까?\n" "예 - 프라임 타워 유지\n" -"아니요 - 적응형 레이어 높이 및 독립적 서포트 레이어 높이 유지" +"아니요 - 적응형 레이어 높이 및 독립적 지지대 레이어 높이 유지" msgid "" "Prime tower does not work when Adaptive Layer Height is on.\n" @@ -2511,14 +2504,14 @@ msgid "" "YES - Keep Prime Tower\n" "NO - Keep Independent Support Layer Height" msgstr "" -"독립적 서포트 레이어 높이가 켜져 있으면 프라임 타워가 작동하지 않습니다.\n" +"독립적 지지대 레이어 높이가 켜져 있으면 프라임 타워가 작동하지 않습니다.\n" "어떤 것을 유지하시겠습니까?\n" "예 - 프라임 타워 유지\n" -"아니요 - 독립적 서포트 레이어 높이 유지" +"아니요 - 독립적 지지대 레이어 높이 유지" #, boost-format msgid "%1% infill pattern doesn't support 100%% density." -msgstr "%1% 내부채움 패턴은 100%% 밀도를 지원하지 않습니다." +msgstr "%1% 내부 채움 패턴은 100%% 밀도를 지원하지 않습니다." msgid "" "Switch to rectilinear pattern?\n" @@ -2533,14 +2526,14 @@ msgid "" "While printing by Object, the extruder may collide skirt.\n" "Thus, reset the skirt layer to 1 to avoid that." msgstr "" -"개체별 출력시 압출기가 스커트와 충돌할수 있습니다.\n" +"개체별 출력시 압출기가 스커트와 충돌할 수 있습니다.\n" "스커트 레이어를 1로 재설정하여 이를 방지합니다." msgid "Auto bed leveling" msgstr "자동 베드 레벨링" msgid "Heatbed preheating" -msgstr "가열 베드 예열" +msgstr "고온 베드 예열" msgid "Sweeping XY mech mode" msgstr "스위핑 XY 기계 모드" @@ -2567,7 +2560,7 @@ msgid "Inspecting first layer" msgstr "첫 번째 레이어 검사 중" msgid "Identifying build plate type" -msgstr "베드 유형 식별 중" +msgstr "빌드 플레이트 유형 식별 중" msgid "Calibrating Micro Lidar" msgstr "마이크로 레이더 보정 중" @@ -2591,43 +2584,43 @@ msgid "Calibrating the micro lida" msgstr "마이크로 레이더 교정" msgid "Calibrating extrusion flow" -msgstr "압출 압출량 교정" +msgstr "압출 유량 교정" msgid "Paused due to nozzle temperature malfunction" msgstr "노즐 온도 오작동으로 일시 정지됨" msgid "Paused due to heat bed temperature malfunction" -msgstr "가열 베드 온도 오작동으로 일시 정지됨" +msgstr "히트 베드 온도 오작동으로 일시 정지됨" msgid "Filament unloading" -msgstr "필라멘트 언로딩" +msgstr "필라멘트 빼는 중" msgid "Skip step pause" -msgstr "단계 건너뛰기 일시중지" +msgstr "단계 일시정지 건너뛰기" msgid "Filament loading" -msgstr "필라멘트 로딩" +msgstr "필라멘트 넣는 중" msgid "Motor noise calibration" msgstr "모터 소음 교정" msgid "Paused due to AMS lost" -msgstr "AMS 손실로 인해 일시중지됨" +msgstr "AMS 정보 손실로 인해 일시중지됨" msgid "Paused due to low speed of the heat break fan" -msgstr "냉각팬 속도가 느려서 일시중지되었습니다" +msgstr "느린 방열팬 속도로 일시중지됨" msgid "Paused due to chamber temperature control error" -msgstr "챔버 온도 제어 오류로 인해 일시 중지되었습니다" +msgstr "챔버 온도 제어 오류로 인해 일시 중지됨" msgid "Cooling chamber" -msgstr "챔버 냉각" +msgstr "냉각 챔버" msgid "Paused by the Gcode inserted by user" -msgstr "사용자가 삽입한 G코드로 인해 일시중지되었습니다" +msgstr "사용자가 삽입한 G코드로 인해 일시중지됨" msgid "Motor noise showoff" -msgstr "모터 소음 과시" +msgstr "모터 소음 표시" msgid "MC" msgstr "MC" @@ -2642,7 +2635,7 @@ msgid "XCam" msgstr "XCam" msgid "Unknown" -msgstr "알수 없는" +msgstr "알 수 없는" msgid "Fatal" msgstr "치명적" @@ -2670,16 +2663,16 @@ msgid "" "45℃.In order to avoid extruder clogging,low temperature filament(PLA/PETG/" "TPU) is not allowed to be loaded." msgstr "" -"현재 챔버 온도 또는 목표 챔버 온도가 45℃를 초과합니다. Extruder 막힘을 방지하" -"기 위해 저온 필라멘트(PLA/PETG/TPU)를 로드할수 없습니다." +"현재 챔버 온도 또는 목표 챔버 온도가 45℃를 초과합니다. 압출기 막힘을 방지하" +"기 위해 저온 필라멘트(PLA/PETG/TPU)를 로드할 수 없습니다." msgid "" "Low temperature filament(PLA/PETG/TPU) is loaded in the extruder.In order to " "avoid extruder clogging,it is not allowed to set the chamber temperature " "above 45℃." msgstr "" -"압출기에는 저온 필라멘트(PLA/PETG/TPU)가 장착되어 있습니다. 압출기 막힘을 방" -"지하기 위해 챔버 온도를 45℃ 이상으로 설정할수 없습니다." +"압출기에 저온 필라멘트(PLA/PETG/TPU)가 장착되어 있습니다. 압출기 막힘을 방지" +"하기 위해 챔버 온도를 45℃ 이상으로 설정할 수 없습니다." msgid "" "When you set the chamber temperature below 40℃, the chamber temperature " @@ -2729,7 +2722,7 @@ msgstr "N/A" #, c-format, boost-format msgid "%s can't be percentage" -msgstr "%s는 백분율일수 없습니다" +msgstr "%s는 백분율일 수 없습니다" #, c-format, boost-format msgid "Value %s is out of range, continue?" @@ -2768,7 +2761,7 @@ msgid "Temperature" msgstr "온도" msgid "Flow" -msgstr "압출량" +msgstr "유량" msgid "Tool" msgstr "툴" @@ -2777,7 +2770,7 @@ msgid "Layer Time" msgstr "레이어 시간" msgid "Layer Time (log)" -msgstr "레이어 시간 로그" +msgstr "레이어 시간(log)" msgid "Height: " msgstr "높이: " @@ -2789,7 +2782,7 @@ msgid "Speed: " msgstr "속도: " msgid "Flow: " -msgstr "압출량: " +msgstr "유량: " msgid "Layer Time: " msgstr "레이어 시간: " @@ -2810,7 +2803,7 @@ msgid "Generating geometry index data" msgstr "기하학 색인 데이터 생성" msgid "Statistics of All Plates" -msgstr "모든 베드 통계" +msgstr "모든 플레이트 통계" msgid "Display" msgstr "표시" @@ -2864,7 +2857,7 @@ msgid "Temperature (°C)" msgstr "온도 (°C)" msgid "Volumetric flow rate (mm³/s)" -msgstr "체적 압출량 (mm³/s)" +msgstr "체적 유량 (mm³/s)" msgid "Used filament" msgstr "사용된 필라멘트" @@ -2876,10 +2869,10 @@ msgid "Seams" msgstr "솔기" msgid "Retract" -msgstr "리트렉션" +msgstr "퇴출" msgid "Unretract" -msgstr "리트렉션 취소" +msgstr "비퇴출(언리트렉트)" msgid "Filament Changes" msgstr "필라멘트 변경" @@ -3005,7 +2998,7 @@ msgid "Enable rotation" msgstr "회전 활성화" msgid "Optimize support interface area" -msgstr "서포트 접점 영역 최적화" +msgstr "지지대 접점 영역 최적화" msgid "Orient" msgstr "방향" @@ -3020,19 +3013,19 @@ msgid "Auto rotate for arrangement" msgstr "자동 회전 후 정렬" msgid "Allow multiple materials on same plate" -msgstr "동일한 베드에 여러 재료 허용" +msgstr "동일한 플레이트에 여러 재료 허용" msgid "Avoid extrusion calibration region" msgstr "압출 교정 영역을 피하십시오" msgid "Align to Y axis" -msgstr "Y축에 정렬" +msgstr "Y축으로 정렬" msgid "Add" msgstr "추가" msgid "Add plate" -msgstr "베드 추가" +msgstr "플레이트 추가" msgid "Auto orient" msgstr "자동 방향 지정" @@ -3041,7 +3034,7 @@ msgid "Arrange all objects" msgstr "모든 개체 정렬" msgid "Arrange objects on selected plates" -msgstr "선택한 베드의 개체 정렬" +msgstr "선택한 플레이트의 개체 정렬" msgid "Split to objects" msgstr "개체로 분할" @@ -3053,7 +3046,7 @@ msgid "Assembly View" msgstr "조립도" msgid "Select Plate" -msgstr "베드 선택" +msgstr "플레이트 선택" msgid "Assembly Return" msgstr "조립 되돌리기" @@ -3094,13 +3087,13 @@ msgstr "" "를 더 멀리 분리하십시오(%s <-> %s)." msgid "An object is layed over the boundary of plate." -msgstr "개체가 베드 경계 위에 놓여 있습니다." +msgstr "개체가 플레이트 경계 위에 놓여 있습니다." msgid "A G-code path goes beyond the max print height." msgstr "G코드 경로가 출력 최대 높이를 넘어갑니다." msgid "A G-code path goes beyond the boundary of plate." -msgstr "G코드 경로가 베드 경계를 넘어갑니다." +msgstr "G코드 경로가 플레이트 경계를 넘어갑니다." msgid "Only the object being edit is visible." msgstr "편집 중인 개체만 표시됩니다." @@ -3110,9 +3103,9 @@ msgid "" "Please solve the problem by moving it totally on or off the plate, and " "confirming that the height is within the build volume." msgstr "" -"개체가 베드 경계를 넘었거나 높이 제한을 초과했습니다.\n" -"베드 위 또는 밖으로 완전히 이동시키고 높이가 빌드 출력 가능 영역 내에 있는지 " -"확인하여 문제를 해결하십시오." +"개체가 플레이트 경계를 넘었거나 높이 제한을 초과했습니다.\n" +"플레이트 위 또는 밖으로 완전히 이동시키고 높이가 빌드 출력 가능 영역 내에 있" +"는지 확인하여 문제를 해결하십시오." msgid "Calibration step selection" msgstr "교정 단계 선택" @@ -3124,7 +3117,7 @@ msgid "Bed leveling" msgstr "베드 레벨링" msgid "Vibration compensation" -msgstr "진동 보상" +msgstr "진동 보정" msgid "Motor noise cancellation" msgstr "모터 소음 제거" @@ -3141,7 +3134,7 @@ msgstr "" "이를 통해 장치가 최적의 성능을 유지하도록 합니다." msgid "Calibration Flow" -msgstr "압출량 교정" +msgstr "유량 교정" msgid "Start Calibration" msgstr "교정 시작" @@ -3183,7 +3176,7 @@ msgid "" "You can find it in \"Settings > Network > Connection code\"\n" "on the printer, as shown in the figure:" msgstr "" -"\"설정 > 네트워크 > 연결코드\"에서 확인하실수 있습니다\n" +"\"설정 > 네트워크 > 연결코드\"에서 확인하실 수 있습니다\n" "또는 그림에 표시된 것처럼 프린터에 표시됩니다:" msgid "Invalid input." @@ -3226,22 +3219,22 @@ msgid "will be closed before creating a new model. Do you want to continue?" msgstr "새 모델을 생성하기 전에 닫힙니다. 계속하시겠습니까?" msgid "Slice plate" -msgstr "베드 슬라이스" +msgstr "슬라이스 플레이트" msgid "Print plate" -msgstr "베드 출력" +msgstr "플레이트 출력" msgid "Slice all" msgstr "모두 슬라이스" msgid "Export G-code file" -msgstr "G코드파일 내보내기" +msgstr "G코드 파일 내보내기" msgid "Send" msgstr "전송" msgid "Export plate sliced file" -msgstr "베드 슬라이스 파일 내보내기" +msgstr "플레이트 슬라이스 파일 내보내기" msgid "Export all sliced file" msgstr "모든 슬라이스 파일 내보내기" @@ -3382,13 +3375,13 @@ msgid "Export current sliced file" msgstr "현재 슬라이스 파일 내보내기" msgid "Export all plate sliced file" -msgstr "모든 베드의 슬라이스 파일 내보내기" +msgstr "모든 플레이트의 슬라이스 파일 내보내기" msgid "Export G-code" msgstr "G코드 내보내기" msgid "Export current plate as G-code" -msgstr "현재 베드를 G코드로 내보내기" +msgstr "현재 플레이트를 G코드로 내보내기" msgid "Export &Configs" msgstr "설정 &내보내기" @@ -3466,7 +3459,7 @@ msgid "Show object labels in 3D scene" msgstr "3D 화면에 개체 이름표 표시" msgid "Show &Overhang" -msgstr "오버행 보기" +msgstr "돌출부 &보기" msgid "Show object overhang highlight in 3D scene" msgstr "3D 장면에서 객체 오버행 하이라이트 표시" @@ -3487,28 +3480,28 @@ msgid "Pass 1" msgstr "1차 테스트" msgid "Flow rate test - Pass 1" -msgstr "압출량 1차 테스트" +msgstr "유량 테스트 - 1차" msgid "Pass 2" msgstr "2차 테스트" msgid "Flow rate test - Pass 2" -msgstr "압출량 2차 테스트" +msgstr "유량 테스트 - 2차" msgid "Flow rate" -msgstr "압출량" +msgstr "유량" msgid "Pressure advance" -msgstr "PA" +msgstr "프레셔 어드밴스" msgid "Retraction test" -msgstr "리트렉션 테스트" +msgstr "퇴출 테스트" msgid "Orca Tolerance Test" msgstr "Orca 공차 테스트" msgid "Max flowrate" -msgstr "최대 압출량" +msgstr "최대 유량" msgid "VFA" msgstr "VFA" @@ -3535,7 +3528,7 @@ msgid "Re&load from Disk" msgstr "디스크에서 다시&로드" msgid "Reload the plater from disk" -msgstr "디스크에서 베드 다시 로드" +msgstr "디스크에서 플레이트 다시 로드" msgid "Export &Toolpaths as OBJ" msgstr "툴 경로를 OBJ로 &내보내기" @@ -3609,7 +3602,7 @@ msgid "File is missing" msgstr "파일이 없습니다" msgid "The project is no longer available." -msgstr "프로젝트를 더 이상 사용할수 없습니다." +msgstr "프로젝트를 더 이상 사용할 수 없습니다." msgid "Filament Settings" msgstr "필라멘트 설정" @@ -3649,7 +3642,7 @@ msgid "Initialize failed (Not supported on the current printer version)!" msgstr "초기화 실패(현재 프린터 버전에서는 지원되지 않음)!" msgid "Initialize failed (Not accessible in LAN-only mode)!" -msgstr "초기화 실패 (LAN 전용 모드에서는 액세스할수 없음)!" +msgstr "초기화 실패 (LAN 전용 모드에서는 액세스할 수 없음)!" msgid "Initialize failed (Missing LAN ip of printer)!" msgstr "초기화 실패 (프린터의 LAN IP 누락)!" @@ -3662,7 +3655,7 @@ msgid "Initialize failed (%s)!" msgstr "(%s) 초기화 실패!" msgid "Network unreachable" -msgstr "네트워크에 연결할수 없음" +msgstr "네트워크에 연결할 수 없음" #, c-format, boost-format msgid "Stopped [%d]!" @@ -3829,7 +3822,7 @@ msgid "Not supported on the current printer version." msgstr "현재 프린터 버전에서는 지원되지 않습니다." msgid "Storage unavailable, insert SD card." -msgstr "저장소를 사용할수 없습니다. SD 카드를 삽입하세요." +msgstr "저장소를 사용할 수 없습니다. SD 카드를 삽입하세요." msgid "Speed:" msgstr "속도:" @@ -3898,7 +3891,7 @@ msgstr "" "(해당 모델은 이미 평가되었습니다. 귀하의 평가가 이전 평가를 덮어쓰게 됩니다.)" msgid "Rate" -msgstr "등급" +msgstr "평가" msgid "Camera" msgstr "카메라" @@ -3985,8 +3978,8 @@ msgid "" "Cannot read filament info: the filament is loaded to the tool head,please " "unload the filament and try again." msgstr "" -"필라멘트 정보를 읽을수 없음: 필라멘트가 툴 헤드에 로드되었습니다. 필라멘트를 " -"언로드하고 다시 시도하십시오." +"필라멘트 정보를 읽을 수 없음: 필라멘트가 툴 헤드에 로드되었습니다. 필라멘트" +"를 언로드하고 다시 시도하십시오." msgid "This only takes effect during printing" msgstr "출력하는 동안에만 적용됩니다" @@ -4004,13 +3997,13 @@ msgid "Ludicrous" msgstr "루더크러스" msgid "Can't start this without SD card." -msgstr "SD 카드가 없으면 시작할수 없습니다." +msgstr "SD 카드가 없으면 시작할 수 없습니다." msgid "Rate the Print Profile" -msgstr "출력 프로필 평가" +msgstr "출력 사전설정 평가" msgid "Comment" -msgstr "코멘트" +msgstr "댓글" msgid "Rate this print" msgstr "이 출력물을 평가해 주세요" @@ -4025,13 +4018,13 @@ msgid "Submit" msgstr "제출" msgid "Please click on the star first." -msgstr "먼저 별표를 클릭해주세요." +msgstr "먼저 별점을 클릭해주세요." msgid "InFo" msgstr "정보" msgid "Get oss config failed." -msgstr "먼저 별표를 클릭해주세요." +msgstr "OSS 구성 가져오기에 실패했습니다." msgid "Upload Pictrues" msgstr "사진 업로드" @@ -4046,20 +4039,18 @@ msgid " upload config prase failed\n" msgstr " 구성 업로드 실패\n" msgid " No corresponding storage bucket\n" -msgstr " 해당 스토리지 버킷이 없습니다\n" +msgstr " 해당 스토리지 버킷이 없습니다.\n" msgid " can not be opened\n" -msgstr " 열수 없습니다\n" +msgstr " 열 수 없습니다\n" msgid "" "The following issues occurred during the process of uploading images. Do you " "want to ignore them?\n" "\n" msgstr "" -"이미지 업로드 과정에서 아래와 같은 문제가 발생했습니다. 그들을 무시하시겠습니" -"까?\n" +"이미지 업로드 과정에서 아래와 같은 문제가 발생했습니다. 무시하시겠습니까?\n" "\n" -" \n" msgid "info" msgstr "정보" @@ -4078,7 +4069,7 @@ msgid "" "\n" " error code: " msgstr "" -"몇 가지 이유로 귀하의 댓글 결과를 업로드할수 없습니다. 다음과 같이:\n" +"다음과 같은 몇 가지 이유로 귀하의 댓글 결과를 업로드할 수 없습니다.:\n" "\n" " 에러 코드: " @@ -4102,14 +4093,14 @@ 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" "to give a positive rating(4 or 5stars)." msgstr "" -"이 출력 프로필의 성공적인 출력 기록이 하나 이상 필요합니다.\n" -"긍정적인 평가(별 4개 또는 5개)를 제공합니다." +"긍정적인 평가(별4개 또는 5개)를 제공하려면\n" +"이 출력 사전 설정의 성공적인 출력 기록이 하나 이상 필요합니다." msgid "Status" msgstr "상태" @@ -4154,7 +4145,7 @@ msgid "3D Mouse disconnected." msgstr "3D 마우스가 분리됨." msgid "Configuration can update now." -msgstr "구성을 지금 업데이트할수 있습니다." +msgstr "구성을 지금 업데이트할 수 있습니다." msgid "Detail." msgstr "세부 사항." @@ -4169,7 +4160,7 @@ msgid "Undo integration was successful." msgstr "통합 실행 취소에 성공했습니다." msgid "New network plug-in available." -msgstr "새로운 네트워크 플러그인을 사용할수 있습니다." +msgstr "새로운 네트워크 플러그인을 사용할 수 있습니다." msgid "Details" msgstr "세부 사항" @@ -4195,7 +4186,7 @@ msgstr "하드웨어를 안전하게 제거합니다." #, c-format, boost-format msgid "%1$d Object has custom supports." msgid_plural "%1$d Objects have custom supports." -msgstr[0] "%1$d 개체에 사용자 설정 서포트가 있습니다." +msgstr[0] "%1$d 개체에 사용자 설정 지지대가 있습니다." #, c-format, boost-format msgid "%1$d Object has color painting." @@ -4250,13 +4241,13 @@ msgid "WARNING:" msgstr "경고:" msgid "Your model needs support ! Please make support material enable." -msgstr "모델에 서포트가 필요합니다! 서포트를 활성화하십시오." +msgstr "모델에 지지대가 필요합니다! 지지대를 활성화하십시오." msgid "Gcode path overlap" msgstr "G코드 경로 겹침" msgid "Support painting" -msgstr "서포트 칠하기" +msgstr "지지대 칠하기" msgid "Color painting" msgstr "색 칠하기" @@ -4274,7 +4265,7 @@ msgid "" "The application cannot run normally because OpenGL version is lower than " "2.0.\n" msgstr "" -"OpenGL 버전이 2.0보다 낮기 때문에 응용 프로그램을 정상적으로 실행할수 없습니" +"OpenGL 버전이 2.0보다 낮기 때문에 응용 프로그램을 정상적으로 실행할 수 없습니" "다.\n" msgid "Please upgrade your graphics card driver." @@ -4288,7 +4279,7 @@ msgid "" "Unable to load shaders:\n" "%s" msgstr "" -"셰이더를 로드할수 없습니다:\n" +"셰이더를 로드할 수 없습니다:\n" "%s" msgid "Error loading shaders" @@ -4309,14 +4300,14 @@ msgid "Sensitivity of pausing is" msgstr "일시 정지 감도" msgid "Enable detection of build plate position" -msgstr "베드 위치 감지 활성화" +msgstr "빌드 플레이트 위치 감지 활성화" msgid "" "The localization tag of build plate is detected, and printing is paused if " "the tag is not in predefined range." msgstr "" -"베드의 현지화 태그가 감지되고 태그가 사전 설정된 범위를 벗어나면 출력이 일시 " -"정지됩니다." +"빌드 플레이트의 현지화 태그가 감지되고 태그가 사전 설정된 범위를 벗어나면 출" +"력이 일시 정지됩니다." msgid "First Layer Inspection" msgstr "첫 레이어 검사" @@ -4353,10 +4344,10 @@ msgstr "제목 없음" #, boost-format msgid " plate %1%:" -msgstr " 베드 %1%:" +msgstr " 플레이트 %1%:" msgid "Invalid name, the following characters are not allowed:" -msgstr "잘못된 이름입니다. 다음 문자는 사용할수 없습니다:" +msgstr "잘못된 이름입니다. 다음 문자는 사용할 수 없습니다:" msgid "Sliced Info" msgstr "슬라이스 정보" @@ -4389,7 +4380,7 @@ msgid "Bed type" msgstr "베드 유형" msgid "Flushing volumes" -msgstr "버리기 용량" +msgstr "버리기 볼륨" msgid "Add one filament" msgstr "필라멘트 한개 추가" @@ -4440,9 +4431,9 @@ msgid "" "Orca Slicer or restart Orca Slicer to check if there is an update to system " "presets." msgstr "" -"일반 사전 설정에 매핑된 알수 없는 필라멘트가 있습니다. Orca Slicer를 업데이트" -"하거나 Orca Slicer를 다시 시작하여 시스템 사전 설정에 대한 업데이트가 있는지 " -"확인하십시오." +"일반 사전 설정에 매핑된 알 수 없는 필라멘트가 있습니다. Orca Slicer를 업데이" +"트하거나 Orca Slicer를 다시 시작하여 시스템 사전 설정에 대한 업데이트가 있는" +"지 확인하십시오." #, boost-format msgid "Do you want to save changes to \"%1%\"?" @@ -4454,7 +4445,7 @@ msgid "" "computer." msgstr "" "성공적으로 마운트 해제되었습니다. 이제 %s(%s) 장치를 컴퓨터에서 안전하게 제거" -"할수 있습니다." +"할 수 있습니다." #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." @@ -4486,21 +4477,21 @@ msgid "" "Enabling traditional timelapse photography may cause surface imperfections. " "It is recommended to change to smooth mode." msgstr "" -"전통적인 타임랩스 사진을 사용하면 표면 결함이 발생할수 있습니다." -"부드러운 모드로 변경하는 것이 좋습니다." +"기존 타임랩스 사진을 사용하면 표면 결함이 발생할 수 있습니다. 유연 모드로 변" +"경하는 것이 좋습니다." #, c-format, boost-format msgid "Loading file: %s" msgstr "파일 로드 중: %s" msgid "The 3mf is not supported by OrcaSlicer, load geometry data only." -msgstr "이 3mf는 Orca Slicer에서 지원되지 않습니다. 형상 데이터만 로드합니다." +msgstr "이 3mf는 OrcaSlicer에서 지원되지 않습니다. 형상 데이터만 로드합니다." msgid "Load 3mf" msgstr "3mf 로드" msgid "The Config can not be loaded." -msgstr "구성을 로드할수 없습니다." +msgstr "구성을 로드할 수 없습니다." msgid "The 3mf is generated by old Orca Slicer, load geometry data only." msgstr "이 3mf는 이전 Orca Slicer에서 생성되었으며, 형상 데이터만 로드합니다." @@ -4510,7 +4501,8 @@ msgid "" "The 3mf's version %s is newer than %s's version %s, Found following keys " "unrecognized:" msgstr "" -"3mf의 버전 %s이(가) %s의 버전 %s보다 최신입니다. 인식할수 없는 다음 키를 찾았습니다:" +"3mf의 버전 %s이(가) %s의 버전 %s보다 최신입니다. 인식할 수 없는 다음 키를 찾" +"았습니다:" msgid "You'd better upgrade your software.\n" msgstr "소프트웨어를 업그레이드하는 것이 좋습니다.\n" @@ -4542,24 +4534,24 @@ msgid "Name of components inside step file is not UTF8 format!" msgstr "단계 파일 내의 구성 요소 이름이 UTF8 형식이 아닙니다!" msgid "The name may show garbage characters!" -msgstr "이름에 알수 없는 문자가 표시될수 있습니다!" +msgstr "이름에 알 수 없는 문자가 표시될 수 있습니다!" #, boost-format msgid "Failed loading file \"%1%\". An invalid configuration was found." -msgstr "파일 \"%1%\"를 로드하지 못했습니다. 잘못된 구성이 발견되었습니다." +msgstr "파일 \"%1%\"을(를) 로드하지 못했습니다. 잘못된 구성이 발견되었습니다." msgid "Objects with zero volume removed" -msgstr "용량이 0인 개체가 제거됨" +msgstr "부피가 0인 개체가 제거됨" msgid "The volume of the object is zero" -msgstr "물체의 용량은 0입니다" +msgstr "물체의 부피는 0입니다" #, 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 파일의 개체가 너무 작습니다. 단위가 미터나 인치일수 있습니다.\n" +"%s 파일의 개체가 너무 작습니다. 단위가 미터나 인치일 수 있습니다.\n" " 밀리미터 단위로 확장하시겠습니까?" msgid "Object too small" @@ -4613,7 +4605,7 @@ msgstr "" "그 이후 모델의 일관성은 보장되지 않습니다." msgid "The selected object couldn't be split." -msgstr "선택한 개체를 분할할수 없습니다." +msgstr "선택한 개체를 분할할 수 없습니다." msgid "Another export job is running." msgstr "다른 내보내기 작업이 실행 중입니다." @@ -4647,7 +4639,7 @@ msgstr "슬라이싱 취소됨" #, c-format, boost-format msgid "Slicing Plate %d" -msgstr "베드 슬라이싱 %d" +msgstr "플레이트 슬라이싱 %d" msgid "Please resolve the slicing errors and publish again." msgstr "슬라이싱 오류를 해결하고 다시 시도하십시오." @@ -4655,17 +4647,18 @@ msgstr "슬라이싱 오류를 해결하고 다시 시도하십시오." msgid "" "Network Plug-in is not detected. Network related features are unavailable." msgstr "" -"네트워크 플러그인이 감지되지 않습니다. 네트워크 관련 기능을 사용할수 없습니다." +"네트워크 플러그인이 감지되지 않습니다. 네트워크 관련 기능을 사용할 수 없습니" +"다." msgid "" "Preview only mode:\n" "The loaded file contains gcode only, Can not enter the Prepare page" msgstr "" "미리 보기 전용 모드:\n" -"불러온 파일에 G코드만 포함되어 있습니다. 준비 페이지에 들어갈수 없습니다" +"불러온 파일에 G코드만 포함되어 있습니다. 준비 페이지에 들어갈 수 없습니다" msgid "You can keep the modified presets to the new project or discard them" -msgstr "수정된 사전 설정을 새 프로젝트에 유지하거나 삭제할수 있습니다" +msgstr "수정된 사전 설정을 새 프로젝트에 유지하거나 삭제할 수 있습니다" msgid "Creating a new project" msgstr "새 프로젝트 생성" @@ -4727,16 +4720,16 @@ msgid "Import geometry only" msgstr "형상만 가져오기" msgid "Only one G-code file can be opened at the same time." -msgstr "동시에 하나의 G코드 파일만 열수 있습니다." +msgstr "동시에 하나의 G코드 파일만 열 수 있습니다." msgid "G-code loading" msgstr "G코드 불러오는 중" msgid "G-code files can not be loaded with models together!" -msgstr "G코드 파일은 모델과 함께 로드할수 없습니다!" +msgstr "G코드 파일은 모델과 함께 로드할 수 없습니다!" msgid "Can not add models when in preview mode!" -msgstr "미리보기 모드에서는 모델을 추가할수 없습니다!" +msgstr "미리보기 모드에서는 모델을 추가할 수 없습니다!" msgid "Add Models" msgstr "모델 추가" @@ -4769,13 +4762,13 @@ msgid "" "The file %s has been sent to the printer's storage space and can be viewed " "on the printer." msgstr "" -"%s 파일이 프린터의 저장 공간으로 전송되었으며 프린터에서 볼수있습니다." +"%s 파일이 프린터의 저장 공간으로 전송되었으며 프린터에서 볼 수 있습니다." msgid "" "Unable to perform boolean operation on model meshes. Only positive parts " "will be exported." msgstr "" -"모델 메쉬에 부울 연산을 수행할수 없습니다. 오직 양수 부품만 내보내집니다." +"모델 메쉬에 부울 연산을 수행할 수 없습니다. 오직 양수 부품만 내보내집니다." msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "프린터가 준비됐나요? 출력 시트가 제자리에 있고 비어 있고 깨끗합니까?" @@ -4788,7 +4781,7 @@ msgid "" "Suggest to use auto-arrange to avoid collisions when printing." msgstr "" "개체별 출력:\n" -"출력시 충돌을 방지하기 위해 자동 정렬을 사용할 것을 제안합니다." +"출력 시 충돌을 방지하기 위해 자동 정렬을 사용할 것을 제안합니다." msgid "Send G-code" msgstr "G코드 전송" @@ -4797,13 +4790,13 @@ msgid "Send to printer" msgstr "프린터로 전송" msgid "Custom supports and color painting were removed before repairing." -msgstr "수리 전 사용자 지정 서포트와 컬러 페인트가 제거되었습니다." +msgstr "수리 전 사용자 지정 지지대와 컬러 페인트가 제거되었습니다." msgid "Invalid number" msgstr "잘못된 번호" msgid "Plate Settings" -msgstr "베드 설정" +msgstr "플레이트 설정" #, boost-format msgid "Number of currently selected parts: %1%\n" @@ -4831,11 +4824,11 @@ msgstr "크기: %1% x %2% x %3% mm\n" #, boost-format msgid "Volume: %1% in³\n" -msgstr "용량: %1% in³\n" +msgstr "부피: %1% in³\n" #, boost-format msgid "Volume: %1% mm³\n" -msgstr "용량: %1% mm³\n" +msgstr "부피: %1% mm³\n" #, boost-format msgid "Triangles: %1%\n" @@ -4857,7 +4850,7 @@ msgid "" "still want to do this printing, please set this filament's bed temperature " "to non zero." msgstr "" -"% d: %s베드는 %s(%s)필라멘트를 출력하는데 사용하지 않는 것이 좋습니다. " +"% d: %s플레이트는 %s(%s)필라멘트를 출력하는데 사용하지 않는 것이 좋습니다. " "이 출력을 계속하려면 이 필라멘트의 베드 온도를 0이 아닌 값으로 설정하십시오." msgid "Switching the language requires application restart.\n" @@ -4929,8 +4922,7 @@ msgstr "마우스 위치로 확대" msgid "" "Zoom in towards the mouse pointer's position in the 3D view, rather than the " "2D window center." -msgstr "" -"2D 윈도우 중앙이 아닌 3D 보기에서 마우스 포인터의 위치로 확대합니다." +msgstr "2D 윈도우 중앙이 아닌 3D 보기에서 마우스 포인터의 위치로 확대합니다." msgid "Show \"Tip of the day\" notification after start" msgstr "시작 후 \"오늘의 팁\" 알림 표시" @@ -4969,19 +4961,23 @@ msgid "Associate .3mf files to OrcaSlicer" msgstr ".3mf 파일을 OrcaSlicer에 연결" msgid "If enabled, sets OrcaSlicer as default application to open .3mf files" -msgstr "활성화된 경우 OrcaSlicer를 기본 응용 프로그램으로 설정하여 .3mf 파일을 엽니다" +msgstr "" +"활성화된 경우 OrcaSlicer를 기본 응용 프로그램으로 설정하여 .3mf 파일을 엽니다" msgid "Associate .stl files to OrcaSlicer" msgstr ".stl 파일을 OrcaSlicer에 연결" msgid "If enabled, sets OrcaSlicer as default application to open .stl files" -msgstr "활성화된 경우 OrcaSlicer를 기본 응용 프로그램으로 설정하여 .stl 파일을 엽니다" +msgstr "" +"활성화된 경우 OrcaSlicer를 기본 응용 프로그램으로 설정하여 .stl 파일을 엽니다" msgid "Associate .step/.stp files to OrcaSlicer" msgstr ".step/.stp 파일을 OrcaSlicer에 연결" msgid "If enabled, sets OrcaSlicer as default application to open .step files" -msgstr "활성화된 경우 OrcaSlicer를 기본 응용 프로그램으로 설정하여 .step 파일을 엽니다" +msgstr "" +"활성화된 경우 OrcaSlicer를 기본 응용 프로그램으로 설정하여 .step 파일을 엽니" +"다" msgid "Online Models" msgstr "온라인 모델" @@ -5003,8 +4999,7 @@ msgstr "자동 백업" msgid "" "Backup your project periodically for restoring from the occasional crash." -msgstr "" -"간헐적인 충돌로부터 복원하기 위해 주기적으로 프로젝트를 백업하십시오." +msgstr "간헐적인 충돌로부터 복원하기 위해 주기적으로 프로젝트를 백업하십시오." msgid "every" msgstr "매" @@ -5160,7 +5155,7 @@ msgid "The selected preset is null!" msgstr "선택한 사전 설정의 값이 존재하지 않습니다!(null)" msgid "Plate name" -msgstr "베드 이름" +msgstr "플레이트 이름" msgid "Same as Global Print Sequence" msgstr "전역 출력 순서와 동일" @@ -5175,7 +5170,7 @@ msgid "First layer filament sequence" msgstr "첫 번째 레이어 필라멘트 순서" msgid "Same as Global Plate Type" -msgstr "글로벌 베드 타입과 동일" +msgstr "글로벌 플레이트 타입과 동일" msgid "Same as Global Bed Type" msgstr "글로벌 베드유형과 동일" @@ -5193,7 +5188,7 @@ msgid "Log Out" msgstr "로그 아웃" msgid "Slice all plate to obtain time and filament estimation" -msgstr "시간 및 필라멘트 추정치를 얻기 위해 모든 베드를 슬라이스합니다" +msgstr "시간 및 필라멘트 추정치를 얻기 위해 모든 플레이트를 슬라이스합니다" msgid "Packing project data into 3mf file" msgstr "프로젝트 데이터를 3mf 파일로 압축" @@ -5205,7 +5200,7 @@ msgid "Jump to model publish web page" msgstr "모델 게시 웹 페이지로 이동" msgid "Note: The preparation may takes several minutes. Please be patiant." -msgstr "참고: 준비하는 데 몇 분 정도 걸릴수 있습니다. 조금만 기다려주십시오." +msgstr "참고: 준비하는 데 몇 분 정도 걸릴 수 있습니다. 조금만 기다려주십시오." msgid "Publish" msgstr "게시" @@ -5214,7 +5209,7 @@ msgid "Publish was cancelled" msgstr "게시가 취소되었습니다" msgid "Slicing Plate 1" -msgstr "베드 1 슬라이싱" +msgstr "플레이트 1 슬라이싱" msgid "Packing data to 3mf" msgstr "데이터를 3mf로 압축 중" @@ -5224,7 +5219,7 @@ msgstr "웹 페이지로 이동" #, c-format, boost-format msgid "Save %s as" -msgstr "%s를 다음으로 저장" +msgstr "%s을(를) 다음으로 저장" msgid "User Preset" msgstr "사용자 사전 설정" @@ -5242,10 +5237,10 @@ msgid "illegal suffix:" msgstr "잘못된 접미사:" msgid "Name is unavailable." -msgstr "이름을 사용할수 없습니다." +msgstr "이름을 사용할 수 없습니다." msgid "Overwrite a system profile is not allowed" -msgstr "시스템 사전 설정은 덮어쓸수 없습니다" +msgstr "시스템 사전 설정은 덮어쓸 수 없습니다" #, boost-format msgid "Preset \"%1%\" already exists." @@ -5259,16 +5254,16 @@ msgid "Please note that saving action will replace this preset" msgstr "저장 작업이 이 사전 설정을 대체합니다" msgid "The name is not allowed to be empty." -msgstr "이름은 비워 둘수 없습니다." +msgstr "이름은 비워 둘 수 없습니다." msgid "The name is not allowed to start with space character." -msgstr "이름은 공백으로 시작할수 없습니다." +msgstr "이름은 공백으로 시작할 수 없습니다." msgid "The name is not allowed to end with space character." -msgstr "이름은 공백으로 끝날수 없습니다." +msgstr "이름은 공백으로 끝날 수 없습니다." msgid "The name cannot be the same as a preset alias name." -msgstr "이름은 사전 설정의 별칭 이름과 같을수 없습니다." +msgstr "이름은 사전 설정의 별칭 이름과 같을 수 없습니다." msgid "Save preset" msgstr "사전 설정 저장" @@ -5316,7 +5311,7 @@ msgid "Input access code" msgstr "액세스 코드 입력" msgid "Can't find my devices?" -msgstr "내 장치를 찾을수 없습니까?" +msgstr "내 장치를 찾을 수 없습니까?" msgid "Log out successful." msgstr "로그아웃에 성공했습니다." @@ -5331,19 +5326,19 @@ msgid "Bambu Cool Plate" msgstr "Bambu Cool Plate" msgid "PLA Plate" -msgstr "PLA 베드" +msgstr "PLA 플레이트" msgid "Bambu Engineering Plate" -msgstr "Bambu Engineering Plate" +msgstr "밤부 엔지니어링 플레이트" msgid "Bambu Smooth PEI Plate" -msgstr "Bambu Smooth PEI Plate" +msgstr "밤부 스무스 PEI 플레이트" msgid "High temperature Plate" -msgstr "High temperature Plate" +msgstr "고온 플레이트" msgid "Bambu Textured PEI Plate" -msgstr "Bambu Textured PEI Plate" +msgstr "밤부 텍스처 PEI 플레이트" msgid "Send print job to" msgstr "출력 작업 보내기" @@ -5355,10 +5350,10 @@ msgid "Bed Leveling" msgstr "베드 레벨링" msgid "Flow Dynamics Calibration" -msgstr "동적 압출량 교정" +msgstr "동적 유량 교정" msgid "Click here if you can't connect to the printer" -msgstr "프린터에 연결할수 없는 경우 여기를 클릭하세요" +msgstr "프린터에 연결할 수 없는 경우 여기를 클릭하세요" msgid "send completed" msgstr "전송 완료" @@ -5385,12 +5380,11 @@ msgid "Synchronizing device information time out" msgstr "장치 정보 동기화 시간 초과" msgid "Cannot send the print job when the printer is updating firmware" -msgstr "프린터가 펌웨어를 업데이트하는 동안 출력 작업을 보낼수 없습니다" +msgstr "프린터가 펌웨어를 업데이트하는 동안 출력 작업을 보낼 수 없습니다" msgid "" "The printer is executing instructions. Please restart printing after it ends" -msgstr "" -"프린터가 명령을 실행하고 있습니다. 종료 후 출력을 다시 시작하십시오" +msgstr "프린터가 명령을 실행하고 있습니다. 종료 후 출력을 다시 시작하십시오" msgid "The printer is busy on other print job" msgstr "프린터가 다른 출력 작업을 수행 중입니다" @@ -5415,7 +5409,7 @@ msgid "" "filament above to change its mapping AMS slot" msgstr "" "AMS 슬롯 매핑에 대한 필라멘트가 설정되었습니다. 위의 필라멘트를 클릭하여 매" -"핑 AMS 슬롯을 변경할수 있습니다" +"핑 AMS 슬롯을 변경할 수 있습니다" msgid "" "Please click each filament above to specify its mapping AMS slot before " @@ -5442,8 +5436,7 @@ msgstr "" msgid "" "The printer firmware only supports sequential mapping of filament => AMS " "slot." -msgstr "" -"프린터 펌웨어는 필라멘트 => AMS 슬롯의 순차 매핑만 지원합니다." +msgstr "프린터 펌웨어는 필라멘트 => AMS 슬롯의 순차 매핑만 지원합니다." msgid "An SD card needs to be inserted before printing." msgstr "출력하기 전에 SD 카드를 삽입해야 합니다." @@ -5457,27 +5450,26 @@ msgstr "타임랩스를 녹화하려면 SD 카드를 삽입해야 합니다." msgid "" "Cannot send the print job to a printer whose firmware is required to get " "updated." -msgstr "" -"펌웨어를 업데이트해야 하는 프린터로 출력 작업을 보낼수 없습니다." +msgstr "펌웨어를 업데이트해야 하는 프린터로 출력 작업을 보낼 수 없습니다." msgid "Cannot send the print job for empty plate" -msgstr "빈 베드에 대한 출력 작업을 보낼수 없습니다" +msgstr "빈 플레이트에 대한 출력 작업을 보낼 수 없습니다" msgid "This printer does not support printing all plates" -msgstr "이 프린터는 모든 베드 출력을 지원하지 않습니다" +msgstr "이 프린터는 모든 플레이트 출력을 지원하지 않습니다" msgid "" "When enable spiral vase mode, machines with I3 structure will not generate " "timelapse videos." msgstr "" -"나선형 꽃병 모드를 활성화하면 I3 구조의 기계는 타임랩스 비디오를 생성하지 않" +"나선형 꽃병 모드를 활성화하면 I3 구조의 장치는 타임랩스 비디오를 생성하지 않" "습니다." msgid "" "When print by object, machines with I3 structure will not generate timelapse " "videos." msgstr "" -"개체별로 출력할 때 I3 구조의 기계는 타임랩스 비디오를 생성하지 않습니다." +"개체별로 출력할 때 I3 구조의 장치는 타임랩스 비디오를 생성하지 않습니다." msgid "Errors" msgstr "오류" @@ -5495,25 +5487,23 @@ msgstr "" #, c-format, boost-format msgid "%s is not supported by AMS." -msgstr "%s는 AMS에서 지원하지 않습니다." +msgstr "%s은(는) AMS에서 지원하지 않습니다." 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 매핑에 알 수 없는 필라멘트가 있습니다. 필요한 필라멘트인지 확인해주세요. " "정상이면 \"확인\"을 눌러 출력을 시작하십시오." msgid "" "Please click the confirm button if you still want to proceed with printing." -msgstr "" -"그래도 출력을 계속하려면 확인 버튼을 클릭하십시오." +msgstr "그래도 출력을 계속하려면 확인 버튼을 클릭하십시오." msgid "" "Connecting to the printer. Unable to cancel during the connection process." -msgstr "" -"프린터에 연결 중입니다. 연결 진행 중에는 취소할수 없습니다." +msgstr "프린터에 연결 중입니다. 연결 진행 중에는 취소할 수 없습니다." msgid "Preparing print job" msgstr "출력 작업 준비 중" @@ -5528,10 +5518,11 @@ msgid "" "Caution to use! Flow calibration on Textured PEI Plate may fail due to the " "scattered surface." msgstr "" -"사용상의 주의! Textured PEI 베드의 압출량 교정은 표면이 분산되어 실패할수 있습니다." +"사용상의 주의! Textured PEI 플레이트의 유량 교정은 표면이 분산되어 실패할 수 " +"있습니다." msgid "Automatic flow calibration using Micro Lidar" -msgstr "Micro Lidar를 사용한 자동 압출량 교정" +msgstr "Micro Lidar를 사용한 자동 유량 교정" msgid "Modifying the device name" msgstr "장치 이름 수정" @@ -5540,7 +5531,7 @@ msgid "Send to Printer SD card" msgstr "프린터 SD 카드로 보내기" msgid "Cannot send the print task when the upgrade is in progress" -msgstr "업그레이드가 진행 중일 때 출력 작업을 보낼수 없습니다" +msgstr "업그레이드가 진행 중일 때 출력 작업을 보낼 수 없습니다" msgid "An SD card needs to be inserted before send to printer SD card." msgstr "프린터 SD 카드로 보내기 전에 SD 카드를 삽입해야 합니다." @@ -5576,7 +5567,7 @@ msgid "Receive login report timeout" msgstr "로그인 보고서 수신 시간 초과" msgid "Unknown Failure" -msgstr "알수 없는 실패" +msgstr "알 수 없는 실패" msgid "Log in printer" msgstr "프린터 로그인" @@ -5636,8 +5627,8 @@ msgstr "" "매개변수와 설정을 조정합니다. %s는 이와 동일한 원칙을 따르며 머신 러닝을 사용" "하여 사용자의 방대한 출력 성공과 실패로부터 성능을 개선합니다. 우리는 실제 데" "이터를 통하여 %s가 더 똑똑해지도록 훈련시킵니다. 동의하신다면 이 서비스는 오" -"류 로그와 사용 로그를 포함할수 있는 정보에 접근할 것입니다. 당사는 개인이 직" -"접 또는 간접적으로 식별될수 있는 개인 데이터, 예를 들어 이름, 주소, 결제 정" +"류 로그와 사용 로그를 포함할 수 있는 정보에 접근할 것입니다. 당사는 개인이 직" +"접 또는 간접적으로 식별될 수 있는 개인 데이터, 예를 들어 이름, 주소, 결제 정" "보 또는 전화번호를 포함하여 어떤 개인 데이터도 수집하지 않습니다. 이 서비스" "를 활성화하면 이 약관과 개인정보 보호정책에 대한 설명에 동의하는 것입니다." @@ -5681,7 +5672,7 @@ msgid "" "model without prime tower. Are you sure you want to disable prime tower?" msgstr "" "유연모드 타임랩스를 위해서는 프라임 타워가 필요합니다. 프라임 타워가 없는 모" -"델에는 결함이 있을수 있습니다. 프라임 타워를 사용하지 않도록 설정하시겠습니" +"델에는 결함이 있을 수 있습니다. 프라임 타워를 사용하지 않도록 설정하시겠습니" "까?" msgid "" @@ -5689,7 +5680,7 @@ msgid "" "model without prime tower. Do you want to enable prime tower?" msgstr "" "유연모드 타임랩스를 위해서는 프라임 타워가 필요합니다. 프라임 타워가 없는 모" -"델에는 결함이 있을수 있습니다. 프라임 타워를 사용하지 않도록 설정하시겠습니" +"델에는 결함이 있을 수 있습니다. 프라임 타워를 사용하지 않도록 설정하시겠습니" "까?" msgid "" @@ -5697,7 +5688,7 @@ msgid "" "support volume but weaker strength.\n" "We recommend using it with: 0 interface layers, 0 top distance, 2 walls." msgstr "" -"서포트 용량은 작지만 강도는 약한 것이 특징인 실험적 모양 \"얇은 트리\"를 추가" +"지지대 부피는 작지만 강도는 약한 것이 특징인 실험적 모양 \"얇은 나무\"를 추가" "했습니다.\n" "접점 레이어 0, 상단 Z 거리 0, 벽 루프 2 와 함께 사용하는 것이 좋습니다." @@ -5715,8 +5706,8 @@ msgid "" "settings: at least 2 interface layers, at least 0.1mm top z distance or " "using support materials on interface." msgstr "" -"\"강한 트리\" 및 \"혼합 트리\" 모양의 경우 최소 접점 레이어 2, 상단 Z 거리 " -"0.1 또는 접점에서 서포트 재료를 사용하는 설정을 권장합니다." +"\"강한 나무\" 및 \"혼합 나무\" 모양의 경우 최소 접점 레이어 2, 상단 Z 거리 " +"0.1 또는 접점에서 지지대 재료를 사용하는 설정을 권장합니다." msgid "" "When using support material for the support interface, We recommend the " @@ -5724,8 +5715,8 @@ msgid "" "0 top z distance, 0 interface spacing, concentric pattern and disable " "independent support layer height" msgstr "" -"서포트 접점에 서포트 재료를 사용하는 경우 다음 설정을 권장합니다:\n" -"상단 Z 거리 0, 접점 간격 0, 접점 패턴 동심원 및 독립적 서포트 높이 비활성화" +"지지대 접점에 지지대 재료를 사용하는 경우 다음 설정을 권장합니다:\n" +"상단 Z 거리 0, 접점 간격 0, 접점 패턴 동심원 및 독립적 지지대 높이 비활성화" msgid "" "When recording timelapse without toolhead, it is recommended to add a " @@ -5733,10 +5724,10 @@ msgid "" "by right-click the empty position of build plate and choose \"Add " "Primitive\"->\"Timelapse Wipe Tower\"." msgstr "" -"툴헤드 없이 시간 경과를 기록할 경우 \"시간 경과 제거 타워\"를 추가하는 것이 " -"좋습니다\n" -"베드의 빈 위치를 마우스 오른쪽 버튼으로 클릭하고 \"Add Primitive\"-> " -"\"Timelapse Wipe Tower\"를 선택합니다." +"툴헤드 없이 시간 경과를 기록할 경우 \"타임랩스 닦기 타워\"를 추가하는 것이 좋" +"습니다\n" +"빌드 플레이트의 빈 위치를 마우스 오른쪽 버튼으로 클릭하고 \"기본 모델 추가\"-" +"> \"타임랩스 닦기 타워\"를 선택합니다." msgid "Line width" msgstr "선 너비" @@ -5763,21 +5754,22 @@ msgid "Other layers speed" msgstr "다른 레이어 속도" msgid "Overhang speed" -msgstr "오버행 속도" +msgstr "돌출부 속도" msgid "" "This is the speed for various overhang degrees. Overhang degrees are " "expressed as a percentage of line width. 0 speed means no slowing down for " "the overhang degree range and wall speed is used" msgstr "" -"다양한 오버행 각도에 대한 속도입니다. 오버행 정도는 선 너비의 백분율로 표시됩" -"니다. 0 속도는 오버행 정도에 대한 감속이 없음을 의미하며 벽 속도가 사용됩니다" +"다양한 돌출부 정도(Degree)에 대한 속도입니다. 돌출부 정도는 선 너비의 백분율" +"로 표시됩니다. 0 속도는 돌출부 정도에 대한 감속이 없음을 의미하며 벽 속도가 " +"사용됩니다" msgid "Bridge" -msgstr "브리지" +msgstr "다리" msgid "Set speed for external and internal bridges" -msgstr "외부 및 내부 브리지 속도 설정" +msgstr "외부 및 내부 다리 속도 설정" msgid "Travel speed" msgstr "이동 속도(트레블)" @@ -5792,10 +5784,10 @@ msgid "Raft" msgstr "라프트" msgid "Support filament" -msgstr "서포트 필라멘트" +msgstr "지지대 필라멘트" msgid "Tree supports" -msgstr "트리 서포트" +msgstr "나무 지지대" msgid "Prime tower" msgstr "프라임 타워" @@ -5836,7 +5828,7 @@ msgid "Setting Overrides" msgstr "설정 재정의(덮어쓰기)" msgid "Retraction" -msgstr "리트렉션" +msgstr "퇴출" msgid "Basic information" msgstr "기본 정보" @@ -5854,48 +5846,48 @@ msgid "Nozzle" msgstr "노즐" msgid "Nozzle temperature when printing" -msgstr "출력시 노즐 온도" +msgstr "출력 시 노즐 온도" msgid "Cool plate" -msgstr "쿨 베드" +msgstr "쿨 플레이트" msgid "" "Bed temperature when cool plate is installed. Value 0 means the filament " "does not support to print on the Cool Plate" msgstr "" -"쿨 베드 설치 시 베드 온도. 값 0은 필라멘트가 쿨 베드에 출력하는 것을 " +"쿨 플레이트 설치 시 베드 온도. 값 0은 필라멘트가 쿨 플레이트에 출력하는 것을 " "지원하지 않음을 의미합니다" msgid "Engineering plate" -msgstr "엔지니어링 베드" +msgstr "엔지니어링 플레이트" msgid "" "Bed temperature when engineering plate is installed. Value 0 means the " "filament does not support to print on the Engineering Plate" msgstr "" -"엔지니어링 베드가 설치 시 베드 온도. 값 0은 필라멘트가 엔지니어링 베드에 " -"출력하는 것을 지원하지 않음을 의미합니다" +"엔지니어링 플레이트가 설치 시 베드 온도. 값 0은 필라멘트가 엔지니어링 플레이" +"트에 출력하는 것을 지원하지 않음을 의미합니다" msgid "Smooth PEI Plate / High Temp Plate" -msgstr "매끄러운 PEI 베드 / 고온 베드" +msgstr "스무스 PEI 플레이트 / 고온 플레이트" 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/" "High Temp Plate" msgstr "" -"부드러운 PEI 베드/고온 베드 설치 시 베드 온도. 값 0은 필라멘트가 부드러운 " -"PEI 베드/고온 베드 출력를 지원하지 않음을 의미합니다" +"스무스 PEI 플레이트/고온 플레이트 설치 시 베드 온도. 값 0은 필라멘트가 스무" +"스 PEI 플레이트/고온 플레이트 출력을 지원하지 않음을 의미합니다" msgid "Textured PEI Plate" -msgstr "텍스처 PEI 베드" +msgstr "텍스처 PEI 플레이트" 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" msgstr "체적 속도 제한" @@ -5932,10 +5924,10 @@ msgstr "" "예상 레이어 시간이 설정 값보다 짧을 때 출력물 냉각 팬 속도가 최대가 됩니다" msgid "Auxiliary part cooling fan" -msgstr "보조 냉각 팬" +msgstr "보조 출력물 냉각 팬" msgid "Exhaust fan" -msgstr "환기팬" +msgstr "환기 팬" msgid "During print" msgstr "출력 중" @@ -5989,22 +5981,22 @@ msgid "Machine end G-code" msgstr "장치 종료 G코드" msgid "Before layer change G-code" -msgstr "레이어 변경전 G코드" +msgstr "레이어 변경 전 G코드" msgid "Layer change G-code" -msgstr "레아어 변경 G코드" +msgstr "레이어 변경 G코드" msgid "Time lapse G-code" msgstr "타임랩스 G코드" msgid "Change filament G-code" -msgstr "필라멘트 변경 G코드" +msgstr "필라멘트 교체 G코드" msgid "Pause G-code" -msgstr "정지 G코드" +msgstr "일시정지 G코드" msgid "Template Custom G-code" -msgstr "탬플릿 사용자정의 G코드" +msgstr "템플릿 사용자 정의 G코드" msgid "Motion ability" msgstr "동작 능력" @@ -6037,19 +6029,19 @@ msgid "Lift Z Enforcement" msgstr "강제 Z 올리기" msgid "Retraction when switching material" -msgstr "재료 전환 시 리트렉션" +msgstr "재료 전환 시 퇴출" msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" "Shall I disable it in order to enable Firmware Retraction?" msgstr "" -"닦기 옵션은 펌웨어 리트렉션 모드를 사용하는 경우에는 사용할수 없습니다.\n" +"닦기 옵션은 펌웨어 퇴출 모드를 사용하는 경우에는 사용할 수 없습니다.\n" "\n" -"펌웨어 리트렉션을 활성화하기 위해 비활성화하겠습니까?" +"펌웨어 퇴출을 활성화하기 위해 비활성화하겠습니까?" msgid "Firmware Retraction" -msgstr "펌웨어 리트렉션" +msgstr "펌웨어 퇴출" msgid "Detached" msgstr "분리됨" @@ -6089,7 +6081,7 @@ msgid "Unsaved Changes" msgstr "저장되지 않은 변경 사항" msgid "Discard or Keep changes" -msgstr "변경 사항 취소 또는 유지" +msgstr "변경 사항 폐기 또는 유지" msgid "Old Value" msgstr "이전 값" @@ -6104,7 +6096,7 @@ msgid "Don't save" msgstr "저장하지 않음" msgid "Discard" -msgstr "취소" +msgstr "폐기" msgid "Click the right mouse button to display the full text." msgstr "마우스 오른쪽 버튼을 클릭하여 전체 텍스트를 표시합니다." @@ -6149,16 +6141,16 @@ msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it " "contains the following unsaved changes:" msgstr "" -"사전 설정 \"%1%\"는 새 프린터 프로필과 호환되지 않으며 다음 저장되지 않은 변" -"경 사항을 포함:" +"사전 설정 \"%1%\"은(는) 새 프린터 프로필과 호환되지 않으며 다음 저장되지 않" +"은 변경 사항을 포함:" #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new process profile and it " "contains the following unsaved changes:" msgstr "" -"사전 설정 \"%1%\"는 새 프로세스 프로필과 호환되지 않으며 다음 저장되지 않은 " -"변경 사항을 포함:" +"사전 설정 \"%1%\"은(는) 새 프로세스 프로필과 호환되지 않으며 다음 저장되지 않" +"은 변경 사항을 포함:" #, boost-format msgid "" @@ -6178,7 +6170,7 @@ msgstr "" "사전 설정 전환 후 변경된 설정(새 값)을 유지하시겠습니까?" msgid "Extruders count" -msgstr "익스트루더 수" +msgstr "압출기 수" msgid "General" msgstr "일반" @@ -6228,13 +6220,13 @@ msgid "%s Update" msgstr "%s 업데이트" msgid "A new version is available" -msgstr "새 버전을 사용할수 있습니다" +msgstr "새 버전을 사용할 수 있습니다" msgid "Configuration update" msgstr "구성 업데이트" msgid "A new configuration package available, Do you want to install it?" -msgstr "새 구성 패키지를 사용할수 있습니다. 설치하시겠습니까?" +msgstr "새 구성 패키지를 사용할 수 있습니다. 설치하시겠습니까?" msgid "Description:" msgstr "설명:" @@ -6251,7 +6243,7 @@ msgid "" "%s will update the configuration package, Otherwise it won't be able to start" msgstr "" "구성 패키지가 현재 애플리케이션과 호환되지 않습니다.\n" -"%s는 구성 패키지를 업데이트합니다. 그렇지 않으면 시작할수 없습니다" +"%s는 구성 패키지를 업데이트합니다. 그렇지 않으면 시작할 수 없습니다" #, c-format, boost-format msgid "Exit %s" @@ -6285,11 +6277,11 @@ msgid "" msgstr "" "래밍(Ramming)은 단일 압출기 다중 재료 프린터에서 툴 교체 직전의 급속 압출을 " "의미합니다. 필라멘트를 뺄때 끝 모양을 적절하게 형성하여 새 필라멘트의 삽입을 " -"방해하지 않고 나중에 다시 삽입할수 있도록 하는 것입니다. 이 단계는 중요하며, " -"좋은 모양을 얻으려면 재료마다 다른 압출 속도가 필요할수 있습니다." -"이러한 이유로 래밍 중 압출 속도는 조정 가능합니다.\n" +"방해하지 않고 나중에 다시 삽입할 수 있도록 하는 것입니다. 이 단계는 중요하" +"며, 좋은 모양을 얻으려면 재료마다 다른 압출 속도가 필요할 수 있습니다. 이러" +"한 이유로 래밍 중 압출 속도는 조정 가능합니다.\n" "\n" -"이는 전문가 수준 설정이므로 잘못 조정하면 막힘, 필라멘트 갈림 등이 발생할수 " +"이는 전문가 수준 설정이므로 잘못 조정하면 막힘, 필라멘트 갈림 등이 발생할 수 " "있습니다." msgid "Total ramming time" @@ -6299,7 +6291,7 @@ msgid "s" msgstr "s" msgid "Total rammed volume" -msgstr "총 래밍 용량" +msgstr "총 래밍 부피" msgid "Ramming line width" msgstr "래밍 선 너비" @@ -6311,17 +6303,17 @@ msgid "Auto-Calc" msgstr "자동 계산" msgid "Flushing volumes for filament change" -msgstr "필라멘트 교체를 위한 버리기 용량" +msgstr "필라멘트 교체를 위한 버리기 부피" msgid "Multiplier" msgstr "승수" msgid "Flushing volume (mm³) for each filament pair." -msgstr "각 필라멘트 쌍에 대한 버리기 용량(mm³)." +msgstr "각 필라멘트 쌍에 대한 버리기 부피(mm³)." #, c-format, boost-format msgid "Suggestion: Flushing Volume in range [%d, %d]" -msgstr "제안: [%d, %d] 범위의 버리기 용량" +msgstr "제안: [%d, %d] 범위의 버리기 부피" #, c-format, boost-format msgid "The multiplier should be in range [%.2f, %.2f]." @@ -6523,7 +6515,7 @@ msgid "Gizmo Place face on bed" msgstr "도구 상자 바닥면 선택" msgid "Gizmo SLA support points" -msgstr "도구 상자 서포트 칠하기" +msgstr "도구 상자 지지대 칠하기" msgid "Gizmo FDM paint-on seam" msgstr "도구 상자 솔기 칠하기" @@ -6541,13 +6533,13 @@ msgid "⌘+Mouse wheel" msgstr "⌘+마우스 휠" msgid "Support/Color Painting: adjust pen radius" -msgstr "서포트/색상 칠하기: 펜 반경 조정" +msgstr "지지대/색상 칠하기: 펜 반경 조정" msgid "⌥+Mouse wheel" msgstr "⌥+마우스 휠" msgid "Support/Color Painting: adjust section position" -msgstr "서포트/색상 칠하기: 단면 위치 조정" +msgstr "지지대/색상 칠하기: 단면 위치 조정" msgid "Ctrl+Mouse wheel" msgstr "Ctrl+마우스 휠" @@ -6621,7 +6613,7 @@ msgstr "" #, c-format, boost-format msgid "A new Network plug-in(%s) available, Do you want to install it?" -msgstr "새 네트워크 플러그인(%s)을 사용할수 있습니다. 설치하시겠습니까?" +msgstr "새 네트워크 플러그인(%s)을 사용할 수 있습니다. 설치하시겠습니까?" msgid "New version of Bambu Studio" msgstr "뱀부 스튜디오의 새 버전" @@ -6651,7 +6643,7 @@ msgid "Access Code" msgstr "액세스 코드" msgid "Where to find your printer's IP and Access Code?" -msgstr "프린터의 IP 및 액세스 코드는 어디에서 찾을수 있습니까?" +msgstr "프린터의 IP 및 액세스 코드는 어디에서 찾을 수 있습니까?" msgid "Error: IP or Access Code are not correct" msgstr "오류: IP 또는 액세스 코드가 올바르지 않습니다" @@ -6751,10 +6743,10 @@ msgid "Repaired 3mf file contains more than one object" msgstr "수리된 3mf 파일에 둘 이상의 개체가 포함되어 있습니다" msgid "Repaired 3mf file does not contain any volume" -msgstr "수리된 3mf 파일에 용량이 없습니다" +msgstr "수리된 3mf 파일에 부피가 없습니다" msgid "Repaired 3mf file contains more than one volume" -msgstr "수리된 3mf 파일에 둘 이상의 용량가 포함되어 있습니다" +msgstr "수리된 3mf 파일에 둘 이상의 부피가 포함되어 있습니다" msgid "Repair finished" msgstr "수리 완료" @@ -6764,7 +6756,7 @@ msgstr "수리 취소됨" #, boost-format msgid "Copying of file %1% to %2% failed: %3%" -msgstr "파일 %1%를 %2%(으)로 복사 실패: %3%" +msgstr "파일 %1%을(를) %2%(으)로 복사 실패: %3%" msgid "Need to check the unsaved changes before configuration updates." msgstr "구성 업데이트 전에 저장되지 않은 변경 사항을 확인해야 합니다." @@ -6779,11 +6771,12 @@ msgid "" "One object has empty initial layer and can't be printed. Please Cut the " "bottom or enable supports." msgstr "" -"개체 하나에 초기 레이어가 비어 있어 출력할수 없습니다. 바닥을 자르거나 서포트를 활성화하십시오." +"개체 하나에 초기 레이어가 비어 있어 출력할 수 없습니다. 바닥을 자르거나 지지" +"대를 활성화하십시오." #, boost-format msgid "Object can't be printed for empty layer between %1% and %2%." -msgstr "%1%에서 %2% 사이의 빈 레이어에 대해 개체를 출력할수 없습니다." +msgstr "%1%에서 %2% 사이의 빈 레이어에 대해 개체를 출력할 수 없습니다." #, boost-format msgid "Object: %1%" @@ -6793,11 +6786,11 @@ msgid "" "Maybe parts of the object at these height are too thin, or the object has " "faulty mesh" msgstr "" -"이 높이에 있는 개체의 일부가 너무 얇거나 개체에 결함이 있는 메쉬가 있을수 있" +"이 높이에 있는 개체의 일부가 너무 얇거나 개체에 결함이 있는 메쉬가 있을 수 있" "습니다" msgid "No object can be printed. Maybe too small" -msgstr "개체를 출력할수 없습니다. 너무 작을수 있습니다" +msgstr "개체를 출력할 수 없습니다. 너무 작을 수 있습니다" msgid "" "Failed to generate gcode for invalid custom G-code.\n" @@ -6820,13 +6813,13 @@ msgid "Outer wall" msgstr "외벽" msgid "Overhang wall" -msgstr "오버행 벽" +msgstr "돌출벽(오버행)" msgid "Sparse infill" -msgstr "드문 내부채움" +msgstr "드문 내부 채움" msgid "Internal solid infill" -msgstr "꽉찬 내부채움" +msgstr "내부 꽉찬 내부 채움" msgid "Top surface" msgstr "상단 표면" @@ -6835,33 +6828,34 @@ msgid "Bottom surface" msgstr "하단 표면" msgid "Internal Bridge" -msgstr "내부 브리지" +msgstr "내부 다리" msgid "Gap infill" -msgstr "갭 내부채움" +msgstr "갭 채움" msgid "Skirt" msgstr "스커트" msgid "Support interface" -msgstr "서포트 접점" +msgstr "지지대 접점" msgid "Support transition" -msgstr "서포트 전환" +msgstr "지지대 전환" msgid "Multiple" msgstr "다수" #, boost-format msgid "Failed to calculate line width of %1%. Can not get value of \"%2%\" " -msgstr "%1%의 선 너비를 계산하지 못했습니다. \"%2%\"의 값을 가져올수 없습니다 " +msgstr "" +"%1%의 선 너비를 계산하지 못했습니다. \"%2%\"의 값을 가져올 수 없습니다 " msgid "" "Invalid spacing supplied to Flow::with_spacing(), check your layer height " "and extrusion width" msgstr "" "Flow::with_spacing()에 잘못된 간격이 제공되었습니다. 레이어 높이와 돌출 너비" -"를 확인하세요." +"를 확인하세요" msgid "undefined error" msgstr "정의되지 않은 오류" @@ -6873,7 +6867,7 @@ msgid "file too large" msgstr "파일이 너무 큽니다" msgid "unsupported method" -msgstr "서포트 재료 없는 방식" +msgstr "지지대 재료 없는 방식" msgid "unsupported encryption" msgstr "지원되지 않는 암호화" @@ -6945,7 +6939,7 @@ msgid "internal error" msgstr "내부 오류" msgid "file not found" -msgstr "파일을 찾을수 없습니다" +msgstr "파일을 찾을 수 없습니다" msgid "archive too large" msgstr "아카이브가 너무 큼" @@ -6960,38 +6954,40 @@ msgstr "쓰기 호출 실패" msgid "" "%1% is too close to exclusion area, there may be collisions when printing." msgstr "" -"%1% 가 제외 영역에 너무 가깝습니다. 출력시 충돌이 발생 할수 있습니다." +"%1% 이(가) 제외 영역에 너무 가깝습니다. 출력 시 충돌이 발생 할 수 있습니다." #, boost-format msgid "%1% is too close to others, and collisions may be caused." -msgstr "%1% 가 다른 개체와 너무 가까워 출력시 충돌이 발생 할수 있습니다." +msgstr "%1% 이(가) 다른 개체와 너무 가까워 출력 시 충돌이 발생 할 수 있습니다." #, boost-format msgid "%1% is too tall, and collisions will be caused." -msgstr "%1% (이)가 너무 높아서 충돌이 출력시 발생할수 있습니다." +msgstr "%1% (이)가 너무 높아서 충돌이 출력 시 발생할 수 있습니다." msgid " is too close to others, there may be collisions when printing." -msgstr " 가 다른 개체와 너무 가까워 출력시 충돌이 발생 할수 있습니다." +msgstr " 이(가) 다른 개체와 너무 가까워 출력 시 충돌이 발생 할 수 있습니다." msgid " is too close to exclusion area, there may be collisions when printing." -msgstr " 가 제외 영역에 너무 가깝습니다. 출력시 충돌이 발생 할수 있습니다." +msgstr "" +" 이(가) 제외 영역에 너무 가깝습니다. 출력 시 충돌이 발생 할 수 있습니다." msgid "Prime Tower" msgstr "프라임 타워" msgid " is too close to others, and collisions may be caused.\n" -msgstr " 가 다른 개체와 너무 가까워 출력시 충돌이 발생 할수 있습니다.\n" +msgstr " 이(가) 다른 개체와 너무 가까워 출력 시 충돌이 발생 할 수 있습니다.\n" msgid " is too close to exclusion area, and collisions will be caused.\n" -msgstr " 가 제외 영역에 너무 가깝습니다. 출력시 충돌이 발생 할수 있습니다.\n" +msgstr "" +" 이(가) 제외 영역에 너무 가깝습니다. 출력 시 충돌이 발생 할 수 있습니다.\n" msgid "" "Can not print multiple filaments which have large difference of temperature " "together. Otherwise, the extruder and nozzle may be blocked or damaged " "during printing" msgstr "" -"온도 차이가 큰 필라멘트를 여러 개 함께 출력할수 없습니다." -"그렇지 않으면 출력 중에 압출기와 노즐이 막히거나 손상될수 있습니다" +"온도 차이가 큰 필라멘트를 여러 개 함께 출력할 수 없습니다. 그렇지 않으면 출" +"력 중에 압출기와 노즐이 막히거나 손상될 수 있습니다" msgid "No extrusions under current settings." msgstr "현재 설정에 압출기가 없습니다." @@ -7000,13 +6996,14 @@ msgid "" "Smooth mode of timelapse is not supported when \"by object\" sequence is " "enabled." msgstr "" -"시간 경과의 유연 모드는 \"개체별\" 출력순서가 활성화된 경우 지원되지 않습니다." +"타임랩스의 유연 모드는 \"개체별\" 출력순서가 ​​활성화된 경우 지원되지 않습니다." msgid "" "Please select \"By object\" print sequence to print multiple objects in " "spiral vase mode." msgstr "" -"나선 꽃병 모드에서 여러 개체를 출력하려면 \"개체별\" 출력 순서를 선택하십시오." +"나선 꽃병 모드에서 여러 개체를 출력하려면 \"개체별\" 출력 순서를 선택하십시" +"오." msgid "" "The spiral vase mode does not work when an object contains more than one " @@ -7016,23 +7013,24 @@ msgstr "" #, boost-format msgid "The object %1% exceeds the maximum build volume height." -msgstr "%1% 개체가 최대 빌드용량 높이를 초과합니다." +msgstr "%1% 개체가 최대 빌드 부피 높이를 초과합니다." #, boost-format msgid "" "While the object %1% itself fits the build volume, its last layer exceeds " "the maximum build volume height." msgstr "" -"%1% 개체 자체가 빌드용량 맞지만 마지막 레이어가 최대 빌드용량 높이를 초과합니다." +"%1% 개체 자체가 빌드 부피에 맞지만 마지막 레이어가 최대 빌드 부피 높이를 초과" +"합니다." msgid "" "You might want to reduce the size of your model or change current print " "settings and retry." msgstr "" -"모델 크기를 줄이거나 현재 출력 설정을 변경하고 다시 시도할수 있습니다." +"모델 크기를 줄이거나 현재 출력 설정을 변경하고 다시 시도할 수 있습니다." msgid "Variable layer height is not supported with Organic supports." -msgstr "유기적 지원에서는 가변 레이어 높이가 지원되지 않습니다." +msgstr "유기체 지지대에서는 가변 레이어 높이가 지원되지 않습니다." msgid "The prime tower is not supported in \"By object\" print." msgstr "프라임 타워는 \"개체별\" 출력에서 지원되지 않습니다." @@ -7045,7 +7043,7 @@ 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 "프라임 타워는 모든 개체의 레이어 높이가 동일해야 합니다" @@ -7059,8 +7057,7 @@ msgstr "" msgid "" "The prime tower requires that all objects are sliced with the same layer " "heights." -msgstr "" -"프라임 타워는 모든 개체가 동일한 레이어 높이로 슬라이스되어야 합니다." +msgstr "프라임 타워는 모든 개체가 동일한 레이어 높이로 슬라이스되어야 합니다." msgid "" "The prime tower is only supported if all objects have the same variable " @@ -7076,35 +7073,33 @@ msgstr "선 너비가 너무 큽니다" msgid "" "The prime tower requires that support has the same layer height with object." -msgstr "" -"프라임 타워는 서포트가 개체와 동일한 레이어 높이를 갖도록 요구합니다." +msgstr "프라임 타워는 지지대가 개체와 동일한 레이어 높이를 갖도록 요구합니다." msgid "" "Organic support tree tip diameter must not be smaller than support material " "extrusion width." msgstr "" -"유기체 트리 서포트 끝 직경은 서포트 재료 압출 너비보다 작아서는 안 됩니다." +"유기체 지지대 나무 끝 직경은 지지대 재료 압출 너비보다 작아서는 안 됩니다." msgid "" "Organic support branch diameter must not be smaller than 2x support material " "extrusion width." msgstr "" -"유기체 서포트 가지 직경은 서포트 재료 압출 너비의 2배보다 작아서는 안 됩니다." +"유기체 지지대 가지 직경은 지지대 재료 압출 너비의 2배보다 작아서는 안 됩니다." msgid "" "Organic support branch diameter must not be smaller than support tree tip " "diameter." -msgstr "" -"유기체 서포트 가지 직경은 트리 서포트 끝 직경보다 작을수 없습니다." +msgstr "유기체 지지대 가지 직경은 지지대 나무 끝 직경보다 작을 수 없습니다." msgid "" "Support enforcers are used but support is not enabled. Please enable support." msgstr "" -"서포트 강제가 사용되지만 서포트가 활성화되지 않습니다." -"서포트를 활성화하십시오." +"지지대 강제기가 사용되지만 지지대가 활성화되지 않습니다. 지지대를 활성화하십" +"시오." msgid "Layer height cannot exceed nozzle diameter" -msgstr "레이어 높이는 노즐 직경을 초과할수 없습니다" +msgstr "레이어 높이는 노즐 직경을 초과할 수 없습니다" msgid "" "Relative extruder addressing requires resetting the extruder position at " @@ -7129,10 +7124,10 @@ msgstr "" #, c-format, boost-format msgid "Plate %d: %s does not support filament %s" -msgstr "%d: %s 베드는 %s 필라멘트를 지원하지 않습니다" +msgstr "%d: %s 플레이트는 %s 필라멘트를 지원하지 않습니다" msgid "Generating skirt & brim" -msgstr "스커트 & 브림 생성 중" +msgstr "스커트 & 챙(브림) 생성 중" msgid "Exporting G-code" msgstr "G코드 내보내는 중" @@ -7141,7 +7136,7 @@ msgid "Generating G-code" msgstr "G코드 생성 중" msgid "Failed processing of the filename_format template." -msgstr "파일 이름 형식 템플릿 처리에 실패했습니다." +msgstr "파일 이름 형식(filename_format) 템플릿 처리에 실패했습니다." msgid "Printable area" msgstr "출력 가능 영역" @@ -7154,8 +7149,8 @@ msgid "" "left corner to cut filament during filament change. The area is expressed as " "polygon by points in following format: \"XxY, XxY, ...\"" msgstr "" -"XY 평면에서 출력할수 없는 영역입니다. 예를 들어, X1 시리즈 프린터는 필라멘트 " -"교체 중에 필라멘트를 절단하기 위해 전면 왼쪽 모서리를 사용합니다. 영역은 " +"XY 평면에서 출력할 수 없는 영역입니다. 예를 들어, X1 시리즈 프린터는 필라멘" +"트 교체 중에 필라멘트를 절단하기 위해 전면 왼쪽 모서리를 사용합니다. 영역은 " "\"XxY, XxY...\" 형식의 점으로 다각형으로 표시됩니다" msgid "Bed custom texture" @@ -7171,7 +7166,8 @@ msgid "" "Shrink the initial layer on build plate to compensate for elephant foot " "effect" msgstr "" -"코끼리 발 효과를 보정하기 위해 베드의 초기 레이어를 축소합니다" +"코끼리 발 효과(Elephant foot effect)를 보정하기 위해 빌드 플레이트의 초기 레" +"이어를 축소합니다" msgid "" "Slicing height for each layer. Smaller layer height means more accurate and " @@ -7184,7 +7180,7 @@ msgid "Printable height" msgstr "출력 가능 높이" msgid "Maximum printable height which is limited by mechanism of printer" -msgstr "프린터 장치에 의해 제한되는 출력 가능한 최대 높이" +msgstr "프린터 기계장치에 의해 제한되는 출력 가능한 최대 높이" msgid "Printer preset names" msgstr "프린터 사전 설정 이름" @@ -7199,10 +7195,10 @@ msgid "" "name and password into the URL in the following format: https://username:" "password@your-octopi-address/" msgstr "" -"Slic3r은 G코드 파일을 프린터 호스트에 업로드할수 있습니다. 이 필드에는 프린" +"Slic3r은 G코드 파일을 프린터 호스트에 업로드할 수 있습니다. 이 필드에는 프린" "터 호스트 인스턴스의 호스트 이름, IP 주소 또는 URL이 포함되어야 합니다. 기본 " "인증이 활성화된 HAProxy 뒤의 출력 호스트는 https://username:password@your-" -"octopi-address/ 형식의 URL에 사용자 이름과 암호를 입력하여 액세스할수 있습니" +"octopi-address/ 형식의 URL에 사용자 이름과 암호를 입력하여 액세스할 수 있습니" "다" msgid "Device UI" @@ -7220,7 +7216,7 @@ msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." msgstr "" -"Slic3r은 G코드 파일을 프린터 호스트에 업로드할수 있습니다. 이 필드에는 인증" +"Slic3r은 G코드 파일을 프린터 호스트에 업로드할 수 있습니다. 이 필드에는 인증" "에 필요한 API 키 또는 비밀번호가 포함되어야 합니다." msgid "Name of the printer" @@ -7235,7 +7231,7 @@ msgid "" "is used." msgstr "" "사용자 지정 CA 인증서 파일은 crt/pem 형식의 HTTPS OctoPrint 연결에 대해 지정" -"할수 있습니다. 비워 두면 기본 OS CA 인증서 저장소가 사용됩니다." +"할 수 있습니다. 비워 두면 기본 OS CA 인증서 저장소가 사용됩니다." msgid "User" msgstr "사용자" @@ -7252,7 +7248,7 @@ msgid "" "certificates if connection fails." msgstr "" "배포 지점이 없거나 오프라인인 경우 HTTPS 인증서 해지 검사를 무시합니다. 연결" -"이 실패할 경우 자체 서명된 인증서에 대해 이 옵션을 사용할수 있습니다." +"이 실패할 경우 자체 서명된 인증서에 대해 이 옵션을 사용할 수 있습니다." msgid "Names of presets related to the physical printer" msgstr "물리적 프린터 관련 사전 설정 이름" @@ -7270,7 +7266,8 @@ msgid "Avoid crossing wall" msgstr "벽 가로지름 방지" msgid "Detour and avoid to travel across wall which may cause blob on surface" -msgstr "벽을 가로질러 이동하지 않고 우회하여 표면에 방울 발생을 방지합니다" +msgstr "" +"벽을 가로질러 이동하지 않고 우회하여 표면에 방울(Blob) 발생을 방지합니다" msgid "Avoid crossing wall - Max detour length" msgstr "벽 가로지름 방지 - 최대 우회 길이" @@ -7295,8 +7292,8 @@ msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Cool Plate" msgstr "" -"초기 레이어를 제외한 레이어의 베드 온도. 값 0은 필라멘트가 쿨 베드 출력을 지" -"원하지 않음을 의미합니다" +"초기 레이어를 제외한 레이어의 베드 온도. 값 0은 필라멘트가 쿨 플레이트 출력" +"을 지원하지 않음을 의미합니다" msgid "°C" msgstr "°C" @@ -7305,15 +7302,15 @@ msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Engineering Plate" msgstr "" -"초기 레이어를 제외한 레이어의 베드 온도. 값 0은 필라멘트가 엔지니어링 베드" -"출력을 지원하지 않음을 의미합니다" +"초기 레이어를 제외한 레이어의 베드 온도. 값 0은 필라멘트가 엔지니어링 플레이" +"트 출력을 지원하지 않음을 의미합니다" msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the High Temp Plate" msgstr "" -"초기 레이어를 제외한 레이어의 베드 온도. 값 0은 필라멘트가 고온 베드 출력을 " -"지원하지 않음을 의미합니다" +"초기 레이어를 제외한 레이어의 베드 온도. 값 0은 필라멘트가 고온 플레이트 출력" +"을 지원하지 않음을 의미합니다" msgid "" "Bed temperature for layers except the initial one. Value 0 means the " @@ -7332,34 +7329,38 @@ msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Cool Plate" msgstr "" -"초기 레이어의 베드 온도. 값 0은 필라멘트가 쿨 베드 출력을 지원하지 않음을 의미합니다" +"초기 레이어의 베드 온도. 값 0은 필라멘트가 쿨 플레이트 출력을 지원하지 않음" +"을 의미합니다" msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Engineering Plate" msgstr "" -"초기 레이어의 베드 온도. 값 0은 필라멘트가 쿨 베드 출력을 지원하지 않음을 의미합니다" +"초기 레이어의 베드 온도. 값 0은 필라멘트가 쿨 플레이트 출력을 지원하지 않음" +"을 의미합니다" msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the High Temp Plate" msgstr "" -"초기 레이어의 베드 온도입니다. 값 0은 필라멘트가 고온 베드 출력을 지원하지 않음을 의미합니다" +"초기 레이어의 베드 온도입니다. 값 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 베드 출력을 지원하지 않음을 의미합니다" +"초기 레이어의 베드 온도. 값 0은 필라멘트가 텍스처 PEI 플레이트 출력을 지원하" +"지 않음을 의미합니다" msgid "Bed types supported by the printer" msgstr "프린터가 지원하는 침대 유형" msgid "Cool Plate" -msgstr "쿨 베드" +msgstr "쿨 플레이트" msgid "Engineering Plate" -msgstr "엔지니어링 베드" +msgstr "엔지니어링 플레이트" msgid "First layer print sequence" msgstr "첫 레이어 출력 순서" @@ -7390,32 +7391,32 @@ msgid "" msgstr "" "하단 쉘 레이어로 계산된 두께가 이 값보다 얇은 경우 슬라이싱할 때 하단 꽉찬 레" "이어의 수가 증가합니다. 이렇게 하면 레이어 높이가 작을 때 쉘이 너무 얇아지는 " -"것을 방지할수 있습니다. 0은 이 설정이 비활성화되고 하단 쉘의 두께가 절대적으" +"것을 방지할 수 있습니다. 0은 이 설정이 비활성화되고 하단 쉘의 두께가 절대적으" "로 하단 쉘 레이어에 의해 결정됨을 의미합니다" msgid "Force cooling for overhang and bridge" -msgstr "오버행 및 브리지 강제 냉각" +msgstr "돌출부 및 다리 강제 냉각" msgid "" "Enable this option to optimize part cooling fan speed for overhang and " "bridge to get better cooling" msgstr "" -"냉각 향상을 위해 오버행 및 다리에 대한 출력물 냉각 팬 속도를 최적화하려면 이 " +"냉각 향상을 위해 돌출부 및 다리에 대한 출력물 냉각 팬 속도를 최적화하려면 이 " "옵션을 활성화합니다" msgid "Fan speed for overhang" -msgstr "오버행 팬 속도" +msgstr "돌출부 팬 속도" msgid "" "Force part cooling fan to be this speed when printing bridge or overhang " "wall which has large overhang degree. Forcing cooling for overhang and " "bridge can get better quality for these part" msgstr "" -"오버행 정도가 큰 다리나 오버행 벽을 출력할 때 출력물 냉각 팬을 이 속도로 강제" -"합니다. 오버행과 다리를 강제 냉각하면 이러한 부품의 품질이 향상될수 있습니다" +"돌출부 정도가 큰 다리나 돌출부 벽을 출력할 때 출력물 냉각 팬을 이 속도로 강제" +"합니다. 돌출부와 다리를 강제 냉각하면 이러한 부품의 품질이 향상될 수 있습니다" msgid "Cooling overhang threshold" -msgstr "오버행 냉각 임계값" +msgstr "돌출부 냉각 임계값" #, c-format msgid "" @@ -7424,31 +7425,31 @@ msgid "" "of the line without support from lower layer. 0% means forcing cooling for " "all outer wall no matter how much overhang degree" msgstr "" -"출력물의 오버행 정도가 이 값을 초과하면 냉각 팬이 특정 속도가 되도록 강제합니" -"다. 지원(Support)이 없는 하단 레이어 선 너비의 백분율로 표시됩니다. 0은 오버" -"행 정도에 관계없이 모든 외벽을 강제 냉각한다는 의미입니다" +"출력물의 돌출부 정도가 이 값을 초과하면 냉각 팬이 특정 속도가 되도록 강제합니" +"다. 지지대가 없는 하단 레이어 선 너비의 백분율로 표시됩니다. 0은 돌출부 정도" +"에 관계없이 모든 외벽을 강제 냉각한다는 의미입니다" msgid "Bridge infill direction" -msgstr "브리지 내부채움 방향" +msgstr "다리 내부 채움 방향" msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for " "external bridges. Use 180°for zero angle." msgstr "" -"다리채움 각도 재정의. 0°으로 두면 브리지 내부채움 각도가 자동으로 계산됩니다." -"그렇지 않으면 제공된 각도가 외부 브리지 채움에 사용됩니다. 영각은 180°를 " -"사용합니다." +"다리출력 각도 재정의. 0°으로 두면 다리 출력 각도가 자동으로 계산됩니다. 그렇" +"지 않으면 제공된 각도가 외부 다리 출력에 사용됩니다. 영각은 180°를 사용합니" +"다." msgid "Bridge density" -msgstr "브리지 밀도" +msgstr "다리 밀도" msgid "Density of external bridges. 100% means solid bridge. Default is 100%." msgstr "" "외부 다리의 밀도. 100%는 단단한 다리를 의미합니다. 기본값은 100%입니다." msgid "Bridge flow" -msgstr "브리지 압출량" +msgstr "다리 유량" msgid "" "Decrease this value slightly(for example 0.9) to reduce the amount of " @@ -7456,20 +7457,20 @@ msgid "" msgstr "이 값을 약간(예: 0.9) 줄여 다리의 압출량을 줄여 처짐을 개선합니다" msgid "Top surface flow ratio" -msgstr "상단 표면 압출량 비율" +msgstr "상단 표면 유량 비율" msgid "" "This factor affects the amount of material for top solid infill. You can " "decrease it slightly to have smooth surface finish" msgstr "" -"이 인수는 상단 꽉찬 내부채움의 압출량에 영향을 미칩니다. 부드러운 표면 마감" -"을 위해 약간 줄일수 있습니다" +"이 인수는 상단 꽉찬 내부 채움의 압출량에 영향을 미칩니다. 부드러운 표면 마감" +"을 위해 약간 줄일 수 있습니다" msgid "Bottom surface flow ratio" -msgstr "하단 표면 압출량 비율" +msgstr "하단 표면 유량 비율" msgid "This factor affects the amount of material for bottom solid infill" -msgstr "이 인수는 하단 꽉찬 내부채움의 압출량에 영향을 미칩니다" +msgstr "이 인수는 하단 꽉찬 내부 채움의 압출량에 영향을 미칩니다" msgid "Precise wall(experimental)" msgstr "정밀한 벽(실험적)" @@ -7507,8 +7508,8 @@ msgid "" msgstr "" "상단 표면을 출력해야 하고 부분적으로 다른 레이어로 덮여 있는 경우 너비가 이 " "값 미만인 상단 레이어에서는 고려되지 않습니다. 이는 둘레로만 덮여야 하는 표면" -"에서 '상단 둘레 하나'가 발동되지 않도록 하는 데 유용할수 있습니다." -"이 값은 압출 너비의 mm 또는 % o로 설정됩니다.\n" +"에서 '상단 둘레 하나'가 발동되지 않도록 하는 데 유용할 수 있습니다. 이 값은 " +"압출 너비의 mm 또는 % o로 설정됩니다.\n" "경고: 활성화된 경우, 의도치 않은 형상이 생성되는건 다음 레이어에 문자와 같은 " "일부 얇은 형상이 있기 때문입니다. 이러한 형상을 제거하려면 이 값을 0으로 설정" "하십시오." @@ -7523,13 +7524,13 @@ msgstr "" "첫 레이어에 하나의 벽만 사용하여 하단 표면 패턴에 더 많은 공간을 제공합니다" msgid "Extra perimeters on overhangs" -msgstr "오버행 추가 둘레" +msgstr "돌출부 추가 둘레" msgid "" "Create additional perimeter paths over steep overhangs and areas where " "bridges cannot be anchored. " msgstr "" -"가파른 오버행과 다리를 고정할수 없는 지역 위에 추가 둘레 경로를 만듭니다. " +"가파른 돌출부와 다리를 고정할 수 없는 지역 위에 추가 둘레 경로를 만듭니다. " msgid "Classic mode" msgstr "클래식 모드" @@ -7538,19 +7539,20 @@ msgid "Enable this option to use classic mode" msgstr "클래식 모드를 사용하려면 이 옵션을 활성화합니다" msgid "Slow down for overhang" -msgstr "오버행에서 감속" +msgstr "돌출부에서 감속" msgid "Enable this option to slow printing down for different overhang degree" -msgstr "오버행 정도에 따라 출력 속도를 낮추려면 이 옵션을 활성화합니다" +msgstr "돌출부 정도에 따라 출력 속도를 낮추려면 이 옵션을 활성화합니다" msgid "Slow down for curled perimeters" -msgstr "구부러진 둘레에는 속도를 줄이세요" +msgstr "꺾여 있는 둘레에는 속도를 줄이세요" msgid "" "Enable this option to slow printing down in areas where potential curled " "perimeters may exist" msgstr "" -"주변이 말려 있을수 있는 영역에서 출력 속도를 낮추려면 이 옵션을 활성화하십시오." +"꺾여 있는 둘레가 있을 수 있는 영역에서 출력 속도를 낮추려면 이 옵션을 활성화" +"하십시오" msgid "mm/s or %" msgstr "mm/s or %" @@ -7559,7 +7561,7 @@ msgid "External" msgstr "외부" msgid "Speed of bridge and completely overhang wall" -msgstr "다리와 완전히 돌출된 오버행 벽의 속도" +msgstr "다리와 완전히 돌출된 돌출부 벽의 속도" msgid "mm/s" msgstr "mm/s" @@ -7571,54 +7573,55 @@ msgid "" "Speed of internal bridge. If the value is expressed as a percentage, it will " "be calculated based on the bridge_speed. Default value is 150%." msgstr "" -"내부 브리지 속도. 값을 백분율로 표시하면 외부 브리지 속도를 기준으로 계산됩니다." -"기본값은 150%입니다." +"내부 다리 속도. 값을 백분율로 표시하면 외부 다리 속도(bridge_speed)를 기준으" +"로 계산됩니다. 기본값은 150%입니다." msgid "Brim width" -msgstr "브림 너비" +msgstr "챙(브림) 너비" msgid "Distance from model to the outermost brim line" -msgstr "모델과 가장 바깥쪽 브림 선까지의 거리" +msgstr "모델과 가장 바깥쪽 챙(브림) 선까지의 거리" msgid "Brim type" -msgstr "브림 유형" +msgstr "챙(브림) 유형" msgid "" "This controls the generation of the brim at outer and/or inner side of " "models. Auto means the brim width is analysed and calculated automatically." msgstr "" -"모델의 외부 그리고/또는 내부에서 브림의 생성을 제어합니다. 자동은 브림(브림) " -"너비가 자동으로 분석 및 계산됨을 의미합니다." +"모델의 외부 그리고/또는 내부에서 챙(브림)의 생성을 제어합니다. 자동은 챙(브" +"림) 너비가 자동으로 분석 및 계산됨을 의미합니다." msgid "Brim-object gap" -msgstr "브림-개체 간격" +msgstr "챙(브림)-개체 간격" msgid "" "A gap between innermost brim line and object can make brim be removed more " "easily" msgstr "" -"가장 안쪽 브림 라인과 개체 사이에 간격을 주어 쉽게 브림을 제거 할수 있게 합니다" +"가장 안쪽 챙(브림) 라인과 개체 사이에 간격을 주어 쉽게 챙(브림)을 제거 할 수 " +"있게 합니다" msgid "Brim ears" -msgstr "브림 귀" +msgstr "챙(브림) 귀" msgid "Only draw brim over the sharp edges of the model." -msgstr "모델의 날카로운 가장자리에만 브림을 그립니다." +msgstr "모델의 날카로운 가장자리에만 챙을 그립니다." msgid "Brim ear max angle" -msgstr "브림 귀 최대 각도" +msgstr "챙(브림) 귀 최대 각도" msgid "" "Maximum angle to let a brim ear appear. \n" "If set to 0, no brim will be created. \n" "If set to ~180, brim will be created on everything but straight sections." msgstr "" -"브림 귀가 나타날수 있는 최대 각도.\n" -"0으로 설정하면 브림이 생성되지 않습니다.\n" -"~180으로 설정하면 직선 부분을 제외한 모든 부분에 브림이 생성됩니다." +"챙 귀가 나타날 수 있는 최대 각도.\n" +"0으로 설정하면 챙이 생성되지 않습니다.\n" +"~180으로 설정하면 직선 부분을 제외한 모든 부분에 챙이 생성됩니다." msgid "Brim ear detection radius" -msgstr "브림 귀 감지 반경" +msgstr "챙 귀 감지 반경" msgid "" "The geometry will be decimated before dectecting sharp angles. This " @@ -7664,7 +7667,7 @@ msgid "" msgstr "" "이 옵션을 활성화하여 최종 레이어 시간이 \"최대 팬 속도 임계값\" 의 \"레이어 " "시간\" 임계값보다 짧지 않도록 출력 속도를 낮추어 레이어를 더 오랫동안 냉각할 " -"수 있습니다. 바늘 모양이나 작은 출력물의 냉각 품질을 향상 시킬수 있습니다" +"수 있습니다. 바늘 모양이나 작은 출력물의 냉각 품질을 향상 시킬 수 있습니다" msgid "Normal printing" msgstr "일반 출력" @@ -7702,10 +7705,11 @@ msgid "" "Speed of exhuast fan during printing.This speed will overwrite the speed in " "filament custom gcode" msgstr "" -"출력 중 배기 팬 속도. 이 속도는 필라멘트 사용자 정의 G코드의 속도를 덮어씁니다" +"출력 중 배기 팬 속도. 이 속도는 필라멘트 사용자 정의 G코드의 속도를 덮어씁니" +"다" msgid "Speed of exhuast fan after printing completes" -msgstr "출력 완료 후 환기 팬 속도" +msgstr "출력 완료 후 배기 팬 속도" msgid "No cooling for the first" msgstr "냉각 중지: 첫레이어~" @@ -7714,52 +7718,53 @@ 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 "layers" msgstr "레이어" msgid "Don't support bridges" -msgstr "브리지 서포트 미생성" +msgstr "다리 지지대 미생성" 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" msgstr "" -"서포트를 크게 만드는 전체 브리지 영역에 서포트 미생성. 다리는 일반적으로 매" -"우 길지 않은 경우 서포트 없이 직접 출력할수 있습니다" +"지지대를 크게 만드는 전체 다리 영역에 지지대 미생성. 다리는 일반적으로 매우 " +"길지 않은 경우 지지대 없이 직접 출력할 수 있습니다" msgid "Thick bridges" -msgstr "두꺼운 브리지" +msgstr "두꺼운 다리" msgid "" "If enabled, bridges are more reliable, can bridge longer distances, but may " "look worse. If disabled, bridges look better but are reliable just for " "shorter bridged distances." msgstr "" -"활성화하면 브리지는 더 견고해지고 더 먼 거리를 생성할수 있지만 나빠 보일수 있" -"습니다. 비활성화하면 브리지가 더 좋아 보이지만 짧은 브리지 거리에 대해서만 안" -"정적입니다." +"활성화하면 다리는 더 견고해지고 더 먼 거리를 생성할 수 있지만 나빠 보일 수 있" +"습니다. 비활성화하면 다리가 더 좋아 보이지만 짧은 브리지 거리에 대해서만 안정" +"적입니다." msgid "Max bridge length" -msgstr "최대 브리지 거리" +msgstr "최대 다리 거리" 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으" +"로 설정하고 다리에 지지대를 생성하지 않으려면 매우 큰 값으로 설정합니다." msgid "End G-code" -msgstr "종료 G코드" +msgstr "End G-code" msgid "End G-code when finish the whole printing" -msgstr "전체 출력이 끝날때의 종료 G코드" +msgstr "전체 출력이 끝날때의 End G-code" msgid "End G-code when finish the printing of this filament" -msgstr "이 필라멘트의 출력이 끝날때의 종료 G코드" +msgstr "이 필라멘트의 출력이 끝날때의 End G-code" msgid "Ensure vertical shell thickness" msgstr "수직 쉘 두께 확보" @@ -7768,14 +7773,14 @@ msgid "" "Add solid infill near sloping surfaces to guarantee the vertical shell " "thickness (top+bottom solid layers)" msgstr "" -"경사진 표면 근처에 꽉찬 내부채움를 추가하여 수직 쉘 두께를 보장합니다" -"(상단+하단 꽉찬 레이어)" +"경사진 표면 근처에 꽉찬 내부 채움을 추가하여 수직 쉘 두께를 보장합니다(상단" +"+하단 꽉찬 레이어)" msgid "Top surface pattern" msgstr "상단 표면 패턴" msgid "Line pattern of top surface infill" -msgstr "상단 표면 내부채움의 선 패턴" +msgstr "상단 표면 내부 채움의 선 패턴" msgid "Concentric" msgstr "동심" @@ -7805,17 +7810,17 @@ msgid "Bottom surface pattern" msgstr "하단 표면 패턴" msgid "Line pattern of bottom surface infill, not bridge infill" -msgstr "하단 표면 내부채움의 선 패턴, 브리지엔 적용 안됨" +msgstr "하단 표면 내부 채움의 선 패턴, 다리엔 적용 안됨" msgid "Internal solid infill pattern" -msgstr "꽉찬 내부채움 패턴" +msgstr "내부 꽉찬 내부 채움 패턴" msgid "" "Line pattern of internal solid infill. if the detect nattow internal solid " "infill be enabled, the concentric pattern will be used for the small area." msgstr "" -"꽉찬 내부채움의 선 패턴. 좁은 꽉찬 내부채움 감지가 활성화된 경우 작은 영역에 " -"동심 패턴이 사용됩니다." +"내부 꽉찬 내부 채움의 선 패턴. 좁은 내부 꽉찬 내부 채움 감지가 활성화된 경우 " +"작은 영역에 동심 패턴이 사용됩니다." msgid "" "Line width of outer wall. If expressed as a %, it will be computed over the " @@ -7826,8 +7831,8 @@ 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 "" -"가장 바깥쪽의 눈에 보이는 외벽의 속도. 더 나은 품질을 얻기 위해 내벽 속도보다" -"느리게 사용됩니다." +"가장 바깥쪽의 눈에 보이는 외벽의 속도. 더 나은 품질을 얻기 위해 내벽 속도보" +"다 느리게 사용됩니다." msgid "Small perimeters" msgstr "작은 둘레" @@ -7839,37 +7844,36 @@ msgid "" "Set to zero for auto." msgstr "" "이 별도의 설정은 반지름이 가진 둘레의 속도에 영향을 줍니다 <= 작은 둘레 임계" -"값 이하인 둘레(일반적으로 구멍). 백분율로 설정하면(예: 80%) 외벽 속도 설정에" -"서 계산됩니다. 자동의 경우 0으로 설정합니다." +"값(small_perimeter_threshold) 이하인 둘레(일반적으로 구멍). 백분율로 설정하면" +"(예: 80%) 외벽 속도 설정에서 계산됩니다. 자동의 경우 0으로 설정합니다." msgid "Small perimeters threshold" msgstr "작은 둘레 임계값" msgid "" "This sets the threshold for small perimeter length. Default threshold is 0mm" -msgstr "" -"작은 둘레 길이에 대한 임계값을 설정합니다. 기본 임계값은 0mm입니다" +msgstr "작은 둘레 길이에 대한 임계값을 설정합니다. 기본 임계값은 0mm입니다" msgid "Order of inner wall/outer wall/infil" -msgstr "내벽/외벽/내부채움 순서" +msgstr "내벽/외벽/내부 채움 순서" msgid "Print sequence of inner wall, outer wall and infill. " -msgstr "내벽, 외벽 및 내부채움 출력 순서 " +msgstr "내벽, 외벽 및 내부 채움 출력 순서 " msgid "inner/outer/infill" -msgstr "내벽/외벽/내부채움" +msgstr "내벽/외벽/내부 채움" msgid "outer/inner/infill" -msgstr "외벽/내벽/내부채움" +msgstr "외벽/내벽/내부 채움" msgid "infill/inner/outer" -msgstr "내부채움/내벽/외벽" +msgstr "내부 채움/내벽/외벽" msgid "infill/outer/inner" -msgstr "내부채움/외벽/내벽" +msgstr "내부 채움/외벽/내벽" msgid "inner-outer-inner/infill" -msgstr "내벽-외벽-내벽/내부채움" +msgstr "내벽-외벽-내벽/내부 채움" msgid "Height to rod" msgstr "레일까지의 높이" @@ -7886,14 +7890,12 @@ msgstr "덮개까지의 높이" msgid "" "Distance of the nozzle tip to the lid. Used for collision avoidance in by-" "object printing." -msgstr "" -"노즐 끝에서 덮개까지의 거리. 개체별 출력에서 충돌 방지에 사용됩니다." +msgstr "노즐 끝에서 덮개까지의 거리. 개체별 출력에서 충돌 방지에 사용됩니다." msgid "" "Clearance radius around extruder. Used for collision avoidance in by-object " "printing." -msgstr "" -"압출기 주변의 회피 반경. 개체별 출력에서 충돌 방지에 사용됩니다." +msgstr "압출기 주변의 회피 반경. 개체별 출력에서 충돌 방지에 사용됩니다." msgid "Extruder Color" msgstr "압출기 색상" @@ -7905,7 +7907,7 @@ msgid "Extruder offset" msgstr "압출기 오프셋" msgid "Flow ratio" -msgstr "압출량 비율" +msgstr "유량 비율" msgid "" "The material may have volumetric change after switching between molten state " @@ -7914,22 +7916,22 @@ msgid "" "and 1.05. Maybe you can tune this value to get nice flat surface when there " "has slight overflow or underflow" msgstr "" -"재료는 용융 상태와 결정 상태 사이를 전환한 후 용량 변화가 있을수 있습니다. " +"재료는 용융 상태와 결정 상태 사이를 전환한 후 부피 변화가 있을 수 있습니다. " "이 설정은 이 필라멘트 코드의 모든 압출 흐름을 비례적으로 변경합니다. 권장 값 " "범위는 0.95와 1.05 사이입니다. 약간의 과대압출 또는 과소압출이 있을 때 이 값" -"을 조정하여 평평한 표면을 얻을수 있습니다" +"을 조정하여 평평한 표면을 얻을 수 있습니다" msgid "Enable pressure advance" -msgstr "PA 활성화" +msgstr "프레셔 어드밴스 활성화" msgid "" "Enable pressure advance, auto calibration result will be overwriten once " "enabled." msgstr "" -"PA를 활성화합니다. 활성화되면 자동 보정 결과를 덮어씁니다." +"프레셔 어드밴스를 활성화합니다. 활성화되면 자동 보정 결과를 덮어씁니다." msgid "Pressure advance(Klipper) AKA Linear advance factor(Marlin)" -msgstr "PA(Klipper)/리니어 어드밴스(Marlin)" +msgstr "프레셔 어드밴스(Klipper)/리니어 어드밴스(Marlin)" msgid "" "Default line width if other line widths are set to 0. If expressed as a %, " @@ -7972,7 +7974,7 @@ msgid "Filament notes" msgstr "필라멘트 메모" msgid "You can put your notes regarding the filament here." -msgstr "여기에 필라멘트에 관한 메모를 할수 있습니다." +msgstr "여기에 필라멘트에 관한 메모를 할 수 있습니다." msgid "Required nozzle HRC" msgstr "필수 노즐 록웰 경도" @@ -7989,9 +7991,9 @@ msgid "" "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 "" -"이 설정은 초당 얼마나 많은 양의 필라멘트를 녹이고 압출할수 있는지를 나타냅니" -"다너무 높고 부적절한 속도 설정의 경우 출력 속도는 최대 체적 속도에 의해 제한" -"됩니다.0이 될수 없습니다" +"이 설정은 초당 얼마나 많은 양의 필라멘트를 녹이고 압출할 수 있는지를 나타냅니" +"다. 너무 높고 부적절한 속도 설정의 경우 출력 속도는 최대 체적 속도에 의해 제" +"한됩니다. 0이 될 수 없습니다" msgid "mm³/s" msgstr "mm³/s" @@ -8057,8 +8059,7 @@ msgstr "시작 시 빼기 속도" msgid "" "Speed used for unloading the tip of the filament immediately after ramming." -msgstr "" -"래밍 직후 필라멘트 끝을 빼는 데 사용되는 속도입니다." +msgstr "래밍 직후 필라멘트 끝을 빼는 데 사용되는 속도입니다." msgid "Delay after unloading" msgstr "빼기 후 지연" @@ -8069,7 +8070,7 @@ msgid "" "original dimensions." msgstr "" "필라멘트를 뺀 후 기다리는 시간입니다. 원래 치수로 축소되는 데 더 많은 시간이 " -"필요할수 있는 유연한 재료 사용 시 안정적으로 툴 교체를 할수 있게 도움이 될 " +"필요할 수 있는 유연한 재료 사용 시 안정적으로 툴 교체를 할 수 있게 도움이 될 " "수 있습니다." msgid "Number of cooling moves" @@ -8098,10 +8099,10 @@ msgid "" "object, Slic3r will always prime this amount of material into the wipe tower " "to produce successive infill or sacrificial object extrusions reliably." msgstr "" -"툴 교환 후 노즐 내부에 새로 로드된 필라멘트의 정확한 위치를 알수 없으며 필라" -"멘트 압력이 아직 안정적이지 않을수 있습니다. 프린트 헤드를 내부채움 또는 희" +"툴 교환 후 노즐 내부에 새로 로드된 필라멘트의 정확한 위치를 알 수 없으며 필라" +"멘트 압력이 아직 안정적이지 않을 수 있습니다. 프린트 헤드를 내부 채움 또는 희" "생 개체로 청소하기 전에 Slic3r은 항상 이 양의 재료를 닦기 타워로 프라이밍하" -"여 연속적인 내부채움 또는 희생 물체 압출을 안정적으로 생성합니다." +"여 연속적인 내부 채움 또는 희생 물체 압출을 안정적으로 생성합니다." msgid "Speed of the last cooling move" msgstr "마지막 냉각 이동 속도" @@ -8146,21 +8147,21 @@ msgid "" "toolchange. This option is only used when the wipe tower is enabled." msgstr "" "다중 압출기 프린터를 사용할 때 래밍을 수행합니다(예: 프린터 설정에서 '단일 압" -"출기 다중 재료'가 선택 취소된 경우). 활성화하면 툴 교체 직전 닦기타워에 소량" -"의 필라멘트가 빠르게 압출됩니다. 이 옵션은 닦기 타워가 활성화된 경우에만 사용" -"됩니다." +"출기 다중 재료'가 선택 취소된 경우). 활성화하면 툴 교체 직전 와이프타워에 소" +"량의 필라멘트가 빠르게 압출됩니다. 이 옵션은 닦기 타워가 활성화된 경우에만 사" +"용됩니다." msgid "Multitool ramming volume" -msgstr "다중 압출기 래밍용량" +msgstr "다중 압출기 래밍 부피" msgid "The volume to be rammed before the toolchange." -msgstr "툴 교체 전에 래밍할 용량입니다." +msgstr "툴 교체 전에 래밍 할 볼륨입니다." msgid "Multitool ramming flow" -msgstr "다중 압출기 래밍 압출량" +msgstr "다중 압출기 래밍 유량" msgid "Flow used for ramming the filament before the toolchange." -msgstr "툴 교체 전에 필라멘트를 래밍하는 데 사용되는 압출량입니다." +msgstr "툴 교체 전에 필라멘트를 래밍하는 데 사용되는 유량입니다." msgid "Density" msgstr "밀도" @@ -8180,16 +8181,16 @@ msgstr "가용성 재료" msgid "" "Soluble material is commonly used to print support and support interface" msgstr "" -"가용성 재료는 일반적으로 서포트 및 서포트 접점(Interface)을 출력하는 데 사용" +"가용성 재료는 일반적으로 지지대 및 지지대 접점(Interface)을 출력하는 데 사용" "됩니다" msgid "Support material" -msgstr "서포트 재료" +msgstr "지지대 재료" msgid "" "Support material is commonly used to print support and support interface" msgstr "" -"지원 재료는 일반적으로 서포트 및 서포트 접점(Interface)을 출력하는 데 사용됩" +"지원 재료는 일반적으로 지지대 및 지지대 접점(Interface)을 출력하는 데 사용됩" "니다" msgid "Temperature of vitrificaiton" @@ -8200,7 +8201,7 @@ msgid "" "than this tempature" msgstr "" "이 온도에서는 재료가 부드러워집니다. 따라서 히트베드는 유리 전이 온도보다 더 " -"뜨거울수 없습니다" +"뜨거울 수 없습니다" msgid "Price" msgstr "가격" @@ -8209,7 +8210,7 @@ msgid "Filament price. For statistics only" msgstr "필라멘트 가격. 통계 전용" msgid "money/kg" -msgstr "가격/kg" +msgstr "원/kg" msgid "Vendor" msgstr "제조사" @@ -8221,26 +8222,25 @@ msgid "(Undefined)" msgstr "(정의되지 않음)" msgid "Infill direction" -msgstr "내부채움 방향" +msgstr "내부 채움 방향" msgid "" "Angle for sparse infill pattern, which controls the start or main direction " "of line" -msgstr "" -"선의 시작 또는 주 방향을 제어하는 드문 내부채움 패턴에 대한 각도" +msgstr "선의 시작 또는 주 방향을 제어하는 드문 내부 채움 패턴에 대한 각도" msgid "Sparse infill density" -msgstr "드문 내부채움 밀도" +msgstr "드문 내부 채움 밀도" #, c-format msgid "Density of internal sparse infill, 100% means solid throughout" -msgstr "내부 드문 내부채움 밀도, 100은 전체가 꽉찬 내부채움임을 의미합니다" +msgstr "내부 드문 내부 채움 밀도, 100은 전체가 꽉찬 내부 채움임을 의미합니다" msgid "Sparse infill pattern" -msgstr "드문 내부채움 패턴" +msgstr "드문 내부 채움 패턴" msgid "Line pattern for internal sparse infill" -msgstr "내부 드문 내부채움의 선 패턴" +msgstr "내부 드문 내부 채움의 선 패턴" msgid "Grid" msgstr "격자" @@ -8267,13 +8267,13 @@ msgid "3D Honeycomb" msgstr "3D 벌집" msgid "Support Cubic" -msgstr "정육면체 서포트형" +msgstr "정육면체 지지대형" msgid "Lightning" msgstr "번개" msgid "Sparse infill anchor length" -msgstr "드문 내부채움 고정점 길이" +msgstr "드문 내부 채움 고정점 길이" msgid "" "Connect an infill line to an internal perimeter with a short segment of an " @@ -8286,23 +8286,23 @@ msgid "" "Set this parameter to zero to disable anchoring perimeters connected to a " "single infill line." msgstr "" -"짧은 추가 윤곽선을 사용하여 내부채움 선에 연결합니다. 백분율(예: 15%)로 표시" -"되는 경우 내부채움 선 너비에 대해 계산됩니다. Slic3r은 두 개의 가까운 내부채" -"움 선을 짧은 주변 구간에 연결하려고 시도합니다. 내부채움 고정점 최대 길이" -"(infill_anchor_max)보다 짧은 주변 구간이 발견되지 않으면 내부채움 선은 한쪽에" -"서만 주변 구간에 연결됩니다. 가져온 주변 구간의 길이는 이 매개변수로 제한되지" -"만 anchor_length_max보다 길지 않습니다.\n" -"단일 내부채움 선에 연결된 고정 주변을 비활성화하려면 이 매개변수를 0으로 설정" -"합니다." +"짧은 추가 윤곽선을 사용하여 내부 채움 선에 연결합니다. 백분율(예: 15%)로 표시" +"되는 경우 내부 채움 선 너비에 대해 계산됩니다. Slic3r은 두 개의 가까운 내부 " +"채움 선을 짧은 주변 구간에 연결하려고 시도합니다. 내부 채움 고정점 최대 길이" +"(infill_anchor_max)보다 짧은 주변 구간이 발견되지 않으면 내부 채움 선은 한쪽" +"에서만 주변 구간에 연결됩니다. 가져온 주변 구간의 길이는 이 매개변수로 제한되" +"지만 anchor_length_max보다 길지 않습니다.\n" +"단일 내부 채움 선에 연결된 고정 주변을 비활성화하려면 이 매개변수를 0으로 설" +"정합니다." msgid "0 (no open anchors)" -msgstr "0 (개방형 고정점 없음)" +msgstr "0(개방형 고정점 없음)" msgid "1000 (unlimited)" msgstr "1000(무제한)" msgid "Maximum length of the infill anchor" -msgstr "내부채움 고정점 최대 길이" +msgstr "내부 채움 고정점 최대 길이" msgid "" "Connect an infill line to an internal perimeter with a short segment of an " @@ -8315,17 +8315,17 @@ 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%)로 표시되" -"는 경우 내부채움 선 너비에 대해 계산됩니다. Slice3r은 두 개의 가까운 내부채" +"내부 채움 선을 짧게 연장하여 내부 둘레에 연결합니다. 백분율(예: 15%)로 표시되" +"는 경우 내부 채움 선 너비에 대해 계산됩니다. Slice3r은 두 개의 가까운 내부 채" "움 선을 짧은 둘레 세그먼트에 연결하려고 시도합니다. 이 매개변수보다 짧은 둘" -"레 세그먼트를 찾을수 없는 경우, 내부채움 선은 한 쪽의 둘레 세그먼트에만 연결" -"되고 취한 둘레 세그먼트의 길이는 infill_anchor로 제한되지만 이 매개변수보다 " -"길지 않습니다.\n" +"레 세그먼트를 찾을 수 없는 경우, 내부 채움 선은 한 쪽의 둘레 세그먼트에만 연" +"결되고 취한 둘레 세그먼트의 길이는 infill_anchor로 제한되지만 이 매개변수보" +"다 길지 않습니다.\n" "0으로 설정하면 주입 연결에 대한 이전 알고리즘이 사용되며, 1000 & 0과 동일한 " "결과가 생성됩니다." msgid "0 (Simple connect)" -msgstr "0 (단순 연결)" +msgstr "0(단순 연결)" msgid "Acceleration of outer walls" msgstr "외벽의 가속도" @@ -8340,10 +8340,10 @@ msgid "" "Acceleration of top surface infill. Using a lower value may improve top " "surface quality" msgstr "" -"상단 표면 가속도. 낮은 값을 사용하면 상단 표면 품질이 향상될수 있습니다" +"상단 표면 가속도. 낮은 값을 사용하면 상단 표면 품질이 향상될 수 있습니다" msgid "Acceleration of outer wall. Using a lower value can improve quality" -msgstr "외벽의 가속도. 낮은 값을 사용하면 품질이 향상 될수 있습니다" +msgstr "외벽의 가속도. 낮은 값을 사용하면 품질이 향상 될 수 있습니다" msgid "" "Acceleration of bridges. If the value is expressed as a percentage (e.g. " @@ -8359,20 +8359,23 @@ msgid "" "Acceleration of sparse infill. If the value is expressed as a percentage (e." "g. 100%), it will be calculated based on the default acceleration." msgstr "" -"드문 내부채움 가속도. 값이 백분율 (ex. 100%)로 표시되면 기본 가속도를 기준으로 계산됩니다." +"드문 내부 채움 가속도. 값이 백분율 (ex. 100%)로 표시되면 기본 가속도를 기준으" +"로 계산됩니다." msgid "" "Acceleration of internal solid infill. If the value is expressed as a " "percentage (e.g. 100%), it will be calculated based on the default " "acceleration." msgstr "" -"꽉찬 내부채움 가속도. 값이 백분율 (ex. 100%)로 표시되면 기본 가속도를 기준으로 계산됩니다." +"내부 꽉찬 내부 채움 가속도. 값이 백분율 (ex. 100%)로 표시되면 기본 가속도를 " +"기준으로 계산됩니다." msgid "" "Acceleration of initial layer. Using a lower value can improve build plate " "adhensive" msgstr "" -"초기 레이어 가속도. 낮은 값을 사용하면 베드 안착률을 높일수 있습니다" +"초기 레이어 가속도. 낮은 값을 사용하면 빌드 플레이트 안착률을 높일 수 있습니" +"다" msgid "Enable accel_to_decel" msgstr "가속/감속 활성화" @@ -8386,8 +8389,7 @@ msgstr "가속/감속" #, c-format, boost-format msgid "" "Klipper's max_accel_to_decel will be adjusted to this %% of acceleration" -msgstr "" -"Klipper의 max_accel_to_decel은 가속도의 %%로 조정됩니다." +msgstr "Klipper의 max_accel_to_decel은 가속도의 %%로 조정됩니다" #, c-format, boost-format msgid "%%" @@ -8403,7 +8405,7 @@ msgid "Jerk for top surface" msgstr "상단 표면 저크" msgid "Jerk for infill" -msgstr "내부채움 저크" +msgstr "내부 채움 저크" msgid "Jerk for initial layer" msgstr "초기 레이어 저크" @@ -8423,17 +8425,17 @@ msgid "" "Height of initial layer. Making initial layer height to be thick slightly " "can improve build plate adhension" msgstr "" -"초기 레이어의 높이입니다. 초기 레이어 높이를 약간 두껍게 하면 베드 안착력을 " -"향상시킬수 있습니다" +"초기 레이어의 높이입니다. 초기 레이어 높이를 약간 두껍게 하면 빌드 플레이트 " +"접착력을 향상시킬 수 있습니다" msgid "Speed of initial layer except the solid infill part" -msgstr "꽉찬 내부채움 부분을 제외한 초기 레이어 속도" +msgstr "꽉찬 내부 채움 부분을 제외한 초기 레이어 속도" msgid "Initial layer infill" -msgstr "초기 레이어 내부채움" +msgstr "초기 레이어 내부 채움" msgid "Speed of solid infill part of initial layer" -msgstr "초기 레이어의 꽉찬 내부채움 속도" +msgstr "초기 레이어의 꽉찬 내부 채움 속도" msgid "Initial layer travel speed" msgstr "초기 레이어 이동 속도" @@ -8473,7 +8475,7 @@ msgstr "" "\"close_fan_the_first_x_layers\" + 1 에서 최대 허용 속도로 가도됩니다." msgid "Support interface fan speed" -msgstr "서포트 인터페이스 팬 속도" +msgstr "지지대 접점(Interface) 팬 속도" msgid "" "This fan speed is enforced during all support interfaces, to be able to " @@ -8481,10 +8483,10 @@ msgid "" "Set to -1 to disable this override.\n" "Can only be overriden by disable_fan_first_layers." msgstr "" -"이 설정값은 높은 팬 속도로 접점의 결합을 약화시킬수 있도록 모든 서포트 접점" +"이 설정값은 높은 팬 속도로 접점의 결합을 약화시킬 수 있도록 모든 지지대 접점" "(Support interface)에 적용됩니다.\n" "사용하지 않으려면 -1로 설정합니다.\n" -"disable_fan_first_layers로만 재정의할수 있습니다." +"disable_fan_first_layers로만 재정의할 수 있습니다." msgid "" "Randomly jitter while printing the wall, so that the surface has a rough " @@ -8506,7 +8508,7 @@ msgid "All walls" msgstr "모든 벽" msgid "Fuzzy skin thickness" -msgstr "흐린 스킨 두께" +msgstr "퍼지 스킨 두께" msgid "" "The width within which to jitter. It's adversed to be below outer wall line " @@ -8514,13 +8516,12 @@ msgid "" msgstr "임의로 움직일 너비입니다. 외벽 선 너비 보다 얇게 하는 것이 좋습니다" msgid "Fuzzy skin point distance" -msgstr "흐린 스킨 지점 거리" +msgstr "퍼지 스킨 지점 거리" msgid "" "The average diatance between the random points introducded on each line " "segment" -msgstr "" -"각 선의 분절에 도입된 임의의 지점간 평균 거리" +msgstr "각 선의 분절에 도입된 임의의 지점간 평균 거리" msgid "Filter out tiny gaps" msgstr "작은 갭 필터링" @@ -8539,7 +8540,7 @@ msgid "" "Speed of gap infill. Gap usually has irregular line width and should be " "printed more slowly" msgstr "" -"갭 내부채움 속도. 갭은 일반적으로 불규칙한 선 너비를 가지며 더 느리게 출력되" +"갭 내부 채움 속도. 갭은 일반적으로 불규칙한 선 너비를 가지며 더 느리게 출력되" "어야 합니다" msgid "Arc fitting" @@ -8556,7 +8557,9 @@ msgid "Add line number" msgstr "라인 번호 추가" msgid "Enable this to add line number(Nx) at the beginning of each G-Code line" -msgstr "각 G코드 라인의 시작 부분에 라인 번호(Nx)를 추가하려면 이 기능을 활성화하십시오" +msgstr "" +"각 G코드 라인의 시작 부분에 라인 번호(Nx)를 추가하려면 이 기능을 활성화하십시" +"오" msgid "Scan first layer" msgstr "첫 레이어 스캔" @@ -8565,7 +8568,7 @@ msgid "" "Enable this to enable the camera on printer to check the quality of first " "layer" msgstr "" -"프린터의 카메라가 첫 레이어의 품질을 확인할수 있도록 하려면 이 옵션을 활성화" +"프린터의 카메라가 첫 레이어의 품질을 확인할 수 있도록 하려면 이 옵션을 활성화" "하십시오" msgid "Nozzle type" @@ -8579,16 +8582,16 @@ msgstr "" "수 있는지를 결정합니다" msgid "Undefine" -msgstr "알수없음" +msgstr "Undefine" msgid "Hardened steel" -msgstr "경화강 노즐" +msgstr "Hardened steel" msgid "Stainless steel" -msgstr "스테인레스강 노즐" +msgstr "Stainless steel" msgid "Brass" -msgstr "동 노즐" +msgstr "Brass" msgid "Nozzle HRC" msgstr "노즐 록웰 경도(HRC)" @@ -8621,10 +8624,10 @@ msgid "Delta" msgstr "Delta" msgid "Best object position" -msgstr "최고의 개체 위치" +msgstr "가장 좋은 개체 위치" msgid "Best auto arranging position in range [0,1] w.r.t. bed shape." -msgstr "w.r.t. 베드 모양 범위 [0,1] 내에서 가장 좋은 자동 정렬 위치입니다" +msgstr "베드 모양 w.r.t. 범위 [0,1] 내에서 가장 좋은 자동 정렬 위치입니다." msgid "Enable this option if machine has auxiliary part cooling fan" msgstr "기계에 보조 출력물 냉각 팬이 있는 경우 이 옵션 사용" @@ -8640,7 +8643,7 @@ msgid "" "gcode' is activated.\n" "Use 0 to deactivate." msgstr "" -"목표한 시작 시간보다 이 시간(소수 초를 사용할수 있음) 일찍 팬을 시작합니다. " +"목표한 시작 시간보다 이 시간(소수 초를 사용할 수 있음) 일찍 팬을 시작합니다. " "이 시간 추정을 위해 무한 가속을 가정하고 G1 및 G0 이동만 고려합니다(원호 맞춤" "은 지원되지 않음).\n" "사용자 지정 G코드에서 팬 명령을 이동하지 않습니다(일종의 '장벽' 역할을 함).\n" @@ -8649,10 +8652,10 @@ msgstr "" "비활성화하려면 0을 사용하십시오." msgid "Only overhangs" -msgstr "오버행 만" +msgstr "돌출부 만" msgid "Will only take into account the delay for the cooling of overhangs." -msgstr "오버행 냉각 지연만 고려합니다." +msgstr "돌출부 냉각 지연만 고려합니다." msgid "Fan kick-start time" msgstr "팬 시동 시간" @@ -8667,25 +8670,24 @@ msgstr "" "목표 속도로 줄이기 전에 냉각 팬을 시동하기 위해 이 시간만큼 일찍 최대 팬 속" "도 명령을 내립니다.\n" "이 기능은 낮은 PWM/전력으로는 팬이 정지 상태에서 회전을 시작하거나 팬의 속도" -"를 빠르게 향상시키기에 부족할수 있는 팬에게 유용합니다.\n" +"를 빠르게 향상시키기에 부족할 수 있는 팬에게 유용합니다.\n" "비활성화하려면 0으로 설정합니다." msgid "Time cost" -msgstr "시간비요" +msgstr "시간비용" msgid "The printer cost per hour" msgstr "시간당 프린터 비용" msgid "money/h" -msgstr "비용/시간" +msgstr "원/h" msgid "Support control chamber temperature" -msgstr "챔버 온도조절 지원" +msgstr "챔버 온도 제어 지원" msgid "" "This option is enabled if machine support controlling chamber temperature" -msgstr "" -"이 옵션은 기계가 챔버 온도 제어를 지원하는 경우 활성화됩니다" +msgstr "이 옵션은 장치가 챔버 온도 제어를 지원하는 경우 활성화됩니다" msgid "Support air filtration" msgstr "공기 여과 지원" @@ -8694,7 +8696,7 @@ msgid "Enable this if printer support air filtration" msgstr "프린터가 공기 여과를 지원하는 경우 활성화하십시오" msgid "G-code flavor" -msgstr "G코드 호환" +msgstr "G코드 호환(Flavor)" msgid "What kind of gcode the printer is compatible with" msgstr "프린터와 호환되는 G코드 종류" @@ -8712,9 +8714,9 @@ msgid "" "plugin. This settings is NOT compatible with Single Extruder Multi Material " "setup and Wipe into Object / Wipe into Infill." msgstr "" -"이 옵션을 선택하면 G코드 출력시 이동에 이름표를 추가할수 있습니다. 이는 " +"이 옵션을 선택하면 G코드 출력시 이동에 이름표를 추가할 수 있습니다. 이는 " "Octoprint CancelObject 플러그인에 유용합니다. 단일 압출기 다중 재료 설정 및 " -"개체에서 닦기/내부채움에서 닦기와 호환되지 않습니다." +"개체에서 닦기/내부 채움에서 닦기와 호환되지 않습니다." msgid "Exclude objects" msgstr "개체 제외" @@ -8732,39 +8734,40 @@ msgid "" msgstr "" "주석이 달린 G코드 파일을 가져오려면 이 기능을 활성화하십시오. 각 라인은 설명 " "텍스트로 설명됩니다. SD 카드에서 출력하는 경우 파일의 추가 크기로 인해 펌웨" -"어 속도가 느려질수 있습니다." +"어 속도가 느려질 수 있습니다." msgid "Infill combination" -msgstr "내부채움 결합" +msgstr "내부 채움 결합" msgid "" "Automatically Combine sparse infill of several layers to print together to " "reduce time. Wall is still printed with original layer height." msgstr "" -"여러 레이어의 드문 내부채움를 자동으로 결합 후 함께 출력하여 시간을 단축합니" +"여러 레이어의 드문 내부 채움을 자동으로 결합 후 함께 출력하여 시간을 단축합니" "다. 벽은 여전히 설정된 레이어 높이로 출력됩니다." msgid "Filament to print internal sparse infill." -msgstr "내부 드문 내부채움를 출력할 필라멘트." +msgstr "내부 드문 내부 채움을 출력할 필라멘트." msgid "" "Line width of internal sparse infill. If expressed as a %, it will be " "computed over the nozzle diameter." msgstr "" -"내부 드문 내부채움의 선 너비. %로 입력 시 노즐 직경에 대한 비율로 계산됩니다." +"내부 드문 내부 채움의 선 너비. %로 입력 시 노즐 직경에 대한 비율로 계산됩니" +"다." msgid "Infill/Wall overlap" -msgstr "내부채움/벽 겹치기" +msgstr "내부 채움/벽 겹치기" msgid "" "Infill area is enlarged slightly to overlap with wall for better bonding. " "The percentage value is relative to line width of sparse infill" msgstr "" -"내부채움 영역이 벽과 겹치도록 약간 확장되어 안착력이 향상됩니다. 드문 내부채" -"움 선 너비의 백분율 값입니다" +"내부 채움 영역이 벽과 겹치도록 약간 확장되어 접착력이 향상됩니다. 드문 내부 " +"채움 선 너비의 백분율 값입니다" msgid "Speed of internal sparse infill" -msgstr "내부 드문 내부채움 속도" +msgstr "내부 드문 내부 채움 속도" msgid "Interface shells" msgstr "접점 쉘" @@ -8775,7 +8778,7 @@ msgid "" "soluble support material" msgstr "" "인접한 재료/체적 사이에 꽉찬 쉘을 강제로 생성합니다. 투명한 재료 또는 용해성 " -"서포트 재료를 사용하는 다중 압출기 출력에 유용합니다" +"지지대 재료를 사용하는 다중 압출기 출력에 유용합니다" msgid "Ironing Type" msgstr "다림질 유형" @@ -8803,14 +8806,14 @@ msgid "Ironing Pattern" msgstr "다림질 패턴" msgid "Ironing flow" -msgstr "다림질 압출량" +msgstr "다림질 유량" msgid "" "The amount of material to extrude during ironing. Relative to flow of normal " "layer height. Too high value results in overextrusion on the surface" msgstr "" -"다림질 중에 압출할 재료의 양입니다. 정상 레이어 높이의 압출량에 상대적입니" -"다. 값이 너무 높으면 표면에 과다 압출이 발생합니다" +"다림질 중에 압출할 재료의 양입니다. 정상 레이어 높이의 유량에 상대적입니다. " +"값이 너무 높으면 표면에 과다 압출이 발생합니다" msgid "Ironing line spacing" msgstr "다림질 선 간격" @@ -8840,7 +8843,7 @@ msgid "" "pause G-code in gcode viewer" msgstr "" "이 G코드는 출력 일시 정지를 위한 코드로 사용됩니다. 사용자는 G코드 뷰어에서 " -"일시 정지 G코드를 삽입할수 있습니다" +"일시 정지 G코드를 삽입할 수 있습니다" msgid "This G-code will be used as a custom code" msgstr "이 G코드는 사용자 지정 코드로 사용됩니다" @@ -8939,10 +8942,10 @@ msgid "Maximum acceleration for extruding (M204 P)" msgstr "압출 중 최대 가속도 (M204 P)" msgid "Maximum acceleration for retracting" -msgstr "리트렉션 중 최대 가속도" +msgstr "퇴출 중 최대 가속도" msgid "Maximum acceleration for retracting (M204 R)" -msgstr "리트렉션 중 최대 가속도 (M204 R)" +msgstr "퇴출 중 최대 가속도 (M204 R)" msgid "Maximum acceleration for travel" msgstr "이동 최대 가속도" @@ -8954,7 +8957,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" @@ -8968,7 +8971,7 @@ msgstr "" "를 활성화할 때 최대 레이어 높이를 제한합니다" msgid "Extrusion rate smoothing" -msgstr "압출 속도 평활화" +msgstr "유연한 압출 유량" msgid "" "This parameter smooths out sudden extrusion rate changes that happen when " @@ -8998,36 +9001,37 @@ msgid "" "\n" "Note: this parameter disables arc fitting." msgstr "" -"이 매개변수는 프린터가 높은 흐름(고속/더 큰 너비) 압출에서 낮은 흐름(낮은 속" +"이 매개변수는 프린터가 높은 유량(고속/더 큰 너비) 압출에서 낮은 유량(낮은 속" "도/더 작은 너비) 압출로 또는 그 반대로 출력할 때 발생하는 급격한 압출 속도 변" "화를 완화합니다.\n" "\n" -"이는 압출된 체적 유량(mm3/초)이 시간에 따라 변할수 있는 최대 속도를 정의합니" -"다. 값이 높을수록 더 높은 압출 속도 변경이 허용되어 속도 전환이 더 빨라진다" +"이는 압출된 체적 유량(mm3/sec)이 시간에 따라 변할 수 있는 최대 속도를 정의합" +"니다. 값이 높을수록 더 높은 압출 속도 변경이 허용되어 속도 전환이 더 빨라진다" "는 의미입니다.\n" "\n" "값이 0이면 기능이 비활성화됩니다.\n" "\n" "고속, 고유량 직접 구동 프린터(예: Bambu lab 또는 Voron)의 경우 일반적으로 이 " "값이 필요하지 않습니다. 그러나 기능 속도가 크게 달라지는 특정 경우에는 약간" -"의 이점을 제공할수 있습니다. 예를 들어 오버행으로 인해 급격하게 감속이 발생하" +"의 이점을 제공할 수 있습니다. 예를 들어 돌출부로 인해 급격하게 감속이 발생하" "는 경우입니다. 이러한 경우 약 300-350mm3/s2의 높은 값이 권장됩니다. 이렇게 하" -"면 압력 전진이 더 부드러운 흐름 전환을 달성하는 데 도움이 될 만큼 충분히 매끄" -"러워질수 있기 때문입니다.\n" +"면 프레셔 어드밴스(Pressure advance)가 더 부드러운 유량 전환을 달성하는 데 도" +"움이 될 만큼 충분히 매끄러워질 수 있기 때문입니다.\n" "\n" -"압력 전진 기능이 없는 느린 프린터의 경우 값을 훨씬 낮게 설정해야 합니다. " -"10-15mm3/s2 값은 직접 구동 압출기의 좋은 시작점이고 Bowden 스타일의 경우 " -"5-10mm3/s2입니다.\n" +"프레셔 어드밴스(Pressure advance) 기능이 없는 느린 프린터의 경우 값을 훨씬 낮" +"게 설정해야 합니다. 10-15mm3/s2 값은 직접 구동 압출기의 좋은 시작점이고 보우" +"덴 스타일의 경우 5-10mm3/s2입니다.\n" "\n" -"이 기능은 Prusa 슬라이서에서는 압력 이퀄라이저로 알려져 있습니다.\n" +"이 기능은 Prusa 슬라이서에서는 프레셔 이퀄라이저(Pressure Equalizer)로 알려" +"져 있습니다.\n" "\n" -"참고: 이 매개변수는 호 피팅을 비활성화합니다." +"참고: 이 매개변수는 원호 피팅(Arc fitting)을 비활성화합니다." msgid "mm³/s²" msgstr "mm³/s²" msgid "Smoothing segment length" -msgstr "스무딩 세그먼트 길이" +msgstr "유연 분할 길이" msgid "" "A lower value results in smoother extrusion rate transitions. However, this " @@ -9039,8 +9043,8 @@ msgid "" "\n" "Allowed values: 1-5" msgstr "" -"값이 낮을수록 압출 속도 전환이 더 부드러워집니다. 그러나 이로 인해 gcode 파일" -"이 상당히 커지고 프린터가 처리해야 할 지침이 더 많아집니다.\n" +"값이 낮을수록 압출 속도 전환이 더 유연해집니다. 하지만 G코드 파일이 상당히 커" +"지고 프린터가 처리해야 할 연산이 더 많아집니다.\n" "\n" "기본값인 3은 대부분의 경우에 적합합니다. 프린터가 끊기는 경우 이 값을 늘려 조" "정 횟수를 줄이십시오.\n" @@ -9087,7 +9091,8 @@ msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." msgstr "" -"여기에 개인 메모를 넣을수 있습니다. 이 텍스트는 G코드 헤더 설명에 추가됩니다." +"여기에 개인 메모를 넣을 수 있습니다. 이 텍스트는 G코드 헤더 설명에 추가됩니" +"다." msgid "Host Type" msgstr "호스트 유형" @@ -9096,14 +9101,14 @@ msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." msgstr "" -"Slic3r은 G코드 파일을 프린터 호스트에 업로드할수 있습니다. 이 필드는 호스트" +"Slic3r은 G코드 파일을 프린터 호스트에 업로드할 수 있습니다. 이 필드는 호스트" "의 종류를 포함해야 합니다." msgid "Nozzle volume" -msgstr "노즐 용량" +msgstr "노즐 부피" msgid "Volume of nozzle between the cutter and the end of nozzle" -msgstr "커터와 노즐 끝단 사이의 노즐 용량" +msgstr "커터와 노즐 끝단 사이의 노즐 부피" msgid "Cooling tube position" msgstr "냉각 튜브 위치" @@ -9159,17 +9164,17 @@ msgid "The start and end points which is from cutter area to garbage can." msgstr "절단 영역에서 버릴 영역까지의 시작점과 끝점." msgid "Reduce infill retraction" -msgstr "내부채움 리트렉션 감소" +msgstr "내부 채움 퇴출 감소" 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 " "model and save printing time, but make slicing and G-code generating slower" msgstr "" -"이동 구간이 확실히 내부채움 지역에 있을 때 리트렉션하지 않습니다. 이는 외부에" -"서는 필라멘트의 누액(우즈)이 보이지 않는다는 것을 의미합니다. 복잡한 모델의 " -"리트렉션시간을 줄이고 출력 시간을 절약할수 있지만 슬라이싱 및 G코드 생성 속도" -"가 느려집니다" +"이동 구간이 확실히 내부 채움 지역에 있을 때 퇴출하지 않습니다. 이는 외부에서" +"는 필라멘트의 누액(우즈)이 보이지 않는다는 것을 의미합니다. 복잡한 모델의 퇴" +"출 시간을 줄이고 출력 시간을 절약할 수 있지만 슬라이싱 및 G코드 생성 속도가 " +"느려집니다" msgid "Enable" msgstr "활성화" @@ -9178,28 +9183,28 @@ msgid "Filename format" msgstr "파일 이름 형식" msgid "User can self-define the project file name when export" -msgstr "사용자가 내보낼 파일 이름을 자체 정의할수 있습니다" +msgstr "사용자가 내보낼 파일 이름을 자체 정의할 수 있습니다" msgid "Make overhang printable" -msgstr "오버행 형상 변경" +msgstr "돌출부 형상 변경" msgid "Modify the geometry to print overhangs without support material." -msgstr "서포트 없이 오버행를 출력하도록 형상을 수정합니다." +msgstr "지지대 없이 돌출부를 출력하도록 형상을 수정합니다." msgid "Make overhang printable maximum angle" -msgstr "오버행 형상 변경 최대 각도" +msgstr "돌출부 형상 변경 최대 각도" msgid "" "Maximum angle of overhangs to allow after making more steep overhangs " "printable.90° will not change the model at all and allow any overhang, while " "0 will replace all overhangs with conical material." msgstr "" -"더 가파른 오버행를 출력할수 있게 허용되는 오버행의 최대 각도. 90°는 형상을 전" -"혀 변경하지 않고 오버행를 허용하는 반면, 0은 모든 오버행를 원뿔형 재료로 대체" -"합니다." +"더 가파른 돌출부를 출력할 수 있게 허용되는 돌출부의 최대 각도. 90°는 형상을 " +"전혀 변경하지 않고 돌출부를 허용하는 반면, 0은 모든 돌출부를 원뿔형 재료로 대" +"체합니다." msgid "Make overhang printable hole area" -msgstr "오버행 형상 변경 구멍 영역" +msgstr "돌출부 형상 변경 구멍 영역" msgid "" "Maximum area of a hole in the base of the model before it's filled by " @@ -9212,15 +9217,15 @@ msgid "mm²" msgstr "mm²" msgid "Detect overhang wall" -msgstr "오버행 벽 감지" +msgstr "돌출벽(오버행 벽) 감지" #, c-format, boost-format msgid "" "Detect the overhang percentage relative to line width and use different " "speed to print. For 100%% overhang, bridge speed is used." msgstr "" -"선 너비에 비례하여 오버행 백분율을 감지하고 다른 속도를 사용하여 출력합니다. " -"100%% 오버행의 경우 브리지 속도가 사용됩니다." +"선 너비에 비례하여 돌출부 백분율을 감지하고 다른 속도를 사용하여 출력합니다. " +"100%% 돌출부의 경우 다리 속도가 사용됩니다." msgid "" "Line width of inner wall. If expressed as a %, it will be computed over the " @@ -9243,13 +9248,13 @@ msgstr "" "사용자 정의 스크립트를 통해 출력 G코드를 처리하려면 여기에 절대 경로를 나열하" "십시오. 여러 스크립트는 세미콜론(;)으로 구분합니다. 스크립트는 G코드 파일의 " "절대 경로를 첫 번째 인수로 전달하며 환경 변수를 읽어 Slic3r 구성 설정에 접근" -"할수 있습니다." +"할 수 있습니다." msgid "Printer notes" msgstr "프린터 메모" msgid "You can put your notes regarding the printer here." -msgstr "여기에 프린터에 관한 메모를 넣을수 있습니다." +msgstr "여기에 프린터에 관한 메모를 넣을 수 있습니다." msgid "Raft contact Z distance" msgstr "라프트 접점 Z 거리" @@ -9267,13 +9272,13 @@ msgid "Initial layer density" msgstr "초기 레이어 밀도" msgid "Density of the first raft or support layer" -msgstr "첫 번째 라프트 또는 서포트의 밀도" +msgstr "첫 번째 라프트 또는 지지대의 밀도" msgid "Initial layer expansion" msgstr "초기 레이어 확장" msgid "Expand the first raft or support layer to improve bed plate adhesion" -msgstr "베드 베드 안착을 향상시키기 위해 첫 번째 라프트 또는 서포트 확장" +msgstr "베드 플레이트 안착을 향상시키기 위해 첫 번째 라프트 또는 지지대 확장" msgid "Raft layers" msgstr "라프트 레이어" @@ -9282,7 +9287,8 @@ msgid "" "Object will be raised by this number of support layers. Use this function to " "avoid wrapping when print ABS" msgstr "" -"개체를 이 레이어수 많큼 들어올립니다. 이 기능을 사용하여 ABS 출력시 뒤틀림을 방지합니다" +"개체를 이 레이어 수 많큼 들어올립니다. 이 기능을 사용하여 ABS 출력 시 뒤틀림" +"(워핑)을 방지합니다" msgid "" "G-code path is genereated after simplifing the contour of model to avoid too " @@ -9299,48 +9305,48 @@ msgstr "이동 거리 임계값" msgid "" "Only trigger retraction when the travel distance is longer than this " "threshold" -msgstr "임계값보다 먼 거리 이동의 경우에만 리트렉션을 실행합니다" +msgstr "임계값보다 먼 거리 이동의 경우에만 퇴출을 실행합니다" msgid "Retract amount before wipe" -msgstr "닦기 전 리트렉션량" +msgstr "닦기 전 퇴출량" msgid "" "The length of fast retraction before wipe, relative to retraction length" msgstr "" -"리트렉션 길이에 비례한 닦기 전 리트렉션량(닦기를 시작하기 전에 일부 필라멘트" -"를 리트렉션시키면 노즐 끝에 녹아있는 소량의 필라멘트만 남게되어 추가 누수 위" -"험이 줄어들수 있습니다_by MMT)" +"퇴출 길이에 비례한 닦기 전 퇴출량(닦기를 시작하기 전에 일부 필라멘트를 퇴출시" +"키면 노즐 끝에 녹아있는 소량의 필라멘트만 남게되어 추가 누수 위험이 줄어들 " +"수 있습니다_by MMT)" msgid "Retract when change layer" -msgstr "레이어 변경 시 리트렉션" +msgstr "레이어 변경 시 퇴출" msgid "Force a retraction when changes layer" -msgstr "레이어 변경 시 강제로 리트렉션을 실행합니다" +msgstr "레이어 변경 시 강제로 퇴출을 실행합니다" msgid "Length" msgstr "길이" msgid "Retraction Length" -msgstr "리트렉션 길이" +msgstr "퇴출 길이" 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 "Z hop when retract" -msgstr "리트렉션시 Z 올리기" +msgstr "퇴출 시 Z 올리기" msgid "" "Whenever the retraction is done, the nozzle is lifted a little to create " "clearance between nozzle and the print. It prevents nozzle from hitting the " "print when travel move. Using spiral line to lift z can prevent stringing" msgstr "" -"리트렉션 동작을 할 때마다 노즐을 약간 들어 올려 노즐과 출력물 사이의 간격을 " -"만듭니다. 이동 시 노즐이 출력물에 부딪히는 것을 방지합니다. 나선 라인(Spiral " -"line)을 사용하여 Z를 올리면 실 발생을 방지할수 있습니다" +"퇴출 동작을 할 때마다 노즐을 약간 들어 올려 노즐과 출력물 사이의 간격을 만듭" +"니다. 이동 시 노즐이 출력물에 부딪히는 것을 방지합니다. 나선 라인(Spiral " +"line)을 사용하여 Z를 올리면 실 발생을 방지할 수 있습니다" msgid "Z hop lower boundary" msgstr "Z 올리기 하한 경계" @@ -9349,17 +9355,17 @@ msgid "" "Z hop will only come into effect when Z is above this value and is below the " "parameter: \"Z hop upper boundary\"" msgstr "" -"Z 올리기는 Z가 이 값보다 크고 \"Z 올리기 상한\" 매개변수 아래인 경우에만 적용" -"됩니다." +"Z 올리기는 Z가 이 값보다 크고 \"Z 올리기 상한 경계\" 매개변수 아래인 경우에" +"만 적용됩니다." msgid "Z hop upper boundary" -msgstr "Z 올리기 상한" +msgstr "Z 올리기 상한 경계" msgid "" "If this value is positive, Z hop will only come into effect when Z is above " "the parameter: \"Z hop lower boundary\" and is below this value" msgstr "" -"이 값이 양수인 경우 Z 올리기는 Z가 매개변수 \"Z 올리기 하위 경계\"보다 높고 " +"이 값이 양수인 경우 Z 올리기는 Z가 매개변수 \"Z 올리기 하한 경계\"보다 높고 " "이 값보다 낮을 때만 적용됩니다" msgid "Z hop type" @@ -9388,7 +9394,8 @@ msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z." msgstr "" -"이 값을 양의 값으로 설정하면 Z 올리기는 지정된 Z의 절대값 아래에서만 발생합니다." +"이 값을 양의 값으로 설정하면 Z 올리기는 지정된 Z의 절대값 아래에서만 발생합니" +"다." msgid "On surfaces" msgstr "표면에서" @@ -9397,7 +9404,8 @@ msgid "" "Enforce Z Hop behavior. This setting is impacted by the above settings (Only " "lift Z above/below)." msgstr "" -"Z 올리기 동작을 수행합니다. 이 설정은 위의 설정의 영향을 받습니다(위/아래에서만 Z 올리기)." +"Z 올리기 동작을 수행합니다. 이 설정은 위의 설정의 영향을 받습니다 (위에서/아" +"래에서만 Z 올리기)." msgid "All Surfaces" msgstr "모든 표면" @@ -9418,41 +9426,40 @@ msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." msgstr "" -"이동 후 리트렉션이 보정되면 압출기가 보정된 양 만큼의 추가 필라멘트를 밀어냅" -"니다. 이 설정은 거의 필요하지 않습니다." +"이동 후 퇴출이 보정되면 압출기가 보정된 양 만큼의 추가 필라멘트를 밀어냅니" +"다. 이 설정은 거의 필요하지 않습니다." msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." msgstr "" -"툴(Tool) 교체 후 리트렉션이 보정되면 압출기가 보정된 양 만큼의 추가 필라멘트" -"를 밀어냅니다." +"툴(Tool) 교체 후 퇴출이 보정되면 압출기가 보정된 양 만큼의 추가 필라멘트를 밀" +"어냅니다." msgid "Retraction Speed" -msgstr "리트렉션 속도" +msgstr "퇴출 속도" msgid "Speed of retractions" -msgstr "리트렉션 속도" +msgstr "퇴출 속도" msgid "Deretraction Speed" -msgstr "리트렉션 복귀(디-리트렉션) 속도" +msgstr "퇴출 복귀(디-리트렉션) 속도" msgid "" "Speed for reloading filament into extruder. Zero means same speed with " "retraction" msgstr "" -"필라멘트를 압출기로 되돌리는 속도. 0은 리트렉션 속도와 동일한 속도를 의미합니" -"다" +"필라멘트를 압출기로 되돌리는 속도. 0은 퇴출 속도와 동일한 속도를 의미합니다" msgid "Use firmware retraction" -msgstr "펌웨어 리트렉션 사용" +msgstr "펌웨어 퇴출 사용" msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." msgstr "" -"이 실험적 설정은 G10 및 G11 명령을 사용하여 펌웨어가 리트렉션을 처리하도록 합" -"니다. 이것은 최근의 Marlin에서만 지원됩니다." +"이 실험적 설정은 G10 및 G11 명령을 사용하여 펌웨어가 퇴출을 처리하도록 합니" +"다. 이것은 최근의 Marlin에서만 지원됩니다." msgid "Show auto-calibration marks" msgstr "자동 교정 기호 표시" @@ -9496,8 +9503,8 @@ msgid "" msgstr "" "폐쇄 루프 압출에서 솔기의 가시성을 줄이기 위해 루프가 중단되고 지정된 양만큼 " "짧아집니다.\n" -"이 양은 밀리미터로 지정하거나 현재 압출기 직경의 백분율로 지정할수 있습니다. " -"이 매개 변수의 기본값은 10%입니다." +"이 양은 밀리미터로 지정하거나 현재 압출기 직경의 백분율로 지정할 수 있습니" +"다. 이 매개 변수의 기본값은 10%입니다." msgid "Role base wipe speed" msgstr "역할 기반 닦기 속도" @@ -9534,10 +9541,10 @@ msgstr "" "은 80%입니다" msgid "Skirt distance" -msgstr "스커트-브림/개체 거리" +msgstr "스커트-챙(브림)/개체 거리" msgid "Distance from skirt to brim or object" -msgstr "스커트와 브림 또는 개체와의 거리" +msgstr "스커트와 챙(브림) 또는 개체와의 거리" msgid "Skirt height" msgstr "스커트 높이" @@ -9567,20 +9574,21 @@ msgstr "" "선하기 위해 느려집니다" msgid "Minimum sparse infill threshold" -msgstr "최소 드문 내부채움 임계값" +msgstr "최소 드문 내부 채움 임계값" msgid "" "Sparse infill area which is smaller than threshold value is replaced by " "internal solid infill" -msgstr "임계값보다 작은 드문 내부채움 영역은 꽉찬 내부채움로 대체됩니다" +msgstr "임계값보다 작은 드문 내부 채움 영역은 내부 꽉찬 내부 채움로 대체됩니다" msgid "" "Line width of internal solid infill. If expressed as a %, it will be " "computed over the nozzle diameter." -msgstr "꽉찬 내부채움 선 너비. %로 입력 시 노즐 직경에 대한 비율로 계산됩니다." +msgstr "" +"내부 꽉찬 내부 채움 선 너비. %로 입력 시 노즐 직경에 대한 비율로 계산됩니다." msgid "Speed of internal solid infill, not the top and bottom surface" -msgstr "상단 및 하단 표면을 제외한 꽉찬 내부채움 속도" +msgstr "상단 및 하단 표면을 제외한 내부 꽉찬 내부 채움 속도" msgid "Spiral vase" msgstr "나선 꽃병" @@ -9591,7 +9599,8 @@ msgid "" "generated model has no seam" msgstr "" "나선화는 외부 윤곽선의 z 이동을 부드럽게 합니다. 그리고 개체를 꽉찬 하단 레이" -"어가 있는 단일 벽으로 출력합니다. 최종 생성된 출력물에는솔기가 없습니다" +"어(Solid bottom layers)가 있는 단일 벽으로 출력합니다. 최종 생성된 출력물에" +"는 솔기가 없습니다" msgid "" "If smooth or traditional mode is selected, a timelapse video will be " @@ -9607,8 +9616,8 @@ msgstr "" "다. 각 레이어가 출력된 후 챔버 카메라로 스냅샷을 찍습니다. 이 모든 스냅샷은 " "출력이 완료되면 타임랩스 비디오로 구성됩니다. 유연 모드를 선택하면 각 레이어" "가 출력된 후 툴 헤드가 여유 공간으로 이동한 다음 스냅샷을 찍습니다. 스냅샷을 " -"찍는 과정에서 노즐에서 녹은 필라멘트가 새어 나올수 있기 때문에 유연 모드에서 " -"노즐을 닦으려면 프라임 타워가 필요합니다." +"찍는 과정에서 노즐에서 녹은 필라멘트가 새어 나올 수 있기 때문에 유연 모드에" +"서 노즐을 닦으려면 프라임 타워가 필요합니다." msgid "Traditional" msgstr "기존" @@ -9672,8 +9681,8 @@ msgid "" "resolution, therefore it is advisable to keep the value reasonably low." msgstr "" "간격 폐쇄 반경의 2배보다 작은 균열은 삼각형 메쉬 슬라이싱 중에 채워집니다. 간" -"격 내부채움 작업은 최종 출력 해상도를 감소시킬수 있으므로 값을 합리적으로 낮" -"게 유지하는 것이 좋습니다." +"격 채움 작업은 최종 출력 해상도를 감소시킬 수 있으므로 값을 합리적으로 낮게 " +"유지하는 것이 좋습니다." msgid "Slicing Mode" msgstr "슬라이싱 모드" @@ -9695,48 +9704,48 @@ msgid "Close holes" msgstr "구멍 닫기" msgid "Enable support" -msgstr "서포트 사용" +msgstr "지지대 사용" msgid "Enable support generation." -msgstr "서포트 생성을 활성화 합니다." +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 " "generated" msgstr "" -"일반(자동) 및 트리(자동)는 서포트를 자동으로 생성합니다. 일반(수동) 또는 트리" -"(수동) 선택시에는 강제된 서포트만 생성됩니다" +"일반(자동) 및 나무(자동)는 지지대를 자동으로 생성합니다. 일반(수동) 또는 나무" +"(수동) 선택시에는 강제된 지지대만 생성됩니다" msgid "normal(auto)" msgstr "일반(자동)" msgid "tree(auto)" -msgstr "트리(자동)" +msgstr "나무(자동)" msgid "normal(manual)" msgstr "일반(수동)" msgid "tree(manual)" -msgstr "트리(수동)" +msgstr "나무(수동)" msgid "Support/object xy distance" -msgstr "서포트/개체 XY 거리" +msgstr "지지대/개체 XY 거리" msgid "XY separation between an object and its support" -msgstr "개체와 서포트를 분리하는 XY 간격" +msgstr "개체와 지지대를 분리하는 XY 간격" msgid "Pattern angle" msgstr "패턴 각도" msgid "Use this setting to rotate the support pattern on the horizontal plane." -msgstr "이 설정을 사용하여 수평면에서 서포트 패턴을 회전합니다." +msgstr "이 설정을 사용하여 수평면에서 지지대 패턴을 회전합니다." msgid "On build plate only" -msgstr "베드에만 생성" +msgstr "빌드 플레이트에만 생성" msgid "Don't create support on model surface, only on build plate" -msgstr "모델 표면에 서포트를 생성하지 않고 베드에만 생성합니다" +msgstr "모델 표면에 지지대를 생성하지 않고 빌드 플레이트에만 생성합니다" msgid "Support critical regions only" msgstr "위험한 지역에만 생성" @@ -9746,41 +9755,40 @@ msgid "" "etc." msgstr "" "날카로운 꼬리, 외팔보(항공기 날개처럼 튀어나온 구조 by MMT) 등과 같이 위험한 " -"부위에 대해서만 서포트를 생성합니다." +"부위에 대해서만 지지대를 생성합니다." msgid "Remove small overhangs" -msgstr "작은 오버행 서포트 제거" +msgstr "작은 돌출부 지지대 제거" msgid "Remove small overhangs that possibly need no supports." -msgstr "서포트가 필요하지 않은 작은 오버행에서 서포트를 제거합니다." +msgstr "지지대가 필요하지 않은 작은 돌출부에서 지지대를 제거합니다." msgid "Top Z distance" msgstr "상단 Z 거리" msgid "The z gap between the top support interface and object" -msgstr "서포트 상단과 개체 접점의 간격" +msgstr "지지대 상단과 개체 접점의 간격" msgid "Bottom Z distance" msgstr "하단 Z 거리" msgid "The z gap between the bottom support interface and object" -msgstr "서포트 하단과 개체 접점의 간격" +msgstr "지지대 하단과 개체 접점의 간격" msgid "Support/raft base" -msgstr "서포트/라프트 기본" +msgstr "지지대/라프트 기본" msgid "" "Filament to print support base and raft. \"Default\" means no specific " "filament for support and current filament is used" msgstr "" -"기본 서포트 및 라프트를 출력하기 위한 필라멘트. \"기본값\"은 지원을 위한 특" +"기본 지지대 및 라프트를 출력하기 위한 필라멘트. \"기본값\"은 지원을 위한 특" "정 필라멘트가 없으며 현재 필라멘트가 사용됨을 의미합니다" msgid "" "Line width of support. If expressed as a %, it will be computed over the " "nozzle diameter." -msgstr "" -"서포트의 선 너비. %로 입력 시 노즐 직경에 대한 비율로 계산됩니다." +msgstr "지지대의 선 너비. %로 입력 시 노즐 직경에 대한 비율로 계산됩니다." msgid "Interface use loop pattern" msgstr "접점에서 루프 패턴 사용" @@ -9788,16 +9796,16 @@ msgstr "접점에서 루프 패턴 사용" msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" -"서포트 상단 접촉 레이어를 루프로 덮습니다. 기본적으로 비활성화되어 있습니다." +"지지대 상단 접촉 레이어를 루프로 덮습니다. 기본적으로 비활성화되어 있습니다." msgid "Support/raft interface" -msgstr "서포트/라프트 접점" +msgstr "지지대/라프트 접점" msgid "" "Filament to print support interface. \"Default\" means no specific filament " "for support interface and current filament is used" msgstr "" -"서포트 및 라프트 접점을 출력하기 위한 필라멘트. \"기본값\"은 지원을 위한 특" +"지지대 및 라프트 접점을 출력하기 위한 필라멘트. \"기본값\"은 지원을 위한 특" "정 필라멘트가 없으며 현재 필라멘트가 사용됨을 의미합니다" msgid "Top interface layers" @@ -9822,13 +9830,13 @@ msgid "Spacing of bottom interface lines. Zero means solid interface" msgstr "하단 접점 선의 간격. 0은 꽉찬 접점을 의미합니다" msgid "Speed of support interface" -msgstr "서포트 접점 속도" +msgstr "지지대 접점 속도" msgid "Base pattern" msgstr "기본 패턴" msgid "Line pattern of support" -msgstr "서포트 기본 패턴" +msgstr "지지대 기본 패턴" msgid "Rectilinear grid" msgstr "직선 격자" @@ -9844,8 +9852,8 @@ msgid "" "interface is Rectilinear, while default pattern for soluble support " "interface is Concentric" msgstr "" -"서포트 접점의 선 패턴. 비가용성 서포트 접점의 기본 패턴은 직선인 반면 가용성 " -"서포트 접점의 기본 패턴은 동심입니다" +"지지대 접점의 선 패턴. 비가용성 지지대 접점의 기본 패턴은 직선인 반면 가용성 " +"지지대 접점의 기본 패턴은 동심입니다" msgid "Rectilinear Interlaced" msgstr "엇갈린 직선" @@ -9854,16 +9862,16 @@ msgid "Base pattern spacing" msgstr "기본 패턴 간격" msgid "Spacing between support lines" -msgstr "서포트 선 사이의 간격" +msgstr "지지대 선 사이의 간격" msgid "Normal Support expansion" -msgstr "일반 서포트 확장" +msgstr "일반 지지대 확장" msgid "Expand (+) or shrink (-) the horizontal span of normal support" -msgstr "일반 서포트의 수평 범위를 확대( + ) 또는 축소( - )합니다" +msgstr "일반 지지대의 수평 범위를 확대( + ) 또는 축소( - )합니다" msgid "Speed of support" -msgstr "서포트 속도" +msgstr "지지대 속도" msgid "" "Style and shape of the support. For normal support, projecting the supports " @@ -9874,37 +9882,36 @@ msgid "" "style will create similar structure to normal support under large flat " "overhangs." msgstr "" -"서포트의 스타일과 모양. 일반 서포트의 경우 서포트를 일반 그리드에 투영하면 보" -"다 안정적인 서포트(기본값)가 생성되는 반면, 꼭 맞는 지지 타워는 재료를 절약하" -"고 물체 흉터를 줄입니다.\n" -"나무 지지의 경우 슬림형 및 유기적 스타일은 가지를 보다 적극적으로 병합하고 많" -"은 재료(기본 유기적)를 절약하는 반면, 하이브리드 스타일은 크고 평평한 오버행 " -"아래에서 일반 서포트와 유사한 구조를 만듭니다." +"지지대의 스타일과 모양. 일반 지지대의 경우, 격자는 보다 안정적인 지지대(기본" +"값)가 생성되는 반면, 맞춤 지지대는 재료를 절약하고 지지대 자국을 줄입니다.\n" +"나무 지지대의 경우, 얇은 및 유기체 모양은 가지를 보다 적극적으로 병합하고 많" +"은 재료를 절약합니다(기본값 유기체). 반면 혼합 모양은 크고 평평한 돌출부 아래" +"에 일반 지지대와 유사한 구조를 만듭니다." msgid "Snug" msgstr "맞춤" msgid "Tree Slim" -msgstr "얇은 트리" +msgstr "얇은 나무" msgid "Tree Strong" -msgstr "강한 트리" +msgstr "강한 나무" msgid "Tree Hybrid" -msgstr "혼합 트리" +msgstr "혼합 나무" msgid "Organic" msgstr "유기체" msgid "Independent support layer height" -msgstr "독립적 서포트 레이어 높이" +msgstr "독립적 지지대 레이어 높이" msgid "" "Support layer uses layer height independent with object layer. This is to " "support customizing z-gap and save print time.This option will be invalid " "when the prime tower is enabled." msgstr "" -"서포트 레이어는 개체 레이어와 독립적인 레이어 높이를 사용합니다. 이것은 Z 거" +"지지대 레이어는 개체 레이어와 독립적인 레이어 높이를 사용합니다. 이것은 Z 거" "리 사용자 정의를 지원하고 출력 시간을 절약하기 위한 것입니다. 프라임 타워가 " "활성화되면 이 옵션은 유효하지 않습니다." @@ -9914,19 +9921,19 @@ msgstr "임계값 각도" msgid "" "Support will be generated for overhangs whose slope angle is below the " "threshold." -msgstr "" -"경사각이 임계값 미만인 오버행에 서포트가 생성됩니다." +msgstr "경사각이 임계값 미만인 돌출부에 지지대가 생성됩니다." msgid "Tree support branch angle" -msgstr "트리 서포트 가지 각도" +msgstr "나무 지지대 가지 각도" 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 "" -"이 설정은 트리 서포트의 가지가 만들수 있는 오버행의 최대 각도를 결정합니다. " -"각도가 증가하면 가지가 멀리까지 닿을수 있도록 더 수평으로 출력될수 있습니다." +"이 설정은 나무 지지대의 가지가 만들 수 있는 돌출부의 최대 각도를 결정합니다. " +"각도가 증가하면 가지가 멀리까지 닿을 수 있도록 더 수평으로 출력될 수 있습니" +"다." msgid "Preferred Branch Angle" msgstr "선호 가지 각도" @@ -9942,12 +9949,11 @@ msgstr "" "도를 사용하세요." msgid "Tree support branch distance" -msgstr "트리 서포트 가지 거리" +msgstr "나무 지지대 가지 거리" msgid "" "This setting determines the distance between neighboring tree support nodes." -msgstr "" -"이 설정은 인접한 트리 서포트 지점 간의 거리를 결정합니다." +msgstr "이 설정은 인접한 나무 지지대 지점 간의 거리를 결정합니다." msgid "Branch Density" msgstr "가지 밀도" @@ -9960,8 +9966,8 @@ msgid "" "interfaces instead of a high branch density value if dense interfaces are " "needed." msgstr "" -"가지 끝을 생성하는 데 사용되는 서포트의 밀도를 조정합니다. 값이 높을수록 돌출" -"부가 더 좋아지지만 서포트를 제거하기가 더 어렵습니다. 따라서 조밀한 인터페이" +"가지 끝을 생성하는 데 사용되는 지지대의 밀도를 조정합니다. 값이 높을수록 돌출" +"부가 더 좋아지지만 지지대를 제거하기가 더 어렵습니다. 따라서 조밀한 인터페이" "스가 필요한 경우 높은 가지 밀도 값 대신 상단 지지 인터페이스를 활성화하는 것" "이 좋습니다." @@ -9972,36 +9978,35 @@ msgid "" "Enabling this option means the height of tree support layer except the " "first will be automatically calculated " msgstr "" -"이 옵션을 활성화하면 첫 번째 레이어를 제외한 트리 서포트의 레이어 높이가 자동" +"이 옵션을 활성화하면 첫 번째 레이어를 제외한 나무 지지대의 레이어 높이가 자동" "으로 계산됩니다 " msgid "Auto brim width" -msgstr "트리 서포트 자동 브림 너비" +msgstr "나무 지지대 자동 챙(브림) 너비" msgid "" "Enabling this option means the width of the brim for tree support will be " "automatically calculated" -msgstr "" -"옵션을 활성화하면 트리 서포트의 브림 너비가 자동으로 계산됩니다" +msgstr "옵션을 활성화하면 나무 지지대의 챙(브림) 너비가 자동으로 계산됩니다" msgid "Tree support brim width" -msgstr "트리 서포트 브림 너비" +msgstr "나무 지지대 챙(브림) 너비" msgid "Distance from tree branch to the outermost brim line" -msgstr "트리 서포트 가지에서 가장 바깥쪽 브림까지의 거리" +msgstr "나무 지지대 가지에서 가장 바깥쪽 챙(브림)까지의 거리" msgid "Tip Diameter" msgstr "끝 직경" #. TRN PrintSettings: "Organic supports" > "Tip Diameter" msgid "Branch tip diameter for organic supports." -msgstr "유기체 서포트의 가지 끝 직경." +msgstr "유기체 지지대의 가지 끝 직경." msgid "Tree support branch diameter" -msgstr "트리 서포트 가지 직경" +msgstr "나무 지지대 가지 직경" msgid "This setting determines the initial diameter of support nodes." -msgstr "이 설정은 트리 서포트 지점의 초기 직경을 결정합니다." +msgstr "이 설정은 트리 지지대 지점의 초기 직경을 결정합니다." #. TRN PrintSettings: #lmFIXME msgid "Branch Diameter Angle" @@ -10015,7 +10020,7 @@ msgid "" "support." msgstr "" "아래로 갈수록 가지의 직경이 점차 굵어지는 각도. 각도가 0이면 가지가 균일한 두" -"께를 가지는 가지가 됩니다. 약간의 각도는 유기체 서포트의 안정성을 증가시킬 " +"께를 가지는 가지가 됩니다. 약간의 각도는 유기체 지지대의 안정성을 증가시킬 " "수 있습니다." msgid "Branch Diameter with double walls" @@ -10031,19 +10036,19 @@ msgstr "" "됩니다. 이중벽을 허용하지 않으려면 이 값을 0으로 설정합니다." msgid "Tree support wall loops" -msgstr "트리 서포트 벽 루프" +msgstr "나무 지지대 벽 루프" msgid "This setting specify the count of walls around tree support" -msgstr "이 설정은 트리 서포트의 벽 수를 지정합니다" +msgstr "이 설정은 나무 지지대의 벽 수를 지정합니다" msgid "Tree support with infill" -msgstr "내부채움가 있는 트리 서포트" +msgstr "내부 채움이 있는 나무 지지대" msgid "" "This setting specifies whether to add infill inside large hollows of tree " "support" msgstr "" -"이 설정은 트리 서포트의 큰 공동 내부에 내부채움를 추가할지 여부를 지정합니다" +"이 설정은 나무 지지대의 큰 공동 내부에 내부 채움을 추가할지 여부를 지정합니다" msgid "Chamber temperature" msgstr "챔버 온도" @@ -10057,8 +10062,8 @@ msgid "" "high to avoid cloggings, so 0 which stands for turning off is highly " "recommended" msgstr "" -"챔버 온도가 높을수록 뒤틀림을 억제하거나 줄이는 데 도움이 될수 있으며 잠재적" -"으로 ABS, ASA, PC, PA 등과 같은 고온 재료의 층간 결합 강도가 높아질수 있습니" +"챔버 온도가 높을수록 뒤틀림을 억제하거나 줄이는 데 도움이 될 수 있으며 잠재적" +"으로 ABS, ASA, PC, PA 등과 같은 고온 재료의 층간 결합 강도가 높아질 수 있습니" "다. 동시에 ABS 및 ASA의 공기 여과는 더욱 악화됩니다. PLA, PETG, TPU, PVA 및 " "기타 저온 재료의 경우 막힘을 방지하려면 실제 챔버 온도가 높지 않아야 하므로 " "꺼짐을 의미하는 0을 적극 권장합니다" @@ -10073,8 +10078,8 @@ msgid "" "Detect thin wall which can't contain two line width. And use single line to " "print. Maybe printed not very well, because it's not closed loop" msgstr "" -"두개의 선 너비를 포함할수 없는 얇은 벽을 감지합니다. 그리고 한 선으로 출력합" -"니다. 폐쇄 루프가 아니기 때문에 출력이 잘 되지 않을수 있습니다" +"두개의 선 너비를 포함할 수 없는 얇은 벽을 감지합니다. 그리고 한 선으로 출력합" +"니다. 폐쇄 루프가 아니기 때문에 출력이 잘 되지 않을 수 있습니다" msgid "" "This gcode is inserted when change filament, including T command to trigger " @@ -10089,7 +10094,7 @@ msgid "" msgstr "상단 표면의 선 너비. %로 입력 시 노즐 직경에 대한 비율로 계산됩니다." msgid "Speed of top surface infill which is solid" -msgstr "상단 표면 내부채움 속도" +msgstr "상단 표면 내부 채움 속도" msgid "Top shell layers" msgstr "상단 쉘 레이어" @@ -10117,28 +10122,28 @@ msgid "" msgstr "" "상단 쉘 레이어로 계산된 두께가 이 값보다 얇은 경우 슬라이싱할 때 상단 꽉찬 레" "이어의 수가 증가합니다. 이렇게 하면 레이어 높이가 작을 때 쉘이 너무 얇아지는 " -"것을 방지할수 있습니다. 0은 이 설정이 비활성화되고 상단 쉘의 두께가 절대적으" +"것을 방지할 수 있습니다. 0은 이 설정이 비활성화되고 상단 쉘의 두께가 절대적으" "로 상단 쉘 레이어에 의해 결정됨을 의미합니다" msgid "Speed of travel which is faster and without extrusion" msgstr "압출이 없을 때의 이동 속도" msgid "Wipe while retracting" -msgstr "리트렉션시 닦기" +msgstr "퇴출 시 닦기" msgid "" "Move nozzle along the last extrusion path when retracting to clean leaked " "material on nozzle. This can minimize blob when print new part after travel" msgstr "" -"노즐에서 누출된 재료를 청소하기 위해 리트렉션시 마지막 압출 경로를 따라 노즐" -"을 이동합니다. 이동 후 출력을 시작할 때 방울(Blob)을 최소화할수 있습니다" +"노즐에서 누출된 재료를 청소하기 위해 퇴출할 때 마지막 압출 경로를 따라 노즐" +"을 이동합니다. 이동 후 출력을 시작할 때 방울(Blob)을 최소화할 수 있습니다" msgid "Wipe Distance" msgstr "닦기 거리" msgid "" "Discribe how long the nozzle will move along the last path when retracting" -msgstr "리트렉션시 노즐이 마지막 경로를 따라 이동하는 거리" +msgstr "퇴출 시 노즐이 마지막 경로를 따라 이동하는 거리" msgid "" "The wiping tower can be used to clean up the residue on the nozzle and " @@ -10146,10 +10151,10 @@ msgid "" "appearance defects when printing objects." msgstr "" "닦기 타워는 개체를 출력할 때 외관 결함을 방지하기 위해 노즐의 잔류물을 청소하" -"고 노즐 내부의 압력을 안정화하는 데 사용할수 있습니다." +"고 노즐 내부의 압력을 안정화하는 데 사용할 수 있습니다." msgid "Purging volumes" -msgstr "버리기 용량" +msgstr "볼륨 버리기 중" msgid "Flush multiplier" msgstr "버리기 승수" @@ -10158,13 +10163,13 @@ msgid "" "The actual flushing volumes is equal to the flush multiplier multiplied by " "the flushing volumes in the table." msgstr "" -"실제 버리는 용량은 버리기 승수에 테이블의 버리기 용량을 곱한 것과 같습니다." +"실제 버리기 부피는 버리기 승수에 테이블의 버리기 볼륨을 곱한 것과 같습니다." msgid "Prime volume" -msgstr "프라임 용량" +msgstr "프라임 부피" msgid "The volume of material to prime extruder on tower." -msgstr "탑에서 압출을 실행할 재료의 용량." +msgstr "탑에서 압출을 실행할 재료의 부피." msgid "Width" msgstr "너비" @@ -10192,7 +10197,7 @@ msgid "Wipe tower purge lines spacing" msgstr "닦기 타워 청소 선 간격" msgid "Spacing of purge lines on the wipe tower." -msgstr "닦기 타워의 버리기 선 간격입니다." +msgstr "닦기 타워의 청소(퍼지) 선 간격입니다." msgid "Wipe tower extruder" msgstr "닦기 타워 압출기" @@ -10205,15 +10210,15 @@ msgstr "" "하려면 0으로 설정하십시오(비가용성 재료가 적절함)." msgid "Purging volumes - load/unload volumes" -msgstr "버리기 용량 - 넣기/빼기 용량" +msgstr "제거 부피 - 넣기/빼기 부피" msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " "volumes below." msgstr "" -"이 벡터는 닦기 타워에서 사용되는 각 툴을 교체하는 데 필요한 용량을 저장합니다." -"이러한 값은 아래의 전체 청소 용량 생성을 단순화하는 데 사용됩니다." +"이 벡터는 닦기 타워에서 사용되는 각 툴을 교체하는 데 필요한 부피을 저장합니" +"다. 이러한 값은 아래의 전체 청소 부피 생성을 단순화하는 데 사용됩니다." msgid "" "Purging after filament change will be done inside objects' infills. This may " @@ -10221,19 +10226,19 @@ msgid "" "printed with transparent filament, the mixed color infill will be seen " "outside. It will not take effect, unless the prime tower is enabled." msgstr "" -"필라멘트 변경 후 버리기는 개체의 내부채움 내부에서 수행됩니다. 이렇게 하면 낭" -"비되는 양이 줄어들고 출력 시간이 단축될수 있습니다. 만약 벽이 투명한 필라멘트" -"로 출력된다면, 혼합된 색 내부채움가 밖에서 보일 것입니다. 프라임 타워가 활성" -"화되지 않으면 적용되지 않습니다." +"필라멘트 변경 후 버리기는 개체의 내부 채움 내부에서 수행됩니다. 이렇게 하면 " +"낭비되는 양이 줄어들고 출력 시간이 단축될 수 있습니다. 만약 벽이 투명한 필라" +"멘트로 출력된다면, 혼합된 색 내부 채움이 밖에서 보일 것입니다. 프라임 타워가 " +"활성화되지 않으면 적용되지 않습니다." 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 "" -"필라멘트 변경 후 버리기는 개체의 서포트 내부에서 수행됩니다. 이렇게 하면 낭비" -"되는 양이 줄어들고 출력 시간이 단축될수 있습니다. 프라임 타워가 활성화되지 않" -"으면 적용되지 않습니다." +"필라멘트 변경 후 버리기는 개체의 지지대 내부에서 수행됩니다. 이렇게 하면 낭비" +"되는 양이 줄어들고 출력 시간이 단축될 수 있습니다. 프라임 타워가 활성화되지 " +"않으면 적용되지 않습니다." msgid "" "This object will be used to purge the nozzle after a filament change to save " @@ -10245,10 +10250,10 @@ msgstr "" "다. 기본 타워가 활성화되지 않으면 적용되지 않습니다." msgid "Maximal bridging distance" -msgstr "최대 브리지 거리" +msgstr "최대 다리 거리" msgid "Maximal distance between supports on sparse infill sections." -msgstr "드문 내부채움 부분의 서포트 사이의 최대 거리." +msgstr "드문 내부 채움 부분의 지지대 사이의 최대 거리." msgid "X-Y hole compensation" msgstr "X-Y 구멍 보정" @@ -10276,7 +10281,7 @@ msgstr "" "의 조립 문제가 있을 때 크기를 약간 조정하는 데 사용됩니다" msgid "G-code thumbnails" -msgstr "G코드 미리보기" +msgstr "G코드 미리보기(썸네일)" msgid "" "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " @@ -10295,8 +10300,8 @@ msgid "" "BambuLab printers. Default is checked" msgstr "" "상대적 압출은 \"label_objects\" 옵션(기타; 개체 이름표)을 사용할 때 권장됩니" -"다. 일부 압출기는 이 옵션을 해제하면 더 잘 작동합니다(절대 압출 모드). 와이" -"프 타워는 상대 모드에서만 호환됩니다" +"다. 일부 압출기는 이 옵션을 해제하면 더 잘 작동합니다(절대 압출 모드). 닦기 " +"타워는 상대 모드에서만 호환됩니다" msgid "" "Classic wall generator produces walls with constant extrusion width and for " @@ -10304,7 +10309,7 @@ msgid "" "variable extrusion width" msgstr "" "클래식 벽 생성기는 일정한 압출 너비를 가진 벽을 생성하며 매우 얇은 영역에 대" -"해 갭 내부채움가 사용됩니다. 아라크네 엔진은 다양한 압출 너비를 가진 벽을 생" +"해 갭 내부 채움이 사용됩니다. 아라크네 엔진은 다양한 압출 너비를 가진 벽을 생" "성합니다" msgid "Classic" @@ -10341,7 +10346,7 @@ msgstr "" "다. 이 마진은 다음의 범위로 압출 너비를 확장합니다: [최소 벽 너비 - 마진, 2 " "* 최소 벽 너비 + 마진]. 이 마진이 증가하면 변환 횟수가 줄어들어 압출 시작/중" "지 횟수와 이동 시간이 줄어듭니다. 그러나, 큰 압출 너비 변동은 압출 과다 또는 " -"압출 과소 문제를 일으킬수 있습니다. 노즐 직경을 기준으로 백분율로 표시됩니다" +"압출 과소 문제를 일으킬 수 있습니다. 노즐 직경을 기준으로 백분율로 표시됩니다" msgid "Wall transitioning threshold angle" msgstr "벽 변환 임계값" @@ -10354,9 +10359,9 @@ msgid "" "leave gaps or overextrude" msgstr "" "벽의 짝수와 홀수 사이에 변환을 만드는 시기. 이 설정보다 큰 각도의 쐐기 모양" -"은 변환되지 않으며 나머지 공간을 내부채움 위해 중앙에 벽이 출력되지 않습니" -"다. 이 설정을 줄이면 중앙 벽의 수와 길이가 줄어들지만 간격이 남거나 과도하게 " -"돌출될수 있습니다" +"은 변환되지 않으며 나머지 공간 채움을 위해 중앙에 벽이 출력되지 않습니다. 이 " +"설정을 줄이면 중앙 벽의 수와 길이가 줄어들지만 간격이 남거나 과도하게 돌출될 " +"수 있습니다" msgid "Wall distribution count" msgstr "벽 분포 수" @@ -10390,7 +10395,7 @@ msgid "" "expected to enhance adhesion." msgstr "" "첫 번째 레이어에 사용되는 최소 벽 너비는 노즐과 동일한 크기로 설정하는 것이 " -"좋습니다. 이러한 조정을 통해 안착력이 향상될수 있습니다." +"좋습니다. 이러한 조정을 통해 접착력이 향상될 수 있습니다." msgid "Minimum wall width" msgstr "최소 벽 너비" @@ -10406,16 +10411,16 @@ msgstr "" "대한 백분율로 표시됩니다" msgid "Detect narrow internal solid infill" -msgstr "좁은 꽉찬 내부채움 감지" +msgstr "좁은 내부 꽉찬 내부 채움 감지" msgid "" "This option will auto detect narrow internal solid infill area. If enabled, " "concentric pattern will be used for the area to speed printing up. " "Otherwise, rectilinear pattern is used defaultly." msgstr "" -"이 옵션은 좁은 꽉찬 내부채움 영역을 자동으로 감지합니다. 활성화하면 출력 속도" -"를 높이기 위해 해당 영역에 동심 패턴이 사용됩니다. 그렇지 않으면 직선 패턴이 " -"기본적으로 사용됩니다." +"이 옵션은 좁은 내부 꽉찬 내부 채움 영역을 자동으로 감지합니다. 활성화하면 출" +"력 속도를 높이기 위해 해당 영역에 동심 패턴이 사용됩니다. 그렇지 않으면 직선 " +"패턴이 기본적으로 사용됩니다." msgid "invalid value " msgstr "잘못된 값 " @@ -10461,7 +10466,7 @@ msgid "Slice" msgstr "슬라이스" msgid "Slice the plates: 0-all plates, i-plate i, others-invalid" -msgstr "베드 슬라이스: 0-모든 베드, i-베드 i, 기타-잘못됨" +msgstr "플레이트 슬라이스: 0-모든 플레이트, i-플레이트 i, 기타-잘못됨" msgid "Show command help." msgstr "명령 도움말을 표시합니다." @@ -10479,7 +10484,7 @@ msgid "Load first filament as default for those not loaded" msgstr "로드되지 않은 경우 기본값으로 첫 번째 필라멘트 로드" msgid "Minimum save" -msgstr "최소 저장" +msgstr "최소 크기로 저장" msgid "export 3mf with minimum size." msgstr "최소 크기로 3mf를 내보냅니다." @@ -10488,13 +10493,13 @@ msgid "mtcpp" msgstr "mtcpp" msgid "max triangle count per plate for slicing." -msgstr "슬라이싱을 위한 베드당 최대 삼각형 개수." +msgstr "슬라이싱을 위한 플레이트당 최대 삼각형 개수." msgid "mstpp" msgstr "mstpp" msgid "max slicing time per plate in seconds." -msgstr "베드당 최대 슬라이싱 시간(초)" +msgstr "플레이트당 최대 슬라이싱 시간(초)" msgid "No check" msgstr "확인 안 함" @@ -10518,13 +10523,13 @@ msgid "Export Settings" msgstr "설정 내보내기" msgid "Export settings to a file." -msgstr "설정을 파일로 내보내기." +msgstr "설정을 파일로 내보냅니다." msgid "Send progress to pipe" -msgstr "진행 상황을 파이프로 보내기" +msgstr "Send progress to pipe" msgid "Send progress to pipe." -msgstr "진행 상황을 파이프로 보내기." +msgstr "Send progress to pipe." msgid "Arrange Options" msgstr "정렬 옵션" @@ -10539,13 +10544,13 @@ msgid "Repetions count of the whole model" msgstr "전체 모델의 반복 횟수" msgid "Ensure on bed" -msgstr "베드에서 확인" +msgstr "Ensure on bed" msgid "" "Lift the object above the bed when it is partially below. Disabled by default" msgstr "" -"물건의 일부가 베드 아래에 있을 때 베드 위로 물건을 들어 올리십시오. 기본적으" -"로 비활성화됨" +"개체의 일부가 베드 아래에 있을 때 베드 위로 개체를 들어올립니다. 기본적으로 " +"비활성화됩니다" msgid "Convert Unit" msgstr "단위 변환" @@ -10554,25 +10559,25 @@ msgid "Convert the units of model" msgstr "모델의 단위를 변환" msgid "Orient Options" -msgstr "방향 옵션" +msgstr "방향 최적화 옵션" msgid "Orient options: 0-disable, 1-enable, others-auto" -msgstr "방향 옵션: 0-비활성화, 1-활성화, 기타-자동" +msgstr "방향 최적화 옵션: 0-비활성화, 1-활성화, 기타-자동" msgid "Rotation angle around the Z axis in degrees." -msgstr "Z축을 중심으로 한 회전각도 입니다." +msgstr "Z축을 중심으로 한 회전 각도입니다." msgid "Rotate around X" msgstr "X를 중심으로 회전" msgid "Rotation angle around the X axis in degrees." -msgstr "X축을 중심으로 한 회전각도 입니다." +msgstr "X축을 중심으로 한 회전 각도입니다." msgid "Rotate around Y" msgstr "Y를 중심으로 회전" msgid "Rotation angle around the Y axis in degrees." -msgstr "Y축을 중심으로 한 회전각도 입니다." +msgstr "Y축을 중심으로 한 회전 각도입니다." msgid "Scale the model by a float factor" msgstr "부동 소수점 계수로 모델 크기 조정" @@ -10632,31 +10637,31 @@ msgstr "" "추적\n" msgid "Load custom gcode" -msgstr "맞춤 G코드 로드" +msgstr "사용자 설정 G코드 불러오기" msgid "Load custom gcode from json" -msgstr "json에서 맞춤 G코드 로드" +msgstr "사용자 설정 G코드를 json에서 불러오기" msgid "Error in zip archive" -msgstr "Zip 압축 오류" +msgstr "Zip 아카이브 오류" msgid "Generating walls" msgstr "벽 생성 중" msgid "Generating infill regions" -msgstr "내부채움 영역 생성 중" +msgstr "내부 채움 영역 생성 중" msgid "Generating infill toolpath" -msgstr "내부채움 툴 경로 생성 중" +msgstr "내부 채움 툴 경로 생성 중" msgid "Detect overhangs for auto-lift" -msgstr "Z 올리기를 위한 오버행 감지" +msgstr "Z 올리기를 위한 돌출부 감지" msgid "Generating support" -msgstr "서포트 생성 중" +msgstr "지지대 생성 중" msgid "Checking support necessity" -msgstr "서포트 필요성 확인" +msgstr "지지대 필요성 확인" msgid "floating regions" msgstr "떠있는 영역" @@ -10665,14 +10670,14 @@ msgid "floating cantilever" msgstr "떠있는 외팔보" msgid "large overhangs" -msgstr "큰 오버행" +msgstr "큰 돌출부" #, c-format, boost-format msgid "" "It seems object %s has %s. Please re-orient the object or enable support " "generation." msgstr "" -"개체 %s에 %s이(가) 있는 것 같습니다. 물체의 방향을 바꾸거나 서포트 생성을 활" +"개체 %s에 %s이(가) 있는 것 같습니다. 물체의 방향을 바꾸거나 지지대 생성을 활" "성화하십시오." msgid "Optimizing toolpath" @@ -10692,7 +10697,7 @@ msgid "" "their size or thickness and retry.\n" msgstr "" "감지된 레이어가 없습니다. STL 파일을 고치거나 크기 또는 두께를 확인하고 다시 " -"시도할수 있습니다.\n" +"시도할 수 있습니다.\n" msgid "" "An object's XY size compensation will not be used because it is also color-" @@ -10700,52 +10705,54 @@ msgid "" "XY Size compensation can not be combined with color-painting." msgstr "" "개체의 XY 크기 보정은 색으로 칠해져 있기 때문에 사용되지 않습니다.\n" -"XY 크기 보정은 컬러 페인팅과 결합할수 없습니다." +"XY 크기 보정은 컬러 페인팅과 결합할 수 없습니다." #, c-format, boost-format msgid "Support: generate toolpath at layer %d" -msgstr "서포트: 레이어 %d에서 툴 경로 생성" +msgstr "지지대: 레이어 %d에서 툴 경로 생성" msgid "Support: detect overhangs" -msgstr "서포트: 오버행 감지" +msgstr "지지대: 오버행 감지" msgid "Support: generate contact points" -msgstr "서포트: 접점 생성" +msgstr "지지대: 접점 생성" msgid "Support: propagate branches" -msgstr "서포트: 가지 증식" +msgstr "지지대: 가지 증식" msgid "Support: draw polygons" -msgstr "서포트: 폴리곤 그리기" +msgstr "지지대: 폴리곤 그리기" msgid "Support: generate toolpath" -msgstr "서포트: 툴 경로 생성" +msgstr "지지대: 툴 경로 생성" #, c-format, boost-format msgid "Support: generate polygons at layer %d" -msgstr "서포트: 레이어 %d에서 폴리곤 생성" +msgstr "지지대: 레이어 %d에서 폴리곤 생성" #, c-format, boost-format msgid "Support: fix holes at layer %d" -msgstr "서포트: 레이어 %d의 구멍 수정" +msgstr "지지대: 레이어 %d의 구멍 수정" #, c-format, boost-format msgid "Support: propagate branches at layer %d" -msgstr "서포트: 레이어 %d에서 가지 증식" +msgstr "지지대: 레이어 %d에서 가지 증식" msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" -"알수 없는 파일 형식: 입력 파일의 확장자는 .stl, .obj 또는 .amf(.xml)여야 합니다." +"알 수 없는 파일 형식: 입력 파일의 확장자는 .stl, .obj 또는 .amf(.xml)여야 합" +"니다." msgid "Loading of a model file failed." msgstr "모델 파일 로드에 실패했습니다." msgid "The supplied file couldn't be read because it's empty" -msgstr "제공된 파일이 비어 있어 읽을수 없습니다" +msgstr "제공된 파일이 비어 있어 읽을 수 없습니다" msgid "Unknown file format. Input file must have .3mf or .zip.amf extension." -msgstr "알수 없는 파일 형식: 입력 파일의 확장자는.3mf 또는.zip.amf여야 합니다." +msgstr "" +"알 수 없는 파일 형식: 입력 파일의 확장자는.3mf 또는.zip.amf여야 합니다." msgid "Canceled" msgstr "취소됨" @@ -10763,10 +10770,10 @@ msgid "The file contains invalid vertex index." msgstr "파일에 잘못된 꼭지점 인덱스가 포함되어 있습니다." msgid "This OBJ file couldn't be read because it's empty." -msgstr "이 OBJ 파일은 비어 있어서 읽을수 없습니다." +msgstr "이 OBJ 파일은 비어 있어서 읽을 수 없습니다." msgid "Flow Rate Calibration" -msgstr "압출량 교정" +msgstr "유량 교정" msgid "Max Volumetric Speed Calibration" msgstr "최대 체적 속도 교정" @@ -10806,7 +10813,7 @@ msgstr "교정 결과를 어떻게 사용하나요?" msgid "" "You could change the Flow Dynamics Calibration Factor in material editing" -msgstr "재료 편집에서 동적 압출량 교정 계수를 변경할수 있습니다" +msgstr "재료 편집에서 동적 유량 교정 계수를 변경할 수 있습니다" msgid "" "The current firmware version of the printer does not support calibration.\n" @@ -10819,10 +10826,10 @@ msgid "Calibration not supported" msgstr "교정이 지원되지 않음" msgid "Flow Dynamics" -msgstr "동적 압출량" +msgstr "동적 유량" msgid "Flow Rate" -msgstr "압출량" +msgstr "유량" msgid "Max Volumetric Speed" msgstr "최대 체적 속도" @@ -10831,7 +10838,7 @@ msgid "Please enter the name you want to save to printer." msgstr "프린터에 저장할 이름을 입력하세요." msgid "The name cannot exceed 40 characters." -msgstr "이름은 40자를 초과할수 없습니다." +msgstr "이름은 40자를 초과할 수 없습니다." #, c-format, boost-format msgid "" @@ -10848,14 +10855,14 @@ msgstr "" "값 단계: >= %.3f)" msgid "The name cannot be empty." -msgstr "이름은 비워둘수 없습니다." +msgstr "이름은 비워둘 수 없습니다." #, boost-format msgid "The selected preset: %1% is not found." -msgstr "선택한 사전 설정: %1%를 찾을수 없습니다." +msgstr "선택한 사전 설정: %1%을(를) 찾을 수 없습니다." msgid "The name cannot be the same as the system preset name." -msgstr "이름은 시스템 사전 설정 이름과 동일할수 없습니다." +msgstr "이름은 시스템 사전 설정 이름과 동일할 수 없습니다." msgid "The name is the same as another existing preset name" msgstr "이름이 기존의 다른 사전 설정 이름과 동일합니다" @@ -10886,7 +10893,7 @@ msgid "The failed test result has been dropped." msgstr "실패한 테스트 결과가 삭제되었습니다." msgid "Flow Dynamics Calibration result has been saved to the printer" -msgstr "동적 압출량 교정 결과가 프린터에 저장되었습니다" +msgstr "동적 유량 교정 결과가 프린터에 저장되었습니다" msgid "Internal Error" msgstr "내부 오류" @@ -10895,13 +10902,13 @@ msgid "Please select at least one filament for calibration" msgstr "교정을 위해 하나 이상의 필라멘트를 선택하십시오" msgid "Flow rate calibration result has been saved to preset" -msgstr "압출량 교정 결과가 사전 설정에 저장되었습니다" +msgstr "유량 교정 결과가 사전 설정에 저장되었습니다" msgid "Max volumetric speed calibration result has been saved to preset" msgstr "최대 체적 속도 교정 결과가 사전 설정에 저장되었습니다" msgid "When do you need Flow Dynamics Calibration" -msgstr "동적 압출량 교정이 필요한 경우" +msgstr "동적 유량 교정이 필요한 경우" msgid "" "We now have added the auto-calibration for different filaments, which is " @@ -10914,7 +10921,7 @@ msgid "" "filament setting." msgstr "" "이제 다양한 필라멘트에 대한 자동 교정 기능이 추가되었습니다. 이 기능은 완전" -"히 자동화되었으며 결과는 나중에 사용할수 있도록 프린터에 저장됩니다. 다음과 " +"히 자동화되었으며 결과는 나중에 사용할 수 있도록 프린터에 저장됩니다. 다음과 " "같은 제한된 경우에만 보정을 수행해야 합니다.\n" "1. 다른 브랜드/모델의 새로운 필라멘트를 도입하거나 필라멘트가 습기에 노출된 " "경우;\n" @@ -10943,24 +10950,25 @@ 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 "" -"우리 위키에서 동적 압출량 교정에 대한 자세한 내용을 찾아보세요.\n" +"우리 위키에서 동적 유량 교정에 대한 자세한 내용을 찾아보세요.\n" "\n" -"일반적으로 교정은 필요하지 않습니다. 출력 시작 메뉴에서 \"동적 압출량 교정\" " -"옵션을 선택한 상태에서 단일 색상/재료 출력을 시작하면 프린터는 이전 방식을 따" -"르며 출력 전에 필라멘트를 교정합니다. 다중 색상/재료 출력을 시작하면 프린터" -"는 모든 필라멘트 전환 중에 필라멘트에 대한 기본 보상 매개변수를 사용하므로 대" -"부분의 경우 좋은 결과를 얻을수 있습니다.\n" +"일반적으로 교정은 필요하지 않습니다. 출력 시작 메뉴에서 \"동적 유량 교정\" 옵" +"션을 선택한 상태에서 단일 색상/재료 출력을 시작하면 프린터는 이전 방식을 따르" +"며 출력 전에 필라멘트를 교정합니다. 다중 색상/재료 출력을 시작하면 프린터는 " +"모든 필라멘트 전환 중에 필라멘트에 대한 기본 보상 매개변수를 사용하므로 대부" +"분의 경우 좋은 결과를 얻을 수 있습니다.\n" "\n" -"교정 결과를 신뢰할수 없게 만드는 몇 가지 경우가 있습니다. 텍스처 베드를 사용" -"하여 보정을 수행합니다. 베드의 안착력이 좋지 않습니다. (베드를 세척하거나 풀" -"을 바르십시오!) ...위키에서 자세한 내용을 확인할수 있습니다.\n" +"교정 결과를 신뢰할 수 없게 만드는 몇 가지 경우가 있습니다. 텍스처 플레이트를 " +"사용하여 보정을 수행합니다. 빌드 플레이트의 접착력이 좋지 않습니다. (빌드 플" +"레이트를 세척하거나 풀을 바르십시오!) ...위키에서 자세한 내용을 확인할 수 있" +"습니다.\n" "\n" "테스트에서 교정 결과에는 약 10%의 오차가 있으며, 이로 인해 각 교정에서 결과" -"가 정확히 동일하지 않을수 있습니다. 새로운 업데이트로 개선하기 위해 근본 원인" -"을 계속 조사하고 있습니다." +"가 정확히 동일하지 않을 수 있습니다. 새로운 업데이트로 개선하기 위해 근본 원" +"인을 계속 조사하고 있습니다." msgid "When to use Flow Rate Calibration" -msgstr "압출량 교정을 사용해야 하는 경우" +msgstr "유량 교정을 사용해야 하는 경우" msgid "" "After using Flow Dynamics Calibration, there might still be some extrusion " @@ -10973,7 +10981,7 @@ msgid "" "4. Weak Structural Integrity: Prints break easily or don't seem as sturdy as " "they should be." msgstr "" -"동적 압출량 교정을 사용한 후에도 다음과 같은 압출 문제가 여전히 발생할수 있습" +"동적 유량 교정을 사용한 후에도 다음과 같은 압출 문제가 여전히 발생할 수 있습" "니다.\n" "1. 과다 압출: 출력된 개체에 재료가 너무 많아 얼룩이나 잡티가 형성되거나 레이" "어가 예상보다 두껍고 균일하지 않은 것처럼 보입니다.\n" @@ -10988,8 +10996,8 @@ msgid "" "PLA used in RC planes. These materials expand greatly when heated, and " "calibration provides a useful reference flow rate." msgstr "" -"또한 RC 비행기에 사용되는 LW-PLA와 같은 발포 재료에는 압출량 교정이 중요합니" -"다. 이러한 물질은 가열되면 크게 팽창하며 교정은 유용한 기준 압출량을 제공합니" +"또한 RC 비행기에 사용되는 LW-PLA와 같은 발포 재료에는 유량 교정이 중요합니" +"다. 이러한 물질은 가열되면 크게 팽창하며 교정은 유용한 기준 유량을 제공합니" "다." msgid "" @@ -11000,11 +11008,11 @@ msgid "" "you still see the listed defects after you have done other calibrations. For " "more details, please check out the wiki article." msgstr "" -"압출량 교정은 예상되는 압출량과 실제 압출량의 비율을 측정합니다. 기본 설정은 " -"사전 보정되고 미세 조정된 Bambu Lab 프린터 및 공식 필라멘트에서 잘 작동합니" -"다. 일반 필라멘트의 경우 일반적으로 다른 교정을 수행한 후에도 나열된 결함이 " -"표시되지 않는 한 압출량 교정을 수행할 필요가 없습니다. 자세한 내용은 위키를 " -"확인하시기 바랍니다." +"유량 교정은 예상되는 압출량과 실제 압출량의 비율을 측정합니다. 기본 설정은 사" +"전 보정되고 미세 조정된 Bambu Lab 프린터 및 공식 필라멘트에서 잘 작동합니다. " +"일반 필라멘트의 경우 일반적으로 다른 교정을 수행한 후에도 나열된 결함이 표시" +"되지 않는 한 유량 교정을 수행할 필요가 없습니다. 자세한 내용은 위키를 확인하" +"시기 바랍니다." msgid "" "Auto Flow Rate Calibration utilizes Bambu Lab's Micro-Lidar technology, " @@ -11024,19 +11032,19 @@ 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의 Micro-Lidar 기술을 활용하여 교정 패턴을 직접 " -"측정합니다. 그러나 특정 유형의 재료를 사용하면 이 방법의 효율성과 정확성이 저" -"하될수 있다는 점에 유의하시기 바랍니다. 특히, 투명 또는 반투명, 반짝이는 입" -"자 또는 고반사 마감 처리된 필라멘트는 이 교정에 적합하지 않을수 있으며 바람직" -"하지 않은 결과를 생성할수 있습니다.\n" +"자동 유량 교정은 Bambu Lab의 Micro-Lidar 기술을 활용하여 교정 패턴을 직접 측" +"정합니다. 그러나 특정 유형의 재료를 사용하면 이 방법의 효율성과 정확성이 저하" +"될 수 있다는 점에 유의하시기 바랍니다. 특히, 투명 또는 반투명, 반짝이는 입자 " +"또는 고반사 마감 처리된 필라멘트는 이 교정에 적합하지 않을 수 있으며 바람직하" +"지 않은 결과를 생성할 수 있습니다.\n" "\n" -"교정 결과는 각 교정 또는 필라멘트마다 다를수 있습니다. 우리는 시간이 지남에 " +"교정 결과는 각 교정 또는 필라멘트마다 다를 수 있습니다. 우리는 시간이 지남에 " "따라 펌웨어 업데이트를 통해 이 교정의 정확성과 호환성을 계속 개선하고 있습니" "다.\n" "\n" -"주의: 압출량 교정은 목적과 의미를 완전히 이해하는 사람만이 시도할수 있는 고" -"급 프로세스입니다. 잘못 사용하면 수준 이하의 출력이나 프린터 손상이 발생할 " -"수 있습니다. 반드시 절차를 주의 깊게 읽고 이해하신 후 진행하시기 바랍니다." +"주의: 유량 교정은 목적과 의미를 완전히 이해하는 사람만이 시도할 수 있는 고급 " +"프로세스입니다. 잘못 사용하면 수준 이하의 출력이나 프린터 손상이 발생할 수 있" +"습니다. 반드시 절차를 주의 깊게 읽고 이해하신 후 진행하시기 바랍니다." msgid "When you need Max Volumetric Speed Calibration" msgstr "최대 체적 속도 교정이 필요한 경우" @@ -11054,14 +11062,14 @@ msgid "materials with inaccurate filament diameter" msgstr "필라멘트 직경이 부정확한 재료" msgid "We found the best Flow Dynamics Calibration Factor" -msgstr "최고의 동적 압출량 교정 계수를 찾았습니다" +msgstr "최고의 동적 유량 교정 계수를 찾았습니다" msgid "" "Part of the calibration failed! You may clean the plate and retry. The " "failed test result would be dropped." msgstr "" -"교정의 일부가 실패했습니다! 베드를 청소하고 다시 시도할수 있습니다. 실패한 테" -"스트 결과는 삭제됩니다." +"교정의 일부가 실패했습니다! 플레이트를 청소하고 다시 시도할 수 있습니다. 실패" +"한 테스트 결과는 삭제됩니다." msgid "" "*We recommend you to add brand, materia, type, and even humidity level in " @@ -11087,10 +11095,10 @@ msgstr "" "하나만 저장됩니다. 과거 결과에 덮어쓰겠습니까?" msgid "Please find the best line on your plate" -msgstr "당신의 베드에서 가장 좋은 선을 찾아보세요" +msgstr "당신의 플레이트에서 가장 좋은 선을 찾아보세요" msgid "Please find the cornor with perfect degree of extrusion" -msgstr "완벽한 압출도를 가진 코너를 찾아주세요" +msgstr "완벽한 압출각도를 가진 모서리를 찾아주세요" msgid "Input Value" msgstr "입력값" @@ -11105,13 +11113,13 @@ msgid "Record Factor" msgstr "계수 기록" msgid "We found the best flow ratio for you" -msgstr "당신에게 가장 적합한 압출량 비율을 찾았습니다" +msgstr "당신에게 가장 적합한 유량 비율을 찾았습니다" msgid "Flow Ratio" -msgstr "압출량 비율" +msgstr "유량 비율" msgid "Please input a valid value (0.0 < flow ratio < 2.0)" -msgstr "유효한 값을 입력하십시오(0.0 < 압출량비율 < 2.0)" +msgstr "유효한 값을 입력하십시오(0.0 < 유량비율 < 2.0)" msgid "Please enter the name of the preset you want to save." msgstr "저장하고 싶은 사전 설정의 이름을 입력해주세요." @@ -11123,7 +11131,7 @@ msgid "Calibration2" msgstr "교정2" msgid "Please find the best object on your plate" -msgstr "당신의 베드에서 가장 좋은 개체를 찾아보세요" +msgstr "당신의 플레이트에서 가장 좋은 개체를 찾아보세요" msgid "Fill in the value above the block with smoothest top surface" msgstr "가장 매끄러운 윗면을 가진 블록 위의 값을 입력하세요" @@ -11133,7 +11141,7 @@ msgstr "교정2 건너뛰기" #, c-format, boost-format msgid "flow ratio : %s " -msgstr "압출량 비율 : %s " +msgstr "유량 비율 : %s " msgid "Please choose a block with smoothest top surface" msgstr "상단 표면이 가장 매끄러운 블록을 선택하세요" @@ -11151,7 +11159,7 @@ msgid "Complete Calibration" msgstr "교정 완료" msgid "Fine Calibration based on flow ratio" -msgstr "압출량비율에 따른 미세 교정" +msgstr "유량비율에 따른 미세 교정" msgid "Title" msgstr "제목" @@ -11160,8 +11168,8 @@ msgid "" "A test model will be printed. Please clear the build plate and place it back " "to the hot bed before calibration." msgstr "" -"테스트 모델이 출력됩니다. 교정 전에 베드를 청소하고 가열 베드에 다시 올려놓으" -"십시오." +"테스트 모델이 출력됩니다. 교정 전에 빌드 플레이트를 청소하고 히트 베드에 다" +"시 올려놓으십시오." msgid "Printing Parameters" msgstr "출력 매개변수" @@ -11173,7 +11181,7 @@ msgid " ℃" msgstr " ℃" msgid "Plate Type" -msgstr "베드 타입" +msgstr "플레이트 타입" msgid "filament position" msgstr "필라멘트 위치" @@ -11190,7 +11198,7 @@ msgid "" "- Different filament brand and family(Brand = Bambu, Family = Basic, Matte)" msgstr "" "교정 재료에 대한 팁:\n" -"- 동일한 히트베드 온도를 공유할수 있는 소재\n" +"- 동일한 히트베드 온도를 공유할 수 있는 소재\n" "- 다양한 필라멘트 브랜드 및 제품군(브랜드 = Bambu, 제품군 = Basic, Matte)" msgid "Error desc" @@ -11207,19 +11215,19 @@ msgstr "방법" #, c-format, boost-format msgid "%s is not compatible with %s" -msgstr "%s는 %s과(와) 호환되지 않습니다" +msgstr "%s은(는) %s과(와) 호환되지 않습니다" msgid "TPU is not supported for Flow Dynamics Auto-Calibration." -msgstr "TPU는 동적 압출량 자동 교정에서 지원되지 않습니다." +msgstr "TPU는 동적 유량 자동 교정에서 지원되지 않습니다." msgid "Connecting to printer" msgstr "프린터에 연결 중" msgid "From k Value" -msgstr "k 값에서" +msgstr "K 값에서" msgid "To k Value" -msgstr "k 값으로" +msgstr "K 값으로" msgid "Step value" msgstr "단계 값" @@ -11240,7 +11248,7 @@ msgid "To Volumetric Speed" msgstr "체적 속도로" msgid "Flow Dynamics Calibration Result" -msgstr "동적 압출량 교정 결과" +msgstr "동적 유량 교정 결과" msgid "No History Result" msgstr "기록 결과 없음" @@ -11249,13 +11257,13 @@ msgid "Success to get history result" msgstr "기록 결과 가져오기 성공" msgid "Refreshing the historical Flow Dynamics Calibration records" -msgstr "과거 동적 압출량 교정 기록 새로 고침" +msgstr "과거 동적 유량 교정 기록 새로 고침" msgid "Action" msgstr "실행" msgid "Edit Flow Dynamics Calibration" -msgstr "동적 압출량 교정 편집" +msgstr "동적 유량 교정 편집" msgid "Network lookup" msgstr "네트워크 조회" @@ -11290,7 +11298,7 @@ msgstr "" "사용 할 IP를 선택해 주세요." msgid "Unable to perform boolean operation on selected parts" -msgstr "선택한 부품에서 부울 연산을 수행할수 없습니다" +msgstr "선택한 부품에서 부울 연산을 수행할 수 없습니다" msgid "Mesh Boolean" msgstr "메쉬 부울" @@ -11305,10 +11313,10 @@ msgid "Intersection" msgstr "교집합" msgid "Source Volume" -msgstr "소스 용량" +msgstr "소스 볼륨" msgid "Tool Volume" -msgstr "도구 용량" +msgstr "도구 볼륨" msgid "Subtract from" msgstr "다음에서 잘라내기" @@ -11391,10 +11399,10 @@ msgid "PA Calibration" msgstr "PA 교정" msgid "DDE" -msgstr "다이렉트" +msgstr "다이렉트 드라이브(DDE)" msgid "Bowden" -msgstr "보우덴" +msgstr "보우덴(Bowden)" msgid "Extruder type" msgstr "압출기 타입" @@ -11519,10 +11527,10 @@ msgstr "" "끝 > 시작 + 단계)" msgid "Start retraction length: " -msgstr "리트렉션시작 길이: " +msgstr "퇴출 시작 길이: " msgid "End retraction length: " -msgstr "리트렉션 종료 길이: " +msgstr "퇴출 종료 길이: " msgid "mm/mm" msgstr "mm/mm" @@ -11537,7 +11545,7 @@ msgid "Test" msgstr "테스트" msgid "Could not get a valid Printer Host reference" -msgstr "유효한 프린터 호스트 참조를 가져올수 없습니다" +msgstr "유효한 프린터 호스트 참조를 가져올 수 없습니다" msgid "Success!" msgstr "성공!" @@ -11582,8 +11590,8 @@ msgid "" "Unable to calibrate: maybe because the set calibration value range is too " "large, or the step is too small" msgstr "" -"교정할수 없음: 설정된 교정 값 범위가 너무 크거나 단계가 너무 작기 때문일수 있" -"습니다" +"교정할 수 없음: 설정된 교정 값 범위가 너무 크거나 단계가 너무 작기 때문일 수 " +"있습니다" msgid "Need select printer" msgstr "프린터 선택 필요" @@ -11605,7 +11613,7 @@ msgid "" "cutting tool?" msgstr "" "자르기 도구\n" -"자르기 도구로 어떤 각도와 위치에서도 모델을 자를수 있다는 사실을 알고 있습니" +"자르기 도구로 어떤 각도와 위치에서도 모델을 자를 수 있다는 사실을 알고 있습니" "까?" #: resources/data/hints.ini: [hint:Fix Model] @@ -11615,7 +11623,7 @@ msgid "" "problems?" msgstr "" "모델 수리\n" -"많은 슬라이싱 문제를 피하기 위해 손상된 3D 모델을 수리할수 있다는 것을 알고 " +"많은 슬라이싱 문제를 피하기 위해 손상된 3D 모델을 수리할 수 있다는 것을 알고 " "있습니까?" #: resources/data/hints.ini: [hint:Timelapse] @@ -11624,7 +11632,7 @@ msgid "" "Did you know that you can generate a timelapse video during each print?" msgstr "" "타임랩스\n" -"출력할 때마다 타임랩스 비디오를 생성할수 있다는 사실을 알고 있습니까?" +"출력할 때마다 타임랩스 비디오를 생성할 수 있다는 사실을 알고 있습니까?" #: resources/data/hints.ini: [hint:Auto-Arrange] msgid "" @@ -11632,7 +11640,7 @@ msgid "" "Did you know that you can auto-arrange all objects in your project?" msgstr "" "자동 정렬\n" -"프로젝트의 모든 개체를 자동으로 정렬할수 있다는 사실을 알고 있습니까?" +"프로젝트의 모든 개체를 자동으로 정렬할 수 있다는 사실을 알고 있습니까?" #: resources/data/hints.ini: [hint:Auto-Orient] msgid "" @@ -11641,7 +11649,7 @@ msgid "" "printing by a simple click?" msgstr "" "자동 방향\n" -"간단한 클릭으로 출력를 위한 최적의 방향으로 개체를 회전할수 있다는 사실을 알" +"간단한 클릭으로 출력을 위한 최적의 방향으로 개체를 회전할 수 있다는 사실을 알" "고 있습니까?" #: resources/data/hints.ini: [hint:Lay on Face] @@ -11652,9 +11660,9 @@ msgid "" "F key." msgstr "" "바닥면 선택\n" -"모델의 면 중 하나가 프린터 베드에 놓이도록 모델의 방향을 빠르게 지정할수 있다" -"는 사실을 알고 있습니까? \"바닥면 선택\" 기능을 선택하거나 F 키를 누르" -"십시오." +"모델의 면 중 하나가 프린터 베드에 놓이도록 모델의 방향을 빠르게 지정할 수 있" +"다는 사실을 알고 있습니까? \"바닥면 선택\" 기능을 선택하거나 F 키를 누" +"르십시오." #: resources/data/hints.ini: [hint:Object List] msgid "" @@ -11663,8 +11671,8 @@ msgid "" "settings for each object/part?" msgstr "" "개체 목록\n" -"목록의 모든 개체/부품을 보고 각 개체/부품에 대한 설정을 변경할수 있다는 것을 " -"알고 있습니까?" +"목록의 모든 개체/부품을 보고 각 개체/부품에 대한 설정을 변경할 수 있다는 것" +"을 알고 있습니까?" #: resources/data/hints.ini: [hint:Simplify Model] msgid "" @@ -11674,8 +11682,8 @@ msgid "" "more in the documentation." msgstr "" "모델 단순화\n" -"메쉬 단순화 기능을 사용하여 메쉬의 삼각형 수를 줄일수 있다는 사실을 알고 있습" -"니까? 모델을 마우스 오른쪽 버튼으로 클릭하고 모델 단순화를 선택합니다. 자세" +"메쉬 단순화 기능을 사용하여 메쉬의 삼각형 수를 줄일 수 있다는 사실을 알고 있" +"습니까? 모델을 마우스 오른쪽 버튼으로 클릭하고 모델 단순화를 선택합니다. 자세" "한 내용은 설명서를 참조하십시오." #: resources/data/hints.ini: [hint:Slicing Parameter Table] @@ -11685,7 +11693,7 @@ msgid "" "settings for each object/part?" msgstr "" "슬라이싱 매개변수 테이블\n" -"테이블의 모든 개체/부품을 보고 각 개체/부품에 대한 설정을 변경할수 있다는 것" +"테이블의 모든 개체/부품을 보고 각 개체/부품에 대한 설정을 변경할 수 있다는 것" "을 알고 있습니까?" #: resources/data/hints.ini: [hint:Split to Objects/Parts] @@ -11695,7 +11703,7 @@ msgid "" "colorizing or printing?" msgstr "" "개체/부품으로 분할\n" -"쉽게 색칠하거나 출력하기 위해 큰 개체를 작은 개체로 나눌수 있다는 것을 알고 " +"쉽게 색칠하거나 출력하기 위해 큰 개체를 작은 개체로 나눌 수 있다는 것을 알고 " "있습니까?" #: resources/data/hints.ini: [hint:Subtract a Part] @@ -11706,9 +11714,9 @@ msgid "" "directly in Orca Slicer. Read more in the documentation." msgstr "" "부품 비우기\n" -"비우기 부품 수정자를 사용하여 한 메쉬를 다른 메쉬에서 뺄수 있다는 것을 알고 " -"있습니까? 예를 들어 오르카 슬라이서에서 직접 쉽게 크기를 조정할수 있는 구멍" -"을 만들수 있습니다. 자세한 내용은 설명서를 참조하십시오." +"비우기 부품 수정자를 사용하여 한 메쉬를 다른 메쉬에서 뺄 수 있다는 것을 알고 " +"있습니까? 예를 들어 오르카 슬라이서에서 직접 쉽게 크기를 조정할 수 있는 구멍" +"을 만들 수 있습니다. 자세한 내용은 설명서를 참조하십시오." #: resources/data/hints.ini: [hint:STEP] msgid "" @@ -11719,7 +11727,7 @@ msgid "" "lower resolution STL. Give it a try!" msgstr "" "STEP\n" -"STL 대신 STEP 파일을 슬라이싱하여 출력 품질을 향상시킬수 있다는 사실을 알고 " +"STL 대신 STEP 파일을 슬라이싱하여 출력 품질을 향상시킬 수 있다는 사실을 알고 " "있습니까?\n" "Orca Slicer는 STEP 파일 슬라이싱을 지원하여 저해상도 STL보다 부드러운 결과를 " "제공합니다. 시도해 보세요!" @@ -11743,8 +11751,8 @@ msgid "" "prints? Depending on the material, you can improve the overall finish of the " "printed model by doing some fine-tuning." msgstr "" -"압출량 미세 조정\n" -"더 보기 좋은 출력물을 위해 압출량을 미세 조정할수 있다는 사실을 알고 있습니" +"유량 미세 조정\n" +"더 보기 좋은 출력물을 위해 유량을 미세 조정할 수 있다는 사실을 알고 있습니" "까? 재료에 따라 약간의 미세 조정을 통해 출력된 모델의 전체적인 마감을 개선할 " "수 있습니다." @@ -11755,9 +11763,9 @@ msgid "" "individual plates ready to print? This will simplify the process of keeping " "track of all the parts." msgstr "" -"출력을 베드로 분할\n" -"부품이 많은 모델을 출력할 준비가 된 개별 베드로 분할할수 있다는 사실을 알고 " -"있습니까? 이렇게 하면 모든 부품을 추적하는 프로세스가 간소화됩니다." +"출력을 플레이트로 분할\n" +"부품이 많은 모델을 출력할 준비가 된 개별 플레이트로 분할할 수 있다는 사실을 " +"알고 있습니까? 이렇게 하면 모든 부품을 추적하는 프로세스가 간소화됩니다." #: resources/data/hints.ini: [hint:Speed up your print with Adaptive Layer #: Height] @@ -11767,8 +11775,8 @@ msgid "" "Layer Height option? Check it out!" msgstr "" "적응형 레이어 높이로 출력 속도 향상\n" -"적응형 레이어 높이 옵션을 사용하여 모델을 더 빠르게 출력할수 있다는 사실을 알" -"고 있습니까? 확인해 보세요!" +"적응형 레이어 높이 옵션을 사용하여 모델을 더 빠르게 출력할 수 있다는 사실을 " +"알고 있습니까? 확인해 보세요!" #: resources/data/hints.ini: [hint:Support painting] msgid "" @@ -11777,9 +11785,9 @@ msgid "" "makes it easy to place the support material only on the sections of the " "model that actually need it." msgstr "" -"서포트 칠하기\n" -"서포트의 위치를 칠할수 있다는 것을 알고 있습니까? 이 기능을 사용하면 실제로 " -"필요한 모델 부위에만 서포트 재료를 쉽게 배치할수 있습니다." +"지지대 칠하기\n" +"지지대의 위치를 칠할 수 있다는 것을 알고 있습니까? 이 기능을 사용하면 실제로 " +"필요한 모델 부위에만 서포트 재료를 쉽게 배치할 수 있습니다." #: resources/data/hints.ini: [hint:Different types of supports] msgid "" @@ -11788,8 +11796,8 @@ msgid "" "supports work great for organic models, while saving filament and improving " "print speed. Check them out!" msgstr "" -"다양한 유형의 서포트\n" -"여러 유형의 서포트 중에서 선택할수 있다는 것을 알고 있습니까? 트리 서포트는 " +"다양한 유형의 지지대\n" +"여러 유형의 지지대 중에서 선택할 수 있다는 것을 알고 있습니까? 나무 지지대는 " "필라멘트를 절약하고 출력 속도를 향상시키면서 유기 모델에 적합합니다. 확인해 " "보세요!" @@ -11810,9 +11818,9 @@ 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 "" -"더 나은 안착을 위한 브림\n" -"출력 모델이 베드 표면과의 접촉면이 작을 때 브림를 사용하는 것이 좋다는 사실" -"을 알고 있습니까?" +"더 나은 안착을 위한 챙(브림)\n" +"출력 모델이 베드 표면과의 접촉면이 작을 때 챙(브림)를 사용하는 것이 좋다는 사" +"실을 알고 있습니까?" #: resources/data/hints.ini: [hint:Set parameters for multiple objects] msgid "" @@ -11821,8 +11829,8 @@ msgid "" "one time?" msgstr "" "여러 개체에 대한 매개변수 설정\n" -"선택한 모든 개체에 대한 슬라이싱 매개변수를 한 번에 설정할수 있다는 사실을 알" -"고 있습니까?" +"선택한 모든 개체에 대한 슬라이싱 매개변수를 한 번에 설정할 수 있다는 사실을 " +"알고 있습니까?" #: resources/data/hints.ini: [hint:Stack objects] msgid "" @@ -11830,7 +11838,7 @@ msgid "" "Did you know that you can stack objects as a whole one?" msgstr "" "개체 쌓기\n" -"물건을 통째로 쌓을수 있다는 사실을 알고 있습니까?" +"물건을 통째로 쌓을 수 있다는 사실을 알고 있습니까?" #: resources/data/hints.ini: [hint:Flush into support/objects/infill] msgid "" @@ -11838,9 +11846,9 @@ msgid "" "Did you know that you can save the wasted filament by flushing them into " "support/objects/infill during filament change?" msgstr "" -"서포트/개체/내부채움에 버리기\n" -"필라멘트를 교체하는 동안 낭비되는 필라멘트를 서포트/개체/내부채움에 쏟기(플러" -"쉬)하여 절약할수 있다는 사실을 알고 있습니까?" +"지지대/개체/내부 채움에 버리기\n" +"필라멘트를 교체하는 동안 낭비되는 필라멘트를 지지대/개체/내부 채움에 버리기하" +"여 절약할 수 있다는 사실을 알고 있습니까?" #: resources/data/hints.ini: [hint:Improve strength] msgid "" @@ -11849,8 +11857,8 @@ msgid "" "density to improve the strength of the model?" msgstr "" "강도 향상\n" -"모델의 강도를 개선하기 위해 더 많은 벽 루프와 더 높은 드문 내부채움 밀도를 사" -"용할수 있다는 것을 알고 있습니까?" +"모델의 강도를 개선하기 위해 더 많은 벽 루프와 더 높은 드문 내부 채움 밀도를 " +"사용할 수 있다는 것을 알고 있습니까?" #~ msgid "Cali" #~ msgstr "교정" @@ -11869,7 +11877,7 @@ msgstr "" #~ msgstr "" #~ "다른 레이어의 베드 온도가 초기 레이어의 베드 온도보다 %d°C 이상 낮습니" #~ "다.\n" -#~ "이로 인해 출력 중에 모델이 베드에서 탈출할수 있습니다" +#~ "이로 인해 출력 중에 모델이 빌드 플레이트에서 탈출할 수 있습니다" #~ msgid "" #~ "Bed temperature is higher than vitrification temperature of this " @@ -11879,7 +11887,7 @@ msgstr "" #~ "circulation or reduce the temperature of the hot bed" #~ msgstr "" #~ "침대 온도가 이 필라멘트의 유리화 온도보다 높습니다.\n" -#~ "노즐이 막히고 출력 오류가 발생할수 있습니다\n" +#~ "노즐이 막히고 출력 오류가 발생할 수 있습니다\n" #~ "출력 과정 중에는 프린터를 열어두어 공기가 순환되도록 하거나 핫 베드의 온도" #~ "를 낮추십시오" @@ -11905,23 +11913,23 @@ msgstr "" #~ msgstr "Bamabu High Temperature Plate" #~ msgid "Can't connect to the printer" -#~ msgstr "프린터에 연결할수 없습니다" +#~ msgstr "프린터에 연결할 수 없습니다" #~ msgid "Recommended temperature range" #~ msgstr "권장 온도 범위" #~ msgid "High Temp Plate" -#~ msgstr "고온 베드" +#~ msgstr "고온 플레이트" #~ msgid "" #~ "Bed temperature when high temperature plate is installed. Value 0 means " #~ "the filament does not support to print on the High Temp Plate" #~ msgstr "" -#~ "고온 베드 설치 시 베드 온도. 값 0은 필라멘트가 고온 베드에 출력하는 것을 " -#~ "지원하지 않음을 의미합니다" +#~ "고온 플레이트 설치 시 베드 온도. 값 0은 필라멘트가 고온 플레이트에 출력하" +#~ "는 것을 지원하지 않음을 의미합니다" #~ msgid "Internal bridge support thickness" -#~ msgstr "내부 다리 서포트 두께" +#~ msgstr "내부 다리 지지대 두께" #~ msgid "" #~ "If enabled, support loops will be generated under the contours of " @@ -11930,9 +11938,9 @@ msgstr "" #~ "when the sparse infill density is low.This value determines the thickness " #~ "of the support loops. 0 means disable this feature" #~ msgstr "" -#~ "활성화된 경우 내부 다리의 윤곽선 아래에 서포트 루프를 생성합니다. 이러한 " -#~ "서포트 루프는 내부 다리를 공중에서 압출하는 것을 방지하고, 특히 드문 채우" -#~ "기 밀도가 낮을 때 상단 표면 품질을 향상시킬수 있습니다. 이 값은 서포트 루" +#~ "활성화된 경우 내부 다리의 윤곽선 아래에 지지대 루프를 생성합니다. 이러한 " +#~ "지지대 루프는 내부 다리를 공중에서 압출하는 것을 방지하고, 특히 드문 채우" +#~ "기 밀도가 낮을 때 상단 표면 품질을 향상시킬 수 있습니다. 이 값은 지지대 루" #~ "프의 두께를 결정하며 0은 이 기능을 사용하지 않음을 의미합니다" #, c-format, boost-format @@ -11948,9 +11956,9 @@ msgstr "" #~ "save a lot of material (default), while hybrid style will create similar " #~ "structure to normal support under large flat overhangs." #~ msgstr "" -#~ "서포트의 모양. 일반 서포트의 경우, 격자는 보다 안정적인 서포트(기본값)가 " -#~ "생성되는 반면 맞춤 서포트는 재료를 절약하고 개체 자국을 줄입니다.\n" -#~ "트리 서포트의 경우 얇은 모양은 가지를 더 적극적으로 병합하고 많은 재료를 " +#~ "지지대의 모양. 일반 지지대의 경우, 격자는 보다 안정적인 지지대(기본값)가 " +#~ "생성되는 반면 맞춤 지지대는 재료를 절약하고 개체 자국을 줄입니다.\n" +#~ "나무 지지대의 경우 얇은 모양은 가지를 더 적극적으로 병합하고 많은 재료를 " #~ "절약합니다(기본값). 반면 혼합 스타일은 크고 평평한 오버행 아래에 일반 지지" #~ "대와 유사한 구조를 만듭니다." @@ -11966,8 +11974,8 @@ msgstr "" #~ "layer may cause the model broken free from build plate" #~ msgstr "" #~ "이 임계값 이상으로 다른 레이어의 베드 온도를 초기 레이어보다 낮추는 것을 " -#~ "권장하지 않습니다. 다른 레이어의 베드 온도가 너무 낮으면 베드에서 모델이 " -#~ "깨질수 있습니다" +#~ "권장하지 않습니다. 다른 레이어의 베드 온도가 너무 낮으면 빌드 플레이트에" +#~ "서 모델이 깨질 수 있습니다" #~ msgid "Orient the model" #~ msgstr "모델 방향 설정" From 5636b6493f17fd4a58480aa3b45b91d341fc2ec4 Mon Sep 17 00:00:00 2001 From: Heiko Liebscher Date: Wed, 11 Oct 2023 16:21:34 +0200 Subject: [PATCH 08/18] fix de for 1.8 new features (#2378) fix --- localization/i18n/OrcaSlicer.pot | 89 +++++++++++++++++--- localization/i18n/de/OrcaSlicer_de.po | 115 +++++++++++++++++++++----- 2 files changed, 172 insertions(+), 32 deletions(-) diff --git a/localization/i18n/OrcaSlicer.pot b/localization/i18n/OrcaSlicer.pot index 26aa1b30e33..f7e02a7636c 100644 --- a/localization/i18n/OrcaSlicer.pot +++ b/localization/i18n/OrcaSlicer.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-30 10:27+0800\n" +"POT-Creation-Date: 2023-10-10 11:06+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -2917,7 +2917,7 @@ msgstr "" msgid "Size:" msgstr "" -#, possible-c-format, possible-boost-format +#, possible-boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4142,6 +4142,24 @@ msgstr "" msgid "Printer settings" msgstr "" +msgid "Remove current plate (if not last one)" +msgstr "" + +msgid "Auto orient objects on current plate" +msgstr "" + +msgid "Arrange objects on current plate" +msgstr "" + +msgid "Unlock current plate" +msgstr "" + +msgid "Lock current plate" +msgstr "" + +msgid "Customize current plate" +msgstr "" + msgid "Untitled" msgstr "" @@ -5421,8 +5439,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add Primitive" -"\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add " +"Primitive\"->\"Timelapse Wipe Tower\"." msgstr "" msgid "Line width" @@ -6769,6 +6787,19 @@ msgid "" "effect" msgstr "" +msgid "Elephant foot compensation layers" +msgstr "" + +msgid "" +"The number of layers on which the elephant foot compensation will be active. " +"The first layer will be shrunk by the elephant foot compensation value, then " +"the next layers will be linearly shrunk less, up to the layer indicated by " +"this value." +msgstr "" + +msgid "layers" +msgstr "" + msgid "" "Slicing height for each layer. Smaller layer height means more accurate and " "more printing time" @@ -7234,9 +7265,6 @@ msgid "" "layer used to be closed to get better build plate adhesion" msgstr "" -msgid "layers" -msgstr "" - msgid "Don't support bridges" msgstr "" @@ -7882,10 +7910,10 @@ msgstr "" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" -"\". \"full_fan_speed_layer\" will be ignored if lower 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." +"\"close_fan_the_first_x_layers\" to maximum at layer " +"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " +"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 "" msgid "Support interface fan speed" @@ -8171,6 +8199,9 @@ msgstr "" msgid "Ironing Pattern" msgstr "" +msgid "The pattern that will be used when ironing" +msgstr "" + msgid "Ironing flow" msgstr "" @@ -8191,6 +8222,14 @@ msgstr "" msgid "Print speed of ironing lines" msgstr "" +msgid "Ironing angle" +msgstr "" + +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" + msgid "This gcode part is inserted at every layer change after lift z" msgstr "" @@ -9429,6 +9468,34 @@ msgid "" "assembling issue" msgstr "" +msgid "Convert holes to polyholes" +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 " +"compute the polyhole.\n" +"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" +msgstr "" + +msgid "Polyhole detection margin" +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "" +"Maximum defection of a point to the estimated radius of the circle.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" +"In mm or in % of the radius." +msgstr "" + +msgid "Polyhole twist" +msgstr "" + +msgid "Rotate the polyhole every layer." +msgstr "" + msgid "G-code thumbnails" msgstr "" diff --git a/localization/i18n/de/OrcaSlicer_de.po b/localization/i18n/de/OrcaSlicer_de.po index 393cc14512e..af41e95647f 100644 --- a/localization/i18n/de/OrcaSlicer_de.po +++ b/localization/i18n/de/OrcaSlicer_de.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-03 14:55+0200\n" +"POT-Creation-Date: 2023-10-10 11:06+0200\n" "PO-Revision-Date: \n" "Last-Translator: Heiko Liebscher \n" "Language-Team: \n" @@ -671,7 +671,8 @@ msgid "Choose one file (3mf):" msgstr "Wählen sie eine Datei (3mf):" msgid "Choose one or more files (3mf/step/stl/svg/obj/amf/usd*/abc/ply):" -msgstr "Wählen sie eine oder mehrere Dateien (3mf/step/stl/svg/obj/amf/usd*/abc/ply):" +msgstr "" +"Wählen sie eine oder mehrere Dateien (3mf/step/stl/svg/obj/amf/usd*/abc/ply):" msgid "Choose one or more files (3mf/step/stl/svg/obj/amf):" msgstr "Wählen sie eine oder mehrere Dateien (3mf/step/stl/svg/obj/amf):" @@ -1545,7 +1546,7 @@ msgid "?" msgstr "?" msgid "/" -msgstr "" +msgstr "/" msgid "Empty" msgstr "Leer" @@ -2720,7 +2721,8 @@ msgid "Paused due to AMS lost" msgstr "Pausiert aufgrund eines AMS-Verlustes" msgid "Paused due to low speed of the heat break fan" -msgstr "Pausiert aufgrund einer zu niedrigen Geschwindigkeit des Heatbreak-Lüfters" +msgstr "" +"Pausiert aufgrund einer zu niedrigen Geschwindigkeit des Heatbreak-Lüfters" msgid "Paused due to chamber temperature control error" msgstr "Pausiert aufgrund eines Fehlers bei der Kammer-Temperaturregelung" @@ -4217,8 +4219,8 @@ msgid "" "\n" " error code: " msgstr "" -"Ihr Kommentarergebnis kann aus einigen Gründen nicht hochgeladen werden. " -"Wie folgt:\n" +"Ihr Kommentarergebnis kann aus einigen Gründen nicht hochgeladen werden. Wie " +"folgt:\n" "\n" " Fehlercode: " @@ -4492,6 +4494,24 @@ msgstr "Filamenteinstellungen" msgid "Printer settings" msgstr "Drucker-Einstellungen" +msgid "Remove current plate (if not last one)" +msgstr "entferne aktuelle Platte (wenn nicht die letzte)" + +msgid "Auto orient objects on current plate" +msgstr "Automatische Ausrichtung der Objekte auf der aktuellen Platte" + +msgid "Arrange objects on current plate" +msgstr "Ausrichtung der Objekte auf der aktuellen Platte" + +msgid "Unlock current plate" +msgstr "Entsperre aktuelle Platte " + +msgid "Lock current plate" +msgstr "Speere aktuelle Platte" + +msgid "Customize current plate" +msgstr "Aktuelle Platte anpassen" + msgid "Untitled" msgstr "Unbenannt" @@ -5547,7 +5567,8 @@ msgid "Flow Dynamics Calibration" msgstr "Dynamische Flusskalibrierung" msgid "Click here if you can't connect to the printer" -msgstr "Klicken Sie hier, wenn Sie keine Verbindung zum Drucker herstellen können" +msgstr "" +"Klicken Sie hier, wenn Sie keine Verbindung zum Drucker herstellen können" msgid "send completed" msgstr "Senden abgeschlossen" @@ -6124,8 +6145,8 @@ msgid "" "High Temp Plate" msgstr "" "Dies ist die Betttemperatur, wenn die glatte PEI-Platte installiert ist. Ein " -"Wert von 0 bedeutet, dass das Filament auf der glatten PEI-/Hochtemperatur Platte nicht " -"unterstützt wird." +"Wert von 0 bedeutet, dass das Filament auf der glatten PEI-/Hochtemperatur " +"Platte nicht unterstützt wird." msgid "Textured PEI Plate" msgstr "Texturierte PEI-Platte" @@ -7314,8 +7335,7 @@ msgstr "" msgid "Variable layer height is not supported with Organic supports." msgstr "" -"Variable Schichthöhe wird nicht mit organischen Stützstrukturen " -"unterstützt." +"Variable Schichthöhe wird nicht mit organischen Stützstrukturen unterstützt." msgid "The prime tower is not supported in \"By object\" print." msgstr "Der Reinigungsturm wird im \"Nach Objekt\"-Druck nicht unterstützt." @@ -8804,7 +8824,6 @@ msgid "" msgstr "" "Klipper's max_accel_to_decel wird auf diesen %% der Beschleunigung verändert" - #, c-format, boost-format msgid "%%" msgstr "%%" @@ -9055,7 +9074,8 @@ msgid "Best object position" msgstr "Beste Objektposition" msgid "Best auto arranging position in range [0,1] w.r.t. bed shape." -msgstr "Beste automatische Positionierung im Bereich [0,1] bezogen auf das Bett." +msgstr "" +"Beste automatische Positionierung im Bereich [0,1] bezogen auf das Bett." msgid "Enable this option if machine has auxiliary part cooling fan" msgstr "" @@ -9127,7 +9147,8 @@ msgid "Support air filtration" msgstr "Luftfilterung unterstützen" msgid "Enable this if printer support air filtration" -msgstr "Aktivieren Sie diese Option, wenn der Drucker die Luftfilterung unterstützt" +msgstr "" +"Aktivieren Sie diese Option, wenn der Drucker die Luftfilterung unterstützt" msgid "G-code flavor" msgstr "G-Code Typ" @@ -9249,6 +9270,9 @@ msgstr "Alle soliden Schichten" msgid "Ironing Pattern" msgstr "Bügelmuster" +msgid "The pattern that will be used when ironing" +msgstr "Das Muster, das beim Glätten verwendet wird" + msgid "Ironing flow" msgstr "Materialmenge" @@ -9272,6 +9296,16 @@ msgstr "Geschwindigkeit beim Glätten" msgid "Print speed of ironing lines" msgstr "Druckgeschwindigkeit der Glättlinien" +msgid "Ironing angle" +msgstr "Glättwinkel" + +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" +"Der Winkel, in dem das Glätten durchgeführt wird. Eine negative Zahl " +"deaktiviert diese Funktion und verwendet die Standardmethode." + msgid "This gcode part is inserted at every layer change after lift z" msgstr "" "Dieser G-Code wird bei jedem Schichtwechsel nach dem anheben von Z eingefügt." @@ -10584,12 +10618,13 @@ msgid "" "recommended" msgstr "" "Eine höhere Druckraumtemperatur kann das Verziehen unterdrücken oder " -"reduzieren und möglicherweise zu einer höheren Zwischenschichtbindungsfestig" -"keit für Hochtemperaturmaterialien wie ABS, ASA, PC, PA und so weiter führen." -" Gleichzeitig wird die Luftfiltration von ABS und ASA schlechter. Für PLA, " -"PETG, TPU, PVA und andere Materialien mit niedriger Temperatur sollte die " -"tatsächliche Druckraumtemperatur nicht hoch sein, um Verstopfungen zu " -"vermeiden, daher wird 0, was für das Ausschalten steht, dringend empfohlen." +"reduzieren und möglicherweise zu einer höheren " +"Zwischenschichtbindungsfestigkeit für Hochtemperaturmaterialien wie ABS, " +"ASA, PC, PA und so weiter führen. Gleichzeitig wird die Luftfiltration von " +"ABS und ASA schlechter. Für PLA, PETG, TPU, PVA und andere Materialien mit " +"niedriger Temperatur sollte die tatsächliche Druckraumtemperatur nicht hoch " +"sein, um Verstopfungen zu vermeiden, daher wird 0, was für das Ausschalten " +"steht, dringend empfohlen." msgid "Nozzle temperature for layers after the initial one" msgstr "Düsentemperatur nach der ersten Schicht" @@ -10823,6 +10858,44 @@ msgstr "" "Werte verkleinern Konturen. Diese Funktion wird verwendet, um die Größe " "geringfügig anzupassen, wenn Objekte Probleme bei der Montage haben." +msgid "Convert holes to polyholes" +msgstr "Konvertiere Löcher zu Polyholes" + +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 " +"compute the polyhole.\n" +"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" +msgstr "" +"Suchen Sie nach fast kreisförmigen Löchern, die sich über mehr als eine " +"Schicht erstrecken, und konvertieren Sie die Geometrie in Polyholes. " +"Verwenden Sie die Düsengröße und den (größten) Durchmesser, um das Polyhole " +"zu berechnen.\n" +"Siehe http://hydraraptor.blogspot.com/2011/02/polyholes.html" + +msgid "Polyhole detection margin" +msgstr "ab Wert erkenne Polyhole" + +#, fuzzy, c-format, boost-format +msgid "" +"Maximum defection of a point to the estimated radius of the circle.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" +"In mm or in % of the radius." +msgstr "" +"Maximale Abweichung eines Punktes vom geschätzten Radius des Kreises.\n" +"Da Zylinder oft als Dreiecke unterschiedlicher Größe exportiert werden, " +"liegen die Punkte möglicherweise nicht auf dem Umfang des Kreises. Diese " +"Einstellung ermöglicht es Ihnen, die Erkennung zu erweitern.\n" +"In mm oder in % des Radius." + +msgid "Polyhole twist" +msgstr "Polyhole verdrehen" + +msgid "Rotate the polyhole every layer." +msgstr "Polyhole in jeder Schicht drehen." + msgid "G-code thumbnails" msgstr "G-Code Vorschaubilder" @@ -11835,7 +11908,7 @@ msgid "0.5" msgstr "0,5" msgid "0.005" -msgstr "0,005" +msgstr "0,005" msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "Der Düsendurchmesser wurde aus den Druckereinstellungen synchronisiert" From 7a2b90069e960921bfb86f59537c04ed3c5c30fe Mon Sep 17 00:00:00 2001 From: SoftFever Date: Wed, 11 Oct 2023 22:29:03 +0800 Subject: [PATCH 09/18] update loacale --- localization/i18n/OrcaSlicer.pot | 16 +- localization/i18n/cs/OrcaSlicer_cs.po | 4203 ++++++++++------- localization/i18n/de/OrcaSlicer_de.po | 24 +- localization/i18n/en/OrcaSlicer_en.po | 75 +- localization/i18n/es/OrcaSlicer_es.po | 75 +- localization/i18n/fr/OrcaSlicer_fr.po | 75 +- localization/i18n/hu/OrcaSlicer_hu.po | 75 +- localization/i18n/it/OrcaSlicer_it.po | 75 +- localization/i18n/ja/OrcaSlicer_ja.po | 75 +- localization/i18n/ko/OrcaSlicer_ko.po | 91 +- localization/i18n/nl/OrcaSlicer_nl.po | 92 +- localization/i18n/ru/OrcaSlicer_ru.po | 75 +- localization/i18n/sv/OrcaSlicer_sv.po | 75 +- localization/i18n/tr/OrcaSlicer_tr.po | 4142 ++++++++++++---- localization/i18n/uk/OrcaSlicer_uk.po | 75 +- localization/i18n/zh_TW/OrcaSlicer_zh_TW.po | 75 +- localization/i18n/zh_cn/OrcaSlicer_zh_CN.po | 75 +- .../GUI/CalibrationWizardPresetPage.cpp | 2 +- src/slic3r/GUI/Tab.cpp | 4 +- 19 files changed, 6710 insertions(+), 2689 deletions(-) diff --git a/localization/i18n/OrcaSlicer.pot b/localization/i18n/OrcaSlicer.pot index f7e02a7636c..a87d3b96f42 100644 --- a/localization/i18n/OrcaSlicer.pot +++ b/localization/i18n/OrcaSlicer.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-10 11:06+0200\n" +"POT-Creation-Date: 2023-10-11 22:28+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -2917,7 +2917,7 @@ msgstr "" msgid "Size:" msgstr "" -#, possible-boost-format +#, possible-c-format, possible-boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -5439,8 +5439,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" msgid "Line width" @@ -7910,10 +7910,10 @@ msgstr "" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"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." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower 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 "" msgid "Support interface fan speed" diff --git a/localization/i18n/cs/OrcaSlicer_cs.po b/localization/i18n/cs/OrcaSlicer_cs.po index 2a01068adab..d68447f68af 100644 --- a/localization/i18n/cs/OrcaSlicer_cs.po +++ b/localization/i18n/cs/OrcaSlicer_cs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-30 10:27+0800\n" +"POT-Creation-Date: 2023-10-11 22:28+0800\n" "PO-Revision-Date: 2023-09-30 15:15+0200\n" "Last-Translator: René Mošner \n" "Language-Team: \n" @@ -111,11 +111,12 @@ msgstr "Plochou na podložku" #, boost-format msgid "" -"Filament count exceeds the maximum number that painting tool supports. only the first %1% filaments will " -"be available in painting tool." +"Filament count exceeds the maximum number that painting tool supports. only " +"the first %1% filaments will be available in painting tool." msgstr "" -"Počet filamentů překračuje maximální počet, který nástroj pro malování podporuje. Pouze prvních %1% " -"filamentů bude k dispozici v nástroji pro malování." +"Počet filamentů překračuje maximální počet, který nástroj pro malování " +"podporuje. Pouze prvních %1% filamentů bude k dispozici v nástroji pro " +"malování." msgid "Color Painting" msgstr "Barevná malba" @@ -415,11 +416,11 @@ msgstr "Procento decimace" #, boost-format msgid "" -"Processing model '%1%' with more than 1M triangles could be slow. It is highly recommended to simplify " -"the model." +"Processing model '%1%' with more than 1M triangles could be slow. It is " +"highly recommended to simplify the model." msgstr "" -"Zpracování modelu '%1%' s více než 1 milionem trojúhelníků může být pomalé. Je to Vřele doporučujeme pro " -"zjednodušení modelu." +"Zpracování modelu '%1%' s více než 1 milionem trojúhelníků může být pomalé. " +"Je to Vřele doporučujeme pro zjednodušení modelu." msgid "Simplify model" msgstr "Zjednodušit model" @@ -428,7 +429,8 @@ msgid "Simplify" msgstr "Zjednodušit" msgid "Simplification is currently only allowed when a single part is selected" -msgstr "Zjednodušení je v současné době povoleno pouze pokud je vybrán jeden díl" +msgstr "" +"Zjednodušení je v současné době povoleno pouze pokud je vybrán jeden díl" msgid "Error" msgstr "Chyba" @@ -558,31 +560,35 @@ msgid "Machine" msgstr "Stroj" msgid "Configuration package was loaded, but some values were not recognized." -msgstr "Konfigurační balíček byl načten, ale některé hodnoty nebyly rozpoznány." +msgstr "" +"Konfigurační balíček byl načten, ale některé hodnoty nebyly rozpoznány." #, boost-format -msgid "Configuration file \"%1%\" was loaded, but some values were not recognized." -msgstr "Konfigurační soubor \" %1% \" byl načten, ale některé hodnoty nebyly rozpoznány." +msgid "" +"Configuration file \"%1%\" was loaded, but some values were not recognized." +msgstr "" +"Konfigurační soubor \" %1% \" byl načten, ale některé hodnoty nebyly " +"rozpoznány." msgid "V" msgstr "V" 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." +"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 "" -"OrcaSlicer se ukončí z důvodu nedostatku paměti. Může to být chyba. Uvítáme, když problém nahlásíte " -"našemu týmu." +"OrcaSlicer se ukončí z důvodu nedostatku paměti. Může to být chyba. Uvítáme, " +"když problém nahlásíte našemu týmu." msgid "Fatal error" msgstr "Fatální chyba" msgid "" -"OrcaSlicer will terminate because of a localization error. It will be appreciated if you report the " -"specific scenario this issue happened." +"OrcaSlicer will terminate because of a localization error. It will be " +"appreciated if you report the specific scenario this issue happened." msgstr "" -"OrcaSlicer se ukončí kvůli chybě lokalizace. Bude to Oceňujeme, pokud nahlásíte konkrétní scénář, kdy k " -"tomuto problému došlo." +"OrcaSlicer se ukončí kvůli chybě lokalizace. Bude to Oceňujeme, pokud " +"nahlásíte konkrétní scénář, kdy k tomuto problému došlo." msgid "Critical error" msgstr "Kritická chyba" @@ -605,20 +611,23 @@ msgid "Connect %s failed! [SN:%s, code=%s]" msgstr "Připojení %s selhalo! [SN:%s, kód=%s]" msgid "" -"Orca Slicer requires the Microsoft WebView2 Runtime to operate certain features.\n" +"Orca Slicer requires the Microsoft WebView2 Runtime to operate certain " +"features.\n" "Click Yes to install it now." msgstr "" -"Orca Slicer vyžaduje Microsoft WebView2 Runtime pro provádění určitých funkcí.\n" +"Orca Slicer vyžaduje Microsoft WebView2 Runtime pro provádění určitých " +"funkcí.\n" "Klikněte na Ano pro jeho nainstalování nyní." msgid "WebView2 Runtime" msgstr "" msgid "" -"OrcaSlicer configuration file may be corrupted and is not abled to be parsed.Please delete the file and " -"try again." +"OrcaSlicer configuration file may be corrupted and is not abled to be parsed." +"Please delete the file and try again." msgstr "" -"Konfigurační soubor OrcaSlicer může být poškozen a nelze jej analyzovat.Smažte soubor a zkuste to znovu." +"Konfigurační soubor OrcaSlicer může být poškozen a nelze jej analyzovat." +"Smažte soubor a zkuste to znovu." #, c-format, boost-format msgid "" @@ -660,7 +669,8 @@ msgid "Choose one file (3mf):" msgstr "Vyberte jeden soubor (3mf):" msgid "Choose one or more files (3mf/step/stl/svg/obj/amf/usd*/abc/ply):" -msgstr "Vyberte jeden nebo více souborů (3mf/step/stl/svg/obj/amf/usd*/abc/ply):" +msgstr "" +"Vyberte jeden nebo více souborů (3mf/step/stl/svg/obj/amf/usd*/abc/ply):" msgid "Choose one or more files (3mf/step/stl/svg/obj/amf):" msgstr "Vyberte jeden nebo více souborů (3mf/step/stl/svg/obj/amf):" @@ -671,25 +681,29 @@ msgstr "Vyberte jeden soubor (gcode/3mf):" msgid "Some presets are modified." msgstr "Některé předvolby jsou upraveny." -msgid "You can keep the modifield presets to the new project, discard or save changes as new presets." +msgid "" +"You can keep the modifield presets to the new project, discard or save " +"changes as new presets." msgstr "" -"Předvolby modifield můžete ponechat pro nový projekt, zahodit nebo uložit změny jako nové předvolby." +"Předvolby modifield můžete ponechat pro nový projekt, zahodit nebo uložit " +"změny jako nové předvolby." msgid "User logged out" msgstr "Uživatel odhlášen" msgid "new or open project file is not allowed during the slicing process!" -msgstr "během procesu Slicovaní není povolen nový nebo otevřený soubor projektu!" +msgstr "" +"během procesu Slicovaní není povolen nový nebo otevřený soubor projektu!" msgid "Open Project" msgstr "Otevřít projekt" msgid "" -"The version of Orca Slicer is too low and needs to be updated to the latest version before it can be " -"used normally" +"The version of Orca Slicer is too low and needs to be updated to the latest " +"version before it can be used normally" msgstr "" -"Verze Orca Slicer je příliš nízká a je třeba ji aktualizovat na nejnovější verze předtím, než ji lze " -"normálně používat" +"Verze Orca Slicer je příliš nízká a je třeba ji aktualizovat na nejnovější " +"verze předtím, než ji lze normálně používat" msgid "Privacy Policy Update" msgstr "Aktualizace zásad ochrany osobních údajů" @@ -1132,7 +1146,8 @@ msgid "Click the icon to reset all settings of the object" msgstr "Kliknutím na ikonu resetujete všechna nastavení objektu" msgid "Right button click the icon to drop the object printable property" -msgstr "Kliknutím pravým tlačítkem na ikonu odstraníte vlastnost pro tisk objektu" +msgstr "" +"Kliknutím pravým tlačítkem na ikonu odstraníte vlastnost pro tisk objektu" msgid "Click the icon to toggle printable property of the object" msgstr "Kliknutím na ikonu přepnete tisknutelné vlastnosti objektu" @@ -1162,11 +1177,16 @@ msgid "Add Modifier" msgstr "Přidat modifikátor" msgid "Switch to per-object setting mode to edit modifier settings." -msgstr "Přepněte do režimu nastavení pro jednotlivé objekty pro úpravu nastavení modifikátoru." +msgstr "" +"Přepněte do režimu nastavení pro jednotlivé objekty pro úpravu nastavení " +"modifikátoru." -msgid "Switch to per-object setting mode to edit process settings of selected objects." +msgid "" +"Switch to per-object setting mode to edit process settings of selected " +"objects." msgstr "" -"Přepněte do režimu nastavení pro jednotlivé objekty a upravte procesní nastavení vybraných předmětů." +"Přepněte do režimu nastavení pro jednotlivé objekty a upravte procesní " +"nastavení vybraných předmětů." msgid "Delete connector from object which is a part of cut" msgstr "Odstranění spojky z objektu, který je částí řezu" @@ -1177,21 +1197,25 @@ msgstr "Smazat pevnou část objektu, která je součástí řezu" msgid "Delete negative volume from object which is a part of cut" msgstr "Smazat negativní objem z objektu, který je součástí řezu" -msgid "To save cut correspondence you can delete all connectors from all related objects." +msgid "" +"To save cut correspondence you can delete all connectors from all related " +"objects." msgstr "" -"Chcete-li uchovat informace o řezu, můžete odstranit všechny spojky ze všech souvisejících objektů." +"Chcete-li uchovat informace o řezu, můžete odstranit všechny spojky ze všech " +"souvisejících objektů." msgid "" "This action will break a cut correspondence.\n" "After that model consistency can't be guaranteed .\n" "\n" -"To manipulate with solid parts or negative volumes you have to invalidate cut infornation first." +"To manipulate with solid parts or negative volumes you have to invalidate " +"cut infornation first." msgstr "" "Tato akce způsobí ztrátu informací o řezu.\n" "Po této akci nelze zaručit konzistenci modelu. \n" "\n" -"Chcete-li manipulovat s částmi modelu nebo negativními objemy, musíte nejprve zneplatnit informace o " -"řezu modelu." +"Chcete-li manipulovat s částmi modelu nebo negativními objemy, musíte " +"nejprve zneplatnit informace o řezu modelu." msgid "Delete all connectors" msgstr "Smazat všechny spojky" @@ -1247,11 +1271,16 @@ msgstr "Vrstva" msgid "Selection conflicts" msgstr "Konflikty výběru" -msgid "If first selected item is an object, the second one should also be object." +msgid "" +"If first selected item is an object, the second one should also be object." msgstr "Pokud je první vybraná položka objekt, druhá by měla být také objekt." -msgid "If first selected item is a part, the second one should be part in the same object." -msgstr "Pokud je tato možnost povolena, zobrazí se při spuštění aplikace užitečné tipy." +msgid "" +"If first selected item is a part, the second one should be part in the same " +"object." +msgstr "" +"Pokud je tato možnost povolena, zobrazí se při spuštění aplikace užitečné " +"tipy." msgid "The type of the last solid object part is not to be changed." msgstr "Typ poslední části pevného objektu nelze změnit." @@ -1317,7 +1346,8 @@ msgid "Invalid numeric." msgstr "Neplatné číslo." msgid "one cell can only be copied to one or multiple cells in the same column" -msgstr "jednu buňku lze zkopírovat pouze do jedné nebo více buněk ve stejném sloupci" +msgstr "" +"jednu buňku lze zkopírovat pouze do jedné nebo více buněk ve stejném sloupci" msgid "multiple cells copy is not supported" msgstr "kopírování více buněk není podporováno" @@ -1569,10 +1599,11 @@ msgid "Grab new filament" msgstr "Vezměte nový filament" msgid "" -"Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically load or unload filiament." +"Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " +"load or unload filiament." msgstr "" -"Vyberte slot AMS a poté stiskněte \" Načíst \" nebo \" Uvolnit \" pro automatické načtení nebo vyjměte " -"vlákno." +"Vyberte slot AMS a poté stiskněte \" Načíst \" nebo \" Uvolnit \" pro " +"automatické načtení nebo vyjměte vlákno." msgid "Edit" msgstr "Upravit" @@ -1597,8 +1628,11 @@ msgstr "" msgid "Arranging..." msgstr "Uspořádávání..." -msgid "Arrange failed. Found some exceptions when processing object geometries." -msgstr "Uspořádání se nezdařilo. Při zpracování geometrií objektů bylo nalezeno několik výjimek." +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "" +"Uspořádání se nezdařilo. Při zpracování geometrií objektů bylo nalezeno " +"několik výjimek." msgid "Arranging" msgstr "Uspořádávání" @@ -1606,18 +1640,23 @@ msgstr "Uspořádávání" msgid "Arranging canceled." msgstr "Uspořádávání zrušeno." -msgid "Arranging is done but there are unpacked items. Reduce spacing and try again." -msgstr "Zajištění je hotovo, ale jsou tam rozbalené položky. Zmenšete mezery a zkuste to znovu." +msgid "" +"Arranging is done but there are unpacked items. Reduce spacing and try again." +msgstr "" +"Zajištění je hotovo, ale jsou tam rozbalené položky. Zmenšete mezery a " +"zkuste to znovu." msgid "Arranging done." msgstr "Uspořádávání dokončeno." #, c-format, boost-format msgid "" -"Arrangement ignored the following objects which can't fit into a single bed:\n" +"Arrangement ignored the following objects which can't fit into a single " +"bed:\n" "%s" msgstr "" -"Uspořádání ignorovalo následující objekty, které se nevejdou na jednu podložku:\n" +"Uspořádání ignorovalo následující objekty, které se nevejdou na jednu " +"podložku:\n" "%s" msgid "" @@ -1671,7 +1710,8 @@ msgid "Task canceled." msgstr "Úloha zrušena." msgid "Upload task timed out. Please check the network status and try again." -msgstr "Čas pro nahrávání úlohy vypršel. Zkontrolujte stav sítě a zkuste to znovu." +msgstr "" +"Čas pro nahrávání úlohy vypršel. Zkontrolujte stav sítě a zkuste to znovu." msgid "Cloud service connection failed. Please try again." msgstr "Připojení ke cloudové službě se nezdařilo. Zkuste to prosím znovu." @@ -1679,9 +1719,12 @@ msgstr "Připojení ke cloudové službě se nezdařilo. Zkuste to prosím znovu msgid "Print file not found. please slice again." msgstr "Tiskový soubor nebyl nalezen. Prosím znovu slicovat." -msgid "The print file exceeds the maximum allowable size (1GB). Please simplify the model and slice again." +msgid "" +"The print file exceeds the maximum allowable size (1GB). Please simplify the " +"model and slice again." msgstr "" -"Tiskový soubor překračuje maximální povolenou velikost (1 GB). Zjednodušte prosím model a znovu slicujte." +"Tiskový soubor překračuje maximální povolenou velikost (1 GB). Zjednodušte " +"prosím model a znovu slicujte." msgid "Failed to send the print job. Please try again." msgstr "Nepodařilo se odeslat tiskovou úlohu. Zkuste to prosím znovu." @@ -1689,17 +1732,27 @@ msgstr "Nepodařilo se odeslat tiskovou úlohu. Zkuste to prosím znovu." msgid "Failed to upload file to ftp. Please try again." msgstr "Selhalo nahrání souboru na FTP. Zkuste to prosím znovu." -msgid "Check the current status of the bambu server by clicking on the link above." +msgid "" +"Check the current status of the bambu server by clicking on the link above." msgstr "Zkontrolujte aktuální stav serveru bambu kliknutím na odkaz výše." -msgid "The size of the print file is too large. Please adjust the file size and try again." -msgstr "Velikost tiskového souboru je příliš velká. Upravte velikost souboru a zkuste to znovu." +msgid "" +"The size of the print file is too large. Please adjust the file size and try " +"again." +msgstr "" +"Velikost tiskového souboru je příliš velká. Upravte velikost souboru a " +"zkuste to znovu." msgid "Print file not found, Please slice it again and send it for printing." -msgstr "Tiskový soubor nebyl nalezen. Prosím, slicujte jej znovu a pošlete k tisku." +msgstr "" +"Tiskový soubor nebyl nalezen. Prosím, slicujte jej znovu a pošlete k tisku." -msgid "Failed to upload print file to FTP. Please check the network status and try again." -msgstr "Selhalo nahrání tiskového souboru na FTP. Zkontrolujte stav sítě a zkuste to znovu." +msgid "" +"Failed to upload print file to FTP. Please check the network status and try " +"again." +msgstr "" +"Selhalo nahrání tiskového souboru na FTP. Zkontrolujte stav sítě a zkuste to " +"znovu." msgid "Sending print job over LAN" msgstr "Odesílání tiskové úlohy přes LAN" @@ -1768,11 +1821,11 @@ msgid "Importing SLA archive" msgstr "Importuje se SLA archiv" msgid "" -"The SLA archive doesn't contain any presets. Please activate some SLA printer preset first before " -"importing that SLA archive." +"The SLA archive doesn't contain any presets. Please activate some SLA " +"printer preset first before importing that SLA archive." msgstr "" -"SLA archiv neobsahuje žádné přednastavení. Před importem tohoto SLA archivu nejprve aktivujte některé " -"přednastavení SLA tiskárny." +"SLA archiv neobsahuje žádné přednastavení. Před importem tohoto SLA archivu " +"nejprve aktivujte některé přednastavení SLA tiskárny." msgid "Importing canceled." msgstr "Import zrušen." @@ -1781,13 +1834,16 @@ msgid "Importing done." msgstr "Import dokončen." msgid "" -"The imported SLA archive did not contain any presets. The current SLA presets were used as fallback." +"The imported SLA archive did not contain any presets. The current SLA " +"presets were used as fallback." msgstr "" -"Importovaný archiv SLA neobsahoval žádné přednastavení. Aktuální SLA přednastavení bylo použito jako " -"záložní." +"Importovaný archiv SLA neobsahoval žádné přednastavení. Aktuální SLA " +"přednastavení bylo použito jako záložní." msgid "You cannot load SLA project with a multi-part object on the bed" -msgstr "Nelze načíst SLA projekt s objektem na podložce, který je složený z více částí" +msgstr "" +"Nelze načíst SLA projekt s objektem na podložce, který je složený z více " +"částí" msgid "Please check your object list before preset changing." msgstr "Před změnou nastavení zkontrolujte prosím seznam objektů." @@ -1829,21 +1885,23 @@ msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public License, verze 3" msgid "" -"Orca Slicer is based on BambuStudio by Bambulab, which is from PrusaSlicer by Prusa Research. " -"PrusaSlicer is from Slic3r by Alessandro Ranellucci and the RepRap community" +"Orca Slicer is based on BambuStudio by Bambulab, which is from PrusaSlicer " +"by Prusa Research. PrusaSlicer is from Slic3r by Alessandro Ranellucci and " +"the RepRap community" msgstr "" -"Orca Slicer je založen na BambuStudio od Bambulab, které je od PrusaSlicer od Prusa Research. " -"PrusaSlicer je od Slic3r od Alessandra Ranellucciho a komunita RepRap" +"Orca Slicer je založen na BambuStudio od Bambulab, které je od PrusaSlicer " +"od Prusa Research. PrusaSlicer je od Slic3r od Alessandra Ranellucciho a " +"komunita RepRap" msgid "Libraries" msgstr "Knihovny" msgid "" -"This software uses open source components whose copyright and other proprietary rights belong to their " -"respective owners" +"This software uses open source components whose copyright and other " +"proprietary rights belong to their respective owners" msgstr "" -"Tento software používá komponenty s otevřeným zdrojovým kódem, jejichž autorská práva a další vlastnická " -"práva náleží jejich příslušným vlastníkům" +"Tento software používá komponenty s otevřeným zdrojovým kódem, jejichž " +"autorská práva a další vlastnická práva náleží jejich příslušným vlastníkům" #, c-format, boost-format msgid "About %s" @@ -1861,8 +1919,11 @@ msgstr "BambuStudio je původně založeno na PrusaSlicer od PrusaResearch." msgid "PrusaSlicer is originally based on Slic3r by Alessandro Ranellucci." msgstr "PrusaSlicer je původně založen na Slic3r od Alessandra Ranellucciho." -msgid "Slic3r was created by Alessandro Ranellucci with the help of many other contributors." -msgstr "Slic3r vytvořil Alessandro Ranellucci s pomocí mnoha dalších přispěvatelů." +msgid "" +"Slic3r was created by Alessandro Ranellucci with the help of many other " +"contributors." +msgstr "" +"Slic3r vytvořil Alessandro Ranellucci s pomocí mnoha dalších přispěvatelů." msgid "Version" msgstr "Verze" @@ -1939,11 +2000,13 @@ msgid "Dynamic flow calibration" msgstr "Kalibrace dynamického průtoku" msgid "" -"The nozzle temp and max volumetric speed will affect the calibration results. Please fill in the same " -"values as the actual printing. They can be auto-filled by selecting a filament preset." +"The nozzle temp and max volumetric speed will affect the calibration " +"results. Please fill in the same values as the actual printing. They can be " +"auto-filled by selecting a filament preset." msgstr "" -"Teplota trysky a maximální objemová rychlost ovlivní výsledky kalibrace. Vyplňte prosím stejné hodnoty " -"jako při skutečném tisku. Mohou to být automaticky plněno výběrem předvolby filamentu." +"Teplota trysky a maximální objemová rychlost ovlivní výsledky kalibrace. " +"Vyplňte prosím stejné hodnoty jako při skutečném tisku. Mohou to být " +"automaticky plněno výběrem předvolby filamentu." msgid "Nozzle Diameter" msgstr "Průměr trysky" @@ -1976,11 +2039,13 @@ msgid "Next" msgstr "Další" 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." +"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 "" -"Kalibrace dokončena. Najděte nejjednotnější linii extruze na své horké podložce jako na obrázku níže a " -"vyplňte hodnotu na její levé straně do vstupního pole faktoru K." +"Kalibrace dokončena. Najděte nejjednotnější linii extruze na své horké " +"podložce jako na obrázku níže a vyplňte hodnotu na její levé straně do " +"vstupního pole faktoru K." msgid "Save" msgstr "Uložit" @@ -2011,7 +2076,8 @@ msgstr "Krok" msgid "AMS Slots" msgstr "AMS sloty" -msgid "Note: Only the AMS slots loaded with the same material type can be selected." +msgid "" +"Note: Only the AMS slots loaded with the same material type can be selected." msgstr "Poznámka: Lze vybrat pouze sloty AMS se stejným typem materiálu." msgid "Enable AMS" @@ -2030,33 +2096,38 @@ msgid "Cabin humidity" msgstr "Vlhkost v kabině" msgid "" -"Green means that AMS humidity is normal, orange represent humidity is high, red represent humidity is " -"too high.(Hygrometer: lower the better.)" +"Green means that AMS humidity is normal, orange represent humidity is high, " +"red represent humidity is too high.(Hygrometer: lower the better.)" msgstr "" -"Zelená znamená, že vlhkost AMS je normální, oranžová znamená vlhkost vysokou Červená znamená, že vlhkost " -"je příliš vysoká. (Vlhkoměr: čím nižší, tím lepší.)" +"Zelená znamená, že vlhkost AMS je normální, oranžová znamená vlhkost vysokou " +"Červená znamená, že vlhkost je příliš vysoká. (Vlhkoměr: čím nižší, tím " +"lepší.)" msgid "Desiccant status" msgstr "Stav vysoušedla" msgid "" -"A desiccant status lower than two bars indicates that desiccant may be inactive. Please change the " -"desiccant.(The bars: higher the better.)" +"A desiccant status lower than two bars indicates that desiccant may be " +"inactive. Please change the desiccant.(The bars: higher the better.)" msgstr "" -"Stav vysoušedla nižší než dva pruhy znamená, že vysoušedlo může být neaktivní. Vyměňte prosím " -"vysoušedlo. (Čáry: čím vyšší, tím lepší.)" +"Stav vysoušedla nižší než dva pruhy znamená, že vysoušedlo může být " +"neaktivní. Vyměňte prosím vysoušedlo. (Čáry: čím vyšší, tím lepší.)" msgid "" -"Note: When the lid is open or the desiccant pack is changed, it can take hours or a night to absorb the " -"moisture. Low temperatures also slow down the process. During this time, the indicator may not represent " -"the chamber accurately." +"Note: When the lid is open or the desiccant pack is changed, it can take " +"hours or a night to absorb the moisture. Low temperatures also slow down the " +"process. During this time, the indicator may not represent the chamber " +"accurately." msgstr "" -"Poznámka: Když je víko otevřené nebo je vyměněno balení vysoušedla, může to trvat hodiny nebo noc " -"absorbovat vlhkost. Nízké teploty také zpomalují proces. Během této doby indikátor nemusí představovat " -"komoru přesně." +"Poznámka: Když je víko otevřené nebo je vyměněno balení vysoušedla, může to " +"trvat hodiny nebo noc absorbovat vlhkost. Nízké teploty také zpomalují " +"proces. Během této doby indikátor nemusí představovat komoru přesně." -msgid "Config which AMS slot should be used for a filament used in the print job" -msgstr "Nastavit, který slot AMS by měl být použit pro filament použitý v tiskové úloze" +msgid "" +"Config which AMS slot should be used for a filament used in the print job" +msgstr "" +"Nastavit, který slot AMS by měl být použit pro filament použitý v tiskové " +"úloze" msgid "Filament used in this print job" msgstr "V této tiskové úloze použit filament" @@ -2079,21 +2150,26 @@ msgstr "Tisk s filamenty v ams" msgid "Print with filaments mounted on the back of the chassis" msgstr "Tisk s filamenty namontovanými na zadní straně šasi" -msgid "When the current material run out, the printer will continue to print in the following order." -msgstr "Když současný materiál dojde, tiskárna bude pokračovat v tisku v následujícím pořadí." +msgid "" +"When the current material run out, the printer will continue to print in the " +"following order." +msgstr "" +"Když současný materiál dojde, tiskárna bude pokračovat v tisku v " +"následujícím pořadí." msgid "Group" msgstr "Skupina" msgid "" -"There are currently no identical spare consumables available, and automatic replenishment is currently " -"not possible. \n" -"(Currently supporting automatic supply of consumables with the same brand, material type, and color)" +"There are currently no identical spare consumables available, and automatic " +"replenishment is currently not possible. \n" +"(Currently supporting automatic supply of consumables with the same brand, " +"material type, and color)" msgstr "" -"Aktuálně nejsou k dispozici žádné shodné náhradní spotřební materiály a automatické doplnění momentálně " -"není možné. \n" -"(Aktuálně podporuje automatické dodávky spotřebních materiálů se stejnou značkou, typem materiálu a " -"barvou)" +"Aktuálně nejsou k dispozici žádné shodné náhradní spotřební materiály a " +"automatické doplnění momentálně není možné. \n" +"(Aktuálně podporuje automatické dodávky spotřebních materiálů se stejnou " +"značkou, typem materiálu a barvou)" msgid "AMS Settings" msgstr "Nastavení AMS" @@ -2102,61 +2178,65 @@ msgid "Insertion update" msgstr "Aktualizace vložení" msgid "" -"The AMS will automatically read the filament information when inserting a new Bambu Lab filament. This " -"takes about 20 seconds." +"The AMS will automatically read the filament information when inserting a " +"new Bambu Lab filament. This takes about 20 seconds." msgstr "" -"AMS automaticky přečte informace o filamentu při vložení Nový filament Bambu Lab. To trvá asi 20 sekund." +"AMS automaticky přečte informace o filamentu při vložení Nový filament Bambu " +"Lab. To trvá asi 20 sekund." msgid "" -"Note: if new filament is inserted during printing, the AMS will not automatically read any information " -"until printing is completed." +"Note: if new filament is inserted during printing, the AMS will not " +"automatically read any information until printing is completed." msgstr "" -"Poznámka: Pokud se během tisku vloží nový filament, AMS nebude automaticky číst všechny informace, dokud " -"tisk neskončí." +"Poznámka: Pokud se během tisku vloží nový filament, AMS nebude automaticky " +"číst všechny informace, dokud tisk neskončí." msgid "" -"When inserting a new filament, the AMS will not automatically read its information, leaving it blank for " -"you to enter manually." +"When inserting a new filament, the AMS will not automatically read its " +"information, leaving it blank for you to enter manually." msgstr "" -"Při vkládání nového filamentu AMS automaticky nepřečte jeho informace, ponechte je prázdné, abyste je " -"mohli zadat ručně." +"Při vkládání nového filamentu AMS automaticky nepřečte jeho informace, " +"ponechte je prázdné, abyste je mohli zadat ručně." msgid "Power on update" msgstr "Aktualizovat při spuštění" 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." +"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 automaticky přečte informace o vloženém filamentu při spuštění. Bude to trvat asi 1 minutu. Proces " -"čtení bude navíjet cívku filamentu." +"AMS automaticky přečte informace o vloženém filamentu při spuštění. Bude to " +"trvat asi 1 minutu. Proces čtení bude navíjet cívku filamentu." msgid "" -"The AMS will not automatically read information from inserted filament during startup and will continue " -"to use the information recorded before the last shutdown." +"The AMS will not automatically read information from inserted filament " +"during startup and will continue to use the information recorded before the " +"last shutdown." msgstr "" -"AMS nebude automaticky číst informace z vloženého filamentu při spuštění a bude nadále používat " -"informace zaznamenané před posledním vypnutí." +"AMS nebude automaticky číst informace z vloženého filamentu při spuštění a " +"bude nadále používat informace zaznamenané před posledním vypnutí." msgid "Update remaining capacity" msgstr "Aktualizovat zbývající kapacitu" msgid "" -"The AMS will estimate Bambu filament's remaining capacity after the filament info is updated. During " -"printing, remaining capacity will be updated automatically." +"The AMS will estimate Bambu filament's remaining capacity after the filament " +"info is updated. During printing, remaining capacity will be updated " +"automatically." msgstr "" -"AMS odhadne zbývající kapacitu filamentu Bambu po filamentu informace jsou aktualizovány. Během tisku " -"bude aktualizována zbývající kapacita automaticky." +"AMS odhadne zbývající kapacitu filamentu Bambu po filamentu informace jsou " +"aktualizovány. Během tisku bude aktualizována zbývající kapacita automaticky." msgid "AMS filament backup" msgstr "AMS záloha filamentů" msgid "" -"AMS will continue to another spool with the same properties of filament automatically when current " -"filament runs out" +"AMS will continue to another spool with the same properties of filament " +"automatically when current filament runs out" msgstr "" -"AMS bude pokračovat na další cívku se stejnými vlastnostmi filamentu automaticky, když dojde aktuální " -"filament" +"AMS bude pokračovat na další cívku se stejnými vlastnostmi filamentu " +"automaticky, když dojde aktuální filament" msgid "File" msgstr "Soubor" @@ -2165,15 +2245,18 @@ msgid "Calibration" msgstr "Kalibrace" msgid "" -"Failed to download the plug-in. Please check your firewall settings and vpn software, check and retry." +"Failed to download the plug-in. Please check your firewall settings and vpn " +"software, check and retry." msgstr "" -"Stažení pluginu se nezdařilo. Zkontrolujte prosím nastavení brány firewall a vpn software, zkontrolujte " -"a zkuste to znovu." +"Stažení pluginu se nezdařilo. Zkontrolujte prosím nastavení brány firewall a " +"vpn software, zkontrolujte a zkuste to znovu." msgid "" -"Failed to install the plug-in. Please check whether it is blocked or deleted by anti-virus software." +"Failed to install the plug-in. Please check whether it is blocked or deleted " +"by anti-virus software." msgstr "" -"Nepodařilo se nainstalovat plugin. Zkontrolujte, zda není blokován nebo odstraněn antivirovým softwarem." +"Nepodařilo se nainstalovat plugin. Zkontrolujte, zda není blokován nebo " +"odstraněn antivirovým softwarem." msgid "click here to see more info" msgstr "kliknutím sem zobrazíte více informací" @@ -2182,16 +2265,18 @@ msgid "Please home all axes (click " msgstr "Prosím domů všechny osy (klikněte " msgid "" -") to locate the toolhead's position. This prevents device moving beyond the printable boundary and " -"causing equipment wear." +") to locate the toolhead's position. This prevents device moving beyond the " +"printable boundary and causing equipment wear." msgstr "" -"), abyste našli polohu nástrojové hlavy. Tím zabráníte pohybu zařízení za tisknutelné hranice a " -"způsobující opotřebení zařízení." +"), abyste našli polohu nástrojové hlavy. Tím zabráníte pohybu zařízení za " +"tisknutelné hranice a způsobující opotřebení zařízení." msgid "Go Home" msgstr "Jít Domů" -msgid "A error occurred. Maybe memory of system is not enough or it's a bug of the program" +msgid "" +"A error occurred. Maybe memory of system is not enough or it's a bug of the " +"program" msgstr "Došlo k chybě. Možná paměť systému nestačí nebo je to chyba program" msgid "Please save project and restart the program. " @@ -2249,7 +2334,9 @@ msgstr "Kopírování dočasného G-kódu do výstupního G-kódu selhalo" #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" -msgstr "Plánování nahrávání do `%1%`. Viz Okno -> Fronta nahrávaní do tiskového serveru" +msgstr "" +"Plánování nahrávání do `%1%`. Viz Okno -> Fronta nahrávaní do tiskového " +"serveru" msgid "Origin" msgstr "Počátek" @@ -2260,11 +2347,16 @@ msgstr "Průměr" msgid "Size in X and Y of the rectangular plate." msgstr "Rozměr obdélníkové tiskové podložky v ose X a Y." -msgid "Distance of the 0,0 G-code coordinate from the front left corner of the rectangle." +msgid "" +"Distance of the 0,0 G-code coordinate from the front left corner of the " +"rectangle." msgstr "Vzdálenost souřadnice 0,0 G-kódu od předního levého rohu obdélníku." -msgid "Diameter of the print bed. It is assumed that origin (0,0) is located in the center." -msgstr "Průměr tiskové podložky. Předpokládaný počátek (0,0) je umístěn uprostřed." +msgid "" +"Diameter of the print bed. It is assumed that origin (0,0) is located in the " +"center." +msgstr "" +"Průměr tiskové podložky. Předpokládaný počátek (0,0) je umístěn uprostřed." msgid "Rectangular" msgstr "Obdélníkový" @@ -2294,7 +2386,8 @@ msgid "Model" msgstr "Model" msgid "Choose an STL file to import bed shape from:" -msgstr "Vyberte STL soubor, ze kterého chcete importovat tvar tiskové podložky:" +msgstr "" +"Vyberte STL soubor, ze kterého chcete importovat tvar tiskové podložky:" msgid "Invalid file format." msgstr "Neplatný formát souboru." @@ -2305,11 +2398,16 @@ msgstr "Chyba! Neplatný model" msgid "The selected file contains no geometry." msgstr "Vybraný soubor neobsahuje geometrii." -msgid "The selected file contains several disjoint areas. This is not supported." -msgstr "Vybraný soubor obsahuje několik nespojených ploch. Tato možnost není podporována." +msgid "" +"The selected file contains several disjoint areas. This is not supported." +msgstr "" +"Vybraný soubor obsahuje několik nespojených ploch. Tato možnost není " +"podporována." msgid "Choose a file to import bed texture from (PNG/SVG):" -msgstr "Vyberte soubor, ze kterého chcete importovat texturu pro tiskovou podložku (PNG/SVG):" +msgstr "" +"Vyberte soubor, ze kterého chcete importovat texturu pro tiskovou podložku " +"(PNG/SVG):" msgid "Choose an STL file to import bed model from:" msgstr "Vyberte STL soubor, ze kterého chcete importovat model podložky:" @@ -2327,8 +2425,11 @@ msgstr "" "\n" #, c-format, boost-format -msgid "Recommended nozzle temperature of this filament type is [%d, %d] degree centigrade" -msgstr "Doporučená teplota trysky pro tento typ filamentu je [%d, %d]stupňů Celsia" +msgid "" +"Recommended nozzle temperature of this filament type is [%d, %d] degree " +"centigrade" +msgstr "" +"Doporučená teplota trysky pro tento typ filamentu je [%d, %d]stupňů Celsia" msgid "" "Too small max volumetric speed.\n" @@ -2339,11 +2440,13 @@ msgstr "" #, 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" +"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 "" -"Aktuální teplota komory je vyšší než bezpečná teplota materiálu,může to způsobit změkčení materiálu a " -"jeho ucpaní. Maximální bezpečná teplota pro tento materiál je %d" +"Aktuální teplota komory je vyšší než bezpečná teplota materiálu,může to " +"způsobit změkčení materiálu a jeho ucpaní. Maximální bezpečná teplota pro " +"tento materiál je %d" msgid "" "Too small layer height.\n" @@ -2369,13 +2472,15 @@ msgstr "" "Výška první vrstvy bude resetována na 0,2." msgid "" -"This setting is only used for model size tunning with small value in some cases.\n" +"This setting is only used for model size tunning with small value in some " +"cases.\n" "For example, when model size has small error and hard to be assembled.\n" "For large size tuning, please use model scale function.\n" "\n" "The value will be reset to 0." msgstr "" -"Toto nastavení se používá pouze pro ladění velikosti modelu s malou hodnotou v některých případech.\n" +"Toto nastavení se používá pouze pro ladění velikosti modelu s malou hodnotou " +"v některých případech.\n" "Například, když velikost modelu má malou chybu a je obtížné sestavit.\n" "Pro ladění velkých rozměrů použijte funkci měřítka modelu.\n" "\n" @@ -2389,17 +2494,19 @@ msgid "" "The value will be reset to 0." msgstr "" "Hodnota kompenzace sloní nohy je příliš vysoká.\n" -"Pokud se vyskytnou závažné problémy se sloní nohou, zkontrolujte prosím další nastavení.\n" +"Pokud se vyskytnou závažné problémy se sloní nohou, zkontrolujte prosím " +"další nastavení.\n" "Teplota podložky může být například příliš vysoká.\n" "\n" "Hodnota bude resetována na 0." 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." +"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 "" -"Spirálový režim funguje pouze tehdy, když je 1 smyčka na stěně, podpěry jsou deaktivovány, horní " -"skořepina vrstvy jsou 0, hustota vnitřní výplně je 0 a typ časosběru je tradiční." +"Spirálový režim funguje pouze tehdy, když je 1 smyčka na stěně, podpěry jsou " +"deaktivovány, horní skořepina vrstvy jsou 0, hustota vnitřní výplně je 0 a " +"typ časosběru je tradiční." msgid " But machines with I3 structure will not generate timelapse videos." msgstr " Ale stroje s I3 strukturou nevytvoří timelapse videa." @@ -2414,12 +2521,14 @@ msgstr "" "Ne - zrušit povolení spirálového režimu" msgid "" -"Prime tower does not work when Adaptive Layer Height or Independent Support Layer Height is on.\n" +"Prime tower does not work when Adaptive Layer Height or Independent Support " +"Layer Height is on.\n" "Which do you want to keep?\n" "YES - Keep Prime Tower\n" "NO - Keep Adaptive Layer Height and Independent Support Layer Height" msgstr "" -"Čistící věž nefunguje při adaptivní výšce vrstvy nebo když je zapnutá výška nezávislé podpůrné vrstvy.\n" +"Čistící věž nefunguje při adaptivní výšce vrstvy nebo když je zapnutá výška " +"nezávislé podpůrné vrstvy.\n" "Kterou si chcete ponechat?\n" "ANO - Zachovat čistící věž\n" "NE - Zachovat výšku adaptivní vrstvy a výšku nezávislé podpůrné vrstvy" @@ -2596,25 +2705,29 @@ msgid "Update failed." msgstr "Aktualizace se nezdařila." 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." +"The current chamber temperature or the target chamber temperature exceeds " +"45℃.In order to avoid extruder clogging,low temperature filament(PLA/PETG/" +"TPU) is not allowed to be loaded." msgstr "" -"Aktuální teplota komory nebo cílová teplota komory přesahuje 45℃. Aby se předešlo ucpaní extruderu, není " -"povoleno načítání nízkoteplotního filamentu (PLA/PETG/TPU)." +"Aktuální teplota komory nebo cílová teplota komory přesahuje 45℃. Aby se " +"předešlo ucpaní extruderu, není povoleno načítání nízkoteplotního filamentu " +"(PLA/PETG/TPU)." msgid "" -"Low temperature filament(PLA/PETG/TPU) is loaded in the extruder.In order to avoid extruder clogging,it " -"is not allowed to set the chamber temperature above 45℃." +"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 "" -"Do extruderu je načten nízkoteplotní filament (PLA/PETG/TPU). Aby se předešlo ucpaní extruderu, není " -"povoleno nastavovat teplotu komory nad 45℃." +"Do extruderu je načten nízkoteplotní filament (PLA/PETG/TPU). Aby se " +"předešlo ucpaní extruderu, není povoleno nastavovat teplotu komory nad 45℃." 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℃." +"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 "" -"Pokud nastavíte teplotu komory pod 40℃, řízení teploty komory se neaktivuje a cílová teplota komory bude " -"automaticky nastavena na 0℃." +"Pokud nastavíte teplotu komory pod 40℃, řízení teploty komory se neaktivuje " +"a cílová teplota komory bude automaticky nastavena na 0℃." msgid "Failed to start printing job" msgstr "Nepodařilo se spustit tiskovou úlohu" @@ -2631,14 +2744,19 @@ msgstr "AMS nepodporuje TPU." msgid "Bambu PET-CF/PA6-CF is not supported by AMS." msgstr "AMS nepodporuje Bambu PET-CF/PA6-CF." -msgid "Damp PVA will become flexible and get stuck inside AMS,please take care to dry it before use." -msgstr "Vlhké PVA se stane pružné a může se zaseknout uvnitř AMS, prosím, pečlivě je usušte před použitím." +msgid "" +"Damp PVA will become flexible and get stuck inside AMS,please take care to " +"dry it before use." +msgstr "" +"Vlhké PVA se stane pružné a může se zaseknout uvnitř AMS, prosím, pečlivě je " +"usušte před použitím." msgid "" -"CF/GF filaments are hard and brittle, It's easy to break or get stuck in AMS, please use with caution." +"CF/GF filaments are hard and brittle, It's easy to break or get stuck in " +"AMS, please use with caution." msgstr "" -"Filamenty CF/GF jsou tvrdé a křehké, snadno se mohou zlomit nebo zaseknout v AMS, používejte je s " -"opatrností." +"Filamenty CF/GF jsou tvrdé a křehké, snadno se mohou zlomit nebo zaseknout v " +"AMS, používejte je s opatrností." msgid "default" msgstr "výchozí" @@ -3009,11 +3127,11 @@ msgstr "Velikost:" #, c-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)." +"Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " +"separate the conflicted objects farther (%s <-> %s)." msgstr "" -"Byly zjištěny konflikty cest g-kódu na vrstvě %d, z = %.2lf mm. Prosím oddělte konfliktní objekty dále " -"od sebe (%s <-> %s)." +"Byly zjištěny konflikty cest g-kódu na vrstvě %d, z = %.2lf mm. Prosím " +"oddělte konfliktní objekty dále od sebe (%s <-> %s)." msgid "An object is layed over the boundary of plate." msgstr "Objekt je položen přes hranici podložky." @@ -3029,12 +3147,12 @@ msgstr "Viditelný je pouze objekt, který se právě upravuje." msgid "" "An object is laid over the boundary of plate or exceeds the height limit.\n" -"Please solve the problem by moving it totally on or off the plate, and confirming that the height is " -"within the build volume." +"Please solve the problem by moving it totally on or off the plate, and " +"confirming that the height is within the build volume." msgstr "" "Objekt je položen přes hranici podložky nebo překračuje limit výšky.\n" -"Prosím, vyřešte problém tím, že jej úplně přesunete na podložku nebo mimo ní a potvrďte, že výška je v " -"rámci objemu stavby." +"Prosím, vyřešte problém tím, že jej úplně přesunete na podložku nebo mimo ní " +"a potvrďte, že výška je v rámci objemu stavby." msgid "Calibration step selection" msgstr "Výběr kroku kalibrace" @@ -3055,10 +3173,12 @@ msgid "Calibration program" msgstr "Kalibrační program" msgid "" -"The calibration program detects the status of your device automatically to minimize deviation.\n" +"The calibration program detects the status of your device automatically to " +"minimize deviation.\n" "It keeps the device performing optimally." msgstr "" -"Kalibrační program automaticky zjistí stav vašeho zařízení, aby minimalizoval odchylky.\n" +"Kalibrační program automaticky zjistí stav vašeho zařízení, aby " +"minimalizoval odchylky.\n" "Udržuje optimální výkon zařízení." msgid "Calibration Flow" @@ -3521,10 +3641,17 @@ msgstr "Vyberte profil k načtení:" #, c-format, boost-format msgid "There is %d config imported. (Only non-system and compatible configs)" -msgid_plural "There are %d configs imported. (Only non-system and compatible configs)" -msgstr[0] "Byla importována %d konfigurace. (Pouze ne-systémové a kompatibilní konfigurace)" -msgstr[1] "Bylo importováno %d konfigurací. (Pouze ne-systémové a kompatibilní konfigurace)" -msgstr[2] "Bylo importováno %d konfigurací. (Pouze ne-systémové a kompatibilní konfigurace)" +msgid_plural "" +"There are %d configs imported. (Only non-system and compatible configs)" +msgstr[0] "" +"Byla importována %d konfigurace. (Pouze ne-systémové a kompatibilní " +"konfigurace)" +msgstr[1] "" +"Bylo importováno %d konfigurací. (Pouze ne-systémové a kompatibilní " +"konfigurace)" +msgstr[2] "" +"Bylo importováno %d konfigurací. (Pouze ne-systémové a kompatibilní " +"konfigurace)" msgid "Import result" msgstr "Importovat výsledek" @@ -3564,13 +3691,15 @@ msgid "Initialize failed (No Camera Device)!" msgstr "Inicializace se nezdařila (žádné kamerové zařízení)!" msgid "Printer is busy downloading, Please wait for the downloading to finish." -msgstr "Tiskárna je zaneprázdněna stahováním, počkejte prosím na dokončení stahování." +msgstr "" +"Tiskárna je zaneprázdněna stahováním, počkejte prosím na dokončení stahování." msgid "Loading..." msgstr "Načítání..." msgid "Initialize failed (Not supported on the current printer version)!" -msgstr "Inicializace se nezdařila (Není podporováno ve stávající verzi tiskárny)!" +msgstr "" +"Inicializace se nezdařila (Není podporováno ve stávající verzi tiskárny)!" msgid "Initialize failed (Not accessible in LAN-only mode)!" msgstr "Inicializace se nezdařila (není přístupné v režimu pouze LAN)!" @@ -3699,10 +3828,13 @@ msgstr "Načítání selhalo [%d]" #, c-format, boost-format msgid "You are going to delete %u file from printer. Are you sure to continue?" -msgid_plural "You are going to delete %u files from printer. Are you sure to continue?" +msgid_plural "" +"You are going to delete %u files from printer. Are you sure to continue?" msgstr[0] "Chystáte se smazat %u soubor z tiskárny. Opravdu chcete pokračovat?" -msgstr[1] "Chystáte se smazat %u soubory z tiskárny. Opravdu chcete pokračovat?" -msgstr[2] "Chystáte se smazat %u souborů z tiskárny. Opravdu chcete pokračovat?" +msgstr[1] "" +"Chystáte se smazat %u soubory z tiskárny. Opravdu chcete pokračovat?" +msgstr[2] "" +"Chystáte se smazat %u souborů z tiskárny. Opravdu chcete pokračovat?" msgid "Delete files" msgstr "Smazat soubory" @@ -3724,11 +3856,11 @@ msgid "Failed to parse model infomations." msgstr "Nepodařilo se zpracovat informace o modelu." msgid "" -"The .gcode.3mf file contains no G-code data.Please slice it whthBambu Studio and export a new .gcode.3mf " -"file." +"The .gcode.3mf file contains no G-code data.Please slice it whthBambu Studio " +"and export a new .gcode.3mf file." msgstr "" -"Soubor .gcode.3mf neobsahuje žádná G-kód data. Prosím, slicujte ho pomocí Bambu Studia a exportujte nový " -"soubor .gcode.3mf." +"Soubor .gcode.3mf neobsahuje žádná G-kód data. Prosím, slicujte ho pomocí " +"Bambu Studia a exportujte nový soubor .gcode.3mf." #, c-format, boost-format msgid "File '%s' was lost! Please download it again." @@ -3816,7 +3948,9 @@ msgstr "Vymazat" msgid "How do you like this printing file?" msgstr "Jak se vám líbí tento tiskový soubor?" -msgid "(The model has already been rated. Your rating will overwrite the previous rating.)" +msgid "" +"(The model has already been rated. Your rating will overwrite the previous " +"rating.)" msgstr "(Model již byl ohodnocen. Vaše hodnocení přepíše předchozí hodnocení.)" msgid "Rate" @@ -3904,11 +4038,11 @@ msgid "Please select an AMS slot before calibration" msgstr "Před kalibrací vyberte slot AMS" msgid "" -"Cannot read filament info: the filament is loaded to the tool head,please unload the filament and try " -"again." +"Cannot read filament info: the filament is loaded to the tool head,please " +"unload the filament and try again." msgstr "" -"Nelze přečíst informace o filamentu: filament je vložen do hlavy nástroje, prosím vyjměte filament a " -"zkuste to znovu." +"Nelze přečíst informace o filamentu: filament je vložen do hlavy nástroje, " +"prosím vyjměte filament a zkuste to znovu." msgid "This only takes effect during printing" msgstr "Toto se projeví pouze během tisku" @@ -3974,17 +4108,20 @@ msgid " can not be opened\n" msgstr " nelze otevřít\n" msgid "" -"The following issues occurred during the process of uploading images. Do you want to ignore them?\n" +"The following issues occurred during the process of uploading images. Do you " +"want to ignore them?\n" "\n" msgstr "" -"Během procesu nahrávání obrázků došlo k následujícím problémům. Chcete je ignorovat?\n" +"Během procesu nahrávání obrázků došlo k následujícím problémům. Chcete je " +"ignorovat?\n" "\n" msgid "info" msgstr "informace" msgid "Synchronizing the printing results. Please retry a few seconds later." -msgstr "Probíhá synchronizace výsledků tisku. Prosím, zkuste to znovu za pár sekund." +msgstr "" +"Probíhá synchronizace výsledků tisku. Prosím, zkuste to znovu za pár sekund." msgid "Upload failed\n" msgstr "Nahrávání selhalo\n" @@ -4013,7 +4150,9 @@ msgstr "" "\n" "Chcete přesměrovat na webovou stránku pro hodnocení?" -msgid "Some of your images failed to upload. Would you like to redirect to the webpage for rating?" +msgid "" +"Some of your images failed to upload. Would you like to redirect to the " +"webpage for rating?" msgstr "" msgid "You can select up to 16 images." @@ -4191,8 +4330,11 @@ msgstr "Vrstvy" msgid "Range" msgstr "Rozsah" -msgid "The application cannot run normally because OpenGL version is lower than 2.0.\n" -msgstr "Aplikace nemůže běžet normálně, protože máte nižší verzi OpenGLnež 2.0.\n" +msgid "" +"The application cannot run normally because OpenGL version is lower than " +"2.0.\n" +msgstr "" +"Aplikace nemůže běžet normálně, protože máte nižší verzi OpenGLnež 2.0.\n" msgid "Please upgrade your graphics card driver." msgstr "Prosím aktualizujte ovladač grafické karty." @@ -4229,11 +4371,11 @@ msgid "Enable detection of build plate position" msgstr "Povolit detekci polohy stavební desky" msgid "" -"The localization tag of build plate is detected, and printing is paused if the tag is not in predefined " -"range." +"The localization tag of build plate is detected, and printing is paused if " +"the tag is not in predefined range." msgstr "" -"Je detekována lokalizační značka stavební desky a tisk se pozastaví, pokud značka není v předdefinovaném " -"rozsahu." +"Je detekována lokalizační značka stavební desky a tisk se pozastaví, pokud " +"značka není v předdefinovaném rozsahu." msgid "First Layer Inspection" msgstr "Kontrola první vrstvy" @@ -4265,6 +4407,24 @@ msgstr "Nastavení filamentu" msgid "Printer settings" msgstr "Nastavení tiskárny" +msgid "Remove current plate (if not last one)" +msgstr "" + +msgid "Auto orient objects on current plate" +msgstr "" + +msgid "Arrange objects on current plate" +msgstr "" + +msgid "Unlock current plate" +msgstr "" + +msgid "Lock current plate" +msgstr "" + +msgid "Customize current plate" +msgstr "" + msgid "Untitled" msgstr "Bez názvu" @@ -4320,21 +4480,28 @@ msgstr "Synchronizovat seznam filamentů z AM" msgid "Set filaments to use" msgstr "Nastavit filamenty k použití" -msgid "No AMS filaments. Please select a printer in 'Device' page to load AMS info." -msgstr "Žádné filamenty AMS. Chcete-li načíst informace AMS, vyberte tiskárnu na stránce Zařízení." +msgid "" +"No AMS filaments. Please select a printer in 'Device' page to load AMS info." +msgstr "" +"Žádné filamenty AMS. Chcete-li načíst informace AMS, vyberte tiskárnu na " +"stránce Zařízení." msgid "Sync filaments with AMS" msgstr "Synchronizovat filamenty s AMS" msgid "" -"Sync filaments with AMS will drop all current selected filament presets and colors. Do you want to " -"continue?" +"Sync filaments with AMS will drop all current selected filament presets and " +"colors. Do you want to continue?" msgstr "" -"Synchronizace filamentů s AMS zruší všechny aktuálně vybrané předvolby filamentů a barvy. Chcete " -"pokračovat?" +"Synchronizace filamentů s AMS zruší všechny aktuálně vybrané předvolby " +"filamentů a barvy. Chcete pokračovat?" -msgid "Already did a synchronization, do you want to sync only changes or resync all?" -msgstr "Synchronizace již proběhla, chcete synchronizovat pouze změny nebo znovu synchronizovat Všechno?" +msgid "" +"Already did a synchronization, do you want to sync only changes or resync " +"all?" +msgstr "" +"Synchronizace již proběhla, chcete synchronizovat pouze změny nebo znovu " +"synchronizovat Všechno?" msgid "Sync" msgstr "Synchronizovat" @@ -4343,22 +4510,29 @@ msgid "Resync" msgstr "Znovu synchronizovat" msgid "There are no compatible filaments, and sync is not performed." -msgstr "Neexistují žádná kompatibilní filamenty a synchronizace není provedena." +msgstr "" +"Neexistují žádná kompatibilní filamenty a synchronizace není provedena." 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." +"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 "" -"Existují některé neznámé filamenty na mapovaná na generickou předvolbu. Aktualizujte prosím Orca Slicer " -"nebo restartujte Orca Slicer a zkontrolujte, zda existuje aktualizace systému předvolby." +"Existují některé neznámé filamenty na mapovaná na generickou předvolbu. " +"Aktualizujte prosím Orca Slicer nebo restartujte Orca Slicer a zkontrolujte, " +"zda existuje aktualizace systému předvolby." #, boost-format msgid "Do you want to save changes to \"%1%\"?" msgstr "Chcete uložit změny do \"%1%\"?" #, c-format, boost-format -msgid "Successfully unmounted. The device %s(%s) can now be safely removed from the computer." -msgstr "Odpojení proběhlo úspěšné. Zařízení %s(%s) lze nyní bezpečně odebrat z počítače." +msgid "" +"Successfully unmounted. The device %s(%s) can now be safely removed from the " +"computer." +msgstr "" +"Odpojení proběhlo úspěšné. Zařízení %s(%s) lze nyní bezpečně odebrat z " +"počítače." #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." @@ -4371,25 +4545,27 @@ msgid "Restore" msgstr "Obnovit" msgid "" -"The bed temperature exceeds filament's vitrification temperature. Please open the front door of printer " -"before printing to avoid nozzle clog." +"The bed temperature exceeds filament's vitrification temperature. Please " +"open the front door of printer before printing to avoid nozzle clog." msgstr "" -"Teplota podložky překračuje teplotu vitrifikace filamentu. Prosím. Před tiskem otevřete přední dvířka " -"tiskárny, aby nedošlo k ucpání trysky." +"Teplota podložky překračuje teplotu vitrifikace filamentu. Prosím. Před " +"tiskem otevřete přední dvířka tiskárny, aby nedošlo k ucpání trysky." 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." +"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 "" -"Tvrdost trysky požadovaná filamentem je vyšší než výchozí tvrdost trysky tiskárny. Vyměňte tvrzenou " -"trysku nebo filament, jinak se tryska opotřebuje nebo poškodí." +"Tvrdost trysky požadovaná filamentem je vyšší než výchozí tvrdost trysky " +"tiskárny. Vyměňte tvrzenou trysku nebo filament, jinak se tryska opotřebuje " +"nebo poškodí." msgid "" -"Enabling traditional timelapse photography may cause surface imperfections. It is recommended to change " -"to smooth mode." +"Enabling traditional timelapse photography may cause surface imperfections. " +"It is recommended to change to smooth mode." msgstr "" -"Povolení tradičního časosběrného fotografování může způsobit povrchové nedokonalosti. Doporučuje se " -"přepnout na hladký režim." +"Povolení tradičního časosběrného fotografování může způsobit povrchové " +"nedokonalosti. Doporučuje se přepnout na hladký režim." #, c-format, boost-format msgid "Loading file: %s" @@ -4408,8 +4584,12 @@ msgid "The 3mf is generated by old Orca Slicer, load geometry data only." msgstr "3mf je generován starým Orca Slicerem, načtěte pouze geometrická data." #, c-format, boost-format -msgid "The 3mf's version %s is newer than %s's version %s, Found following keys unrecognized:" -msgstr "Verze 3mf %s je novější než verze %s %s, byly nalezeny následující klíče nerozpoznaný:" +msgid "" +"The 3mf's version %s is newer than %s's version %s, Found following keys " +"unrecognized:" +msgstr "" +"Verze 3mf %s je novější než verze %s %s, byly nalezeny následující klíče " +"nerozpoznaný:" msgid "You'd better upgrade your software.\n" msgstr "Měli byste aktualizovat software.\n" @@ -4418,8 +4598,12 @@ msgid "Newer 3mf version" msgstr "Novější verze 3mf" #, c-format, boost-format -msgid "The 3mf's version %s is newer than %s's version %s, Suggest to upgrade your software." -msgstr "Verze %s zařízení 3mf je novější než verze %s %s, navrhněte upgrade vašeho software." +msgid "" +"The 3mf's version %s is newer than %s's version %s, Suggest to upgrade your " +"software." +msgstr "" +"Verze %s zařízení 3mf je novější než verze %s %s, navrhněte upgrade vašeho " +"software." msgid "Invalid values found in the 3mf:" msgstr "V 3mf byly nalezeny neplatné hodnoty:" @@ -4441,7 +4625,8 @@ msgstr "Kvůli nepodporovanému kódování textu se mohou objevit nesmyslné zn #, boost-format msgid "Failed loading file \"%1%\". An invalid configuration was found." -msgstr "Nepodařilo se načíst soubor \"%1%\" . Byla nalezena neplatná konfigurace." +msgstr "" +"Nepodařilo se načíst soubor \"%1%\" . Byla nalezena neplatná konfigurace." msgid "Objects with zero volume removed" msgstr "Objekty s nulovým objemem odstraněny" @@ -4482,9 +4667,11 @@ msgid "The file does not contain any geometry data." msgstr "Soubor neobsahuje žádná geometrická data." msgid "" -"Your object appears to be too large, Do you want to scale it down to fit the heat bed automatically?" +"Your object appears to be too large, Do you want to scale it down to fit the " +"heat bed automatically?" msgstr "" -"Váš objekt se zdá být příliš velký, chcete jej zmenšit, aby se vešel na vyhřívanou podložku automaticky?" +"Váš objekt se zdá být příliš velký, chcete jej zmenšit, aby se vešel na " +"vyhřívanou podložku automaticky?" msgid "Object too large" msgstr "Objekt je příliš velký" @@ -4547,8 +4734,11 @@ msgstr "Podložka na slicování %d" msgid "Please resolve the slicing errors and publish again." msgstr "Vyřešte prosím chyby slicování a publikujte znovu." -msgid "Network Plug-in is not detected. Network related features are unavailable." -msgstr "Nebyl detekován síťový modul plug-in. Funkce související se sítí jsou nedostupné." +msgid "" +"Network Plug-in is not detected. Network related features are unavailable." +msgstr "" +"Nebyl detekován síťový modul plug-in. Funkce související se sítí jsou " +"nedostupné." msgid "" "Preview only mode:\n" @@ -4568,10 +4758,12 @@ msgstr "Načíst projekt" msgid "" "Failed to save the project.\n" -"Please check whether the folder exists online or if other programs open the project file." +"Please check whether the folder exists online or if other programs open the " +"project file." msgstr "" "Projekt se nepodařilo uložit.\n" -"Zkontrolujte, zda složka existuje online nebo zda jiné programy otevírají soubor projektu." +"Zkontrolujte, zda složka existuje online nebo zda jiné programy otevírají " +"soubor projektu." msgid "Save project" msgstr "Uložit projekt" @@ -4589,8 +4781,11 @@ msgstr "stahuji projekt ..." msgid "Project downloaded %d%%" msgstr "Projekt stažen %d%%" -msgid "Importing to Bambu Studio failed. Please download the file and manually import it." -msgstr "Import do Bambu Studia selhal. Stáhněte soubor a proveďte jeho ruční import." +msgid "" +"Importing to Bambu Studio failed. Please download the file and manually " +"import it." +msgstr "" +"Import do Bambu Studia selhal. Stáhněte soubor a proveďte jeho ruční import." msgid "The selected file" msgstr "Vybraný soubor" @@ -4650,11 +4845,19 @@ msgid "Save Sliced file as:" msgstr "Uložit Slicované soubor jako:" #, c-format, boost-format -msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." -msgstr "Soubor %s byl odeslán do úložného prostoru tiskárny a lze jej zobrazit na tiskárně." +msgid "" +"The file %s has been sent to the printer's storage space and can be viewed " +"on the printer." +msgstr "" +"Soubor %s byl odeslán do úložného prostoru tiskárny a lze jej zobrazit na " +"tiskárně." -msgid "Unable to perform boolean operation on model meshes. Only positive parts will be exported." -msgstr "Nelze provést logickou operaci nad mashí modelů. Budou exportovány pouze kladné části." +msgid "" +"Unable to perform boolean operation on model meshes. Only positive parts " +"will be exported." +msgstr "" +"Nelze provést logickou operaci nad mashí modelů. Budou exportovány pouze " +"kladné části." msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "Je tiskarna připravená k tisku? Je podložka prázdná a čistá?" @@ -4667,7 +4870,8 @@ msgid "" "Suggest to use auto-arrange to avoid collisions when printing." msgstr "" "Tisk podle objektu: \n" -"Doporučujeme použít automatické uspořádání, aby se předešlo kolizím při tisku." +"Doporučujeme použít automatické uspořádání, aby se předešlo kolizím při " +"tisku." msgid "Send G-code" msgstr "Odeslat G-kód" @@ -4724,19 +4928,21 @@ msgid "Tips:" msgstr "Tipy:" msgid "" -"\"Fix Model\" feature is currently only on Windows. Please repair the model on Orca Slicer(windows) or " -"CAD softwares." +"\"Fix Model\" feature is currently only on Windows. Please repair the model " +"on Orca Slicer(windows) or CAD softwares." msgstr "" -"Funkce \"Opravit model\" je momentálně pouze v systému Windows. Opravte prosím model na Orca Slicer " -"(windows) nebo CAD software." +"Funkce \"Opravit model\" je momentálně pouze v systému Windows. Opravte " +"prosím model na Orca Slicer (windows) nebo CAD software." #, 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 to non zero." +"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 " +"to non zero." msgstr "" -"Plate% d: %s se nedoporučuje používat k tisku filamentu %s(%s). Pokud Přesto chcete tento tisk provést, " -"nastavte prosím teplotu podložky tohoto filamentu ne na nulovou." +"Plate% d: %s se nedoporučuje používat k tisku filamentu %s(%s). Pokud Přesto " +"chcete tento tisk provést, nastavte prosím teplotu podložky tohoto filamentu " +"ne na nulovou." msgid "Switching the language requires application restart.\n" msgstr "Přepínání jazyků vyžaduje restartování aplikace.\n" @@ -4804,7 +5010,9 @@ msgstr "Jednotky" msgid "Zoom to mouse position" msgstr "Přiblížit na pozici myši" -msgid "Zoom in towards the mouse pointer's position in the 3D view, rather than the 2D window center." +msgid "" +"Zoom in towards the mouse pointer's position in the 3D view, rather than the " +"2D window center." msgstr "Přiblížit se ke kurzoru myši ve 3D zobrazení, na místo středu 2D okna." msgid "Show \"Tip of the day\" notification after start" @@ -4823,7 +5031,8 @@ msgid "Presets" msgstr "Předvolby" msgid "Auto sync user presets(Printer/Filament/Process)" -msgstr "Automatická synchronizace uživatelských předvoleb (Tiskárna/Filament/Proces)" +msgstr "" +"Automatická synchronizace uživatelských předvoleb (Tiskárna/Filament/Proces)" msgid "User Sync" msgstr "Synchronizace uživatelů" @@ -4844,19 +5053,25 @@ msgid "Associate .3mf files to OrcaSlicer" msgstr "Přidružit soubory .3mf k OrcaSlicer" msgid "If enabled, sets OrcaSlicer as default application to open .3mf files" -msgstr "Pokud je povoleno, nastaví OrcaSlicer jako výchozí aplikaci pro otevírání souborů .3mf" +msgstr "" +"Pokud je povoleno, nastaví OrcaSlicer jako výchozí aplikaci pro otevírání " +"souborů .3mf" msgid "Associate .stl files to OrcaSlicer" msgstr "Přidružit .stl soubory k Orca Slicer" msgid "If enabled, sets OrcaSlicer as default application to open .stl files" -msgstr "Pokud je povoleno, nastaví OrcaSlicer jako výchozí aplikaci pro otevírání souborů .stl" +msgstr "" +"Pokud je povoleno, nastaví OrcaSlicer jako výchozí aplikaci pro otevírání " +"souborů .stl" msgid "Associate .step/.stp files to OrcaSlicer" msgstr "Přidružit soubory .step/.stp k OrcaSlicer" msgid "If enabled, sets OrcaSlicer as default application to open .step files" -msgstr "Pokud je povoleno, nastaví OrcaSlicer jako výchozí aplikaci pro otevírání souborů .step" +msgstr "" +"Pokud je povoleno, nastaví OrcaSlicer jako výchozí aplikaci pro otevírání " +"souborů .step" msgid "Online Models" msgstr "Online modely" @@ -4876,8 +5091,10 @@ msgstr "Vymazat moje volby pro neuložené projekty." msgid "Auto-Backup" msgstr "Automatické zálohování" -msgid "Backup your project periodically for restoring from the occasional crash." -msgstr "Zálohujte svůj projekt pravidelně pro obnovu při případném pádu programu." +msgid "" +"Backup your project periodically for restoring from the occasional crash." +msgstr "" +"Zálohujte svůj projekt pravidelně pro obnovu při případném pádu programu." msgid "every" msgstr "každých" @@ -5126,7 +5343,8 @@ msgstr "Předvolba \" %1% \" již existuje." #, boost-format msgid "Preset \"%1%\" already exists and is incompatible with current printer." -msgstr "Předvolba \"%1%\" již existuje a není kompatibilní s aktuální tiskárnou." +msgstr "" +"Předvolba \"%1%\" již existuje a není kompatibilní s aktuální tiskárnou." msgid "Please note that saving action will replace this preset" msgstr "Upozorňujeme, že akce uložení nahradí toto přednastavení" @@ -5260,7 +5478,8 @@ msgstr "Vypršel časový limit synchronizace informací o zařízení" msgid "Cannot send the print job when the printer is updating firmware" msgstr "Nelze odeslat tiskovou úlohu, když tiskárna aktualizuje firmware" -msgid "The printer is executing instructions. Please restart printing after it ends" +msgid "" +"The printer is executing instructions. Please restart printing after it ends" msgstr "Tiskárna provádí pokyny. Po dokončení restartujte tisk" msgid "The printer is busy on other print job" @@ -5268,58 +5487,70 @@ msgstr "Tiskárna je zaneprázdněna jinou tiskovou úlohou" #, c-format, boost-format msgid "" -"Filament %s exceeds the number of AMS slots. Please update the printer firmware to support AMS slot " -"assignment." +"Filament %s exceeds the number of AMS slots. Please update the printer " +"firmware to support AMS slot assignment." msgstr "" -"Filament %s překračuje počet AMS slotů. Aktualizujte prosím tiskárnu firmware pro podporu přiřazení " -"slotu AMS." +"Filament %s překračuje počet AMS slotů. Aktualizujte prosím tiskárnu " +"firmware pro podporu přiřazení slotu AMS." msgid "" -"Filament exceeds the number of AMS slots. Please update the printer firmware to support AMS slot " -"assignment." +"Filament exceeds the number of AMS slots. Please update the printer firmware " +"to support AMS slot assignment." msgstr "" -"Filament překračuje počet slotů AMS. Aktualizujte prosím firmware tiskárny pro podporu přiřazení slotů " -"AMS." +"Filament překračuje počet slotů AMS. Aktualizujte prosím firmware tiskárny " +"pro podporu přiřazení slotů AMS." msgid "" -"Filaments to AMS slots mappings have been established. You can click a filament above to change its " -"mapping AMS slot" +"Filaments to AMS slots mappings have been established. You can click a " +"filament above to change its mapping AMS slot" msgstr "" -"Mapování filamentů na sloty AMS byla vytvořena. Můžete kliknout na Filament nahoře pro změnu jeho " -"mapovacího slotu AMS" +"Mapování filamentů na sloty AMS byla vytvořena. Můžete kliknout na Filament " +"nahoře pro změnu jeho mapovacího slotu AMS" -msgid "Please click each filament above to specify its mapping AMS slot before sending the print job" -msgstr "Kliknutím na každý filament výše určete jeho mapovací slot AMS před odeslání tiskové úlohy" +msgid "" +"Please click each filament above to specify its mapping AMS slot before " +"sending the print job" +msgstr "" +"Kliknutím na každý filament výše určete jeho mapovací slot AMS před odeslání " +"tiskové úlohy" #, c-format, boost-format msgid "" -"Filament %s does not match the filament in AMS slot %s. Please update the printer firmware to support " -"AMS slot assignment." +"Filament %s does not match the filament in AMS slot %s. Please update the " +"printer firmware to support AMS slot assignment." msgstr "" -"Filament %s neodpovídá filamentu ve slotu AMS %s. Aktualizujte prosím firmware tiskárny pro podporu " -"přiřazení slotu AMS." +"Filament %s neodpovídá filamentu ve slotu AMS %s. Aktualizujte prosím " +"firmware tiskárny pro podporu přiřazení slotu AMS." msgid "" -"Filament does not match the filament in AMS slot. Please update the printer firmware to support AMS slot " -"assignment." +"Filament does not match the filament in AMS slot. Please update the printer " +"firmware to support AMS slot assignment." msgstr "" -"Filament se neshoduje s filamentem ve slotu AMS. Aktualizujte prosím tiskárnu firmware pro podporu " -"přiřazení slotu AMS." +"Filament se neshoduje s filamentem ve slotu AMS. Aktualizujte prosím " +"tiskárnu firmware pro podporu přiřazení slotu AMS." -msgid "The printer firmware only supports sequential mapping of filament => AMS slot." -msgstr "Firmware tiskárny podporuje pouze sekvenční mapování filamentu => AMS slot." +msgid "" +"The printer firmware only supports sequential mapping of filament => AMS " +"slot." +msgstr "" +"Firmware tiskárny podporuje pouze sekvenční mapování filamentu => AMS slot." msgid "An SD card needs to be inserted before printing." msgstr "Před tiskem je třeba vložit SD kartu." msgid "The selected printer is incompatible with the chosen printer presets." -msgstr "Vybraná tiskárna není kompatibilní s vybranými přednastaveními tiskárny." +msgstr "" +"Vybraná tiskárna není kompatibilní s vybranými přednastaveními tiskárny." msgid "An SD card needs to be inserted to record timelapse." msgstr "Pro záznam časosběru je třeba vložit SD kartu." -msgid "Cannot send the print job to a printer whose firmware is required to get updated." -msgstr "Nelze odeslat tiskovou úlohu na tiskárnu, jejíž firmware je vyžadován k získání aktualizováno." +msgid "" +"Cannot send the print job to a printer whose firmware is required to get " +"updated." +msgstr "" +"Nelze odeslat tiskovou úlohu na tiskárnu, jejíž firmware je vyžadován k " +"získání aktualizováno." msgid "Cannot send the print job for empty plate" msgstr "Nelze odeslat tiskovou úlohu pro prázdnou podložku" @@ -5327,11 +5558,18 @@ msgstr "Nelze odeslat tiskovou úlohu pro prázdnou podložku" msgid "This printer does not support printing all plates" msgstr "Tato tiskárna nepodporuje tisk všech podložek" -msgid "When enable spiral vase mode, machines with I3 structure will not generate timelapse videos." -msgstr "Při povolení režimu spirálové vázy stroje s I3 strukturou nevytvoří časosběrná videa." +msgid "" +"When enable spiral vase mode, machines with I3 structure will not generate " +"timelapse videos." +msgstr "" +"Při povolení režimu spirálové vázy stroje s I3 strukturou nevytvoří " +"časosběrná videa." -msgid "When print by object, machines with I3 structure will not generate timelapse videos." -msgstr "Při tisku podle objektu stroje s I3 strukturou nevytvoří časosběrná videa." +msgid "" +"When print by object, machines with I3 structure will not generate timelapse " +"videos." +msgstr "" +"Při tisku podle objektu stroje s I3 strukturou nevytvoří časosběrná videa." msgid "Errors" msgstr "Chyby" @@ -5340,27 +5578,33 @@ msgid "Please check the following:" msgstr "Zkontrolujte prosím následující:" 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." +"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 "" -"Vybraný typ tiskárny při generování G-kódu není shodný s aktuálně vybranou tiskárnou. Doporučuje se " -"použít stejný typ tiskárny pro slicování." +"Vybraný typ tiskárny při generování G-kódu není shodný s aktuálně vybranou " +"tiskárnou. Doporučuje se použít stejný typ tiskárny pro slicování." #, c-format, boost-format msgid "%s is not supported by AMS." msgstr "%s není systémem AMS podporován." 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." +"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 "" -"V mapování AMS jsou nějaké neznámé filamenty. Zkontrolujte prosím, zda jsou to požadované filamenty. " -"Pokud jsou v pořádku, stiskněte \"Potvrdit\" pro zahájení tisku." +"V mapování AMS jsou nějaké neznámé filamenty. Zkontrolujte prosím, zda jsou " +"to požadované filamenty. Pokud jsou v pořádku, stiskněte \"Potvrdit\" pro " +"zahájení tisku." -msgid "Please click the confirm button if you still want to proceed with printing." -msgstr "Pokud stále chcete pokračovat v tisku, klikněte prosím na tlačítko Potvrdit." +msgid "" +"Please click the confirm button if you still want to proceed with printing." +msgstr "" +"Pokud stále chcete pokračovat v tisku, klikněte prosím na tlačítko Potvrdit." -msgid "Connecting to the printer. Unable to cancel during the connection process." +msgid "" +"Connecting to the printer. Unable to cancel during the connection process." msgstr "Připojování k tiskárně. Nelze zrušit během procesu připojování." msgid "Preparing print job" @@ -5372,9 +5616,12 @@ msgstr "Abnormální data tiskového souboru. Prosím znovu slicovat" msgid "The name length exceeds the limit." msgstr "Délka názvu překračuje limit." -msgid "Caution to use! Flow calibration on Textured PEI Plate may fail due to the scattered surface." +msgid "" +"Caution to use! Flow calibration on Textured PEI Plate may fail due to the " +"scattered surface." msgstr "" -"Pozor při použití! Kalibrace průtoku na Texturované PEI podložce může selhat kvůli rozptýlenému povrchu." +"Pozor při použití! Kalibrace průtoku na Texturované PEI podložce může selhat " +"kvůli rozptýlenému povrchu." msgid "Automatic flow calibration using Micro Lidar" msgstr "Automatická kalibrace průtoku pomocí Mikro Lidar" @@ -5440,16 +5687,18 @@ msgid "Terms and Conditions" msgstr "Obchodní podmínky" msgid "" -"Thank you for purchasing a Bambu Lab device.Before using your Bambu Lab device, please read the termsand " -"conditions.By clicking to agree to use your Bambu Lab device, you agree to abide by the Privacy " -"Policyand Terms of Use(collectively, the \"Terms\"). If you do not comply with or agree to the Bambu Lab " -"Privacy Policy, please do not use Bambu Lab equipment and services." +"Thank you for purchasing a Bambu Lab device.Before using your Bambu Lab " +"device, please read the termsand conditions.By clicking to agree to use your " +"Bambu Lab device, you agree to abide by the Privacy Policyand Terms of " +"Use(collectively, the \"Terms\"). If you do not comply with or agree to the " +"Bambu Lab Privacy Policy, please do not use Bambu Lab equipment and services." msgstr "" -"Děkujeme za zakoupení zařízení Bambu Lab. Před použitím svého zařízení Bambu Lab si prosím přečtěte " -"všeobecné obchodní podmínky. Kliknutím na souhlas s používáním zařízení Bambu Lab souhlasíte s " -"dodržováním zásad ochrany osobních údajů a podmínek používání (celkem \"Podmínky\"). Pokud nesouhlasíte " -"nebo nepřijímáte zásady ochrany osobních údajů Bambu Lab, prosím nevyužívejte zařízení a služby Bambu " -"Lab." +"Děkujeme za zakoupení zařízení Bambu Lab. Před použitím svého zařízení Bambu " +"Lab si prosím přečtěte všeobecné obchodní podmínky. Kliknutím na souhlas s " +"používáním zařízení Bambu Lab souhlasíte s dodržováním zásad ochrany " +"osobních údajů a podmínek používání (celkem \"Podmínky\"). Pokud " +"nesouhlasíte nebo nepřijímáte zásady ochrany osobních údajů Bambu Lab, " +"prosím nevyužívejte zařízení a služby Bambu Lab." msgid "and" msgstr "a" @@ -5465,23 +5714,29 @@ msgstr "Prohlášení o programu zlepšování uživatelské zkušenosti" #, c-format, boost-format msgid "" -"In the 3D Printing community, we learn from each other's successes and failures to adjust our own " -"slicing parameters and settings. %s follows the same principle and uses machine learning to improve its " -"performance from the successes and failures of the vast number of prints by our users. We are training " -"%s to be smarter by feeding them the real-world data. If you are willing, this service will access " -"information from your error logs and usage logs, which may include information described in Privacy " -"Policy. We will not collect any Personal Data by which an individual can be identified directly or " -"indirectly, including without limitation names, addresses, payment information, or phone numbers. By " -"enabling this service, you agree to these terms and the statement about Privacy Policy." -msgstr "" -"V komunitě 3D tisku se učíme z úspěchů a neúspěchů ostatních, abychom mohli upravit naše vlastní " -"parametry a nastavení pro slicování. %s následuje tentýž princip a pomocí strojového učení se snaží " -"zlepšit svůj výkon na základě úspěchů a neúspěchů mnoha tisků našich uživatelů. Trénujeme %s, aby byl " -"chytřejší, pomocí reálných dat z reálného světa. Pokud s tím souhlasíte, tento servis bude mít přístup k " -"informacím z chybových a uživatelských protokolů, což může zahrnovat informace popsané v Zásadách " -"ochrany osobních údajů. Nebudeme sbírat žádná osobní data, pomocí kterých by bylo možné identifikovat " -"jednotlivce přímo nebo nepřímo, včetně jmen, adres, platebních informací nebo telefonních čísel. " -"Aktivací tohoto servisu souhlasíte s těmito podmínkami a prohlášením o Zásadách ochrany osobních údajů." +"In the 3D Printing community, we learn from each other's successes and " +"failures to adjust our own slicing parameters and settings. %s follows the " +"same principle and uses machine learning to improve its performance from the " +"successes and failures of the vast number of prints by our users. We are " +"training %s to be smarter by feeding them the real-world data. If you are " +"willing, this service will access information from your error logs and usage " +"logs, which may include information described in Privacy Policy. We will " +"not collect any Personal Data by which an individual can be identified " +"directly or indirectly, including without limitation names, addresses, " +"payment information, or phone numbers. By enabling this service, you agree " +"to these terms and the statement about Privacy Policy." +msgstr "" +"V komunitě 3D tisku se učíme z úspěchů a neúspěchů ostatních, abychom mohli " +"upravit naše vlastní parametry a nastavení pro slicování. %s následuje " +"tentýž princip a pomocí strojového učení se snaží zlepšit svůj výkon na " +"základě úspěchů a neúspěchů mnoha tisků našich uživatelů. Trénujeme %s, aby " +"byl chytřejší, pomocí reálných dat z reálného světa. Pokud s tím souhlasíte, " +"tento servis bude mít přístup k informacím z chybových a uživatelských " +"protokolů, což může zahrnovat informace popsané v Zásadách ochrany osobních " +"údajů. Nebudeme sbírat žádná osobní data, pomocí kterých by bylo možné " +"identifikovat jednotlivce přímo nebo nepřímo, včetně jmen, adres, platebních " +"informací nebo telefonních čísel. Aktivací tohoto servisu souhlasíte s " +"těmito podmínkami a prohlášením o Zásadách ochrany osobních údajů." msgid "Statement on User Experience Improvement Plan" msgstr "Prohlášení o plánu zlepšení uživatelské zkušenosti" @@ -5519,26 +5774,28 @@ msgid "Click to reset all settings to the last saved preset." msgstr "Kliknutím obnovíte všechna nastavení na poslední uloženou předvolbu." msgid "" -"Prime tower is required for smooth timeplase. There may be flaws on the model without prime tower. Are " -"you sure you want to disable prime tower?" +"Prime tower is required for smooth timeplase. There may be flaws on the " +"model without prime tower. Are you sure you want to disable prime tower?" msgstr "" -"Pro hladký průběh časové roviny je vyžadována čistící věž. Mohou být chyby na model bez čistící věže. " -"Opravdu chcete hlavní věž deaktivovat?" +"Pro hladký průběh časové roviny je vyžadována čistící věž. Mohou být chyby " +"na model bez čistící věže. Opravdu chcete hlavní věž deaktivovat?" 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?" +"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 "" -"Pro hladký časosběr je vyžadována čistící věž. Na model bez hlavní věže. Chcete aktivovat čistící věž?" +"Pro hladký časosběr je vyžadována čistící věž. Na model bez hlavní věže. " +"Chcete aktivovat čistící věž?" msgid "" -"We have added an experimental style \"Tree Slim\" that features smaller support volume but weaker " -"strength.\n" +"We have added an experimental style \"Tree Slim\" that features smaller " +"support volume but weaker strength.\n" "We recommend using it with: 0 interface layers, 0 top distance, 2 walls." msgstr "" -"Přidali jsme experimentální styl \" Tree Slim \" , který obsahuje menší podporovat objem, ale slabší " -"sílu.\n" -"Doporučujeme jej používat s: 0 vrstvami rozhraní, 0 horní vzdáleností, 2 stěnami." +"Přidali jsme experimentální styl \" Tree Slim \" , který obsahuje menší " +"podporovat objem, ale slabší sílu.\n" +"Doporučujeme jej používat s: 0 vrstvami rozhraní, 0 horní vzdáleností, 2 " +"stěnami." msgid "" "Change these settings automatically? \n" @@ -5550,26 +5807,35 @@ msgstr "" "Ne - tato nastavení za mě neměňte" 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 using support materials on interface." +"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 " +"using support materials on interface." msgstr "" -"Pro styly \"Tree Strong\" a \"Tree Hybrid\" doporučujeme následující nastavení: alespoň 2 vrstvy " -"rozhraní, alespoň 0,1 mm horní z vzdálenost nebo používání podpůrných materiálů na rozhraní." +"Pro styly \"Tree Strong\" a \"Tree Hybrid\" doporučujeme následující " +"nastavení: alespoň 2 vrstvy rozhraní, alespoň 0,1 mm horní z vzdálenost nebo " +"používání podpůrných materiálů na rozhraní." msgid "" -"When using support material for the support interface, We recommend the following settings:\n" -"0 top z distance, 0 interface spacing, concentric pattern and disable independent support layer height" +"When using support material for the support interface, We recommend the " +"following settings:\n" +"0 top z distance, 0 interface spacing, concentric pattern and disable " +"independent support layer height" msgstr "" -"Při použití podpůrného materiálu pro kontaktní vrstvu podpěr doporučujeme následující nastavení:\n" -"0 horní z vzdálenost, 0 rozestup rozhraní, koncentrický vzor a vypnutí nezávislé výšky podpůrné vrstvy" +"Při použití podpůrného materiálu pro kontaktní vrstvu podpěr doporučujeme " +"následující nastavení:\n" +"0 horní z vzdálenost, 0 rozestup rozhraní, koncentrický vzor a vypnutí " +"nezávislé výšky podpůrné vrstvy" msgid "" -"When recording timelapse without toolhead, it is recommended to add a \"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add Primitive\"->\"Timelapse Wipe Tower\"." +"When recording timelapse without toolhead, it is recommended to add a " +"\"Timelapse Wipe Tower\" \n" +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" -"Při nahrávání časosběru bez nástrojové hlavy se doporučuje přidat \"Timelapse Wipe Tower\" \n" -"klikněte pravým tlačítkem na prázdnou pozici stavební desky a vyberte \"Přidat primitivní\" -> " -"\"Timelapse Wipe Tower\" ." +"Při nahrávání časosběru bez nástrojové hlavy se doporučuje přidat " +"\"Timelapse Wipe Tower\" \n" +"klikněte pravým tlačítkem na prázdnou pozici stavební desky a vyberte " +"\"Přidat primitivní\" -> \"Timelapse Wipe Tower\" ." msgid "Line width" msgstr "Šířka Extruze" @@ -5599,11 +5865,13 @@ msgid "Overhang speed" msgstr "Rychlost převisů" msgid "" -"This is the speed for various overhang degrees. Overhang degrees are expressed as a percentage of line " -"width. 0 speed means no slowing down for the overhang degree range and wall speed is used" +"This is the speed for various overhang degrees. Overhang degrees are " +"expressed as a percentage of line width. 0 speed means no slowing down for " +"the overhang degree range and wall speed is used" msgstr "" -"Toto je rychlost pro různé stupně převisů. Stupně převisů jsou vyjádřeny jako procento šířky extruze. 0 " -"rychlost znamená žádné zpomalení pro používá s rozsahy stupňů převisů a rychlost stěny" +"Toto je rychlost pro různé stupně převisů. Stupně převisů jsou vyjádřeny " +"jako procento šířky extruze. 0 rychlost znamená žádné zpomalení pro používá " +"s rozsahy stupňů převisů a rychlost stěny" msgid "Bridge" msgstr "Most" @@ -5650,16 +5918,20 @@ msgstr "Časté" #, c-format, boost-format msgid "" "Following line %s contains reserved keywords.\n" -"Please remove it, or will beat G-code visualization and printing time estimation." +"Please remove it, or will beat G-code visualization and printing time " +"estimation." msgid_plural "" "Following lines %s contain reserved keywords.\n" -"Please remove them, or will beat G-code visualization and printing time estimation." +"Please remove them, or will beat G-code visualization and printing time " +"estimation." msgstr[0] "" "Následující řádek %s obsahuje vyhrazená klíčová slova.\n" -"Prosím, odstraňte ho, jinak to může ovlivnit vizualizaci G-kódu a odhad času tisku." +"Prosím, odstraňte ho, jinak to může ovlivnit vizualizaci G-kódu a odhad času " +"tisku." msgstr[1] "" "Následující řádky %s obsahují vyhrazená klíčová slova.\n" -"Prosím, odstraňte je, jinak to může ovlivnit vizualizaci G-kódu a odhad času tisku." +"Prosím, odstraňte je, jinak to může ovlivnit vizualizaci G-kódu a odhad času " +"tisku." msgstr[2] "" msgid "Reserved keywords found" @@ -5678,7 +5950,8 @@ msgid "Recommended nozzle temperature" msgstr "Doporučená teplota trysky" msgid "Recommended nozzle temperature range of this filament. 0 means no set" -msgstr "Doporučený rozsah teploty trysky tohoto filamentu. 0 znamená nenastaveno" +msgstr "" +"Doporučený rozsah teploty trysky tohoto filamentu. 0 znamená nenastaveno" msgid "Print temperature" msgstr "Teplota tisku" @@ -5693,41 +5966,43 @@ msgid "Cool plate" msgstr "Cool podložka" msgid "" -"Bed temperature when cool plate is installed. Value 0 means the filament does not support to print on " -"the Cool Plate" +"Bed temperature when cool plate is installed. Value 0 means the filament " +"does not support to print on the Cool Plate" msgstr "" -"Toto je teplota podložky, když je Cool podložka. Hodnota 0 znamená, že filament nepodporuje tisk na Cool " -"Podložku" +"Toto je teplota podložky, když je Cool podložka. Hodnota 0 znamená, že " +"filament nepodporuje tisk na Cool Podložku" msgid "Engineering plate" msgstr "Engineering podložka" msgid "" -"Bed temperature when engineering plate is installed. Value 0 means the filament does not support to " -"print on the Engineering Plate" +"Bed temperature when engineering plate is installed. Value 0 means the " +"filament does not support to print on the Engineering Plate" msgstr "" -"Teplota podložky při instalaci Engineering podložky. Hodnota 0 znamená filament nepodporuje tisk na " -"Engineering Podložku" +"Teplota podložky při instalaci Engineering podložky. Hodnota 0 znamená " +"filament nepodporuje tisk na Engineering Podložku" msgid "Smooth PEI Plate / High Temp Plate" msgstr "Smooth PEI Podložka / High Temp Podložka" 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/High Temp Plate" +"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/" +"High Temp Plate" msgstr "" -"Teplota podložky, když je nainstalována Smooth PEI Podložka/High temperature Podložka. Hodnota 0 " -"znamená, že filament není podporován pro tisk na Smooth PEI Podložka/High temperature Podložka" +"Teplota podložky, když je nainstalována Smooth PEI Podložka/High temperature " +"Podložka. Hodnota 0 znamená, že filament není podporován pro tisk na Smooth " +"PEI Podložka/High temperature Podložka" msgid "Textured PEI Plate" msgstr "Textured PEI Podložka" msgid "" -"Bed temperature when Textured PEI Plate is installed. Value 0 means the filament does not support to " -"print on the Textured PEI Plate" +"Bed temperature when Textured PEI Plate is installed. Value 0 means the " +"filament does not support to print on the Textured PEI Plate" msgstr "" -"Teplota podložky při instalaci Textured PEI Podložky. Hodnota 0 znamená filament nepodporuje tisk na " -"Textured PEI Podložku" +"Teplota podložky při instalaci Textured PEI Podložky. Hodnota 0 znamená " +"filament nepodporuje tisk na Textured PEI Podložku" msgid "Volumetric speed limitation" msgstr "Omezení objemové rychlosti" @@ -5745,21 +6020,25 @@ msgid "Min fan speed threshold" msgstr "Min rychlosti ventilátoru" 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" +"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 "" -"Ventilátor chlazení části poběží na minimální rychlost ventilátoru, když se odhadne doba vrstvy je delší " -"než prahová hodnota. Když je doba vrstvy kratší než hraniční hodnota, rychlost ventilátoru bude " -"interpolována mezi minimální a maximální rychlost ventilátoru podle doby tisku vrstvy" +"Ventilátor chlazení části poběží na minimální rychlost ventilátoru, když se " +"odhadne doba vrstvy je delší než prahová hodnota. Když je doba vrstvy kratší " +"než hraniční hodnota, rychlost ventilátoru bude interpolována mezi minimální " +"a maximální rychlost ventilátoru podle doby tisku vrstvy" msgid "Max fan speed threshold" msgstr "Max rychlosti ventilátoru" -msgid "Part cooling fan speed will be max when the estimated layer time is shorter than the setting value" +msgid "" +"Part cooling fan speed will be max when the estimated layer time is shorter " +"than the setting value" msgstr "" -"Rychlost ventilátoru chlazení části bude maximální, když bude odhadovaná doba vrstvy kratší než " -"nastavená hodnota" +"Rychlost ventilátoru chlazení části bude maximální, když bude odhadovaná " +"doba vrstvy kratší než nastavená hodnota" msgid "Auxiliary part cooling fan" msgstr "Přídavný ventilátor chlazení" @@ -5906,7 +6185,8 @@ msgid "Set" msgstr "Nastavit" msgid "Click to reset current value and attach to the global value." -msgstr "Klikněte pro resetování aktuální hodnoty a připojení ke globální hodnotě." +msgstr "" +"Klikněte pro resetování aktuální hodnoty a připojení ke globální hodnotě." msgid "Click to drop current modify and reset to saved value." msgstr "Kliknutím zrušíte aktuální úpravu a obnovíte uloženou hodnotu." @@ -5978,32 +6258,38 @@ msgstr "Předvolba \"%1%\" obsahuje následující neuložené změny:" #, boost-format msgid "" -"Preset \"%1%\" is not compatible with the new printer profile and it contains the following unsaved " -"changes:" +"Preset \"%1%\" is not compatible with the new printer profile and it " +"contains the following unsaved changes:" msgstr "" -"Předvolba \"%1%\" není kompatibilní s novým profilem tiskárny a je obsahuje následující neuložené změny:" +"Předvolba \"%1%\" není kompatibilní s novým profilem tiskárny a je obsahuje " +"následující neuložené změny:" #, boost-format msgid "" -"Preset \"%1%\" is not compatible with the new process profile and it contains the following unsaved " -"changes:" +"Preset \"%1%\" is not compatible with the new process profile and it " +"contains the following unsaved changes:" msgstr "" -"Předvolba \"%1%\" není kompatibilní s novým procesním profilem a je obsahuje následující neuložené změny:" +"Předvolba \"%1%\" není kompatibilní s novým procesním profilem a je obsahuje " +"následující neuložené změny:" #, boost-format msgid "" "You have changed some settings of preset \"%1%\". \n" -"Would you like to keep these changed settings (new value) after switching preset?" +"Would you like to keep these changed settings (new value) after switching " +"preset?" msgstr "" "Změnili jste některá nastavení předvolby \"%1%\" . \n" -"Přejete si po přepnutí zachovat tato změněná nastavení (nová hodnota)přednastavení?" +"Přejete si po přepnutí zachovat tato změněná nastavení (nová " +"hodnota)přednastavení?" msgid "" "You have changed some preset settings. \n" -"Would you like to keep these changed settings (new value) after switching preset?" +"Would you like to keep these changed settings (new value) after switching " +"preset?" msgstr "" "Změnili jste některá přednastavená nastavení. \n" -"Přejete si po přepnutí zachovat tato změněná nastavení (nová hodnota)přednastavení?" +"Přejete si po přepnutí zachovat tato změněná nastavení (nová " +"hodnota)přednastavení?" msgid "Extruders count" msgstr "Počet extruderů" @@ -6101,23 +6387,27 @@ msgid "Ramming customization" msgstr "Přizpůsobení rapidní extruze" 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 unloaded filament so it does not prevent insertion of the " -"new filament and can itself be reinserted later. This phase is important and different materials can " -"require different extrusion speeds to get the good shape. For this reason, the extrusion rates during " -"ramming are adjustable.\n" +"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 " +"unloaded filament so it does not prevent insertion of the new filament and " +"can itself be reinserted later. This phase is important and different " +"materials can require different extrusion speeds to get the good shape. For " +"this reason, the extrusion rates during ramming are adjustable.\n" "\n" -"This is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding " -"into filament etc." -msgstr "" -"Rapidní extruze označuje rychlé vytlačení filamentu těsně před jeho výměnou za jiný v multi material " -"tiskárně s jedním extruderem. Účelem je správně vytvarovat konec vysouvaného filamentu tak, aby " -"neblokoval zasunutí nového filamentu a také mohl být sám později opětovně zasunut. Tento proces je " -"důležitý a rozdílné materiály mohou pro získání optimálního tvaru vyžadovat různé rychlosti extruze. Z " -"tohoto důvodu jsou objemové průtoky při rapidní extruzi uživatelsky upravitelné.\n" +"This is an expert-level setting, incorrect adjustment will likely lead to " +"jams, extruder wheel grinding into filament etc." +msgstr "" +"Rapidní extruze označuje rychlé vytlačení filamentu těsně před jeho výměnou " +"za jiný v multi material tiskárně s jedním extruderem. Účelem je správně " +"vytvarovat konec vysouvaného filamentu tak, aby neblokoval zasunutí nového " +"filamentu a také mohl být sám později opětovně zasunut. Tento proces je " +"důležitý a rozdílné materiály mohou pro získání optimálního tvaru vyžadovat " +"různé rychlosti extruze. Z tohoto důvodu jsou objemové průtoky při rapidní " +"extruzi uživatelsky upravitelné.\n" "\n" -"Toto nastavení je určeno pro pokročilé uživatele, nesprávné nastavení velmi pravděpodobně povede k " -"zaseknutí filamentu, vybroušení filamentu podávacím kolečkem, atd." +"Toto nastavení je určeno pro pokročilé uživatele, nesprávné nastavení velmi " +"pravděpodobně povede k zaseknutí filamentu, vybroušení filamentu podávacím " +"kolečkem, atd." msgid "Total ramming time" msgstr "Celkový čas rapidní extruze" @@ -6227,11 +6517,13 @@ msgid "Shift+R" msgstr "Shift+R" msgid "" -"Auto orientates selected objects or all objects.If there are selected objects, it just orientates the " -"selected ones.Otherwise, it will orientates all objects in the current disk." +"Auto orientates selected objects or all objects.If there are selected " +"objects, it just orientates the selected ones.Otherwise, it will orientates " +"all objects in the current disk." msgstr "" -"Toto automaticky orientuje vybrané objekty nebo všechny objekty. Pokud jsou vybrány objekty, pouze " -"zorientuje vybrané. Jinak zorientuje všechny objekty v aktuální desce." +"Toto automaticky orientuje vybrané objekty nebo všechny objekty. Pokud jsou " +"vybrány objekty, pouze zorientuje vybrané. Jinak zorientuje všechny objekty " +"v aktuální desce." msgid "Shift+Tab" msgstr "Shift+Tab" @@ -6438,8 +6730,11 @@ msgstr "informace o aktualizaci verze %s:" msgid "Network plug-in update" msgstr "Aktualizace síťového zásuvného modulu" -msgid "Click OK to update the Network plug-in when Bambu Studio launches next time." -msgstr "Klepnutím na OK aktualizujte síťový zásuvný modul při příštím spuštění Bambu Studio." +msgid "" +"Click OK to update the Network plug-in when Bambu Studio launches next time." +msgstr "" +"Klepnutím na OK aktualizujte síťový zásuvný modul při příštím spuštění Bambu " +"Studio." #, c-format, boost-format msgid "A new Network plug-in(%s) available, Do you want to install it?" @@ -6454,13 +6749,17 @@ msgstr "Tuto verzi mi znovu nepřipomínat" msgid "LAN Connection Failed (Sending print file)" msgstr "Připojení k síti LAN se nezdařilo (odesílání tiskového souboru)" -msgid "Step 1, please confirm Bambu Studio and your printer are in the same LAN." -msgstr "Krok 1, potvrďte, že Bambu Studio a vaše tiskárna jsou ve stejné síti LAN." +msgid "" +"Step 1, please confirm Bambu Studio and your printer are in the same LAN." +msgstr "" +"Krok 1, potvrďte, že Bambu Studio a vaše tiskárna jsou ve stejné síti LAN." msgid "" -"Step 2, if the IP and Access Code below are different from the actual values on your printer, please " -"correct them." -msgstr "Krok 2, pokud se IP a přístupový kód níže liší od skutečných hodnot na tiskárně, opravte je." +"Step 2, if the IP and Access Code below are different from the actual values " +"on your printer, please correct them." +msgstr "" +"Krok 2, pokud se IP a přístupový kód níže liší od skutečných hodnot na " +"tiskárně, opravte je." msgid "IP" msgstr "IP" @@ -6505,24 +6804,29 @@ msgid "Updating successful" msgstr "Aktualizace úspěšná" msgid "" -"Are you sure you want to update? This will take about 10 minutes. Do not turn off the power while the " -"printer is updating." +"Are you sure you want to update? This will take about 10 minutes. Do not " +"turn off the power while the printer is updating." msgstr "" -"Opravdu chcete aktualizovat? Bude to trvat asi 10 minut. Nevypněte napájení během aktualizace tiskárny." +"Opravdu chcete aktualizovat? Bude to trvat asi 10 minut. Nevypněte napájení " +"během aktualizace tiskárny." msgid "" -"An important update was detected and needs to be run before printing can continue. Do you want to update " -"now? You can also update later from 'Upgrade firmware'." +"An important update was detected and needs to be run before printing can " +"continue. Do you want to update now? You can also update later from 'Upgrade " +"firmware'." msgstr "" -"Byla zjištěna důležitá aktualizace a před tiskem je třeba ji spustit a pokračovat. Chcete provést " -"aktualizaci nyní? Aktualizaci můžete provést také později v části Upgrade firmware." +"Byla zjištěna důležitá aktualizace a před tiskem je třeba ji spustit a " +"pokračovat. Chcete provést aktualizaci nyní? Aktualizaci můžete provést také " +"později v části Upgrade firmware." msgid "" -"The firmware version is abnormal. Repairing and updating are required before printing. Do you want to " -"update now? You can also update later on printer or update next time starting the studio." +"The firmware version is abnormal. Repairing and updating are required before " +"printing. Do you want to update now? You can also update later on printer or " +"update next time starting the studio." msgstr "" -"Verze firmwaru je abnormální. Oprava a aktualizace jsou nutné před tisk. Chcete provést aktualizaci " -"nyní? Aktualizaci můžete provést také později na tiskárně nebo aktualizovat při příštím spuštění studia." +"Verze firmwaru je abnormální. Oprava a aktualizace jsou nutné před tisk. " +"Chcete provést aktualizaci nyní? Aktualizaci můžete provést také později na " +"tiskárně nebo aktualizovat při příštím spuštění studia." msgid "Extension Board" msgstr "Rozšiřující deska" @@ -6588,10 +6892,12 @@ msgstr "Konfigurační balíček aktualizován na " msgid "Open G-code file:" msgstr "Otevřít soubor s G-kódem:" -msgid "One object has empty initial layer and can't be printed. Please Cut the bottom or enable supports." +msgid "" +"One object has empty initial layer and can't be printed. Please Cut the " +"bottom or enable supports." msgstr "" -"Jeden objekt má prázdnou úvodní vrstvu a nelze jej vytisknout. Ořízněte prosím spodní část nebo povolte " -"podpěry." +"Jeden objekt má prázdnou úvodní vrstvu a nelze jej vytisknout. Ořízněte " +"prosím spodní část nebo povolte podpěry." #, boost-format msgid "Object can't be printed for empty layer between %1% and %2%." @@ -6601,8 +6907,12 @@ msgstr "Objekt má prázdné vrstvy mezi %1% a %2% ​​a nelze jej vytisknout. msgid "Object: %1%" msgstr "Objekt: %1%" -msgid "Maybe parts of the object at these height are too thin, or the object has faulty mesh" -msgstr "Části objektu v těchto výškách mohou být příliš tenké nebo objekt může mít chybnou síť" +msgid "" +"Maybe parts of the object at these height are too thin, or the object has " +"faulty mesh" +msgstr "" +"Části objektu v těchto výškách mohou být příliš tenké nebo objekt může mít " +"chybnou síť" msgid "No object can be printed. Maybe too small" msgstr "Nelze vytisknout žádný objekt. Možná je příliš malý" @@ -6662,11 +6972,15 @@ msgstr "Vícenásobné" #, boost-format msgid "Failed to calculate line width of %1%. Can not get value of \"%2%\" " -msgstr "Nepodařilo se vypočítat šířku extruze %1%. Nelze získat hodnotu \"%2%\" " +msgstr "" +"Nepodařilo se vypočítat šířku extruze %1%. Nelze získat hodnotu \"%2%\" " -msgid "Invalid spacing supplied to Flow::with_spacing(), check your layer height and extrusion width" +msgid "" +"Invalid spacing supplied to Flow::with_spacing(), check your layer height " +"and extrusion width" msgstr "" -"Chybná mezera poskytnuta funkcí Flow::with_spacing(), zkontrolujte vaši vrstvovou výšku a šířku extruze" +"Chybná mezera poskytnuta funkcí Flow::with_spacing(), zkontrolujte vaši " +"vrstvovou výšku a šířku extruze" msgid "undefined error" msgstr "nedefinovaná chyba" @@ -6762,8 +7076,10 @@ msgid "write callback failed" msgstr "zpětný zápis se nezdařil" #, boost-format -msgid "%1% is too close to exclusion area, there may be collisions when printing." -msgstr "%1% je příliš blízko oblasti vyloučení, při tisku může docházet ke kolizím." +msgid "" +"%1% is too close to exclusion area, there may be collisions when printing." +msgstr "" +"%1% je příliš blízko oblasti vyloučení, při tisku může docházet ke kolizím." #, boost-format msgid "%1% is too close to others, and collisions may be caused." @@ -6777,7 +7093,8 @@ msgid " is too close to others, there may be collisions when printing." msgstr " je příliš blízko ostatním, při tisku může docházet ke kolizím." msgid " is too close to exclusion area, there may be collisions when printing." -msgstr " je příliš blízko oblasti vyloučení, při tisku může docházet ke kolizím." +msgstr "" +" je příliš blízko oblasti vyloučení, při tisku může docházet ke kolizím." msgid "Prime Tower" msgstr "Čistící Věž" @@ -6789,23 +7106,35 @@ msgid " is too close to exclusion area, and collisions will be caused.\n" msgstr " je příliš blízko oblasti vyloučení a dojde ke kolizi.\n" msgid "" -"Can not print multiple filaments which have large difference of temperature together. Otherwise, the " -"extruder and nozzle may be blocked or damaged during printing" +"Can not print multiple filaments which have large difference of temperature " +"together. Otherwise, the extruder and nozzle may be blocked or damaged " +"during printing" msgstr "" -"Nelze tisknout více filamentů, které mají velké teplotní rozdíly společně. Jinak může dojít k " -"zablokování nebo poškození extruderu a trysky během tisku" +"Nelze tisknout více filamentů, které mají velké teplotní rozdíly společně. " +"Jinak může dojít k zablokování nebo poškození extruderu a trysky během tisku" msgid "No extrusions under current settings." msgstr "Žádné extruze pod aktuálním nastavením." -msgid "Smooth mode of timelapse is not supported when \"by object\" sequence is enabled." -msgstr "Plynulý režim časosběru není podporován, když \"podle objektu\" sekvence je povoleno." +msgid "" +"Smooth mode of timelapse is not supported when \"by object\" sequence is " +"enabled." +msgstr "" +"Plynulý režim časosběru není podporován, když \"podle objektu\" sekvence je " +"povoleno." -msgid "Please select \"By object\" print sequence to print multiple objects in spiral vase mode." -msgstr "Vyberte prosím \"Podle objektu\" tiskovou sekvenci pro tisk více objektů v režimu spirálové vázy." +msgid "" +"Please select \"By object\" print sequence to print multiple objects in " +"spiral vase mode." +msgstr "" +"Vyberte prosím \"Podle objektu\" tiskovou sekvenci pro tisk více objektů v " +"režimu spirálové vázy." -msgid "The spiral vase mode does not work when an object contains more than one materials." -msgstr "Režim spirálové vázy nefunguje, když objekt obsahuje více než jeden materiál." +msgid "" +"The spiral vase mode does not work when an object contains more than one " +"materials." +msgstr "" +"Režim spirálové vázy nefunguje, když objekt obsahuje více než jeden materiál." #, boost-format msgid "The object %1% exceeds the maximum build volume height." @@ -6813,16 +7142,18 @@ msgstr "Objekt %1% přesahuje maximální výšku tiskového objemu." #, boost-format msgid "" -"While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume " -"height." +"While the object %1% itself fits the build volume, its last layer exceeds " +"the maximum build volume height." msgstr "" -"Ačkoli samotný objekt %1% se vejde do tiskového objemu, jeho poslední vrstva překračuje maximální výšku " -"tiskového objemu." +"Ačkoli samotný objekt %1% se vejde do tiskového objemu, jeho poslední vrstva " +"překračuje maximální výšku tiskového objemu." -msgid "You might want to reduce the size of your model or change current print settings and retry." +msgid "" +"You might want to reduce the size of your model or change current print " +"settings and retry." msgstr "" -"Možná budete chtít zmenšit velikost vašeho modelu nebo změnit aktuální tisková nastavení a zkusit to " -"znovu." +"Možná budete chtít zmenšit velikost vašeho modelu nebo změnit aktuální " +"tisková nastavení a zkusit to znovu." msgid "Variable layer height is not supported with Organic supports." msgstr "Variabilní výška vrstvy není podporována s organickými podpěrami." @@ -6831,26 +7162,40 @@ msgid "The prime tower is not supported in \"By object\" print." msgstr "Čistící Věž není podporován v tisku \"Podle objektu\" ." msgid "" -"The prime tower is not supported when adaptive layer height is on. It requires that all objects have the " -"same layer height." +"The prime tower is not supported when adaptive layer height is on. It " +"requires that all objects have the same layer height." msgstr "" -"Čistící Věž není podporována, když je zapnutá výška adaptivní vrstvy. Vyžaduje že všechny objekty mají " -"stejnou výšku vrstvy." +"Čistící Věž není podporována, když je zapnutá výška adaptivní vrstvy. " +"Vyžaduje že všechny objekty mají stejnou výšku vrstvy." msgid "The prime tower requires \"support gap\" to be multiple of layer height" -msgstr "Čistící věž vyžaduje, aby jakákoli \"podpěrná mezera\" byla násobkem výšky vrstvy" +msgstr "" +"Čistící věž vyžaduje, aby jakákoli \"podpěrná mezera\" byla násobkem výšky " +"vrstvy" msgid "The prime tower requires that all objects have the same layer heights" msgstr "Čistící věž vyžaduje, aby všechny objekty měly stejnou výšku vrstvy" -msgid "The prime tower requires that all objects are printed over the same number of raft layers" -msgstr "Čistící věž vyžaduje, aby byly všechny objekty vytištěny přes stejné číslo z raftových vrstev" +msgid "" +"The prime tower requires that all objects are printed over the same number " +"of raft layers" +msgstr "" +"Čistící věž vyžaduje, aby byly všechny objekty vytištěny přes stejné číslo z " +"raftových vrstev" -msgid "The prime tower requires that all objects are sliced with the same layer heights." -msgstr "Čistící věž vyžaduje, aby všechny objekty byly slicovány na stejnou výšku vrstvy." +msgid "" +"The prime tower requires that all objects are sliced with the same layer " +"heights." +msgstr "" +"Čistící věž vyžaduje, aby všechny objekty byly slicovány na stejnou výšku " +"vrstvy." -msgid "The prime tower is only supported if all objects have the same variable layer height" -msgstr "Čistící věž je podporována pouze v případě, že všechny objekty mají stejnou proměnnou výšku vrstvy" +msgid "" +"The prime tower is only supported if all objects have the same variable " +"layer height" +msgstr "" +"Čistící věž je podporována pouze v případě, že všechny objekty mají stejnou " +"proměnnou výšku vrstvy" msgid "Too small line width" msgstr "Příliš malá šířka extruze" @@ -6858,38 +7203,61 @@ msgstr "Příliš malá šířka extruze" msgid "Too large line width" msgstr "Příliš velká šířka extruze" -msgid "The prime tower requires that support has the same layer height with object." -msgstr "Čistící věž vyžaduje, aby podpěry měly stejnou výšku vrstvy jako objekt." +msgid "" +"The prime tower requires that support has the same layer height with object." +msgstr "" +"Čistící věž vyžaduje, aby podpěry měly stejnou výšku vrstvy jako objekt." -msgid "Organic support tree tip diameter must not be smaller than support material extrusion width." -msgstr "Průměr špičky organické podpěry nesmí být menší než je šířka extruze podpěr." +msgid "" +"Organic support tree tip diameter must not be smaller than support material " +"extrusion width." +msgstr "" +"Průměr špičky organické podpěry nesmí být menší než je šířka extruze podpěr." -msgid "Organic support branch diameter must not be smaller than 2x support material extrusion width." -msgstr "Průměr organické větve nesmí být menší než je dvojnásobek šířky extruze podpěr." +msgid "" +"Organic support branch diameter must not be smaller than 2x support material " +"extrusion width." +msgstr "" +"Průměr organické větve nesmí být menší než je dvojnásobek šířky extruze " +"podpěr." -msgid "Organic support branch diameter must not be smaller than support tree tip diameter." -msgstr "Průměr organické podpůrné větve nesmí být menší než průměr špičky větve." +msgid "" +"Organic support branch diameter must not be smaller than support tree tip " +"diameter." +msgstr "" +"Průměr organické podpůrné větve nesmí být menší než průměr špičky větve." -msgid "Support enforcers are used but support is not enabled. Please enable support." -msgstr "Vynucené podpěry jsou použity, ale podpěry nejsou povoleny. Povolte prosím podpěry." +msgid "" +"Support enforcers are used but support is not enabled. Please enable support." +msgstr "" +"Vynucené podpěry jsou použity, ale podpěry nejsou povoleny. Povolte prosím " +"podpěry." msgid "Layer height cannot exceed nozzle diameter" msgstr "Výška vrstvy nemůže překročit průměr trysky" msgid "" -"Relative extruder addressing requires resetting the extruder position at each layer to prevent loss of " -"floating point accuracy. Add \"G92 E0\" to layer_gcode." +"Relative extruder addressing requires resetting the extruder position at " +"each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " +"layer_gcode." msgstr "" -"Absolutní adresování extrudéru vyžaduje resetování pozice extrudéru na každé vrstvě, aby se zabránilo " -"ztrátě přesnosti pohyblivé desetinné čárky. Přidejte \"G92 E0\" do layer_gcode." +"Absolutní adresování extrudéru vyžaduje resetování pozice extrudéru na každé " +"vrstvě, aby se zabránilo ztrátě přesnosti pohyblivé desetinné čárky. " +"Přidejte \"G92 E0\" do layer_gcode." msgid "" -"\"G92 E0\" was found in before_layer_gcode, which is incompatible with absolute extruder addressing." +"\"G92 E0\" was found in before_layer_gcode, which is incompatible with " +"absolute extruder addressing." msgstr "" -"\"G92 E0\" bylo nalezeno v before_layer_gcode, což je nekompatibilní s absolutním adresováním extrudéru." +"\"G92 E0\" bylo nalezeno v before_layer_gcode, což je nekompatibilní s " +"absolutním adresováním extrudéru." -msgid "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute extruder addressing." -msgstr "\"G92 E0\" bylo nalezeno v layer_gcode, což je nekompatibilní s absolutním adresováním extrudéru." +msgid "" +"\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " +"extruder addressing." +msgstr "" +"\"G92 E0\" bylo nalezeno v layer_gcode, což je nekompatibilní s absolutním " +"adresováním extrudéru." #, c-format, boost-format msgid "Plate %d: %s does not support filament %s" @@ -6914,12 +7282,13 @@ msgid "Bed exclude area" msgstr "Podložka mimo prostor" msgid "" -"Unprintable area in XY plane. For example, X1 Series printers use the front left corner to cut filament " -"during filament change. The area is expressed as polygon by points in following format: \"XxY, XxY, ...\"" +"Unprintable area in XY plane. For example, X1 Series printers use the front " +"left corner to cut filament during filament change. The area is expressed as " +"polygon by points in following format: \"XxY, XxY, ...\"" msgstr "" -"Nepotisknutelná oblast v rovině XY. Například tiskárny řady X1 používají přední levý roh pro vyjmutí " -"filamentu během výměny filamentu. Oblast je vyjádřena jako polygon podle bodů v následujícím formátu: " -"\"XxY, XxY, ... \"" +"Nepotisknutelná oblast v rovině XY. Například tiskárny řady X1 používají " +"přední levý roh pro vyjmutí filamentu během výměny filamentu. Oblast je " +"vyjádřena jako polygon podle bodů v následujícím formátu: \"XxY, XxY, ... \"" msgid "Bed custom texture" msgstr "Vlastní textura podložky" @@ -6930,11 +7299,30 @@ msgstr "Vlastní model podložky" msgid "Elephant foot compensation" msgstr "Kompenzace rozplácnutí první vrstvy" -msgid "Shrink the initial layer on build plate to compensate for elephant foot effect" +msgid "" +"Shrink the initial layer on build plate to compensate for elephant foot " +"effect" msgstr "Snižte první vrstvu na podložce, abyste kompenzovali efekt sloní nohy" -msgid "Slicing height for each layer. Smaller layer height means more accurate and more printing time" -msgstr "Toto je výška každé vrstvy. Menší výšky vrstvy dávají větší přesnost, ale delší doba tisku" +msgid "Elephant foot compensation layers" +msgstr "" + +msgid "" +"The number of layers on which the elephant foot compensation will be active. " +"The first layer will be shrunk by the elephant foot compensation value, then " +"the next layers will be linearly shrunk less, up to the layer indicated by " +"this value." +msgstr "" + +msgid "layers" +msgstr "vrstva(y)" + +msgid "" +"Slicing height for each layer. Smaller layer height means more accurate and " +"more printing time" +msgstr "" +"Toto je výška každé vrstvy. Menší výšky vrstvy dávají větší přesnost, ale " +"delší doba tisku" msgid "Printable height" msgstr "Výška pro tisk" @@ -6949,31 +7337,36 @@ msgid "Hostname, IP or URL" msgstr "Název serveru, IP nebo URL" msgid "" -"Slic3r can upload G-code files to a printer host. This field should contain the hostname, IP address or " -"URL of the printer host instance. Print host behind HAProxy with basic auth enabled can be accessed by " -"putting the user name and password into the URL in the following format: https://username:password@your-" -"octopi-address/" -msgstr "" -"Slic3r může nahrávat G-kódy do tiskového serveru. Toto pole by mělo obsahovat název hostitele, IP adresu " -"nebo URL tiskového serveru. K tiskovému serveru za HAProxy se zapnutým ověřením basic auth lze " -"přistupovat zadáním uživatelského jména a hesla do adresy URL v následujícím formátu: https://username: " +"Slic3r can upload G-code files to a printer host. This field should contain " +"the hostname, IP address or URL of the printer host instance. Print host " +"behind HAProxy with basic auth enabled can be accessed by putting the user " +"name and password into the URL in the following format: https://username:" "password@your-octopi-address/" +msgstr "" +"Slic3r může nahrávat G-kódy do tiskového serveru. Toto pole by mělo " +"obsahovat název hostitele, IP adresu nebo URL tiskového serveru. K " +"tiskovému serveru za HAProxy se zapnutým ověřením basic auth lze přistupovat " +"zadáním uživatelského jména a hesla do adresy URL v následujícím formátu: " +"https://username: password@your-octopi-address/" msgid "Device UI" msgstr "Uživatelské rozhraní zařízení" -msgid "Specify the URL of your device user interface if it's not same as print_host" -msgstr "Uveďte URL uživatelského rozhraní vašeho zařízení, pokud není stejné jako print_host" +msgid "" +"Specify the URL of your device user interface if it's not same as print_host" +msgstr "" +"Uveďte URL uživatelského rozhraní vašeho zařízení, pokud není stejné jako " +"print_host" msgid "API Key / Password" msgstr "API klíč / Heslo" msgid "" -"Slic3r can upload G-code files to a printer host. This field should contain the API Key or the password " -"required for authentication." +"Slic3r can upload G-code files to a printer host. This field should contain " +"the API Key or the password required for authentication." msgstr "" -"Slic3r může nahrát soubory do tiskového serveru. Toto pole by mělo obsahovat klíč API požadovaný pro " -"ověření." +"Slic3r může nahrát soubory do tiskového serveru. Toto pole by mělo obsahovat " +"klíč API požadovaný pro ověření." msgid "Name of the printer" msgstr "Název tiskárny" @@ -6982,11 +7375,13 @@ msgid "HTTPS CA File" msgstr "Soubor HTTPS CA" msgid "" -"Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. If left " -"blank, the default OS CA certificate repository is used." +"Custom CA certificate file can be specified for HTTPS OctoPrint connections, " +"in crt/pem format. If left blank, the default OS CA certificate repository " +"is used." msgstr "" -"Pro HTTPS připojení OctoPrintu lze zadat vlastní CA certifikát ve formátu crt/pem. Pokud zůstane pole " -"prázdné, použije se výchozí úložiště certifikátů OS CA." +"Pro HTTPS připojení OctoPrintu lze zadat vlastní CA certifikát ve formátu " +"crt/pem. Pokud zůstane pole prázdné, použije se výchozí úložiště certifikátů " +"OS CA." msgid "User" msgstr "Uživatel" @@ -6998,11 +7393,13 @@ msgid "Ignore HTTPS certificate revocation checks" msgstr "Ignorování kontrol revokace HTTPS certifikátu" msgid "" -"Ignore HTTPS certificate revocation checks in case of missing or offline distribution points. One may " -"want to enable this option for self signed certificates if connection fails." +"Ignore HTTPS certificate revocation checks in case of missing or offline " +"distribution points. One may want to enable this option for self signed " +"certificates if connection fails." msgstr "" -"Ignorování kontrol revokace HTTPS certifikátu v případě chybějících nebo offline distribučních bodů. " -"Tuto možnost lze povolit pro certifikáty podepsané vlastním podpisem v případě, že se připojení nezdaří." +"Ignorování kontrol revokace HTTPS certifikátu v případě chybějících nebo " +"offline distribučních bodů. Tuto možnost lze povolit pro certifikáty " +"podepsané vlastním podpisem v případě, že se připojení nezdaří." msgid "Names of presets related to the physical printer" msgstr "Názvy přednastavení souvisejících s fyzickou tiskárnou" @@ -7020,19 +7417,23 @@ msgid "Avoid crossing wall" msgstr "Vyhněte se přejíždění stěn" msgid "Detour and avoid to travel across wall which may cause blob on surface" -msgstr "Objeďte a vyhněte se přejíždění přes stěny, což může způsobit skvrny na povrchu" +msgstr "" +"Objeďte a vyhněte se přejíždění přes stěny, což může způsobit skvrny na " +"povrchu" msgid "Avoid crossing wall - Max detour length" msgstr "Vyhněte se přejíždění stěn - Maximální délka objížďky" 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 travel path. Zero to disable" +"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 " +"travel path. Zero to disable" msgstr "" -"Maximální vzdálenost objížďky pro vyhnutí se přejezdu přes stěny. Neobjíždějte, pokud vzdálenost " -"objížďky je větší než tato hodnota. Lze zadat délku objížďky buď jako absolutní hodnotu, nebo jako " -"procento (například 50 %) přímého cestovní cesta. Nula k deaktivaci" +"Maximální vzdálenost objížďky pro vyhnutí se přejezdu přes stěny. " +"Neobjíždějte, pokud vzdálenost objížďky je větší než tato hodnota. Lze zadat " +"délku objížďky buď jako absolutní hodnotu, nebo jako procento (například 50 " +"%) přímého cestovní cesta. Nula k deaktivaci" msgid "mm or %" msgstr "mm or %" @@ -7041,35 +7442,35 @@ msgid "Other layers" msgstr "Ostatní vrstvy" msgid "" -"Bed temperature for layers except the initial one. Value 0 means the filament does not support to print " -"on the Cool Plate" +"Bed temperature for layers except the initial one. Value 0 means the " +"filament does not support to print on the Cool Plate" msgstr "" -"Toto je teplota podložky pro vrstvy kromě první. Hodnota 0 znamená, že filament nepodporuje tisk na Cool " -"Podložku" +"Toto je teplota podložky pro vrstvy kromě první. Hodnota 0 znamená, že " +"filament nepodporuje tisk na Cool Podložku" msgid "°C" msgstr "°C" msgid "" -"Bed temperature for layers except the initial one. Value 0 means the filament does not support to print " -"on the Engineering Plate" +"Bed temperature for layers except the initial one. Value 0 means the " +"filament does not support to print on the Engineering Plate" msgstr "" -"Toto je teplota Podložky pro vrstvy kromě první. Hodnota 0 znamená, že Filament nepodporuje tisk na " -"Engineering Podložku" +"Toto je teplota Podložky pro vrstvy kromě první. Hodnota 0 znamená, že " +"Filament nepodporuje tisk na Engineering Podložku" msgid "" -"Bed temperature for layers except the initial one. Value 0 means the filament does not support to print " -"on the High Temp Plate" +"Bed temperature for layers except the initial one. Value 0 means the " +"filament does not support to print on the High Temp Plate" msgstr "" -"Toto je teplota Podložky pro vrstvy kromě první. Hodnota 0 znamená, že filament nepodporuje tisk na High " -"Temp Podložku" +"Toto je teplota Podložky pro vrstvy kromě první. Hodnota 0 znamená, že " +"filament nepodporuje tisk na High Temp Podložku" msgid "" -"Bed temperature for layers except the initial one. Value 0 means the filament does not support to print " -"on the Textured PEI Plate" +"Bed temperature for layers except the initial one. Value 0 means the " +"filament does not support to print on the Textured PEI Plate" msgstr "" -"Toto je teplota Podložky pro vrstvy kromě první. Hodnota 0 znamená, že filament nepodporuje tisk na " -"Textured PEI Podložku" +"Toto je teplota Podložky pro vrstvy kromě první. Hodnota 0 znamená, že " +"filament nepodporuje tisk na Textured PEI Podložku" msgid "Initial layer" msgstr "První vrstva" @@ -7078,30 +7479,32 @@ msgid "Initial layer bed temperature" msgstr "Teplota podložky první vrstvy" msgid "" -"Bed temperature of the initial layer. Value 0 means the filament does not support to print on the Cool " -"Plate" +"Bed temperature of the initial layer. Value 0 means the filament does not " +"support to print on the Cool Plate" msgstr "" -"Toto je teplota podložky první vrstvy. Hodnota 0 znamená filament nepodporuje tisk na Cool Podložku" +"Toto je teplota podložky první vrstvy. Hodnota 0 znamená filament " +"nepodporuje tisk na Cool Podložku" msgid "" -"Bed temperature of the initial layer. Value 0 means the filament does not support to print on the " -"Engineering Plate" +"Bed temperature of the initial layer. Value 0 means the filament does not " +"support to print on the Engineering Plate" msgstr "" -"Toto je teplota podložky první vrstvy. Hodnota 0 znamená filament nepodporuje tisk na Engineering " -"Podložku" +"Toto je teplota podložky první vrstvy. Hodnota 0 znamená filament " +"nepodporuje tisk na Engineering Podložku" msgid "" -"Bed temperature of the initial layer. Value 0 means the filament does not support to print on the High " -"Temp Plate" +"Bed temperature of the initial layer. Value 0 means the filament does not " +"support to print on the High Temp Plate" msgstr "" -"Toto je teplota podložky první vrstvy. Hodnota 0 znamená filament nepodporuje tisk na High Temp Podložku" +"Toto je teplota podložky první vrstvy. Hodnota 0 znamená filament " +"nepodporuje tisk na High Temp Podložku" msgid "" -"Bed temperature of the initial layer. Value 0 means the filament does not support to print on the " -"Textured PEI Plate" +"Bed temperature of the initial layer. Value 0 means the filament does not " +"support to print on the Textured PEI Plate" msgstr "" -"Toto je teplota podložky první vrstvy. Hodnota 0 znamená filament nepodporuje tisk na Textured PEI " -"Podložku" +"Toto je teplota podložky první vrstvy. Hodnota 0 znamená filament " +"nepodporuje tisk na Textured PEI Podložku" msgid "Bed types supported by the printer" msgstr "Typy podložek podporované tiskárnou" @@ -7122,92 +7525,105 @@ msgid "Bottom shell layers" msgstr "Spodní vrstvy skořepiny" msgid "" -"This is the number of solid layers of bottom shell, including the bottom surface layer. When the " -"thickness calculated by this value is thinner than bottom shell thickness, the bottom shell layers will " -"be increased" +"This is the number of solid layers of bottom shell, including the bottom " +"surface layer. When the thickness calculated by this value is thinner than " +"bottom shell thickness, the bottom shell layers will be increased" msgstr "" -"Toto je počet pevných vrstev spodní skořepiny, včetně spodní povrchové vrstvy. Když je tloušťka " -"vypočítaná touto hodnotou tenčí než tloušťka spodní skořepiny, spodní vrstvy skořepiny se zvětší" +"Toto je počet pevných vrstev spodní skořepiny, včetně spodní povrchové " +"vrstvy. Když je tloušťka vypočítaná touto hodnotou tenčí než tloušťka spodní " +"skořepiny, spodní vrstvy skořepiny se zvětší" msgid "Bottom shell thickness" msgstr "Tloušťka spodní skořepiny" msgid "" -"The number of bottom solid layers is increased when slicing if the thickness calculated by bottom shell " -"layers is thinner than this value. This can avoid having too thin shell when layer height is small. 0 " -"means that this setting is disabled and thickness of bottom shell is absolutely determained by bottom " -"shell layers" +"The number of bottom solid layers is increased when slicing if the thickness " +"calculated by bottom shell layers is thinner than this value. This can avoid " +"having too thin shell when layer height is small. 0 means that this setting " +"is disabled and thickness of bottom shell is absolutely determained by " +"bottom shell layers" msgstr "" -"Počet spodních pevných vrstev se při krájení zvýší, pokud je tloušťka vypočítaná podle spodních vrstev " -"skořepiny tenčí než tato hodnota. Tím se lze vyhnout příliš tenké skořepině, když je výška vrstvy malá. " -"0 znamená, že toto nastavení je zakázáno a tloušťka spodní skořepiny je absolutně určován spodními " -"vrstvami pláště" +"Počet spodních pevných vrstev se při krájení zvýší, pokud je tloušťka " +"vypočítaná podle spodních vrstev skořepiny tenčí než tato hodnota. Tím se " +"lze vyhnout příliš tenké skořepině, když je výška vrstvy malá. 0 znamená, že " +"toto nastavení je zakázáno a tloušťka spodní skořepiny je absolutně určován " +"spodními vrstvami pláště" msgid "Force cooling for overhang and bridge" msgstr "Vynucené chlazení pro převisy a mosty" -msgid "Enable this option to optimize part cooling fan speed for overhang and bridge to get better cooling" +msgid "" +"Enable this option to optimize part cooling fan speed for overhang and " +"bridge to get better cooling" msgstr "" -"Povolením této možnosti optimalizujete rychlost ventilátoru chlazení dílů pro převis a most, abyste " -"získali lepší chlazení" +"Povolením této možnosti optimalizujete rychlost ventilátoru chlazení dílů " +"pro převis a most, abyste získali lepší chlazení" msgid "Fan speed for overhang" msgstr "Rychlost ventilátoru pro převisy" msgid "" -"Force part cooling fan to be this speed when printing bridge or overhang wall which has large overhang " -"degree. Forcing cooling for overhang and bridge can get better quality for these part" +"Force part cooling fan to be this speed when printing bridge or overhang " +"wall which has large overhang degree. Forcing cooling for overhang and " +"bridge can get better quality for these part" msgstr "" -"Vynutit ventilátor chlazení na tuto rychlost, když tisknete most nebo převislou stěnu, která má velký " -"přesah. Vynucení chlazení převisu a mostu může získat lepší kvalitu těchto dílů" +"Vynutit ventilátor chlazení na tuto rychlost, když tisknete most nebo " +"převislou stěnu, která má velký přesah. Vynucení chlazení převisu a mostu " +"může získat lepší kvalitu těchto dílů" msgid "Cooling overhang threshold" msgstr "Hranice chlazení převisů" #, fuzzy, c-format msgid "" -"Force cooling fan to be specific speed when overhang degree of printed part exceeds this value. " -"Expressed as percentage which indicides how much width of the line without support from lower layer. " -"0% means forcing cooling for all outer wall no matter how much overhang degree" +"Force cooling fan to be specific speed when overhang degree of printed part " +"exceeds this value. Expressed as percentage which indicides how much width " +"of the line without support from lower layer. 0% means forcing cooling for " +"all outer wall no matter how much overhang degree" msgstr "" -"Vynutit chladicí ventilátor na určitou rychlost, když stupeň převisu tištěného dílu překročí tuto " -"hodnotu. Vyjádřeno v procentech, které udává, jak velká šířka extruze bez podpěry spodní vrstvy. " -"0% znamená vynucení chlazení pro celou vnější stěnu bez ohledu na míru převisu" +"Vynutit chladicí ventilátor na určitou rychlost, když stupeň převisu " +"tištěného dílu překročí tuto hodnotu. Vyjádřeno v procentech, které udává, " +"jak velká šířka extruze bez podpěry spodní vrstvy. 0% znamená vynucení " +"chlazení pro celou vnější stěnu bez ohledu na míru převisu" msgid "Bridge infill direction" msgstr "Směr výplně mostu" msgid "" -"Bridging angle override. If left to zero, the bridging angle will be calculated automatically. Otherwise " -"the provided angle will be used for external bridges. Use 180°for zero angle." +"Bridging angle override. If left to zero, the bridging angle will be " +"calculated automatically. Otherwise the provided angle will be used for " +"external bridges. Use 180°for zero angle." msgstr "" -"Přepsání úhlu přemostění. Pokud je ponecháno na nule, úhel přemostění bude vypočítán automaticky. Jinak " -"bude poskytnutý úhel použit pro vnější mosty. Pro nulový úhel použijte 180°." +"Přepsání úhlu přemostění. Pokud je ponecháno na nule, úhel přemostění bude " +"vypočítán automaticky. Jinak bude poskytnutý úhel použit pro vnější mosty. " +"Pro nulový úhel použijte 180°." msgid "Bridge density" msgstr "Hustota mostu" msgid "Density of external bridges. 100% means solid bridge. Default is 100%." -msgstr "Hustota externích mostů. 100 % znamená pevný most. Výchozí hodnota je 100 %." +msgstr "" +"Hustota externích mostů. 100 % znamená pevný most. Výchozí hodnota je 100 %." msgid "Bridge flow" msgstr "Průtok mostu" msgid "" -"Decrease this value slightly(for example 0.9) to reduce the amount of material for bridge, to improve sag" +"Decrease this value slightly(for example 0.9) to reduce the amount of " +"material for bridge, to improve sag" msgstr "" -"Snižte tuto hodnotu mírně (například 0,9), abyste snížili množství materiálu pro most a zlepšili " -"prověšení" +"Snižte tuto hodnotu mírně (například 0,9), abyste snížili množství materiálu " +"pro most a zlepšili prověšení" msgid "Top surface flow ratio" msgstr "Poměr průtoku horní vrstvy" msgid "" -"This factor affects the amount of material for top solid infill. You can decrease it slightly to have " -"smooth surface finish" +"This factor affects the amount of material for top solid infill. You can " +"decrease it slightly to have smooth surface finish" msgstr "" -"Tento faktor ovlivňuje množství materiálu pro vrchní plnou výplň. Můžete jej mírně snížit, abyste měli " -"hladký povrch" +"Tento faktor ovlivňuje množství materiálu pro vrchní plnou výplň. Můžete jej " +"mírně snížit, abyste měli hladký povrch" msgid "Bottom surface flow ratio" msgstr "Poměr průtoku spodní vrstvy" @@ -7218,48 +7634,65 @@ msgstr "Tento faktor ovlivňuje množství materiálu pro spodní plnou výplň" msgid "Precise wall(experimental)" msgstr "Přesná stěna (experimentální)" -msgid "Improve shell precision by adjusting outer wall spacing. This also improves layer consistency." +msgid "" +"Improve shell precision by adjusting outer wall spacing. This also improves " +"layer consistency." msgstr "" -"Zlepšete přesnost skořepiny úpravou vzdálenosti vnějších stěn. To také zlepšuje konzistence vrstev." +"Zlepšete přesnost skořepiny úpravou vzdálenosti vnějších stěn. To také " +"zlepšuje konzistence vrstev." msgid "Only one wall on top surfaces" msgstr "Pouze jedna stěna na horních plochách" -msgid "Use only one wall on flat top surface, to give more space to the top infill pattern" +msgid "" +"Use only one wall on flat top surface, to give more space to the top infill " +"pattern" msgstr "" -"Používejte pouze jednu stěnu na rovném horním povrchu, abyste získali více prostoru pro horní vzor výplně" +"Používejte pouze jednu stěnu na rovném horním povrchu, abyste získali více " +"prostoru pro horní vzor výplně" msgid "One wall threshold" msgstr "Hranice jedné stěny" #, fuzzy, c-format, boost-format msgid "" -"If a top surface has to be printed and it's partially covered by another layer, it won't be considered " -"at a top layer where its width is below this value. This can be useful to not let the 'one perimeter on " -"top' trigger on surface that should be covered only by perimeters. This value can be a mm or a % of the " -"perimeter extrusion width.\n" -"Warning: If enabled, artifacts can be created is you have some thin features on the next layer, like " -"letters. Set this setting to 0 to remove these artifacts." -msgstr "" -"Pokud má být tisknuta horní plocha a je částečně zakrytá jinou vrstvou, nebude brána v úvahu jako horní " -"vrstva, pokud je její šířka nižší než tato hodnota. Toto může být užitečné, aby se zabránilo spuštění " -"funkce 'jeden perimetr nahoře' na ploše, která by měla být pokryta pouze perimetry. Tato hodnota může " -"být udávána v mm nebo jako % o šířky extruze perimetru.\n" -"Varování: Pokud je tato funkce povolena, mohou vzniknout artefakty, pokud máte na následující vrstvě " -"nějaké tenké prvky, například písmena. Tuto volbu nastavte na 0, abyste se tyto artefakty odstranili." +"If a top surface has to be printed and it's partially covered by another " +"layer, it won't be considered at a top layer where its width is below this " +"value. This can be useful to not let the 'one perimeter on top' trigger on " +"surface that should be covered only by perimeters. This value can be a mm or " +"a % of the perimeter extrusion width.\n" +"Warning: If enabled, artifacts can be created is you have some thin features " +"on the next layer, like letters. Set this setting to 0 to remove these " +"artifacts." +msgstr "" +"Pokud má být tisknuta horní plocha a je částečně zakrytá jinou vrstvou, " +"nebude brána v úvahu jako horní vrstva, pokud je její šířka nižší než tato " +"hodnota. Toto může být užitečné, aby se zabránilo spuštění funkce 'jeden " +"perimetr nahoře' na ploše, která by měla být pokryta pouze perimetry. Tato " +"hodnota může být udávána v mm nebo jako % o šířky extruze perimetru.\n" +"Varování: Pokud je tato funkce povolena, mohou vzniknout artefakty, pokud " +"máte na následující vrstvě nějaké tenké prvky, například písmena. Tuto volbu " +"nastavte na 0, abyste se tyto artefakty odstranili." msgid "Only one wall on first layer" msgstr "Pouze jedna stěna v první vrstvě" -msgid "Use only one wall on first layer, to give more space to the bottom infill pattern" +msgid "" +"Use only one wall on first layer, to give more space to the bottom infill " +"pattern" msgstr "" -"Používejte pouze jednu stěnu na první vrstvě, abyste získali více prostoru pro spodní výplňový vzor" +"Používejte pouze jednu stěnu na první vrstvě, abyste získali více prostoru " +"pro spodní výplňový vzor" msgid "Extra perimeters on overhangs" msgstr "Dodatečné perimetry u převisů" -msgid "Create additional perimeter paths over steep overhangs and areas where bridges cannot be anchored. " -msgstr "Vytvořte další perimetry přes strmé převisy a oblasti, kde mosty nelze ukotvit. " +msgid "" +"Create additional perimeter paths over steep overhangs and areas where " +"bridges cannot be anchored. " +msgstr "" +"Vytvořte další perimetry přes strmé převisy a oblasti, kde mosty nelze " +"ukotvit. " msgid "Classic mode" msgstr "Klasický režim" @@ -7276,9 +7709,12 @@ msgstr "Povolte tuto volbu pro zpomalení tisku pro různé stupně převisů" msgid "Slow down for curled perimeters" msgstr "Zpomalení pro zakroucené obvody" -msgid "Enable this option to slow printing down in areas where potential curled perimeters may exist" +msgid "" +"Enable this option to slow printing down in areas where potential curled " +"perimeters may exist" msgstr "" -"Povolte tuto možnost pro zpomalení tisku na místech, kde mohou existovat potenciální zakroucené obvody" +"Povolte tuto možnost pro zpomalení tisku na místech, kde mohou existovat " +"potenciální zakroucené obvody" msgid "mm/s or %" msgstr "mm/s or %" @@ -7296,11 +7732,11 @@ msgid "Internal" msgstr "Vnitřní" msgid "" -"Speed of internal bridge. If the value is expressed as a percentage, it will be calculated based on the " -"bridge_speed. Default value is 150%." +"Speed of internal bridge. If the value is expressed as a percentage, it will " +"be calculated based on the bridge_speed. Default value is 150%." msgstr "" -"Rychlost vnitřního mostu. Pokud je hodnota vyjádřena jako procento, bude vypočítána na základě " -"most_speed. Výchozí hodnota je 150 %." +"Rychlost vnitřního mostu. Pokud je hodnota vyjádřena jako procento, bude " +"vypočítána na základě most_speed. Výchozí hodnota je 150 %." msgid "Brim width" msgstr "Šířka límce" @@ -7312,17 +7748,20 @@ msgid "Brim type" msgstr "Typ límce" msgid "" -"This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width " -"is analysed and calculated automatically." +"This controls the generation of the brim at outer and/or inner side of " +"models. Auto means the brim width is analysed and calculated automatically." msgstr "" -"Toto ovládá generování límce na vnější a/nebo vnitřní straně modelů. Možnost Auto znamená, že šířka " -"límce je automaticky analyzována a vypočítána." +"Toto ovládá generování límce na vnější a/nebo vnitřní straně modelů. Možnost " +"Auto znamená, že šířka límce je automaticky analyzována a vypočítána." msgid "Brim-object gap" msgstr "Mezera mezi Límcem a Objektem" -msgid "A gap between innermost brim line and object can make brim be removed more easily" -msgstr "Mezera mezi nejvnitřnějším límcem a předmětem může usnadnit odstranění límce" +msgid "" +"A gap between innermost brim line and object can make brim be removed more " +"easily" +msgstr "" +"Mezera mezi nejvnitřnějším límcem a předmětem může usnadnit odstranění límce" msgid "Brim ears" msgstr "Uši límce" @@ -7346,12 +7785,12 @@ msgid "Brim ear detection radius" msgstr "Poloměr detekce uší límce" msgid "" -"The geometry will be decimated before dectecting sharp angles. This parameter indicates the minimum " -"length of the deviation for the decimation.\n" +"The geometry will be decimated before dectecting sharp angles. This " +"parameter indicates the minimum length of the deviation for the decimation.\n" "0 to deactivate" msgstr "" -"Geometrie bude zredukována před detekcí ostrých úhlů. Tento parametr udává minimální délku odchylky pro " -"redukci.\n" +"Geometrie bude zredukována před detekcí ostrých úhlů. Tento parametr udává " +"minimální délku odchylky pro redukci.\n" "0 pro deaktivaci" msgid "Compatible machine" @@ -7382,18 +7821,22 @@ msgid "Slow printing down for better layer cooling" msgstr "Zpomalte tisk pro lepší chlazení vrstvy" msgid "" -"Enable this option to slow printing speed down to make the final layer time not shorter than the layer " -"time threshold in \"Max fan speed threshold\", so that layer can be cooled for longer time. This can " -"improve the cooling quality for needle and small details" +"Enable this option to slow printing speed down to make the final layer time " +"not shorter than the layer time threshold in \"Max fan speed threshold\", so " +"that layer can be cooled for longer time. This can improve the cooling " +"quality for needle and small details" msgstr "" -"Povolením této možnosti zpomalíte rychlost tisku, aby se zkrátila doba poslední vrstvy ne kratší než " -"časová hranice vrstvy v \"Hranice max rychlosti ventilátoru\", takže vrstva může být chlazena po delší " -"dobu. To může zlepšit kvalitu chlazení jehly a malých detailů" +"Povolením této možnosti zpomalíte rychlost tisku, aby se zkrátila doba " +"poslední vrstvy ne kratší než časová hranice vrstvy v \"Hranice max " +"rychlosti ventilátoru\", takže vrstva může být chlazena po delší dobu. To " +"může zlepšit kvalitu chlazení jehly a malých detailů" msgid "Normal printing" msgstr "Normální tisk" -msgid "The default acceleration of both normal printing and travel except initial layer" +msgid "" +"The default acceleration of both normal printing and travel except initial " +"layer" msgstr "Výchozí zrychlení normálního tisku i pohybu kromě počáteční vrstvy" msgid "mm/s²" @@ -7420,7 +7863,9 @@ msgstr "" msgid "Fan speed" msgstr "Rychlost ventilátoru" -msgid "Speed of exhuast fan during printing.This speed will overwrite the speed in filament custom gcode" +msgid "" +"Speed of exhuast fan during printing.This speed will overwrite the speed in " +"filament custom gcode" msgstr "" msgid "Speed of exhuast fan after printing completes" @@ -7430,46 +7875,47 @@ msgid "No cooling for the first" msgstr "První bez chlazení" 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" +"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 "" -"Zavřete všechny chladicí ventilátory pro první určité vrstvy. Chladicí ventilátor první vrstvy býval " -"uzavřen, aby se dosáhlo lepší přilnavosti stavební desky" - -msgid "layers" -msgstr "vrstva(y)" +"Zavřete všechny chladicí ventilátory pro první určité vrstvy. Chladicí " +"ventilátor první vrstvy býval uzavřen, aby se dosáhlo lepší přilnavosti " +"stavební desky" msgid "Don't support bridges" msgstr "Nevytvářet podpěry pod mosty" 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" +"Don't support the whole bridge area which make support very large. Bridge " +"usually can be printing directly without support if not very long" msgstr "" -"Nepodpírejte celou oblast mostu, díky čemuž je podpěra velmi velká. Most obvykle může tisknout přímo bez " -"podpěry, pokud není příliš dlouhý" +"Nepodpírejte celou oblast mostu, díky čemuž je podpěra velmi velká. Most " +"obvykle může tisknout přímo bez podpěry, pokud není příliš dlouhý" msgid "Thick bridges" msgstr "Silné přemostění" msgid "" -"If enabled, bridges are more reliable, can bridge longer distances, but may look worse. If disabled, " -"bridges look better but are reliable just for shorter bridged distances." +"If enabled, bridges are more reliable, can bridge longer distances, but may " +"look worse. If disabled, bridges look better but are reliable just for " +"shorter bridged distances." msgstr "" -"Pokud je povoleno, jsou mosty spolehlivější, mohou překlenout delší vzdálenosti, ale mohou vypadat " -"hůře.\n" -"Pokud je zakázáno, mosty vypadají lépe, ale jsou spolehlivé jen pro kratší přemostění." +"Pokud je povoleno, jsou mosty spolehlivější, mohou překlenout delší " +"vzdálenosti, ale mohou vypadat hůře.\n" +"Pokud je zakázáno, mosty vypadají lépe, ale jsou spolehlivé jen pro kratší " +"přemostění." msgid "Max bridge length" msgstr "Maximální délka mostu" 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." +"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 "" -"Maximální délka mostů, které nepotřebují podpěru. Pokud chcete všechny, nastavte ji na 0 mosty, které " -"mají být podporovány, a pokud nechcete, nastavte ji na velmi vysokou hodnotu všechny mosty, které mají " -"být podepřeny." +"Maximální délka mostů, které nepotřebují podpěru. Pokud chcete všechny, " +"nastavte ji na 0 mosty, které mají být podporovány, a pokud nechcete, " +"nastavte ji na velmi vysokou hodnotu všechny mosty, které mají být podepřeny." msgid "End G-code" msgstr "Konec G-kódu" @@ -7484,10 +7930,11 @@ msgid "Ensure vertical shell thickness" msgstr "Zajistit tloušťku svislých stěn" msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid " -"layers)" +"Add solid infill near sloping surfaces to guarantee the vertical shell " +"thickness (top+bottom solid layers)" msgstr "" -"Přidá plnou výplň u šikmých ploch pro garanci tloušťky svislých stěn (vrchních a spodních plných vrstev)" +"Přidá plnou výplň u šikmých ploch pro garanci tloušťky svislých stěn " +"(vrchních a spodních plných vrstev)" msgid "Top surface pattern" msgstr "Vzor horního povrchu" @@ -7529,39 +7976,48 @@ msgid "Internal solid infill pattern" msgstr "Vzor vnitřní plné výplně" msgid "" -"Line pattern of internal solid infill. if the detect nattow internal solid infill be enabled, the " -"concentric pattern will be used for the small area." +"Line pattern of internal solid infill. if the detect nattow internal solid " +"infill be enabled, the concentric pattern will be used for the small area." msgstr "" -"Čárový vzor vnitřní plné výplně. Pokud je povolena detekce úzké vnitřní plné výplně, bude pro malou " -"plochu použit koncentrický vzor." +"Čárový vzor vnitřní plné výplně. Pokud je povolena detekce úzké vnitřní plné " +"výplně, bude pro malou plochu použit koncentrický vzor." -msgid "Line width of outer wall. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Šířka extruze vnější stěny. Pokud je vyjádřena jako %, vypočítá se vzhledem k průměru trysky." +msgid "" +"Line width of outer wall. If expressed as a %, it will be computed over the " +"nozzle diameter." +msgstr "" +"Šířka extruze vnější stěny. Pokud je vyjádřena jako %, vypočítá se vzhledem " +"k průměru trysky." msgid "" -"Speed of outer wall which is outermost and visible. It's used to be slower than inner wall speed to get " -"better quality." +"Speed of outer wall which is outermost and visible. It's used to be slower " +"than inner wall speed to get better quality." msgstr "" -"Rychlost vnější stěny, která je nejkrajnější a viditelná. Pro lepší kvalitu bývala nižší než rychlost " -"vnitřní stěny." +"Rychlost vnější stěny, která je nejkrajnější a viditelná. Pro lepší kvalitu " +"bývala nižší než rychlost vnitřní stěny." msgid "Small perimeters" msgstr "Malé perimetry" 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. Set to zero for auto." +"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. " +"Set to zero for auto." msgstr "" -"Toto samostatné nastavení ovlivní rychlost obvodů s poloměrem <= small_perimeter_threshold (obvykle " -"otvory). Je-li vyjádřeno v procentech (například: 80 %), bude vypočítáno podle výše uvedeného nastavení " -"rychlosti vnější stěny. Nastavte na nulu pro auto." +"Toto samostatné nastavení ovlivní rychlost obvodů s poloměrem <= " +"small_perimeter_threshold (obvykle otvory). Je-li vyjádřeno v procentech " +"(například: 80 %), bude vypočítáno podle výše uvedeného nastavení rychlosti " +"vnější stěny. Nastavte na nulu pro auto." msgid "Small perimeters threshold" msgstr "Hranice malého perimetru" -msgid "This sets the threshold for small perimeter length. Default threshold is 0mm" -msgstr "Toto nastavuje hraniční hodnotu pro malou délku obvodu. Výchozí hranice je 0 mm" +msgid "" +"This sets the threshold for small perimeter length. Default threshold is 0mm" +msgstr "" +"Toto nastavuje hraniční hodnotu pro malou délku obvodu. Výchozí hranice je 0 " +"mm" msgid "Order of inner wall/outer wall/infil" msgstr "Pořadí vnitřní stěny/vnější stěny/výplně" @@ -7587,17 +8043,29 @@ msgstr "vnitřní-vnější-vnitřní/výplň" msgid "Height to rod" msgstr "Výška k Ose X" -msgid "Distance of the nozzle tip to the lower rod. Used for collision avoidance in by-object printing." -msgstr "Vzdálenost hrotu trysky k Ose X (X Gantry). Používá se pro zamezení kolize v tisk podle objektu." +msgid "" +"Distance of the nozzle tip to the lower rod. Used for collision avoidance in " +"by-object printing." +msgstr "" +"Vzdálenost hrotu trysky k Ose X (X Gantry). Používá se pro zamezení kolize v " +"tisk podle objektu." msgid "Height to lid" msgstr "Výška po víko" -msgid "Distance of the nozzle tip to the lid. Used for collision avoidance in by-object printing." -msgstr "Vzdálenost hrotu trysky k víčku. Používá se pro zamezení kolizi při tisku vedlejších objektů." +msgid "" +"Distance of the nozzle tip to the lid. Used for collision avoidance in by-" +"object printing." +msgstr "" +"Vzdálenost hrotu trysky k víčku. Používá se pro zamezení kolizi při tisku " +"vedlejších objektů." -msgid "Clearance radius around extruder. Used for collision avoidance in by-object printing." -msgstr "Poloměr vůle kolem extruderu. Používá se pro zamezení kolizi při tisku vedlejších objektů." +msgid "" +"Clearance radius around extruder. Used for collision avoidance in by-object " +"printing." +msgstr "" +"Poloměr vůle kolem extruderu. Používá se pro zamezení kolizi při tisku " +"vedlejších objektů." msgid "Extruder Color" msgstr "Barva extruderu" @@ -7612,52 +8080,60 @@ msgid "Flow ratio" msgstr "Poměr průtoku" msgid "" -"The material may have volumetric change after switching between molten state and crystalline state. This " -"setting changes all extrusion flow of this filament in gcode proportionally. Recommended value range is " -"between 0.95 and 1.05. Maybe you can tune this value to get nice flat surface when there has slight " -"overflow or underflow" +"The material may have volumetric change after switching between molten state " +"and crystalline state. This setting changes all extrusion flow of this " +"filament in gcode proportionally. Recommended value range is between 0.95 " +"and 1.05. Maybe you can tune this value to get nice flat surface when there " +"has slight overflow or underflow" msgstr "" -"Materiál může mít objemovou změnu po přepnutí mezi roztaveným a krystalickým stavem. Toto nastavení " -"proporcionálně změní veškerý vytlačovací tok tohoto filamentu v gcode. Doporučený rozsah hodnot je mezi " -"0,95 a 1,05. Možná můžete tuto hodnotu vyladit, abyste získali pěkně rovný povrch, když dochází k " -"mírnému přetečení nebo podtečení" +"Materiál může mít objemovou změnu po přepnutí mezi roztaveným a krystalickým " +"stavem. Toto nastavení proporcionálně změní veškerý vytlačovací tok tohoto " +"filamentu v gcode. Doporučený rozsah hodnot je mezi 0,95 a 1,05. Možná " +"můžete tuto hodnotu vyladit, abyste získali pěkně rovný povrch, když dochází " +"k mírnému přetečení nebo podtečení" msgid "Enable pressure advance" msgstr "Povolit předstih tlaku" -msgid "Enable pressure advance, auto calibration result will be overwriten once enabled." -msgstr "Povolte předstih tlaku, po povolení bude výsledek automatické kalibrace přepsán." +msgid "" +"Enable pressure advance, auto calibration result will be overwriten once " +"enabled." +msgstr "" +"Povolte předstih tlaku, po povolení bude výsledek automatické kalibrace " +"přepsán." msgid "Pressure advance(Klipper) AKA Linear advance factor(Marlin)" msgstr "Předstih tlaku (Klipper) AKA Lineární faktor předstihu (Marlin)" msgid "" -"Default line width if other line widths are set to 0. If expressed as a %, it will be computed over the " -"nozzle diameter." +"Default line width if other line widths are set to 0. If expressed as a %, " +"it will be computed over the nozzle diameter." msgstr "" -"Výchozí šířka extruze, pokud jsou ostatní šířky extruze nastaveny na 0. Pokud je vyjádřeno jako %, bude " -"vypočteno na základě průměru trysky." +"Výchozí šířka extruze, pokud jsou ostatní šířky extruze nastaveny na 0. " +"Pokud je vyjádřeno jako %, bude vypočteno na základě průměru trysky." msgid "Keep fan always on" msgstr "Ventilátor vždy zapnutý" msgid "" -"If enable this setting, part cooling fan will never be stoped and will run at least at minimum speed to " -"reduce the frequency of starting and stoping" +"If enable this setting, part cooling fan will never be stoped and will run " +"at least at minimum speed to reduce the frequency of starting and stoping" msgstr "" -"Pokud povolíte toto nastavení, ventilátor chlazení součástí se nikdy nezastaví a poběží alespoň na " -"minimální rychlost, aby se snížila frekvence spouštění a zastavování" +"Pokud povolíte toto nastavení, ventilátor chlazení součástí se nikdy " +"nezastaví a poběží alespoň na minimální rychlost, aby se snížila frekvence " +"spouštění a zastavování" msgid "Layer time" msgstr "Čas vrstvy" 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" +"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 "" -"Ventilátor chlazení části bude povolen pro vrstvy, jejichž odhadovaná doba je kratší než tato hodnota. " -"Rychlost ventilátoru je interpolována mezi minimální a maximální rychlost ventilátoru podle doby tisku " -"vrstvy" +"Ventilátor chlazení části bude povolen pro vrstvy, jejichž odhadovaná doba " +"je kratší než tato hodnota. Rychlost ventilátoru je interpolována mezi " +"minimální a maximální rychlost ventilátoru podle doby tisku vrstvy" msgid "Default color" msgstr "Výchozí barva" @@ -7677,17 +8153,21 @@ msgstr "Zde můžete vložit poznámky týkající se filamentu." msgid "Required nozzle HRC" msgstr "Požadovaná tryska HRC" -msgid "Minimum HRC of nozzle required to print the filament. Zero means no checking of nozzle's HRC." -msgstr "Minimální HRC trysky potřebné k tisku filamentu. Nula znamená žádnou kontrolu HRC trysky." +msgid "" +"Minimum HRC of nozzle required to print the filament. Zero means no checking " +"of nozzle's HRC." +msgstr "" +"Minimální HRC trysky potřebné k tisku filamentu. Nula znamená žádnou " +"kontrolu HRC trysky." 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" +"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 "" -"Toto nastavení znamená, kolik objemu filamentu lze roztavit a extrudováno za sekundu. Rychlost tisku je " -"omezena maximální objemovou rychlostí, v případ příliš vysoké a nepřiměřené rychlosti nastavení. Nemůže " -"být nula" +"Toto nastavení znamená, kolik objemu filamentu lze roztavit a extrudováno za " +"sekundu. Rychlost tisku je omezena maximální objemovou rychlostí, v případ " +"příliš vysoké a nepřiměřené rychlosti nastavení. Nemůže být nula" msgid "mm³/s" msgstr "mm³/s" @@ -7696,30 +8176,39 @@ msgid "Filament load time" msgstr "Doba zavádění filamentu" msgid "Time to load new filament when switch filament. For statistics only" -msgstr "Čas na zavedení nového filamentu při výměně filamentu. Pouze pro statistiku" +msgstr "" +"Čas na zavedení nového filamentu při výměně filamentu. Pouze pro statistiku" msgid "Filament unload time" msgstr "Doba vysouvání filamentu" msgid "Time to unload old filament when switch filament. For statistics only" -msgstr "Čas vytažení starého filamentu při výměně filamentu. Pouze pro statistiku" +msgstr "" +"Čas vytažení starého filamentu při výměně filamentu. Pouze pro statistiku" -msgid "Filament diameter is used to calculate extrusion in gcode, so it's important and should be accurate" -msgstr "Průměr filamentu se používá k výpočtu vytlačování v gcode, takže je důležitý a měl by být přesný" +msgid "" +"Filament diameter is used to calculate extrusion in gcode, so it's important " +"and should be accurate" +msgstr "" +"Průměr filamentu se používá k výpočtu vytlačování v gcode, takže je důležitý " +"a měl by být přesný" msgid "Shrinkage" msgstr "Smrštění" #, fuzzy, c-format, boost-format msgid "" -"Enter the shrinkage percentage that the filament will get after cooling (94% if you measure 94mm instead " -"of 100mm). The part will be scaled in xy to compensate. Only the filament used for the perimeter is " -"taken into account.\n" -"Be sure to allow enough space between objects, as this compensation is done after the checks." +"Enter the shrinkage percentage that the filament will get after cooling " +"(94% if you measure 94mm instead of 100mm). The part will be scaled in xy to " +"compensate. Only the filament used for the perimeter is taken into account.\n" +"Be sure to allow enough space between objects, as this compensation is done " +"after the checks." msgstr "" -"Zadejte procento smrštění, které filament získá po ochlazení (94% pokud naměříte 94mm místo 100mm). " -"Část bude pro kompenzaci zmenšena v xy. Bere se v úvahu pouze filamentu použit pro obvod.\n" -"Ujistěte se aby byl mezi objekty dostatek prostoru, protože tato kompenzace se provádí po kontrolách." +"Zadejte procento smrštění, které filament získá po ochlazení (94% pokud " +"naměříte 94mm místo 100mm). Část bude pro kompenzaci zmenšena v xy. Bere se " +"v úvahu pouze filamentu použit pro obvod.\n" +"Ujistěte se aby byl mezi objekty dostatek prostoru, protože tato kompenzace " +"se provádí po kontrolách." msgid "Loading speed" msgstr "Rychlost zavádění" @@ -7737,35 +8226,42 @@ msgid "Unloading speed" msgstr "Rychlost vysunutí" msgid "" -"Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just " -"after ramming)." +"Speed used for unloading the filament on the wipe tower (does not affect " +"initial part of unloading just after ramming)." msgstr "" -"Rychlost vysouvání filamentu při výměně na čistící věži (úvodní část vysunutí okamžitě po rapidní " -"extruzi není ovlivněna)." +"Rychlost vysouvání filamentu při výměně na čistící věži (úvodní část " +"vysunutí okamžitě po rapidní extruzi není ovlivněna)." msgid "Unloading speed at the start" msgstr "Počáteční rychlost vysouvání filamentu" -msgid "Speed used for unloading the tip of the filament immediately after ramming." -msgstr "Rychlost použitá při vysouvání špičky filamentu bezprostředně po rapidní extruzi." +msgid "" +"Speed used for unloading the tip of the filament immediately after ramming." +msgstr "" +"Rychlost použitá při vysouvání špičky filamentu bezprostředně po rapidní " +"extruzi." msgid "Delay after unloading" msgstr "Zpoždění po vyjmutí" msgid "" -"Time to wait after the filament is unloaded. May help to get reliable toolchanges with flexible " -"materials that may need more time to shrink to original dimensions." +"Time to wait after the filament is unloaded. May help to get reliable " +"toolchanges with flexible materials that may need more time to shrink to " +"original dimensions." msgstr "" -"Doba čekání po vysunutí filamentu. Může pomoci ke spolehlivé změně extruderu s flexibilními materiály, " -"které potřebují více času ke smrštění na původní rozměry." +"Doba čekání po vysunutí filamentu. Může pomoci ke spolehlivé změně extruderu " +"s flexibilními materiály, které potřebují více času ke smrštění na původní " +"rozměry." msgid "Number of cooling moves" msgstr "Počet chladících pohybů" msgid "" -"Filament is cooled by being moved back and forth in the cooling tubes. Specify desired number of these " -"moves." -msgstr "Filament je chlazen pohyby tam a zpět v chladicí trubičce. Zadejte požadovaný počet těchto pohybů." +"Filament is cooled by being moved back and forth in the cooling tubes. " +"Specify desired number of these moves." +msgstr "" +"Filament je chlazen pohyby tam a zpět v chladicí trubičce. Zadejte " +"požadovaný počet těchto pohybů." msgid "Speed of the first cooling move" msgstr "Rychlost prvního pohybu chlazení" @@ -7777,14 +8273,16 @@ msgid "Minimal purge on wipe tower" msgstr "Minimální vytlačený objem na čistící věži" msgid "" -"After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, " -"and the filament pressure is likely not yet stable. Before purging the print head into an infill or a " -"sacrificial object, Slic3r will always prime this amount of material into the wipe tower to produce " -"successive infill or sacrificial object extrusions reliably." +"After a tool change, the exact position of the newly loaded filament inside " +"the nozzle may not be known, and the filament pressure is likely not yet " +"stable. Before purging the print head into an infill or a sacrificial " +"object, Slic3r will always prime this amount of material into the wipe tower " +"to produce successive infill or sacrificial object extrusions reliably." msgstr "" -"Po výměně nástroje nemusí být známa přesná poloha nově zavedeného filamentu uvnitř trysky a tlak " -"filamentu pravděpodobně ještě není stabilní. Před vyčištěním tiskové hlavy do výplně nebo do objektu " -"bude Slic3r toto množství materiálu vždy vytlačovat do čistící věže, aby se spolehlivě vytvořily " +"Po výměně nástroje nemusí být známa přesná poloha nově zavedeného filamentu " +"uvnitř trysky a tlak filamentu pravděpodobně ještě není stabilní. Před " +"vyčištěním tiskové hlavy do výplně nebo do objektu bude Slic3r toto množství " +"materiálu vždy vytlačovat do čistící věže, aby se spolehlivě vytvořily " "následné výplně nebo objekty." msgid "Speed of the last cooling move" @@ -7794,40 +8292,47 @@ msgid "Cooling moves are gradually accelerating towards this speed." msgstr "Chladící pohyby se postupně zrychlují až k této rychlosti." msgid "" -"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." +"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 "" -"Doba, po kterou firmware tiskárny (nebo jednotka Multi Material 2.0) zavádí nový filament během jeho " -"výměny (při provádění kódu T). Tento čas je přidán k celkové době tisku pomocí G-code odhadovače " -"tiskového času." +"Doba, po kterou firmware tiskárny (nebo jednotka Multi Material 2.0) zavádí " +"nový filament během jeho výměny (při provádění kódu T). Tento čas je přidán " +"k celkové době tisku pomocí G-code odhadovače tiskového času." msgid "Ramming parameters" msgstr "Parametry rapidní extruze" -msgid "This string is edited by RammingDialog and contains ramming specific parameters." +msgid "" +"This string is edited by RammingDialog and contains ramming specific " +"parameters." msgstr "" -"Tento řetězec je upravován dialogem RammingDialog a obsahuje specifické parametry pro rapidní extruzi." +"Tento řetězec je upravován dialogem RammingDialog a obsahuje specifické " +"parametry pro rapidní extruzi." msgid "" -"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." +"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 "" -"Doba, po kterou firmware tiskárny (nebo jednotka Multi Material 2.0) vysouvá filament během jeho výměny " -"(při provádění kódu T). Tento čas je přidán k celkové době tisku pomocí G-code odhadovače tiskového času." +"Doba, po kterou firmware tiskárny (nebo jednotka Multi Material 2.0) vysouvá " +"filament během jeho výměny (při provádění kódu T). Tento čas je přidán k " +"celkové době tisku pomocí G-code odhadovače tiskového času." msgid "Enable ramming for multitool setups" msgstr "Povolení rapidní extruze tiskárny s více nástroji" msgid "" -"Perform ramming when using multitool printer (i.e. when the 'Single Extruder Multimaterial' in Printer " -"Settings is unchecked). When checked, a small amount of filament is rapidly extruded on the wipe tower " -"just before the toolchange. This option is only used when the wipe tower is enabled." +"Perform ramming when using multitool printer (i.e. when the 'Single Extruder " +"Multimaterial' in Printer Settings is unchecked). When checked, a small " +"amount of filament is rapidly extruded on the wipe tower just before the " +"toolchange. This option is only used when the wipe tower is enabled." msgstr "" -"Provedení rapidní extruze při použití tiskárny s více nástroji (tj. když není v nastavení tiskárny " -"zaškrtnuto políčko Single Extruder Multimaterial). Pokud je tato možnost zaškrtnuta, je na čistící věži " -"těsně před výměnou nástroje rychle vytlačeno malé množství filamentu. Tato volba se uplatní pouze tehdy, " -"když je povolena čistící věž." +"Provedení rapidní extruze při použití tiskárny s více nástroji (tj. když " +"není v nastavení tiskárny zaškrtnuto políčko Single Extruder Multimaterial). " +"Pokud je tato možnost zaškrtnuta, je na čistící věži těsně před výměnou " +"nástroje rychle vytlačeno malé množství filamentu. Tato volba se uplatní " +"pouze tehdy, když je povolena čistící věž." msgid "Multitool ramming volume" msgstr "Objem rapidní extruze pro tiskárnu s více nástroji" @@ -7856,20 +8361,28 @@ msgstr "Typ materiálu filamentu" msgid "Soluble material" msgstr "Rozpustný materiál" -msgid "Soluble material is commonly used to print support and support interface" -msgstr "Rozpustný materiál se běžně používá k tisku podpěr a kontaktní vrstvy podpěr" +msgid "" +"Soluble material is commonly used to print support and support interface" +msgstr "" +"Rozpustný materiál se běžně používá k tisku podpěr a kontaktní vrstvy podpěr" msgid "Support material" msgstr "Podpěry" -msgid "Support material is commonly used to print support and support interface" -msgstr "Materiál podpěr se běžně používá k tisku podpěr a kontaktní vrstvy podpěr" +msgid "" +"Support material is commonly used to print support and support interface" +msgstr "" +"Materiál podpěr se běžně používá k tisku podpěr a kontaktní vrstvy podpěr" msgid "Temperature of vitrificaiton" msgstr "Teplota vitrifikace" -msgid "Material becomes soft at this temperature. Thus the heatbed cannot be hotter than this tempature" -msgstr "Materiál při této teplotě změkne. Vyhřívaná podložka tedy nemůže být teplejší než tato teplota" +msgid "" +"Material becomes soft at this temperature. Thus the heatbed cannot be hotter " +"than this tempature" +msgstr "" +"Materiál při této teplotě změkne. Vyhřívaná podložka tedy nemůže být " +"teplejší než tato teplota" msgid "Price" msgstr "Cena" @@ -7892,8 +8405,11 @@ msgstr "(Nedefinováno)" msgid "Infill direction" msgstr "Směr výplně" -msgid "Angle for sparse infill pattern, which controls the start or main direction of line" -msgstr "Úhel pro vzor vnitřní výplně, který řídí začátek nebo hlavní směr linky" +msgid "" +"Angle for sparse infill pattern, which controls the start or main direction " +"of line" +msgstr "" +"Úhel pro vzor vnitřní výplně, který řídí začátek nebo hlavní směr linky" msgid "Sparse infill density" msgstr "Hustota vnitřní výplně" @@ -7942,20 +8458,25 @@ msgid "Sparse infill anchor length" msgstr "Délka kotvy vnitřní výplně" msgid "" -"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If " -"expressed as percentage (example: 15%) it is calculated over infill extrusion width. Slic3r tries to " -"connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than " -"infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the " -"length of the perimeter segment taken is limited to this parameter, but no longer than " -"anchor_length_max. \n" -"Set this parameter to zero to disable anchoring perimeters connected to a single infill line." -msgstr "" -"Připojení výplně k vnitřnímu perimetru krátkým segmentem dalšího perimetru. Pokud je vyjádřeno v " -"procentech (příklad: 15%), vypočítává se z šířky extruze výplně. PrusaSlicer se pokouší spojit dvě " -"blízké výplňová čáry krátkým obvodovým perimetrem. Pokud není nalezen žádný takový obvodový perimetr " -"kratší než infill_anchor_max, je výplňová čára spojena s obvodovým perimetrem pouze na jedné straně a " -"délka odebraného obvodového perimetru je omezena na tento parametr, ale ne dále než anchor_length_max. \n" -"Nastavením tohoto parametru na nulu deaktivujete kotvící perimetry připojené k jedné výplňové čáře." +"Connect an infill line to an internal perimeter with a short segment of an " +"additional perimeter. If expressed as percentage (example: 15%) it is " +"calculated over infill extrusion width. Slic3r tries to connect two close " +"infill lines to a short perimeter segment. If no such perimeter segment " +"shorter than infill_anchor_max is found, the infill line is connected to a " +"perimeter segment at just one side and the length of the perimeter segment " +"taken is limited to this parameter, but no longer than anchor_length_max. \n" +"Set this parameter to zero to disable anchoring perimeters connected to a " +"single infill line." +msgstr "" +"Připojení výplně k vnitřnímu perimetru krátkým segmentem dalšího perimetru. " +"Pokud je vyjádřeno v procentech (příklad: 15%), vypočítává se z šířky " +"extruze výplně. PrusaSlicer se pokouší spojit dvě blízké výplňová čáry " +"krátkým obvodovým perimetrem. Pokud není nalezen žádný takový obvodový " +"perimetr kratší než infill_anchor_max, je výplňová čára spojena s obvodovým " +"perimetrem pouze na jedné straně a délka odebraného obvodového perimetru je " +"omezena na tento parametr, ale ne dále než anchor_length_max. \n" +"Nastavením tohoto parametru na nulu deaktivujete kotvící perimetry připojené " +"k jedné výplňové čáře." msgid "0 (no open anchors)" msgstr "0 (žádné otevřené kotvy)" @@ -7967,21 +8488,25 @@ msgid "Maximum length of the infill anchor" msgstr "Maximální délka výplňové kotvy" msgid "" -"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If " -"expressed as percentage (example: 15%) it is calculated over infill extrusion width. Slic3r 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 to a perimeter segment at just one side and the " -"length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter. \n" -"If set to 0, the old algorithm for infill connection will be used, it should create the same result as " -"with 1000 & 0." -msgstr "" -"Připojení výplně k vnitřnímu perimetru krátkým segmentem dalšího perimetru. Pokud je vyjádřeno v " -"procentech (příklad: 15%), vypočítává se z šířky extruze výplně. OrcaSlicer se pokouší spojit dvě blízké " -"výplňová linky krátkým obvodovým perimetrem. Pokud není nalezen žádný takový obvodový perimetr kratší " -"než tento parametr, je výplňová čára spojena s obvodovým perimetrem pouze na jedné straně a délka " -"odebraného obvodového perimetru je omezena na infill_anchor, ale ne delší než tento parametr. \n" -" Pokud je nastaveno na 0, použije se starý algoritmus pro výplň připojení, měl by vytvořit stejný " -"výsledek jako s 1000 & 0." +"Connect an infill line to an internal perimeter with a short segment of an " +"additional perimeter. If expressed as percentage (example: 15%) it is " +"calculated over infill extrusion width. Slic3r 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 to a " +"perimeter segment at just one side and the length of the perimeter segment " +"taken is limited to infill_anchor, but no longer than this parameter. \n" +"If set to 0, the old algorithm for infill connection will be used, it should " +"create the same result as with 1000 & 0." +msgstr "" +"Připojení výplně k vnitřnímu perimetru krátkým segmentem dalšího perimetru. " +"Pokud je vyjádřeno v procentech (příklad: 15%), vypočítává se z šířky " +"extruze výplně. OrcaSlicer se pokouší spojit dvě blízké výplňová linky " +"krátkým obvodovým perimetrem. Pokud není nalezen žádný takový obvodový " +"perimetr kratší než tento parametr, je výplňová čára spojena s obvodovým " +"perimetrem pouze na jedné straně a délka odebraného obvodového perimetru je " +"omezena na infill_anchor, ale ne delší než tento parametr. \n" +" Pokud je nastaveno na 0, použije se starý algoritmus pro výplň připojení, " +"měl by vytvořit stejný výsledek jako s 1000 & 0." msgid "0 (Simple connect)" msgstr "0 (Jednoduché spojení)" @@ -7995,38 +8520,47 @@ msgstr "Zrychlení vnitřních stěn" msgid "Acceleration of travel moves" msgstr "Zrychlení cestovních pohybů" -msgid "Acceleration of top surface infill. Using a lower value may improve top surface quality" -msgstr "Zrychlení výplně horního povrchu. Použití nižší hodnoty může zlepšit kvalitu povrchu" +msgid "" +"Acceleration of top surface infill. Using a lower value may improve top " +"surface quality" +msgstr "" +"Zrychlení výplně horního povrchu. Použití nižší hodnoty může zlepšit kvalitu " +"povrchu" msgid "Acceleration of outer wall. Using a lower value can improve quality" msgstr "Zrychlení vnější stěny. Použití nižší hodnoty může zlepšit kvalitu" 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." +"Acceleration of bridges. If the value is expressed as a percentage (e.g. " +"50%), it will be calculated based on the outer wall acceleration." msgstr "" -"Zrychlení mostů. Pokud je hodnota vyjádřena v procentech (např. 50%), bude vypočítána na základě " -"zrychlení vnější stěny." +"Zrychlení mostů. Pokud je hodnota vyjádřena v procentech (např. 50%), bude " +"vypočítána na základě zrychlení vnější stěny." msgid "mm/s² or %" msgstr "mm/s² or %" msgid "" -"Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be " -"calculated based on the default acceleration." +"Acceleration of sparse infill. If the value is expressed as a percentage (e." +"g. 100%), it will be calculated based on the default acceleration." msgstr "" -"Zrychlení vnitřní výplně. Pokud je hodnota vyjádřena v procentech (např. 100 %), bude vypočítána na " -"základě výchozího zrychlení." +"Zrychlení vnitřní výplně. Pokud je hodnota vyjádřena v procentech (např. 100 " +"%), bude vypočítána na základě výchozího zrychlení." msgid "" -"Acceleration of internal solid infill. If the value is expressed as a percentage (e.g. 100%), it will be " -"calculated based on the default acceleration." +"Acceleration of internal solid infill. If the value is expressed as a " +"percentage (e.g. 100%), it will be calculated based on the default " +"acceleration." msgstr "" -"Zrychlení vnitřní pevné výplně. Pokud je hodnota vyjádřena v procentech (např. 100 %), bude vypočítána " -"na základě výchozího zrychlení." +"Zrychlení vnitřní pevné výplně. Pokud je hodnota vyjádřena v procentech " +"(např. 100 %), bude vypočítána na základě výchozího zrychlení." -msgid "Acceleration of initial layer. Using a lower value can improve build plate adhensive" -msgstr "Zrychlení počáteční vrstvy. Použití nižší hodnoty může zlepšit lepidlo na vytvoření desky" +msgid "" +"Acceleration of initial layer. Using a lower value can improve build plate " +"adhensive" +msgstr "" +"Zrychlení počáteční vrstvy. Použití nižší hodnoty může zlepšit lepidlo na " +"vytvoření desky" msgid "Enable accel_to_decel" msgstr "Povolit accel_to_decel" @@ -8038,7 +8572,8 @@ msgid "accel_to_decel" msgstr "accel_to_decel" #, c-format, boost-format -msgid "Klipper's max_accel_to_decel will be adjusted to this %% of acceleration" +msgid "" +"Klipper's max_accel_to_decel will be adjusted to this %% of acceleration" msgstr "Klipper max_accel_to_decel bude upraven na toto %% o zrychlení" #, c-format, boost-format @@ -8063,16 +8598,22 @@ msgstr "Jerk-Ryv pro první vrstvu" msgid "Jerk for travel" msgstr "Jerk-Ryv pro cestování" -msgid "Line width of initial layer. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Šířka extruze pro první vrstvu. Pokud je vyjádřena jako %, vypočítá se vzhledem k průměru trysky." +msgid "" +"Line width of initial layer. If expressed as a %, it will be computed over " +"the nozzle diameter." +msgstr "" +"Šířka extruze pro první vrstvu. Pokud je vyjádřena jako %, vypočítá se " +"vzhledem k průměru trysky." msgid "Initial layer height" msgstr "Výška první vrstvy" msgid "" -"Height of initial layer. Making initial layer height to be thick slightly can improve build plate " -"adhension" -msgstr "Výška první vrstvy. Mírně tlustá první vrstva může zlepšit přilnavost k podložce" +"Height of initial layer. Making initial layer height to be thick slightly " +"can improve build plate adhension" +msgstr "" +"Výška první vrstvy. Mírně tlustá první vrstva může zlepšit přilnavost k " +"podložce" msgid "Speed of initial layer except the solid infill part" msgstr "Rychlost první vrstvy kromě plné výplně" @@ -8093,11 +8634,11 @@ msgid "Number of slow layers" msgstr "Počet pomalých vrstev" msgid "" -"The first few layers are printed slower than normal. The speed is gradually increased in a linear " -"fashion over the specified number of layers." +"The first few layers are printed slower than normal. The speed is gradually " +"increased in a linear fashion over the specified number of layers." msgstr "" -"První několik vrstev se tiskne pomaleji než obvykle. Rychlost se postupně zvyšuje lineárně během " -"určeného počtu vrstev." +"První několik vrstev se tiskne pomaleji než obvykle. Rychlost se postupně " +"zvyšuje lineárně během určeného počtu vrstev." msgid "Initial layer nozzle temperature" msgstr "Teplota trysky první vrstvy" @@ -8109,35 +8650,38 @@ msgid "Full fan speed at layer" msgstr "Maximální otáčky ventilátoru ve vrstvě" msgid "" -"Fan speed will be ramped up linearly from zero at layer \"close_fan_the_first_x_layers\" to maximum at " -"layer \"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower 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." +"Fan speed will be ramped up linearly from zero at layer " +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower 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 "" -"Otáčky ventilátoru se lineárně zvýší z nuly ve vrstvě \"close_fan_first_layers\" na maximum ve vrstvě " -"\"full_fan_speed_layer\". Hodnota \"full_fan_speed_layer\" bude ignorována, pokud je nižší než " -"\"close_fan_first_layers\", v takovém případě se bude ventilátor točit na maximální povolenou hodnotu ve " -"vrstvě \"close_fan_first_layers\" + 1." +"Otáčky ventilátoru se lineárně zvýší z nuly ve vrstvě " +"\"close_fan_first_layers\" na maximum ve vrstvě \"full_fan_speed_layer\". " +"Hodnota \"full_fan_speed_layer\" bude ignorována, pokud je nižší než " +"\"close_fan_first_layers\", v takovém případě se bude ventilátor točit na " +"maximální povolenou hodnotu ve vrstvě \"close_fan_first_layers\" + 1." msgid "Support interface fan speed" msgstr "Rychlost ventilátoru kontaktních vrstev podpěr" msgid "" -"This fan speed is enforced during all support interfaces, to be able to weaken their bonding with a high " -"fan speed.\n" +"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 overriden by disable_fan_first_layers." msgstr "" -"Tato rychlost ventilátoru je uplatněna během všech kontaktních vrstev, aby bylo možné oslabit jejich " -"spojení vysokou rychlostí ventilátoru.\n" +"Tato rychlost ventilátoru je uplatněna během všech kontaktních vrstev, aby " +"bylo možné oslabit jejich spojení vysokou rychlostí ventilátoru.\n" "Nastavte hodnotu -1 pro zrušení tohoto přepisu.\n" "Tuto hodnotu lze přepsat pouze pomocí disable_fan_first_layers." msgid "" -"Randomly jitter while printing the wall, so that the surface has a rough look. This setting controls the " -"fuzzy position" +"Randomly jitter while printing the wall, so that the surface has a rough " +"look. This setting controls the fuzzy position" msgstr "" -"Náhodné chvění při tisku na stěnu, takže povrch má hrubý vzhled. Toto nastavení řídí neostrou polohu" +"Náhodné chvění při tisku na stěnu, takže povrch má hrubý vzhled. Toto " +"nastavení řídí neostrou polohu" msgid "None" msgstr "Žádné" @@ -8154,14 +8698,21 @@ msgstr "Všechny stěny" msgid "Fuzzy skin thickness" msgstr "Tloušťka členitého povrchu" -msgid "The width within which to jitter. It's adversed to be below outer wall line width" -msgstr "Šířka, ve které se má chvět. Je nepřípustné, aby byla pod šířkou extruze vnější stěny" +msgid "" +"The width within which to jitter. It's adversed to be below outer wall line " +"width" +msgstr "" +"Šířka, ve které se má chvět. Je nepřípustné, aby byla pod šířkou extruze " +"vnější stěny" msgid "Fuzzy skin point distance" msgstr "Vzdálenosti bodů členitého povrchu" -msgid "The average diatance between the random points introducded on each line segment" -msgstr "Průměrná vzdálenost mezi náhodnými body zavedenými na každém segmentu linky" +msgid "" +"The average diatance between the random points introducded on each line " +"segment" +msgstr "" +"Průměrná vzdálenost mezi náhodnými body zavedenými na každém segmentu linky" msgid "Filter out tiny gaps" msgstr "Odfiltrujte drobné mezery" @@ -8169,44 +8720,57 @@ msgstr "Odfiltrujte drobné mezery" msgid "Layers and Perimeters" msgstr "Vrstvy a perimetry" -msgid "Filter out gaps smaller than the threshold specified. This setting won't affect top/bottom layers" +msgid "" +"Filter out gaps smaller than the threshold specified. This setting won't " +"affect top/bottom layers" msgstr "" -"Vyfiltrované mezery menší než stanovený práh. Toto nastavení neovlivní vrstvy horního/spodního povrchu" +"Vyfiltrované mezery menší než stanovený práh. Toto nastavení neovlivní " +"vrstvy horního/spodního povrchu" -msgid "Speed of gap infill. Gap usually has irregular line width and should be printed more slowly" +msgid "" +"Speed of gap infill. Gap usually has irregular line width and should be " +"printed more slowly" msgstr "" -"Rychlost vyplňování mezery. Mezera má obvykle nepravidelnou šířku extruze a měla by být vytištěna " -"pomaleji" +"Rychlost vyplňování mezery. Mezera má obvykle nepravidelnou šířku extruze a " +"měla by být vytištěna pomaleji" msgid "Arc fitting" msgstr "Přizpůsobení oblouku" msgid "" -"Enable this to get a G-code file which has G2 and G3 moves. And the fitting tolerance is same with " -"resolution" +"Enable this to get a G-code file which has G2 and G3 moves. And the fitting " +"tolerance is same with resolution" msgstr "" -"Povolte toto, abyste získali soubor G-kódu, který má pohyby G2 a G3. A tolerance montáže je stejná s " -"rozlišením" +"Povolte toto, abyste získali soubor G-kódu, který má pohyby G2 a G3. A " +"tolerance montáže je stejná s rozlišením" msgid "Add line number" msgstr "Přidat číslo řádku" msgid "Enable this to add line number(Nx) at the beginning of each G-Code line" -msgstr "Povolte toto, chcete-li přidat číslo řádku (Nx) na začátek každého řádku G-kódu" +msgstr "" +"Povolte toto, chcete-li přidat číslo řádku (Nx) na začátek každého řádku G-" +"kódu" msgid "Scan first layer" msgstr "Skenovat první vrstvu" -msgid "Enable this to enable the camera on printer to check the quality of first layer" -msgstr "Povolením této možnosti umožníte Kameře na tiskárně kontrolovat kvalitu první vrstvy" +msgid "" +"Enable this to enable the camera on printer to check the quality of first " +"layer" +msgstr "" +"Povolením této možnosti umožníte Kameře na tiskárně kontrolovat kvalitu " +"první vrstvy" msgid "Nozzle type" msgstr "Typ trysky" msgid "" -"The metallic material of nozzle. This determines the abrasive resistance of nozzle, and what kind of " -"filament can be printed" -msgstr "Kovový materiál trysky. To určuje odolnost trysky proti otěru a jaký druh filamentu lze tisknout" +"The metallic material of nozzle. This determines the abrasive resistance of " +"nozzle, and what kind of filament can be printed" +msgstr "" +"Kovový materiál trysky. To určuje odolnost trysky proti otěru a jaký druh " +"filamentu lze tisknout" msgid "Undefine" msgstr "Nedefinováno" @@ -8223,8 +8787,11 @@ msgstr "Mosaz" msgid "Nozzle HRC" msgstr "Tryska HRC" -msgid "The nozzle's hardness. Zero means no checking for nozzle's hardness during slicing." -msgstr "Tvrdost trysky. Nula znamená žádnou kontrolu tvrdosti trysky během slicování." +msgid "" +"The nozzle's hardness. Zero means no checking for nozzle's hardness during " +"slicing." +msgstr "" +"Tvrdost trysky. Nula znamená žádnou kontrolu tvrdosti trysky během slicování." msgid "HRC" msgstr "HRC" @@ -8251,25 +8818,32 @@ msgid "Best object position" msgstr "Nejlepší pozice objektu" msgid "Best auto arranging position in range [0,1] w.r.t. bed shape." -msgstr "Nejlepší automatická uspořádávací pozice v rozsahu [0,1] vzhledem k tvaru podložky." +msgstr "" +"Nejlepší automatická uspořádávací pozice v rozsahu [0,1] vzhledem k tvaru " +"podložky." msgid "Enable this option if machine has auxiliary part cooling fan" msgstr "Povolte tuto možnost, pokud má stroj pomocný chladicí ventilátor" msgid "" -"Start the fan this number of seconds earlier than its target start time (you can use fractional " -"seconds). It assumes infinite acceleration for this time estimation, and will only take into account G1 " -"and G0 moves (arc fitting is unsupported).\n" -"It won't move fan comands from custom gcodes (they act as a sort of 'barrier').\n" -"It won't move fan comands into the start gcode if the 'only custom start gcode' is activated.\n" +"Start the fan this number of seconds earlier than its target start time (you " +"can use fractional seconds). It assumes infinite acceleration for this time " +"estimation, and will only take into account G1 and G0 moves (arc fitting is " +"unsupported).\n" +"It won't move fan comands from custom gcodes (they act as a sort of " +"'barrier').\n" +"It won't move fan comands into the start gcode if the 'only custom start " +"gcode' is activated.\n" "Use 0 to deactivate." msgstr "" -"Spustit ventilátor po tuto dobu v sekundách před cílovým časem spuštění (můžete použít desetinná čísla). " -"Předpokládá se nekonečné zrychlení pro odhad této doby a budou brány v úvahu pouze pohyby G1 a G0 " -"(křivkové tvary nejsou podporovány).\n" -"Nepřesouvá příkazy ventilátoru z vlastních G-kódů (působí jako druh 'bariéry').\n" -"Nepřesouvá příkazy ventilátoru do startovacího G-kódu, pokud je aktivována volba 'pouze vlastní " -"startovací G-kódy'.\n" +"Spustit ventilátor po tuto dobu v sekundách před cílovým časem spuštění " +"(můžete použít desetinná čísla). Předpokládá se nekonečné zrychlení pro " +"odhad této doby a budou brány v úvahu pouze pohyby G1 a G0 (křivkové tvary " +"nejsou podporovány).\n" +"Nepřesouvá příkazy ventilátoru z vlastních G-kódů (působí jako druh " +"'bariéry').\n" +"Nepřesouvá příkazy ventilátoru do startovacího G-kódu, pokud je aktivována " +"volba 'pouze vlastní startovací G-kódy'.\n" "Pro deaktivaci použijte hodnotu 0." msgid "Only overhangs" @@ -8282,16 +8856,17 @@ msgid "Fan kick-start time" msgstr "Čas spuštění ventilátoru" msgid "" -"Emit a max fan speed command for this amount of seconds before reducing to target speed to kick-start " -"the cooling fan.\n" -"This is useful for fans where a low PWM/power may be insufficient to get the fan started spinning from a " -"stop, or to get the fan up to speed faster.\n" +"Emit a max fan speed command for this amount of seconds before reducing to " +"target speed to kick-start the cooling fan.\n" +"This is useful for fans where a low PWM/power may be insufficient to get the " +"fan started spinning from a stop, or to get the fan up to speed faster.\n" "Set to 0 to deactivate." msgstr "" -"Před snížením na cílovou rychlost vyšlete po tuto dobu příkaz maximální rychlosti ventilátoru, aby se " -"nastartoval chladicí ventilátor.\n" -"To je užitečné pro ventilátory, kde nízké PWM/výkon nemusí stačit k tomu, aby se ventilátor začal točit " -"od zastavení nebo aby se ventilátor rozběhl rychleji.\n" +"Před snížením na cílovou rychlost vyšlete po tuto dobu příkaz maximální " +"rychlosti ventilátoru, aby se nastartoval chladicí ventilátor.\n" +"To je užitečné pro ventilátory, kde nízké PWM/výkon nemusí stačit k tomu, " +"aby se ventilátor začal točit od zastavení nebo aby se ventilátor rozběhl " +"rychleji.\n" "Pro deaktivaci nastavte na 0." msgid "Time cost" @@ -8306,7 +8881,8 @@ msgstr "peníze/h" msgid "Support control chamber temperature" msgstr "Podpora řízení teploty komory" -msgid "This option is enabled if machine support controlling chamber temperature" +msgid "" +"This option is enabled if machine support controlling chamber temperature" msgstr "Tato možnost je povolena, pokud stroj podporuje řízení teploty komory" msgid "Support air filtration" @@ -8328,13 +8904,15 @@ msgid "Label objects" msgstr "Označování objektů" 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 plugin. This settings is NOT compatible with Single Extruder " -"Multi Material setup and Wipe into Object / Wipe into Infill." +"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 " +"plugin. This settings is NOT compatible with Single Extruder Multi Material " +"setup and Wipe into Object / Wipe into Infill." msgstr "" -"Zapněte tuto možnost, chcete-li do G-kódu přidávat komentáře, které budou určovat, příslušnost tiskových " -"pohybů k jednotlivým objektům. To je užitečné pro Octoprint plugin CancelObject. Nastavení NENÍ " -"kompatibilní se Single Extruder Multi Material konfigurací a s čištěním trysky do objektu / výplně." +"Zapněte tuto možnost, chcete-li do G-kódu přidávat komentáře, které budou " +"určovat, příslušnost tiskových pohybů k jednotlivým objektům. To je užitečné " +"pro Octoprint plugin CancelObject. Nastavení NENÍ kompatibilní se Single " +"Extruder Multi Material konfigurací a s čištěním trysky do objektu / výplně." msgid "Exclude objects" msgstr "Vynechat objekty" @@ -8346,39 +8924,43 @@ msgid "Verbose G-code" msgstr "Komentáře do G-kódu" msgid "" -"Enable this to get a commented G-code file, with each line explained by a descriptive text. If you print " -"from SD card, the additional weight of the file could make your firmware slow down." +"Enable this to get a commented G-code file, with each line explained by a " +"descriptive text. If you print from SD card, the additional weight of the " +"file could make your firmware slow down." msgstr "" -"Aktivací získáte komentovaný soubor G-kódu, přičemž každý řádek je doplněn popisným textem. Pokud " -"tisknete z SD karty, dodatečné informace v souboru můžou zpomalit firmware." +"Aktivací získáte komentovaný soubor G-kódu, přičemž každý řádek je doplněn " +"popisným textem. Pokud tisknete z SD karty, dodatečné informace v souboru " +"můžou zpomalit firmware." msgid "Infill combination" msgstr "Kombinace výplně" msgid "" -"Automatically Combine sparse infill of several layers to print together to reduce time. Wall is still " -"printed with original layer height." +"Automatically Combine sparse infill of several layers to print together to " +"reduce time. Wall is still printed with original layer height." msgstr "" -"Automaticky zkombinujte vnitřní výplň několika vrstev pro tisk dohromady, abyste zkrátili čas. Stěna se " -"stále tiskne s původní výškou vrstvy." +"Automaticky zkombinujte vnitřní výplň několika vrstev pro tisk dohromady, " +"abyste zkrátili čas. Stěna se stále tiskne s původní výškou vrstvy." msgid "Filament to print internal sparse infill." msgstr "Filament pro tisk vnitřní výplně." msgid "" -"Line width of internal sparse infill. If expressed as a %, it will be computed over the nozzle diameter." +"Line width of internal sparse infill. If expressed as a %, it will be " +"computed over the nozzle diameter." msgstr "" -"Šířka extruze pro vnitřní výplně. Pokud je vyjádřena jako %, vypočítá se vzhledem k průměru trysky." +"Šířka extruze pro vnitřní výplně. Pokud je vyjádřena jako %, vypočítá se " +"vzhledem k průměru trysky." msgid "Infill/Wall overlap" msgstr "Výplň/Přesah stěny" msgid "" -"Infill area is enlarged slightly to overlap with wall for better bonding. The percentage value is " -"relative to line width of sparse infill" +"Infill area is enlarged slightly to overlap with wall for better bonding. " +"The percentage value is relative to line width of sparse infill" msgstr "" -"Oblast výplně je mírně zvětšena, aby se překrývala se stěnou pro lepší lepení. Procentuální hodnota je " -"vztažena k šířce extruze vnitřní výplně" +"Oblast výplně je mírně zvětšena, aby se překrývala se stěnou pro lepší " +"lepení. Procentuální hodnota je vztažena k šířce extruze vnitřní výplně" msgid "Speed of internal sparse infill" msgstr "Rychlost vnitřní výplně" @@ -8387,21 +8969,23 @@ msgid "Interface shells" msgstr "Mezilehlé stěny" msgid "" -"Force the generation of solid shells between adjacent materials/volumes. Useful for multi-extruder " -"prints with translucent materials or manual soluble support material" +"Force the generation of solid shells between adjacent materials/volumes. " +"Useful for multi-extruder prints with translucent materials or manual " +"soluble support material" msgstr "" -"Vynucení vytváření pevných skořepin mezi sousedními materiály/objemy. Užitečné pro tisk s více extrudery " -"s průsvitnými materiály nebo ručně rozpustným podpůrným materiálem" +"Vynucení vytváření pevných skořepin mezi sousedními materiály/objemy. " +"Užitečné pro tisk s více extrudery s průsvitnými materiály nebo ručně " +"rozpustným podpůrným materiálem" msgid "Ironing Type" msgstr "Způsob žehlení" 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" +"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 "" -"Žehlení využívá malý průtok k tisku na stejnou výšku povrchu, aby byl rovný povrch hladší. Toto " -"nastavení určuje, která vrstva se bude žehlit" +"Žehlení využívá malý průtok k tisku na stejnou výšku povrchu, aby byl rovný " +"povrch hladší. Toto nastavení určuje, která vrstva se bude žehlit" msgid "No ironing" msgstr "Nežehlit" @@ -8418,15 +9002,19 @@ msgstr "Všechny pevné vrstvy" msgid "Ironing Pattern" msgstr "Vzor Žehlení" +msgid "The pattern that will be used when ironing" +msgstr "" + msgid "Ironing flow" msgstr "Průtok žehlení" msgid "" -"The amount of material to extrude during ironing. Relative to flow of normal layer height. Too high " -"value results in overextrusion on the surface" +"The amount of material to extrude during ironing. Relative to flow of normal " +"layer height. Too high value results in overextrusion on the surface" msgstr "" -"Množství materiálu, které se má vytlačit během žehlení. V poměru k průtoku normální výšky vrstvy. Příliš " -"vysoká hodnota vede k nadměrnému vytlačování na povrchu" +"Množství materiálu, které se má vytlačit během žehlení. V poměru k průtoku " +"normální výšky vrstvy. Příliš vysoká hodnota vede k nadměrnému vytlačování " +"na povrchu" msgid "Ironing line spacing" msgstr "Řádkování žehlení" @@ -8440,20 +9028,33 @@ msgstr "Rychlost žehlení" msgid "Print speed of ironing lines" msgstr "Rychlost tisku žehlících linek" +msgid "Ironing angle" +msgstr "" + +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" + msgid "This gcode part is inserted at every layer change after lift z" msgstr "Tato část gcode je vložena při každé změně vrstvy po zvednutí z" msgid "Supports silent mode" msgstr "Podporuje tichý režim" -msgid "Whether the machine supports silent mode in which machine use lower acceleration to print" -msgstr "Zda stroj podporuje tichý režim, ve kterém stroj používá k tisku nižší zrychlení" +msgid "" +"Whether the machine supports silent mode in which machine use lower " +"acceleration to print" +msgstr "" +"Zda stroj podporuje tichý režim, ve kterém stroj používá k tisku nižší " +"zrychlení" msgid "" -"This G-code will be used as a code for the pause print. User can insert pause G-code in gcode viewer" +"This G-code will be used as a code for the pause print. User can insert " +"pause G-code in gcode viewer" msgstr "" -"Tento G-kód bude použit jako kód pro pozastavený tisk. Uživatel může vložit pauzu G-kód do prohlížeče " -"gcode" +"Tento G-kód bude použit jako kód pro pozastavený tisk. Uživatel může vložit " +"pauzu G-kód do prohlížeče gcode" msgid "This G-code will be used as a custom code" msgstr "Tento G-kód bude použit jako vlastní kód" @@ -8564,67 +9165,76 @@ msgid "Maximum acceleration for travel (M204 T), it only applies to Marlin 2" msgstr "Maximální zrychlení pro cestování (M204 T), platí pouze pro Marlin 2" msgid "" -"Part cooling fan speed may be increased when auto cooling is enabled. This is the maximum speed " -"limitation of part cooling fan" +"Part cooling fan speed may be increased when auto cooling is enabled. This " +"is the maximum speed limitation of part cooling fan" msgstr "" -"Rychlost ventilátoru chlazení součásti může být zvýšena, když je povoleno automatické chlazení. Toto je " -"omezení maximální rychlosti ventilátoru chlazení součásti" +"Rychlost ventilátoru chlazení součásti může být zvýšena, když je povoleno " +"automatické chlazení. Toto je omezení maximální rychlosti ventilátoru " +"chlazení součásti" msgid "Max" msgstr "Max" msgid "" -"The largest printable layer height for extruder. Used tp limits the maximum layer hight when enable " -"adaptive layer height" +"The largest printable layer height for extruder. Used tp limits the maximum " +"layer hight when enable adaptive layer height" msgstr "" -"Největší výška tisknutelné vrstvy pro extruder. Používá se k omezení maximální výšky vrstvy při povolení " -"adaptivní výšky vrstvy" +"Největší výška tisknutelné vrstvy pro extruder. Používá se k omezení " +"maximální výšky vrstvy při povolení adaptivní výšky vrstvy" msgid "Extrusion rate smoothing" msgstr "Zjemňování extruze" msgid "" -"This parameter smooths out sudden extrusion rate changes that happen when the printer transitions from " -"printing a high flow (high speed/larger width) extrusion to a lower flow (lower speed/smaller width) " -"extrusion and vice versa.\n" +"This parameter smooths out sudden extrusion rate changes that happen when " +"the printer transitions from printing a high flow (high speed/larger width) " +"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " +"versa.\n" "\n" -"It defines the maximum rate by which the extruded volumetric flow in mm3/sec can change over time. " -"Higher values mean higher extrusion rate changes are allowed, resulting in faster speed transitions.\n" +"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " +"can change over time. Higher values mean higher extrusion rate changes are " +"allowed, resulting in faster speed transitions.\n" "\n" "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 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 just enough smoothing to assist pressure advance achieve " -"a smoother flow transition.\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 " +"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 " +"just enough smoothing to assist pressure advance achieve a smoother flow " +"transition.\n" "\n" -"For slower printers without pressure advance, the value should be set much lower. A value of 10-15mm3/s2 " -"is a good starting point for direct drive extruders and 5-10mm3/s2 for Bowden style. \n" +"For slower printers without pressure advance, the value should be set much " +"lower. A value of 10-15mm3/s2 is a good starting point for direct drive " +"extruders and 5-10mm3/s2 for Bowden style. \n" "\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n" "\n" "Note: this parameter disables arc fitting." msgstr "" -"Tento parametr zjemňuje náhlé změny extruzního toku, ke kterým dochází při přechodu tiskárny z tisku s " -"vysokým průtokem (vysokou rychlostí/větší šířkou) extruze na tisk s nižším průtokem (nižší rychlostí/" -"menší šířkou) extruze a obráceně.\n" +"Tento parametr zjemňuje náhlé změny extruzního toku, ke kterým dochází při " +"přechodu tiskárny z tisku s vysokým průtokem (vysokou rychlostí/větší " +"šířkou) extruze na tisk s nižším průtokem (nižší rychlostí/menší šířkou) " +"extruze a obráceně.\n" "\n" -"Definuje maximální rychlost, jakou se může objemový průtok extrudovaný v mm3/s měnit v čase. Vyšší " -"hodnoty znamenají, že jsou povoleny vyšší změny extruzní rychlosti, což vede k rychlejším přechodům " -"rychlosti.\n" +"Definuje maximální rychlost, jakou se může objemový průtok extrudovaný v mm3/" +"s měnit v čase. Vyšší hodnoty znamenají, že jsou povoleny vyšší změny " +"extruzní rychlosti, což vede k rychlejším přechodům rychlosti.\n" "\n" "Hodnota 0 tuto funkci vypíná. \n" "\n" -"Pro tiskárny s vysokou rychlostí a vysokým průtokem přímého pohonu (např. Bambu lab nebo Voron) tato " -"hodnota obvykle není potřebná. Avšak v některých případech, kdy se rychlosti prvků velmi liší, může " -"poskytnout marginální přínos. Například při agresivním zpomalení kvůli přesahům. V těchto případech se " -"doporučuje vysoká hodnota kolem 300-350 mm3/s2, protože to umožní právě dostatečné zjemnění pro pomoc " -"předstihu tlaku (PA) k dosažení plynulejšího přechodu průtoku.\n" +"Pro tiskárny s vysokou rychlostí a vysokým průtokem přímého pohonu (např. " +"Bambu lab nebo Voron) tato hodnota obvykle není potřebná. Avšak v některých " +"případech, kdy se rychlosti prvků velmi liší, může poskytnout marginální " +"přínos. Například při agresivním zpomalení kvůli přesahům. V těchto " +"případech se doporučuje vysoká hodnota kolem 300-350 mm3/s2, protože to " +"umožní právě dostatečné zjemnění pro pomoc předstihu tlaku (PA) k dosažení " +"plynulejšího přechodu průtoku.\n" "\n" -"Pro pomalejší tiskárny bez předstihu tlaku (PA) by měla být hodnota nastavena mnohem nižší. Pro " -"extrudery s přímým pohonem je dobrým výchozím bodem hodnota 10-15 mm3/s2 a pro styl Bowden 5-10 mm3/" -"s2. \n" +"Pro pomalejší tiskárny bez předstihu tlaku (PA) by měla být hodnota " +"nastavena mnohem nižší. Pro extrudery s přímým pohonem je dobrým výchozím " +"bodem hodnota 10-15 mm3/s2 a pro styl Bowden 5-10 mm3/s2. \n" "\n" "Tato funkce je známá jako Pressure Equalizer v Prusa slicer.\n" "\n" @@ -8637,11 +9247,12 @@ msgid "Smoothing segment length" msgstr "" msgid "" -"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" +"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" +"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" msgstr "" @@ -8650,21 +9261,23 @@ msgid "Minimum speed for part cooling fan" msgstr "Minimální rychlost ventilátoru chlazení dílů" 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" +"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 "" -"Rychlost chladicího ventilátoru pomocné části. Pomocný ventilátor poběží touto rychlostí během tisku " -"kromě prvních několika vrstev, které nejsou definovány žádnými chladicími vrstvami" +"Rychlost chladicího ventilátoru pomocné části. Pomocný ventilátor poběží " +"touto rychlostí během tisku kromě prvních několika vrstev, které nejsou " +"definovány žádnými chladicími vrstvami" msgid "Min" msgstr "Min" msgid "" -"The lowest printable layer height for extruder. Used tp limits the minimum layer hight when enable " -"adaptive layer height" +"The lowest printable layer height for extruder. Used tp limits the minimum " +"layer hight when enable adaptive layer height" msgstr "" -"Nejnižší výška tisknutelné vrstvy pro extruder. Používá se k omezení minimální výšky vrstvy při povolení " -"adaptivní výšky vrstvy" +"Nejnižší výška tisknutelné vrstvy pro extruder. Používá se k omezení " +"minimální výšky vrstvy při povolení adaptivní výšky vrstvy" msgid "Min print speed" msgstr "Minimální rychlost tisku" @@ -8681,15 +9294,22 @@ msgstr "Průměr trysky" msgid "Configuration notes" msgstr "Poznámky k nastavení" -msgid "You can put here your personal notes. This text will be added to the G-code header comments." -msgstr "Zde můžete zadat své osobní poznámky. Tento text bude přidán do komentáře záhlaví G-kódu." +msgid "" +"You can put here your personal notes. This text will be added to the G-code " +"header comments." +msgstr "" +"Zde můžete zadat své osobní poznámky. Tento text bude přidán do komentáře " +"záhlaví G-kódu." msgid "Host Type" msgstr "Typ tiskového serveru" -msgid "Slic3r can upload G-code files to a printer host. This field must contain the kind of the host." +msgid "" +"Slic3r can upload G-code files to a printer host. This field must contain " +"the kind of the host." msgstr "" -"Slic3r může nahrát soubory G-kódu do tiskového serveru. Toto pole musí obsahovat druh tiskového serveru." +"Slic3r může nahrát soubory G-kódu do tiskového serveru. Toto pole musí " +"obsahovat druh tiskového serveru." msgid "Nozzle volume" msgstr "Objem trysky" @@ -8707,40 +9327,45 @@ msgid "Cooling tube length" msgstr "Délka chladící trubičky" msgid "Length of the cooling tube to limit space for cooling moves inside it." -msgstr "Délka kovové trubičky určené pro ochlazení a zformování filamentu po vytažení z extruderu." +msgstr "" +"Délka kovové trubičky určené pro ochlazení a zformování filamentu po " +"vytažení z extruderu." msgid "High extruder current on filament swap" msgstr "Zvýšený proud do extruderového motoru při výměně filamentu" msgid "" -"It may be beneficial to increase the extruder motor current during the filament exchange sequence to " -"allow for rapid ramming feed rates and to overcome resistance when loading a filament with an ugly " -"shaped tip." +"It may be beneficial to increase the extruder motor current during the " +"filament exchange sequence to allow for rapid ramming feed rates and to " +"overcome resistance when loading a filament with an ugly shaped tip." msgstr "" -"Může být užitečné zvýšit proud motoru extruderu během sekvence výměny filamentu, aby se umožnily vysoké " -"rychlosti zavádění filamentu a aby se překonal odpor při zavádění filamentu s ošklivě tvarovanou špičkou." +"Může být užitečné zvýšit proud motoru extruderu během sekvence výměny " +"filamentu, aby se umožnily vysoké rychlosti zavádění filamentu a aby se " +"překonal odpor při zavádění filamentu s ošklivě tvarovanou špičkou." msgid "Filament parking position" msgstr "Parkovací pozice filamentu" msgid "" -"Distance of the extruder tip from the position where the filament is parked when unloaded. This should " -"match the value in printer firmware." +"Distance of the extruder tip from the position where the filament is parked " +"when unloaded. This should match the value in printer firmware." msgstr "" -"Vzdálenost špičky extruderu od místa, kde je zaparkován filament při vytažení. Měla by se shodovat s " -"hodnotou ve firmware tiskárny." +"Vzdálenost špičky extruderu od místa, kde je zaparkován filament při " +"vytažení. Měla by se shodovat s hodnotou ve firmware tiskárny." msgid "Extra loading distance" msgstr "Extra délka při zavádění" msgid "" -"When set to zero, the distance the filament is moved from parking position during load is exactly the " -"same as it was moved back during unload. When positive, it is loaded further, if negative, the loading " -"move is shorter than unloading." +"When set to zero, the distance the filament is moved from parking position " +"during load is exactly the same as it was moved back during unload. When " +"positive, it is loaded further, if negative, the loading move is shorter " +"than unloading." msgstr "" -"Když je hodnota nastavena na nulu, vzdálenost o kterou se filament posune během zavádění, je stejná, " -"jako zpětný posun během vysouvání filamentu. Je-li hodnota kladná, je filament posunut více,. Je-li " -"hodnota záporná, posun při zavádění je kratší než při vysouvání." +"Když je hodnota nastavena na nulu, vzdálenost o kterou se filament posune " +"během zavádění, je stejná, jako zpětný posun během vysouvání filamentu. Je-" +"li hodnota kladná, je filament posunut více,. Je-li hodnota záporná, posun " +"při zavádění je kratší než při vysouvání." msgid "Start end points" msgstr "Začátek konec body" @@ -8752,12 +9377,13 @@ msgid "Reduce infill retraction" msgstr "Omezení retrakcí ve výplni" 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 model and save printing time, but make slicing and G-code " -"generating slower" +"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 " +"model and save printing time, but make slicing and G-code generating slower" msgstr "" -"Omezte retrakce, když je pohyb v oblasti výplně absolutně. To znamená, že vytékání není vidět. To může " -"zkrátit dobu retrakcí u složitého modelu a ušetřit čas tisku, ale zpomalit krájení a generování G-kódu" +"Omezte retrakce, když je pohyb v oblasti výplně absolutně. To znamená, že " +"vytékání není vidět. To může zkrátit dobu retrakcí u složitého modelu a " +"ušetřit čas tisku, ale zpomalit krájení a generování G-kódu" msgid "Enable" msgstr "Zapnout" @@ -8778,21 +9404,23 @@ msgid "Make overhang printable maximum angle" msgstr "Umožnit tisk převisů maximálního úhlu" msgid "" -"Maximum angle of overhangs to allow after making more steep overhangs printable.90° will not change the " -"model at all and allow any overhang, while 0 will replace all overhangs with conical material." +"Maximum angle of overhangs to allow after making more steep overhangs " +"printable.90° will not change the model at all and allow any overhang, while " +"0 will replace all overhangs with conical material." msgstr "" -"Maximální úhel převisů, který bude povolen pro umožnění tisku strmějších převisů. 90° nezmění model " -"vůbec a umožní jakýkoli převis, zatímco 0 nahradí všechny převisy kuželovým materiálem." +"Maximální úhel převisů, který bude povolen pro umožnění tisku strmějších " +"převisů. 90° nezmění model vůbec a umožní jakýkoli převis, zatímco 0 nahradí " +"všechny převisy kuželovým materiálem." msgid "Make overhang printable hole area" msgstr "Oblast otvoru pro tisk převisu bez podpěr" msgid "" -"Maximum area of a hole in the base of the model before it's filled by conical material.A value of 0 will " -"fill all the holes in the model base." +"Maximum area of a hole in the base of the model before it's filled by " +"conical material.A value of 0 will fill all the holes in the model base." msgstr "" -"Maximální plocha otvoru v základně modelu před tím, než bude vyplněna kuželovým materiálem. Hodnota 0 " -"vyplní všechny díry v základně modelu." +"Maximální plocha otvoru v základně modelu před tím, než bude vyplněna " +"kuželovým materiálem. Hodnota 0 vyplní všechny díry v základně modelu." msgid "mm²" msgstr "mm²" @@ -8802,14 +9430,18 @@ msgstr "Detekovat převisy stěn" #, c-format, boost-format msgid "" -"Detect the overhang percentage relative to line width and use different speed to print. For 100%% " -"overhang, bridge speed is used." +"Detect the overhang percentage relative to line width and use different " +"speed to print. For 100%% overhang, bridge speed is used." msgstr "" -"Zjistěte procento převisů vzhledem k šířce extruze a použijte jinou rychlost tisku. Pro 100%% převisy se " -"použije rychlost mostu." +"Zjistěte procento převisů vzhledem k šířce extruze a použijte jinou rychlost " +"tisku. Pro 100%% převisy se použije rychlost mostu." -msgid "Line width of inner wall. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Šířka extruze vnitřní stěny. Pokud je vyjádřena jako %, vypočítá se vzhledem k průměru trysky." +msgid "" +"Line width of inner wall. If expressed as a %, it will be computed over the " +"nozzle diameter." +msgstr "" +"Šířka extruze vnitřní stěny. Pokud je vyjádřena jako %, vypočítá se vzhledem " +"k průměru trysky." msgid "Speed of inner wall" msgstr "Rychlost vnitřní stěny" @@ -8818,13 +9450,16 @@ msgid "Number of walls of every layer" msgstr "Počet perimetrů/stěn každé vrstvy" msgid "" -"If you want to process the output G-code through custom scripts, just list their absolute paths here. " -"Separate multiple scripts with a semicolon. Scripts will be passed the absolute path to the G-code file " -"as the first argument, and they can access the Slic3r config settings by reading environment variables." +"If you want to process the output G-code through custom scripts, just list " +"their absolute paths here. Separate multiple scripts with a semicolon. " +"Scripts will be passed the absolute path to the G-code file as the first " +"argument, and they can access the Slic3r config settings by reading " +"environment variables." msgstr "" -"Pokud chcete výstupní G-kód zpracovat pomocí vlastních skriptů, stačí zde uvést jejich absolutní cesty. " -"Více skriptů oddělte středníkem. Skriptu bude předána absolutní cesta k souboru G-kódu jako první " -"argument a mohou přístup k nastavení konfigurace Slic3r čtením proměnných prostředí." +"Pokud chcete výstupní G-kód zpracovat pomocí vlastních skriptů, stačí zde " +"uvést jejich absolutní cesty. Více skriptů oddělte středníkem. Skriptu bude " +"předána absolutní cesta k souboru G-kódu jako první argument a mohou přístup " +"k nastavení konfigurace Slic3r čtením proměnných prostředí." msgid "Printer notes" msgstr "Poznámky o tiskárně" @@ -8854,35 +9489,43 @@ msgid "Initial layer expansion" msgstr "Rozšíření první vrstvy" msgid "Expand the first raft or support layer to improve bed plate adhesion" -msgstr "Rozšiřte první raft nebo podpůrnou vrstvu pro zlepšení přilnavosti k podložce" +msgstr "" +"Rozšiřte první raft nebo podpůrnou vrstvu pro zlepšení přilnavosti k podložce" msgid "Raft layers" msgstr "Vrstev raftu" msgid "" -"Object will be raised by this number of support layers. Use this function to avoid wrapping when print " -"ABS" +"Object will be raised by this number of support layers. Use this function to " +"avoid wrapping when print ABS" msgstr "" -"Objekt bude zvednut o tento počet podpůrných vrstev. Tuto funkci použijte, abyste se vyhnuli obtékání " -"při tisku ABS" +"Objekt bude zvednut o tento počet podpůrných vrstev. Tuto funkci použijte, " +"abyste se vyhnuli obtékání při tisku ABS" msgid "" -"G-code path is genereated after simplifing the contour of model to avoid too much points and gcode lines " -"in gcode file. Smaller value means higher resolution and more time to slice" +"G-code path is genereated after simplifing the contour of model to avoid too " +"much points and gcode lines in gcode file. Smaller value means higher " +"resolution and more time to slice" msgstr "" -"Cesta G-kódu se generuje po zjednodušení obrysu modelu, aby se předešlo příliš velkému počtu bodů a " -"Linek gcode v souboru gcode. Menší hodnota znamená vyšší rozlišení a více času na slicování" +"Cesta G-kódu se generuje po zjednodušení obrysu modelu, aby se předešlo " +"příliš velkému počtu bodů a Linek gcode v souboru gcode. Menší hodnota " +"znamená vyšší rozlišení a více času na slicování" msgid "Travel distance threshold" msgstr "Hranice cestovní vzdálenosti" -msgid "Only trigger retraction when the travel distance is longer than this threshold" -msgstr "Spusťte retrakci pouze tehdy, když je dráha jízdy delší než tato hraniční hohnota" +msgid "" +"Only trigger retraction when the travel distance is longer than this " +"threshold" +msgstr "" +"Spusťte retrakci pouze tehdy, když je dráha jízdy delší než tato hraniční " +"hohnota" msgid "Retract amount before wipe" msgstr "Délka retrakce před očištěním" -msgid "The length of fast retraction before wipe, relative to retraction length" +msgid "" +"The length of fast retraction before wipe, relative to retraction length" msgstr "Délka rychlé retrakce před očištěním, vzhledem k délce retrakce" msgid "Retract when change layer" @@ -8898,38 +9541,38 @@ msgid "Retraction Length" msgstr "Vzdálenost retrakce" msgid "" -"Some amount of material in extruder is pulled back to avoid ooze during long travel. Set zero to disable " -"retraction" +"Some amount of material in extruder is pulled back to avoid ooze during long " +"travel. Set zero to disable retraction" msgstr "" -"Některé množství materiálu v extruderu je staženo zpět, aby se zabránilo slizu při dlouhém pohybu. " -"Nastavte nulu, abyste zablokovali retrakce" +"Některé množství materiálu v extruderu je staženo zpět, aby se zabránilo " +"slizu při dlouhém pohybu. Nastavte nulu, abyste zablokovali retrakce" msgid "Z hop when retract" msgstr "Z hop při retrakci" msgid "" -"Whenever the retraction is done, the nozzle is lifted a little to create clearance between nozzle and " -"the print. It prevents nozzle from hitting the print when travel move. Using spiral line to lift z can " -"prevent stringing" +"Whenever the retraction is done, the nozzle is lifted a little to create " +"clearance between nozzle and the print. It prevents nozzle from hitting the " +"print when travel move. Using spiral line to lift z can prevent stringing" msgstr "" -"Kdykoli je retrakce provedena, tryska se trochu zvedne, aby se vytvořila mezera mezi tryskou a tiskem. " -"Zabraňuje tomu, aby tryska zasáhla tisk při pohybu. Použití spirálové linky ke zvednutí z může zabránit " -"stringování" +"Kdykoli je retrakce provedena, tryska se trochu zvedne, aby se vytvořila " +"mezera mezi tryskou a tiskem. Zabraňuje tomu, aby tryska zasáhla tisk při " +"pohybu. Použití spirálové linky ke zvednutí z může zabránit stringování" msgid "Z hop lower boundary" msgstr "" msgid "" -"Z hop will only come into effect when Z is above this value and is below the parameter: \"Z hop upper " -"boundary\"" +"Z hop will only come into effect when Z is above this value and is below the " +"parameter: \"Z hop upper boundary\"" msgstr "" msgid "Z hop upper boundary" msgstr "" msgid "" -"If this value is positive, Z hop will only come into effect when Z is above the parameter: \"Z hop lower " -"boundary\" and is below this value" +"If this value is positive, Z hop will only come into effect when Z is above " +"the parameter: \"Z hop lower boundary\" and is below this value" msgstr "" msgid "Z hop type" @@ -8944,21 +9587,32 @@ msgstr "Spirála" msgid "Only lift Z above" msgstr "Zvednout Z pouze nad" -msgid "If you set this to a positive value, Z lift will only take place above the specified absolute Z." -msgstr "Zadání kladné hodnoty se zdvih Z uskuteční pouze nad zadanou absolutní hodnotou Z." +msgid "" +"If you set this to a positive value, Z lift will only take place above the " +"specified absolute Z." +msgstr "" +"Zadání kladné hodnoty se zdvih Z uskuteční pouze nad zadanou absolutní " +"hodnotou Z." msgid "Only lift Z below" msgstr "Zvednout Z pouze pod" -msgid "If you set this to a positive value, Z lift will only take place below the specified absolute Z." -msgstr "Zadání kladné hodnoty se zdvih Z uskuteční pouze pod zadanou absolutní hodnotou Z." +msgid "" +"If you set this to a positive value, Z lift will only take place below the " +"specified absolute Z." +msgstr "" +"Zadání kladné hodnoty se zdvih Z uskuteční pouze pod zadanou absolutní " +"hodnotou Z." msgid "On surfaces" msgstr "Na površích" -msgid "Enforce Z Hop behavior. This setting is impacted by the above settings (Only lift Z above/below)." +msgid "" +"Enforce Z Hop behavior. This setting is impacted by the above settings (Only " +"lift Z above/below)." msgstr "" -"Povolit chování Z Hop. Tato volba je ovlivněna výše uvedenými nastaveními (Pouze zvednout Z nad/pod)." +"Povolit chování Z Hop. Tato volba je ovlivněna výše uvedenými nastaveními " +"(Pouze zvednout Z nad/pod)." msgid "All Surfaces" msgstr "Všechny povrchy" @@ -8976,16 +9630,18 @@ msgid "Extra length on restart" msgstr "Extra vzdálenost při návratu" msgid "" -"When the retraction is compensated after the travel move, the extruder will push this additional amount " -"of filament. This setting is rarely needed." +"When the retraction is compensated after the travel move, the extruder will " +"push this additional amount of filament. This setting is rarely needed." msgstr "" -"Když je retrakce kompenzována po rychloposunu, extruder vytlačuje toto další množství filamentu. Toto " -"nastavení je zřídkakdy potřeba." +"Když je retrakce kompenzována po rychloposunu, extruder vytlačuje toto další " +"množství filamentu. Toto nastavení je zřídkakdy potřeba." msgid "" -"When the retraction is compensated after changing tool, the extruder will push this additional amount of " -"filament." -msgstr "Když je retrakce kompenzována po změně nástroje, extruder vytlačuje toto další množství filamentu." +"When the retraction is compensated after changing tool, the extruder will " +"push this additional amount of filament." +msgstr "" +"Když je retrakce kompenzována po změně nástroje, extruder vytlačuje toto " +"další množství filamentu." msgid "Retraction Speed" msgstr "Rychlost Retrakce" @@ -8996,19 +9652,23 @@ msgstr "Rychlost Retrakce" msgid "Deretraction Speed" msgstr "Rychlost Deretrakce" -msgid "Speed for reloading filament into extruder. Zero means same speed with retraction" +msgid "" +"Speed for reloading filament into extruder. Zero means same speed with " +"retraction" msgstr "" -"Rychlost pro opětovné vkládání filamentu do extruderu. Nula znamená stejnou rychlost jako pro retrakce" +"Rychlost pro opětovné vkládání filamentu do extruderu. Nula znamená stejnou " +"rychlost jako pro retrakce" msgid "Use firmware retraction" msgstr "Použít retrakce z firmwaru" msgid "" -"This experimental setting uses G10 and G11 commands to have the firmware handle the retraction. This is " -"only supported in recent Marlin." +"This experimental setting uses G10 and G11 commands to have the firmware " +"handle the retraction. This is only supported in recent Marlin." msgstr "" -"Toto experimentální nastavení používá příkazy G10 a G11, aby si firmware poradil s retrakcí. Toto je " -"podporováno pouze v posledních verzích firmwaru Marlin." +"Toto experimentální nastavení používá příkazy G10 a G11, aby si firmware " +"poradil s retrakcí. Toto je podporováno pouze v posledních verzích firmwaru " +"Marlin." msgid "Show auto-calibration marks" msgstr "Zobrazit automatické kalibrační značky" @@ -9035,59 +9695,61 @@ msgid "Staggered inner seams" msgstr "Posunuté vnitřní švy" msgid "" -"This option causes the inner seams to be shifted backwards based on their depth, forming a zigzag " -"pattern." +"This option causes the inner seams to be shifted backwards based on their " +"depth, forming a zigzag pattern." msgstr "" -"Tato možnost způsobí, že vnitřní švy budou posunuty dozadu na základě jejich hloubky, vytvářející " -"střídavý (zigzag) vzor." +"Tato možnost způsobí, že vnitřní švy budou posunuty dozadu na základě jejich " +"hloubky, vytvářející střídavý (zigzag) vzor." msgid "Seam gap" msgstr "Mezera švu" msgid "" -"In order to reduce the visibility of the seam in a closed loop extrusion, the loop is interrupted and " -"shortened by a specified amount.\n" -"This amount can be specified in millimeters or as a percentage of the current extruder diameter. The " -"default value for this parameter is 10%." +"In order to reduce the visibility of the seam in a closed loop extrusion, " +"the loop is interrupted and shortened by a specified amount.\n" +"This amount can be specified in millimeters or as a percentage of the " +"current extruder diameter. The default value for this parameter is 10%." msgstr "" -"Aby se snížila viditelnost spoje při uzavřené extruzi, je smyčka přerušena a zkrácena o stanovenou " -"hodnotu.\n" -"Tato hodnota může být zadána v milimetrech nebo jako procento aktuálního průměru trysky. Výchozí hodnota " -"pro tento parametr je 10%." +"Aby se snížila viditelnost spoje při uzavřené extruzi, je smyčka přerušena a " +"zkrácena o stanovenou hodnotu.\n" +"Tato hodnota může být zadána v milimetrech nebo jako procento aktuálního " +"průměru trysky. Výchozí hodnota pro tento parametr je 10%." msgid "Role base wipe speed" msgstr "Rychlost čištění podle role" msgid "" -"The wipe speed is determined by the speed of the current extrusion role.e.g. if a wipe action is " -"executed immediately following an outer wall extrusion, the speed of the outer wall extrusion will be " -"utilized for the wipe action." +"The wipe speed is determined by the speed of the current extrusion role.e.g. " +"if a wipe action is executed immediately following an outer wall extrusion, " +"the speed of the outer wall extrusion will be utilized for the wipe action." msgstr "" -"Rychlost čištění je určena rychlostí aktuální role vytlačování, např. pokud je činnost čištění provedena " -"bezprostředně po vytlačování vnější stěny, rychlost vytlačování vnější stěny bude využita pro činnost " -"čištění." +"Rychlost čištění je určena rychlostí aktuální role vytlačování, např. pokud " +"je činnost čištění provedena bezprostředně po vytlačování vnější stěny, " +"rychlost vytlačování vnější stěny bude využita pro činnost čištění." msgid "Wipe on loops" msgstr "Čistit na smyčce" msgid "" -"To minimize the visibility of the seam in a closed loop extrusion, a small inward movement is executed " -"before the extruder leaves the loop." +"To minimize the visibility of the seam in a closed loop extrusion, a small " +"inward movement is executed before the extruder leaves the loop." msgstr "" -"Aby byla minimalizována viditelnost švu při vytlačování s uzavřenou smyčkou, je proveden malý pohyb " -"dovnitř předtím, než vytlačovací stroj opustí smyčku." +"Aby byla minimalizována viditelnost švu při vytlačování s uzavřenou smyčkou, " +"je proveden malý pohyb dovnitř předtím, než vytlačovací stroj opustí smyčku." msgid "Wipe speed" msgstr "Rychlost čištění" 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%" +"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 "" -"Rychlost čištění je určena nastavením rychlosti specifikovaným v této konfiguraci. Pokud je hodnota " -"vyjádřena v procentech (např. 80%), bude vypočítána na základě výše nastavené rychlosti jízdy. Výchozí " -"hodnota pro tento parametr je 80%" +"Rychlost čištění je určena nastavením rychlosti specifikovaným v této " +"konfiguraci. Pokud je hodnota vyjádřena v procentech (např. 80%), bude " +"vypočítána na základě výše nastavené rychlosti jízdy. Výchozí hodnota pro " +"tento parametr je 80%" msgid "Skirt distance" msgstr "Vzdálenost obrysu" @@ -9111,25 +9773,33 @@ msgid "Skirt speed" msgstr "Rychlost obrysu" msgid "Speed of skirt, in mm/s. Zero means use default layer extrusion speed." -msgstr "Rychlost obrysu, v mm/s. Nula znamená použít výchozí rychlost vrstvy extruze." +msgstr "" +"Rychlost obrysu, v mm/s. Nula znamená použít výchozí rychlost vrstvy extruze." msgid "" -"The printing speed in exported gcode will be slowed down, when the estimated layer time is shorter than " -"this value, to get better cooling for these layers" +"The printing speed in exported gcode will be slowed down, when the estimated " +"layer time is shorter than this value, to get better cooling for these layers" msgstr "" -"Rychlost tisku v exportovaném kódu gcode se zpomalí, když je odhadovaná doba vrstvy kratší než tato " -"hodnota, aby se dosáhlo lepšího chlazení pro tyto vrstvy" +"Rychlost tisku v exportovaném kódu gcode se zpomalí, když je odhadovaná doba " +"vrstvy kratší než tato hodnota, aby se dosáhlo lepšího chlazení pro tyto " +"vrstvy" msgid "Minimum sparse infill threshold" msgstr "Minimální hranice vnitřní výplně" -msgid "Sparse infill area which is smaller than threshold value is replaced by internal solid infill" -msgstr "Řídká oblast výplně, která je menší než hraniční hodnota, je nahrazena vnitřní plnou výplní" +msgid "" +"Sparse infill area which is smaller than threshold value is replaced by " +"internal solid infill" +msgstr "" +"Řídká oblast výplně, která je menší než hraniční hodnota, je nahrazena " +"vnitřní plnou výplní" msgid "" -"Line width of internal solid infill. If expressed as a %, it will be computed over the nozzle diameter." +"Line width of internal solid infill. If expressed as a %, it will be " +"computed over the nozzle diameter." msgstr "" -"Šířka extruze pro vnitřní výplň. Pokud je vyjádřena jako %, bude vypočtena vzhledem k průměru trysky." +"Šířka extruze pro vnitřní výplň. Pokud je vyjádřena jako %, bude vypočtena " +"vzhledem k průměru trysky." msgid "Speed of internal solid infill, not the top and bottom surface" msgstr "Rychlost vnitřní plné výplně, nikoli horní a spodní plochy" @@ -9138,25 +9808,31 @@ msgid "Spiral vase" msgstr "Spirálová váza" 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 generated model has no seam" +"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 " +"generated model has no seam" msgstr "" -"Spiralize vyhlazuje pohyby z vnějšího obrysu. A přemění pevný model na jednostěnný tisk s pevnými " -"spodními vrstvami. Konečný vygenerovaný model nemá žádný šev" +"Spiralize vyhlazuje pohyby z vnějšího obrysu. A přemění pevný model na " +"jednostěnný tisk s pevnými spodními vrstvami. Konečný vygenerovaný model " +"nemá žádný šev" msgid "" -"If smooth or traditional mode is selected, a timelapse video will be generated for each print. After " -"each layer is printed, a snapshot is taken with the chamber camera. All of these snapshots are composed " -"into a timelapse video when printing completes. If smooth mode is selected, the toolhead will move to " -"the excess chute after each layer is printed and then take a snapshot. Since the melt filament may leak " -"from the nozzle during the process of taking a snapshot, prime tower is required for smooth mode to wipe " -"nozzle." +"If smooth or traditional mode is selected, a timelapse video will be " +"generated for each print. After each layer is printed, a snapshot is taken " +"with the chamber camera. All of these snapshots are composed into a " +"timelapse video when printing completes. If smooth mode is selected, the " +"toolhead will move to the excess chute after each layer is printed and then " +"take a snapshot. Since the melt filament may leak from the nozzle during the " +"process of taking a snapshot, prime tower is required for smooth mode to " +"wipe nozzle." msgstr "" -"Pokud je vybrán plynulý nebo tradiční režim, pro každý tisk se vygeneruje časosběrné video. Po vytištění " -"každé vrstvy je pořízen snímek komorovou kamerou. Všechny tyto snímky jsou po dokončení tisku složeny do " -"časosběrného videa. Pokud je vybrán hladký režim, nástrojová hlava se po vytištění každé vrstvy přesune " -"do přebytečného skluzu a poté pořídí snímek. Kvůli tomu, že se během procesu tavení filamentu může " -"unikat z trysky, pro hladký režim je vyžadována čistící věž pro otření trysky." +"Pokud je vybrán plynulý nebo tradiční režim, pro každý tisk se vygeneruje " +"časosběrné video. Po vytištění každé vrstvy je pořízen snímek komorovou " +"kamerou. Všechny tyto snímky jsou po dokončení tisku složeny do časosběrného " +"videa. Pokud je vybrán hladký režim, nástrojová hlava se po vytištění každé " +"vrstvy přesune do přebytečného skluzu a poté pořídí snímek. Kvůli tomu, že " +"se během procesu tavení filamentu může unikat z trysky, pro hladký režim je " +"vyžadována čistící věž pro otření trysky." msgid "Traditional" msgstr "Tradiční" @@ -9192,43 +9868,47 @@ msgid "No sparse layers (EXPERIMENTAL)" msgstr "Bez řídkých vrstev (EXPERIMENTÁLNÍ)" msgid "" -"If enabled, the wipe tower will not be printed on layers with no toolchanges. On layers with a " -"toolchange, extruder will travel downward to print the wipe tower. User is responsible for ensuring " -"there is no collision with the print." +"If enabled, the wipe tower will not be printed on layers with no " +"toolchanges. On layers with a toolchange, extruder will travel downward to " +"print the wipe tower. User is responsible for ensuring there is no collision " +"with the print." msgstr "" -"Pokud je tato možnost povolena, nebude čistící věž vytištěna ve vrstvách bez změny barvy. U vrstev s " -"výměnou sjede extruder směrem dolů a vytiskne vrstvu čistící věže. Uživatel je odpovědný za to, že " -"nedojde ke kolizi tiskové hlavy s tiskem." +"Pokud je tato možnost povolena, nebude čistící věž vytištěna ve vrstvách bez " +"změny barvy. U vrstev s výměnou sjede extruder směrem dolů a vytiskne vrstvu " +"čistící věže. Uživatel je odpovědný za to, že nedojde ke kolizi tiskové " +"hlavy s tiskem." msgid "Prime all printing extruders" msgstr "Příprava všech tiskových extruderů" msgid "" -"If enabled, all printing extruders will be primed at the front edge of the print bed at the start of the " -"print." +"If enabled, all printing extruders will be primed at the front edge of the " +"print bed at the start of the print." msgstr "" -"Pokud je tato možnost povolena, všechny tiskové extrudery na začátku tisku vytlačí na předním okraji " -"podložky malé množství materiálu." +"Pokud je tato možnost povolena, všechny tiskové extrudery na začátku tisku " +"vytlačí na předním okraji podložky malé množství materiálu." msgid "Slice gap closing radius" msgstr "Poloměr uzavření mezery v tiskové vrstvě" msgid "" -"Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap " -"closing operation may reduce the final print resolution, therefore it is advisable to keep the value " -"reasonably low." +"Cracks smaller than 2x gap closing radius are being filled during the " +"triangle mesh slicing. The gap closing operation may reduce the final print " +"resolution, therefore it is advisable to keep the value reasonably low." msgstr "" -"Praskliny menší než 2x poloměr uzavření mezery se vyplní během slicování trojúhelníkových sítí. Operace " -"uzavírání mezery může snížit konečné rozlišení tisku, proto je vhodné udržovat rozumně nízkou hodnotu." +"Praskliny menší než 2x poloměr uzavření mezery se vyplní během slicování " +"trojúhelníkových sítí. Operace uzavírání mezery může snížit konečné " +"rozlišení tisku, proto je vhodné udržovat rozumně nízkou hodnotu." msgid "Slicing Mode" msgstr "Režim Slicování" msgid "" -"Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model." +"Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " +"close all holes in the model." msgstr "" -"Pro modely letadel 3DLabPrint použijte \"Paritní vyplňování\". Použijte \"Uzavírání děr\" pro uzavření " -"všech otvorů v modelu." +"Pro modely letadel 3DLabPrint použijte \"Paritní vyplňování\". Použijte " +"\"Uzavírání děr\" pro uzavření všech otvorů v modelu." msgid "Regular" msgstr "Obvyklý" @@ -9246,11 +9926,13 @@ msgid "Enable support generation." msgstr "Povolit generování podpěr." msgid "" -"normal(auto) and tree(auto) is used to generate support automatically. If normal(manual) or tree(manual) " -"is selected, only support enforcers are generated" +"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 "" -"Normální(auto) a Strom(auto) se používají k automatickému generování podpěr. Pokud je vybrána možnost " -"Normální(manual) nebo Strom(manual), budou generovány pouze vynucené podpěry" +"Normální(auto) a Strom(auto) se používají k automatickému generování podpěr. " +"Pokud je vybrána možnost Normální(manual) nebo Strom(manual), budou " +"generovány pouze vynucené podpěry" msgid "normal(auto)" msgstr "Normální (auto)" @@ -9285,8 +9967,12 @@ msgstr "Nevytvářejte podpěry na povrchu modelu, pouze na podložce" msgid "Support critical regions only" msgstr "Podpěry pouze pro kritické oblasti" -msgid "Only create support for critical regions including sharp tail, cantilever, etc." -msgstr "Vytvářejte podpěry pouze pro kritické oblasti včetně ostrého ocasu, konzoly atd." +msgid "" +"Only create support for critical regions including sharp tail, cantilever, " +"etc." +msgstr "" +"Vytvářejte podpěry pouze pro kritické oblasti včetně ostrého ocasu, konzoly " +"atd." msgid "Remove small overhangs" msgstr "Odstranit malé převisy" @@ -9310,30 +9996,38 @@ msgid "Support/raft base" msgstr "Podpěry/raft základna" msgid "" -"Filament to print support base and raft. \"Default\" means no specific filament for support and current " -"filament is used" +"Filament to print support base and raft. \"Default\" means no specific " +"filament for support and current filament is used" msgstr "" -"Filament pro tiskové podpěry základen a raftu. \"Výchozí\" znamená, že pro podpěry není použit žádný " -"konkrétní filament a je použit aktuální filament" +"Filament pro tiskové podpěry základen a raftu. \"Výchozí\" znamená, že pro " +"podpěry není použit žádný konkrétní filament a je použit aktuální filament" -msgid "Line width of support. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Šířka extruze pro podpěry. Pokud je vyjádřena jako %, bude vypočtena vzhledem k průměru trysky." +msgid "" +"Line width of support. If expressed as a %, it will be computed over the " +"nozzle diameter." +msgstr "" +"Šířka extruze pro podpěry. Pokud je vyjádřena jako %, bude vypočtena " +"vzhledem k průměru trysky." msgid "Interface use loop pattern" msgstr "Použijte vzor smyčky" -msgid "Cover the top contact layer of the supports with loops. Disabled by default." -msgstr "Zakrýt smyčkami horní kontaktní vrstvu podpěr. Ve výchozím nastavení zakázáno." +msgid "" +"Cover the top contact layer of the supports with loops. Disabled by default." +msgstr "" +"Zakrýt smyčkami horní kontaktní vrstvu podpěr. Ve výchozím nastavení " +"zakázáno." msgid "Support/raft interface" msgstr "Podpěry/raft kontaktní vrstva" msgid "" -"Filament to print support interface. \"Default\" means no specific filament for support interface and " -"current filament is used" +"Filament to print support interface. \"Default\" means no specific filament " +"for support interface and current filament is used" msgstr "" -"Filament k tisku kontaktních vrstev podpěr. \"Výchozí\" znamená, že pro kontaktní vrstvy podpěr není " -"použit žádný konkrétní filament a je použit aktuální filament" +"Filament k tisku kontaktních vrstev podpěr. \"Výchozí\" znamená, že pro " +"kontaktní vrstvy podpěr není použit žádný konkrétní filament a je použit " +"aktuální filament" msgid "Top interface layers" msgstr "Vrchní kontaktní vrstvy" @@ -9375,11 +10069,13 @@ msgid "Interface pattern" msgstr "Vzor kontaktní vrstvy" msgid "" -"Line pattern of support interface. Default pattern for non-soluble support interface is Rectilinear, " -"while default pattern for soluble support interface is Concentric" +"Line pattern of support interface. Default pattern for non-soluble support " +"interface is Rectilinear, while default pattern for soluble support " +"interface is Concentric" msgstr "" -"Vzor čáry pro kontaktní vrstvy podpěr. Výchozí vzor pro rozhraní nerozpustné podpěry je přímočarý, " -"zatímco výchozí vzor pro rozhraní rozpustné podpěry je koncentrický" +"Vzor čáry pro kontaktní vrstvy podpěr. Výchozí vzor pro rozhraní nerozpustné " +"podpěry je přímočarý, zatímco výchozí vzor pro rozhraní rozpustné podpěry je " +"koncentrický" msgid "Rectilinear Interlaced" msgstr "Přímočarý Prokládaný" @@ -9400,18 +10096,20 @@ msgid "Speed of support" msgstr "Rychlost podpěr" msgid "" -"Style and shape of the support. For normal support, projecting the supports into a regular grid will " -"create more stable supports (default), while snug support towers will save material and reduce object " -"scarring.\n" -"For tree support, slim and organic style will merge branches more aggressively and save a lot of " -"material (default organic), while hybrid style will create similar structure to normal support under " -"large flat overhangs." +"Style and shape of the support. For normal support, projecting the supports " +"into a regular grid will create more stable supports (default), while snug " +"support towers will save material and reduce object scarring.\n" +"For tree support, slim and organic style will merge branches more " +"aggressively and save a lot of material (default organic), while hybrid " +"style will create similar structure to normal support under large flat " +"overhangs." msgstr "" -"Styl a tvar podpěr. Pro běžnou podpěru, projekce podpěry do pravidelné mřížky vytvoří stabilnější " -"podpěry (výchozí), zatímco pevné věže pro podpěru ušetří materiál a sníží poškození objektu.\n" -"Pro stromovou podpěru, tenký a organický styl bude agresivněji slučovat větve a ušetří mnoho materiálu " -"(výchozí organický), zatímco hybridní styl vytvoří podobnou strukturu jako běžná podpěra pod velkými " -"plochými převiy." +"Styl a tvar podpěr. Pro běžnou podpěru, projekce podpěry do pravidelné " +"mřížky vytvoří stabilnější podpěry (výchozí), zatímco pevné věže pro podpěru " +"ušetří materiál a sníží poškození objektu.\n" +"Pro stromovou podpěru, tenký a organický styl bude agresivněji slučovat " +"větve a ušetří mnoho materiálu (výchozí organický), zatímco hybridní styl " +"vytvoří podobnou strukturu jako běžná podpěra pod velkými plochými převiy." msgid "Snug" msgstr "Přiléhavý" @@ -9432,44 +10130,54 @@ msgid "Independent support layer height" msgstr "Výška nezávislé podpůrné vrstvy" 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." +"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 "" -"Vrstva podpěry používá nezávislou výšku vrstvy vzhledem k vrstvě objektu. Tímto je umožněno upravit " -"mezeru ve směru osy Z a zároveň ušetřit čas tisku. Tato možnost bude neplatná, pokud je povolena věž pro " -"čištění trysky." +"Vrstva podpěry používá nezávislou výšku vrstvy vzhledem k vrstvě objektu. " +"Tímto je umožněno upravit mezeru ve směru osy Z a zároveň ušetřit čas tisku. " +"Tato možnost bude neplatná, pokud je povolena věž pro čištění trysky." msgid "Threshold angle" msgstr "Hraniční úhel" -msgid "Support will be generated for overhangs whose slope angle is below the threshold." -msgstr "Podpěry budou generovány pro převisy, jejichž úhel sklonu je pod hraniční hodnotou." +msgid "" +"Support will be generated for overhangs whose slope angle is below the " +"threshold." +msgstr "" +"Podpěry budou generovány pro převisy, jejichž úhel sklonu je pod hraniční " +"hodnotou." msgid "Tree support branch angle" msgstr "Úhel větve podpěr stromu" 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." +"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 "" -"Toto nastavení určuje maximální úhel převisů, který mohou větve podpěry stromu dělat. Pokud se úhel " -"zvětší, větve mohou být vytištěny více vodorovně, což jim umožní dosáhnout dále." +"Toto nastavení určuje maximální úhel převisů, který mohou větve podpěry " +"stromu dělat. Pokud se úhel zvětší, větve mohou být vytištěny více " +"vodorovně, což jim umožní dosáhnout dále." msgid "Preferred Branch Angle" msgstr "Preferovaný úhel větve" #. TRN PrintSettings: "Organic supports" > "Preferred Branch Angle" msgid "" -"The preferred angle of the branches, when they do not have to avoid the model. Use a lower angle to make " -"them more vertical and more stable. Use a higher angle for branches to merge faster." +"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 "" -"Upřednostňovaný úhel větví, pokud se větve musí vyhnout modelu. Použijte menší úhel, aby byly svislejší " -"a stabilnější. Použijte vyšší úhel, aby se větve dříve spojovaly." +"Upřednostňovaný úhel větví, pokud se větve musí vyhnout modelu. Použijte " +"menší úhel, aby byly svislejší a stabilnější. Použijte vyšší úhel, aby se " +"větve dříve spojovaly." msgid "Tree support branch distance" msgstr "Vzdálenost větví podpěr stromů" -msgid "This setting determines the distance between neighboring tree support nodes." +msgid "" +"This setting determines the distance between neighboring tree support nodes." msgstr "Toto nastavení určuje vzdálenost mezi sousedními uzly podpěr stromů." msgid "Branch Density" @@ -9477,28 +10185,35 @@ msgstr "Hustota větví" #. TRN PrintSettings: "Organic supports" > "Branch Density" msgid "" -"Adjusts the density of the support structure used to generate the tips of the branches. A higher value " -"results in better overhangs but the supports are harder to remove, thus it is recommended to enable top " -"support interfaces instead of a high branch density value if dense interfaces are needed." +"Adjusts the density of the support structure used to generate the tips of " +"the branches. A higher value results in better overhangs but the supports " +"are harder to remove, thus it is recommended to enable top support " +"interfaces instead of a high branch density value if dense interfaces are " +"needed." msgstr "" -"Upravuje hustotu podpěrných špiček větví. Vyšší hodnota vede k lepším převisům, ale podpěry se hůře " -"odstraňují. Proto se doporučuje povolit vrchní kontaktní vrstvy podpěr namísto vysoké hodnoty hustoty " -"větví." +"Upravuje hustotu podpěrných špiček větví. Vyšší hodnota vede k lepším " +"převisům, ale podpěry se hůře odstraňují. Proto se doporučuje povolit vrchní " +"kontaktní vrstvy podpěr namísto vysoké hodnoty hustoty větví." msgid "Adaptive layer height" msgstr "Adaptivní výška vrstvy" msgid "" -"Enabling this option means the height of tree support layer except the first will be automatically " -"calculated " +"Enabling this option means the height of tree support layer except the " +"first will be automatically calculated " msgstr "" -"Povolení této možnosti znamená, že výška stromové podpůrné vrstvy kromě první bude automaticky vypočtena " +"Povolení této možnosti znamená, že výška stromové podpůrné vrstvy kromě " +"první bude automaticky vypočtena " msgid "Auto brim width" msgstr "Automatická šířka límce" -msgid "Enabling this option means the width of the brim for tree support will be automatically calculated" -msgstr "Povolení této možnosti znamená, že šířka límce pro podpěry stromu budou automaticky vypočítány" +msgid "" +"Enabling this option means the width of the brim for tree support will be " +"automatically calculated" +msgstr "" +"Povolení této možnosti znamená, že šířka límce pro podpěry stromu budou " +"automaticky vypočítány" msgid "Tree support brim width" msgstr "Šířka Limce podpěr stromů" @@ -9525,23 +10240,27 @@ msgstr "Úhel definující průměr větve" #. TRN PrintSettings: "Organic supports" > "Branch Diameter Angle" msgid "" -"The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 " -"will cause the branches to have uniform thickness over their length. A bit of an angle can increase " -"stability of the organic support." +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the organic " +"support." msgstr "" -"Úhel, který udává průměr větví, jak se postupně zesilují směrem dolů. Úhel 0 způsobí, že větve budou mít " -"po celé délce stejnou tloušťku. Trochu větší úhel může zvýšit stabilitu organických podpěr." +"Úhel, který udává průměr větví, jak se postupně zesilují směrem dolů. Úhel 0 " +"způsobí, že větve budou mít po celé délce stejnou tloušťku. Trochu větší " +"úhel může zvýšit stabilitu organických podpěr." msgid "Branch Diameter with double walls" msgstr "Průměr větve s dvojitými stěnami" #. TRN PrintSettings: "Organic supports" > "Branch Diameter" msgid "" -"Branches with area larger than the area of a circle of this diameter will be printed with double walls " -"for stability. Set this value to zero for no double walls." +"Branches with area larger than the area of a circle of this diameter will be " +"printed with double walls for stability. Set this value to zero for no " +"double walls." msgstr "" -"Větve s plochou větší, než je plocha kruhu o zadaném průměru, budou kvůli stabilitě tištěny s dvojitými " -"stěnami. Nastavte tuto hodnotu na nulu, abyste zakázali dvojité stěny." +"Větve s plochou větší, než je plocha kruhu o zadaném průměru, budou kvůli " +"stabilitě tištěny s dvojitými stěnami. Nastavte tuto hodnotu na nulu, abyste " +"zakázali dvojité stěny." msgid "Tree support wall loops" msgstr "Stěnové smyčky na podpěry stromů" @@ -9552,24 +10271,31 @@ msgstr "Toto nastavení určuje počet stěn kolem podpěry stromu" msgid "Tree support with infill" msgstr "Podpěry stromu s výplní" -msgid "This setting specifies whether to add infill inside large hollows of tree support" -msgstr "Toto nastavení určuje, zda se má přidat výplň do velkých dutin podpěr stromů" +msgid "" +"This setting specifies whether to add infill inside large hollows of tree " +"support" +msgstr "" +"Toto nastavení určuje, zda se má přidat výplň do velkých dutin podpěr stromů" msgid "Chamber temperature" msgstr "Teplota v komoře" msgid "" -"Higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer " -"bonding strength for high temperature materials like ABS, ASA, PC, PA and so on.At the same time, the " -"air filtration of ABS and ASA will get worse.While for PLA, PETG, TPU, PVA and other low temperature " -"materials,the actual chamber temperature should not be high to avoid cloggings, so 0 which stands for " -"turning off is highly recommended" +"Higher chamber temperature can help suppress or reduce warping and " +"potentially lead to higher interlayer bonding strength for high temperature " +"materials like ABS, ASA, PC, PA and so on.At the same time, the air " +"filtration of ABS and ASA will get worse.While for PLA, PETG, TPU, PVA and " +"other low temperature materials,the actual chamber temperature should not be " +"high to avoid cloggings, so 0 which stands for turning off is highly " +"recommended" msgstr "" -"Vyšší teplota komory může pomoci potlačit nebo snížit odchlipování a potenciálně vést k vyšší pevnosti " -"spojů mezi vrstvami pro materiály s vysokou teplotou, jako je ABS, ASA, PC, PA a další. Zároveň se však " -"zhorší filtrace vzduchu pro ABS a ASA. Naopak pro PLA, PETG, TPU, PVA a další materiály s nízkou " -"teplotou by teplota komory neměla být vysoká, aby se předešlo zanášení, takže je velmi doporučeno použít " -"hodnotu 0, která znamená vypnutí" +"Vyšší teplota komory může pomoci potlačit nebo snížit odchlipování a " +"potenciálně vést k vyšší pevnosti spojů mezi vrstvami pro materiály s " +"vysokou teplotou, jako je ABS, ASA, PC, PA a další. Zároveň se však zhorší " +"filtrace vzduchu pro ABS a ASA. Naopak pro PLA, PETG, TPU, PVA a další " +"materiály s nízkou teplotou by teplota komory neměla být vysoká, aby se " +"předešlo zanášení, takže je velmi doporučeno použít hodnotu 0, která znamená " +"vypnutí" msgid "Nozzle temperature for layers after the initial one" msgstr "Teplota trysky pro vrstvy po počáteční" @@ -9578,18 +10304,26 @@ msgid "Detect thin wall" msgstr "Detekce tenkých stěn" msgid "" -"Detect thin wall which can't contain two line width. And use single line to print. Maybe printed not " -"very well, because it's not closed loop" +"Detect thin wall which can't contain two line width. And use single line to " +"print. Maybe printed not very well, because it's not closed loop" msgstr "" -"Detekujte tenkou stěnu, která nemůže obsahovat dvě šířky extruze. A k tisku použijte jednu linku. Možná " -"se to nevytiskne moc dobře, protože to není uzavřená smyčka" +"Detekujte tenkou stěnu, která nemůže obsahovat dvě šířky extruze. A k tisku " +"použijte jednu linku. Možná se to nevytiskne moc dobře, protože to není " +"uzavřená smyčka" -msgid "This gcode is inserted when change filament, including T command to trigger tool change" -msgstr "Tento gcode se vloží při výměně filamentu, včetně příkazu T ke spuštění výměny nástroje" +msgid "" +"This gcode is inserted when change filament, including T command to trigger " +"tool change" +msgstr "" +"Tento gcode se vloží při výměně filamentu, včetně příkazu T ke spuštění " +"výměny nástroje" -msgid "Line width for top surfaces. If expressed as a %, it will be computed over the nozzle diameter." +msgid "" +"Line width for top surfaces. If expressed as a %, it will be computed over " +"the nozzle diameter." msgstr "" -"Šířka extruze pro horní plochy. Pokud je vyjádřena jako %, bude vypočtena vzhledem k průměru trysky." +"Šířka extruze pro horní plochy. Pokud je vyjádřena jako %, bude vypočtena " +"vzhledem k průměru trysky." msgid "Speed of top surface infill which is solid" msgstr "Rychlost výplně horních ploch, která je plná" @@ -9598,11 +10332,13 @@ msgid "Top shell layers" msgstr "Vrchní vrstvy skořepiny" msgid "" -"This is the number of solid layers of top shell, including the top surface layer. When the thickness " -"calculated by this value is thinner than top shell thickness, the top shell layers will be increased" +"This is the number of solid layers of top shell, including the top surface " +"layer. When the thickness calculated by this value is thinner than top shell " +"thickness, the top shell layers will be increased" msgstr "" -"Toto je počet pevných vrstev vrchní skořepiny, včetně vrchní povrchové vrstvy. Když je tloušťka " -"vypočtená touto hodnotou tenčí než tloušťka vrchní skořepiny, vrchní vrstvy skořepiny se zvětší" +"Toto je počet pevných vrstev vrchní skořepiny, včetně vrchní povrchové " +"vrstvy. Když je tloušťka vypočtená touto hodnotou tenčí než tloušťka vrchní " +"skořepiny, vrchní vrstvy skořepiny se zvětší" msgid "Top solid layers" msgstr "Vrchních plných vrstev" @@ -9611,14 +10347,17 @@ msgid "Top shell thickness" msgstr "Tloušťka horní skořepiny" 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 having too thin shell when layer height is small. 0 means " -"that this setting is disabled and thickness of top shell is absolutely determained by top shell layers" +"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 " +"having too thin shell when layer height is small. 0 means that this setting " +"is disabled and thickness of top shell is absolutely determained by top " +"shell layers" msgstr "" -"Počet vrchních pevných vrstev se při krájení zvýší, pokud je tloušťka vypočítaná horními vrstvami " -"skořepiny tenčí než tato hodnota. Tím se lze vyhnout příliš tenké skořepině, když je výška vrstvy malá. " -"0 znamená, že toto nastavení je zakázáno a tloušťka vrchní skořepiny je absolutně určován vrchními " -"vrstvami pláště" +"Počet vrchních pevných vrstev se při krájení zvýší, pokud je tloušťka " +"vypočítaná horními vrstvami skořepiny tenčí než tato hodnota. Tím se lze " +"vyhnout příliš tenké skořepině, když je výška vrstvy malá. 0 znamená, že " +"toto nastavení je zakázáno a tloušťka vrchní skořepiny je absolutně určován " +"vrchními vrstvami pláště" msgid "Speed of travel which is faster and without extrusion" msgstr "Rychlost pohybu, která je rychlejší a bez extruze" @@ -9627,24 +10366,28 @@ msgid "Wipe while retracting" msgstr "Očistit při retrakci" msgid "" -"Move nozzle along the last extrusion path when retracting to clean leaked material on nozzle. This can " -"minimize blob when print new part after travel" +"Move nozzle along the last extrusion path when retracting to clean leaked " +"material on nozzle. This can minimize blob when print new part after travel" msgstr "" -"Při zasouvání přesuňte trysku podél poslední dráhy vytlačování, abyste vyčistili uniklý materiál na " -"trysce. To může minimalizovat skvrny při tisku nového dílu po cestě" +"Při zasouvání přesuňte trysku podél poslední dráhy vytlačování, abyste " +"vyčistili uniklý materiál na trysce. To může minimalizovat skvrny při tisku " +"nového dílu po cestě" msgid "Wipe Distance" msgstr "Vzdálenost čištění" -msgid "Discribe how long the nozzle will move along the last path when retracting" -msgstr "Popište, jak dlouho se bude tryska při retrakci pohybovat po poslední dráze" +msgid "" +"Discribe how long the nozzle will move along the last path when retracting" +msgstr "" +"Popište, jak dlouho se bude tryska při retrakci pohybovat po poslední dráze" 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." +"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 "" -"Věž pro čištění se může použít k čištění zbytků na trysce a stabilizaci tlaku v trysce, aby se předešlo " -"vzniku vad při tisku objektů." +"Věž pro čištění se může použít k čištění zbytků na trysce a stabilizaci " +"tlaku v trysce, aby se předešlo vzniku vad při tisku objektů." msgid "Purging volumes" msgstr "Objemy čištění" @@ -9653,9 +10396,11 @@ msgid "Flush multiplier" msgstr "Čistit multiplikátor" msgid "" -"The actual flushing volumes is equal to the flush multiplier multiplied by the flushing volumes in the " -"table." -msgstr "Skutečný objem čištění se rovná multiplikátoru čištění vynásobenému objemy čištění v tabulce." +"The actual flushing volumes is equal to the flush multiplier multiplied by " +"the flushing volumes in the table." +msgstr "" +"Skutečný objem čištění se rovná multiplikátoru čištění vynásobenému objemy " +"čištění v tabulce." msgid "Prime volume" msgstr "Základní objem" @@ -9679,9 +10424,11 @@ msgid "Stabilization cone apex angle" msgstr "Úhel vrcholu stabilizačního kužele" msgid "" -"Angle at the apex of the cone that is used to stabilize the wipe tower. Larger angle means wider base." +"Angle at the apex of the cone that is used to stabilize the wipe tower. " +"Larger angle means wider base." msgstr "" -"Úhel na vrcholu kužele, který se používá ke stabilizaci čistící věže. Větší úhel znamená širší základnu." +"Úhel na vrcholu kužele, který se používá ke stabilizaci čistící věže. Větší " +"úhel znamená širší základnu." msgid "Wipe tower purge lines spacing" msgstr "Rozteč čistících linek v čistící věži" @@ -9693,46 +10440,53 @@ msgid "Wipe tower extruder" msgstr "Extruder čistící věže" 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)." +"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 "" -"Extruder, který se použije při tisku obvodu čistící věže. Nastavte na 0, abyste použili ten, který je k " -"dispozici (přednostně s nerozpustným filamentem)." +"Extruder, který se použije při tisku obvodu čistící věže. Nastavte na 0, " +"abyste použili ten, který je k dispozici (přednostně s nerozpustným " +"filamentem)." msgid "Purging volumes - load/unload volumes" msgstr "Objemy čištění - zaváděné/vyjmuté objemy" msgid "" -"This vector saves required volumes to change from/to each tool used on the wipe tower. These values are " -"used to simplify creation of the full purging volumes below." +"This vector saves required volumes to change from/to each tool used on the " +"wipe tower. These values are used to simplify creation of the full purging " +"volumes below." msgstr "" -"Tento vektor ukládá potřebné objemy pro změnu z/na každý extruder používaný na čistící věži. Tyto " -"hodnoty jsou použity pro zjednodušení vytvoření celkových objemů čištění níže." +"Tento vektor ukládá potřebné objemy pro změnu z/na každý extruder používaný " +"na čistící věži. Tyto hodnoty jsou použity pro zjednodušení vytvoření " +"celkových objemů čištění níže." msgid "" -"Purging after filament change will be done inside objects' infills. This may lower the amount of waste " -"and decrease the print time. If the walls are printed with transparent filament, the mixed color infill " -"will be seen outside. It will not take effect, unless the prime tower is enabled." +"Purging after filament change will be done inside objects' infills. This may " +"lower the amount of waste and decrease the print time. If the walls are " +"printed with transparent filament, the mixed color infill will be seen " +"outside. It will not take effect, unless the prime tower is enabled." msgstr "" -"Čištění po výměně filamentu bude provedeno uvnitř výplní objektů. To může snížit množství odpadu a " -"zkrátit dobu tisku. Pokud jsou stěny potištěny průhledným filamentem, výplň smíšených barev bude vidět " -"venku. Neprojeví se to pokud není povolena čistící věž." +"Čištění po výměně filamentu bude provedeno uvnitř výplní objektů. To může " +"snížit množství odpadu a zkrátit dobu tisku. Pokud jsou stěny potištěny " +"průhledným filamentem, výplň smíšených barev bude vidět venku. Neprojeví se " +"to pokud není povolena čistící věž." 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." +"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 "" -"Čištění po výměně filamentu bude provedeno uvnitř podpěry objektů. To může snížit množství odpadu a " -"zkrátit dobu tisku. Neprojeví se, pokud není aktivována čistící věž." +"Čištění po výměně filamentu bude provedeno uvnitř podpěry objektů. To může " +"snížit množství odpadu a zkrátit dobu tisku. Neprojeví se, pokud není " +"aktivována čistící věž." 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." +"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 "" -"Tento objekt bude použit k očištění trysky po výměně filamentu, aby se ušetřil filament a zkrátila se " -"doba tisku. V důsledku toho budou barvy objektů smíšené. Neprojeví se to, pokud není aktivována čistící " -"věž." +"Tento objekt bude použit k očištění trysky po výměně filamentu, aby se " +"ušetřil filament a zkrátila se doba tisku. V důsledku toho budou barvy " +"objektů smíšené. Neprojeví se to, pokud není aktivována čistící věž." msgid "Maximal bridging distance" msgstr "Maximální vzdálenost přemostění" @@ -9744,54 +10498,88 @@ msgid "X-Y hole compensation" msgstr "X-Y Kompenzace otvoru" msgid "" -"Holes of object will be grown or shrunk in XY plane by the configured value. Positive value makes holes " -"bigger. Negative value makes holes smaller. This function is used to adjust size slightly when the " -"object has assembling issue" +"Holes of object will be grown or shrunk in XY plane by the configured value. " +"Positive value makes holes bigger. Negative value makes holes smaller. This " +"function is used to adjust size slightly when the object has assembling issue" msgstr "" -"Díry objektu se zvětší nebo zmenší v rovině XY o nakonfigurovanou hodnotu. Kladná hodnota zvětší díry. " -"Záporná hodnota díry zmenšuje. Tato funkce se používá k mírné úpravě velikosti, když má objekt problém " -"se sestavováním" +"Díry objektu se zvětší nebo zmenší v rovině XY o nakonfigurovanou hodnotu. " +"Kladná hodnota zvětší díry. Záporná hodnota díry zmenšuje. Tato funkce se " +"používá k mírné úpravě velikosti, když má objekt problém se sestavováním" msgid "X-Y contour compensation" msgstr "X-Y Kompenzace obrysu" msgid "" -"Contour of object will be grown or shrunk in XY plane by the configured value. Positive value makes " -"contour bigger. Negative value makes contour smaller. This function is used to adjust size slightly when " -"the object has assembling issue" +"Contour of object will be grown or shrunk in XY plane by the configured " +"value. Positive value makes contour bigger. Negative value makes contour " +"smaller. This function is used to adjust size slightly when the object has " +"assembling issue" +msgstr "" +"Kontura objektu se zvětší nebo zmenší v rovině XY o nakonfigurovanou " +"hodnotu. Kladná hodnota zvětší obrys. Záporná hodnota zmenší obrys. Tato " +"funkce se používá k mírné úpravě velikosti, když má objekt problém se " +"sestavováním" + +msgid "Convert holes to polyholes" +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 " +"compute the polyhole.\n" +"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" +msgstr "" + +msgid "Polyhole detection margin" +msgstr "" + +#, c-format, boost-format +msgid "" +"Maximum defection of a point to the estimated radius of the circle.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" +"In mm or in % of the radius." +msgstr "" + +msgid "Polyhole twist" +msgstr "" + +msgid "Rotate the polyhole every layer." msgstr "" -"Kontura objektu se zvětší nebo zmenší v rovině XY o nakonfigurovanou hodnotu. Kladná hodnota zvětší " -"obrys. Záporná hodnota zmenší obrys. Tato funkce se používá k mírné úpravě velikosti, když má objekt " -"problém se sestavováním" msgid "G-code thumbnails" msgstr "Náhledy G-kódu" msgid "" -"Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the following format: \"XxY, XxY, ..." -"\"" +"Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " +"following format: \"XxY, XxY, ...\"" msgstr "" -"Velikosti obrázků budou uloženy do souborů .gcode / .sl1 / .sl1s, v následujícím formátu: \"XxY, XxY, ..." -"\"" +"Velikosti obrázků budou uloženy do souborů .gcode / .sl1 / .sl1s, v " +"následujícím formátu: \"XxY, XxY, ...\"" msgid "Use relative E distances" msgstr "Použít relativní E vzdálenosti" msgid "" -"Relative extrusion is recommended when using \"label_objects\" option.Some extruders work better with " -"this option unckecked (absolute extrusion mode). Wipe tower is only compatible with relative mode. It is " -"always enabled on BambuLab printers. Default is checked" +"Relative extrusion is recommended when using \"label_objects\" option.Some " +"extruders work better with this option unckecked (absolute extrusion mode). " +"Wipe tower is only compatible with relative mode. It is always enabled on " +"BambuLab printers. Default is checked" msgstr "" -"Při použití volby \"label_objects\" se doporučuje relativní vytlačování. Některé extrudery fungují lépe, " -"když je tato možnost odškrtnuta (režim absolutního vytlačování). Čistící věž je kompatibilní pouze s " -"relativním režimem. Na tiskárnách BambuLab je vždy povolen. Výchozí je zaškrtnuto" +"Při použití volby \"label_objects\" se doporučuje relativní vytlačování. " +"Některé extrudery fungují lépe, když je tato možnost odškrtnuta (režim " +"absolutního vytlačování). Čistící věž je kompatibilní pouze s relativním " +"režimem. Na tiskárnách BambuLab je vždy povolen. Výchozí je zaškrtnuto" msgid "" -"Classic wall generator produces walls with constant extrusion width and for very thin areas is used gap-" -"fill. Arachne engine produces walls with variable extrusion width" +"Classic wall generator produces walls with constant extrusion width and for " +"very thin areas is used gap-fill. Arachne engine produces walls with " +"variable extrusion width" msgstr "" -"Klasický generátor stěn produkuje stěny s konstantní extruzní šířkou a pro velmi tenké oblasti se " -"používá gap-fill. Arachne engine produkuje stěny s proměnnou extruzní šířkou." +"Klasický generátor stěn produkuje stěny s konstantní extruzní šířkou a pro " +"velmi tenké oblasti se používá gap-fill. Arachne engine produkuje stěny s " +"proměnnou extruzní šířkou." msgid "Classic" msgstr "Klasický" @@ -9803,96 +10591,110 @@ msgid "Wall transition length" msgstr "Délka přechodu stěny" msgid "" -"When transitioning between different numbers of walls as the part becomes thinner, a certain amount of " -"space is allotted to split or join the wall segments. It's expressed as a percentage over nozzle diameter" +"When transitioning between different numbers of walls as the part becomes " +"thinner, a certain amount of space is allotted to split or join the wall " +"segments. It's expressed as a percentage over nozzle diameter" msgstr "" -"Při přechodu mezi různými počty stěn, jak se díl ztenčuje, je vyhrazeno určité množství prostoru pro " -"rozdělení nebo spojení segmentů stěny. Vyjadřuje se jako procento průměru trysky" +"Při přechodu mezi různými počty stěn, jak se díl ztenčuje, je vyhrazeno " +"určité množství prostoru pro rozdělení nebo spojení segmentů stěny. " +"Vyjadřuje se jako procento průměru trysky" msgid "Wall transitioning filter margin" msgstr "Okraj filtru přechodu stěny" msgid "" -"Prevent transitioning back and forth between one extra wall and one less. This margin extends the range " -"of extrusion widths which follow to [Minimum wall width - margin, 2 * Minimum wall width + margin]. " -"Increasing this margin reduces the number of transitions, which reduces the number of extrusion starts/" -"stops and travel time. However, large extrusion width variation can lead to under- or overextrusion " -"problems. It's expressed as a percentage over nozzle diameter" +"Prevent transitioning back and forth between one extra wall and one less. " +"This margin extends the range of extrusion widths which follow to [Minimum " +"wall width - margin, 2 * Minimum wall width + margin]. Increasing this " +"margin reduces the number of transitions, which reduces the number of " +"extrusion starts/stops and travel time. However, large extrusion width " +"variation can lead to under- or overextrusion problems. It's expressed as a " +"percentage over nozzle diameter" msgstr "" -"Zabránit přechodu mezi jednou dodatečnou stěnou a jednou méně. Tato mez rozšiřuje rozsah šířek extruze " -"na [Minimální šířka stěny - mezera, 2 * Minimální šířka stěny + mezera]. Zvýšení této mezery snižuje " -"počet přechodů, což zase snižuje počet začátků/konec extruze a čas cestování. Nicméně velké rozdíly ve " -"šířce extruze mohou vést k nedostatečné nebo přílišné extruzi. Je vyjádřena jako procento nad průměrem " -"trysky" +"Zabránit přechodu mezi jednou dodatečnou stěnou a jednou méně. Tato mez " +"rozšiřuje rozsah šířek extruze na [Minimální šířka stěny - mezera, 2 * " +"Minimální šířka stěny + mezera]. Zvýšení této mezery snižuje počet přechodů, " +"což zase snižuje počet začátků/konec extruze a čas cestování. Nicméně velké " +"rozdíly ve šířce extruze mohou vést k nedostatečné nebo přílišné extruzi. Je " +"vyjádřena jako procento nad průměrem trysky" msgid "Wall transitioning threshold angle" msgstr "Hraniční úhel přechodu stěny" msgid "" -"When to create transitions between even and odd numbers of walls. A wedge shape with an angle greater " -"than this setting will not have transitions and no walls will be printed in the center to fill the " -"remaining space. Reducing this setting reduces the number and length of these center walls, but may " +"When to create transitions between even and odd numbers of walls. A wedge " +"shape with an angle greater than this setting will not have transitions and " +"no walls will be printed in the center to fill the remaining space. Reducing " +"this setting reduces the number and length of these center walls, but may " "leave gaps or overextrude" msgstr "" -"Kdy vytvořit přechody mezi sudým a lichým počtem stěn. Klínový tvar s úhlem větším, než je toto " -"nastavení, nebude mít přechody a do středu se nevytisknou žádné stěny, které vyplní zbývající prostor. " -"Zmenšením tohoto nastavení se sníží počet a délka těchto středových stěn, ale může zanechat mezery nebo " -"přečnívat" +"Kdy vytvořit přechody mezi sudým a lichým počtem stěn. Klínový tvar s úhlem " +"větším, než je toto nastavení, nebude mít přechody a do středu se " +"nevytisknou žádné stěny, které vyplní zbývající prostor. Zmenšením tohoto " +"nastavení se sníží počet a délka těchto středových stěn, ale může zanechat " +"mezery nebo přečnívat" msgid "Wall distribution count" msgstr "Počet rozložení stěn" msgid "" -"The number of walls, counted from the center, over which the variation needs to be spread. Lower values " -"mean that the outer walls don't change in width" +"The number of walls, counted from the center, over which the variation needs " +"to be spread. Lower values mean that the outer walls don't change in width" msgstr "" -"Počet stěn, počítáno od středu, přes které je třeba rozložit variaci. Nižší hodnoty znamenají, že vnější " -"stěny se nemění na šířku" +"Počet stěn, počítáno od středu, přes které je třeba rozložit variaci. Nižší " +"hodnoty znamenají, že vnější stěny se nemění na šířku" msgid "Minimum feature size" msgstr "Minimální velikost prvku" msgid "" -"Minimum thickness of thin features. Model features that are thinner than this value will not be printed, " -"while features thicker than the Minimum feature size will be widened to the Minimum wall width. It's " -"expressed as a percentage over nozzle diameter" +"Minimum thickness of thin features. Model features that are thinner than " +"this value will not be printed, while features thicker than the Minimum " +"feature size will be widened to the Minimum wall width. It's expressed as a " +"percentage over nozzle diameter" msgstr "" -"Minimální tloušťka tenkých prvků. Prvky modelu, které jsou tenčí než tato hodnota, nebudou vytištěny, " -"zatímco prvky tlustší než minimální velikost prvku budou rozšířeny na minimální šířku stěny. Vyjadřuje " -"se jako procento průměru trysky" +"Minimální tloušťka tenkých prvků. Prvky modelu, které jsou tenčí než tato " +"hodnota, nebudou vytištěny, zatímco prvky tlustší než minimální velikost " +"prvku budou rozšířeny na minimální šířku stěny. Vyjadřuje se jako procento " +"průměru trysky" msgid "First layer minimum wall width" msgstr "Minimální šířka stěny první vrstvy" msgid "" -"The minimum wall width that should be used for the first layer is recommended to be set to the same size " -"as the nozzle. This adjustment is expected to enhance adhesion." +"The minimum wall width that should be used for the first layer is " +"recommended to be set to the same size as the nozzle. This adjustment is " +"expected to enhance adhesion." msgstr "" -"Minimální šířka stěny, která by měla být použita pro první vrstvu, se doporučuje nastavit na stejnou " -"velikost jako tryska. Toto nastavení by mělo zvýšit přilnavost." +"Minimální šířka stěny, která by měla být použita pro první vrstvu, se " +"doporučuje nastavit na stejnou velikost jako tryska. Toto nastavení by mělo " +"zvýšit přilnavost." msgid "Minimum wall width" msgstr "Minimální šířka stěny" 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 thickness of the feature, the wall will become as thick as " -"the feature itself. It's expressed as a percentage over nozzle diameter" +"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 " +"thickness of the feature, the wall will become as thick as the feature " +"itself. It's expressed as a percentage over nozzle diameter" msgstr "" -"Šířka stěny, která nahradí tenké prvky (podle Minimální velikosti prvku) modelu. Pokud je minimální " -"šířka stěny tenčí než tloušťka prvku, zeď bude stejně tlustá jako prvek samotný. Vyjadřuje se jako " -"procento nad průměr trysky" +"Šířka stěny, která nahradí tenké prvky (podle Minimální velikosti prvku) " +"modelu. Pokud je minimální šířka stěny tenčí než tloušťka prvku, zeď bude " +"stejně tlustá jako prvek samotný. Vyjadřuje se jako procento nad průměr " +"trysky" msgid "Detect narrow internal solid infill" msgstr "Detekovat úzkou vnitřní plnou výplň" msgid "" -"This option will auto detect narrow internal solid infill area. If enabled, concentric pattern will be " -"used for the area to speed printing up. Otherwise, rectilinear pattern is used defaultly." +"This option will auto detect narrow internal solid infill area. If enabled, " +"concentric pattern will be used for the area to speed printing up. " +"Otherwise, rectilinear pattern is used defaultly." msgstr "" -"Tato možnost automaticky rozpozná úzkou vnitřní plnou výplňovou oblast. Je-li povolena, bude pro oblast " -"použit soustředný vzor, aby se urychlil tisk. V opačném případě se ve výchozím nastavení použije " -"přímočarý vzor." +"Tato možnost automaticky rozpozná úzkou vnitřní plnou výplňovou oblast. Je-" +"li povolena, bude pro oblast použit soustředný vzor, aby se urychlil tisk. V " +"opačném případě se ve výchozím nastavení použije přímočarý vzor." msgid "invalid value " msgstr "neplatná hodnota " @@ -9977,7 +10779,8 @@ msgid "No check" msgstr "Žádná kontrola" msgid "Do not run any validity checks, such as gcode path conflicts check." -msgstr "Neprovádět žádné kontrolní testy, například kontrolu konfliktů cesty g-kódu." +msgstr "" +"Neprovádět žádné kontrolní testy, například kontrolu konfliktů cesty g-kódu." msgid "Normative check" msgstr "Normativní kontrola" @@ -10018,8 +10821,11 @@ msgstr "Počet opakování celého modelu" msgid "Ensure on bed" msgstr "Zajistit na podložce" -msgid "Lift the object above the bed when it is partially below. Disabled by default" -msgstr "Zvedněte objekt nad podložku, když je částečně pod ní. Výchozí stav je vypnutý" +msgid "" +"Lift the object above the bed when it is partially below. Disabled by default" +msgstr "" +"Zvedněte objekt nad podložku, když je částečně pod ní. Výchozí stav je " +"vypnutý" msgid "Convert Unit" msgstr "Převést jednotku" @@ -10072,18 +10878,23 @@ msgstr "Přeskočit některé objekty při tisku" msgid "load uptodate process/machine settings when using uptodate" msgstr "Načítat aktuální nastavení procesu/stroje při použití aktuálního" -msgid "load uptodate process/machine settings from the specified file when using uptodate" -msgstr "Načítat aktuální nastavení procesu/stroje ze zadaného souboru při použití aktuálního" +msgid "" +"load uptodate process/machine settings from the specified file when using " +"uptodate" +msgstr "" +"Načítat aktuální nastavení procesu/stroje ze zadaného souboru při použití " +"aktuálního" msgid "Data directory" msgstr "Složka Data" msgid "" -"Load and store settings at the given directory. This is useful for maintaining different profiles or " -"including configurations from a network storage." +"Load and store settings at the given directory. This is useful for " +"maintaining different profiles or including configurations from a network " +"storage." msgstr "" -"Načtěte a uložte nastavení z/do daného adresáře. To je užitečné pro udržování různých profilů nebo " -"konfigurací ze síťového úložiště." +"Načtěte a uložte nastavení z/do daného adresáře. To je užitečné pro " +"udržování různých profilů nebo konfigurací ze síťového úložiště." msgid "Output directory" msgstr "Výstupní adresář" @@ -10094,8 +10905,12 @@ msgstr "Výstupní adresář pro exportované soubory." msgid "Debug level" msgstr "Úroveň ladění" -msgid "Sets debug logging level. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:trace\n" -msgstr "Nastaví úroveň protokolování ladění. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:sledovat\n" +msgid "" +"Sets debug logging level. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" +"trace\n" +msgstr "" +"Nastaví úroveň protokolování ladění. 0:fatal, 1:error, 2:warning, 3:info, 4:" +"debug, 5:sledovat\n" msgid "Load custom gcode" msgstr "Načíst vlastní G-kód" @@ -10134,14 +10949,19 @@ msgid "large overhangs" msgstr "velké převisy" #, c-format, boost-format -msgid "It seems object %s has %s. Please re-orient the object or enable support generation." -msgstr "Zdá se, že objekt %s má %s. Změňte orientaci objektu nebo povolte generování podpěr." +msgid "" +"It seems object %s has %s. Please re-orient the object or enable support " +"generation." +msgstr "" +"Zdá se, že objekt %s má %s. Změňte orientaci objektu nebo povolte generování " +"podpěr." msgid "Optimizing toolpath" msgstr "Optimalizace dráhy nástroje" msgid "Empty layers around bottom are replaced by nearest normal layers." -msgstr "Prázdné vrstvy kolem dna jsou nahrazeny nejbližšími normálními vrstvami." +msgstr "" +"Prázdné vrstvy kolem dna jsou nahrazeny nejbližšími normálními vrstvami." msgid "The model has too many empty layers." msgstr "Model má příliš mnoho prázdných vrstev." @@ -10150,17 +10970,19 @@ msgid "Slicing mesh" msgstr "Slicování sítě" msgid "" -"No layers were detected. You might want to repair your STL file(s) or check their size or thickness and " -"retry.\n" +"No layers were detected. You might want to repair your STL file(s) or check " +"their size or thickness and retry.\n" msgstr "" -"Nebyly zjištěny žádné vrstvy. Možná budete chtít opravit své soubory STL nebo zkontrolovat jejich " -"velikost či tloušťku a zkusit to znovu.\n" +"Nebyly zjištěny žádné vrstvy. Možná budete chtít opravit své soubory STL " +"nebo zkontrolovat jejich velikost či tloušťku a zkusit to znovu.\n" msgid "" -"An object's XY size compensation will not be used because it is also color-painted.\n" +"An object's XY size compensation will not be used because it is also color-" +"painted.\n" "XY Size compensation can not be combined with color-painting." msgstr "" -"Kompenzace velikosti XY objektu nebude použita, protože je také barevně natřený.\n" +"Kompenzace velikosti XY objektu nebude použita, protože je také barevně " +"natřený.\n" "Korekci velikosti XY nelze kombinovat s barevnou malbou." #, c-format, boost-format @@ -10194,8 +11016,11 @@ msgstr "Podpěry: oprava děr ve vrstvě %d" msgid "Support: propagate branches at layer %d" msgstr "Podpěry: šíření větví na vrstvě %d" -msgid "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." -msgstr "Neznámý formát souboru. Vstupní soubor musí mít příponu .stl, .obj nebo .amf(.xml)" +msgid "" +"Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." +msgstr "" +"Neznámý formát souboru. Vstupní soubor musí mít příponu .stl, .obj nebo ." +"amf(.xml)" msgid "Loading of a model file failed." msgstr "Nahrávání souboru modelu selhalo." @@ -10204,7 +11029,8 @@ msgid "The supplied file couldn't be read because it's empty" msgstr "Nahraný soubor nemohl být načten, protože je prázdný" msgid "Unknown file format. Input file must have .3mf or .zip.amf extension." -msgstr "Neznámý formát souboru. Vstupní soubor musí mít příponu .3mf nebo .zip.amf." +msgstr "" +"Neznámý formát souboru. Vstupní soubor musí mít příponu .3mf nebo .zip.amf." msgid "Canceled" msgstr "Zrušeno" @@ -10263,7 +11089,8 @@ msgstr "Wiki" msgid "How to use calibration result?" msgstr "Jak použít výsledek kalibrace?" -msgid "You could change the Flow Dynamics Calibration Factor in material editing" +msgid "" +"You could change the Flow Dynamics Calibration Factor in material editing" msgstr "Můžete změnit faktor kalibrace dynamiky průtoku při úpravě materiálu" msgid "" @@ -10321,8 +11148,11 @@ msgstr "Název je stejný jako název jiné existující předvolby" msgid "create new preset failed." msgstr "Vytvoření nové předvolby selhalo." -msgid "Are you sure to cancel the current calibration and return to the home page?" -msgstr "Jste si jistí, že chcete zrušit aktuální kalibraci a vrátit se na domovskou stránku?" +msgid "" +"Are you sure to cancel the current calibration and return to the home page?" +msgstr "" +"Jste si jistí, že chcete zrušit aktuální kalibraci a vrátit se na domovskou " +"stránku?" msgid "No Printer Connected!" msgstr "Není připojena žádná tiskárna!" @@ -10355,25 +11185,29 @@ msgid "Flow rate calibration result has been saved to preset" msgstr "Výsledek kalibrace průtoku byl uložen do předvolby" msgid "Max volumetric speed calibration result has been saved to preset" -msgstr "Výsledek kalibrace maximální objemové rychlosti byl uložen do předvolby" +msgstr "" +"Výsledek kalibrace maximální objemové rychlosti byl uložen do předvolby" msgid "When do you need Flow Dynamics Calibration" msgstr "Kdy potřebujete kalibraci dynamiky průtoku" 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 use. You only need to do the calibration in the following " -"limited cases:\n" -"1. If you introduce a new filament of different brands/models or the filament is damp;\n" +"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 " +"use. You only need to do the calibration in the following limited cases:\n" +"1. If you introduce a new filament of different brands/models or the " +"filament is damp;\n" "2. if the nozzle is worn out or replaced with a new one;\n" -"3. If the max volumetric speed or print temperature is changed in the filament setting." +"3. If the max volumetric speed or print temperature is changed in the " +"filament setting." msgstr "" -"Nyní jsme přidali automatickou kalibraci pro různé filameny, která je plně automatizovaná a výsledek " -"bude uložen do tiskárny pro budoucí použití. Kalibraci musíte provést pouze v následujících omezených " -"případech:\n" +"Nyní jsme přidali automatickou kalibraci pro různé filameny, která je plně " +"automatizovaná a výsledek bude uložen do tiskárny pro budoucí použití. " +"Kalibraci musíte provést pouze v následujících omezených případech:\n" "1. Pokud použijete nový filament jiné značky/modelu nebo je filament vlhký;\n" "2. Pokud je tryska opotřebená nebo nahrazena novou;\n" -"3. Pokud je maximální objemová rychlost nebo tisková teplota změněna v nastavení filamentu." +"3. Pokud je maximální objemová rychlost nebo tisková teplota změněna v " +"nastavení filamentu." msgid "About this calibration" msgstr "O této kalibraci" @@ -10381,103 +11215,123 @@ msgstr "O této kalibraci" msgid "" "Please find the details of Flow Dynamics Calibration from our wiki.\n" "\n" -"Usually the calibration is unnecessary. When you start a single color/material print, with the \"flow " -"dynamics calibration\" option checked in the print start menu, the printer will follow the old way, " -"calibrate the filament before the print; When you start a multi color/material print, the printer will " -"use the default compensation parameter for the filament during every filament switch which will have a " -"good result in most cases.\n" +"Usually the calibration is unnecessary. When you start a single color/" +"material print, with the \"flow dynamics calibration\" option checked in the " +"print start menu, the printer will follow the old way, calibrate the " +"filament before the print; When you start a multi color/material print, the " +"printer will use the default compensation parameter for the filament during " +"every filament switch which will have a good result in most cases.\n" "\n" -"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" +"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" "\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 still investigating the root cause to do improvements with new " -"updates." +"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 still " +"investigating the root cause to do improvements with new updates." msgstr "" "Najdete podrobnosti o kalibraci průtoku dynamiky v naší wiki.\n" "\n" -"Obvykle kalibrace není potřebná. Při spuštění tisku s jednobarevným/materiálovým filamentem a " -"zaškrtnutou volbou \"kalibrace průtoku dynamiky\" v menu spuštění tisku, tiskárna bude postupovat podle " -"staré metody a zkalibruje filament před tiskem. Při spuštění tisku s vícebarevným/materiálovým " -"filamentem bude tiskárna při každé změně filamentu používat výchozí kompenzační parametr pro filament, " -"což má většinou dobrý výsledek.\n" +"Obvykle kalibrace není potřebná. Při spuštění tisku s jednobarevným/" +"materiálovým filamentem a zaškrtnutou volbou \"kalibrace průtoku dynamiky\" " +"v menu spuštění tisku, tiskárna bude postupovat podle staré metody a " +"zkalibruje filament před tiskem. Při spuštění tisku s vícebarevným/" +"materiálovým filamentem bude tiskárna při každé změně filamentu používat " +"výchozí kompenzační parametr pro filament, což má většinou dobrý výsledek.\n" "\n" -"Všimněte si, že existují některé případy, které mohou způsobit, že výsledek kalibrace nebude spolehlivý: " -"použití texturované podložky pro kalibraci; podložka nemá dobrou adhezi (prosím umyjte podložku nebo " -"naneste lepidlo!) ... Více informací najdete v naší wiki.\n" +"Všimněte si, že existují některé případy, které mohou způsobit, že výsledek " +"kalibrace nebude spolehlivý: použití texturované podložky pro kalibraci; " +"podložka nemá dobrou adhezi (prosím umyjte podložku nebo naneste " +"lepidlo!) ... Více informací najdete v naší wiki.\n" "\n" -"Výsledky kalibrace mají v našich testech asi 10% fluktuaci, což může způsobit, že výsledek nebude přesně " -"stejný u každé kalibrace. Stále zkoumáme kořenovou příčinu, abychom mohli provést zlepšení v nových " -"aktualizacích." +"Výsledky kalibrace mají v našich testech asi 10% fluktuaci, což může " +"způsobit, že výsledek nebude přesně stejný u každé kalibrace. Stále zkoumáme " +"kořenovou příčinu, abychom mohli provést zlepšení v nových aktualizacích." msgid "When to use Flow Rate Calibration" msgstr "Kdy použít kalibraci průtoku" msgid "" -"After using Flow Dynamics Calibration, there might still be some extrusion issues, such as:\n" -"1. Over-Extrusion: Excess material on your printed object, forming blobs or zits, or the layers seem " -"thicker than expected and not uniform.\n" -"2. Under-Extrusion: Very thin layers, weak infill strength, or gaps in the top layer of the model, even " -"when printing slowly.\n" +"After using Flow Dynamics Calibration, there might still be some extrusion " +"issues, such as:\n" +"1. Over-Extrusion: Excess material on your printed object, forming blobs or " +"zits, or the layers seem thicker than expected and not uniform.\n" +"2. Under-Extrusion: Very thin layers, weak infill strength, or gaps in the " +"top layer of the model, even when printing slowly.\n" "3. Poor Surface Quality: The surface of your prints seems rough or uneven.\n" -"4. Weak Structural Integrity: Prints break easily or don't seem as sturdy as they should be." -msgstr "" -"Použitím kalibrace průtoku dynamiky se mohou stále objevit některé problémy s extruzí, jako například:\n" -"1. Přeextruze: Přebytečný materiál na vašem tištěném objektu, vytváření bobrů nebo pupínků nebo se zdá, " -"že vrstvy jsou tlustší než je očekáváno a nejsou rovnoměrné.\n" -"2. Nedostatečná extruze: Velmi tenké vrstvy, slabá pevnost výplně nebo mezery na horní vrstvě modelu, i " -"když tisknete pomalu.\n" -"3. Slabá kvalita povrchu: Povrch vašich výtisků se zdá být drsný nebo nevyrovnaný.\n" -"4. Slabá strukturální integrita: Výtisky se snadno lámají nebo se nezdají být tak odolné, jak by měly " -"být." - -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 calibration provides a useful reference flow rate." -msgstr "" -"Kromě toho je kalibrace průtoku klíčová pro pěnové materiály, jako je LW-PLA používaný u modelů RC " -"letadel. Tyto materiály se při zahřátí výrazně rozšiřují a kalibrace poskytuje užitečný referenční " -"průtok." - -msgid "" -"Flow Rate Calibration measures the ratio of expected to actual extrusion volumes. The default setting " -"works well in Bambu Lab printers and official filaments as they were pre-calibrated and fine-tuned. For " -"a regular filament, you usually won't need to perform a Flow Rate Calibration unless you still see the " -"listed defects after you have done other calibrations. For more details, please check out the wiki " -"article." -msgstr "" -"Kalibrace průtoku měří poměr očekávaných a skutečných objemů extruze. Výchozí nastavení dobře funguje u " -"tiskáren Bambu Lab a oficiálních filamentů, protože byly předem zkalibrovány a jemně vyladěny. Pro běžný " -"filament obvykle nebudete potřebovat provádět kalibraci průtoku, pokud po provedení jiných kalibrací " -"stále vidíte uvedené nedostatky. Pro více informací se podívejte do článku na naší wiki." - -msgid "" -"Auto Flow Rate Calibration utilizes Bambu Lab's Micro-Lidar technology, directly measuring the " -"calibration patterns. However, please be advised that the efficacy and accuracy of this method may be " -"compromised with specific types of materials. Particularly, filaments that are transparent or semi-" -"transparent, sparkling-particled, or have a high-reflective finish may not be suitable for this " -"calibration and can produce less-than-desirable results.\n" +"4. Weak Structural Integrity: Prints break easily or don't seem as sturdy as " +"they should be." +msgstr "" +"Použitím kalibrace průtoku dynamiky se mohou stále objevit některé problémy " +"s extruzí, jako například:\n" +"1. Přeextruze: Přebytečný materiál na vašem tištěném objektu, vytváření " +"bobrů nebo pupínků nebo se zdá, že vrstvy jsou tlustší než je očekáváno a " +"nejsou rovnoměrné.\n" +"2. Nedostatečná extruze: Velmi tenké vrstvy, slabá pevnost výplně nebo " +"mezery na horní vrstvě modelu, i když tisknete pomalu.\n" +"3. Slabá kvalita povrchu: Povrch vašich výtisků se zdá být drsný nebo " +"nevyrovnaný.\n" +"4. Slabá strukturální integrita: Výtisky se snadno lámají nebo se nezdají " +"být tak odolné, jak by měly být." + +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 " +"calibration provides a useful reference flow rate." +msgstr "" +"Kromě toho je kalibrace průtoku klíčová pro pěnové materiály, jako je LW-PLA " +"používaný u modelů RC letadel. Tyto materiály se při zahřátí výrazně " +"rozšiřují a kalibrace poskytuje užitečný referenční průtok." + +msgid "" +"Flow Rate Calibration measures the ratio of expected to actual extrusion " +"volumes. The default setting works well in Bambu Lab printers and official " +"filaments as they were pre-calibrated and fine-tuned. For a regular " +"filament, you usually won't need to perform a Flow Rate Calibration unless " +"you still see the listed defects after you have done other calibrations. For " +"more details, please check out the wiki article." +msgstr "" +"Kalibrace průtoku měří poměr očekávaných a skutečných objemů extruze. " +"Výchozí nastavení dobře funguje u tiskáren Bambu Lab a oficiálních " +"filamentů, protože byly předem zkalibrovány a jemně vyladěny. Pro běžný " +"filament obvykle nebudete potřebovat provádět kalibraci průtoku, pokud po " +"provedení jiných kalibrací stále vidíte uvedené nedostatky. Pro více " +"informací se podívejte do článku na naší wiki." + +msgid "" +"Auto Flow Rate Calibration utilizes Bambu Lab's Micro-Lidar technology, " +"directly measuring the calibration patterns. However, please be advised that " +"the efficacy and accuracy of this method may be compromised with specific " +"types of materials. Particularly, filaments that are transparent or semi-" +"transparent, sparkling-particled, or have a high-reflective finish may not " +"be suitable for this calibration and can produce less-than-desirable " +"results.\n" "\n" -"The calibration results may vary between each calibration or filament. We are still improving the " -"accuracy and compatibility of this calibration through firmware updates over time.\n" +"The calibration results may vary between each calibration or filament. We " +"are still improving the accuracy and compatibility of this calibration " +"through firmware updates over time.\n" "\n" -"Caution: Flow Rate Calibration is an advanced process, to be attempted only by those who fully " -"understand its purpose and implications. Incorrect usage can lead to sub-par prints or printer damage. " -"Please make sure to carefully read and understand the process before doing it." -msgstr "" -"Automatizovaná kalibrace průtoku využívá Mikro-Lidar technologii Bambu Lab, která přímo měří kalibrační " -"vzory. Nicméně, mějte na paměti, že účinnost a přesnost této metody mohou být ovlivněny určitými typy " -"materiálů. Zejména filamenty, které jsou průhledné nebo poloprůhledné, s jiskřícími částicemi nebo s " -"vysokým odrazivým povrchem, nemusí být vhodné pro tuto kalibraci a mohou produkovat méně než optimální " -"výsledky.\n" +"Caution: Flow Rate Calibration is an advanced process, to be attempted only " +"by those who fully understand its purpose and implications. Incorrect usage " +"can lead to sub-par prints or printer damage. Please make sure to carefully " +"read and understand the process before doing it." +msgstr "" +"Automatizovaná kalibrace průtoku využívá Mikro-Lidar technologii Bambu Lab, " +"která přímo měří kalibrační vzory. Nicméně, mějte na paměti, že účinnost a " +"přesnost této metody mohou být ovlivněny určitými typy materiálů. Zejména " +"filamenty, které jsou průhledné nebo poloprůhledné, s jiskřícími částicemi " +"nebo s vysokým odrazivým povrchem, nemusí být vhodné pro tuto kalibraci a " +"mohou produkovat méně než optimální výsledky.\n" "\n" -"Výsledky kalibrace se mohou lišit mezi jednotlivými kalibracemi nebo filamenty. Nadále zlepšujeme " -"přesnost a kompatibilitu této kalibrace pomocí aktualizací firmwaru.\n" +"Výsledky kalibrace se mohou lišit mezi jednotlivými kalibracemi nebo " +"filamenty. Nadále zlepšujeme přesnost a kompatibilitu této kalibrace pomocí " +"aktualizací firmwaru.\n" "\n" -"Pozor: Kalibrace průtoku je pokročilý proces, který by měl být prováděn pouze těmi, kteří plně rozumí " -"jejímu účelu a důsledkům. Nesprávné použití může vést k nepovedeným tiskům nebo poškození tiskárny. Před " -"provedením kalibrace si pečlivě přečtěte a porozumějte procesu." +"Pozor: Kalibrace průtoku je pokročilý proces, který by měl být prováděn " +"pouze těmi, kteří plně rozumí jejímu účelu a důsledkům. Nesprávné použití " +"může vést k nepovedeným tiskům nebo poškození tiskárny. Před provedením " +"kalibrace si pečlivě přečtěte a porozumějte procesu." msgid "When you need Max Volumetric Speed Calibration" msgstr "Kdy potřebujete kalibraci maximální objemové rychlosti" @@ -10498,30 +11352,38 @@ msgid "We found the best Flow Dynamics Calibration Factor" msgstr "Našli jsme nejlepší kalibrační faktor pro průtok" msgid "" -"Part of the calibration failed! You may clean the plate and retry. The failed test result would be " -"dropped." +"Part of the calibration failed! You may clean the plate and retry. The " +"failed test result would be dropped." msgstr "" -"Část kalibrace selhala! Můžete podložku vyčistit a zkusit to znovu. Selhání testovacího výsledku bude " -"zahozeno." +"Část kalibrace selhala! Můžete podložku vyčistit a zkusit to znovu. Selhání " +"testovacího výsledku bude zahozeno." -msgid "*We recommend you to add brand, materia, type, and even humidity level in the Name" -msgstr "*Doporučujeme přidat do názvu také značku, materiál, typ a dokonce i úroveň vlhkosti" +msgid "" +"*We recommend you to add brand, materia, type, and even humidity level in " +"the Name" +msgstr "" +"*Doporučujeme přidat do názvu také značku, materiál, typ a dokonce i úroveň " +"vlhkosti" msgid "Failed" msgstr "Selhalo" msgid "" -"Only one of the results with the same name will be saved. Are you sure you want to overrides the other " -"results?" -msgstr "Bude uložen pouze jeden z výsledků se stejným názvem. Opravdu chcete přepsat ostatní výsledky?" +"Only one of the results with the same name will be saved. Are you sure you " +"want to overrides the other results?" +msgstr "" +"Bude uložen pouze jeden z výsledků se stejným názvem. Opravdu chcete přepsat " +"ostatní výsledky?" #, 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 want to overrides the historical result?" +"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 want " +"to overrides the historical result?" msgstr "" -"Už existuje historický kalibrační výsledek se stejným názvem: %s. Bude uložen pouze jeden z výsledků se " -"stejným názvem. Opravdu chcete přepsat historický výsledek?" +"Už existuje historický kalibrační výsledek se stejným názvem: %s. Bude " +"uložen pouze jeden z výsledků se stejným názvem. Opravdu chcete přepsat " +"historický výsledek?" msgid "Please find the best line on your plate" msgstr "Najděte nejlepší linku na své podložce" @@ -10594,11 +11456,11 @@ msgid "Title" msgstr "Název" msgid "" -"A test model will be printed. Please clear the build plate and place it back to the hot bed before " -"calibration." +"A test model will be printed. Please clear the build plate and place it back " +"to the hot bed before calibration." msgstr "" -"Bude proveden tisk testovacího modelu. Před kalibrací prosím vyčistěte stavební podložku a umístěte ji " -"zpět na vyhřívaný podstavec." +"Bude proveden tisk testovacího modelu. Před kalibrací prosím vyčistěte " +"stavební podložku a umístěte ji zpět na vyhřívaný podstavec." msgid "Printing Parameters" msgstr "Parametry tisku" @@ -10628,7 +11490,8 @@ msgid "" msgstr "" "Tipy na kalibrační materiál: \n" "- Materiály, které mohou sdílet stejnou teplotu podložky\n" -"- Různá značka a skupina filamentu (Značka = Bambu, Skupina = Základní, Matný)" +"- Různá značka a skupina filamentu (Značka = Bambu, Skupina = Základní, " +"Matný)" msgid "Error desc" msgstr "Popis chyby" @@ -10978,8 +11841,12 @@ msgstr "Úspěch!" msgid "Refresh Printers" msgstr "Obnovit tiskárny" -msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate." -msgstr "Soubor HTTPS CA je volitelný. Je nutný pouze pokud použijte HTTPS certifikát s vlastním podpisem." +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"Soubor HTTPS CA je volitelný. Je nutný pouze pokud použijte HTTPS certifikát " +"s vlastním podpisem." msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "Soubory s certifikátem (*.crt, *.pem)|*.crt;*.pem|Všechny soubory|*.*" @@ -10988,23 +11855,34 @@ msgid "Open CA certificate file" msgstr "Otevřít soubor s certifikátem CA" #, c-format, boost-format -msgid "On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain." -msgstr "V tomto systému používá %s certifikáty HTTPS ze systému Certificate Store nebo Keychain." +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" +"V tomto systému používá %s certifikáty HTTPS ze systému Certificate Store " +"nebo Keychain." -msgid "To use a custom CA file, please import your CA file into Certificate Store / Keychain." -msgstr "Chcete-li použít vlastní soubor CA, importujte soubor CA do Certificate Store / Keychain." +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" +"Chcete-li použít vlastní soubor CA, importujte soubor CA do Certificate " +"Store / Keychain." msgid "Connection to printers connected via the print host failed." -msgstr "Připojení k tiskárnám připojených prostřednictvím tiskového serveru se nezdařilo." +msgstr "" +"Připojení k tiskárnám připojených prostřednictvím tiskového serveru se " +"nezdařilo." msgid "The start, end or step is not valid value." msgstr "Počáteční, koncová nebo kroková hodnota není platná." msgid "" -"Unable to calibrate: maybe because the set calibration value range is too large, or the step is too small" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" msgstr "" -"Nelze provést kalibraci: možná je rozsah kalibračních hodnot nastaven příliš velký nebo krok je příliš " -"malý" +"Nelze provést kalibraci: možná je rozsah kalibračních hodnot nastaven příliš " +"velký nebo krok je příliš malý" msgid "Need select printer" msgstr "Je nutné vybrat tiskárnu" @@ -11012,27 +11890,32 @@ msgstr "Je nutné vybrat tiskárnu" #: resources/data/hints.ini: [hint:3D Scene Operations] msgid "" "3D Scene Operations\n" -"Did you know how to control view and object/part selection with mouse and touchpanel in the 3D scene?" +"Did you know how to control view and object/part selection with mouse and " +"touchpanel in the 3D scene?" msgstr "" "Operace v 3D scéně\n" -"Věděli jste, že můžete ovládat zobrazení a výběr objektů nebo částí pomocí myši a dotykového panelu v 3D " -"scéně?" +"Věděli jste, že můžete ovládat zobrazení a výběr objektů nebo částí pomocí " +"myši a dotykového panelu v 3D scéně?" #: resources/data/hints.ini: [hint:Cut Tool] msgid "" "Cut Tool\n" -"Did you know that you can cut a model at any angle and position with the cutting tool?" +"Did you know that you can cut a model at any angle and position with the " +"cutting tool?" msgstr "" "Nástroj pro řezání\n" -"Věděli jste, že můžete pomocí řezacího nástroje provádět řezy modelu pod různými úhly a pozicemi?" +"Věděli jste, že můžete pomocí řezacího nástroje provádět řezy modelu pod " +"různými úhly a pozicemi?" #: resources/data/hints.ini: [hint:Fix Model] msgid "" "Fix Model\n" -"Did you know that you can fix a corrupted 3D model to avoid a lot of slicing problems?" +"Did you know that you can fix a corrupted 3D model to avoid a lot of slicing " +"problems?" msgstr "" "Opravit model\n" -"Věděli jste, že můžete opravit poškozený 3D model a vyhnout se tak mnoha problémům při slicování?" +"Věděli jste, že můžete opravit poškozený 3D model a vyhnout se tak mnoha " +"problémům při slicování?" #: resources/data/hints.ini: [hint:Timelapse] msgid "" @@ -11048,171 +11931,202 @@ msgid "" "Did you know that you can auto-arrange all objects in your project?" msgstr "" "Automatické uspořádání\n" -"Věděli jste, že můžete automaticky uspořádat všechny objekty ve vašem projektu?" +"Věděli jste, že můžete automaticky uspořádat všechny objekty ve vašem " +"projektu?" #: resources/data/hints.ini: [hint:Auto-Orient] msgid "" "Auto-Orient\n" -"Did you know that you can rotate objects to an optimal orientation for printing by a simple click?" +"Did you know that you can rotate objects to an optimal orientation for " +"printing by a simple click?" msgstr "" "Automatická Orientace\n" -"Věděli jste, že můžete pomocí jednoho kliknutí otočit objekty do optimálního natočení pro tisk?" +"Věděli jste, že můžete pomocí jednoho kliknutí otočit objekty do optimálního " +"natočení pro tisk?" #: resources/data/hints.ini: [hint:Lay on Face] msgid "" "Lay on Face\n" -"Did you know that you can quickly orient a model so that one of its faces sits on the print bed? Select " -"the \"Place on face\" function or press the F key." +"Did you know that you can quickly orient a model so that one of its faces " +"sits on the print bed? Select the \"Place on face\" function or press the " +"F key." msgstr "" "Plochou na podložku\n" -"Věděli jste, že můžete rychle nastavit orientaci modelu tak, aby jedna z jeho stěn spočívala na tiskovém " -"podloží? Vyberte funkci \"Plochou na podložku\" nebo stiskněte klávesu F." +"Věděli jste, že můžete rychle nastavit orientaci modelu tak, aby jedna z " +"jeho stěn spočívala na tiskovém podloží? Vyberte funkci \"Plochou na podložku" +"\" nebo stiskněte klávesu F." #: resources/data/hints.ini: [hint:Object List] msgid "" "Object List\n" -"Did you know that you can view all objects/parts in a list and change settings for each object/part?" +"Did you know that you can view all objects/parts in a list and change " +"settings for each object/part?" msgstr "" "Seznam objektů\n" -"Věděli jste, že si můžete zobrazit všechny objekty/části v seznamu a upravit nastavení pro každý objekt/" -"část zvlášť?" +"Věděli jste, že si můžete zobrazit všechny objekty/části v seznamu a upravit " +"nastavení pro každý objekt/část zvlášť?" #: resources/data/hints.ini: [hint:Simplify Model] msgid "" "Simplify Model\n" -"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. Read more in the documentation." +"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. Read " +"more in the documentation." msgstr "" "Zjednodušit model\n" -"Věděli jste, že můžete snížit počet trojúhelníků v síti pomocí funkce Zjednodušit síť? Klikněte pravým " -"tlačítkem na model a vyberte možnost Zjednodušit model. Více informací najdete v dokumentaci." +"Věděli jste, že můžete snížit počet trojúhelníků v síti pomocí funkce " +"Zjednodušit síť? Klikněte pravým tlačítkem na model a vyberte možnost " +"Zjednodušit model. Více informací najdete v dokumentaci." #: resources/data/hints.ini: [hint:Slicing Parameter Table] 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?" +"Did you know that you can view all objects/parts on a table and change " +"settings for each object/part?" msgstr "" "Tabulka parametrů pro Slicování\n" -"Věděli jste, že můžete zobrazit všechny objekty/části v tabulce a změnit nastavení pro každý objekt/část?" +"Věděli jste, že můžete zobrazit všechny objekty/části v tabulce a změnit " +"nastavení pro každý objekt/část?" #: resources/data/hints.ini: [hint:Split to Objects/Parts] msgid "" "Split to Objects/Parts\n" -"Did you know that you can split a big object into small ones for easy colorizing or printing?" +"Did you know that you can split a big object into small ones for easy " +"colorizing or printing?" msgstr "" "Rozdělit na objekty/části\n" -"Věděli jste, že můžete rozdělit velký objekt na menší části pro snadné barevné zpracování nebo tisk?" +"Věděli jste, že můžete rozdělit velký objekt na menší části pro snadné " +"barevné zpracování nebo tisk?" #: resources/data/hints.ini: [hint:Subtract a Part] msgid "" "Subtract a Part\n" -"Did you know that you can subtract one mesh from another using the Negative part modifier? That way you " -"can, for example, create easily resizable holes directly in Orca Slicer. Read more in the documentation." +"Did you know that you can subtract one mesh from another using the Negative " +"part modifier? That way you can, for example, create easily resizable holes " +"directly in Orca Slicer. Read more in the documentation." msgstr "" "Odečíst část\n" -"Věděli jste, že můžete odečíst jednu síťovinu od druhé pomocí negativního modifikátoru části? Tímto " -"způsobem můžete například vytvářet snadno nastavitelné otvory přímo v programu Orca Slicer. Přečtěte si " -"více v dokumentaci." +"Věděli jste, že můžete odečíst jednu síťovinu od druhé pomocí negativního " +"modifikátoru části? Tímto způsobem můžete například vytvářet snadno " +"nastavitelné otvory přímo v programu Orca Slicer. Přečtěte si více v " +"dokumentaci." #: resources/data/hints.ini: [hint:STEP] msgid "" "STEP\n" -"Did you know that you can improve your print quality by slicing a STEP file instead of an STL?\n" -"Orca Slicer supports slicing STEP files, providing smoother results than a lower resolution STL. Give it " -"a try!" +"Did you know that you can improve your print quality by slicing a STEP file " +"instead of an STL?\n" +"Orca Slicer supports slicing STEP files, providing smoother results than a " +"lower resolution STL. Give it a try!" msgstr "" "STEP\n" -"Věděli jste, že můžete zlepšit kvalitu svého tisku tím, že rozdělíte soubor STEP namísto STL?\n" -"Orca Slicer podporuje rozdělování souborů STEP, což poskytuje hladší výsledky než s nižším rozlišením " -"STL. Vyzkoušejte to!" +"Věděli jste, že můžete zlepšit kvalitu svého tisku tím, že rozdělíte soubor " +"STEP namísto STL?\n" +"Orca Slicer podporuje rozdělování souborů STEP, což poskytuje hladší " +"výsledky než s nižším rozlišením STL. Vyzkoušejte to!" #: resources/data/hints.ini: [hint:Z seam location] msgid "" "Z seam location\n" -"Did you know that you can customize the location of the Z seam, and even paint it on your print, to have " -"it in a less visible location? This improves the overall look of your model. Check it out!" +"Did you know that you can customize the location of the Z seam, and even " +"paint it on your print, to have it in a less visible location? This improves " +"the overall look of your model. Check it out!" msgstr "" "Z poloha švu\n" -"Věděli jste, že můžete přizpůsobit umístění Z spoje a dokonce ho na svém tisku namalovat, aby byl ve " -"méně viditelné poloze? Tím se zlepší celkový vzhled vašeho modelu. Podívejte se na to!" +"Věděli jste, že můžete přizpůsobit umístění Z spoje a dokonce ho na svém " +"tisku namalovat, aby byl ve méně viditelné poloze? Tím se zlepší celkový " +"vzhled vašeho modelu. Podívejte se na to!" #: resources/data/hints.ini: [hint:Fine-tuning for flow rate] msgid "" "Fine-tuning for flow rate\n" -"Did you know that flow rate can be fine-tuned for even better-looking prints? Depending on the material, " -"you can improve the overall finish of the printed model by doing some fine-tuning." +"Did you know that flow rate can be fine-tuned for even better-looking " +"prints? Depending on the material, you can improve the overall finish of the " +"printed model by doing some fine-tuning." msgstr "" "Jemné doladění pro rychlost průtoku\n" -"Věděli jste, že průtokovou rychlost lze jemně doladit pro ještě lepší vzhled tisku? V závislosti na " -"materiálu můžete zlepšit celkový povrch tištěného modelu pomocí drobného doladění." +"Věděli jste, že průtokovou rychlost lze jemně doladit pro ještě lepší vzhled " +"tisku? V závislosti na materiálu můžete zlepšit celkový povrch tištěného " +"modelu pomocí drobného doladění." #: resources/data/hints.ini: [hint:Split your prints into plates] msgid "" "Split your prints into plates\n" -"Did you know that you can split a model that has a lot of parts into individual plates ready to print? " -"This will simplify the process of keeping track of all the parts." +"Did you know that you can split a model that has a lot of parts into " +"individual plates ready to print? This will simplify the process of keeping " +"track of all the parts." msgstr "" "Rozdělte své tisky na podložky\n" -"Věděli jste, že můžete rozdělit model s mnoha díly na jednotlivé podložky připravené k tisku? Tímto " -"zjednodušíte proces sledování všech dílů." +"Věděli jste, že můžete rozdělit model s mnoha díly na jednotlivé podložky " +"připravené k tisku? Tímto zjednodušíte proces sledování všech dílů." -#: resources/data/hints.ini: [hint:Speed up your print with Adaptive Layer Height] +#: resources/data/hints.ini: [hint:Speed up your print with Adaptive Layer +#: Height] msgid "" "Speed up your print with Adaptive Layer Height\n" -"Did you know that you can print a model even faster, by using the Adaptive Layer Height option? Check it " -"out!" +"Did you know that you can print a model even faster, by using the Adaptive " +"Layer Height option? Check it out!" msgstr "" "Zrychlete svůj 3D tisk pomocí adaptivní výšky vrstvy\n" -"Věděli jste, že můžete ještě rychleji vytisknout své 3D modely pomocí možnosti adaptivní výšky vrstvy? " -"Tímto způsobem dosáhnete zkrácení celkového času tisku!" +"Věděli jste, že můžete ještě rychleji vytisknout své 3D modely pomocí " +"možnosti adaptivní výšky vrstvy? Tímto způsobem dosáhnete zkrácení celkového " +"času tisku!" #: resources/data/hints.ini: [hint:Support painting] msgid "" "Support painting\n" -"Did you know that you can paint the location of your supports? This feature makes it easy to place the " -"support material only on the sections of the model that actually need it." +"Did you know that you can paint the location of your supports? This feature " +"makes it easy to place the support material only on the sections of the " +"model that actually need it." msgstr "" "Malování podpěr\n" -"Věděli jste, že můžete malovat umístění podpěr? Tato funkce umožňuje snadné umístění podpůrného " -"materiálu pouze na části modelu, které ho skutečně potřebují." +"Věděli jste, že můžete malovat umístění podpěr? Tato funkce umožňuje snadné " +"umístění podpůrného materiálu pouze na části modelu, které ho skutečně " +"potřebují." #: resources/data/hints.ini: [hint:Different types of supports] msgid "" "Different types of supports\n" -"Did you know that you can choose from multiple types of supports? Tree supports work great for organic " -"models, while saving filament and improving print speed. Check them out!" +"Did you know that you can choose from multiple types of supports? Tree " +"supports work great for organic models, while saving filament and improving " +"print speed. Check them out!" msgstr "" "Různé typy podpěr\n" -"Věděli jste, že můžete vybírat z různých typů podpěr? Stromové podpěry se skvěle hodí pro organické " -"modely a zároveň šetří filament a zlepšuje rychlost tisku. Podívejte se na ně!" +"Věděli jste, že můžete vybírat z různých typů podpěr? Stromové podpěry se " +"skvěle hodí pro organické modely a zároveň šetří filament a zlepšuje " +"rychlost tisku. Podívejte se na ně!" #: resources/data/hints.ini: [hint:Printing Silk Filament] msgid "" "Printing Silk Filament\n" -"Did you know that Silk filament needs special consideration to print it successfully? Higher temperature " -"and lower speed are always recommended for the best results." +"Did you know that Silk filament needs special consideration to print it " +"successfully? Higher temperature and lower speed are always recommended for " +"the best results." msgstr "" "Tisk hedvábného filamentu\n" -"Věděli jste, že tisk hedvábného filamentu vyžaduje zvláštní zvážení pro úspěšné provedení? Vždy se " -"doporučuje vyšší teplota a nižší rychlost pro dosažení nejlepších výsledků." +"Věděli jste, že tisk hedvábného filamentu vyžaduje zvláštní zvážení pro " +"úspěšné provedení? Vždy se doporučuje vyšší teplota a nižší rychlost pro " +"dosažení nejlepších výsledků." #: resources/data/hints.ini: [hint:Brim for better adhesion] msgid "" "Brim for better adhesion\n" -"Did you know that when printing models have a small contact interface with the printing surface, it's " -"recommended to use a brim?" +"Did you know that when printing models have a small contact interface with " +"the printing surface, it's recommended to use a brim?" msgstr "" "Límec pro lepší přilnavost\n" -"Věděli jste, že při tisku modelů s malým kontaktním rozhraním s tiskovou plochou se doporučuje použití " -"Límce (brim)?" +"Věděli jste, že při tisku modelů s malým kontaktním rozhraním s tiskovou " +"plochou se doporučuje použití Límce (brim)?" #: resources/data/hints.ini: [hint:Set parameters for multiple objects] msgid "" "Set parameters for multiple objects\n" -"Did you know that you can set slicing parameters for all selected objects at one time?" +"Did you know that you can set slicing parameters for all selected objects at " +"one time?" msgstr "" "Nastavte parametry pro více objektů\n" -"Věděli jste, že můžete najednou nastavit parametry pro všechny vybrané objekty?" +"Věděli jste, že můžete najednou nastavit parametry pro všechny vybrané " +"objekty?" #: resources/data/hints.ini: [hint:Stack objects] msgid "" @@ -11225,22 +12139,22 @@ msgstr "" #: resources/data/hints.ini: [hint:Flush into support/objects/infill] msgid "" "Flush into support/objects/infill\n" -"Did you know that you can save the wasted filament by flushing them into support/objects/infill during " -"filament change?" +"Did you know that you can save the wasted filament by flushing them into " +"support/objects/infill during filament change?" msgstr "" "Čištit do podpěr/objektů/výplně\n" -"Věděli jste, že můžete ušetřit zahozené filamenty tím, že je očistíte do podpěr/objektů/výplně během " -"výměny filamentu?" +"Věděli jste, že můžete ušetřit zahozené filamenty tím, že je očistíte do " +"podpěr/objektů/výplně během výměny filamentu?" #: resources/data/hints.ini: [hint:Improve strength] msgid "" "Improve strength\n" -"Did you know that you can use more wall loops and higher sparse infill density to improve the strength " -"of the model?" +"Did you know that you can use more wall loops and higher sparse infill " +"density to improve the strength of the model?" msgstr "" "Zvýšení pevnosti\n" -"Věděli jste, že můžete použít více opakování stěn a vyšší hustotu řídké výplně pro zvýšení pevnosti " -"modelu?" +"Věděli jste, že můžete použít více opakování stěn a vyšší hustotu řídké " +"výplně pro zvýšení pevnosti modelu?" #~ msgid "Cali" #~ msgstr "Kalibrace" @@ -11253,24 +12167,25 @@ msgstr "" #, c-format, boost-format #~ msgid "" -#~ "Bed temperature of other layer is lower than bed temperature of initial layer for more than %d degree " -#~ "centigrade.\n" +#~ "Bed temperature of other layer is lower than bed temperature of initial " +#~ "layer for more than %d degree centigrade.\n" #~ "This may cause model broken free from build plate during printing" #~ msgstr "" -#~ "Teplota podložky ostatních vrstev je nižší než teplota podložky první vrstvy o více než %d stupňů " -#~ "Celsia.\n" +#~ "Teplota podložky ostatních vrstev je nižší než teplota podložky první " +#~ "vrstvy o více než %d stupňů Celsia.\n" #~ "To může způsobit, že se modely během tisku uvolní z podložky" #~ msgid "" -#~ "Bed temperature is higher than vitrification temperature of this filament.\n" +#~ "Bed temperature is higher than vitrification temperature of this " +#~ "filament.\n" #~ "This may cause nozzle blocked and printing failure\n" -#~ "Please keep the printer open during the printing process to ensure air circulation or reduce the " -#~ "temperature of the hot bed" +#~ "Please keep the printer open during the printing process to ensure air " +#~ "circulation or reduce the temperature of the hot bed" #~ msgstr "" #~ "Teplota podložky je vyšší než teplota vitrifikace tohoto filamentu.\n" #~ "To může způsobit ucpání trysky a selhání tisku\n" -#~ "Nechte tiskárnu během procesu tisku otevřenou, abyste zajistili cirkulaci vzduchu nebo snížení " -#~ "teploty podložky" +#~ "Nechte tiskárnu během procesu tisku otevřenou, abyste zajistili cirkulaci " +#~ "vzduchu nebo snížení teploty podložky" #~ msgid "Total Time Estimation" #~ msgstr "Celkový odhad času" @@ -11303,42 +12218,47 @@ msgstr "" #~ msgstr "High Temp Podložka" #~ msgid "" -#~ "Bed temperature when high temperature plate is installed. Value 0 means the filament does not support " -#~ "to print on the High Temp Plate" +#~ "Bed temperature when high temperature plate is installed. Value 0 means " +#~ "the filament does not support to print on the High Temp Plate" #~ msgstr "" -#~ "Toto je teplota podložky, když je instalována konstrukční podložka. Hodnota 0 znamená, že filament " -#~ "nepodporuje tisk na High Temp Podložku" +#~ "Toto je teplota podložky, když je instalována konstrukční podložka. " +#~ "Hodnota 0 znamená, že filament nepodporuje tisk na High Temp Podložku" #~ msgid "Internal bridge support thickness" #~ msgstr "Tloušťka vnitřní podpěry mostu" #~ msgid "" -#~ "If enabled, support loops will be generated under the contours of internal bridges.These support " -#~ "loops could prevent internal bridges from extruding over the air and improve the top surface quality, " -#~ "especially when the sparse infill density is low.This value determines the thickness of the support " -#~ "loops. 0 means disable this feature" +#~ "If enabled, support loops will be generated under the contours of " +#~ "internal bridges.These support loops could prevent internal bridges from " +#~ "extruding over the air and improve the top surface quality, especially " +#~ "when the sparse infill density is low.This value determines the thickness " +#~ "of the support loops. 0 means disable this feature" #~ msgstr "" -#~ "Pokud je povoleno, podpůrné smyčky budou generovány pod obrysy interních mostů. Tyto podpůrné smyčky " -#~ "mohou zabránit extruzi materiálu do vzduchu a zlepšit kvalitu horního povrchu, zejména když je nízká " -#~ "hustota výplně. Tato hodnota určuje tloušťku podpůrných smyček. Hodnota 0 znamená, že tato funkce je " -#~ "zakázána." +#~ "Pokud je povoleno, podpůrné smyčky budou generovány pod obrysy interních " +#~ "mostů. Tyto podpůrné smyčky mohou zabránit extruzi materiálu do vzduchu a " +#~ "zlepšit kvalitu horního povrchu, zejména když je nízká hustota výplně. " +#~ "Tato hodnota určuje tloušťku podpůrných smyček. Hodnota 0 znamená, že " +#~ "tato funkce je zakázána." #, fuzzy, c-format, boost-format -#~ msgid "Klipper's max_accel_to_decel will be adjusted to this % of acceleration" +#~ msgid "" +#~ "Klipper's max_accel_to_decel will be adjusted to this % of acceleration" #~ msgstr "Klipper max_accel_to_decel bude upraven na toto % zrychlení" #~ msgid "" -#~ "Style and shape of the support. For normal support, projecting the supports into a regular grid will " -#~ "create more stable supports (default), while snug support towers will save material and reduce object " -#~ "scarring.\n" -#~ "For tree support, slim style will merge branches more aggressively and save a lot of material " -#~ "(default), while hybrid style will create similar structure to normal support under large flat " -#~ "overhangs." +#~ "Style and shape of the support. For normal support, projecting the " +#~ "supports into a regular grid will create more stable supports (default), " +#~ "while snug support towers will save material and reduce object scarring.\n" +#~ "For tree support, slim style will merge branches more aggressively and " +#~ "save a lot of material (default), while hybrid style will create similar " +#~ "structure to normal support under large flat overhangs." #~ msgstr "" -#~ "Styl a tvar podpěry. Pro normální podpěru vytvoří promítnutí podpěr do pravidelné mřížky stabilnější " -#~ "podpěry (výchozí), zatímco přiléhavé podpěrné věže šetří materiál a omezují zjizvení objektů.\n" -#~ "Pro podpěru stromu se tenký styl spojí větví se agresivněji a ušetří spoustu materiálu (výchozí), " -#~ "zatímco hybridní styl vytvoří podobnou strukturu jako normální podpěr a pod velkými plochými převisy." +#~ "Styl a tvar podpěry. Pro normální podpěru vytvoří promítnutí podpěr do " +#~ "pravidelné mřížky stabilnější podpěry (výchozí), zatímco přiléhavé " +#~ "podpěrné věže šetří materiál a omezují zjizvení objektů.\n" +#~ "Pro podpěru stromu se tenký styl spojí větví se agresivněji a ušetří " +#~ "spoustu materiálu (výchozí), zatímco hybridní styl vytvoří podobnou " +#~ "strukturu jako normální podpěr a pod velkými plochými převisy." #~ msgid "Target chamber temperature" #~ msgstr "Cílová teplota v komoře" @@ -11347,12 +12267,13 @@ msgstr "" #~ msgstr "Rozdíl teplot podložky" #~ msgid "" -#~ "Do not recommend bed temperature of other layer to be lower than initial layer for more than this " -#~ "threshold. Too low bed temperature of other layer may cause the model broken free from build plate" +#~ "Do not recommend bed temperature of other layer to be lower than initial " +#~ "layer for more than this threshold. Too low bed temperature of other " +#~ "layer may cause the model broken free from build plate" #~ msgstr "" -#~ "Nedoporučujeme, aby teplota podložky jiné vrstvy byla nižší než počáteční vrstva o více než tento " -#~ "limit. Příliš nízká teplota podložky jiné vrstvy může způsobit, že se model uvolní z vyhřívané " -#~ "podložky" +#~ "Nedoporučujeme, aby teplota podložky jiné vrstvy byla nižší než počáteční " +#~ "vrstva o více než tento limit. Příliš nízká teplota podložky jiné vrstvy " +#~ "může způsobit, že se model uvolní z vyhřívané podložky" #~ msgid "Orient the model" #~ msgstr "Orientujte model" diff --git a/localization/i18n/de/OrcaSlicer_de.po b/localization/i18n/de/OrcaSlicer_de.po index af41e95647f..0f5b69da6bb 100644 --- a/localization/i18n/de/OrcaSlicer_de.po +++ b/localization/i18n/de/OrcaSlicer_de.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-10 11:06+0200\n" +"POT-Creation-Date: 2023-10-11 22:28+0800\n" "PO-Revision-Date: \n" "Last-Translator: Heiko Liebscher \n" "Language-Team: \n" @@ -3195,7 +3195,7 @@ msgstr "Volumen:" msgid "Size:" msgstr "Größe:" -#, boost-format +#, c-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)." @@ -5980,13 +5980,13 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "Wenn Sie einen Zeitraffer ohne Werkzeugkopf aufnehmen, wird empfohlen, einen " "\"Timelapse Wischturm\" hinzuzufügen, indem Sie mit der rechten Maustaste " -"auf die leere Position der Bauplatte klicken und \"Primitiv hinzufügen\"-" -">\"Timelapse Wischturm\" wählen." +"auf die leere Position der Bauplatte klicken und \"Primitiv hinzufügen\"->" +"\"Timelapse Wischturm\" wählen." msgid "Line width" msgstr "Breite der Linie" @@ -8903,13 +8903,13 @@ msgstr "Volle Lüfterdrehzahl ab Schicht" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"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." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower 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 "" -"Die Lüftergeschwindigkeit wird linear von Null bei der " -"Schicht\"close_fan_the_first_x_layers\" auf das Maximum bei der Schicht " +"Die Lüftergeschwindigkeit wird linear von Null bei der Schicht" +"\"close_fan_the_first_x_layers\" auf das Maximum bei der Schicht " "\"full_fan_speed_layer\" erhöht. \"full_fan_speed_layer\" wird ignoriert, " "wenn es niedriger ist als \"close_fan_the_first_x_layers\",in diesem Fall " "läuft der Lüfter bei Schicht \"close_fan_the_first_x_layers\"+ 1 mit maximal " diff --git a/localization/i18n/en/OrcaSlicer_en.po b/localization/i18n/en/OrcaSlicer_en.po index 2a82bb963cd..c734ec0b074 100644 --- a/localization/i18n/en/OrcaSlicer_en.po +++ b/localization/i18n/en/OrcaSlicer_en.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-30 10:27+0800\n" +"POT-Creation-Date: 2023-10-11 22:28+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -4326,6 +4326,24 @@ msgstr "Filament settings" msgid "Printer settings" msgstr "Printer settings" +msgid "Remove current plate (if not last one)" +msgstr "" + +msgid "Auto orient objects on current plate" +msgstr "" + +msgid "Arrange objects on current plate" +msgstr "" + +msgid "Unlock current plate" +msgstr "" + +msgid "Lock current plate" +msgstr "" + +msgid "Customize current plate" +msgstr "" + msgid "Untitled" msgstr "Untitled" @@ -7158,6 +7176,19 @@ msgstr "" "This shrinks the first layer on the build plate to compensate for elephant " "foot effect." +msgid "Elephant foot compensation layers" +msgstr "" + +msgid "" +"The number of layers on which the elephant foot compensation will be active. " +"The first layer will be shrunk by the elephant foot compensation value, then " +"the next layers will be linearly shrunk less, up to the layer indicated by " +"this value." +msgstr "" + +msgid "layers" +msgstr "layers" + msgid "" "Slicing height for each layer. Smaller layer height means more accurate and " "more printing time" @@ -7702,9 +7733,6 @@ msgstr "" "Turn off all cooling fans for the first few layers. This can be used to " "improve bed adhesion." -msgid "layers" -msgstr "layers" - msgid "Don't support bridges" msgstr "Don't support bridges" @@ -8723,6 +8751,9 @@ msgstr "All solid layers" msgid "Ironing Pattern" msgstr "Ironing Pattern" +msgid "The pattern that will be used when ironing" +msgstr "" + msgid "Ironing flow" msgstr "Ironing flow" @@ -8746,6 +8777,14 @@ msgstr "Ironing speed" msgid "Print speed of ironing lines" msgstr "This is the print speed for ironing lines." +msgid "Ironing angle" +msgstr "" + +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" + msgid "This gcode part is inserted at every layer change after lift z" msgstr "This G-code is inserted at every layer change after the z lift." @@ -10116,6 +10155,34 @@ msgstr "" "contours smaller. This function is used to adjust sizes slightly when " "objects have assembly issues." +msgid "Convert holes to polyholes" +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 " +"compute the polyhole.\n" +"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" +msgstr "" + +msgid "Polyhole detection margin" +msgstr "" + +#, c-format, boost-format +msgid "" +"Maximum defection of a point to the estimated radius of the circle.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" +"In mm or in % of the radius." +msgstr "" + +msgid "Polyhole twist" +msgstr "" + +msgid "Rotate the polyhole every layer." +msgstr "" + msgid "G-code thumbnails" msgstr "" diff --git a/localization/i18n/es/OrcaSlicer_es.po b/localization/i18n/es/OrcaSlicer_es.po index 960207f9c33..a79107a3ed9 100644 --- a/localization/i18n/es/OrcaSlicer_es.po +++ b/localization/i18n/es/OrcaSlicer_es.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-30 10:27+0800\n" +"POT-Creation-Date: 2023-10-11 22:28+0800\n" "PO-Revision-Date: \n" "Last-Translator: Carlos Fco. Caruncho Serrano \n" "Language-Team: \n" @@ -4426,6 +4426,24 @@ msgstr "Ajustes del filamento" msgid "Printer settings" msgstr "Ajustes de la impresora" +msgid "Remove current plate (if not last one)" +msgstr "" + +msgid "Auto orient objects on current plate" +msgstr "" + +msgid "Arrange objects on current plate" +msgstr "" + +msgid "Unlock current plate" +msgstr "" + +msgid "Lock current plate" +msgstr "" + +msgid "Customize current plate" +msgstr "" + msgid "Untitled" msgstr "Sin título" @@ -7359,6 +7377,19 @@ msgstr "" "Contraer la primera capa en la bandeja de impresión para compensar el efecto " "de la pata de elefante" +msgid "Elephant foot compensation layers" +msgstr "" + +msgid "" +"The number of layers on which the elephant foot compensation will be active. " +"The first layer will be shrunk by the elephant foot compensation value, then " +"the next layers will be linearly shrunk less, up to the layer indicated by " +"this value." +msgstr "" + +msgid "layers" +msgstr "capas" + msgid "" "Slicing height for each layer. Smaller layer height means more accurate and " "more printing time" @@ -7946,9 +7977,6 @@ msgstr "" "ventilador de la primera capa debe estar apagado para conseguir una mejor " "adhesión de la bandeja de impresión" -msgid "layers" -msgstr "capas" - msgid "Don't support bridges" msgstr "No soportar puentes" @@ -9107,6 +9135,9 @@ msgstr "Todas la capas sólidas" msgid "Ironing Pattern" msgstr "Patrón de Alisado" +msgid "The pattern that will be used when ironing" +msgstr "" + msgid "Ironing flow" msgstr "Flujo de alisado" @@ -9130,6 +9161,14 @@ msgstr "Velocidad de alisado" msgid "Print speed of ironing lines" msgstr "Velocidad de impresión de las líneas de alisado" +msgid "Ironing angle" +msgstr "" + +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" + msgid "This gcode part is inserted at every layer change after lift z" msgstr "" "Esta parte de G-Code se inserta en cada cambio de capa después de levantar z" @@ -10627,6 +10666,34 @@ msgstr "" "negativo hace que el contorno sea más pequeño. Esta función se utiliza para " "ajustar el tamaño ligeramente cuando el objeto tiene problemas de ensamblaje" +msgid "Convert holes to polyholes" +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 " +"compute the polyhole.\n" +"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" +msgstr "" + +msgid "Polyhole detection margin" +msgstr "" + +#, c-format, boost-format +msgid "" +"Maximum defection of a point to the estimated radius of the circle.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" +"In mm or in % of the radius." +msgstr "" + +msgid "Polyhole twist" +msgstr "" + +msgid "Rotate the polyhole every layer." +msgstr "" + msgid "G-code thumbnails" msgstr "Miniaturas de G-Code" diff --git a/localization/i18n/fr/OrcaSlicer_fr.po b/localization/i18n/fr/OrcaSlicer_fr.po index 3499a05b9d9..99cb60b8ac6 100644 --- a/localization/i18n/fr/OrcaSlicer_fr.po +++ b/localization/i18n/fr/OrcaSlicer_fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-30 10:27+0800\n" +"POT-Creation-Date: 2023-10-11 22:28+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Guislain Cyril\n" @@ -4422,6 +4422,24 @@ msgstr "Réglages du filament" msgid "Printer settings" msgstr "Paramètres de l'imprimante" +msgid "Remove current plate (if not last one)" +msgstr "" + +msgid "Auto orient objects on current plate" +msgstr "" + +msgid "Arrange objects on current plate" +msgstr "" + +msgid "Unlock current plate" +msgstr "" + +msgid "Lock current plate" +msgstr "" + +msgid "Customize current plate" +msgstr "" + msgid "Untitled" msgstr "Sans_Titre" @@ -7390,6 +7408,19 @@ msgstr "" "Rétrécis la couche initiale sur le plateau pour compenser l'effet de pied " "d'éléphant" +msgid "Elephant foot compensation layers" +msgstr "" + +msgid "" +"The number of layers on which the elephant foot compensation will be active. " +"The first layer will be shrunk by the elephant foot compensation value, then " +"the next layers will be linearly shrunk less, up to the layer indicated by " +"this value." +msgstr "" + +msgid "layers" +msgstr "couches" + msgid "" "Slicing height for each layer. Smaller layer height means more accurate and " "more printing time" @@ -7957,9 +7988,6 @@ msgstr "" "couches. Un arrêt des ventilateurs permet d’obtenir une meilleure adhérence " "de la première couche sur le plateau" -msgid "layers" -msgstr "couches" - msgid "Don't support bridges" msgstr "Ne pas supporter les ponts" @@ -9085,6 +9113,9 @@ msgstr "Toutes les couches solides" msgid "Ironing Pattern" msgstr "Modèle de repassage" +msgid "The pattern that will be used when ironing" +msgstr "" + msgid "Ironing flow" msgstr "Débit de lissage" @@ -9108,6 +9139,14 @@ msgstr "Vitesse de lissage" msgid "Print speed of ironing lines" msgstr "Vitesse d'impression des lignes de lissage" +msgid "Ironing angle" +msgstr "" + +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" + msgid "This gcode part is inserted at every layer change after lift z" msgstr "" "Cette partie gcode est insérée à chaque changement de couche après une levée " @@ -10539,6 +10578,34 @@ msgstr "" "négative rend les contours plus petits. Cette fonction est utilisée pour " "ajuster légèrement la taille lorsque l'objet a un problème d'assemblage" +msgid "Convert holes to polyholes" +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 " +"compute the polyhole.\n" +"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" +msgstr "" + +msgid "Polyhole detection margin" +msgstr "" + +#, c-format, boost-format +msgid "" +"Maximum defection of a point to the estimated radius of the circle.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" +"In mm or in % of the radius." +msgstr "" + +msgid "Polyhole twist" +msgstr "" + +msgid "Rotate the polyhole every layer." +msgstr "" + msgid "G-code thumbnails" msgstr "Vignette G-code" diff --git a/localization/i18n/hu/OrcaSlicer_hu.po b/localization/i18n/hu/OrcaSlicer_hu.po index a4a8abe4c28..42ebf4ee65d 100644 --- a/localization/i18n/hu/OrcaSlicer_hu.po +++ b/localization/i18n/hu/OrcaSlicer_hu.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-30 10:27+0800\n" +"POT-Creation-Date: 2023-10-11 22:28+0800\n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -4353,6 +4353,24 @@ msgstr "Filament beállítások" msgid "Printer settings" msgstr "Nyomtató beállítások" +msgid "Remove current plate (if not last one)" +msgstr "" + +msgid "Auto orient objects on current plate" +msgstr "" + +msgid "Arrange objects on current plate" +msgstr "" + +msgid "Unlock current plate" +msgstr "" + +msgid "Lock current plate" +msgstr "" + +msgid "Customize current plate" +msgstr "" + msgid "Untitled" msgstr "Névtelen" @@ -7226,6 +7244,19 @@ msgstr "" "Zsugorítja a kezdőréteget a tárgyasztalon, hogy kompenzálja az elefántláb-" "hatást" +msgid "Elephant foot compensation layers" +msgstr "" + +msgid "" +"The number of layers on which the elephant foot compensation will be active. " +"The first layer will be shrunk by the elephant foot compensation value, then " +"the next layers will be linearly shrunk less, up to the layer indicated by " +"this value." +msgstr "" + +msgid "layers" +msgstr "réteg" + msgid "" "Slicing height for each layer. Smaller layer height means more accurate and " "more printing time" @@ -7772,9 +7803,6 @@ msgstr "" "Kikapcsolja a hűtést a megadott első pár rétegnél. A hűtés kikapcsolása " "segítheti a jobb tárgyasztalhoz való tapadást" -msgid "layers" -msgstr "réteg" - msgid "Don't support bridges" msgstr "Ne támassza alá az áthidalásokat" @@ -8798,6 +8826,9 @@ msgstr "Összes szilárd réteg" msgid "Ironing Pattern" msgstr "Ironing Pattern" +msgid "The pattern that will be used when ironing" +msgstr "" + msgid "Ironing flow" msgstr "Vasalás áramlási sebesség" @@ -8820,6 +8851,14 @@ msgstr "Vasalás sebessége" msgid "Print speed of ironing lines" msgstr "A vasalási vonalak nyomtatási sebessége" +msgid "Ironing angle" +msgstr "" + +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" + msgid "This gcode part is inserted at every layer change after lift z" msgstr "" "Ez a G-kód minden rétegváltásnál beillesztésre kerül a Z tengely megemelése " @@ -10210,6 +10249,34 @@ msgstr "" "kisebb. Ez a funkció a méret kismértékű módosítására szolgál, ha a " "kinyomtatott tárggyal összeszerelési problémák akadnak" +msgid "Convert holes to polyholes" +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 " +"compute the polyhole.\n" +"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" +msgstr "" + +msgid "Polyhole detection margin" +msgstr "" + +#, c-format, boost-format +msgid "" +"Maximum defection of a point to the estimated radius of the circle.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" +"In mm or in % of the radius." +msgstr "" + +msgid "Polyhole twist" +msgstr "" + +msgid "Rotate the polyhole every layer." +msgstr "" + msgid "G-code thumbnails" msgstr "" diff --git a/localization/i18n/it/OrcaSlicer_it.po b/localization/i18n/it/OrcaSlicer_it.po index c37e2cb08fa..ea25a23be2a 100644 --- a/localization/i18n/it/OrcaSlicer_it.po +++ b/localization/i18n/it/OrcaSlicer_it.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-30 10:27+0800\n" +"POT-Creation-Date: 2023-10-11 22:28+0800\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -4348,6 +4348,24 @@ msgstr "Filament settings" msgid "Printer settings" msgstr "Printer settings" +msgid "Remove current plate (if not last one)" +msgstr "" + +msgid "Auto orient objects on current plate" +msgstr "" + +msgid "Arrange objects on current plate" +msgstr "" + +msgid "Unlock current plate" +msgstr "" + +msgid "Lock current plate" +msgstr "" + +msgid "Customize current plate" +msgstr "" + msgid "Untitled" msgstr "Senza titolo" @@ -7204,6 +7222,19 @@ msgstr "" "This shrinks the first layer on the build plate to compensate for elephant " "foot effect." +msgid "Elephant foot compensation layers" +msgstr "" + +msgid "" +"The number of layers on which the elephant foot compensation will be active. " +"The first layer will be shrunk by the elephant foot compensation value, then " +"the next layers will be linearly shrunk less, up to the layer indicated by " +"this value." +msgstr "" + +msgid "layers" +msgstr "layer" + msgid "" "Slicing height for each layer. Smaller layer height means more accurate and " "more printing time" @@ -7751,9 +7782,6 @@ msgstr "" "Turn off all cooling fans for the first few layers. This can be used to " "improve bed adhesion." -msgid "layers" -msgstr "layer" - msgid "Don't support bridges" msgstr "Non supportare i bridge" @@ -8775,6 +8803,9 @@ msgstr "All solid layers" msgid "Ironing Pattern" msgstr "Trama stiratura" +msgid "The pattern that will be used when ironing" +msgstr "" + msgid "Ironing flow" msgstr "Ironing flow" @@ -8798,6 +8829,14 @@ msgstr "Ironing speed" msgid "Print speed of ironing lines" msgstr "This is the print speed for ironing lines." +msgid "Ironing angle" +msgstr "" + +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" + msgid "This gcode part is inserted at every layer change after lift z" msgstr "This G-code is inserted at every layer change after the z lift." @@ -10179,6 +10218,34 @@ msgstr "" "contours smaller. This function is used to adjust sizes slightly when " "objects have assembly issues." +msgid "Convert holes to polyholes" +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 " +"compute the polyhole.\n" +"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" +msgstr "" + +msgid "Polyhole detection margin" +msgstr "" + +#, c-format, boost-format +msgid "" +"Maximum defection of a point to the estimated radius of the circle.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" +"In mm or in % of the radius." +msgstr "" + +msgid "Polyhole twist" +msgstr "" + +msgid "Rotate the polyhole every layer." +msgstr "" + msgid "G-code thumbnails" msgstr "" diff --git a/localization/i18n/ja/OrcaSlicer_ja.po b/localization/i18n/ja/OrcaSlicer_ja.po index 6268745dfe6..fca2d647a86 100644 --- a/localization/i18n/ja/OrcaSlicer_ja.po +++ b/localization/i18n/ja/OrcaSlicer_ja.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-30 10:27+0800\n" +"POT-Creation-Date: 2023-10-11 22:28+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -4251,6 +4251,24 @@ msgstr "フィラメント設定" msgid "Printer settings" msgstr "プリンター設定" +msgid "Remove current plate (if not last one)" +msgstr "" + +msgid "Auto orient objects on current plate" +msgstr "" + +msgid "Arrange objects on current plate" +msgstr "" + +msgid "Unlock current plate" +msgstr "" + +msgid "Lock current plate" +msgstr "" + +msgid "Customize current plate" +msgstr "" + msgid "Untitled" msgstr "名称未設定" @@ -7013,6 +7031,19 @@ msgid "" "effect" msgstr "1層目を縮小して、コーナーのはみ出しを軽減します。" +msgid "Elephant foot compensation layers" +msgstr "" + +msgid "" +"The number of layers on which the elephant foot compensation will be active. " +"The first layer will be shrunk by the elephant foot compensation value, then " +"the next layers will be linearly shrunk less, up to the layer indicated by " +"this value." +msgstr "" + +msgid "layers" +msgstr "積層" + msgid "" "Slicing height for each layer. Smaller layer height means more accurate and " "more printing time" @@ -7524,9 +7555,6 @@ msgid "" msgstr "" "1層目をプリント時に全てのファンをオフにします。ベッドとの接着性を高めます" -msgid "layers" -msgstr "積層" - msgid "Don't support bridges" msgstr "ブリッジにサポートしない" @@ -8505,6 +8533,9 @@ msgstr "全てのソリッド積層" msgid "Ironing Pattern" msgstr "Ironing Pattern" +msgid "The pattern that will be used when ironing" +msgstr "" + msgid "Ironing flow" msgstr "アイロン時の流量比率" @@ -8525,6 +8556,14 @@ msgstr "アイロン時の移動速度" msgid "Print speed of ironing lines" msgstr "アイロン時の造形速度です。" +msgid "Ironing angle" +msgstr "" + +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" + msgid "This gcode part is inserted at every layer change after lift z" msgstr "積層が変わる直後に実行するG-codeです。" @@ -9839,6 +9878,34 @@ msgstr "" "オブジェクトの輪郭の大きさの調整値です。正数は大きくし、負数は小さくします。" "これがパーツを組み立てる為にはめあいの微調整です。" +msgid "Convert holes to polyholes" +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 " +"compute the polyhole.\n" +"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" +msgstr "" + +msgid "Polyhole detection margin" +msgstr "" + +#, c-format, boost-format +msgid "" +"Maximum defection of a point to the estimated radius of the circle.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" +"In mm or in % of the radius." +msgstr "" + +msgid "Polyhole twist" +msgstr "" + +msgid "Rotate the polyhole every layer." +msgstr "" + msgid "G-code thumbnails" msgstr "" diff --git a/localization/i18n/ko/OrcaSlicer_ko.po b/localization/i18n/ko/OrcaSlicer_ko.po index 41ecfd19047..9822e895bbf 100644 --- a/localization/i18n/ko/OrcaSlicer_ko.po +++ b/localization/i18n/ko/OrcaSlicer_ko.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-30 10:27+0800\n" +"POT-Creation-Date: 2023-10-11 22:28+0800\n" "PO-Revision-Date: 2023-10-09 12:04+0900\n" "Last-Translator: Hotsolidinfill, crwusiz \n" "Language-Team: \n" @@ -1199,8 +1199,8 @@ msgstr "" "이 조치는 잘라내기 연결을 끊습니다.\n" "그 이후에는 모델 일관성을 보장할 수 없습니다.\n" "\n" -"꽉찬 부품 또는 비우기 부피로 조작하려면 먼저 잘라내기 정보를 무효화해야 합" -"니다." +"꽉찬 부품 또는 비우기 부피로 조작하려면 먼저 잘라내기 정보를 무효화해야 합니" +"다." msgid "Delete all connectors" msgstr "모든 커넥터 삭제" @@ -4339,6 +4339,24 @@ msgstr "필라멘트 설정" msgid "Printer settings" msgstr "프린터 설정" +msgid "Remove current plate (if not last one)" +msgstr "" + +msgid "Auto orient objects on current plate" +msgstr "" + +msgid "Arrange objects on current plate" +msgstr "" + +msgid "Unlock current plate" +msgstr "" + +msgid "Lock current plate" +msgstr "" + +msgid "Customize current plate" +msgstr "" + msgid "Untitled" msgstr "제목 없음" @@ -5721,8 +5739,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "툴헤드 없이 시간 경과를 기록할 경우 \"타임랩스 닦기 타워\"를 추가하는 것이 좋" "습니다\n" @@ -7169,6 +7187,19 @@ msgstr "" "코끼리 발 효과(Elephant foot effect)를 보정하기 위해 빌드 플레이트의 초기 레" "이어를 축소합니다" +msgid "Elephant foot compensation layers" +msgstr "" + +msgid "" +"The number of layers on which the elephant foot compensation will be active. " +"The first layer will be shrunk by the elephant foot compensation value, then " +"the next layers will be linearly shrunk less, up to the layer indicated by " +"this value." +msgstr "" + +msgid "layers" +msgstr "레이어" + msgid "" "Slicing height for each layer. Smaller layer height means more accurate and " "more printing time" @@ -7721,9 +7752,6 @@ msgstr "" "빌드 플레이트의 접착력 향상을 위해 첫 레이어부터 특정 레이어까지의 모든 냉각 " "팬을 정지합니다" -msgid "layers" -msgstr "레이어" - msgid "Don't support bridges" msgstr "다리 지지대 미생성" @@ -8464,10 +8492,10 @@ msgstr "팬 최대 속도 레이어" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"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." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower 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 "" "팬 속도는 \"close_fan_the_first_x_layers\" 의 0에서 \"full_fan_speed_layer\" " "의 최고 속도까지 선형적으로 증가합니다. \"full_fan_speed_layer\"가 " @@ -8805,6 +8833,9 @@ msgstr "모든 꽉찬 레이어" msgid "Ironing Pattern" msgstr "다림질 패턴" +msgid "The pattern that will be used when ironing" +msgstr "" + msgid "Ironing flow" msgstr "다림질 유량" @@ -8827,6 +8858,14 @@ msgstr "다림질 속도" msgid "Print speed of ironing lines" msgstr "다림질 선의 출력 속도" +msgid "Ironing angle" +msgstr "" + +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" + msgid "This gcode part is inserted at every layer change after lift z" msgstr "이 G코드는 Z올리기 이후 모든 레이어 변경에 삽입됩니다" @@ -10280,6 +10319,34 @@ msgstr "" "곽선을 더 크게 만듭니다. 음수 값은 윤곽선을 더 작게 만듭니다. 이 기능은 개체" "의 조립 문제가 있을 때 크기를 약간 조정하는 데 사용됩니다" +msgid "Convert holes to polyholes" +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 " +"compute the polyhole.\n" +"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" +msgstr "" + +msgid "Polyhole detection margin" +msgstr "" + +#, c-format, boost-format +msgid "" +"Maximum defection of a point to the estimated radius of the circle.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" +"In mm or in % of the radius." +msgstr "" + +msgid "Polyhole twist" +msgstr "" + +msgid "Rotate the polyhole every layer." +msgstr "" + msgid "G-code thumbnails" msgstr "G코드 미리보기(썸네일)" diff --git a/localization/i18n/nl/OrcaSlicer_nl.po b/localization/i18n/nl/OrcaSlicer_nl.po index 9669724c7f8..c1e536143e4 100644 --- a/localization/i18n/nl/OrcaSlicer_nl.po +++ b/localization/i18n/nl/OrcaSlicer_nl.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-30 10:27+0800\n" +"POT-Creation-Date: 2023-10-11 22:28+0800\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -478,8 +478,8 @@ msgstr "Naad versterken" msgid "Block seam" msgstr "Bloknaad" -# msgstr "Blokkeer naad" # in case of "to block" +# msgstr "Blokkeer naad" # in case of "to block" msgid "Seam painting" msgstr "Naad schilderen" @@ -539,7 +539,8 @@ msgid "%1% was replaced with %2%" msgstr "%1% werd vervangen door %2%" msgid "The configuration may be generated by a newer version of OrcaSlicer." -msgstr "De configuratie was mogelijks met een nieuwere versie Orcaslicer gemaakt." +msgstr "" +"De configuratie was mogelijks met een nieuwere versie Orcaslicer gemaakt." msgid "Some values have been replaced. Please check them:" msgstr "Sommige waarden zijn aangepast. Controleer deze alstublieft:" @@ -571,8 +572,8 @@ 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 "" -"OrcaSlicer zal sluiten, omdat het geen geheugen meer heeft. Dit kan een bug zijn. " -"Ons team een rapport schrijven over deze fout wordt erg gewaardeerd." +"OrcaSlicer zal sluiten, omdat het geen geheugen meer heeft. Dit kan een bug " +"zijn. Ons team een rapport schrijven over deze fout wordt erg gewaardeerd." msgid "Fatal error" msgstr "Fatale fout" @@ -609,8 +610,8 @@ msgid "" "features.\n" "Click Yes to install it now." msgstr "" -"OrcaSlicer heeft het MicroSoft WebView2 Runtime nodig om bepaalde " -"functies in werking te stellen.\n" +"OrcaSlicer heeft het MicroSoft WebView2 Runtime nodig om bepaalde functies " +"in werking te stellen.\n" "Klik Ja om het nu te installeren." msgid "WebView2 Runtime" @@ -620,8 +621,8 @@ msgid "" "OrcaSlicer configuration file may be corrupted and is not abled to be parsed." "Please delete the file and try again." msgstr "" -"OrcaSlicer configuratiebestand is mogelijks corrupt, en kan niet verwerkt worden." -"Verwijder het configuratiebestand en probeer het opnieuw." +"OrcaSlicer configuratiebestand is mogelijks corrupt, en kan niet verwerkt " +"worden.Verwijder het configuratiebestand en probeer het opnieuw." #, c-format, boost-format msgid "" @@ -4393,6 +4394,24 @@ msgstr "Filament instellingen" msgid "Printer settings" msgstr "Printer instellingen" +msgid "Remove current plate (if not last one)" +msgstr "" + +msgid "Auto orient objects on current plate" +msgstr "" + +msgid "Arrange objects on current plate" +msgstr "" + +msgid "Unlock current plate" +msgstr "" + +msgid "Lock current plate" +msgstr "" + +msgid "Customize current plate" +msgstr "" + msgid "Untitled" msgstr "Naamloos" @@ -7310,6 +7329,19 @@ msgstr "" "Hierdoor krimpt de eerste laag op de bouwplaat om het \"elephant foot\" " "effect te compenseren." +msgid "Elephant foot compensation layers" +msgstr "" + +msgid "" +"The number of layers on which the elephant foot compensation will be active. " +"The first layer will be shrunk by the elephant foot compensation value, then " +"the next layers will be linearly shrunk less, up to the layer indicated by " +"this value." +msgstr "" + +msgid "layers" +msgstr "Lagen" + msgid "" "Slicing height for each layer. Smaller layer height means more accurate and " "more printing time" @@ -7862,9 +7894,6 @@ msgstr "" "de koel ventilator voor de eerste laag uit te schakelen om een betere " "hechting met het printbed te krijgen" -msgid "layers" -msgstr "Lagen" - msgid "Don't support bridges" msgstr "Geen support bij bruggen toepassen" @@ -8899,6 +8928,9 @@ msgstr "Alle vaste lagen" msgid "Ironing Pattern" msgstr "Ironing Pattern" +msgid "The pattern that will be used when ironing" +msgstr "" + msgid "Ironing flow" msgstr "Flow tijdens strijken" @@ -8923,6 +8955,14 @@ msgstr "Snelheid tijdens het strijken" msgid "Print speed of ironing lines" msgstr "Dit is de print snelheid van de strijk lijnen" +msgid "Ironing angle" +msgstr "" + +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" + msgid "This gcode part is inserted at every layer change after lift z" msgstr "" "De G-code wordt bij iedere laagwisseling toegevoegd na het optillen van Z" @@ -10326,6 +10366,34 @@ msgstr "" "negatieve waarden maken contouren kleiner. Deze functie wordt gebruikt om de " "afmetingen enigszins aan te passen wanneer objecten montageproblemen hebben." +msgid "Convert holes to polyholes" +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 " +"compute the polyhole.\n" +"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" +msgstr "" + +msgid "Polyhole detection margin" +msgstr "" + +#, c-format, boost-format +msgid "" +"Maximum defection of a point to the estimated radius of the circle.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" +"In mm or in % of the radius." +msgstr "" + +msgid "Polyhole twist" +msgstr "" + +msgid "Rotate the polyhole every layer." +msgstr "" + msgid "G-code thumbnails" msgstr "" diff --git a/localization/i18n/ru/OrcaSlicer_ru.po b/localization/i18n/ru/OrcaSlicer_ru.po index f5adb7d8639..da5ce236737 100644 --- a/localization/i18n/ru/OrcaSlicer_ru.po +++ b/localization/i18n/ru/OrcaSlicer_ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: OrcaSlicer V1.7beta\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-30 10:27+0800\n" +"POT-Creation-Date: 2023-10-11 22:28+0800\n" "PO-Revision-Date: 2023-09-21 14:29+0700\n" "Last-Translator: Andylg \n" "Language-Team: \n" @@ -4435,6 +4435,24 @@ msgstr "Настройки прутка" msgid "Printer settings" msgstr "Настройки принтера" +msgid "Remove current plate (if not last one)" +msgstr "" + +msgid "Auto orient objects on current plate" +msgstr "" + +msgid "Arrange objects on current plate" +msgstr "" + +msgid "Unlock current plate" +msgstr "" + +msgid "Lock current plate" +msgstr "" + +msgid "Customize current plate" +msgstr "" + msgid "Untitled" msgstr "Без названия" @@ -7378,6 +7396,19 @@ msgstr "" "Уменьшение первого слоя в плоскости XY на заданное значение, чтобы " "компенсировать эффект слоновьей ноги." +msgid "Elephant foot compensation layers" +msgstr "" + +msgid "" +"The number of layers on which the elephant foot compensation will be active. " +"The first layer will be shrunk by the elephant foot compensation value, then " +"the next layers will be linearly shrunk less, up to the layer indicated by " +"this value." +msgstr "" + +msgid "layers" +msgstr "слой(-я)" + msgid "" "Slicing height for each layer. Smaller layer height means more accurate and " "more printing time" @@ -7957,9 +7988,6 @@ msgstr "" "охлаждения модели при печати первых нескольких слоёв, чтобы не ухудшить " "адгезию к столу." -msgid "layers" -msgstr "слой(-я)" - msgid "Don't support bridges" msgstr "Не печатать поддержки под мостами" @@ -9108,6 +9136,9 @@ msgstr "Все сплошные поверхности" msgid "Ironing Pattern" msgstr "Шаблон разглаживания" +msgid "The pattern that will be used when ironing" +msgstr "" + msgid "Ironing flow" msgstr "Поток" @@ -9130,6 +9161,14 @@ msgstr "Скорость разглаживания" msgid "Print speed of ironing lines" msgstr "Скорость разглаживания" +msgid "Ironing angle" +msgstr "" + +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" + msgid "This gcode part is inserted at every layer change after lift z" msgstr "" "Этот G-код вставляется при каждой смене слоя, сразу после перемещения оси Z." @@ -10632,6 +10671,34 @@ msgstr "" "Отрицательное значение уменьшает контур. Эта функция используется для " "небольшой корректировки размера, когда возникают проблемы со сборкой." +msgid "Convert holes to polyholes" +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 " +"compute the polyhole.\n" +"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" +msgstr "" + +msgid "Polyhole detection margin" +msgstr "" + +#, c-format, boost-format +msgid "" +"Maximum defection of a point to the estimated radius of the circle.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" +"In mm or in % of the radius." +msgstr "" + +msgid "Polyhole twist" +msgstr "" + +msgid "Rotate the polyhole every layer." +msgstr "" + msgid "G-code thumbnails" msgstr "Эскизы G-кода" diff --git a/localization/i18n/sv/OrcaSlicer_sv.po b/localization/i18n/sv/OrcaSlicer_sv.po index bb6a1b02f44..3f0d5b72272 100644 --- a/localization/i18n/sv/OrcaSlicer_sv.po +++ b/localization/i18n/sv/OrcaSlicer_sv.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-30 10:27+0800\n" +"POT-Creation-Date: 2023-10-11 22:28+0800\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -4338,6 +4338,24 @@ msgstr "Filament inställningar" msgid "Printer settings" msgstr "Skrivarens inställningar" +msgid "Remove current plate (if not last one)" +msgstr "" + +msgid "Auto orient objects on current plate" +msgstr "" + +msgid "Arrange objects on current plate" +msgstr "" + +msgid "Unlock current plate" +msgstr "" + +msgid "Lock current plate" +msgstr "" + +msgid "Customize current plate" +msgstr "" + msgid "Untitled" msgstr "Ej namngiven" @@ -7178,6 +7196,19 @@ msgid "" msgstr "" "Minska första lager på byggplattan för att kompensera elefant fots effekten" +msgid "Elephant foot compensation layers" +msgstr "" + +msgid "" +"The number of layers on which the elephant foot compensation will be active. " +"The first layer will be shrunk by the elephant foot compensation value, then " +"the next layers will be linearly shrunk less, up to the layer indicated by " +"this value." +msgstr "" + +msgid "layers" +msgstr "lager" + msgid "" "Slicing height for each layer. Smaller layer height means more accurate and " "more printing time" @@ -7715,9 +7746,6 @@ msgstr "" "Stoppa alla kylfläktar vid det första valda lager. Kylfläkten ska vara " "stängd vid första lager för att förbättra fästet på byggplattan" -msgid "layers" -msgstr "lager" - msgid "Don't support bridges" msgstr "Ingen support vid bridges/bryggor" @@ -8735,6 +8763,9 @@ msgstr "Alla solida lager" msgid "Ironing Pattern" msgstr "Mönster för strykning" +msgid "The pattern that will be used when ironing" +msgstr "" + msgid "Ironing flow" msgstr "Strykningsflöde" @@ -8758,6 +8789,14 @@ msgstr "Stryknings hastighet" msgid "Print speed of ironing lines" msgstr "Utskrifts hastighet för strykning" +msgid "Ironing angle" +msgstr "" + +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" + msgid "This gcode part is inserted at every layer change after lift z" msgstr "Denna G-kod infogas vid varje lagerbyte efter lyft av Z axis" @@ -10130,6 +10169,34 @@ msgstr "" "Denna funktion används för att justera storleken något när det finns " "monterings svårigheter" +msgid "Convert holes to polyholes" +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 " +"compute the polyhole.\n" +"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" +msgstr "" + +msgid "Polyhole detection margin" +msgstr "" + +#, c-format, boost-format +msgid "" +"Maximum defection of a point to the estimated radius of the circle.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" +"In mm or in % of the radius." +msgstr "" + +msgid "Polyhole twist" +msgstr "" + +msgid "Rotate the polyhole every layer." +msgstr "" + msgid "G-code thumbnails" msgstr "" diff --git a/localization/i18n/tr/OrcaSlicer_tr.po b/localization/i18n/tr/OrcaSlicer_tr.po index 210e197d9a6..5bb6e472e82 100644 --- a/localization/i18n/tr/OrcaSlicer_tr.po +++ b/localization/i18n/tr/OrcaSlicer_tr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: OrcaSlicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-26 19:45+0800\n" +"POT-Creation-Date: 2023-10-11 22:28+0800\n" "PO-Revision-Date: 2023-10-07 12:57+0300\n" "Last-Translator: Sadri Ercan\n" "Language-Team: Türkçe\n" @@ -95,7 +95,8 @@ msgstr "Boşluk doldurma" #, boost-format msgid "Allows painting only on facets selected by: \"%1%\"" -msgstr "Yalnızca şu kişi tarafından seçilen yüzeylerde boyamaya izin verir: \"%1%\"" +msgstr "" +"Yalnızca şu kişi tarafından seçilen yüzeylerde boyamaya izin verir: \"%1%\"" msgid "Highlight faces according to overhang angle." msgstr "Yüzleri çıkıntı açısına göre vurgulayın." @@ -110,8 +111,12 @@ msgid "Lay on face" msgstr "Yüzüstü yatır" #, boost-format -msgid "Filament count exceeds the maximum number that painting tool supports. only the first %1% filaments will be available in painting tool." -msgstr "Filament sayısı, boyama aracının desteklediği maksimum sayıyı aşıyor. Boyama aracında yalnızca ilk %1% filament mevcut olacaktır." +msgid "" +"Filament count exceeds the maximum number that painting tool supports. only " +"the first %1% filaments will be available in painting tool." +msgstr "" +"Filament sayısı, boyama aracının desteklediği maksimum sayıyı aşıyor. Boyama " +"aracında yalnızca ilk %1% filament mevcut olacaktır." msgid "Color Painting" msgstr "Renkli Boyama" @@ -410,8 +415,12 @@ msgid "Decimate ratio" msgstr "Oranı azalt" #, boost-format -msgid "Processing model '%1%' with more than 1M triangles could be slow. It is highly recommended to simplify the model." -msgstr "1 milyondan fazla üçgen içeren '%1%' modelinin işlenmesi yavaş olabilir. Modelin basitleştirilmesi önemle tavsiye edilir." +msgid "" +"Processing model '%1%' with more than 1M triangles could be slow. It is " +"highly recommended to simplify the model." +msgstr "" +"1 milyondan fazla üçgen içeren '%1%' modelinin işlenmesi yavaş olabilir. " +"Modelin basitleştirilmesi önemle tavsiye edilir." msgid "Simplify model" msgstr "Modeli sadeleştir" @@ -420,7 +429,8 @@ msgid "Simplify" msgstr "Sadeleştir" msgid "Simplification is currently only allowed when a single part is selected" -msgstr "Sadeleştirmeye şu anda yalnızca tek bir parça seçildiğinde izin veriliyor" +msgstr "" +"Sadeleştirmeye şu anda yalnızca tek bir parça seçildiğinde izin veriliyor" msgid "Error" msgstr "Hata" @@ -535,7 +545,8 @@ msgid "%1% was replaced with %2%" msgstr "%1%, %2% ile değiştirildi" msgid "The configuration may be generated by a newer version of OrcaSlicer." -msgstr "Yapılandırma, OrcaSlicer'ın daha yeni bir sürümü tarafından oluşturulabilir." +msgstr "" +"Yapılandırma, OrcaSlicer'ın daha yeni bir sürümü tarafından oluşturulabilir." msgid "Some values have been replaced. Please check them:" msgstr "Bazı değerler değiştirildi. Lütfen bunları kontrol edin:" @@ -553,20 +564,29 @@ msgid "Configuration package was loaded, but some values were not recognized." msgstr "Yapılandırma paketi yüklendi ancak bazı değerler tanınamadı." #, boost-format -msgid "Configuration file \"%1%\" was loaded, but some values were not recognized." +msgid "" +"Configuration file \"%1%\" was loaded, but some values were not recognized." msgstr "\"%1%\" yapılandırma dosyası yüklendi ancak bazı değerler tanınamadı." msgid "V" msgstr "V" -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 "OrcaSlicer hafızasının yetersiz olması nedeniyle sonlandırılacak. Bir hata olabilir. Sorunu ekibimize bildirirseniz seviniriz." +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 "" +"OrcaSlicer hafızasının yetersiz olması nedeniyle sonlandırılacak. Bir hata " +"olabilir. Sorunu ekibimize bildirirseniz seviniriz." msgid "Fatal error" msgstr "Kritik hata" -msgid "OrcaSlicer will terminate because of a localization error. It will be appreciated if you report the specific scenario this issue happened." -msgstr "OrcaSlicer bir yerelleştirme hatası nedeniyle sonlandırılacak. Bu sorunun gerçekleştiği spesifik senaryoyu bildirirseniz memnun oluruz." +msgid "" +"OrcaSlicer will terminate because of a localization error. It will be " +"appreciated if you report the specific scenario this issue happened." +msgstr "" +"OrcaSlicer bir yerelleştirme hatası nedeniyle sonlandırılacak. Bu sorunun " +"gerçekleştiği spesifik senaryoyu bildirirseniz memnun oluruz." msgid "Critical error" msgstr "Kritik hata" @@ -589,17 +609,23 @@ msgid "Connect %s failed! [SN:%s, code=%s]" msgstr "%s bağlantısı başarısız oldu! [SN:%s, kod=%s]" msgid "" -"Orca Slicer requires the Microsoft WebView2 Runtime to operate certain features.\n" +"Orca Slicer requires the Microsoft WebView2 Runtime to operate certain " +"features.\n" "Click Yes to install it now." msgstr "" -"Orca Slicer, belirli özellikleri çalıştırmak için Microsoft WebView2 Runtime gerektirir.\n" +"Orca Slicer, belirli özellikleri çalıştırmak için Microsoft WebView2 Runtime " +"gerektirir.\n" "Şimdi yüklemek için Evet'e tıklayın." msgid "WebView2 Runtime" msgstr "WebView2 Çalışma Zamanı" -msgid "OrcaSlicer configuration file may be corrupted and is not abled to be parsed.Please delete the file and try again." -msgstr "OrcaSlicer yapılandırma dosyası bozulmuş olabilir ve ayrıştırılması mümkün olmayabilir. Lütfen dosyayı silin ve tekrar deneyin." +msgid "" +"OrcaSlicer configuration file may be corrupted and is not abled to be parsed." +"Please delete the file and try again." +msgstr "" +"OrcaSlicer yapılandırma dosyası bozulmuş olabilir ve ayrıştırılması mümkün " +"olmayabilir. Lütfen dosyayı silin ve tekrar deneyin." #, c-format, boost-format msgid "" @@ -641,7 +667,8 @@ msgid "Choose one file (3mf):" msgstr "Dosya seçin (3mf):" msgid "Choose one or more files (3mf/step/stl/svg/obj/amf/usd*/abc/ply):" -msgstr "Bir veya daha fazla dosya seçin (3mf/step/stl/svg/obj/amf/usd*/abc/ply):" +msgstr "" +"Bir veya daha fazla dosya seçin (3mf/step/stl/svg/obj/amf/usd*/abc/ply):" msgid "Choose one or more files (3mf/step/stl/svg/obj/amf):" msgstr "Bir veya daha fazla dosya seçin (3mf/step/stl/svg/obj/amf):" @@ -652,20 +679,29 @@ msgstr "Bir dosya seçin (gcode/3mf):" msgid "Some presets are modified." msgstr "Bazı ön ayarlar değiştirildi." -msgid "You can keep the modifield presets to the new project, discard or save changes as new presets." -msgstr "Modifield ön ayarlarını yeni projede tutabilir, değişiklikleri atabilir veya yeni ön ayarlar olarak kaydedebilirsiniz." +msgid "" +"You can keep the modifield presets to the new project, discard or save " +"changes as new presets." +msgstr "" +"Modifield ön ayarlarını yeni projede tutabilir, değişiklikleri atabilir veya " +"yeni ön ayarlar olarak kaydedebilirsiniz." msgid "User logged out" msgstr "Kullanıcı oturumu kapattı" msgid "new or open project file is not allowed during the slicing process!" -msgstr "dilimleme işlemi sırasında yeni veya açık proje dosyasına izin verilmez!" +msgstr "" +"dilimleme işlemi sırasında yeni veya açık proje dosyasına izin verilmez!" msgid "Open Project" msgstr "Projeyi Aç" -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'ın sürümü çok düşük ve normal şekilde kullanılabilmesi için en son sürüme güncellenmesi gerekiyor" +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'ın sürümü çok düşük ve normal şekilde kullanılabilmesi için en " +"son sürüme güncellenmesi gerekiyor" msgid "Privacy Policy Update" msgstr "Gizlilik Politikası Güncellemesi" @@ -1137,8 +1173,12 @@ msgstr "Değiştirici Ekle" msgid "Switch to per-object setting mode to edit modifier settings." msgstr "Değiştirici ayarlarını düzenlemek için nesne başına ayar moduna geçin." -msgid "Switch to per-object setting mode to edit process settings of selected objects." -msgstr "Seçilen nesnelerin işlem ayarlarını düzenlemek için nesne başına ayar moduna geçin." +msgid "" +"Switch to per-object setting mode to edit process settings of selected " +"objects." +msgstr "" +"Seçilen nesnelerin işlem ayarlarını düzenlemek için nesne başına ayar moduna " +"geçin." msgid "Delete connector from object which is a part of cut" msgstr "Kesilen parçanın parçası olan nesneden bağlayıcıyı sil" @@ -1149,19 +1189,25 @@ msgstr "Kesimin bir parçası olan nesneden katı parçayı silin" msgid "Delete negative volume from object which is a part of cut" msgstr "Kesimin bir parçası olan nesneden negatif hacmi silin" -msgid "To save cut correspondence you can delete all connectors from all related objects." -msgstr "Kesilmiş yazışmaları kaydetmek için ilgili tüm nesnelerden tüm bağlayıcıları silebilirsiniz." +msgid "" +"To save cut correspondence you can delete all connectors from all related " +"objects." +msgstr "" +"Kesilmiş yazışmaları kaydetmek için ilgili tüm nesnelerden tüm bağlayıcıları " +"silebilirsiniz." msgid "" "This action will break a cut correspondence.\n" "After that model consistency can't be guaranteed .\n" "\n" -"To manipulate with solid parts or negative volumes you have to invalidate cut infornation first." +"To manipulate with solid parts or negative volumes you have to invalidate " +"cut infornation first." msgstr "" "Bu eylem kesilmiş bir yazışmayı bozacaktır.\n" "Bundan sonra model tutarlılığı garanti edilemez.\n" "\n" -"Katı parçalarla veya negatif hacimlerle işlem yapmak için öncelikle kesim bilgisini geçersiz kılmanız gerekir." +"Katı parçalarla veya negatif hacimlerle işlem yapmak için öncelikle kesim " +"bilgisini geçersiz kılmanız gerekir." msgid "Delete all connectors" msgstr "Tüm bağlayıcıları sil" @@ -1217,11 +1263,15 @@ msgstr "Katman" msgid "Selection conflicts" msgstr "Seçim çakışmaları" -msgid "If first selected item is an object, the second one should also be object." +msgid "" +"If first selected item is an object, the second one should also be object." msgstr "İlk seçilen öğe bir nesne ise ikincisi de nesne olmalıdır." -msgid "If first selected item is a part, the second one should be part in the same object." -msgstr "İlk seçilen öğe bir parça ise ikincisi aynı nesnenin parçası olmalıdır." +msgid "" +"If first selected item is a part, the second one should be part in the same " +"object." +msgstr "" +"İlk seçilen öğe bir parça ise ikincisi aynı nesnenin parçası olmalıdır." msgid "The type of the last solid object part is not to be changed." msgstr "Son katı nesne parçasının tipi değiştirilNozullidir." @@ -1285,7 +1335,8 @@ msgid "Invalid numeric." msgstr "Geçersiz sayı." msgid "one cell can only be copied to one or multiple cells in the same column" -msgstr "bir hücre aynı sütundaki yalnızca bir veya daha fazla hücreye kopyalanabilir" +msgstr "" +"bir hücre aynı sütundaki yalnızca bir veya daha fazla hücreye kopyalanabilir" msgid "multiple cells copy is not supported" msgstr "birden fazla hücre kopyalama desteklenmiyor" @@ -1444,7 +1495,8 @@ msgid "Failed to connect to cloud service" msgstr "Bulut hizmetine bağlanılamadı" msgid "Please click on the hyperlink above to view the cloud service status" -msgstr "Bulut hizmeti durumunu görüntülemek için lütfen yukarıdaki köprüye tıklayın" +msgstr "" +"Bulut hizmeti durumunu görüntülemek için lütfen yukarıdaki köprüye tıklayın" msgid "Failed to connect to the printer" msgstr "Yazıcıya bağlanılamadı" @@ -1498,7 +1550,8 @@ msgid "Calibrating AMS..." msgstr "AMS kalibre ediliyor..." msgid "A problem occured during calibration. Click to view the solution." -msgstr "Kalibrasyon sırasında bir sorun oluştu. Çözümü görüntülemek için tıklayın." +msgstr "" +"Kalibrasyon sırasında bir sorun oluştu. Çözümü görüntülemek için tıklayın." msgid "Calibrate again" msgstr "Tekrar kalibre edin" @@ -1536,8 +1589,12 @@ msgstr "Filament konumunu kontrol et" msgid "Grab new filament" msgstr "Yeni filament al" -msgid "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically load or unload filiament." -msgstr "Filamenti otomatik olarak yüklemek veya çıkarmak için bir AMS yuvası seçin ve ardından \"Yükle\" veya \"Boşalt\" düğmesine basın." +msgid "" +"Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " +"load or unload filiament." +msgstr "" +"Filamenti otomatik olarak yüklemek veya çıkarmak için bir AMS yuvası seçin " +"ve ardından \"Yükle\" veya \"Boşalt\" düğmesine basın." msgid "Edit" msgstr "Düzenle" @@ -1562,8 +1619,11 @@ msgstr "" msgid "Arranging..." msgstr "Hizalanıyor..." -msgid "Arrange failed. Found some exceptions when processing object geometries." -msgstr "Hizalama başarısız oldu. Nesne geometrilerini işlerken bazı istisnalar bulundu." +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "" +"Hizalama başarısız oldu. Nesne geometrilerini işlerken bazı istisnalar " +"bulundu." msgid "Arranging" msgstr "Hizalanıyor" @@ -1571,15 +1631,19 @@ msgstr "Hizalanıyor" msgid "Arranging canceled." msgstr "Hizalama iptal edildi." -msgid "Arranging is done but there are unpacked items. Reduce spacing and try again." -msgstr "Hizalama yapıldı ancak paketlenmemiş ürünler var. Aralığı azaltın ve tekrar deneyin." +msgid "" +"Arranging is done but there are unpacked items. Reduce spacing and try again." +msgstr "" +"Hizalama yapıldı ancak paketlenmemiş ürünler var. Aralığı azaltın ve tekrar " +"deneyin." msgid "Arranging done." msgstr "Hizalama tamamlandı." #, c-format, boost-format msgid "" -"Arrangement ignored the following objects which can't fit into a single bed:\n" +"Arrangement ignored the following objects which can't fit into a single " +"bed:\n" "%s" msgstr "" "Hizalama tek tablaya sığmayan aşağıdaki nesneler göz ardı edildi:\n" @@ -1636,7 +1700,9 @@ msgid "Task canceled." msgstr "Görev iptal edildi." msgid "Upload task timed out. Please check the network status and try again." -msgstr "Yükleme görevi zaman aşımına uğradı. Lütfen ağ durumunu kontrol edin ve tekrar deneyin." +msgstr "" +"Yükleme görevi zaman aşımına uğradı. Lütfen ağ durumunu kontrol edin ve " +"tekrar deneyin." msgid "Cloud service connection failed. Please try again." msgstr "Bulut hizmeti bağlantısı başarısız oldu. Lütfen tekrar deneyin." @@ -1644,8 +1710,12 @@ msgstr "Bulut hizmeti bağlantısı başarısız oldu. Lütfen tekrar deneyin." msgid "Print file not found. please slice again." msgstr "Yazdırma dosyası bulunamadı. lütfen tekrar dilimleyin." -msgid "The print file exceeds the maximum allowable size (1GB). Please simplify the model and slice again." -msgstr "Yazdırma dosyası izin verilen maksimum boyutu (1 GB) aşıyor. Lütfen modeli basitleştirin ve tekrar dilimleyin." +msgid "" +"The print file exceeds the maximum allowable size (1GB). Please simplify the " +"model and slice again." +msgstr "" +"Yazdırma dosyası izin verilen maksimum boyutu (1 GB) aşıyor. Lütfen modeli " +"basitleştirin ve tekrar dilimleyin." msgid "Failed to send the print job. Please try again." msgstr "Yazdırma işi gönderilemedi. Lütfen tekrar deneyin." @@ -1653,17 +1723,29 @@ msgstr "Yazdırma işi gönderilemedi. Lütfen tekrar deneyin." msgid "Failed to upload file to ftp. Please try again." msgstr "Dosya ftp'ye yüklenemedi. Lütfen tekrar deneyin." -msgid "Check the current status of the bambu server by clicking on the link above." -msgstr "Yukarıdaki bağlantıya tıklayarak bambu sunucusunun mevcut durumunu kontrol edin." +msgid "" +"Check the current status of the bambu server by clicking on the link above." +msgstr "" +"Yukarıdaki bağlantıya tıklayarak bambu sunucusunun mevcut durumunu kontrol " +"edin." -msgid "The size of the print file is too large. Please adjust the file size and try again." -msgstr "Yazdırma dosyasının boyutu çok büyük. Lütfen dosya boyutunu ayarlayıp tekrar deneyin." +msgid "" +"The size of the print file is too large. Please adjust the file size and try " +"again." +msgstr "" +"Yazdırma dosyasının boyutu çok büyük. Lütfen dosya boyutunu ayarlayıp tekrar " +"deneyin." msgid "Print file not found, Please slice it again and send it for printing." -msgstr "Yazdırma dosyası bulunamadı. Lütfen tekrar dilimleyip baskıya gönderin." +msgstr "" +"Yazdırma dosyası bulunamadı. Lütfen tekrar dilimleyip baskıya gönderin." -msgid "Failed to upload print file to FTP. Please check the network status and try again." -msgstr "Yazdırma dosyası FTP'ye yüklenemedi. Lütfen ağ durumunu kontrol edin ve tekrar deneyin." +msgid "" +"Failed to upload print file to FTP. Please check the network status and try " +"again." +msgstr "" +"Yazdırma dosyası FTP'ye yüklenemedi. Lütfen ağ durumunu kontrol edin ve " +"tekrar deneyin." msgid "Sending print job over LAN" msgstr "Yazdırma işi LAN üzerinden gönderiliyor" @@ -1686,7 +1768,8 @@ msgstr "Başarıyla gönderildi. %ss'de otomatik olarak cihaz sayfasına atlayac #, c-format, boost-format msgid "Successfully sent. Will automatically jump to the next page in %ss" -msgstr "Başarıyla gönderildi. %ss'de otomatik olarak bir sonraki sayfaya atlayacak" +msgstr "" +"Başarıyla gönderildi. %ss'de otomatik olarak bir sonraki sayfaya atlayacak" msgid "An SD card needs to be inserted before printing via LAN." msgstr "LAN yoluyla yazdırmadan önce bir SD kartın takılması gerekir." @@ -1731,8 +1814,12 @@ msgstr "Hızlı" msgid "Importing SLA archive" msgstr "SLA arşivi içe aktarılıyor" -msgid "The SLA archive doesn't contain any presets. Please activate some SLA printer preset first before importing that SLA archive." -msgstr "SLA arşivi herhangi bir ön ayar içermez. Lütfen SLA arşivini içe aktarmadan önce bazı SLA yazıcı ön ayarlarını etkinleştirin." +msgid "" +"The SLA archive doesn't contain any presets. Please activate some SLA " +"printer preset first before importing that SLA archive." +msgstr "" +"SLA arşivi herhangi bir ön ayar içermez. Lütfen SLA arşivini içe aktarmadan " +"önce bazı SLA yazıcı ön ayarlarını etkinleştirin." msgid "Importing canceled." msgstr "İçe aktarma iptal edildi." @@ -1740,8 +1827,12 @@ msgstr "İçe aktarma iptal edildi." msgid "Importing done." msgstr "İçe aktarma tamamlandı." -msgid "The imported SLA archive did not contain any presets. The current SLA presets were used as fallback." -msgstr "İçe aktarılan SLA arşivi herhangi bir ön ayar içermiyordu. Geçerli SLA ön ayarları geri dönüş olarak kullanıldı." +msgid "" +"The imported SLA archive did not contain any presets. The current SLA " +"presets were used as fallback." +msgstr "" +"İçe aktarılan SLA arşivi herhangi bir ön ayar içermiyordu. Geçerli SLA ön " +"ayarları geri dönüş olarak kullanıldı." msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "Çok parçalı bir nesne içeren SLA projesini yatağa yükleyemezsiniz" @@ -1785,14 +1876,24 @@ msgstr "Orca Dilimleyici şu lisansa sahiptir: " msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero Genel Kamu Lisansı, sürüm 3" -msgid "Orca Slicer is based on BambuStudio by Bambulab, which is from PrusaSlicer by Prusa Research. PrusaSlicer is from Slic3r by Alessandro Ranellucci and the RepRap community" -msgstr "Orca Slicer, Prusa Research'ün PrusaSlicer'ından Bambulab'ın BambuStudio'sunu temel alıyor. PrusaSlicer, Alessandro Ranellucci ve RepRap topluluğu tarafından hazırlanan Slic3r'dendir" +msgid "" +"Orca Slicer is based on BambuStudio by Bambulab, which is from PrusaSlicer " +"by Prusa Research. PrusaSlicer is from Slic3r by Alessandro Ranellucci and " +"the RepRap community" +msgstr "" +"Orca Slicer, Prusa Research'ün PrusaSlicer'ından Bambulab'ın " +"BambuStudio'sunu temel alıyor. PrusaSlicer, Alessandro Ranellucci ve RepRap " +"topluluğu tarafından hazırlanan Slic3r'dendir" msgid "Libraries" msgstr "Kütüphaneler" -msgid "This software uses open source components whose copyright and other proprietary rights belong to their respective owners" -msgstr "Bu yazılım, telif hakkı ve diğer mülkiyet hakları ilgili sahiplerine ait olan açık kaynaklı bileşenleri kullanır" +msgid "" +"This software uses open source components whose copyright and other " +"proprietary rights belong to their respective owners" +msgstr "" +"Bu yazılım, telif hakkı ve diğer mülkiyet hakları ilgili sahiplerine ait " +"olan açık kaynaklı bileşenleri kullanır" #, c-format, boost-format msgid "About %s" @@ -1805,13 +1906,21 @@ msgid "OrcaSlicer is based on BambuStudio, PrusaSlicer, and SuperSlicer." msgstr "OrcaSlicer, BambuStudio, PrusaSlicer ve SuperSlicer'ı temel alır." msgid "BambuStudio is originally based on PrusaSlicer by PrusaResearch." -msgstr "BambuStudio orijinal olarak PrusaResearch'ün PrusaSlicer'ını temel almaktadır." +msgstr "" +"BambuStudio orijinal olarak PrusaResearch'ün PrusaSlicer'ını temel " +"almaktadır." msgid "PrusaSlicer is originally based on Slic3r by Alessandro Ranellucci." -msgstr "PrusaSlicer orijinal olarak Alessandro Ranellucci'nin Slic3r'sine dayanmaktadır." +msgstr "" +"PrusaSlicer orijinal olarak Alessandro Ranellucci'nin Slic3r'sine " +"dayanmaktadır." -msgid "Slic3r was created by Alessandro Ranellucci with the help of many other contributors." -msgstr "Slic3r, Alessandro Ranellucci tarafından diğer birçok katkıda bulunanların yardımıyla yaratıldı." +msgid "" +"Slic3r was created by Alessandro Ranellucci with the help of many other " +"contributors." +msgstr "" +"Slic3r, Alessandro Ranellucci tarafından diğer birçok katkıda bulunanların " +"yardımıyla yaratıldı." msgid "Version" msgstr "Sürüm" @@ -1887,8 +1996,14 @@ msgstr "Özel renk" msgid "Dynamic flow calibration" msgstr "Dinamik akış kalibrasyonu" -msgid "The nozzle temp and max volumetric speed will affect the calibration results. Please fill in the same values as the actual printing. They can be auto-filled by selecting a filament preset." -msgstr "Nozul sıcaklığı ve maksimum hacimsel hız kalibrasyon sonuçlarını etkileyecektir. Lütfen gerçek yazdırmayla aynı değerleri girin. Bir filament ön ayarı seçilerek otomatik olarak doldurulabilirler." +msgid "" +"The nozzle temp and max volumetric speed will affect the calibration " +"results. Please fill in the same values as the actual printing. They can be " +"auto-filled by selecting a filament preset." +msgstr "" +"Nozul sıcaklığı ve maksimum hacimsel hız kalibrasyon sonuçlarını " +"etkileyecektir. Lütfen gerçek yazdırmayla aynı değerleri girin. Bir filament " +"ön ayarı seçilerek otomatik olarak doldurulabilirler." msgid "Nozzle Diameter" msgstr "Nozul Çapı" @@ -1920,8 +2035,14 @@ msgstr "Kalibrasyonu başlat" msgid "Next" msgstr "Sonraki" -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 "Kalibrasyon tamamlandı. Lütfen sıcak yatağınızdaki en düzgün ekstrüzyon hattını aşağıdaki resimdeki gibi bulun ve sol tarafındaki değeri K faktörü giriş kutusuna girin." +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 "" +"Kalibrasyon tamamlandı. Lütfen sıcak yatağınızdaki en düzgün ekstrüzyon " +"hattını aşağıdaki resimdeki gibi bulun ve sol tarafındaki değeri K faktörü " +"giriş kutusuna girin." msgid "Save" msgstr "Kaydet" @@ -1952,7 +2073,8 @@ msgstr "Adım" msgid "AMS Slots" msgstr "AMS Yuvaları" -msgid "Note: Only the AMS slots loaded with the same material type can be selected." +msgid "" +"Note: Only the AMS slots loaded with the same material type can be selected." msgstr "Not: Yalnızca aynı malzeme türüne sahip AMS yuvaları seçilebilir." msgid "Enable AMS" @@ -1970,20 +2092,40 @@ msgstr "Şasinin arkasına monte edilmiş filamanla yazdırma" msgid "Cabin humidity" msgstr "Kabin nemi" -msgid "Green means that AMS humidity is normal, orange represent humidity is high, red represent humidity is too high.(Hygrometer: lower the better.)" -msgstr "Yeşil, AMS neminin normal olduğunu, turuncu nemin yüksek olduğunu, kırmızı ise nemin çok yüksek olduğunu gösterir.(Higrometre: ne kadar düşükse o kadar iyidir.)" +msgid "" +"Green means that AMS humidity is normal, orange represent humidity is high, " +"red represent humidity is too high.(Hygrometer: lower the better.)" +msgstr "" +"Yeşil, AMS neminin normal olduğunu, turuncu nemin yüksek olduğunu, kırmızı " +"ise nemin çok yüksek olduğunu gösterir.(Higrometre: ne kadar düşükse o kadar " +"iyidir.)" msgid "Desiccant status" msgstr "Kurutucu durumu" -msgid "A desiccant status lower than two bars indicates that desiccant may be inactive. Please change the desiccant.(The bars: higher the better.)" -msgstr "İki çubuktan daha düşük bir kurutucu durumu, kurutucunun etkin olmadığını gösterir. Lütfen kurutucuyu değiştirin.(Çubuklar: ne kadar yüksek olursa o kadar iyidir.)" +msgid "" +"A desiccant status lower than two bars indicates that desiccant may be " +"inactive. Please change the desiccant.(The bars: higher the better.)" +msgstr "" +"İki çubuktan daha düşük bir kurutucu durumu, kurutucunun etkin olmadığını " +"gösterir. Lütfen kurutucuyu değiştirin.(Çubuklar: ne kadar yüksek olursa o " +"kadar iyidir.)" -msgid "Note: When the lid is open or the desiccant pack is changed, it can take hours or a night to absorb the moisture. Low temperatures also slow down the process. During this time, the indicator may not represent the chamber accurately." -msgstr "Not: Kapak açıkken veya kurutucu paketi değiştirildiğinde, nemin emilmesi saatler veya bir gece sürebilir. Düşük sıcaklıklar da süreci yavaşlatır. Bu süre zarfında gösterge hazneyi doğru şekilde temsil etmeyebilir." +msgid "" +"Note: When the lid is open or the desiccant pack is changed, it can take " +"hours or a night to absorb the moisture. Low temperatures also slow down the " +"process. During this time, the indicator may not represent the chamber " +"accurately." +msgstr "" +"Not: Kapak açıkken veya kurutucu paketi değiştirildiğinde, nemin emilmesi " +"saatler veya bir gece sürebilir. Düşük sıcaklıklar da süreci yavaşlatır. Bu " +"süre zarfında gösterge hazneyi doğru şekilde temsil etmeyebilir." -msgid "Config which AMS slot should be used for a filament used in the print job" -msgstr "Yazdırma işinde kullanılan filament için hangi AMS yuvasının kullanılması gerektiğini yapılandırma" +msgid "" +"Config which AMS slot should be used for a filament used in the print job" +msgstr "" +"Yazdırma işinde kullanılan filament için hangi AMS yuvasının kullanılması " +"gerektiğini yapılandırma" msgid "Filament used in this print job" msgstr "Bu yazdırma işinde kullanılan filament" @@ -2006,18 +2148,26 @@ msgstr "Ams içerisindeki filamentlerle yazdırma" msgid "Print with filaments mounted on the back of the chassis" msgstr "Kasanın arkasına monte edilmiş filamentler ile yazdırma" -msgid "When the current material run out, the printer will continue to print in the following order." -msgstr "Mevcut malzeme bittiğinde yazıcı aşağıdaki sırayla yazdırmaya devam edecektir." +msgid "" +"When the current material run out, the printer will continue to print in the " +"following order." +msgstr "" +"Mevcut malzeme bittiğinde yazıcı aşağıdaki sırayla yazdırmaya devam " +"edecektir." msgid "Group" msgstr "Grup" msgid "" -"There are currently no identical spare consumables available, and automatic replenishment is currently not possible. \n" -"(Currently supporting automatic supply of consumables with the same brand, material type, and color)" +"There are currently no identical spare consumables available, and automatic " +"replenishment is currently not possible. \n" +"(Currently supporting automatic supply of consumables with the same brand, " +"material type, and color)" msgstr "" -"Şu anda aynı yedek sarf malzemesi mevcut değildir ve otomatik yenileme şu anda mümkün değildir.\n" -"(Şu anda aynı marka, malzeme türü ve renkte sarf malzemelerinin otomatik olarak tedarik edilmesi desteklenmektedir)" +"Şu anda aynı yedek sarf malzemesi mevcut değildir ve otomatik yenileme şu " +"anda mümkün değildir.\n" +"(Şu anda aynı marka, malzeme türü ve renkte sarf malzemelerinin otomatik " +"olarak tedarik edilmesi desteklenmektedir)" msgid "AMS Settings" msgstr "AMS Ayarları" @@ -2025,35 +2175,67 @@ msgstr "AMS Ayarları" msgid "Insertion update" msgstr "Ekleme güncellemesi" -msgid "The AMS will automatically read the filament information when inserting a new Bambu Lab filament. This takes about 20 seconds." -msgstr "AMS, yeni bir Bambu Lab filamanı takıldığında filament bilgilerini otomatik olarak okuyacaktır. Bu yaklaşık 20 saniye sürer." +msgid "" +"The AMS will automatically read the filament information when inserting a " +"new Bambu Lab filament. This takes about 20 seconds." +msgstr "" +"AMS, yeni bir Bambu Lab filamanı takıldığında filament bilgilerini otomatik " +"olarak okuyacaktır. Bu yaklaşık 20 saniye sürer." -msgid "Note: if new filament is inserted during printing, the AMS will not automatically read any information until printing is completed." -msgstr "Not: Yazdırma sırasında yeni filament takılırsa AMS, yazdırma tamamlanana kadar herhangi bir bilgiyi otomatik olarak okumayacaktır." +msgid "" +"Note: if new filament is inserted during printing, the AMS will not " +"automatically read any information until printing is completed." +msgstr "" +"Not: Yazdırma sırasında yeni filament takılırsa AMS, yazdırma tamamlanana " +"kadar herhangi bir bilgiyi otomatik olarak okumayacaktır." -msgid "When inserting a new filament, the AMS will not automatically read its information, leaving it blank for you to enter manually." -msgstr "Yeni bir filament yerleştirirken AMS, bilgileri otomatik olarak okumaz ve manuel olarak girmeniz için boş bırakır." +msgid "" +"When inserting a new filament, the AMS will not automatically read its " +"information, leaving it blank for you to enter manually." +msgstr "" +"Yeni bir filament yerleştirirken AMS, bilgileri otomatik olarak okumaz ve " +"manuel olarak girmeniz için boş bırakır." msgid "Power on update" msgstr "Güncellemeyi aç" -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, başlangıçta takılan filamanın bilgilerini otomatik olarak okuyacaktır. Yaklaşık 1 dakika sürecektir. Okuma işlemi filament makaralarını saracaktır." +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, başlangıçta takılan filamanın bilgilerini otomatik olarak okuyacaktır. " +"Yaklaşık 1 dakika sürecektir. Okuma işlemi filament makaralarını saracaktır." -msgid "The AMS will not automatically read information from inserted filament during startup and will continue to use the information recorded before the last shutdown." -msgstr "AMS, başlatma sırasında takılan filamandan bilgileri otomatik olarak okumaz ve son kapatmadan önce kaydedilen bilgileri kullanmaya devam eder." +msgid "" +"The AMS will not automatically read information from inserted filament " +"during startup and will continue to use the information recorded before the " +"last shutdown." +msgstr "" +"AMS, başlatma sırasında takılan filamandan bilgileri otomatik olarak okumaz " +"ve son kapatmadan önce kaydedilen bilgileri kullanmaya devam eder." msgid "Update remaining capacity" msgstr "Kalan kapasiteyi güncelle" -msgid "The AMS will estimate Bambu filament's remaining capacity after the filament info is updated. During printing, remaining capacity will be updated automatically." -msgstr "AMS, filament bilgisi güncellendikten sonra Bambu filamanının kalan kapasitesini tahmin edecek. Yazdırma sırasında kalan kapasite otomatik olarak güncellenecektir." +msgid "" +"The AMS will estimate Bambu filament's remaining capacity after the filament " +"info is updated. During printing, remaining capacity will be updated " +"automatically." +msgstr "" +"AMS, filament bilgisi güncellendikten sonra Bambu filamanının kalan " +"kapasitesini tahmin edecek. Yazdırma sırasında kalan kapasite otomatik " +"olarak güncellenecektir." msgid "AMS filament backup" msgstr "AMS filament yedeklemesi" -msgid "AMS will continue to another spool with the same properties of filament automatically when current filament runs out" -msgstr "AMS, mevcut filament bittiğinde otomatik olarak aynı özelliklere sahip başka bir makaraya devam edecektir" +msgid "" +"AMS will continue to another spool with the same properties of filament " +"automatically when current filament runs out" +msgstr "" +"AMS, mevcut filament bittiğinde otomatik olarak aynı özelliklere sahip başka " +"bir makaraya devam edecektir" msgid "File" msgstr "Dosya" @@ -2061,11 +2243,19 @@ msgstr "Dosya" msgid "Calibration" msgstr "Kalibrasyon" -msgid "Failed to download the plug-in. Please check your firewall settings and vpn software, check and retry." -msgstr "Eklenti indirilemedi. Lütfen güvenlik duvarı ayarlarınızı ve vpn yazılımınızı kontrol edin, kontrol edip yeniden deneyin." +msgid "" +"Failed to download the plug-in. Please check your firewall settings and vpn " +"software, check and retry." +msgstr "" +"Eklenti indirilemedi. Lütfen güvenlik duvarı ayarlarınızı ve vpn " +"yazılımınızı kontrol edin, kontrol edip yeniden deneyin." -msgid "Failed to install the plug-in. Please check whether it is blocked or deleted by anti-virus software." -msgstr "Eklenti yüklenemedi. Lütfen anti-virüs yazılımı tarafından engellenip engellenmediğini veya silinip silinmediğini kontrol edin." +msgid "" +"Failed to install the plug-in. Please check whether it is blocked or deleted " +"by anti-virus software." +msgstr "" +"Eklenti yüklenemedi. Lütfen anti-virüs yazılımı tarafından engellenip " +"engellenmediğini veya silinip silinmediğini kontrol edin." msgid "click here to see more info" msgstr "daha fazla bilgi görmek için burayı tıklayın" @@ -2073,14 +2263,22 @@ msgstr "daha fazla bilgi görmek için burayı tıklayın" msgid "Please home all axes (click " msgstr "Lütfen tüm eksenleri hizalayın (tıklayın) " -msgid ") to locate the toolhead's position. This prevents device moving beyond the printable boundary and causing equipment wear." -msgstr ") takım kafasının konumunu bulmak için. Bu, cihazın yazdırılabilir sınırın dışına çıkmasını ve ekipmanın aşınmasına neden olmasını önler." +msgid "" +") to locate the toolhead's position. This prevents device moving beyond the " +"printable boundary and causing equipment wear." +msgstr "" +") takım kafasının konumunu bulmak için. Bu, cihazın yazdırılabilir sınırın " +"dışına çıkmasını ve ekipmanın aşınmasına neden olmasını önler." msgid "Go Home" msgstr "Anasayfaya Git" -msgid "A error occurred. Maybe memory of system is not enough or it's a bug of the program" -msgstr "Bir hata oluştu. Belki sistemin hafızası yeterli değildir veya programın bir hatasıdır" +msgid "" +"A error occurred. Maybe memory of system is not enough or it's a bug of the " +"program" +msgstr "" +"Bir hata oluştu. Belki sistemin hafızası yeterli değildir veya programın bir " +"hatasıdır" msgid "Please save project and restart the program. " msgstr "Lütfen projeyi kaydedin ve programı yeniden başlatın. " @@ -2137,7 +2335,9 @@ msgstr "Geçici G kodunun çıkış G koduna kopyalanması başarısız oldu" #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" -msgstr "\"%1%\" hedefine yükleme planlanıyor. Bkz. Pencere -> Ana Bilgisayar Yükleme Sırasını Yazdır" +msgstr "" +"\"%1%\" hedefine yükleme planlanıyor. Bkz. Pencere -> Ana Bilgisayar Yükleme " +"Sırasını Yazdır" msgid "Origin" msgstr "Menşei" @@ -2148,10 +2348,14 @@ msgstr "Çap" msgid "Size in X and Y of the rectangular plate." msgstr "Dikdörtgen plakanın X ve Y boyutları." -msgid "Distance of the 0,0 G-code coordinate from the front left corner of the rectangle." +msgid "" +"Distance of the 0,0 G-code coordinate from the front left corner of the " +"rectangle." msgstr "0,0 G kodu koordinatının dikdörtgenin sol ön köşesinden uzaklığı." -msgid "Diameter of the print bed. It is assumed that origin (0,0) is located in the center." +msgid "" +"Diameter of the print bed. It is assumed that origin (0,0) is located in the " +"center." msgstr "Baskı yatağının çapı. Orjinin (0,0) merkezde olduğu varsayılmaktadır." msgid "Rectangular" @@ -2193,7 +2397,8 @@ msgstr "Hata! Geçersiz model" msgid "The selected file contains no geometry." msgstr "Seçilen dosya geometri içermiyor." -msgid "The selected file contains several disjoint areas. This is not supported." +msgid "" +"The selected file contains several disjoint areas. This is not supported." msgstr "Seçilen dosya birkaç ayrık alan içeriyor. Bu desteklenmiyor." msgid "Choose a file to import bed texture from (PNG/SVG):" @@ -2215,10 +2420,13 @@ msgstr "" "\n" #, c-format, boost-format -msgid "Recommended nozzle temperature of this filament type is [%d, %d] degree centigrade" -msgstr "Bu filament tipinin tavsiye edilen Nozul sıcaklığı [%d, %d] derece santigrattır" +msgid "" +"Recommended nozzle temperature of this filament type is [%d, %d] degree " +"centigrade" +msgstr "" +"Bu filament tipinin tavsiye edilen Nozul sıcaklığı [%d, %d] derece " +"santigrattır" -#, c-format, boost-format msgid "" "Too small max volumetric speed.\n" "Reset to 0.5" @@ -2227,8 +2435,14 @@ msgstr "" "0,5'e sıfırla" #, 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 "Mevcut hazne sıcaklığı malzemenin güvenli sıcaklığından yüksektir, malzemenin yumuşamasına ve tıkanmasına neden olabilir Malzeme için maksimum güvenli sıcaklık %d'dir" +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 "" +"Mevcut hazne sıcaklığı malzemenin güvenli sıcaklığından yüksektir, " +"malzemenin yumuşamasına ve tıkanmasına neden olabilir Malzeme için maksimum " +"güvenli sıcaklık %d'dir" msgid "" "Too small layer height.\n" @@ -2254,13 +2468,15 @@ msgstr "" "İlk katmanın yüksekliği 0,2'ye sıfırlanacaktır." msgid "" -"This setting is only used for model size tunning with small value in some cases.\n" +"This setting is only used for model size tunning with small value in some " +"cases.\n" "For example, when model size has small error and hard to be assembled.\n" "For large size tuning, please use model scale function.\n" "\n" "The value will be reset to 0." msgstr "" -"Bu ayar yalnızca bazı durumlarda küçük değere sahip model boyutu ayarı için kullanılır.\n" +"Bu ayar yalnızca bazı durumlarda küçük değere sahip model boyutu ayarı için " +"kullanılır.\n" "Örneğin, model boyutunda hata küçük olduğunda ve montajı zor olduğunda.\n" "Büyük boyutlu ayarlama için lütfen model ölçeği işlevini kullanın.\n" "\n" @@ -2279,11 +2495,17 @@ msgstr "" "\n" "Değer 0'a sıfırlanacaktır." -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 "Spiral mod yalnızca duvar döngüleri 1 olduğunda, destek devre dışı bırakıldığında, üst kabuk katmanları 0 olduğunda, seyrek dolgu yoğunluğu 0 olduğunda ve timelapse türü geleneksel olduğunda çalışır." +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 "" +"Spiral mod yalnızca duvar döngüleri 1 olduğunda, destek devre dışı " +"bırakıldığında, üst kabuk katmanları 0 olduğunda, seyrek dolgu yoğunluğu 0 " +"olduğunda ve timelapse türü geleneksel olduğunda çalışır." msgid " But machines with I3 structure will not generate timelapse videos." -msgstr " Ancak I3 yapısına sahip yazıcılar timelapse videolar oluşturmayacaktır." +msgstr "" +" Ancak I3 yapısına sahip yazıcılar timelapse videolar oluşturmayacaktır." msgid "" "Change these settings automatically? \n" @@ -2291,19 +2513,23 @@ msgid "" "No - Give up using spiral mode this time" msgstr "" "Bu ayarlar otomatik olarak değiştirilsin mi?\n" -"Evet - Bu ayarları değiştirin ve spiral modunu otomatik olarak etkinleştirin\n" +"Evet - Bu ayarları değiştirin ve spiral modunu otomatik olarak " +"etkinleştirin\n" "Hayır - Bu sefer spiral modunu kullanmaktan vazgeçin" msgid "" -"Prime tower does not work when Adaptive Layer Height or Independent Support Layer Height is on.\n" +"Prime tower does not work when Adaptive Layer Height or Independent Support " +"Layer Height is on.\n" "Which do you want to keep?\n" "YES - Keep Prime Tower\n" "NO - Keep Adaptive Layer Height and Independent Support Layer Height" msgstr "" -"Prime tower, Uyarlanabilir Katman Yüksekliği veya Bağımsız Destek Katmanı Yüksekliği açıkken çalışmaz.\n" +"Prime tower, Uyarlanabilir Katman Yüksekliği veya Bağımsız Destek Katmanı " +"Yüksekliği açıkken çalışmaz.\n" "Hangisini saklamak istiyorsun?\n" "EVET - Prime Tower'ı Koruyun\n" -"HAYIR - Uyarlanabilir Katman Yüksekliğini ve Bağımsız Destek Katmanı Yüksekliğini Koruyun" +"HAYIR - Uyarlanabilir Katman Yüksekliğini ve Bağımsız Destek Katmanı " +"Yüksekliğini Koruyun" msgid "" "Prime tower does not work when Adaptive Layer Height is on.\n" @@ -2476,14 +2702,32 @@ msgstr "Doğrulama başarısız oldu." msgid "Update failed." msgstr "Güncelleme başarısız." -msgid "The current chamber temperature or the target chamber temperature exceeds 45℃.In order to avoid extruder clogging,low temperature filament(PLA/PETG/TPU) is not allowed to be loaded." -msgstr "Mevcut hazne sıcaklığı veya hedef hazne sıcaklığı 45 ° C'yi aşıyor Ekstrüder tıkanmasını önlemek için düşük sıcaklıkta filament (PLA / PETG / TPU) yüklenmesine izin verilmez." +msgid "" +"The current chamber temperature or the target chamber temperature exceeds " +"45℃.In order to avoid extruder clogging,low temperature filament(PLA/PETG/" +"TPU) is not allowed to be loaded." +msgstr "" +"Mevcut hazne sıcaklığı veya hedef hazne sıcaklığı 45 ° C'yi aşıyor Ekstrüder " +"tıkanmasını önlemek için düşük sıcaklıkta filament (PLA / PETG / TPU) " +"yüklenmesine izin verilmez." -msgid "Low temperature filament(PLA/PETG/TPU) is loaded in the extruder.In order to avoid extruder clogging,it is not allowed to set the chamber temperature above 45℃." -msgstr "Ekstrüdere düşük sıcaklıkta filament (PLA / PETG / TPU) yüklendi. Ekstrüder tıkanmasını önlemek için hazne sıcaklığının 45 ° C'nin üzerine ayarlanmasına izin verilmez." +msgid "" +"Low temperature filament(PLA/PETG/TPU) is loaded in the extruder.In order to " +"avoid extruder clogging,it is not allowed to set the chamber temperature " +"above 45℃." +msgstr "" +"Ekstrüdere düşük sıcaklıkta filament (PLA / PETG / TPU) yüklendi. Ekstrüder " +"tıkanmasını önlemek için hazne sıcaklığının 45 ° C'nin üzerine ayarlanmasına " +"izin verilmez." -msgid "When you set the chamber temperature below 40℃, the chamber temperature control will not be activated. And the target chamber temperature will automatically be set to 0℃." -msgstr "Hazne sıcaklığını 40°C'nin altına ayarladığınızda, hazne sıcaklık kontrolü etkinleştirilmeyecektir. Ve hedef hazne sıcaklığı otomatik olarak 0°C'ye ayarlanacaktır." +msgid "" +"When you set the chamber temperature below 40℃, the chamber temperature " +"control will not be activated. And the target chamber temperature will " +"automatically be set to 0℃." +msgstr "" +"Hazne sıcaklığını 40°C'nin altına ayarladığınızda, hazne sıcaklık kontrolü " +"etkinleştirilmeyecektir. Ve hedef hazne sıcaklığı otomatik olarak 0°C'ye " +"ayarlanacaktır." msgid "Failed to start printing job" msgstr "Yazdırma işi başlatılamadı" @@ -2500,11 +2744,19 @@ msgstr "TPU, AMS tarafından desteklenmez." msgid "Bambu PET-CF/PA6-CF is not supported by AMS." msgstr "Bambu PET-CF/PA6-CF, AMS tarafından desteklenNozulktedir." -msgid "Damp PVA will become flexible and get stuck inside AMS,please take care to dry it before use." -msgstr "Nemli PVA esnekleşecek ve AMS'nin içine sıkışacaktır, lütfen kullanmadan önce kurutmaya dikkat edin." +msgid "" +"Damp PVA will become flexible and get stuck inside AMS,please take care to " +"dry it before use." +msgstr "" +"Nemli PVA esnekleşecek ve AMS'nin içine sıkışacaktır, lütfen kullanmadan " +"önce kurutmaya dikkat edin." -msgid "CF/GF filaments are hard and brittle, It's easy to break or get stuck in AMS, please use with caution." -msgstr "CF/GF filamentleri sert ve kırılgandır. AMS'de kırılması veya sıkışması kolaydır, lütfen dikkatli kullanın." +msgid "" +"CF/GF filaments are hard and brittle, It's easy to break or get stuck in " +"AMS, please use with caution." +msgstr "" +"CF/GF filamentleri sert ve kırılgandır. AMS'de kırılması veya sıkışması " +"kolaydır, lütfen dikkatli kullanın." msgid "default" msgstr "varsayılan" @@ -2515,6 +2767,7 @@ msgstr "parametre adı" msgid "N/A" msgstr "N/A" +#, c-format, boost-format msgid "%s can't be percentage" msgstr "%s yüzde olamaz" @@ -2528,6 +2781,7 @@ msgstr "Parametre doğrulama" msgid "Value is out of range." msgstr "Değer aralık dışında." +#, c-format, boost-format msgid "" "Is it %s%% or %s %s?\n" "YES for %s%%, \n" @@ -2607,8 +2861,8 @@ msgstr "Temizlenmiş" msgid "Total" msgstr "Toplam" -msgid "Total Time Estimation" -msgstr "Toplam Süre Tahmini" +msgid "Total Estimation" +msgstr "" msgid "Total time" msgstr "Toplam süre" @@ -2872,8 +3126,12 @@ msgid "Size:" msgstr "Boyut:" #, c-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)." -msgstr "%d katmanında gcode yollarında çakışmalar bulundu, z = %.2lf mm. Lütfen çakışan nesneleri daha uzağa ayırın (%s <-> %s)." +msgid "" +"Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " +"separate the conflicted objects farther (%s <-> %s)." +msgstr "" +"%d katmanında gcode yollarında çakışmalar bulundu, z = %.2lf mm. Lütfen " +"çakışan nesneleri daha uzağa ayırın (%s <-> %s)." msgid "An object is layed over the boundary of plate." msgstr "Plakanın sınırına bir nesne serilir." @@ -2889,10 +3147,12 @@ msgstr "Yalnızca düzenlenen nesne görünür." msgid "" "An object is laid over the boundary of plate or exceeds the height limit.\n" -"Please solve the problem by moving it totally on or off the plate, and confirming that the height is within the build volume." +"Please solve the problem by moving it totally on or off the plate, and " +"confirming that the height is within the build volume." msgstr "" "Plaka sınırının üzerine bir nesne döşenir veya yükseklik sınırını aşar.\n" -"Lütfen sorunu tamamen plakanın üzerine veya dışına hareket ettirerek ve yüksekliğin yapım hacmi dahilinde olduğunu doğrulayarak çözün." +"Lütfen sorunu tamamen plakanın üzerine veya dışına hareket ettirerek ve " +"yüksekliğin yapım hacmi dahilinde olduğunu doğrulayarak çözün." msgid "Calibration step selection" msgstr "Kalibrasyon adımı seçimi" @@ -2913,10 +3173,12 @@ msgid "Calibration program" msgstr "Kalibrasyon programı" msgid "" -"The calibration program detects the status of your device automatically to minimize deviation.\n" +"The calibration program detects the status of your device automatically to " +"minimize deviation.\n" "It keeps the device performing optimally." msgstr "" -"Kalibrasyon programı, sapmayı en aza indirmek için cihazınızın durumunu otomatik olarak algılar.\n" +"Kalibrasyon programı, sapmayı en aza indirmek için cihazınızın durumunu " +"otomatik olarak algılar.\n" "Cihazın en iyi şekilde çalışmasını sağlar." msgid "Calibration Flow" @@ -3002,7 +3264,8 @@ msgid "No" msgstr "HAYIR" msgid "will be closed before creating a new model. Do you want to continue?" -msgstr "yeni bir model oluşturulmadan önce kapatılacaktır. Devam etmek istiyor musun?" +msgstr "" +"yeni bir model oluşturulmadan önce kapatılacaktır. Devam etmek istiyor musun?" msgid "Slice plate" msgstr "Plakayı dilimle" @@ -3367,8 +3630,10 @@ msgstr "Dizin seç" #, c-format, boost-format msgid "There is %d config exported. (Only non-system configs)" msgid_plural "There are %d configs exported. (Only non-system configs)" -msgstr[0] "Dışa aktarılan %d yapılandırma var. (Yalnızca sistem dışı yapılandırmalar)" -msgstr[1] "Dışa aktarılan %d yapılandırma var. (Yalnızca sistem dışı yapılandırmalar)" +msgstr[0] "" +"Dışa aktarılan %d yapılandırma var. (Yalnızca sistem dışı yapılandırmalar)" +msgstr[1] "" +"Dışa aktarılan %d yapılandırma var. (Yalnızca sistem dışı yapılandırmalar)" msgid "Export result" msgstr "Sonucu dışa aktar" @@ -3378,9 +3643,14 @@ msgstr "Yüklenecek profili seç:" #, c-format, boost-format msgid "There is %d config imported. (Only non-system and compatible configs)" -msgid_plural "There are %d configs imported. (Only non-system and compatible configs)" -msgstr[0] "İçe aktarılan %d yapılandırma var. (Yalnızca sistem dışı ve uyumlu yapılandırmalar)" -msgstr[1] "İçe aktarılan %d yapılandırma var. (Yalnızca sistem dışı ve uyumlu yapılandırmalar)" +msgid_plural "" +"There are %d configs imported. (Only non-system and compatible configs)" +msgstr[0] "" +"İçe aktarılan %d yapılandırma var. (Yalnızca sistem dışı ve uyumlu " +"yapılandırmalar)" +msgstr[1] "" +"İçe aktarılan %d yapılandırma var. (Yalnızca sistem dışı ve uyumlu " +"yapılandırmalar)" msgid "Import result" msgstr "Sonucu içe aktar" @@ -3420,7 +3690,8 @@ msgid "Initialize failed (No Camera Device)!" msgstr "Başlatma başarısız oldu (Kamera Cihazı Yok)!" msgid "Printer is busy downloading, Please wait for the downloading to finish." -msgstr "Yazıcı indirme işlemiyle meşgul. Lütfen indirme işleminin bitmesini bekleyin." +msgstr "" +"Yazıcı indirme işlemiyle meşgul. Lütfen indirme işleminin bitmesini bekleyin." msgid "Loading..." msgstr "Yükleniyor..." @@ -3444,6 +3715,7 @@ msgstr "Başlatma başarısız oldu (%s)!" msgid "Network unreachable" msgstr "Ağa ulaşılamıyor" +#, c-format, boost-format msgid "Stopped [%d]!" msgstr "[%d] durduruldu!" @@ -3482,6 +3754,7 @@ msgstr "Bilgi" msgid "Playing..." msgstr "Oynatılıyor..." +#, c-format, boost-format msgid "Load failed [%d]!" msgstr "Yükleme başarısız [%d]!" @@ -3543,17 +3816,22 @@ msgstr "Bağlantı başarısız oldu [%d]!" msgid "Loading file list..." msgstr "Dosya listesi yükleniyor..." +#, c-format, boost-format msgid "No files [%d]" msgstr "Dosya yok [%d]" +#, c-format, boost-format msgid "Load failed [%d]" msgstr "Yükleme başarısız [%d]" #, c-format, boost-format msgid "You are going to delete %u file from printer. Are you sure to continue?" -msgid_plural "You are going to delete %u files from printer. Are you sure to continue?" -msgstr[0] "%u dosyasını yazıcıdan sileceksiniz. Devam edeceğinizden emin misiniz?" -msgstr[1] "%u dosyayı yazıcıdan sileceksiniz. Devam edeceğinizden emin misiniz?" +msgid_plural "" +"You are going to delete %u files from printer. Are you sure to continue?" +msgstr[0] "" +"%u dosyasını yazıcıdan sileceksiniz. Devam edeceğinizden emin misiniz?" +msgstr[1] "" +"%u dosyayı yazıcıdan sileceksiniz. Devam edeceğinizden emin misiniz?" msgid "Delete files" msgstr "Dosyaları sil" @@ -3574,8 +3852,12 @@ msgstr "Model bilgileri yazıcıdan alınamadı." msgid "Failed to parse model infomations." msgstr "Model bilgileri ayrıştırılamadı." -msgid "The .gcode.3mf file contains no G-code data.Please slice it whthBambu Studio and export a new .gcode.3mf file." -msgstr ".gcode.3mf dosyası hiçbir G kodu verisi içermiyor. Lütfen dosyayı Bambu Studio ile dilimleyin ve yeni bir .gcode.3mf dosyasını dışa aktarın." +msgid "" +"The .gcode.3mf file contains no G-code data.Please slice it whthBambu Studio " +"and export a new .gcode.3mf file." +msgstr "" +".gcode.3mf dosyası hiçbir G kodu verisi içermiyor. Lütfen dosyayı Bambu " +"Studio ile dilimleyin ve yeni bir .gcode.3mf dosyasını dışa aktarın." #, c-format, boost-format msgid "File '%s' was lost! Please download it again." @@ -3593,6 +3875,7 @@ msgstr "Klasörü Aç" msgid "Download finished" msgstr "İndirme tamamlandı" +#, c-format, boost-format msgid "Downloading %d%%..." msgstr "%d%% indiriliyor..." @@ -3662,8 +3945,12 @@ msgstr "Temizle" msgid "How do you like this printing file?" msgstr "Bu baskı dosyasını nasıl buldunuz?" -msgid "(The model has already been rated. Your rating will overwrite the previous rating.)" -msgstr "(Model zaten derecelendirilmiştir. Derecelendirmeniz önceki derecelendirmenin üzerine yazılacaktır)" +msgid "" +"(The model has already been rated. Your rating will overwrite the previous " +"rating.)" +msgstr "" +"(Model zaten derecelendirilmiştir. Derecelendirmeniz önceki " +"derecelendirmenin üzerine yazılacaktır)" msgid "Rate" msgstr "Derecelendir" @@ -3733,6 +4020,7 @@ msgstr "Bulut Dilimleme Sırasında önünüzde %s görev var." msgid "Layer: %s" msgstr "Katman: %s" +#, c-format, boost-format msgid "Layer: %d/%d" msgstr "Katman: %d/%d" @@ -3748,8 +4036,12 @@ msgstr "Daha Fazla Yükle" msgid "Please select an AMS slot before calibration" msgstr "Lütfen kalibrasyondan önce bir AMS yuvası seçin" -msgid "Cannot read filament info: the filament is loaded to the tool head,please unload the filament and try again." -msgstr "Filament bilgisi okunamıyor: Filament alet kafasına yüklenmiştir, lütfen filamanı boşaltın ve tekrar deneyin." +msgid "" +"Cannot read filament info: the filament is loaded to the tool head,please " +"unload the filament and try again." +msgstr "" +"Filament bilgisi okunamıyor: Filament alet kafasına yüklenmiştir, lütfen " +"filamanı boşaltın ve tekrar deneyin." msgid "This only takes effect during printing" msgstr "Bu yalnızca yazdırma sırasında etkili olur" @@ -3815,17 +4107,21 @@ msgid " can not be opened\n" msgstr " açılamaz\n" msgid "" -"The following issues occurred during the process of uploading images. Do you want to ignore them?\n" +"The following issues occurred during the process of uploading images. Do you " +"want to ignore them?\n" "\n" msgstr "" -"Resim yükleme işlemi sırasında aşağıdaki sorunlar oluştu. Bunları görmezden gelmek ister misiniz?\n" +"Resim yükleme işlemi sırasında aşağıdaki sorunlar oluştu. Bunları görmezden " +"gelmek ister misiniz?\n" "\n" msgid "info" msgstr "bilgi" msgid "Synchronizing the printing results. Please retry a few seconds later." -msgstr "Yazdırma sonuçları senkronize ediliyor. Lütfen birkaç saniye sonra tekrar deneyin." +msgstr "" +"Yazdırma sonuçları senkronize ediliyor. Lütfen birkaç saniye sonra tekrar " +"deneyin." msgid "Upload failed\n" msgstr "Yükleme başarısız\n" @@ -3854,8 +4150,12 @@ msgstr "" "\n" "Derecelendirme için web sayfasına yönlendirmek ister misiniz?" -msgid "Some of your images failed to upload. Would you like to redirect to the webpage for rating?" -msgstr "Bazı resimleriniz yüklenemedi. Değerlendirme için web sayfasına yönlendirmek ister misiniz?" +msgid "" +"Some of your images failed to upload. Would you like to redirect to the " +"webpage for rating?" +msgstr "" +"Bazı resimleriniz yüklenemedi. Değerlendirme için web sayfasına yönlendirmek " +"ister misiniz?" msgid "You can select up to 16 images." msgstr "En fazla 16 görüntü seçebilirsiniz." @@ -3863,7 +4163,9 @@ msgstr "En fazla 16 görüntü seçebilirsiniz." msgid "" "At least one successful print record of this print profile is required \n" "to give a positive rating(4 or 5stars)." -msgstr "Bu baskı profiline olumlu bir puan vermek için (4 veya 5 yıldız) en az bir başarılı baskı kaydı gereklidir." +msgstr "" +"Bu baskı profiline olumlu bir puan vermek için (4 veya 5 yıldız) en az bir " +"başarılı baskı kaydı gereklidir." msgid "Status" msgstr "Durum" @@ -3877,6 +4179,7 @@ msgstr "HMS" msgid "Don't show again" msgstr "Bir daha gösterme" +#, c-format, boost-format msgid "%s error" msgstr "%s hata" @@ -3884,12 +4187,15 @@ msgstr "%s hata" msgid "%s has encountered an error" msgstr "%s bir hatayla karşılaştı" +#, c-format, boost-format msgid "%s warning" msgstr "%s uyarı" +#, c-format, boost-format msgid "%s has a warning" msgstr "%s'de uyarı var" +#, c-format, boost-format msgid "%s info" msgstr "%s bilgi" @@ -4003,7 +4309,8 @@ msgid "WARNING:" msgstr "UYARI:" msgid "Your model needs support ! Please make support material enable." -msgstr "Modelinizin desteğe ihtiyacı var! Lütfen destek materyalini etkinleştirin." +msgstr "" +"Modelinizin desteğe ihtiyacı var! Lütfen destek materyalini etkinleştirin." msgid "Gcode path overlap" msgstr "Gcode yolu çakışması" @@ -4023,8 +4330,11 @@ msgstr "Katmanlar" msgid "Range" msgstr "Aralık" -msgid "The application cannot run normally because OpenGL version is lower than 2.0.\n" -msgstr "OpenGL sürümü 2.0'dan düşük olduğundan uygulama normal şekilde çalışamıyor.\n" +msgid "" +"The application cannot run normally because OpenGL version is lower than " +"2.0.\n" +msgstr "" +"OpenGL sürümü 2.0'dan düşük olduğundan uygulama normal şekilde çalışamıyor.\n" msgid "Please upgrade your graphics card driver." msgstr "Lütfen grafik kartı sürücünüzü yükseltin." @@ -4060,8 +4370,12 @@ msgstr "Duraklatma hassasiyeti" msgid "Enable detection of build plate position" msgstr "Yapı plakası konumunun algılanmasını etkinleştir" -msgid "The localization tag of build plate is detected, and printing is paused if the tag is not in predefined range." -msgstr "Baskı plakasının yerelleştirme etiketi algılanır ve etiket önceden tanımlanmış aralıkta değilse yazdırma duraklatılır." +msgid "" +"The localization tag of build plate is detected, and printing is paused if " +"the tag is not in predefined range." +msgstr "" +"Baskı plakasının yerelleştirme etiketi algılanır ve etiket önceden " +"tanımlanmış aralıkta değilse yazdırma duraklatılır." msgid "First Layer Inspection" msgstr "Birinci Katman Denetimi" @@ -4093,9 +4407,28 @@ msgstr "Filament ayarları" msgid "Printer settings" msgstr "Yazıcı ayarları" +msgid "Remove current plate (if not last one)" +msgstr "" + +msgid "Auto orient objects on current plate" +msgstr "" + +msgid "Arrange objects on current plate" +msgstr "" + +msgid "Unlock current plate" +msgstr "" + +msgid "Lock current plate" +msgstr "" + +msgid "Customize current plate" +msgstr "" + msgid "Untitled" msgstr "İsimsiz" +#, boost-format msgid " plate %1%:" msgstr " plaka %1%:" @@ -4147,17 +4480,28 @@ msgstr "Filament listesini AMS'den senkronize edin" msgid "Set filaments to use" msgstr "Kullanılacak filamentleri ayarla" -msgid "No AMS filaments. Please select a printer in 'Device' page to load AMS info." -msgstr "AMS filamentleri yok. AMS bilgilerini yüklemek için lütfen 'Cihaz' sayfasında bir yazıcı seçin." +msgid "" +"No AMS filaments. Please select a printer in 'Device' page to load AMS info." +msgstr "" +"AMS filamentleri yok. AMS bilgilerini yüklemek için lütfen 'Cihaz' " +"sayfasında bir yazıcı seçin." msgid "Sync filaments with AMS" msgstr "Filamentleri AMS ile senkronize et" -msgid "Sync filaments with AMS will drop all current selected filament presets and colors. Do you want to continue?" -msgstr "Filamentleri AMS ile senkronize etmek, seçili tüm mevcut filament ön ayarlarını ve renklerini kaldıracaktır. Devam etmek istiyor musun?" +msgid "" +"Sync filaments with AMS will drop all current selected filament presets and " +"colors. Do you want to continue?" +msgstr "" +"Filamentleri AMS ile senkronize etmek, seçili tüm mevcut filament ön " +"ayarlarını ve renklerini kaldıracaktır. Devam etmek istiyor musun?" -msgid "Already did a synchronization, do you want to sync only changes or resync all?" -msgstr "Zaten bir senkronizasyon yaptınız. Yalnızca değişiklikleri senkronize etmek mi yoksa tümünü yeniden senkronize etmek mi istiyorsunuz?" +msgid "" +"Already did a synchronization, do you want to sync only changes or resync " +"all?" +msgstr "" +"Zaten bir senkronizasyon yaptınız. Yalnızca değişiklikleri senkronize etmek " +"mi yoksa tümünü yeniden senkronize etmek mi istiyorsunuz?" msgid "Sync" msgstr "Senkronizasyon" @@ -4168,16 +4512,26 @@ msgstr "Yeniden eşitleme" msgid "There are no compatible filaments, and sync is not performed." msgstr "Uyumlu filament yok ve senkronizasyon gerçekleştirilmiyor." -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 "Genel ön ayara eşlenen bazı bilinmeyen filamentler var. Sistem ön ayarlarında bir güncelleme olup olmadığını kontrol etmek için lütfen Orca Slicer'ı güncelleyin veya Orca Slicer'ı yeniden başlatın." +msgid "" +"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 "" +"Genel ön ayara eşlenen bazı bilinmeyen filamentler var. Sistem ön " +"ayarlarında bir güncelleme olup olmadığını kontrol etmek için lütfen Orca " +"Slicer'ı güncelleyin veya Orca Slicer'ı yeniden başlatın." #, boost-format msgid "Do you want to save changes to \"%1%\"?" msgstr "\"%1%\" dosyasındaki değişiklikleri kaydetmek istiyor musunuz?" #, c-format, boost-format -msgid "Successfully unmounted. The device %s(%s) can now be safely removed from the computer." -msgstr "Başarıyla kaldırıldı. %s(%s) aygıtı artık bilgisayardan güvenli bir şekilde kaldırılabilir." +msgid "" +"Successfully unmounted. The device %s(%s) can now be safely removed from the " +"computer." +msgstr "" +"Başarıyla kaldırıldı. %s(%s) aygıtı artık bilgisayardan güvenli bir şekilde " +"kaldırılabilir." #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." @@ -4189,21 +4543,35 @@ msgstr "Önceki kaydedilmemiş proje algılandı, geri yüklemek istiyor musunuz msgid "Restore" msgstr "Geri Yükleme" -msgid "The bed temperature exceeds filament's vitrification temperature. Please open the front door of printer before printing to avoid nozzle clog." -msgstr "Yatak sıcaklığı filamanın vitrifikasyon sıcaklığını aşıyor. Püskürtme ucunun tıkanmasını önlemek için lütfen yazdırmadan önce yazıcının ön kapısını açın." +msgid "" +"The bed temperature exceeds filament's vitrification temperature. Please " +"open the front door of printer before printing to avoid nozzle clog." +msgstr "" +"Yatak sıcaklığı filamanın vitrifikasyon sıcaklığını aşıyor. Püskürtme ucunun " +"tıkanmasını önlemek için lütfen yazdırmadan önce yazıcının ön kapısını açın." -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 "Filamentin gerektirdiği nozul sertliği, yazıcının varsayılan nozul sertliğinden daha yüksektir. Lütfen sertleşmiş nozülü veya filamanı değiştirin, aksi takdirde nozül aşınır veya hasar görür." +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 "" +"Filamentin gerektirdiği nozul sertliği, yazıcının varsayılan nozul " +"sertliğinden daha yüksektir. Lütfen sertleşmiş nozülü veya filamanı " +"değiştirin, aksi takdirde nozül aşınır veya hasar görür." -msgid "Enabling traditional timelapse photography may cause surface imperfections. It is recommended to change to smooth mode." -msgstr "Geleneksel timelapse etkinleştirilmesi yüzey kusurlarına neden olabilir. Yumuşak moda geçilmesi önerilir." +msgid "" +"Enabling traditional timelapse photography may cause surface imperfections. " +"It is recommended to change to smooth mode." +msgstr "" +"Geleneksel timelapse etkinleştirilmesi yüzey kusurlarına neden olabilir. " +"Yumuşak moda geçilmesi önerilir." #, c-format, boost-format msgid "Loading file: %s" msgstr "Dosya yükleniyor: %s" -msgid "The 3mf is not from Bambu Lab, load geometry data only." -msgstr "3mf, Bambu Lab'den değildir, yalnızca geometri verilerini yükleyin." +msgid "The 3mf is not supported by OrcaSlicer, load geometry data only." +msgstr "" msgid "Load 3mf" msgstr "3mf yükle" @@ -4212,11 +4580,17 @@ msgid "The Config can not be loaded." msgstr "Yapılandırma yüklenemiyor." msgid "The 3mf is generated by old Orca Slicer, load geometry data only." -msgstr "3mf, eski Orca Slicer tarafından oluşturulmuştur, yalnızca geometri verilerini yükleyin." +msgstr "" +"3mf, eski Orca Slicer tarafından oluşturulmuştur, yalnızca geometri " +"verilerini yükleyin." #, c-format, boost-format -msgid "The 3mf's version %s is newer than %s's version %s, Found following keys unrecognized:" -msgstr "3mf'nin %s sürümü, %s'in %s sürümünden daha yeni, Aşağıdaki anahtarlar tanınmadan bulundu:" +msgid "" +"The 3mf's version %s is newer than %s's version %s, Found following keys " +"unrecognized:" +msgstr "" +"3mf'nin %s sürümü, %s'in %s sürümünden daha yeni, Aşağıdaki anahtarlar " +"tanınmadan bulundu:" msgid "You'd better upgrade your software.\n" msgstr "Yazılımınızı yükseltseniz iyi olur.\n" @@ -4225,8 +4599,12 @@ msgid "Newer 3mf version" msgstr "Daha yeni 3mf sürümü" #, c-format, boost-format -msgid "The 3mf's version %s is newer than %s's version %s, Suggest to upgrade your software." -msgstr "3mf'nin %s sürümü, %s'in %s sürümünden daha yeni, Yazılımınızı yükseltmenizi öneririz." +msgid "" +"The 3mf's version %s is newer than %s's version %s, Suggest to upgrade your " +"software." +msgstr "" +"3mf'nin %s sürümü, %s'in %s sürümünden daha yeni, Yazılımınızı yükseltmenizi " +"öneririz." msgid "Invalid values found in the 3mf:" msgstr "3mf'de geçersiz değerler bulundu:" @@ -4280,7 +4658,8 @@ msgid "Multi-part object detected" msgstr "Çok parçalı nesne algılandı" msgid "Load these files as a single object with multiple parts?\n" -msgstr "Bu dosyalar birden fazla parçadan oluşan tek bir nesne olarak mı yüklensin?\n" +msgstr "" +"Bu dosyalar birden fazla parçadan oluşan tek bir nesne olarak mı yüklensin?\n" msgid "Object with multiple parts was detected" msgstr "Birden fazla parçaya sahip nesne algılandı" @@ -4288,8 +4667,12 @@ msgstr "Birden fazla parçaya sahip nesne algılandı" msgid "The file does not contain any geometry data." msgstr "Dosya herhangi bir geometri verisi içermiyor." -msgid "Your object appears to be too large, Do you want to scale it down to fit the heat bed automatically?" -msgstr "Nesneniz çok büyük görünüyor. Isı yatağına sığacak şekilde otomatik olarak küçültmek istiyor musunuz?" +msgid "" +"Your object appears to be too large, Do you want to scale it down to fit the " +"heat bed automatically?" +msgstr "" +"Nesneniz çok büyük görünüyor. Isı yatağına sığacak şekilde otomatik olarak " +"küçültmek istiyor musunuz?" msgid "Object too large" msgstr "Nesne çok büyük" @@ -4345,13 +4728,15 @@ msgstr "Geçersiz veri" msgid "Slicing Canceled" msgstr "Dilimleme İptal Edildi" +#, c-format, boost-format msgid "Slicing Plate %d" msgstr "Plaka %d dilimleniyor" msgid "Please resolve the slicing errors and publish again." msgstr "Lütfen dilimleme hatalarını giderip tekrar yayınlayın." -msgid "Network Plug-in is not detected. Network related features are unavailable." +msgid "" +"Network Plug-in is not detected. Network related features are unavailable." msgstr "Ağ Eklentisi algılanmadı. Ağla ilgili özellikler kullanılamıyor." msgid "" @@ -4372,10 +4757,12 @@ msgstr "Projeyi Aç" msgid "" "Failed to save the project.\n" -"Please check whether the folder exists online or if other programs open the project file." +"Please check whether the folder exists online or if other programs open the " +"project file." msgstr "" "Proje kaydedilemedi.\n" -"Lütfen klasörün çevrimiçi olup olmadığını veya proje dosyasını başka programların açıp açmadığını kontrol edin." +"Lütfen klasörün çevrimiçi olup olmadığını veya proje dosyasını başka " +"programların açıp açmadığını kontrol edin." msgid "Save project" msgstr "Projeyi kaydet" @@ -4389,11 +4776,16 @@ msgstr "3mf dosyasını hazırla..." msgid "downloading project ..." msgstr "proje indiriliyor..." +#, c-format, boost-format msgid "Project downloaded %d%%" msgstr "Proje %d%% indirildi" -msgid "Importing to Bambu Studio failed. Please download the file and manually import it." -msgstr "Bambu Studio'ya aktarma başarısız oldu. Lütfen dosyayı indirin ve manuel olarak İçe aktarın." +msgid "" +"Importing to Bambu Studio failed. Please download the file and manually " +"import it." +msgstr "" +"Bambu Studio'ya aktarma başarısız oldu. Lütfen dosyayı indirin ve manuel " +"olarak İçe aktarın." msgid "The selected file" msgstr "Seçili dosya" @@ -4435,7 +4827,9 @@ msgid "All objects will be removed, continue?" msgstr "Tüm nesneler kaldırılacak, devam edilsin mi?" msgid "The current project has unsaved changes, save it before continue?" -msgstr "Mevcut projede kaydedilmemiş değişiklikler var. Devam etmeden önce kaydedilsin mi?" +msgstr "" +"Mevcut projede kaydedilmemiş değişiklikler var. Devam etmeden önce " +"kaydedilsin mi?" msgid "Remember my choice." msgstr "Seçimimi hatırla." @@ -4453,11 +4847,19 @@ msgid "Save Sliced file as:" msgstr "Dilimlenmiş dosyayı şu şekilde kaydedin:" #, c-format, boost-format -msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." -msgstr "%s dosyası yazıcının depolama alanına gönderildi ve yazıcıda görüntülenebiliyor." +msgid "" +"The file %s has been sent to the printer's storage space and can be viewed " +"on the printer." +msgstr "" +"%s dosyası yazıcının depolama alanına gönderildi ve yazıcıda " +"görüntülenebiliyor." -msgid "Unable to perform boolean operation on model meshes. Only positive parts will be exported." -msgstr "Model ağlarında boole işlemi gerçekleştirilemiyor. Yalnızca pozitif parçalar ihraç edilecektir." +msgid "" +"Unable to perform boolean operation on model meshes. Only positive parts " +"will be exported." +msgstr "" +"Model ağlarında boole işlemi gerçekleştirilemiyor. Yalnızca pozitif parçalar " +"ihraç edilecektir." msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "Yazıcı hazır mı? Baskı plakası takılı, boş ve temiz mi?" @@ -4470,7 +4872,8 @@ msgid "" "Suggest to use auto-arrange to avoid collisions when printing." msgstr "" "Nesneye Göre Yazdır:\n" -"Yazdırma sırasında çarpışmaları önlemek için otomatik düzenlemeyi kullanmanızı önerin." +"Yazdırma sırasında çarpışmaları önlemek için otomatik düzenlemeyi " +"kullanmanızı önerin." msgid "Send G-code" msgstr "G-kodu gönder" @@ -4495,9 +4898,11 @@ msgstr "Şu anda seçili parça sayısı: %1%\n" msgid "Number of currently selected objects: %1%\n" msgstr "Şu anda seçili nesnelerin sayısı: %1%\n" +#, boost-format msgid "Part name: %1%\n" msgstr "Parça adı: %1%\n" +#, boost-format msgid "Object name: %1%\n" msgstr "Nesne adı: %1%\n" @@ -4509,24 +4914,37 @@ msgstr "Boyut: %1% x %2% x %3%\n" msgid "Size: %1% x %2% x %3% mm\n" msgstr "Boyut: %1% x %2% x %3% mm\n" +#, boost-format msgid "Volume: %1% in³\n" msgstr "Hacim: %1% in³\n" +#, boost-format msgid "Volume: %1% mm³\n" msgstr "Hacim: %1% mm³\n" +#, boost-format msgid "Triangles: %1%\n" msgstr "Üçgenler: %1%\n" msgid "Tips:" msgstr "İpuçları:" -msgid "\"Fix Model\" feature is currently only on Windows. Please repair the model on Orca Slicer(windows) or CAD softwares." -msgstr "\"Modeli Onar\" özelliği şu anda yalnızca Windows'ta bulunmaktadır. Lütfen modeli Orca Slicer (windows) veya CAD yazılımlarında onarın." +msgid "" +"\"Fix Model\" feature is currently only on Windows. Please repair the model " +"on Orca Slicer(windows) or CAD softwares." +msgstr "" +"\"Modeli Onar\" özelliği şu anda yalnızca Windows'ta bulunmaktadır. Lütfen " +"modeli Orca Slicer (windows) veya CAD yazılımlarında onarın." #, 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 to non zero." -msgstr "Plaka% d: %s'nin %s(%s) filamanını yazdırmak için kullanılması önerilmez. Eğer yine de bu baskıyı yapmak istiyorsanız, lütfen bu filamanın yatak sıcaklığını sıfır olmayan bir değere ayarlayın." +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 " +"to non zero." +msgstr "" +"Plaka% d: %s'nin %s(%s) filamanını yazdırmak için kullanılması önerilmez. " +"Eğer yine de bu baskıyı yapmak istiyorsanız, lütfen bu filamanın yatak " +"sıcaklığını sıfır olmayan bir değere ayarlayın." msgid "Switching the language requires application restart.\n" msgstr "Dili değiştirmek uygulamanın yeniden başlatılmasını gerektirir.\n" @@ -4594,8 +5012,12 @@ msgstr "Birimler" msgid "Zoom to mouse position" msgstr "Fare konumuna yakınlaştır" -msgid "Zoom in towards the mouse pointer's position in the 3D view, rather than the 2D window center." -msgstr "2B pencere merkezi yerine, 3B görünümde fare işaretçisinin konumuna doğru yakınlaştırın." +msgid "" +"Zoom in towards the mouse pointer's position in the 3D view, rather than the " +"2D window center." +msgstr "" +"2B pencere merkezi yerine, 3B görünümde fare işaretçisinin konumuna doğru " +"yakınlaştırın." msgid "Show \"Tip of the day\" notification after start" msgstr "Başlangıçtan sonra \"Günün ipucu\" bildirimini göster" @@ -4634,19 +5056,25 @@ msgid "Associate .3mf files to OrcaSlicer" msgstr ".3mf dosyalarını OrcaSlicer ile ilişkilendirin" msgid "If enabled, sets OrcaSlicer as default application to open .3mf files" -msgstr "Etkinleştirilirse, OrcaSlicer'ı .3mf dosyalarını açacak varsayılan uygulama olarak ayarlar" +msgstr "" +"Etkinleştirilirse, OrcaSlicer'ı .3mf dosyalarını açacak varsayılan uygulama " +"olarak ayarlar" msgid "Associate .stl files to OrcaSlicer" msgstr ".stl dosyalarını OrcaSlicer ile ilişkilendirin" msgid "If enabled, sets OrcaSlicer as default application to open .stl files" -msgstr "Etkinleştirilirse OrcaSlicer'ı .stl dosyalarını açmak için varsayılan uygulama olarak ayarlar" +msgstr "" +"Etkinleştirilirse OrcaSlicer'ı .stl dosyalarını açmak için varsayılan " +"uygulama olarak ayarlar" msgid "Associate .step/.stp files to OrcaSlicer" msgstr ".step/.stp dosyalarını OrcaSlicer ile ilişkilendirin" msgid "If enabled, sets OrcaSlicer as default application to open .step files" -msgstr "Etkinleştirilirse, OrcaSlicer'ı .step dosyalarını açmak için varsayılan uygulama olarak ayarlar" +msgstr "" +"Etkinleştirilirse, OrcaSlicer'ı .step dosyalarını açmak için varsayılan " +"uygulama olarak ayarlar" msgid "Online Models" msgstr "Çevrimiçi Modeller" @@ -4666,8 +5094,11 @@ msgstr "Kaydedilmemiş projelerdeki seçimimi temizle." msgid "Auto-Backup" msgstr "Otomatik yedekleme" -msgid "Backup your project periodically for restoring from the occasional crash." -msgstr "Ara sıra meydana gelen çökmelerden sonra geri yüklemek için projenizi düzenli aralıklarla yedekleyin." +msgid "" +"Backup your project periodically for restoring from the occasional crash." +msgstr "" +"Ara sıra meydana gelen çökmelerden sonra geri yüklemek için projenizi " +"düzenli aralıklarla yedekleyin." msgid "every" msgstr "her" @@ -4948,6 +5379,7 @@ msgstr "\"%1%\" yazıcısı \"%2%\" ön ayarıyla seçildi" msgid "Please choose an action with \"%1%\" preset after saving." msgstr "Lütfen kaydettikten sonra \"%1%\" ön ayarına sahip bir eylem seçin." +#, boost-format msgid "For \"%1%\", change \"%2%\" to \"%3%\" " msgstr "\"%1%\" için \"%2%\"yi \"%3%\" olarak değiştirin " @@ -4955,6 +5387,7 @@ msgstr "\"%1%\" için \"%2%\"yi \"%3%\" olarak değiştirin " msgid "For \"%1%\", add \"%2%\" as a new preset" msgstr "\"%1%\" için \"%2%\"yi yeni ön ayar olarak ekleyin" +#, boost-format msgid "Simply switch to \"%1%\"" msgstr "Kolayca \"%1%\"e geçin" @@ -4994,8 +5427,8 @@ msgstr "Bambu Soğuk Plaka" msgid "PLA Plate" msgstr "PLA Plaka" -msgid "Bamabu Engineering Plate" -msgstr "Bamabu Mühendislik Plakası" +msgid "Bambu Engineering Plate" +msgstr "" msgid "Bambu Smooth PEI Plate" msgstr "Bambu Pürüzsüz PEI Plaka" @@ -5034,7 +5467,8 @@ msgid "Printer local connection failed, please try again." msgstr "Yazıcının yerel bağlantısı başarısız oldu, lütfen tekrar deneyin." msgid "No login account, only printers in LAN mode are displayed" -msgstr "Oturum açma hesabı yok, yalnızca LAN modundaki yazıcılar görüntüleniyor" +msgstr "" +"Oturum açma hesabı yok, yalnızca LAN modundaki yazıcılar görüntüleniyor" msgid "Connecting to server" msgstr "Sunucuya baglanıyor" @@ -5048,34 +5482,65 @@ msgstr "Cihaz bilgilerinin senkronize edilmesi zaman aşımı" msgid "Cannot send the print job when the printer is updating firmware" msgstr "Yazıcı ürün yazılımını güncellerken yazdırma işi gönderilemiyor" -msgid "The printer is executing instructions. Please restart printing after it ends" -msgstr "Yazıcı talimatları yürütüyor. Lütfen bittikten sonra yazdırmayı yeniden başlatın" +msgid "" +"The printer is executing instructions. Please restart printing after it ends" +msgstr "" +"Yazıcı talimatları yürütüyor. Lütfen bittikten sonra yazdırmayı yeniden " +"başlatın" msgid "The printer is busy on other print job" msgstr "Yazıcı başka bir yazdırma işiyle meşgul" #, c-format, boost-format -msgid "Filament %s exceeds the number of AMS slots. Please update the printer firmware to support AMS slot assignment." -msgstr "%s filamanı AMS yuvası sayısını aşıyor. AMS yuvası atamasını desteklemek için lütfen yazıcının ürün yazılımını güncelleyin." +msgid "" +"Filament %s exceeds the number of AMS slots. Please update the printer " +"firmware to support AMS slot assignment." +msgstr "" +"%s filamanı AMS yuvası sayısını aşıyor. AMS yuvası atamasını desteklemek " +"için lütfen yazıcının ürün yazılımını güncelleyin." -msgid "Filament exceeds the number of AMS slots. Please update the printer firmware to support AMS slot assignment." -msgstr "Filament, AMS yuvalarının sayısını aşıyor. AMS yuvası atamasını desteklemek için lütfen yazıcının ürün yazılımını güncelleyin." +msgid "" +"Filament exceeds the number of AMS slots. Please update the printer firmware " +"to support AMS slot assignment." +msgstr "" +"Filament, AMS yuvalarının sayısını aşıyor. AMS yuvası atamasını desteklemek " +"için lütfen yazıcının ürün yazılımını güncelleyin." -msgid "Filaments to AMS slots mappings have been established. You can click a filament above to change its mapping AMS slot" -msgstr "AMS slot eşlemelerine yönelik filamanlar oluşturulmuştur. Eşleme AMS yuvasını değiştirmek için yukarıdaki filamentlerden birine tıklayabilirsiniz" +msgid "" +"Filaments to AMS slots mappings have been established. You can click a " +"filament above to change its mapping AMS slot" +msgstr "" +"AMS slot eşlemelerine yönelik filamanlar oluşturulmuştur. Eşleme AMS " +"yuvasını değiştirmek için yukarıdaki filamentlerden birine tıklayabilirsiniz" -msgid "Please click each filament above to specify its mapping AMS slot before sending the print job" -msgstr "Yazdırma işini göndermeden önce eşleme AMS yuvasını belirtmek için lütfen yukarıdaki her filamente tıklayın" +msgid "" +"Please click each filament above to specify its mapping AMS slot before " +"sending the print job" +msgstr "" +"Yazdırma işini göndermeden önce eşleme AMS yuvasını belirtmek için lütfen " +"yukarıdaki her filamente tıklayın" #, c-format, boost-format -msgid "Filament %s does not match the filament in AMS slot %s. Please update the printer firmware to support AMS slot assignment." -msgstr "%s filamanı, %s AMS yuvasındaki filamanla eşleşmiyor. AMS yuvası atamasını desteklemek için lütfen yazıcının ürün yazılımını güncelleyin." +msgid "" +"Filament %s does not match the filament in AMS slot %s. Please update the " +"printer firmware to support AMS slot assignment." +msgstr "" +"%s filamanı, %s AMS yuvasındaki filamanla eşleşmiyor. AMS yuvası atamasını " +"desteklemek için lütfen yazıcının ürün yazılımını güncelleyin." -msgid "Filament does not match the filament in AMS slot. Please update the printer firmware to support AMS slot assignment." -msgstr "Filament, AMS yuvasındaki filamanla eşleşmiyor. AMS yuvası atamasını desteklemek için lütfen yazıcının ürün yazılımını güncelleyin." +msgid "" +"Filament does not match the filament in AMS slot. Please update the printer " +"firmware to support AMS slot assignment." +msgstr "" +"Filament, AMS yuvasındaki filamanla eşleşmiyor. AMS yuvası atamasını " +"desteklemek için lütfen yazıcının ürün yazılımını güncelleyin." -msgid "The printer firmware only supports sequential mapping of filament => AMS slot." -msgstr "Yazıcı ürün yazılımı yalnızca filament => AMS yuvasının sıralı eşlemesini destekler." +msgid "" +"The printer firmware only supports sequential mapping of filament => AMS " +"slot." +msgstr "" +"Yazıcı ürün yazılımı yalnızca filament => AMS yuvasının sıralı eşlemesini " +"destekler." msgid "An SD card needs to be inserted before printing." msgstr "Yazdırmadan önce bir SD kartın takılması gerekir." @@ -5086,8 +5551,12 @@ msgstr "Seçilen yazıcı, seçilen yazıcı ön ayarlarıyla uyumlu değil." msgid "An SD card needs to be inserted to record timelapse." msgstr "Hızlandırılmış çekim kaydetmek için bir SD kartın takılması gerekir." -msgid "Cannot send the print job to a printer whose firmware is required to get updated." -msgstr "Yazdırma işi, ürün yazılımının güncellenmesi gereken bir yazıcıya gönderilemiyor." +msgid "" +"Cannot send the print job to a printer whose firmware is required to get " +"updated." +msgstr "" +"Yazdırma işi, ürün yazılımının güncellenmesi gereken bir yazıcıya " +"gönderilemiyor." msgid "Cannot send the print job for empty plate" msgstr "Boş kalıp için yazdırma işi gönderilemiyor" @@ -5095,11 +5564,19 @@ msgstr "Boş kalıp için yazdırma işi gönderilemiyor" msgid "This printer does not support printing all plates" msgstr "Bu yazıcı tüm kalıpların yazdırılmasını desteklemiyor" -msgid "When enable spiral vase mode, machines with I3 structure will not generate timelapse videos." -msgstr "Spiral vazo modu etkinleştirildiğinde, I3 yapısına sahip makineler zaman atlamalı videolar oluşturmayacaktır." +msgid "" +"When enable spiral vase mode, machines with I3 structure will not generate " +"timelapse videos." +msgstr "" +"Spiral vazo modu etkinleştirildiğinde, I3 yapısına sahip makineler zaman " +"atlamalı videolar oluşturmayacaktır." -msgid "When print by object, machines with I3 structure will not generate timelapse videos." -msgstr "Nesneye göre yazdırıldığında, I3 yapısına sahip makineler zaman atlamalı videolar oluşturmayacaktır." +msgid "" +"When print by object, machines with I3 structure will not generate timelapse " +"videos." +msgstr "" +"Nesneye göre yazdırıldığında, I3 yapısına sahip makineler zaman atlamalı " +"videolar oluşturmayacaktır." msgid "Errors" msgstr "Hatalar" @@ -5107,19 +5584,35 @@ msgstr "Hatalar" msgid "Please check the following:" msgstr "Lütfen aşağıdakileri kontrol edin:" -msgid "The printer type selected when generating G-Code is not consistent with the currently selected printer. It is recommended that you use the same printer type for slicing." -msgstr "G Kodu oluşturulurken seçilen yazıcı türü mevcut seçili yazıcıyla tutarlı değil. Dilimleme için aynı yazıcı tipini kullanmanız tavsiye edilir." +msgid "" +"The printer type selected when generating G-Code is not consistent with the " +"currently selected printer. It is recommended that you use the same printer " +"type for slicing." +msgstr "" +"G Kodu oluşturulurken seçilen yazıcı türü mevcut seçili yazıcıyla tutarlı " +"değil. Dilimleme için aynı yazıcı tipini kullanmanız tavsiye edilir." +#, c-format, boost-format msgid "%s is not supported by AMS." msgstr "%s AMS tarafından desteklenmiyor." -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 eşlemelerinde bazı bilinmeyen filamentler var. Lütfen bunların gerekli filamentler olup olmadığını kontrol edin. Sorun yoksa, yazdırmayı başlatmak için \"Onayla\"ya basın." +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 eşlemelerinde bazı bilinmeyen filamentler var. Lütfen bunların gerekli " +"filamentler olup olmadığını kontrol edin. Sorun yoksa, yazdırmayı başlatmak " +"için \"Onayla\"ya basın." -msgid "Please click the confirm button if you still want to proceed with printing." -msgstr "Hala yazdırma işlemine devam etmek istiyorsanız lütfen onayla düğmesine tıklayın." +msgid "" +"Please click the confirm button if you still want to proceed with printing." +msgstr "" +"Hala yazdırma işlemine devam etmek istiyorsanız lütfen onayla düğmesine " +"tıklayın." -msgid "Connecting to the printer. Unable to cancel during the connection process." +msgid "" +"Connecting to the printer. Unable to cancel during the connection process." msgstr "Yazıcıya bağlanılıyor. Bağlantı işlemi sırasında iptal edilemiyor." msgid "Preparing print job" @@ -5131,8 +5624,12 @@ msgstr "Anormal yazdırma dosyası verileri. Lütfen tekrar dilimleyin" msgid "The name length exceeds the limit." msgstr "Ad uzunluğu sınırı aşıyor." -msgid "Caution to use! Flow calibration on Textured PEI Plate may fail due to the scattered surface." -msgstr "Kullanmaya dikkat edin! Dokulu PEI Plakasındaki akış kalibrasyonu, dağınık yüzey nedeniyle başarısız olabilir." +msgid "" +"Caution to use! Flow calibration on Textured PEI Plate may fail due to the " +"scattered surface." +msgstr "" +"Kullanmaya dikkat edin! Dokulu PEI Plakasındaki akış kalibrasyonu, dağınık " +"yüzey nedeniyle başarısız olabilir." msgid "Automatic flow calibration using Micro Lidar" msgstr "Mikro Lidar kullanarak otomatik akış kalibrasyonu" @@ -5197,8 +5694,20 @@ msgstr "Oku ve kabul et" msgid "Terms and Conditions" msgstr "Şartlar ve koşullar" -msgid "Thank you for purchasing a Bambu Lab device.Before using your Bambu Lab device, please read the termsand conditions.By clicking to agree to use your Bambu Lab device, you agree to abide by the Privacy Policyand Terms of Use(collectively, the \"Terms\"). If you do not comply with or agree to the Bambu Lab Privacy Policy, please do not use Bambu Lab equipment and services." -msgstr "Bir Bambu Lab cihazı satın aldığınız için teşekkür ederiz.Bambu Lab cihazınızı kullanmadan önce lütfen şartlar ve koşulları okuyun.Bambu Lab cihazınızı kullanmayı kabul etmek için tıklayarak, Gizlilik Politikasına ve Kullanım Koşullarına (topluca \"Şartlar\" olarak anılacaktır) uymayı kabul etmiş olursunuz. \"). Bambu Lab Gizlilik Politikasına uymuyorsanız veya bu Politikayı kabul etmiyorsanız lütfen Bambu Lab ekipmanlarını ve hizmetlerini kullanmayın." +msgid "" +"Thank you for purchasing a Bambu Lab device.Before using your Bambu Lab " +"device, please read the termsand conditions.By clicking to agree to use your " +"Bambu Lab device, you agree to abide by the Privacy Policyand Terms of " +"Use(collectively, the \"Terms\"). If you do not comply with or agree to the " +"Bambu Lab Privacy Policy, please do not use Bambu Lab equipment and services." +msgstr "" +"Bir Bambu Lab cihazı satın aldığınız için teşekkür ederiz.Bambu Lab " +"cihazınızı kullanmadan önce lütfen şartlar ve koşulları okuyun.Bambu Lab " +"cihazınızı kullanmayı kabul etmek için tıklayarak, Gizlilik Politikasına ve " +"Kullanım Koşullarına (topluca \"Şartlar\" olarak anılacaktır) uymayı kabul " +"etmiş olursunuz. \"). Bambu Lab Gizlilik Politikasına uymuyorsanız veya bu " +"Politikayı kabul etmiyorsanız lütfen Bambu Lab ekipmanlarını ve hizmetlerini " +"kullanmayın." msgid "and" msgstr "ve" @@ -5213,8 +5722,31 @@ msgid "Statement about User Experience Improvement Program" msgstr "Kullanıcı Deneyimini İyileştirme Programına İlişkin Açıklama" #, c-format, boost-format -msgid "In the 3D Printing community, we learn from each other's successes and failures to adjust our own slicing parameters and settings. %s follows the same principle and uses machine learning to improve its performance from the successes and failures of the vast number of prints by our users. We are training %s to be smarter by feeding them the real-world data. If you are willing, this service will access information from your error logs and usage logs, which may include information described in Privacy Policy. We will not collect any Personal Data by which an individual can be identified directly or indirectly, including without limitation names, addresses, payment information, or phone numbers. By enabling this service, you agree to these terms and the statement about Privacy Policy." -msgstr "3D Baskı topluluğunda, kendi dilimleme parametrelerimizi ve ayarlarımızı düzenlerken birbirimizin başarılarından ve başarısızlıklarından öğreniyoruz. %s aynı prensibi takip ediyor ve kullanıcılarımızın yaptığı çok sayıda baskının başarı ve başarısızlıklarından performansını artırmak için yazıcıöğrenimini kullanıyor. %s'yi gerçek dünya verileriyle besleyerek daha akıllı olmaları için eğitiyoruz. İsterseniz bu hizmet, hata günlüklerinizden ve kullanım günlüklerinizden, Gizlilik Politikasında açıklanan bilgileri de içerebilecek bilgilere erişecektir. İsimler, adresler, ödeme bilgileri veya telefon numaraları dahil ancak bunlarla sınırlı olmamak üzere, bir bireyin doğrudan veya dolaylı olarak tanımlanmasını sağlayacak hiçbir Kişisel Veri toplamayacağız. Bu hizmeti etkinleştirerek bu şartları ve Gizlilik Politikasına ilişkin beyanı kabul etmiş olursunuz." +msgid "" +"In the 3D Printing community, we learn from each other's successes and " +"failures to adjust our own slicing parameters and settings. %s follows the " +"same principle and uses machine learning to improve its performance from the " +"successes and failures of the vast number of prints by our users. We are " +"training %s to be smarter by feeding them the real-world data. If you are " +"willing, this service will access information from your error logs and usage " +"logs, which may include information described in Privacy Policy. We will " +"not collect any Personal Data by which an individual can be identified " +"directly or indirectly, including without limitation names, addresses, " +"payment information, or phone numbers. By enabling this service, you agree " +"to these terms and the statement about Privacy Policy." +msgstr "" +"3D Baskı topluluğunda, kendi dilimleme parametrelerimizi ve ayarlarımızı " +"düzenlerken birbirimizin başarılarından ve başarısızlıklarından öğreniyoruz. " +"%s aynı prensibi takip ediyor ve kullanıcılarımızın yaptığı çok sayıda " +"baskının başarı ve başarısızlıklarından performansını artırmak için " +"yazıcıöğrenimini kullanıyor. %s'yi gerçek dünya verileriyle besleyerek daha " +"akıllı olmaları için eğitiyoruz. İsterseniz bu hizmet, hata günlüklerinizden " +"ve kullanım günlüklerinizden, Gizlilik Politikasında açıklanan bilgileri de " +"içerebilecek bilgilere erişecektir. İsimler, adresler, ödeme bilgileri veya " +"telefon numaraları dahil ancak bunlarla sınırlı olmamak üzere, bir bireyin " +"doğrudan veya dolaylı olarak tanımlanmasını sağlayacak hiçbir Kişisel Veri " +"toplamayacağız. Bu hizmeti etkinleştirerek bu şartları ve Gizlilik " +"Politikasına ilişkin beyanı kabul etmiş olursunuz." msgid "Statement on User Experience Improvement Plan" msgstr "Kullanıcı Deneyimi İyileştirme Planına İlişkin Açıklama" @@ -5238,6 +5770,7 @@ msgid "Failed to log out." msgstr "Oturum kapatılamadı." #. TRN "Save current Settings" +#, c-format, boost-format msgid "Save current %s" msgstr "Mevcut %s kaydet" @@ -5250,17 +5783,29 @@ msgstr "Ön ayarda ara" msgid "Click to reset all settings to the last saved preset." msgstr "Tüm ayarları en son kaydedilen ön ayara sıfırlamak için tıklayın." -msgid "Prime tower is required for smooth timeplase. There may be flaws on the model without prime tower. Are you sure you want to disable prime tower?" -msgstr "Sorunsuz timeplace için Prime Tower gereklidir. Prime tower olmayan modelde kusurlar olabilir. Prime tower'ı devre dışı bırakmak istediğinizden emin misiniz?" +msgid "" +"Prime tower is required for smooth timeplase. There may be flaws on the " +"model without prime tower. Are you sure you want to disable prime tower?" +msgstr "" +"Sorunsuz timeplace için Prime Tower gereklidir. Prime tower olmayan modelde " +"kusurlar olabilir. Prime tower'ı devre dışı bırakmak istediğinizden emin " +"misiniz?" -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 "Sorunsuz hızlandırılmış çekim için Prime Tower gereklidir. Prime tower olmayan modelde kusurlar olabilir. Prime tower'ı etkinleştirmek istiyor musunuz?" +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 "" +"Sorunsuz hızlandırılmış çekim için Prime Tower gereklidir. Prime tower " +"olmayan modelde kusurlar olabilir. Prime tower'ı etkinleştirmek istiyor " +"musunuz?" msgid "" -"We have added an experimental style \"Tree Slim\" that features smaller support volume but weaker strength.\n" +"We have added an experimental style \"Tree Slim\" that features smaller " +"support volume but weaker strength.\n" "We recommend using it with: 0 interface layers, 0 top distance, 2 walls." msgstr "" -"Daha küçük destek hacmine ancak daha zayıf güce sahip deneysel bir tarz olan \"Tree Slim\" ekledik.\n" +"Daha küçük destek hacmine ancak daha zayıf güce sahip deneysel bir tarz olan " +"\"Tree Slim\" ekledik.\n" "Şunlarla kullanmanızı öneririz: 0 arayüz katmanı, 0 üst mesafe, 2 duvar." msgid "" @@ -5272,22 +5817,36 @@ msgstr "" "Evet - Bu ayarları otomatik olarak değiştir\n" "Hayır - Bu ayarları benim için değiştirme" -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 using support materials on interface." -msgstr "\"Güçlü Ağaç\" ve \"Ağaç Hibrit\" stilleri için şu ayarları öneriyoruz: en az 2 arayüz katmanı, en az 0,1 mm üst z mesafesi veya arayüzde destek malzemeleri kullanılması." +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 " +"using support materials on interface." +msgstr "" +"\"Güçlü Ağaç\" ve \"Ağaç Hibrit\" stilleri için şu ayarları öneriyoruz: en " +"az 2 arayüz katmanı, en az 0,1 mm üst z mesafesi veya arayüzde destek " +"malzemeleri kullanılması." msgid "" -"When using support material for the support interface, We recommend the following settings:\n" -"0 top z distance, 0 interface spacing, concentric pattern and disable independent support layer height" +"When using support material for the support interface, We recommend the " +"following settings:\n" +"0 top z distance, 0 interface spacing, concentric pattern and disable " +"independent support layer height" msgstr "" -"Destek arayüzü için destek materyali kullanırken aşağıdaki ayarları öneriyoruz:\n" -"0 üst z mesafesi, 0 arayüz aralığı, eş merkezli desen ve bağımsız destek katmanı yüksekliğini devre dışı bırakma" +"Destek arayüzü için destek materyali kullanırken aşağıdaki ayarları " +"öneriyoruz:\n" +"0 üst z mesafesi, 0 arayüz aralığı, eş merkezli desen ve bağımsız destek " +"katmanı yüksekliğini devre dışı bırakma" msgid "" -"When recording timelapse without toolhead, it is recommended to add a \"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add Primitive\"->\"Timelapse Wipe Tower\"." +"When recording timelapse without toolhead, it is recommended to add a " +"\"Timelapse Wipe Tower\" \n" +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" -"Araç başlığı olmadan timelapse kaydederken, bir \"Timelapse Wipe Tower\" eklenmesi önerilir.\n" -"Yapı plakasının boş konumuna sağ tıklayın ve \"İlkel Ekle\" -> \"Timelapse Temizleme Kulesi\" seçeneğini seçin." +"Araç başlığı olmadan timelapse kaydederken, bir \"Timelapse Wipe Tower\" " +"eklenmesi önerilir.\n" +"Yapı plakasının boş konumuna sağ tıklayın ve \"İlkel Ekle\" -> \"Timelapse " +"Temizleme Kulesi\" seçeneğini seçin." msgid "Line width" msgstr "Katman Genişliği" @@ -5316,8 +5875,14 @@ msgstr "Diğer Katmanlar" msgid "Overhang speed" msgstr "Çıkıntılar (Overhang)" -msgid "This is the speed for various overhang degrees. Overhang degrees are expressed as a percentage of line width. 0 speed means no slowing down for the overhang degree range and wall speed is used" -msgstr "Bu, çeşitli sarkma dereceleri için hızdır. Çıkıntı dereceleri çizgi genişliğinin yüzdesi olarak ifade edilir. 0 hız, sarkma derecesi aralığı için yavaşlamanın olmadığı anlamına gelir ve duvar hızı kullanılır" +msgid "" +"This is the speed for various overhang degrees. Overhang degrees are " +"expressed as a percentage of line width. 0 speed means no slowing down for " +"the overhang degree range and wall speed is used" +msgstr "" +"Bu, çeşitli sarkma dereceleri için hızdır. Çıkıntı dereceleri çizgi " +"genişliğinin yüzdesi olarak ifade edilir. 0 hız, sarkma derecesi aralığı " +"için yavaşlamanın olmadığı anlamına gelir ve duvar hızı kullanılır" msgid "Bridge" msgstr "Köprü" @@ -5364,16 +5929,20 @@ msgstr "Sıklıkla" #, c-format, boost-format msgid "" "Following line %s contains reserved keywords.\n" -"Please remove it, or will beat G-code visualization and printing time estimation." +"Please remove it, or will beat G-code visualization and printing time " +"estimation." msgid_plural "" "Following lines %s contain reserved keywords.\n" -"Please remove them, or will beat G-code visualization and printing time estimation." +"Please remove them, or will beat G-code visualization and printing time " +"estimation." msgstr[0] "" "Aşağıdaki %s satırı ayrılmış anahtar kelimeler içeriyor.\n" -"Lütfen onu kaldırın, aksi takdirde G kodu görselleştirmesini ve yazdırma süresi tahminini geçeceksiniz." +"Lütfen onu kaldırın, aksi takdirde G kodu görselleştirmesini ve yazdırma " +"süresi tahminini geçeceksiniz." msgstr[1] "" "Aşağıdaki satırlar %s ayrılmış anahtar sözcükler içeriyor.\n" -"Lütfen bunları kaldırın, aksi takdirde G kodu görselleştirmesini ve yazdırma süresi tahminini geçeceksiniz." +"Lütfen bunları kaldırın, aksi takdirde G kodu görselleştirmesini ve yazdırma " +"süresi tahminini geçeceksiniz." msgid "Reserved keywords found" msgstr "Ayrılmış anahtar kelimeler bulundu" @@ -5391,7 +5960,8 @@ msgid "Recommended nozzle temperature" msgstr "Önerilen Nozul sıcaklığı" msgid "Recommended nozzle temperature range of this filament. 0 means no set" -msgstr "Bu filamentin önerilen Nozul sıcaklığı aralığı. 0 ayar yok anlamına gelir" +msgstr "" +"Bu filamentin önerilen Nozul sıcaklığı aralığı. 0 ayar yok anlamına gelir" msgid "Print temperature" msgstr "Yazdırma sıcaklığı" @@ -5405,26 +5975,41 @@ msgstr "Yazdırma sırasında nozul sıcaklığı" msgid "Cool plate" msgstr "Soğuk plaka" -msgid "Bed temperature when cool plate is installed. Value 0 means the filament does not support to print on the Cool Plate" -msgstr "Soğutma plakası takıldığında yatak sıcaklığı. 0 değeri, filamentin Cool Plate üzerine yazdırmayı desteklemediği anlamına gelir" +msgid "" +"Bed temperature when cool plate is installed. Value 0 means the filament " +"does not support to print on the Cool Plate" +msgstr "" +"Soğutma plakası takıldığında yatak sıcaklığı. 0 değeri, filamentin Cool " +"Plate üzerine yazdırmayı desteklemediği anlamına gelir" msgid "Engineering plate" msgstr "Mühendislik plakası" -msgid "Bed temperature when engineering plate is installed. Value 0 means the filament does not support to print on the Engineering Plate" -msgstr "Mühendislik plakası takıldığında yatak sıcaklığı. Değer 0, filamentin Mühendislik Plakasına yazdırmayı desteklemediği anlamına gelir" +msgid "" +"Bed temperature when engineering plate is installed. Value 0 means the " +"filament does not support to print on the Engineering Plate" +msgstr "" +"Mühendislik plakası takıldığında yatak sıcaklığı. Değer 0, filamentin " +"Mühendislik Plakasına yazdırmayı desteklemediği anlamına gelir" -msgid "High Temp Plate" -msgstr "Tabla" +msgid "Smooth PEI Plate / High Temp Plate" +msgstr "" -msgid "Bed temperature when high temperature plate is installed. Value 0 means the filament does not support to print on the High Temp Plate" -msgstr "Yüksek sıcaklık plakası takıldığında yatak sıcaklığı. 0 değeri, filamentin Yüksek Sıcaklık Plakasına yazdırmayı desteklemediği anlamına gelir" +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/" +"High Temp Plate" +msgstr "" msgid "Textured PEI Plate" msgstr "Dokulu PEI Plaka" -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 "Dokulu PEI Plaka takıldığında yatak sıcaklığı. 0 Değeri, filamentin Dokulu PEI Plaka üzerine yazdırmayı desteklemediği anlamına gelir" +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 "" +"Dokulu PEI Plaka takıldığında yatak sıcaklığı. 0 Değeri, filamentin Dokulu " +"PEI Plaka üzerine yazdırmayı desteklemediği anlamına gelir" msgid "Volumetric speed limitation" msgstr "Hacimsel hız sınırlaması" @@ -5441,14 +6026,26 @@ msgstr "Parça soğutma fanı" msgid "Min fan speed threshold" msgstr "Minimum fan hızı" -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 "Tahmini katman süresi ayardaki katman süresinden uzun olmadığında parça soğutma fanı hızı minimum hızda çalışmaya başlayacaktır. Katman süresi eşikten kısa olduğunda fan hızı, katman yazdırma süresine göre minimum ve maksimum fan hızı arasında enterpole edilir" +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 "" +"Tahmini katman süresi ayardaki katman süresinden uzun olmadığında parça " +"soğutma fanı hızı minimum hızda çalışmaya başlayacaktır. Katman süresi " +"eşikten kısa olduğunda fan hızı, katman yazdırma süresine göre minimum ve " +"maksimum fan hızı arasında enterpole edilir" msgid "Max fan speed threshold" msgstr "Maksimum fan hızı" -msgid "Part cooling fan speed will be max when the estimated layer time is shorter than the setting value" -msgstr "Tahmini katman süresi ayar değerinden kısa olduğunda parça soğutma fanı hızı maksimum olacaktır" +msgid "" +"Part cooling fan speed will be max when the estimated layer time is shorter " +"than the setting value" +msgstr "" +"Tahmini katman süresi ayar değerinden kısa olduğunda parça soğutma fanı hızı " +"maksimum olacaktır" msgid "Auxiliary part cooling fan" msgstr "Yardımcı parça soğutma fanı" @@ -5583,6 +6180,7 @@ msgid "Are you sure to %1% the selected preset?" msgstr "Seçilen ön ayarı %1% yaptığınızdan emin misiniz?" #. TRN Remove/Delete +#, boost-format msgid "%1% Preset" msgstr "%1% Ön Ayar" @@ -5596,7 +6194,8 @@ msgid "Click to reset current value and attach to the global value." msgstr "Geçerli değeri sıfırlamak ve genel değere eklemek için tıklayın." msgid "Click to drop current modify and reset to saved value." -msgstr "Geçerli değişikliği bırakmak ve kaydedilen değere sıfırlamak için tıklayın." +msgstr "" +"Geçerli değişikliği bırakmak ve kaydedilen değere sıfırlamak için tıklayın." msgid "Process Settings" msgstr "İşlem Ayarları" @@ -5664,27 +6263,39 @@ msgid "Preset \"%1%\" contains the following unsaved changes:" msgstr "\"%1%\" ön ayarı aşağıdaki kaydedilmemiş değişiklikleri içeriyor:" #, boost-format -msgid "Preset \"%1%\" is not compatible with the new printer profile and it contains the following unsaved changes:" -msgstr "Ön ayar \"%1%\", yeni yazıcı profiliyle uyumlu değil ve aşağıdaki kaydedilmemiş değişiklikleri içeriyor:" +msgid "" +"Preset \"%1%\" is not compatible with the new printer profile and it " +"contains the following unsaved changes:" +msgstr "" +"Ön ayar \"%1%\", yeni yazıcı profiliyle uyumlu değil ve aşağıdaki " +"kaydedilmemiş değişiklikleri içeriyor:" #, boost-format -msgid "Preset \"%1%\" is not compatible with the new process profile and it contains the following unsaved changes:" -msgstr "Ön ayar \"%1%\", yeni işlem profiliyle uyumlu değil ve aşağıdaki kaydedilmemiş değişiklikleri içeriyor:" +msgid "" +"Preset \"%1%\" is not compatible with the new process profile and it " +"contains the following unsaved changes:" +msgstr "" +"Ön ayar \"%1%\", yeni işlem profiliyle uyumlu değil ve aşağıdaki " +"kaydedilmemiş değişiklikleri içeriyor:" #, boost-format msgid "" "You have changed some settings of preset \"%1%\". \n" -"Would you like to keep these changed settings (new value) after switching preset?" +"Would you like to keep these changed settings (new value) after switching " +"preset?" msgstr "" "\"%1%\" ön ayarının bazı ayarlarını değiştirdiniz.\n" -"Ön ayarı değiştirdikten sonra değiştirilen bu ayarları (yeni değer) korumak ister misiniz?" +"Ön ayarı değiştirdikten sonra değiştirilen bu ayarları (yeni değer) korumak " +"ister misiniz?" msgid "" "You have changed some preset settings. \n" -"Would you like to keep these changed settings (new value) after switching preset?" +"Would you like to keep these changed settings (new value) after switching " +"preset?" msgstr "" "Bazı ön ayar ayarlarını değiştirdiniz.\n" -"Ön ayarı değiştirdikten sonra değiştirilen bu ayarları (yeni değer) korumak ister misiniz?" +"Ön ayarı değiştirdikten sonra değiştirilen bu ayarları (yeni değer) korumak " +"ister misiniz?" msgid "Extruders count" msgstr "Ekstruder sayısı" @@ -5732,6 +6343,7 @@ msgstr "Yazar" msgid "Model Name" msgstr "Model adı" +#, c-format, boost-format msgid "%s Update" msgstr "%s Güncelleme" @@ -5781,13 +6393,26 @@ msgid "Ramming customization" msgstr "Sıkıştırma özelleştirme" 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 unloaded filament so it does not prevent insertion of the new filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n" +"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 " +"unloaded filament so it does not prevent insertion of the new filament and " +"can itself be reinserted later. This phase is important and different " +"materials can require different extrusion speeds to get the good shape. For " +"this reason, the extrusion rates during ramming are adjustable.\n" "\n" -"This is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc." +"This is an expert-level setting, incorrect adjustment will likely lead to " +"jams, extruder wheel grinding into filament etc." msgstr "" -"Sıkıştırma, tek ekstrüderli bir MM yazıcıda takım değişiminden hemen önce yapılan hızlı ekstrüzyonu ifade eder. Amacı, yeni filamentin yerleştirilmesini engellememesi ve daha sonra yeniden yerleştirilebilmesi için boşaltılmış filamentin ucunu düzgün bir şekilde şekillendirmektir. Bu aşama önemlidir ve farklı malzemeler iyi bir şekil elde etmek için farklı ekstrüzyon hızları gerektirebilir. Bu nedenle, sıkıştırma sırasındaki ekstrüzyon hızları ayarlanabilir.\n" +"Sıkıştırma, tek ekstrüderli bir MM yazıcıda takım değişiminden hemen önce " +"yapılan hızlı ekstrüzyonu ifade eder. Amacı, yeni filamentin " +"yerleştirilmesini engellememesi ve daha sonra yeniden yerleştirilebilmesi " +"için boşaltılmış filamentin ucunu düzgün bir şekilde şekillendirmektir. Bu " +"aşama önemlidir ve farklı malzemeler iyi bir şekil elde etmek için farklı " +"ekstrüzyon hızları gerektirebilir. Bu nedenle, sıkıştırma sırasındaki " +"ekstrüzyon hızları ayarlanabilir.\n" "\n" -"Bu uzman düzeyinde bir ayardır, yanlış ayarlama muhtemelen sıkışmalara, ekstrüder tekerleğinin filamente sürtünmesine vb. yol açacaktır." +"Bu uzman düzeyinde bir ayardır, yanlış ayarlama muhtemelen sıkışmalara, " +"ekstrüder tekerleğinin filamente sürtünmesine vb. yol açacaktır." msgid "Total ramming time" msgstr "Toplam sıkıştırma süresi" @@ -5896,8 +6521,14 @@ msgstr "Shift+A" msgid "Shift+R" msgstr "Shift+R" -msgid "Auto orientates selected objects or all objects.If there are selected objects, it just orientates the selected ones.Otherwise, it will orientates all objects in the current disk." -msgstr "Seçilen nesneleri veya tüm nesneleri otomatik olarak yönlendirir. Seçilen nesneler varsa, yalnızca seçilenleri yönlendirir. Aksi takdirde, geçerli diskteki tüm nesneleri yönlendirir." +msgid "" +"Auto orientates selected objects or all objects.If there are selected " +"objects, it just orientates the selected ones.Otherwise, it will orientates " +"all objects in the current disk." +msgstr "" +"Seçilen nesneleri veya tüm nesneleri otomatik olarak yönlendirir. Seçilen " +"nesneler varsa, yalnızca seçilenleri yönlendirir. Aksi takdirde, geçerli " +"diskteki tüm nesneleri yönlendirir." msgid "Shift+Tab" msgstr "Shift+Tab" @@ -6104,8 +6735,11 @@ msgstr "sürüm %s güncelleme bilgileri:" msgid "Network plug-in update" msgstr "Ağ eklentisi güncellemesi" -msgid "Click OK to update the Network plug-in when Bambu Studio launches next time." -msgstr "Bambu Studio bir sonraki sefer başlatıldığında Ağ eklentisini güncellemek için Tamam'a tıklayın." +msgid "" +"Click OK to update the Network plug-in when Bambu Studio launches next time." +msgstr "" +"Bambu Studio bir sonraki sefer başlatıldığında Ağ eklentisini güncellemek " +"için Tamam'a tıklayın." #, c-format, boost-format msgid "A new Network plug-in(%s) available, Do you want to install it?" @@ -6120,11 +6754,17 @@ msgstr "Bana bir daha bu versiyonu hatırlatma" msgid "LAN Connection Failed (Sending print file)" msgstr "LAN Bağlantısı Başarısız (Yazdırma dosyası gönderiliyor)" -msgid "Step 1, please confirm Bambu Studio and your printer are in the same LAN." -msgstr "Adım 1, lütfen Bambu Studio ile yazıcınızın aynı LAN'da olduğunu doğrulayın." +msgid "" +"Step 1, please confirm Bambu Studio and your printer are in the same LAN." +msgstr "" +"Adım 1, lütfen Bambu Studio ile yazıcınızın aynı LAN'da olduğunu doğrulayın." -msgid "Step 2, if the IP and Access Code below are different from the actual values on your printer, please correct them." -msgstr "Adım 2, aşağıdaki IP ve Erişim Kodu yazıcınızdaki gerçek değerlerden farklıysa lütfen bunları düzeltin." +msgid "" +"Step 2, if the IP and Access Code below are different from the actual values " +"on your printer, please correct them." +msgstr "" +"Adım 2, aşağıdaki IP ve Erişim Kodu yazıcınızdaki gerçek değerlerden " +"farklıysa lütfen bunları düzeltin." msgid "IP" msgstr "IP" @@ -6168,14 +6808,31 @@ msgstr "Güncelleme başarısız oldu" msgid "Updating successful" msgstr "Güncelleme başarılı" -msgid "Are you sure you want to update? This will take about 10 minutes. Do not turn off the power while the printer is updating." -msgstr "Güncellemek istediğinizden emin misiniz? Bu yaklaşık 10 dakika sürecektir. Yazıcı güncellenirken gücü kapatmayın." +msgid "" +"Are you sure you want to update? This will take about 10 minutes. Do not " +"turn off the power while the printer is updating." +msgstr "" +"Güncellemek istediğinizden emin misiniz? Bu yaklaşık 10 dakika sürecektir. " +"Yazıcı güncellenirken gücü kapatmayın." -msgid "An important update was detected and needs to be run before printing can continue. Do you want to update now? You can also update later from 'Upgrade firmware'." -msgstr "Önemli bir güncelleme algılandı ve yazdırmanın devam edebilmesi için çalıştırılması gerekiyor. Şimdi güncellemek istiyor musunuz? Daha sonra 'Firmware'i yükselt' seçeneğinden de güncelleme yapabilirsiniz." +msgid "" +"An important update was detected and needs to be run before printing can " +"continue. Do you want to update now? You can also update later from 'Upgrade " +"firmware'." +msgstr "" +"Önemli bir güncelleme algılandı ve yazdırmanın devam edebilmesi için " +"çalıştırılması gerekiyor. Şimdi güncellemek istiyor musunuz? Daha sonra " +"'Firmware'i yükselt' seçeneğinden de güncelleme yapabilirsiniz." -msgid "The firmware version is abnormal. Repairing and updating are required before printing. Do you want to update now? You can also update later on printer or update next time starting the studio." -msgstr "Ürün yazılımı sürümü anormal. Yazdırmadan önce onarım ve güncelleme yapılması gerekir. Şimdi güncellemek istiyor musunuz? Ayrıca daha sonra yazıcıda güncelleyebilir veya stüdyoyu bir sonraki başlatışınızda güncelleyebilirsiniz." +msgid "" +"The firmware version is abnormal. Repairing and updating are required before " +"printing. Do you want to update now? You can also update later on printer or " +"update next time starting the studio." +msgstr "" +"Ürün yazılımı sürümü anormal. Yazdırmadan önce onarım ve güncelleme " +"yapılması gerekir. Şimdi güncellemek istiyor musunuz? Ayrıca daha sonra " +"yazıcıda güncelleyebilir veya stüdyoyu bir sonraki başlatışınızda " +"güncelleyebilirsiniz." msgid "Extension Board" msgstr "Uzatma Kartı" @@ -6233,7 +6890,9 @@ msgid "Copying of file %1% to %2% failed: %3%" msgstr "%1% dosyasının %2% dosyasına kopyalanması başarısız oldu: %3%" msgid "Need to check the unsaved changes before configuration updates." -msgstr "Yapılandırma güncellemelerinden önce kaydedilmemiş değişiklikleri kontrol etmeniz gerekir." +msgstr "" +"Yapılandırma güncellemelerinden önce kaydedilmemiş değişiklikleri kontrol " +"etmeniz gerekir." msgid "Configuration package updated to " msgstr "Yapılandırma paketi şu şekilde güncellendi: " @@ -6241,18 +6900,27 @@ msgstr "Yapılandırma paketi şu şekilde güncellendi: " msgid "Open G-code file:" msgstr "G kodu dosyasını açın:" -msgid "One object has empty initial layer and can't be printed. Please Cut the bottom or enable supports." -msgstr "Bir nesnenin başlangıç katmanı boş ve yazdırılamıyor. Lütfen alt kısmı kesin veya destekleri etkinleştirin." +msgid "" +"One object has empty initial layer and can't be printed. Please Cut the " +"bottom or enable supports." +msgstr "" +"Bir nesnenin başlangıç katmanı boş ve yazdırılamıyor. Lütfen alt kısmı kesin " +"veya destekleri etkinleştirin." #, boost-format msgid "Object can't be printed for empty layer between %1% and %2%." msgstr "%1% ile %2% arasındaki boş katman için nesne yazdırılamıyor." +#, boost-format msgid "Object: %1%" msgstr "Nesne: %1%" -msgid "Maybe parts of the object at these height are too thin, or the object has faulty mesh" -msgstr "Belki nesnenin bu yükseklikteki bazı kısımları çok incedir veya nesnenin ağı hatalı olabilir" +msgid "" +"Maybe parts of the object at these height are too thin, or the object has " +"faulty mesh" +msgstr "" +"Belki nesnenin bu yükseklikteki bazı kısımları çok incedir veya nesnenin ağı " +"hatalı olabilir" msgid "No object can be printed. Maybe too small" msgstr "Hiçbir nesne yazdırılamaz. Belki çok küçük" @@ -6265,7 +6933,8 @@ msgstr "" "\n" msgid "Please check the custom G-code or use the default custom G-code." -msgstr "Lütfen özel G kodunu kontrol edin veya varsayılan özel G kodunu kullanın." +msgstr "" +"Lütfen özel G kodunu kontrol edin veya varsayılan özel G kodunu kullanın." #, boost-format msgid "Generating G-code: layer %1%" @@ -6314,6 +6983,11 @@ msgstr "Çoklu" msgid "Failed to calculate line width of %1%. Can not get value of \"%2%\" " msgstr "%1% çizgi genişliği hesaplanamadı. \"%2%\" değeri alınamıyor " +msgid "" +"Invalid spacing supplied to Flow::with_spacing(), check your layer height " +"and extrusion width" +msgstr "" + msgid "undefined error" msgstr "bilinmeyen hata" @@ -6408,8 +7082,11 @@ msgid "write callback failed" msgstr "geri arama yazma başarısız oldu" #, boost-format -msgid "%1% is too close to exclusion area, there may be collisions when printing." -msgstr "%1%, hariç tutma alanına çok yakın; yazdırma sırasında çarpışmalar meydana gelebilir." +msgid "" +"%1% is too close to exclusion area, there may be collisions when printing." +msgstr "" +"%1%, hariç tutma alanına çok yakın; yazdırma sırasında çarpışmalar meydana " +"gelebilir." #, boost-format msgid "%1% is too close to others, and collisions may be caused." @@ -6420,10 +7097,13 @@ msgid "%1% is too tall, and collisions will be caused." msgstr "%1% çok uzun ve çarpışmalara neden olacak." msgid " is too close to others, there may be collisions when printing." -msgstr " başkalarına çok yakınsa, yazdırma sırasında çarpışmalar meydana gelebilir." +msgstr "" +" başkalarına çok yakınsa, yazdırma sırasında çarpışmalar meydana gelebilir." msgid " is too close to exclusion area, there may be collisions when printing." -msgstr " Hariç tutma alanına çok yakın olduğundan yazdırma sırasında çarpışmalar meydana gelebilir." +msgstr "" +" Hariç tutma alanına çok yakın olduğundan yazdırma sırasında çarpışmalar " +"meydana gelebilir." msgid "Prime Tower" msgstr "Başbakan Kulesi" @@ -6434,19 +7114,34 @@ msgstr " başkalarına çok yakın olduğundan çarpışmalara neden olabilir.\n msgid " is too close to exclusion area, and collisions will be caused.\n" msgstr " dışlama alanına çok yakın ve çarpışmalara neden olacak.\n" -msgid "Can not print multiple filaments which have large difference of temperature together. Otherwise, the extruder and nozzle may be blocked or damaged during printing" -msgstr "Birlikte büyük sıcaklık farkına sahip birden fazla filament basılamaz. Aksi takdirde baskı sırasında ekstruder ve nozül tıkanabilir veya hasar görebilir" +msgid "" +"Can not print multiple filaments which have large difference of temperature " +"together. Otherwise, the extruder and nozzle may be blocked or damaged " +"during printing" +msgstr "" +"Birlikte büyük sıcaklık farkına sahip birden fazla filament basılamaz. Aksi " +"takdirde baskı sırasında ekstruder ve nozül tıkanabilir veya hasar görebilir" msgid "No extrusions under current settings." msgstr "Mevcut ayarlarda ekstrüzyon yok." -msgid "Smooth mode of timelapse is not supported when \"by object\" sequence is enabled." -msgstr "\"Nesneye göre\" dizisi etkinleştirildiğinde, hızlandırılmış çekimin yumuşak modu desteklenmez." +msgid "" +"Smooth mode of timelapse is not supported when \"by object\" sequence is " +"enabled." +msgstr "" +"\"Nesneye göre\" dizisi etkinleştirildiğinde, hızlandırılmış çekimin yumuşak " +"modu desteklenmez." -msgid "Please select \"By object\" print sequence to print multiple objects in spiral vase mode." -msgstr "Birden fazla nesneyi spiral vazo modunda yazdırmak için lütfen \"Nesneye göre\" yazdırma sırasını seçin." +msgid "" +"Please select \"By object\" print sequence to print multiple objects in " +"spiral vase mode." +msgstr "" +"Birden fazla nesneyi spiral vazo modunda yazdırmak için lütfen \"Nesneye göre" +"\" yazdırma sırasını seçin." -msgid "The spiral vase mode does not work when an object contains more than one materials." +msgid "" +"The spiral vase mode does not work when an object contains more than one " +"materials." msgstr "Bir nesne birden fazla malzeme içerdiğinde spiral vazo modu çalışmaz." #, boost-format @@ -6454,11 +7149,19 @@ msgid "The object %1% exceeds the maximum build volume height." msgstr "%1% nesnesi maksimum yapı hacmi yüksekliğini aşıyor." #, boost-format -msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." -msgstr "%1% nesnesinin kendisi yapı hacmine uysa da, son katmanı maksimum yapı hacmi yüksekliğini aşıyor." +msgid "" +"While the object %1% itself fits the build volume, its last layer exceeds " +"the maximum build volume height." +msgstr "" +"%1% nesnesinin kendisi yapı hacmine uysa da, son katmanı maksimum yapı hacmi " +"yüksekliğini aşıyor." -msgid "You might want to reduce the size of your model or change current print settings and retry." -msgstr "Modelinizin boyutunu küçültmek veya mevcut yazdırma ayarlarını değiştirip yeniden denemek isteyebilirsiniz." +msgid "" +"You might want to reduce the size of your model or change current print " +"settings and retry." +msgstr "" +"Modelinizin boyutunu küçültmek veya mevcut yazdırma ayarlarını değiştirip " +"yeniden denemek isteyebilirsiniz." msgid "Variable layer height is not supported with Organic supports." msgstr "Değişken katman yüksekliği Organik desteklerle desteklenmez." @@ -6466,23 +7169,42 @@ msgstr "Değişken katman yüksekliği Organik desteklerle desteklenmez." msgid "The prime tower is not supported in \"By object\" print." msgstr "Prime tower, \"Nesneye göre\" yazdırmada desteklenmez." -msgid "The prime tower is not supported when adaptive layer height is on. It requires that all objects have the same layer height." -msgstr "Uyarlanabilir katman yüksekliği açıkken ana kule desteklenmez. Tüm nesnelerin aynı katman yüksekliğine sahip olmasını gerektirir." +msgid "" +"The prime tower is not supported when adaptive layer height is on. It " +"requires that all objects have the same layer height." +msgstr "" +"Uyarlanabilir katman yüksekliği açıkken ana kule desteklenmez. Tüm " +"nesnelerin aynı katman yüksekliğine sahip olmasını gerektirir." msgid "The prime tower requires \"support gap\" to be multiple of layer height" -msgstr "Ana kule \"destek boşluğunun\" katman yüksekliğinin katı olmasını gerektirir" +msgstr "" +"Ana kule \"destek boşluğunun\" katman yüksekliğinin katı olmasını gerektirir" msgid "The prime tower requires that all objects have the same layer heights" -msgstr "Prime tower, tüm nesnelerin aynı katman yüksekliğine sahip olmasını gerektirir" +msgstr "" +"Prime tower, tüm nesnelerin aynı katman yüksekliğine sahip olmasını " +"gerektirir" -msgid "The prime tower requires that all objects are printed over the same number of raft layers" -msgstr "Ana kule, tüm nesnelerin aynı sayıda sal katmanı üzerine yazdırılmasını gerektirir" +msgid "" +"The prime tower requires that all objects are printed over the same number " +"of raft layers" +msgstr "" +"Ana kule, tüm nesnelerin aynı sayıda sal katmanı üzerine yazdırılmasını " +"gerektirir" -msgid "The prime tower requires that all objects are sliced with the same layer heights." -msgstr "Prime tower, tüm nesnelerin aynı katman yüksekliğinde dilimlenmesini gerektirir." +msgid "" +"The prime tower requires that all objects are sliced with the same layer " +"heights." +msgstr "" +"Prime tower, tüm nesnelerin aynı katman yüksekliğinde dilimlenmesini " +"gerektirir." -msgid "The prime tower is only supported if all objects have the same variable layer height" -msgstr "Prime tower yalnızca tüm nesnelerin aynı değişken katman yüksekliğine sahip olması durumunda desteklenir" +msgid "" +"The prime tower is only supported if all objects have the same variable " +"layer height" +msgstr "" +"Prime tower yalnızca tüm nesnelerin aynı değişken katman yüksekliğine sahip " +"olması durumunda desteklenir" msgid "Too small line width" msgstr "Çizgi genişliği çok küçük" @@ -6490,32 +7212,62 @@ msgstr "Çizgi genişliği çok küçük" msgid "Too large line width" msgstr "Çok büyük çizgi genişliği" -msgid "The prime tower requires that support has the same layer height with object." -msgstr "Prime kulesi için, destek, nesne ile aynı katman yüksekliğine sahip olmalıdır." +msgid "" +"The prime tower requires that support has the same layer height with object." +msgstr "" +"Prime kulesi için, destek, nesne ile aynı katman yüksekliğine sahip " +"olmalıdır." -msgid "Organic support tree tip diameter must not be smaller than support material extrusion width." -msgstr "Organik destek ağacı uç çapı, destek malzemesi ekstrüzyon genişliğinden daha küçük olamaz." +msgid "" +"Organic support tree tip diameter must not be smaller than support material " +"extrusion width." +msgstr "" +"Organik destek ağacı uç çapı, destek malzemesi ekstrüzyon genişliğinden daha " +"küçük olamaz." -msgid "Organic support branch diameter must not be smaller than 2x support material extrusion width." -msgstr "Organik destek dalı çapı, destek malzemesi ekstrüzyon genişliğinin 2 katından daha küçük olamaz." +msgid "" +"Organic support branch diameter must not be smaller than 2x support material " +"extrusion width." +msgstr "" +"Organik destek dalı çapı, destek malzemesi ekstrüzyon genişliğinin 2 " +"katından daha küçük olamaz." -msgid "Organic support branch diameter must not be smaller than support tree tip diameter." +msgid "" +"Organic support branch diameter must not be smaller than support tree tip " +"diameter." msgstr "Organik destek dalı çapı, destek ağacı uç çapından küçük olamaz." -msgid "Support enforcers are used but support is not enabled. Please enable support." -msgstr "Destek uygulayıcıları kullanılıyor ancak destek etkinleştirilmiyor. Lütfen desteği etkinleştirin." +msgid "" +"Support enforcers are used but support is not enabled. Please enable support." +msgstr "" +"Destek uygulayıcıları kullanılıyor ancak destek etkinleştirilmiyor. Lütfen " +"desteği etkinleştirin." msgid "Layer height cannot exceed nozzle diameter" msgstr "Katman yüksekliği nozül çapını aşamaz" -msgid "Relative extruder addressing requires resetting the extruder position at each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to layer_gcode." -msgstr "Göreceli ekstrüder adreslemesi, kayan nokta doğruluğunun kaybını önlemek için her katmandaki ekstrüder konumunun sıfırlanmasını gerektirir. Layer_gcode'a \"G92 E0\" ekleyin." +msgid "" +"Relative extruder addressing requires resetting the extruder position at " +"each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " +"layer_gcode." +msgstr "" +"Göreceli ekstrüder adreslemesi, kayan nokta doğruluğunun kaybını önlemek " +"için her katmandaki ekstrüder konumunun sıfırlanmasını gerektirir. " +"Layer_gcode'a \"G92 E0\" ekleyin." -msgid "\"G92 E0\" was found in before_layer_gcode, which is incompatible with absolute extruder addressing." -msgstr "Before_layer_gcode'da \"G92 E0\" bulundu ve bu, mutlak ekstruder adreslemeyle uyumsuzdu." +msgid "" +"\"G92 E0\" was found in before_layer_gcode, which is incompatible with " +"absolute extruder addressing." +msgstr "" +"Before_layer_gcode'da \"G92 E0\" bulundu ve bu, mutlak ekstruder " +"adreslemeyle uyumsuzdu." -msgid "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute extruder addressing." -msgstr "Layer_gcode'da mutlak ekstruder adreslemeyle uyumlu olmayan \"G92 E0\" bulundu." +msgid "" +"\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " +"extruder addressing." +msgstr "" +"Layer_gcode'da mutlak ekstruder adreslemeyle uyumlu olmayan \"G92 E0\" " +"bulundu." #, c-format, boost-format msgid "Plate %d: %s does not support filament %s" @@ -6539,8 +7291,14 @@ msgstr "Yazdırılabilir alan" msgid "Bed exclude area" msgstr "Yatak hariç alan" -msgid "Unprintable area in XY plane. For example, X1 Series printers use the front left corner to cut filament during filament change. The area is expressed as polygon by points in following format: \"XxY, XxY, ...\"" -msgstr "XY düzleminde yazdırılamayan alan. Örneğin X1 Serisi yazıcılar, filament değişimi sırasında filamanı kesmek için sol ön köşeyi kullanır. Alan şu formatta noktalarla çokgen olarak ifade edilir: \"XxY, XxY, ...\"" +msgid "" +"Unprintable area in XY plane. For example, X1 Series printers use the front " +"left corner to cut filament during filament change. The area is expressed as " +"polygon by points in following format: \"XxY, XxY, ...\"" +msgstr "" +"XY düzleminde yazdırılamayan alan. Örneğin X1 Serisi yazıcılar, filament " +"değişimi sırasında filamanı kesmek için sol ön köşeyi kullanır. Alan şu " +"formatta noktalarla çokgen olarak ifade edilir: \"XxY, XxY, ...\"" msgid "Bed custom texture" msgstr "Özel plaka dokusu" @@ -6551,17 +7309,38 @@ msgstr "Özel plaka modeli" msgid "Elephant foot compensation" msgstr "Fil ayağı telafi oranı" -msgid "Shrink the initial layer on build plate to compensate for elephant foot effect" -msgstr "Fil ayağı etkisini telafi etmek için baskı plakasındaki ilk katmanı küçültün" +msgid "" +"Shrink the initial layer on build plate to compensate for elephant foot " +"effect" +msgstr "" +"Fil ayağı etkisini telafi etmek için baskı plakasındaki ilk katmanı küçültün" + +msgid "Elephant foot compensation layers" +msgstr "" + +msgid "" +"The number of layers on which the elephant foot compensation will be active. " +"The first layer will be shrunk by the elephant foot compensation value, then " +"the next layers will be linearly shrunk less, up to the layer indicated by " +"this value." +msgstr "" + +msgid "layers" +msgstr "katmanlar" -msgid "Slicing height for each layer. Smaller layer height means more accurate and more printing time" -msgstr "Her katman için dilimleme yüksekliği. Daha küçük katman yüksekliği, daha doğru ve daha fazla baskı süresi anlamına gelir" +msgid "" +"Slicing height for each layer. Smaller layer height means more accurate and " +"more printing time" +msgstr "" +"Her katman için dilimleme yüksekliği. Daha küçük katman yüksekliği, daha " +"doğru ve daha fazla baskı süresi anlamına gelir" msgid "Printable height" msgstr "Yazdırılabilir yükseklik" msgid "Maximum printable height which is limited by mechanism of printer" -msgstr "Yazıcının mekanizması tarafından sınırlanan maksimum yazdırılabilir yükseklik" +msgstr "" +"Yazıcının mekanizması tarafından sınırlanan maksimum yazdırılabilir yükseklik" msgid "Printer preset names" msgstr "Yazıcı ön ayar adları" @@ -6569,20 +7348,38 @@ msgstr "Yazıcı ön ayar adları" msgid "Hostname, IP or URL" msgstr "Ana bilgisayar adı, IP veya URL" -msgid "Slic3r can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance. Print host behind HAProxy with basic auth enabled can be accessed by putting the user name and password into the URL in the following format: https://username:password@your-octopi-address/" -msgstr "Slic3r, G kodu dosyalarını bir yazıcı ana bilgisayarına yükleyebilir. Bu alan, yazıcı ana bilgisayar örneğinin ana bilgisayar adını, IP adresini veya URL'sini içermelidir. Temel kimlik doğrulamanın etkin olduğu HAProxy'nin arkasındaki yazdırma ana bilgisayarına, kullanıcı adı ve parolanın aşağıdaki biçimdeki URL'ye girilmesiyle erişilebilir: https://username:password@your-octopi-address/" +msgid "" +"Slic3r can upload G-code files to a printer host. This field should contain " +"the hostname, IP address or URL of the printer host instance. Print host " +"behind HAProxy with basic auth enabled can be accessed by putting the user " +"name and password into the URL in the following format: https://username:" +"password@your-octopi-address/" +msgstr "" +"Slic3r, G kodu dosyalarını bir yazıcı ana bilgisayarına yükleyebilir. Bu " +"alan, yazıcı ana bilgisayar örneğinin ana bilgisayar adını, IP adresini veya " +"URL'sini içermelidir. Temel kimlik doğrulamanın etkin olduğu HAProxy'nin " +"arkasındaki yazdırma ana bilgisayarına, kullanıcı adı ve parolanın aşağıdaki " +"biçimdeki URL'ye girilmesiyle erişilebilir: https://username:password@your-" +"octopi-address/" msgid "Device UI" msgstr "Cihaz kullanıcı arayüzü" -msgid "Specify the URL of your device user interface if it's not same as print_host" -msgstr "Print_Host ile aynı değilse cihazınızın kullanıcı arayüzünün URL'sini belirtin" +msgid "" +"Specify the URL of your device user interface if it's not same as print_host" +msgstr "" +"Print_Host ile aynı değilse cihazınızın kullanıcı arayüzünün URL'sini " +"belirtin" msgid "API Key / Password" msgstr "API Anahtarı / Şifre" -msgid "Slic3r can upload G-code files to a printer host. This field should contain the API Key or the password required for authentication." -msgstr "Slic3r, G kodu dosyalarını bir yazıcı ana bilgisayarına yükleyebilir. Bu alan, kimlik doğrulama için gereken API Anahtarını veya şifreyi içermelidir." +msgid "" +"Slic3r can upload G-code files to a printer host. This field should contain " +"the API Key or the password required for authentication." +msgstr "" +"Slic3r, G kodu dosyalarını bir yazıcı ana bilgisayarına yükleyebilir. Bu " +"alan, kimlik doğrulama için gereken API Anahtarını veya şifreyi içermelidir." msgid "Name of the printer" msgstr "Yazıcı adı" @@ -6590,8 +7387,14 @@ msgstr "Yazıcı adı" msgid "HTTPS CA File" msgstr "HTTPS CA Dosyası" -msgid "Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. If left blank, the default OS CA certificate repository is used." -msgstr "HTTPS OctoPrint bağlantıları için crt/pem formatında özel CA sertifika dosyası belirtilebilir. Boş bırakılırsa varsayılan OS CA sertifika deposu kullanılır." +msgid "" +"Custom CA certificate file can be specified for HTTPS OctoPrint connections, " +"in crt/pem format. If left blank, the default OS CA certificate repository " +"is used." +msgstr "" +"HTTPS OctoPrint bağlantıları için crt/pem formatında özel CA sertifika " +"dosyası belirtilebilir. Boş bırakılırsa varsayılan OS CA sertifika deposu " +"kullanılır." msgid "User" msgstr "Kullanıcı" @@ -6602,8 +7405,14 @@ msgstr "Şifre" msgid "Ignore HTTPS certificate revocation checks" msgstr "HTTPS sertifikası iptal kontrollerini yoksay" -msgid "Ignore HTTPS certificate revocation checks in case of missing or offline distribution points. One may want to enable this option for self signed certificates if connection fails." -msgstr "Eksik veya çevrimdışı dağıtım noktaları olması durumunda HTTPS sertifikası iptal kontrollerini göz ardı edin. Bağlantı başarısız olursa, kendinden imzalı sertifikalar için bu seçeneğin etkinleştirilmesi istenebilir." +msgid "" +"Ignore HTTPS certificate revocation checks in case of missing or offline " +"distribution points. One may want to enable this option for self signed " +"certificates if connection fails." +msgstr "" +"Eksik veya çevrimdışı dağıtım noktaları olması durumunda HTTPS sertifikası " +"iptal kontrollerini göz ardı edin. Bağlantı başarısız olursa, kendinden " +"imzalı sertifikalar için bu seçeneğin etkinleştirilmesi istenebilir." msgid "Names of presets related to the physical printer" msgstr "Fiziksel yazıcıyla ilgili ön ayarların adları" @@ -6626,8 +7435,16 @@ msgstr "Yüzeyde lekelenmeye neden olabilecek duvar boyunca ilerlemekten kaçın msgid "Avoid crossing wall - Max detour length" msgstr "Duvarı geçmekten kaçının - Maksimum servis yolu uzunluğu" -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 travel path. Zero to disable" -msgstr "Duvarı geçmekten kaçınmak için maksimum sapma mesafesi. Yoldan sapma mesafesi bu değerden büyükse yoldan sapmayın. Yol uzunluğu, mutlak bir değer olarak veya doğrudan seyahat yolunun yüzdesi (örneğin %50) olarak belirtilebilir. Devre dışı bırakmak için sıfır" +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 " +"travel path. Zero to disable" +msgstr "" +"Duvarı geçmekten kaçınmak için maksimum sapma mesafesi. Yoldan sapma " +"mesafesi bu değerden büyükse yoldan sapmayın. Yol uzunluğu, mutlak bir değer " +"olarak veya doğrudan seyahat yolunun yüzdesi (örneğin %50) olarak " +"belirtilebilir. Devre dışı bırakmak için sıfır" msgid "mm or %" msgstr "mm veya %" @@ -6635,20 +7452,36 @@ msgstr "mm veya %" msgid "Other layers" msgstr "Diğer katmanlar" -msgid "Bed temperature for layers except the initial one. Value 0 means the filament does not support to print on the Cool Plate" -msgstr "İlk katman dışındaki katmanlar için yatak sıcaklığı. 0 değeri, filamentin Cool Plate üzerine yazdırmayı desteklemediği anlamına gelir" +msgid "" +"Bed temperature for layers except the initial one. Value 0 means the " +"filament does not support to print on the Cool Plate" +msgstr "" +"İlk katman dışındaki katmanlar için yatak sıcaklığı. 0 değeri, filamentin " +"Cool Plate üzerine yazdırmayı desteklemediği anlamına gelir" msgid "°C" msgstr "°C" -msgid "Bed temperature for layers except the initial one. Value 0 means the filament does not support to print on the Engineering Plate" -msgstr "İlk katman dışındaki katmanlar için yatak sıcaklığı. Değer 0, filamentin Mühendislik Plakasına yazdırmayı desteklemediği anlamına gelir" +msgid "" +"Bed temperature for layers except the initial one. Value 0 means the " +"filament does not support to print on the Engineering Plate" +msgstr "" +"İlk katman dışındaki katmanlar için yatak sıcaklığı. Değer 0, filamentin " +"Mühendislik Plakasına yazdırmayı desteklemediği anlamına gelir" -msgid "Bed temperature for layers except the initial one. Value 0 means the filament does not support to print on the High Temp Plate" -msgstr "İlk katman dışındaki katmanlar için yatak sıcaklığı. 0 değeri, filamentin Yüksek Sıcaklık Plakasına yazdırmayı desteklemediği anlamına gelir" +msgid "" +"Bed temperature for layers except the initial one. Value 0 means the " +"filament does not support to print on the High Temp Plate" +msgstr "" +"İlk katman dışındaki katmanlar için yatak sıcaklığı. 0 değeri, filamentin " +"Yüksek Sıcaklık Plakasına yazdırmayı desteklemediği anlamına gelir" -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 "İlk katman dışındaki katmanlar için yatak sıcaklığı. 0 Değeri, filamentin Dokulu PEI Plaka üzerine yazdırmayı desteklemediği anlamına gelir" +msgid "" +"Bed temperature for layers except the initial one. Value 0 means the " +"filament does not support to print on the Textured PEI Plate" +msgstr "" +"İlk katman dışındaki katmanlar için yatak sıcaklığı. 0 Değeri, filamentin " +"Dokulu PEI Plaka üzerine yazdırmayı desteklemediği anlamına gelir" msgid "Initial layer" msgstr "Başlangıç katmanı" @@ -6656,17 +7489,33 @@ msgstr "Başlangıç katmanı" msgid "Initial layer bed temperature" msgstr "İlk katman yatak sıcaklığı" -msgid "Bed temperature of the initial layer. Value 0 means the filament does not support to print on the Cool Plate" -msgstr "İlk katmanın yatak sıcaklığı. 0 değeri, filamentin Cool Plate üzerine yazdırmayı desteklemediği anlamına gelir" +msgid "" +"Bed temperature of the initial layer. Value 0 means the filament does not " +"support to print on the Cool Plate" +msgstr "" +"İlk katmanın yatak sıcaklığı. 0 değeri, filamentin Cool Plate üzerine " +"yazdırmayı desteklemediği anlamına gelir" -msgid "Bed temperature of the initial layer. Value 0 means the filament does not support to print on the Engineering Plate" -msgstr "İlk katmanın yatak sıcaklığı. Değer 0, filamentin Mühendislik Plakasına yazdırmayı desteklemediği anlamına gelir" +msgid "" +"Bed temperature of the initial layer. Value 0 means the filament does not " +"support to print on the Engineering Plate" +msgstr "" +"İlk katmanın yatak sıcaklığı. Değer 0, filamentin Mühendislik Plakasına " +"yazdırmayı desteklemediği anlamına gelir" -msgid "Bed temperature of the initial layer. Value 0 means the filament does not support to print on the High Temp Plate" -msgstr "İlk katmanın yatak sıcaklığı. 0 değeri, filamentin Yüksek Sıcaklık Plakasına yazdırmayı desteklemediği anlamına gelir" +msgid "" +"Bed temperature of the initial layer. Value 0 means the filament does not " +"support to print on the High Temp Plate" +msgstr "" +"İlk katmanın yatak sıcaklığı. 0 değeri, filamentin Yüksek Sıcaklık Plakasına " +"yazdırmayı desteklemediği anlamına gelir" -msgid "Bed temperature of the initial layer. Value 0 means the filament does not support to print on the Textured PEI Plate" -msgstr "İlk katmanın yatak sıcaklığı. 0 Değeri, filamentin Dokulu PEI Plaka üzerine yazdırmayı desteklemediği anlamına gelir" +msgid "" +"Bed temperature of the initial layer. Value 0 means the filament does not " +"support to print on the Textured PEI Plate" +msgstr "" +"İlk katmanın yatak sıcaklığı. 0 Değeri, filamentin Dokulu PEI Plaka üzerine " +"yazdırmayı desteklemediği anlamına gelir" msgid "Bed types supported by the printer" msgstr "Yazıcının desteklediği yatak türleri" @@ -6686,57 +7535,107 @@ msgstr "Bu G kodu, z'yi kaldırmadan önce her katman değişikliğinde eklenir" msgid "Bottom shell layers" msgstr "Alt katmanlar" -msgid "This is the number of solid layers of bottom shell, including the bottom surface layer. When the thickness calculated by this value is thinner than bottom shell thickness, the bottom shell layers will be increased" -msgstr "Bu, alt yüzey katmanı da dahil olmak üzere alt kabuğun katı katmanlarının sayısıdır. Bu değerle hesaplanan kalınlık alt kabuk kalınlığından ince olduğunda alt kabuk katmanları artırılacaktır" +msgid "" +"This is the number of solid layers of bottom shell, including the bottom " +"surface layer. When the thickness calculated by this value is thinner than " +"bottom shell thickness, the bottom shell layers will be increased" +msgstr "" +"Bu, alt yüzey katmanı da dahil olmak üzere alt kabuğun katı katmanlarının " +"sayısıdır. Bu değerle hesaplanan kalınlık alt kabuk kalınlığından ince " +"olduğunda alt kabuk katmanları artırılacaktır" msgid "Bottom shell thickness" msgstr "Alt katman kalınlığı" -msgid "The number of bottom solid layers is increased when slicing if the thickness calculated by bottom shell layers is thinner than this value. This can avoid having too thin shell when layer height is small. 0 means that this setting is disabled and thickness of bottom shell is absolutely determained by bottom shell layers" -msgstr "Alt kabuk katmanları tarafından hesaplanan kalınlık bu değerden daha ince ise dilimleme sırasında alt katı katmanların sayısı arttırılır. Bu, katman yüksekliği küçük olduğunda kabuğun çok ince olmasını önleyebilir. 0, bu ayarın devre dışı olduğu ve alt kabuğun kalınlığının mutlaka alt kabuk katmanları tarafından belirlendiği anlamına gelir" +msgid "" +"The number of bottom solid layers is increased when slicing if the thickness " +"calculated by bottom shell layers is thinner than this value. This can avoid " +"having too thin shell when layer height is small. 0 means that this setting " +"is disabled and thickness of bottom shell is absolutely determained by " +"bottom shell layers" +msgstr "" +"Alt kabuk katmanları tarafından hesaplanan kalınlık bu değerden daha ince " +"ise dilimleme sırasında alt katı katmanların sayısı arttırılır. Bu, katman " +"yüksekliği küçük olduğunda kabuğun çok ince olmasını önleyebilir. 0, bu " +"ayarın devre dışı olduğu ve alt kabuğun kalınlığının mutlaka alt kabuk " +"katmanları tarafından belirlendiği anlamına gelir" msgid "Force cooling for overhang and bridge" msgstr "Çıkıntı ve köprüler için soğutmayı zorla" -msgid "Enable this option to optimize part cooling fan speed for overhang and bridge to get better cooling" -msgstr "Daha iyi soğutma elde etmek amacıyla çıkıntı ve köprü için parça soğutma fanı hızını optimize etmek amacıyla bu seçeneği etkinleştirin" +msgid "" +"Enable this option to optimize part cooling fan speed for overhang and " +"bridge to get better cooling" +msgstr "" +"Daha iyi soğutma elde etmek amacıyla çıkıntı ve köprü için parça soğutma " +"fanı hızını optimize etmek amacıyla bu seçeneği etkinleştirin" msgid "Fan speed for overhang" msgstr "Çıkıntılar için fan hızı" -msgid "Force part cooling fan to be this speed when printing bridge or overhang wall which has large overhang degree. Forcing cooling for overhang and bridge can get better quality for these part" -msgstr "Çıkıntı derecesi büyük olan köprü veya çıkıntılı duvara baskı yaparken parça soğutma fanını bu hızda olmaya zorlayın. Çıkıntı ve köprü için soğutmayı zorlamak, bu parça için daha iyi kalite elde edilmesini sağlayabilir" +msgid "" +"Force part cooling fan to be this speed when printing bridge or overhang " +"wall which has large overhang degree. Forcing cooling for overhang and " +"bridge can get better quality for these part" +msgstr "" +"Çıkıntı derecesi büyük olan köprü veya çıkıntılı duvara baskı yaparken parça " +"soğutma fanını bu hızda olmaya zorlayın. Çıkıntı ve köprü için soğutmayı " +"zorlamak, bu parça için daha iyi kalite elde edilmesini sağlayabilir" msgid "Cooling overhang threshold" msgstr "Çıkıntı soğutması" #, c-format -msgid "Force cooling fan to be specific speed when overhang degree of printed part exceeds this value. Expressed as percentage which indicides how much width of the line without support from lower layer. 0% means forcing cooling for all outer wall no matter how much overhang degree" -msgstr "Yazdırılan parçanın çıkıntı derecesi bu değeri aştığında soğutma fanını belirli bir hıza zorlar. Alt katmandan destek almadan çizginin ne kadar genişlediğini gösteren yüzde olarak ifade edilir. 0, çıkıntı derecesi ne kadar olursa olsun tüm dış duvar için soğutmayı zorlamak anlamına gelir" +msgid "" +"Force cooling fan to be specific speed when overhang degree of printed part " +"exceeds this value. Expressed as percentage which indicides how much width " +"of the line without support from lower layer. 0% means forcing cooling for " +"all outer wall no matter how much overhang degree" +msgstr "" +"Yazdırılan parçanın çıkıntı derecesi bu değeri aştığında soğutma fanını " +"belirli bir hıza zorlar. Alt katmandan destek almadan çizginin ne kadar " +"genişlediğini gösteren yüzde olarak ifade edilir. 0, çıkıntı derecesi ne " +"kadar olursa olsun tüm dış duvar için soğutmayı zorlamak anlamına gelir" msgid "Bridge infill direction" msgstr "Köprü dolgu açısı" -msgid "Bridging angle override. If left to zero, the bridging angle will be calculated automatically. Otherwise the provided angle will be used for external bridges. Use 180°for zero angle." -msgstr "Köprüleme açısı geçersiz kılma. Sıfıra bırakılırsa köprüleme açısı otomatik olarak hesaplanacaktır. Aksi halde dış köprüler için sağlanan açı kullanılacaktır. Sıfır açı için 180°'yi kullanın." +msgid "" +"Bridging angle override. If left to zero, the bridging angle will be " +"calculated automatically. Otherwise the provided angle will be used for " +"external bridges. Use 180°for zero angle." +msgstr "" +"Köprüleme açısı geçersiz kılma. Sıfıra bırakılırsa köprüleme açısı otomatik " +"olarak hesaplanacaktır. Aksi halde dış köprüler için sağlanan açı " +"kullanılacaktır. Sıfır açı için 180°'yi kullanın." msgid "Bridge density" msgstr "Köprü dolgu yoğunluğu" msgid "Density of external bridges. 100% means solid bridge. Default is 100%." -msgstr "Dış köprülerin yoğunluğu. %100 sağlam köprü anlamına gelir. Varsayılan %100'dür." +msgstr "" +"Dış köprülerin yoğunluğu. %100 sağlam köprü anlamına gelir. Varsayılan " +"%100'dür." msgid "Bridge flow" msgstr "Köprülerde akış oranı" -msgid "Decrease this value slightly(for example 0.9) to reduce the amount of material for bridge, to improve sag" -msgstr "Köprü için malzeme miktarını azaltmak ve sarkmayı iyileştirmek için bu değeri biraz azaltın (örneğin 0,9)" +msgid "" +"Decrease this value slightly(for example 0.9) to reduce the amount of " +"material for bridge, to improve sag" +msgstr "" +"Köprü için malzeme miktarını azaltmak ve sarkmayı iyileştirmek için bu " +"değeri biraz azaltın (örneğin 0,9)" msgid "Top surface flow ratio" msgstr "Üst katı dolgu akış oranı" -msgid "This factor affects the amount of material for top solid infill. You can decrease it slightly to have smooth surface finish" -msgstr "Bu faktör üst katı dolgu için malzeme miktarını etkiler. Pürüzsüz bir yüzey elde etmek için biraz azaltabilirsiniz" +msgid "" +"This factor affects the amount of material for top solid infill. You can " +"decrease it slightly to have smooth surface finish" +msgstr "" +"Bu faktör üst katı dolgu için malzeme miktarını etkiler. Pürüzsüz bir yüzey " +"elde etmek için biraz azaltabilirsiniz" msgid "Bottom surface flow ratio" msgstr "Alt katı dolgu akış oranı" @@ -6747,37 +7646,65 @@ msgstr "Bu faktör alt katı dolgu için malzeme miktarını etkiler" msgid "Precise wall(experimental)" msgstr "Hassas duvar (deneysel)" -msgid "Improve shell precision by adjusting outer wall spacing. This also improves layer consistency." -msgstr "Dış duvar aralığını ayarlayarak kabuk hassasiyetini artırın. Bu aynı zamanda katman tutarlılığını da artırır." +msgid "" +"Improve shell precision by adjusting outer wall spacing. This also improves " +"layer consistency." +msgstr "" +"Dış duvar aralığını ayarlayarak kabuk hassasiyetini artırın. Bu aynı zamanda " +"katman tutarlılığını da artırır." msgid "Only one wall on top surfaces" msgstr "Üst yüzeylerde yalnızca bir duvar" -msgid "Use only one wall on flat top surface, to give more space to the top infill pattern" -msgstr "Üst dolgu desenine daha fazla yer açmak için düz üst yüzeyde yalnızca bir duvar kullanın" +msgid "" +"Use only one wall on flat top surface, to give more space to the top infill " +"pattern" +msgstr "" +"Üst dolgu desenine daha fazla yer açmak için düz üst yüzeyde yalnızca bir " +"duvar kullanın" msgid "One wall threshold" msgstr "Tek duvar eşiği" #, c-format, boost-format msgid "" -"If a top surface has to be printed and it's partially covered by another layer, it won't be considered at a top layer where its width is below this value. This can be useful to not let the 'one perimeter on top' trigger on surface that should be covered only by perimeters. This value can be a mm or a % of the perimeter extrusion width.\n" -"Warning: If enabled, artifacts can be created is you have some thin features on the next layer, like letters. Set this setting to 0 to remove these artifacts." +"If a top surface has to be printed and it's partially covered by another " +"layer, it won't be considered at a top layer where its width is below this " +"value. This can be useful to not let the 'one perimeter on top' trigger on " +"surface that should be covered only by perimeters. This value can be a mm or " +"a % of the perimeter extrusion width.\n" +"Warning: If enabled, artifacts can be created is you have some thin features " +"on the next layer, like letters. Set this setting to 0 to remove these " +"artifacts." msgstr "" -"If a top surface has to be printed and it's partially covered by another layer, it won't be considered at a top layer where its width is below this value. This can be useful to not let the 'one perimeter on top' trigger on surface that should be covered only by perimeters. This value can be a mm or a % of the perimeter extrusion width.\n" -"Warning: If enabled, artifacts can be created is you have some thin features on the next layer, like letters. Set this setting to 0 to remove these artifacts." +"If a top surface has to be printed and it's partially covered by another " +"layer, it won't be considered at a top layer where its width is below this " +"value. This can be useful to not let the 'one perimeter on top' trigger on " +"surface that should be covered only by perimeters. This value can be a mm or " +"a % of the perimeter extrusion width.\n" +"Warning: If enabled, artifacts can be created is you have some thin features " +"on the next layer, like letters. Set this setting to 0 to remove these " +"artifacts." msgid "Only one wall on first layer" msgstr "İlk katmanda yalnızca bir duvar" -msgid "Use only one wall on first layer, to give more space to the bottom infill pattern" -msgstr "Alt dolgu desenine daha fazla yer açmak için ilk katmanda yalnızca bir duvar kullanın" +msgid "" +"Use only one wall on first layer, to give more space to the bottom infill " +"pattern" +msgstr "" +"Alt dolgu desenine daha fazla yer açmak için ilk katmanda yalnızca bir duvar " +"kullanın" msgid "Extra perimeters on overhangs" msgstr "Çıkıntılarda ekstra çevre (perimeter)" -msgid "Create additional perimeter paths over steep overhangs and areas where bridges cannot be anchored. " -msgstr "Dik çıkıntılar ve köprülerin sabitlenemediği alanlar üzerinde ek çevre yolları (perimeter) oluşturun. " +msgid "" +"Create additional perimeter paths over steep overhangs and areas where " +"bridges cannot be anchored. " +msgstr "" +"Dik çıkıntılar ve köprülerin sabitlenemediği alanlar üzerinde ek çevre " +"yolları (perimeter) oluşturun. " msgid "Classic mode" msgstr "Klasik mod" @@ -6789,13 +7716,19 @@ msgid "Slow down for overhang" msgstr "Çıkıntılarda yavaşla" msgid "Enable this option to slow printing down for different overhang degree" -msgstr "Farklı sarkma derecelerinde yazdırmayı yavaşlatmak için bu seçeneği etkinleştirin" +msgstr "" +"Farklı sarkma derecelerinde yazdırmayı yavaşlatmak için bu seçeneği " +"etkinleştirin" msgid "Slow down for curled perimeters" msgstr "Kıvrılmış çevre çizgilerinde yavaşlat" -msgid "Enable this option to slow printing down in areas where potential curled perimeters may exist" -msgstr "Potansiyel kıvrılmış çevrelerin bulunabileceği alanlarda yazdırmayı yavaşlatmak için bu seçeneği etkinleştirin" +msgid "" +"Enable this option to slow printing down in areas where potential curled " +"perimeters may exist" +msgstr "" +"Potansiyel kıvrılmış çevrelerin bulunabileceği alanlarda yazdırmayı " +"yavaşlatmak için bu seçeneği etkinleştirin" msgid "mm/s or %" msgstr "mm/s veya %" @@ -6812,8 +7745,12 @@ msgstr "mm/s" msgid "Internal" msgstr "Dahili" -msgid "Speed of internal bridge. If the value is expressed as a percentage, it will be calculated based on the bridge_speed. Default value is 150%." -msgstr "Dahili köprünün hızı. Değer yüzde olarak ifade edilirse köprü_hızına göre hesaplanacaktır. Varsayılan değer %150'dir." +msgid "" +"Speed of internal bridge. If the value is expressed as a percentage, it will " +"be calculated based on the bridge_speed. Default value is 150%." +msgstr "" +"Dahili köprünün hızı. Değer yüzde olarak ifade edilirse köprü_hızına göre " +"hesaplanacaktır. Varsayılan değer %150'dir." msgid "Brim width" msgstr "Kenar genişliği" @@ -6824,14 +7761,23 @@ msgstr "Modelden en dış kenar çizgisine kadar olan mesafe" msgid "Brim type" msgstr "Kenar tipi" -msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analysed and calculated automatically." -msgstr "Bu, modellerin dış ve/veya iç kısmındaki Kenar oluşumunu kontrol eder. Otomatik, kenar genişliğinin otomatik olarak analiz edilip hesaplandığı anlamına gelir." +msgid "" +"This controls the generation of the brim at outer and/or inner side of " +"models. Auto means the brim width is analysed and calculated automatically." +msgstr "" +"Bu, modellerin dış ve/veya iç kısmındaki Kenar oluşumunu kontrol eder. " +"Otomatik, kenar genişliğinin otomatik olarak analiz edilip hesaplandığı " +"anlamına gelir." msgid "Brim-object gap" msgstr "Kenar-nesne boşluğu" -msgid "A gap between innermost brim line and object can make brim be removed more easily" -msgstr "En içteki kenar çizgisi ile nesne arasındaki boşluk, kenarlığın daha kolay çıkarılmasını sağlayabilir" +msgid "" +"A gap between innermost brim line and object can make brim be removed more " +"easily" +msgstr "" +"En içteki kenar çizgisi ile nesne arasındaki boşluk, kenarlığın daha kolay " +"çıkarılmasını sağlayabilir" msgid "Brim ears" msgstr "Kenar kulakları" @@ -6855,10 +7801,12 @@ msgid "Brim ear detection radius" msgstr "Kenar kulak algılama yarıçapı" msgid "" -"The geometry will be decimated before dectecting sharp angles. This parameter indicates the minimum length of the deviation for the decimation.\n" +"The geometry will be decimated before dectecting sharp angles. This " +"parameter indicates the minimum length of the deviation for the decimation.\n" "0 to deactivate" msgstr "" -"Keskin açılar tespit edilmeden önce geometrinin büyük bir kısmı yok edilecektir. Bu parametre, ondalık sapmanın minimum uzunluğunu gösterir.\n" +"Keskin açılar tespit edilmeden önce geometrinin büyük bir kısmı yok " +"edilecektir. Bu parametre, ondalık sapmanın minimum uzunluğunu gösterir.\n" "Devre dışı bırakmak için 0" msgid "Compatible machine" @@ -6888,14 +7836,26 @@ msgstr "Nesneye göre" msgid "Slow printing down for better layer cooling" msgstr "Daha iyi katman soğutması için baskıyı yavaşlat" -msgid "Enable this option to slow printing speed down to make the final layer time not shorter than the layer time threshold in \"Max fan speed threshold\", so that layer can be cooled for longer time. This can improve the cooling quality for needle and small details" -msgstr "Son katman süresinin \"Maksimum fan hızı eşiği\"ndeki katman süresi eşiğinden kısa olmamasını sağlamak amacıyla yazdırma hızını yavaşlatmak için bu seçeneği etkinleştirin, böylece katman daha uzun süre soğutulabilir. Bu, iğne ve küçük detaylar için soğutma kalitesini artırabilir" +msgid "" +"Enable this option to slow printing speed down to make the final layer time " +"not shorter than the layer time threshold in \"Max fan speed threshold\", so " +"that layer can be cooled for longer time. This can improve the cooling " +"quality for needle and small details" +msgstr "" +"Son katman süresinin \"Maksimum fan hızı eşiği\"ndeki katman süresi " +"eşiğinden kısa olmamasını sağlamak amacıyla yazdırma hızını yavaşlatmak için " +"bu seçeneği etkinleştirin, böylece katman daha uzun süre soğutulabilir. Bu, " +"iğne ve küçük detaylar için soğutma kalitesini artırabilir" msgid "Normal printing" msgstr "Normal Baskı" -msgid "The default acceleration of both normal printing and travel except initial layer" -msgstr "İlk katman dışında hem normal yazdırmanın hem de ilerlemenin varsayılan ivmesi" +msgid "" +"The default acceleration of both normal printing and travel except initial " +"layer" +msgstr "" +"İlk katman dışında hem normal yazdırmanın hem de ilerlemenin varsayılan " +"ivmesi" msgid "mm/s²" msgstr "mm/s²" @@ -6921,8 +7881,12 @@ msgstr "Daha iyi hava filtrelemesi için etkinleştirin" msgid "Fan speed" msgstr "Fan hızı" -msgid "Speed of exhuast fan during printing.This speed will overwrite the speed in filament custom gcode" -msgstr "Baskı sırasında egzoz fanının hızı. Bu hız, filament özel gcode'undaki hızın üzerine yazılacaktır" +msgid "" +"Speed of exhuast fan during printing.This speed will overwrite the speed in " +"filament custom gcode" +msgstr "" +"Baskı sırasında egzoz fanının hızı. Bu hız, filament özel gcode'undaki hızın " +"üzerine yazılacaktır" msgid "Speed of exhuast fan after printing completes" msgstr "Baskı tamamlandıktan sonra egzoz fanının hızı" @@ -6930,29 +7894,47 @@ msgstr "Baskı tamamlandıktan sonra egzoz fanının hızı" msgid "No cooling for the first" msgstr "Soğutmayı devre dışı bırak" -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 "İlk belirli katmanlar için tüm soğutma fanını kapatın. Daha iyi baskı plakası yapışması sağlamak için ilk katmanın soğutma fanı kapatılırdı" - -msgid "layers" -msgstr "katmanlar" +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 "" +"İlk belirli katmanlar için tüm soğutma fanını kapatın. Daha iyi baskı " +"plakası yapışması sağlamak için ilk katmanın soğutma fanı kapatılırdı" msgid "Don't support bridges" msgstr "Köprülerde destek olmasın" -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" -msgstr "Desteği çok büyük yapan tüm köprü alanını desteklemeyin. Bridge genellikle çok uzun olmasa da destek olmadan doğrudan yazdırılabilir" +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" +msgstr "" +"Desteği çok büyük yapan tüm köprü alanını desteklemeyin. Bridge genellikle " +"çok uzun olmasa da destek olmadan doğrudan yazdırılabilir" msgid "Thick bridges" msgstr "Kalın köprüler" -msgid "If enabled, bridges are more reliable, can bridge longer distances, but may look worse. If disabled, bridges look better but are reliable just for shorter bridged distances." -msgstr "Etkinleştirilirse köprüler daha güvenilir olur, daha uzun mesafeler arasında köprü kurabilir ancak daha kötü görünebilir. Devre dışı bırakıldığında köprüler daha iyi görünür ancak yalnızca daha kısa köprü mesafeleri için güvenilirdir." +msgid "" +"If enabled, bridges are more reliable, can bridge longer distances, but may " +"look worse. If disabled, bridges look better but are reliable just for " +"shorter bridged distances." +msgstr "" +"Etkinleştirilirse köprüler daha güvenilir olur, daha uzun mesafeler arasında " +"köprü kurabilir ancak daha kötü görünebilir. Devre dışı bırakıldığında " +"köprüler daha iyi görünür ancak yalnızca daha kısa köprü mesafeleri için " +"güvenilirdir." msgid "Max bridge length" msgstr "Maksimum köprü uzunluğu" -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 "Desteğe ihtiyaç duymayan maksimum köprü uzunluğu. Tüm köprülerin desteklenmesini istiyorsanız bunu 0'a, hiçbir köprünün desteklenmesini istemiyorsanız çok büyük bir değere ayarlayın." +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 "" +"Desteğe ihtiyaç duymayan maksimum köprü uzunluğu. Tüm köprülerin " +"desteklenmesini istiyorsanız bunu 0'a, hiçbir köprünün desteklenmesini " +"istemiyorsanız çok büyük bir değere ayarlayın." msgid "End G-code" msgstr "Bitiş G kodu" @@ -6966,8 +7948,12 @@ msgstr "Bu filament ile baskı bittiğinde çalışacak G kodu" msgid "Ensure vertical shell thickness" msgstr "Dikey kabuk kalınlığını onayla" -msgid "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)" -msgstr "Dikey kabuk kalınlığını garanti etmek için eğimli yüzeylerin yakınına katı dolgu ekleyin (üst + alt katı katmanlar)" +msgid "" +"Add solid infill near sloping surfaces to guarantee the vertical shell " +"thickness (top+bottom solid layers)" +msgstr "" +"Dikey kabuk kalınlığını garanti etmek için eğimli yüzeylerin yakınına katı " +"dolgu ekleyin (üst + alt katı katmanlar)" msgid "Top surface pattern" msgstr "Üst katman deseni" @@ -7008,25 +7994,46 @@ msgstr "Köprü dolgusu değil, alt yüzey dolgusunun çizgi deseni" msgid "Internal solid infill pattern" msgstr "İç dolgu deseni" -msgid "Line pattern of internal solid infill. if the detect nattow internal solid infill be enabled, the concentric pattern will be used for the small area." -msgstr "İç katı dolgunun çizgi deseni. doğal iç katı dolguyu tespit etme etkinleştirilirse, küçük alan için eşmerkezli desen kullanılacaktır." +msgid "" +"Line pattern of internal solid infill. if the detect nattow internal solid " +"infill be enabled, the concentric pattern will be used for the small area." +msgstr "" +"İç katı dolgunun çizgi deseni. doğal iç katı dolguyu tespit etme " +"etkinleştirilirse, küçük alan için eşmerkezli desen kullanılacaktır." -msgid "Line width of outer wall. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Dış duvarın çizgi genişliği. % olarak ifade edilirse Nozul çapı üzerinden hesaplanacaktır." +msgid "" +"Line width of outer wall. If expressed as a %, it will be computed over the " +"nozzle diameter." +msgstr "" +"Dış duvarın çizgi genişliği. % olarak ifade edilirse Nozul çapı üzerinden " +"hesaplanacaktır." -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 "En dışta görünen ve görünen dış duvarın hızı. Daha iyi kalite elde etmek için iç duvar hızından daha yavaş olması kullanılır." +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 "" +"En dışta görünen ve görünen dış duvarın hızı. Daha iyi kalite elde etmek " +"için iç duvar hızından daha yavaş olması kullanılır." msgid "Small perimeters" msgstr "Küçük çevre (perimeter)" -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. Set to zero for auto." -msgstr "Bu ayrı ayar, yarıçapı <= küçük_çevre_eşiği olan çevrelerin (genellikle delikler) hızını etkileyecektir. Yüzde olarak ifade edilirse (örneğin: %80), yukarıdaki dış duvar hızı ayarına göre hesaplanacaktır. Otomatik için sıfıra ayarlayın." +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. " +"Set to zero for auto." +msgstr "" +"Bu ayrı ayar, yarıçapı <= küçük_çevre_eşiği olan çevrelerin (genellikle " +"delikler) hızını etkileyecektir. Yüzde olarak ifade edilirse (örneğin: %80), " +"yukarıdaki dış duvar hızı ayarına göre hesaplanacaktır. Otomatik için sıfıra " +"ayarlayın." msgid "Small perimeters threshold" msgstr "Küçük çevre (perimeter) eşiği" -msgid "This sets the threshold for small perimeter length. Default threshold is 0mm" +msgid "" +"This sets the threshold for small perimeter length. Default threshold is 0mm" msgstr "Bu, küçük çevre uzunluğu için eşiği belirler. Varsayılan eşik 0 mm'dir" msgid "Order of inner wall/outer wall/infil" @@ -7053,17 +8060,29 @@ msgstr "iç-dış-iç/dolgu" msgid "Height to rod" msgstr "Çubuğa kadar olan yükseklik" -msgid "Distance of the nozzle tip to the lower rod. Used for collision avoidance in by-object printing." -msgstr "Nozul ucunun alt çubuğa olan mesafesi. Nesneye göre yazdırmada çarpışmayı önlemek için kullanılır." +msgid "" +"Distance of the nozzle tip to the lower rod. Used for collision avoidance in " +"by-object printing." +msgstr "" +"Nozul ucunun alt çubuğa olan mesafesi. Nesneye göre yazdırmada çarpışmayı " +"önlemek için kullanılır." msgid "Height to lid" msgstr "Kapağa kadar olan yükseklik" -msgid "Distance of the nozzle tip to the lid. Used for collision avoidance in by-object printing." -msgstr "Nozul ucunun kapağa olan mesafesi. Nesneye göre yazdırmada çarpışmayı önlemek için kullanılır." +msgid "" +"Distance of the nozzle tip to the lid. Used for collision avoidance in by-" +"object printing." +msgstr "" +"Nozul ucunun kapağa olan mesafesi. Nesneye göre yazdırmada çarpışmayı " +"önlemek için kullanılır." -msgid "Clearance radius around extruder. Used for collision avoidance in by-object printing." -msgstr "Ekstruder etrafındaki boşluk yarıçapı. Nesneye göre yazdırmada çarpışmayı önlemek için kullanılır." +msgid "" +"Clearance radius around extruder. Used for collision avoidance in by-object " +"printing." +msgstr "" +"Ekstruder etrafındaki boşluk yarıçapı. Nesneye göre yazdırmada çarpışmayı " +"önlemek için kullanılır." msgid "Extruder Color" msgstr "Ekstruder Rengi" @@ -7077,32 +8096,61 @@ msgstr "Ekstruder Konum" msgid "Flow ratio" msgstr "Akış oranı" -msgid "The material may have volumetric change after switching between molten state and crystalline state. This setting changes all extrusion flow of this filament in gcode proportionally. Recommended value range is between 0.95 and 1.05. Maybe you can tune this value to get nice flat surface when there has slight overflow or underflow" -msgstr "Malzeme, erimiş hal ile kristal hal arasında geçiş yaptıktan sonra hacimsel değişime sahip olabilir. Bu ayar, bu filamanın gcode'daki tüm ekstrüzyon akışını orantılı olarak değiştirir. Önerilen değer aralığı 0,95 ile 1,05 arasındadır. Belki hafif taşma veya taşma olduğunda güzel düz bir yüzey elde etmek için bu değeri ayarlayabilirsiniz" +msgid "" +"The material may have volumetric change after switching between molten state " +"and crystalline state. This setting changes all extrusion flow of this " +"filament in gcode proportionally. Recommended value range is between 0.95 " +"and 1.05. Maybe you can tune this value to get nice flat surface when there " +"has slight overflow or underflow" +msgstr "" +"Malzeme, erimiş hal ile kristal hal arasında geçiş yaptıktan sonra hacimsel " +"değişime sahip olabilir. Bu ayar, bu filamanın gcode'daki tüm ekstrüzyon " +"akışını orantılı olarak değiştirir. Önerilen değer aralığı 0,95 ile 1,05 " +"arasındadır. Belki hafif taşma veya taşma olduğunda güzel düz bir yüzey elde " +"etmek için bu değeri ayarlayabilirsiniz" msgid "Enable pressure advance" msgstr "Basınç Avansı (PA)" -msgid "Enable pressure advance, auto calibration result will be overwriten once enabled." -msgstr "Basınç avansını etkinleştirin; etkinleştirildiğinde otomatik kalibrasyon sonucunun üzerine yazılacaktır." +msgid "" +"Enable pressure advance, auto calibration result will be overwriten once " +"enabled." +msgstr "" +"Basınç avansını etkinleştirin; etkinleştirildiğinde otomatik kalibrasyon " +"sonucunun üzerine yazılacaktır." msgid "Pressure advance(Klipper) AKA Linear advance factor(Marlin)" msgstr "Basınç avansı (Klipper) Doğrusal ilerleme faktörü (Marlin)" -msgid "Default line width if other line widths are set to 0. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Diğer çizgi genişlikleri 0'a ayarlanmışsa varsayılan çizgi genişliği. % olarak ifade edilirse nozül çapı üzerinden hesaplanacaktır." +msgid "" +"Default line width if other line widths are set to 0. If expressed as a %, " +"it will be computed over the nozzle diameter." +msgstr "" +"Diğer çizgi genişlikleri 0'a ayarlanmışsa varsayılan çizgi genişliği. % " +"olarak ifade edilirse nozül çapı üzerinden hesaplanacaktır." msgid "Keep fan always on" msgstr "Fanı her zaman açık tut" -msgid "If enable this setting, part cooling fan will never be stoped and will run at least at minimum speed to reduce the frequency of starting and stoping" -msgstr "Bu ayarı etkinleştirirseniz, parça soğutma fanı hiçbir zaman durdurulmayacak ve başlatma ve durdurma sıklığını azaltmak için en azından minimum hızda çalışacaktır" +msgid "" +"If enable this setting, part cooling fan will never be stoped and will run " +"at least at minimum speed to reduce the frequency of starting and stoping" +msgstr "" +"Bu ayarı etkinleştirirseniz, parça soğutma fanı hiçbir zaman durdurulmayacak " +"ve başlatma ve durdurma sıklığını azaltmak için en azından minimum hızda " +"çalışacaktır" msgid "Layer time" msgstr "Katman süresi" -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 "Tahmini süresi bu değerden kısa olan katlarda parça soğutma fanı devreye girecektir. Fan hızı, katman yazdırma süresine göre minimum ve maksimum fan hızları arasında enterpole edilir" +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 "" +"Tahmini süresi bu değerden kısa olan katlarda parça soğutma fanı devreye " +"girecektir. Fan hızı, katman yazdırma süresine göre minimum ve maksimum fan " +"hızları arasında enterpole edilir" msgid "Default color" msgstr "Varsayılan renk" @@ -7122,11 +8170,21 @@ msgstr "Filament ile ilgili notlarınızı buraya yazabilirsiniz." msgid "Required nozzle HRC" msgstr "Gerekli nozul HRC" -msgid "Minimum HRC of nozzle required to print the filament. Zero means no checking of nozzle's HRC." -msgstr "Filamenti yazdırmak için gereken minimum HRC nozul. Sıfır, nozulun HRC'sinin kontrol edilmediği anlamına gelir." +msgid "" +"Minimum HRC of nozzle required to print the filament. Zero means no checking " +"of nozzle's HRC." +msgstr "" +"Filamenti yazdırmak için gereken minimum HRC nozul. Sıfır, nozulun HRC'sinin " +"kontrol edilmediği anlamına gelir." -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 "Bu ayar, saniyede ne kadar miktarda filamanın eritilip ekstrüde edilebileceğini gösterir. Çok yüksek ve makul olmayan hız ayarı durumunda, yazdırma hızı maksimum hacimsel hız ile sınırlanır. Sıfır olamaz" +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 "" +"Bu ayar, saniyede ne kadar miktarda filamanın eritilip ekstrüde " +"edilebileceğini gösterir. Çok yüksek ve makul olmayan hız ayarı durumunda, " +"yazdırma hızı maksimum hacimsel hız ile sınırlanır. Sıfır olamaz" msgid "mm³/s" msgstr "mm³/s" @@ -7135,26 +8193,41 @@ msgid "Filament load time" msgstr "Filament yükleme süresi" msgid "Time to load new filament when switch filament. For statistics only" -msgstr "Filamenti değiştirdiğinizde yeni filament yükleme zamanı. Yalnızca istatistikler için" +msgstr "" +"Filamenti değiştirdiğinizde yeni filament yükleme zamanı. Yalnızca " +"istatistikler için" msgid "Filament unload time" msgstr "Filament boşaltma süresi" msgid "Time to unload old filament when switch filament. For statistics only" -msgstr "Filamenti değiştirdiğinizde eski filamanı boşaltma zamanı. Yalnızca istatistikler için" +msgstr "" +"Filamenti değiştirdiğinizde eski filamanı boşaltma zamanı. Yalnızca " +"istatistikler için" -msgid "Filament diameter is used to calculate extrusion in gcode, so it's important and should be accurate" -msgstr "Filament çapı, gcode'da ekstrüzyonu hesaplamak için kullanılır; bu nedenle önemlidir ve doğru olmalıdır" +msgid "" +"Filament diameter is used to calculate extrusion in gcode, so it's important " +"and should be accurate" +msgstr "" +"Filament çapı, gcode'da ekstrüzyonu hesaplamak için kullanılır; bu nedenle " +"önemlidir ve doğru olmalıdır" msgid "Shrinkage" msgstr "Büzüşme" +#, fuzzy, c-format, boost-format msgid "" -"Enter the shrinkage percentage that the filament will get after cooling (94% if you measure 94mm instead of 100mm). The part will be scaled in xy to compensate. Only the filament used for the perimeter is taken into account.\n" -"Be sure to allow enough space between objects, as this compensation is done after the checks." +"Enter the shrinkage percentage that the filament will get after cooling " +"(94% if you measure 94mm instead of 100mm). The part will be scaled in xy to " +"compensate. Only the filament used for the perimeter is taken into account.\n" +"Be sure to allow enough space between objects, as this compensation is done " +"after the checks." msgstr "" -"Filamentin soğuduktan sonra alacağı büzülme yüzdesini girin (100 mm yerine 94 mm ölçerseniz 94%). Parça, telafi etmek için xy'de ölçeklendirilecektir. Yalnızca çevre için kullanılan filament dikkate alınır.\n" -"Bu telafi kontrollerden sonra yapıldığından, nesneler arasında yeterli boşluk bıraktığınızdan emin olun." +"Filamentin soğuduktan sonra alacağı büzülme yüzdesini girin (100 mm yerine " +"94 mm ölçerseniz 94%). Parça, telafi etmek için xy'de ölçeklendirilecektir. " +"Yalnızca çevre için kullanılan filament dikkate alınır.\n" +"Bu telafi kontrollerden sonra yapıldığından, nesneler arasında yeterli " +"boşluk bıraktığınızdan emin olun." msgid "Loading speed" msgstr "Yükleme hızı" @@ -7171,26 +8244,42 @@ msgstr "Yükleme aşamasının başında kullanılan hız." msgid "Unloading speed" msgstr "Boşaltma hızı" -msgid "Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just after ramming)." -msgstr "Filamenti silme kulesinde boşaltmak için kullanılan hız (sıkıştırmadan hemen sonra boşaltmanın ilk kısmını etkilemez)." +msgid "" +"Speed used for unloading the filament on the wipe tower (does not affect " +"initial part of unloading just after ramming)." +msgstr "" +"Filamenti silme kulesinde boşaltmak için kullanılan hız (sıkıştırmadan hemen " +"sonra boşaltmanın ilk kısmını etkilemez)." msgid "Unloading speed at the start" msgstr "Başlangıçta boşaltma hızı" -msgid "Speed used for unloading the tip of the filament immediately after ramming." -msgstr "Sıkıştırmadan hemen sonra filamentin ucunu boşaltmak için kullanılan hız." +msgid "" +"Speed used for unloading the tip of the filament immediately after ramming." +msgstr "" +"Sıkıştırmadan hemen sonra filamentin ucunu boşaltmak için kullanılan hız." msgid "Delay after unloading" msgstr "Boşaltma işleminden sonra gecikme" -msgid "Time to wait after the filament is unloaded. May help to get reliable toolchanges with flexible materials that may need more time to shrink to original dimensions." -msgstr "Filament boşaltıldıktan sonra beklenmesi gereken süre. Orijinal boyutlara küçülmesi için daha fazla zamana ihtiyaç duyabilecek esnek malzemelerle güvenilir takım değişimleri elde etmeye yardımcı olabilir." +msgid "" +"Time to wait after the filament is unloaded. May help to get reliable " +"toolchanges with flexible materials that may need more time to shrink to " +"original dimensions." +msgstr "" +"Filament boşaltıldıktan sonra beklenmesi gereken süre. Orijinal boyutlara " +"küçülmesi için daha fazla zamana ihtiyaç duyabilecek esnek malzemelerle " +"güvenilir takım değişimleri elde etmeye yardımcı olabilir." msgid "Number of cooling moves" msgstr "Soğutma hareketi sayısı" -msgid "Filament is cooled by being moved back and forth in the cooling tubes. Specify desired number of these moves." -msgstr "Filament, soğutma tüpleri içinde ileri geri hareket ettirilerek soğutulur. Bu sayısını belirtin." +msgid "" +"Filament is cooled by being moved back and forth in the cooling tubes. " +"Specify desired number of these moves." +msgstr "" +"Filament, soğutma tüpleri içinde ileri geri hareket ettirilerek soğutulur. " +"Bu sayısını belirtin." msgid "Speed of the first cooling move" msgstr "İlk soğutma hareketi hızı" @@ -7201,8 +8290,19 @@ msgstr "Soğutma hareketleri bu hızdan başlayarak kademeli olarak hızlanır." msgid "Minimal purge on wipe tower" msgstr "Silme kulesi üzerinde minimum boşaltım" -msgid "After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and the filament pressure is likely not yet stable. Before purging the print head into an infill or a sacrificial object, Slic3r will always prime this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably." -msgstr "Bir takım değişiminden sonra, yeni yüklenen filamanın nozül içindeki kesin konumu bilinmeyebilir ve filament basıncı muhtemelen henüz stabil değildir. Yazdırma kafasını bir dolguya veya kurban nesneye boşaltmadan önce Slic3r, ardışık dolgu veya kurban nesne ekstrüzyonlarını güvenilir bir şekilde üretmek için her zaman bu miktardaki malzemeyi silme kulesine hazırlayacaktır." +msgid "" +"After a tool change, the exact position of the newly loaded filament inside " +"the nozzle may not be known, and the filament pressure is likely not yet " +"stable. Before purging the print head into an infill or a sacrificial " +"object, Slic3r will always prime this amount of material into the wipe tower " +"to produce successive infill or sacrificial object extrusions reliably." +msgstr "" +"Bir takım değişiminden sonra, yeni yüklenen filamanın nozül içindeki kesin " +"konumu bilinmeyebilir ve filament basıncı muhtemelen henüz stabil değildir. " +"Yazdırma kafasını bir dolguya veya kurban nesneye boşaltmadan önce Slic3r, " +"ardışık dolgu veya kurban nesne ekstrüzyonlarını güvenilir bir şekilde " +"üretmek için her zaman bu miktardaki malzemeyi silme kulesine " +"hazırlayacaktır." msgid "Speed of the last cooling move" msgstr "Son soğutma hareketi hızı" @@ -7210,23 +8310,49 @@ msgstr "Son soğutma hareketi hızı" msgid "Cooling moves are gradually accelerating towards this speed." msgstr "Soğutma hareketleri bu hıza doğru giderek hızlanır." -msgid "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 "Yazıcı donanım yazılımının (veya Çoklu Malzeme Ünitesi 2.0'ın) takım değişikliği sırasında (T kodu yürütülürken) yeni bir filament yükleme süresi. Bu süre, G kodu zaman tahmincisi tarafından toplam baskı süresine eklenir." +msgid "" +"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 "" +"Yazıcı donanım yazılımının (veya Çoklu Malzeme Ünitesi 2.0'ın) takım " +"değişikliği sırasında (T kodu yürütülürken) yeni bir filament yükleme " +"süresi. Bu süre, G kodu zaman tahmincisi tarafından toplam baskı süresine " +"eklenir." msgid "Ramming parameters" msgstr "Sıkıştırma parametreleri" -msgid "This string is edited by RammingDialog and contains ramming specific parameters." -msgstr "Bu dize RammingDialog tarafından düzenlenir ve ramming'e özgü parametreleri içerir." +msgid "" +"This string is edited by RammingDialog and contains ramming specific " +"parameters." +msgstr "" +"Bu dize RammingDialog tarafından düzenlenir ve ramming'e özgü parametreleri " +"içerir." -msgid "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 "Yazıcı ürün yazılımının (veya Çoklu Malzeme Ünitesi 2.0'ın) takım değişimi sırasında (T kodu yürütülürken) filamenti boşaltma süresi. Bu süre, G kodu süre tahmincisi tarafından toplam baskı süresine eklenir." +msgid "" +"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 "" +"Yazıcı ürün yazılımının (veya Çoklu Malzeme Ünitesi 2.0'ın) takım değişimi " +"sırasında (T kodu yürütülürken) filamenti boşaltma süresi. Bu süre, G kodu " +"süre tahmincisi tarafından toplam baskı süresine eklenir." msgid "Enable ramming for multitool setups" msgstr "Çoklu araç kurulumları için sıkıştırmayı etkinleştirin" -msgid "Perform ramming when using multitool printer (i.e. when the 'Single Extruder Multimaterial' in Printer Settings is unchecked). When checked, a small amount of filament is rapidly extruded on the wipe tower just before the toolchange. This option is only used when the wipe tower is enabled." -msgstr "Çok takımlı yazıcı kullanırken sıkıştırma gerçekleştirin (yani Yazıcı Ayarları'ndaki 'Tek Ekstrüder Çoklu Malzeme' işaretli olmadığında). İşaretlendiğinde, takım değişiminden hemen önce silme kulesinde az miktarda filament hızla ekstrüde edilir. Bu seçenek yalnızca silme kulesi etkinleştirildiğinde kullanılır." +msgid "" +"Perform ramming when using multitool printer (i.e. when the 'Single Extruder " +"Multimaterial' in Printer Settings is unchecked). When checked, a small " +"amount of filament is rapidly extruded on the wipe tower just before the " +"toolchange. This option is only used when the wipe tower is enabled." +msgstr "" +"Çok takımlı yazıcı kullanırken sıkıştırma gerçekleştirin (yani Yazıcı " +"Ayarları'ndaki 'Tek Ekstrüder Çoklu Malzeme' işaretli olmadığında). " +"İşaretlendiğinde, takım değişiminden hemen önce silme kulesinde az miktarda " +"filament hızla ekstrüde edilir. Bu seçenek yalnızca silme kulesi " +"etkinleştirildiğinde kullanılır." msgid "Multitool ramming volume" msgstr "Çoklu araç sıkıştırma hacmi" @@ -7255,20 +8381,30 @@ msgstr "Filament malzeme türü" msgid "Soluble material" msgstr "Çözünür malzeme" -msgid "Soluble material is commonly used to print support and support interface" -msgstr "Çözünür malzeme genellikle destek ve destek arayüzünü yazdırmak için kullanılır" +msgid "" +"Soluble material is commonly used to print support and support interface" +msgstr "" +"Çözünür malzeme genellikle destek ve destek arayüzünü yazdırmak için " +"kullanılır" msgid "Support material" msgstr "Destek malzemesi" -msgid "Support material is commonly used to print support and support interface" -msgstr "Destek malzemesi yaygın olarak destek ve destek arayüzünü yazdırmak için kullanılır" +msgid "" +"Support material is commonly used to print support and support interface" +msgstr "" +"Destek malzemesi yaygın olarak destek ve destek arayüzünü yazdırmak için " +"kullanılır" msgid "Temperature of vitrificaiton" msgstr "Yumuşama sıcaklığı" -msgid "Material becomes soft at this temperature. Thus the heatbed cannot be hotter than this tempature" -msgstr "Bu sıcaklıkta malzeme yumuşar. Bu nedenle ısıtma yatağı bu sıcaklıktan daha sıcak olamaz" +msgid "" +"Material becomes soft at this temperature. Thus the heatbed cannot be hotter " +"than this tempature" +msgstr "" +"Bu sıcaklıkta malzeme yumuşar. Bu nedenle ısıtma yatağı bu sıcaklıktan daha " +"sıcak olamaz" msgid "Price" msgstr "Fiyat" @@ -7291,8 +8427,11 @@ msgstr "(Tanımsız)" msgid "Infill direction" msgstr "Dolgu Açısı" -msgid "Angle for sparse infill pattern, which controls the start or main direction of line" -msgstr "Hattın başlangıcını veya ana yönünü kontrol eden seyrek dolgu deseni açısı" +msgid "" +"Angle for sparse infill pattern, which controls the start or main direction " +"of line" +msgstr "" +"Hattın başlangıcını veya ana yönünü kontrol eden seyrek dolgu deseni açısı" msgid "Sparse infill density" msgstr "Dolgu Yoğunluğu" @@ -7341,11 +8480,25 @@ msgid "Sparse infill anchor length" msgstr "Dolgu Uzunluğu" msgid "" -"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Slic3r tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max. \n" -"Set this parameter to zero to disable anchoring perimeters connected to a single infill line." +"Connect an infill line to an internal perimeter with a short segment of an " +"additional perimeter. If expressed as percentage (example: 15%) it is " +"calculated over infill extrusion width. Slic3r tries to connect two close " +"infill lines to a short perimeter segment. If no such perimeter segment " +"shorter than infill_anchor_max is found, the infill line is connected to a " +"perimeter segment at just one side and the length of the perimeter segment " +"taken is limited to this parameter, but no longer than anchor_length_max. \n" +"Set this parameter to zero to disable anchoring perimeters connected to a " +"single infill line." msgstr "" -"Bir dolgu hattını, ek bir çevrenin kısa bir bölümü ile bir iç çevreye bağlayın. Yüzde olarak ifade edilirse (örnek: %15) dolgu ekstrüzyon genişliği üzerinden hesaplanır. Slic3r iki yakın dolgu hattını kısa bir çevre segmentine bağlamaya çalışıyor. infill_anchor_max'tan daha kısa böyle bir çevre segmenti bulunamazsa, dolgu hattı yalnızca bir taraftaki bir çevre segmentine bağlanır ve alınan çevre segmentinin uzunluğu bu parametreyle sınırlıdır, ancak çapa_uzunluk_max'tan uzun olamaz.\n" -"Tek bir dolgu hattına bağlı sabitleme çevrelerini devre dışı bırakmak için bu parametreyi sıfıra ayarlayın." +"Bir dolgu hattını, ek bir çevrenin kısa bir bölümü ile bir iç çevreye " +"bağlayın. Yüzde olarak ifade edilirse (örnek: %15) dolgu ekstrüzyon " +"genişliği üzerinden hesaplanır. Slic3r iki yakın dolgu hattını kısa bir " +"çevre segmentine bağlamaya çalışıyor. infill_anchor_max'tan daha kısa böyle " +"bir çevre segmenti bulunamazsa, dolgu hattı yalnızca bir taraftaki bir çevre " +"segmentine bağlanır ve alınan çevre segmentinin uzunluğu bu parametreyle " +"sınırlıdır, ancak çapa_uzunluk_max'tan uzun olamaz.\n" +"Tek bir dolgu hattına bağlı sabitleme çevrelerini devre dışı bırakmak için " +"bu parametreyi sıfıra ayarlayın." msgid "0 (no open anchors)" msgstr "0 (açık bağlantı yok)" @@ -7357,11 +8510,25 @@ msgid "Maximum length of the infill anchor" msgstr "Dolgu maksimum uzunluk" msgid "" -"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Slic3r 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 to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter. \n" -"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0." +"Connect an infill line to an internal perimeter with a short segment of an " +"additional perimeter. If expressed as percentage (example: 15%) it is " +"calculated over infill extrusion width. Slic3r 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 to a " +"perimeter segment at just one side and the length of the perimeter segment " +"taken is limited to infill_anchor, but no longer than this parameter. \n" +"If set to 0, the old algorithm for infill connection will be used, it should " +"create the same result as with 1000 & 0." msgstr "" -"Bir dolgu hattını, ek bir çevrenin kısa bir bölümü ile bir iç çevreye bağlayın. Yüzde olarak ifade edilirse (örnek: %15) dolgu ekstrüzyon genişliği üzerinden hesaplanır. Slic3r iki yakın dolgu hattını kısa bir çevre segmentine bağlamaya çalışıyor. Bu parametreden daha kısa bir çevre segmenti bulunamazsa, dolgu hattı sadece bir kenardaki bir çevre segmentine bağlanır ve alınan çevre segmentinin uzunluğu infill_anchor ile sınırlıdır ancak bu parametreden daha uzun olamaz.\n" -"0'a ayarlanırsa dolgu bağlantısı için eski algoritma kullanılacaktır; 1000 ve 0 ile aynı sonucu oluşturmalıdır." +"Bir dolgu hattını, ek bir çevrenin kısa bir bölümü ile bir iç çevreye " +"bağlayın. Yüzde olarak ifade edilirse (örnek: %15) dolgu ekstrüzyon " +"genişliği üzerinden hesaplanır. Slic3r iki yakın dolgu hattını kısa bir " +"çevre segmentine bağlamaya çalışıyor. Bu parametreden daha kısa bir çevre " +"segmenti bulunamazsa, dolgu hattı sadece bir kenardaki bir çevre segmentine " +"bağlanır ve alınan çevre segmentinin uzunluğu infill_anchor ile sınırlıdır " +"ancak bu parametreden daha uzun olamaz.\n" +"0'a ayarlanırsa dolgu bağlantısı için eski algoritma kullanılacaktır; 1000 " +"ve 0 ile aynı sonucu oluşturmalıdır." msgid "0 (Simple connect)" msgstr "0 (Basit bağlantı)" @@ -7375,26 +8542,48 @@ msgstr "İç duvarların hızlandırılması" msgid "Acceleration of travel moves" msgstr "Seyahat hareketlerinin hızlandırılması" -msgid "Acceleration of top surface infill. Using a lower value may improve top surface quality" -msgstr "Üst yüzey dolgusunun hızlandırılması. Daha düşük bir değerin kullanılması üst yüzey kalitesini iyileştirebilir" - +msgid "" +"Acceleration of top surface infill. Using a lower value may improve top " +"surface quality" +msgstr "" +"Üst yüzey dolgusunun hızlandırılması. Daha düşük bir değerin kullanılması " +"üst yüzey kalitesini iyileştirebilir" + msgid "Acceleration of outer wall. Using a lower value can improve quality" -msgstr "Dış duvarın hızlanması. Daha düşük bir değer kullanmak kaliteyi artırabilir" +msgstr "" +"Dış duvarın hızlanması. Daha düşük bir değer kullanmak kaliteyi artırabilir" -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." -msgstr "Köprülerin hızlandırılması. Değer yüzde olarak ifade edilirse (örn. %50), dış duvar ivmesine göre hesaplanacaktır." +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." +msgstr "" +"Köprülerin hızlandırılması. Değer yüzde olarak ifade edilirse (örn. %50), " +"dış duvar ivmesine göre hesaplanacaktır." msgid "mm/s² or %" msgstr "mm/s² veya %" -msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration." -msgstr "Seyrek dolgunun hızlandırılması. Değer yüzde olarak ifade edilirse (örn. %100), varsayılan ivmeye göre hesaplanacaktır." +msgid "" +"Acceleration of sparse infill. If the value is expressed as a percentage (e." +"g. 100%), it will be calculated based on the default acceleration." +msgstr "" +"Seyrek dolgunun hızlandırılması. Değer yüzde olarak ifade edilirse (örn. " +"%100), varsayılan ivmeye göre hesaplanacaktır." -msgid "Acceleration of internal solid infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration." -msgstr "İç katı dolgunun hızlandırılması. Değer yüzde olarak ifade edilirse (örn. %100), varsayılan ivmeye göre hesaplanacaktır." +msgid "" +"Acceleration of internal solid infill. If the value is expressed as a " +"percentage (e.g. 100%), it will be calculated based on the default " +"acceleration." +msgstr "" +"İç katı dolgunun hızlandırılması. Değer yüzde olarak ifade edilirse (örn. " +"%100), varsayılan ivmeye göre hesaplanacaktır." -msgid "Acceleration of initial layer. Using a lower value can improve build plate adhensive" -msgstr "Başlangıç katmanının hızlandırılması. Daha düşük bir değerin kullanılması baskı plakası yapışkanlığını iyileştirebilir" +msgid "" +"Acceleration of initial layer. Using a lower value can improve build plate " +"adhensive" +msgstr "" +"Başlangıç katmanının hızlandırılması. Daha düşük bir değerin kullanılması " +"baskı plakası yapışkanlığını iyileştirebilir" msgid "Enable accel_to_decel" msgstr "Accel_to_decel'i etkinleştir" @@ -7405,8 +8594,10 @@ msgstr "Klipper'ın max_accel_to_decel'i otomatik olarak ayarlanacak" msgid "accel_to_decel" msgstr "accel_to_decel" -msgid "Klipper's max_accel_to_decel will be adjusted to this % of acceleration" -msgstr "Klipper max_accel_to_decel değeri bu hızlanma % değerine ayarlanacaktır" +#, c-format, boost-format +msgid "" +"Klipper's max_accel_to_decel will be adjusted to this %% of acceleration" +msgstr "" #, c-format, boost-format msgid "%%" @@ -7430,14 +8621,22 @@ msgstr "İlk katman için JERK değeri" msgid "Jerk for travel" msgstr "Seyahat için JERK değeri" -msgid "Line width of initial layer. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "İlk katmanın çizgi genişliği. % olarak ifade edilirse Nozul çapı üzerinden hesaplanacaktır." +msgid "" +"Line width of initial layer. If expressed as a %, it will be computed over " +"the nozzle diameter." +msgstr "" +"İlk katmanın çizgi genişliği. % olarak ifade edilirse Nozul çapı üzerinden " +"hesaplanacaktır." msgid "Initial layer height" msgstr "Başlangıç katman yüksekliği" -msgid "Height of initial layer. Making initial layer height to be thick slightly can improve build plate adhension" -msgstr "İlk katmanın yüksekliği. İlk katman yüksekliğini biraz kalın yapmak, baskı plakasının yapışmasını iyileştirebilir" +msgid "" +"Height of initial layer. Making initial layer height to be thick slightly " +"can improve build plate adhension" +msgstr "" +"İlk katmanın yüksekliği. İlk katman yüksekliğini biraz kalın yapmak, baskı " +"plakasının yapışmasını iyileştirebilir" msgid "Speed of initial layer except the solid infill part" msgstr "Katı dolgu kısmı dışındaki ilk katmanın hızı" @@ -7457,8 +8656,12 @@ msgstr "İlk katman seyahat hızı" msgid "Number of slow layers" msgstr "Yavaş katman sayısı" -msgid "The first few layers are printed slower than normal. The speed is gradually increased in a linear fashion over the specified number of layers." -msgstr "İlk birkaç katman normalden daha yavaş yazdırılır. Hız, belirtilen katman sayısı boyunca doğrusal bir şekilde kademeli olarak artırılır." +msgid "" +"The first few layers are printed slower than normal. The speed is gradually " +"increased in a linear fashion over the specified number of layers." +msgstr "" +"İlk birkaç katman normalden daha yavaş yazdırılır. Hız, belirtilen katman " +"sayısı boyunca doğrusal bir şekilde kademeli olarak artırılır." msgid "Initial layer nozzle temperature" msgstr "İlk katman nozul sıcaklığı" @@ -7469,23 +8672,39 @@ msgstr "Bu filamenti kullanırken ilk katmanı yazdırmak için nozul sıcaklı msgid "Full fan speed at layer" msgstr "Maksimum fan hızı" -msgid "Fan speed will be ramped up linearly from zero at layer \"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower 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 "Fan hızı, \"close_fan_the_first_x_layers\" katmanında sıfırdan \"ful_fan_speed_layer\" katmanında maksimuma doğrusal olarak artırılacaktır. \"full_fan_speed_layer\", \"close_fan_the_first_x_layers\" değerinden düşükse göz ardı edilecektir; bu durumda fan, \"close_fan_the_first_x_layers\" + 1 katmanında izin verilen maksimum hızda çalışacaktır." +msgid "" +"Fan speed will be ramped up linearly from zero at layer " +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower 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 "" +"Fan hızı, \"close_fan_the_first_x_layers\" katmanında sıfırdan " +"\"ful_fan_speed_layer\" katmanında maksimuma doğrusal olarak artırılacaktır. " +"\"full_fan_speed_layer\", \"close_fan_the_first_x_layers\" değerinden " +"düşükse göz ardı edilecektir; bu durumda fan, \"close_fan_the_first_x_layers" +"\" + 1 katmanında izin verilen maksimum hızda çalışacaktır." msgid "Support interface fan speed" msgstr "Destekler için fan hızı" msgid "" -"This fan speed is enforced during all support interfaces, to be able to weaken their bonding with a high fan speed.\n" +"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 overriden by disable_fan_first_layers." msgstr "" -"Bu fan hızı, yüksek fan hızıyla bağlarını zayıflatabilmek için tüm destek arayüzlerinde uygulanır.\n" +"Bu fan hızı, yüksek fan hızıyla bağlarını zayıflatabilmek için tüm destek " +"arayüzlerinde uygulanır.\n" "Bu geçersiz kılmayı devre dışı bırakmak için -1'e ayarlayın.\n" "Yalnızca devre dışı_fan_first_layers tarafından geçersiz kılınabilir." -msgid "Randomly jitter while printing the wall, so that the surface has a rough look. This setting controls the fuzzy position" -msgstr "Duvara baskı yaparken rastgele titreme, böylece yüzeyin pürüzlü bir görünüme sahip olması. Bu ayar bulanık konumu kontrol eder" +msgid "" +"Randomly jitter while printing the wall, so that the surface has a rough " +"look. This setting controls the fuzzy position" +msgstr "" +"Duvara baskı yaparken rastgele titreme, böylece yüzeyin pürüzlü bir görünüme " +"sahip olması. Bu ayar bulanık konumu kontrol eder" msgid "None" msgstr "Hiçbiri" @@ -7502,14 +8721,21 @@ msgstr "Tüm duvarlar" msgid "Fuzzy skin thickness" msgstr "Bulanık kaplama kalınlığı" -msgid "The width within which to jitter. It's adversed to be below outer wall line width" -msgstr "Titremenin gerçekleşeceği genişlik. Dış duvar çizgi genişliğinin altında olması sakıncalıdır" +msgid "" +"The width within which to jitter. It's adversed to be below outer wall line " +"width" +msgstr "" +"Titremenin gerçekleşeceği genişlik. Dış duvar çizgi genişliğinin altında " +"olması sakıncalıdır" msgid "Fuzzy skin point distance" msgstr "Bulanık kaplama noktası mesafesi" -msgid "The average diatance between the random points introducded on each line segment" -msgstr "Her çizgi parçasına eklenen rastgele noktalar arasındaki ortalama mesafe" +msgid "" +"The average diatance between the random points introducded on each line " +"segment" +msgstr "" +"Her çizgi parçasına eklenen rastgele noktalar arasındaki ortalama mesafe" msgid "Filter out tiny gaps" msgstr "Küçük boşlukları filtrele" @@ -7517,35 +8743,57 @@ msgstr "Küçük boşlukları filtrele" msgid "Layers and Perimeters" msgstr "Katmanlar ve Çevreler" -msgid "Filter out gaps smaller than the threshold specified. This setting won't affect top/bottom layers" -msgstr "Belirtilen eşikten daha küçük boşlukları filtreleyin. Bu ayar üst/alt katmanları etkilemez" +msgid "" +"Filter out gaps smaller than the threshold specified. This setting won't " +"affect top/bottom layers" +msgstr "" +"Belirtilen eşikten daha küçük boşlukları filtreleyin. Bu ayar üst/alt " +"katmanları etkilemez" -msgid "Speed of gap infill. Gap usually has irregular line width and should be printed more slowly" -msgstr "Boşluk doldurma hızı. Boşluk genellikle düzensiz çizgi genişliğine sahiptir ve daha yavaş yazdırılmalıdır" +msgid "" +"Speed of gap infill. Gap usually has irregular line width and should be " +"printed more slowly" +msgstr "" +"Boşluk doldurma hızı. Boşluk genellikle düzensiz çizgi genişliğine sahiptir " +"ve daha yavaş yazdırılmalıdır" msgid "Arc fitting" msgstr "Ark" -msgid "Enable this to get a G-code file which has G2 and G3 moves. And the fitting tolerance is same with resolution" -msgstr "G2 ve G3 hareketlerine sahip bir G kodu dosyası elde etmek için bunu etkinleştirin. Ve montaj toleransı çözünürlükle aynıdır" +msgid "" +"Enable this to get a G-code file which has G2 and G3 moves. And the fitting " +"tolerance is same with resolution" +msgstr "" +"G2 ve G3 hareketlerine sahip bir G kodu dosyası elde etmek için bunu " +"etkinleştirin. Ve montaj toleransı çözünürlükle aynıdır" msgid "Add line number" msgstr "Satır numarası ekle" msgid "Enable this to add line number(Nx) at the beginning of each G-Code line" -msgstr "Her G Kodu satırının başına satır numarası (Nx) eklemek için bunu etkinleştirin" +msgstr "" +"Her G Kodu satırının başına satır numarası (Nx) eklemek için bunu " +"etkinleştirin" msgid "Scan first layer" msgstr "İlk katmanı tara" -msgid "Enable this to enable the camera on printer to check the quality of first layer" -msgstr "Yazıcıdaki kameranın ilk katmanın kalitesini kontrol etmesini sağlamak için bunu etkinleştirin" +msgid "" +"Enable this to enable the camera on printer to check the quality of first " +"layer" +msgstr "" +"Yazıcıdaki kameranın ilk katmanın kalitesini kontrol etmesini sağlamak için " +"bunu etkinleştirin" msgid "Nozzle type" msgstr "Nozul tipi" -msgid "The metallic material of nozzle. This determines the abrasive resistance of nozzle, and what kind of filament can be printed" -msgstr "Nozulnin metalik malzemesi. Bu, nozulun aşınma direncini ve ne tür filamentin basılabileceğini belirler" +msgid "" +"The metallic material of nozzle. This determines the abrasive resistance of " +"nozzle, and what kind of filament can be printed" +msgstr "" +"Nozulnin metalik malzemesi. Bu, nozulun aşınma direncini ve ne tür " +"filamentin basılabileceğini belirler" msgid "Undefine" msgstr "Tanımsız" @@ -7562,8 +8810,12 @@ msgstr "Pirinç" msgid "Nozzle HRC" msgstr "Nozul HRC" -msgid "The nozzle's hardness. Zero means no checking for nozzle's hardness during slicing." -msgstr "Nozul sertliği. Sıfır, dilimleme sırasında nozul sertliğinin kontrol edilmediği anlamına gelir." +msgid "" +"The nozzle's hardness. Zero means no checking for nozzle's hardness during " +"slicing." +msgstr "" +"Nozul sertliği. Sıfır, dilimleme sırasında nozul sertliğinin kontrol " +"edilmediği anlamına gelir." msgid "HRC" msgstr "sıcak rulo" @@ -7596,14 +8848,23 @@ msgid "Enable this option if machine has auxiliary part cooling fan" msgstr "Makinede yardımcı parça soğutma fanı varsa bu seçeneği etkinleştirin" msgid "" -"Start the fan this number of seconds earlier than its target start time (you can use fractional seconds). It assumes infinite acceleration for this time estimation, and will only take into account G1 and G0 moves (arc fitting is unsupported).\n" -"It won't move fan comands from custom gcodes (they act as a sort of 'barrier').\n" -"It won't move fan comands into the start gcode if the 'only custom start gcode' is activated.\n" +"Start the fan this number of seconds earlier than its target start time (you " +"can use fractional seconds). It assumes infinite acceleration for this time " +"estimation, and will only take into account G1 and G0 moves (arc fitting is " +"unsupported).\n" +"It won't move fan comands from custom gcodes (they act as a sort of " +"'barrier').\n" +"It won't move fan comands into the start gcode if the 'only custom start " +"gcode' is activated.\n" "Use 0 to deactivate." msgstr "" -"Fanı hedef başlangıç zamanından bu kadar saniye önce başlatın (kesirli saniyeleri kullanabilirsiniz). Bu süre tahmini için sonsuz ivme varsayar ve yalnızca G1 ve G0 hareketlerini hesaba katar (yay uydurma desteklenmez).\n" -"Fan komutlarını özel kodlardan taşımaz (bir çeşit 'bariyer' görevi görürler).\n" -"'Yalnızca özel başlangıç gcode'u etkinleştirilmişse, fan komutları başlangıç gcode'una taşınmayacaktır.\n" +"Fanı hedef başlangıç zamanından bu kadar saniye önce başlatın (kesirli " +"saniyeleri kullanabilirsiniz). Bu süre tahmini için sonsuz ivme varsayar ve " +"yalnızca G1 ve G0 hareketlerini hesaba katar (yay uydurma desteklenmez).\n" +"Fan komutlarını özel kodlardan taşımaz (bir çeşit 'bariyer' görevi " +"görürler).\n" +"'Yalnızca özel başlangıç gcode'u etkinleştirilmişse, fan komutları başlangıç " +"gcode'una taşınmayacaktır.\n" "Devre dışı bırakmak için 0'ı kullanın." msgid "Only overhangs" @@ -7616,12 +8877,16 @@ msgid "Fan kick-start time" msgstr "Fan başlatma süresi" msgid "" -"Emit a max fan speed command for this amount of seconds before reducing to target speed to kick-start the cooling fan.\n" -"This is useful for fans where a low PWM/power may be insufficient to get the fan started spinning from a stop, or to get the fan up to speed faster.\n" +"Emit a max fan speed command for this amount of seconds before reducing to " +"target speed to kick-start the cooling fan.\n" +"This is useful for fans where a low PWM/power may be insufficient to get the " +"fan started spinning from a stop, or to get the fan up to speed faster.\n" "Set to 0 to deactivate." msgstr "" -"Soğutma fanını başlatmak için hedef hıza düşmeden önce bu süre boyunca maksimum fan hızı komutunu verin.\n" -"Bu, düşük PWM/gücün fanın durma noktasından dönmeye başlaması veya fanın daha hızlı hızlanması için yetersiz olabileceği fanlar için kullanışlıdır.\n" +"Soğutma fanını başlatmak için hedef hıza düşmeden önce bu süre boyunca " +"maksimum fan hızı komutunu verin.\n" +"Bu, düşük PWM/gücün fanın durma noktasından dönmeye başlaması veya fanın " +"daha hızlı hızlanması için yetersiz olabileceği fanlar için kullanışlıdır.\n" "Devre dışı bırakmak için 0'a ayarlayın." msgid "Time cost" @@ -7636,8 +8901,11 @@ msgstr "para/h" msgid "Support control chamber temperature" msgstr "Destek kontrol ortam sıcaklığı" -msgid "This option is enabled if machine support controlling chamber temperature" -msgstr "Bu seçeneği, yazıcınız ortam sıcaklığını kontrol etmeyi destekliyorsa etkinleştirin" +msgid "" +"This option is enabled if machine support controlling chamber temperature" +msgstr "" +"Bu seçeneği, yazıcınız ortam sıcaklığını kontrol etmeyi destekliyorsa " +"etkinleştirin" msgid "Support air filtration" msgstr "Hava filtrasyonu desteği" @@ -7657,38 +8925,66 @@ msgstr "Klipper" msgid "Label objects" msgstr "Nesneleri etiketle" -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 plugin. This settings is NOT compatible with Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill." -msgstr "G-Code etiketleme yazdırma hareketlerine ait oldukları nesneyle ilgili yorumlar eklemek için bunu etkinleştirin; bu, Octoprint CancelObject eklentisi için kullanışlıdır. Bu ayarlar Tek Ekstruder Çoklu Malzeme kurulumu ve Nesneye Temizleme / Dolguya Temizleme ile uyumlu DEĞİLDİR." +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 " +"plugin. This settings is NOT compatible with Single Extruder Multi Material " +"setup and Wipe into Object / Wipe into Infill." +msgstr "" +"G-Code etiketleme yazdırma hareketlerine ait oldukları nesneyle ilgili " +"yorumlar eklemek için bunu etkinleştirin; bu, Octoprint CancelObject " +"eklentisi için kullanışlıdır. Bu ayarlar Tek Ekstruder Çoklu Malzeme " +"kurulumu ve Nesneye Temizleme / Dolguya Temizleme ile uyumlu DEĞİLDİR." msgid "Exclude objects" msgstr "Nesneleri hariç tut" msgid "Enable this option to add EXCLUDE OBJECT command in g-code" -msgstr "G koduna EXCLUDE OBJECT komutunu eklemek için bu seçeneği etkinleştirin" +msgstr "" +"G koduna EXCLUDE OBJECT komutunu eklemek için bu seçeneği etkinleştirin" msgid "Verbose G-code" msgstr "Ayrıntılı G kodu" -msgid "Enable this to get a commented G-code file, with each line explained by a descriptive text. If you print from SD card, the additional weight of the file could make your firmware slow down." -msgstr "Her satırın açıklayıcı bir metinle açıklandığı, yorumlu bir G kodu dosyası almak için bunu etkinleştirin. SD karttan yazdırırsanız dosyanın ilave ağırlığı ürün yazılımınızın yavaşlamasına neden olabilir." +msgid "" +"Enable this to get a commented G-code file, with each line explained by a " +"descriptive text. If you print from SD card, the additional weight of the " +"file could make your firmware slow down." +msgstr "" +"Her satırın açıklayıcı bir metinle açıklandığı, yorumlu bir G kodu dosyası " +"almak için bunu etkinleştirin. SD karttan yazdırırsanız dosyanın ilave " +"ağırlığı ürün yazılımınızın yavaşlamasına neden olabilir." msgid "Infill combination" msgstr "Dolgu kombinasyonu" -msgid "Automatically Combine sparse infill of several layers to print together to reduce time. Wall is still printed with original layer height." -msgstr "Zamanı azaltmak amacıyla birden fazla katmanın seyrek dolgusunu otomatik olarak birleştirerek birlikte yazdırın. Duvar hala orijinal katman yüksekliğinde basılmaktadır." +msgid "" +"Automatically Combine sparse infill of several layers to print together to " +"reduce time. Wall is still printed with original layer height." +msgstr "" +"Zamanı azaltmak amacıyla birden fazla katmanın seyrek dolgusunu otomatik " +"olarak birleştirerek birlikte yazdırın. Duvar hala orijinal katman " +"yüksekliğinde basılmaktadır." msgid "Filament to print internal sparse infill." msgstr "İç seyrek dolguyu yazdırmak için filament." -msgid "Line width of internal sparse infill. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "İç seyrek dolgunun çizgi genişliği. % olarak ifade edilirse Nozul çapı üzerinden hesaplanacaktır." +msgid "" +"Line width of internal sparse infill. If expressed as a %, it will be " +"computed over the nozzle diameter." +msgstr "" +"İç seyrek dolgunun çizgi genişliği. % olarak ifade edilirse Nozul çapı " +"üzerinden hesaplanacaktır." msgid "Infill/Wall overlap" msgstr "Dolgu/Duvar örtüşmesi" -msgid "Infill area is enlarged slightly to overlap with wall for better bonding. The percentage value is relative to line width of sparse infill" -msgstr "Daha iyi yapışma için dolgu alanı duvarla örtüşecek şekilde hafifçe genişletilir. Yüzde değeri seyrek dolgunun çizgi genişliğine göredir" +msgid "" +"Infill area is enlarged slightly to overlap with wall for better bonding. " +"The percentage value is relative to line width of sparse infill" +msgstr "" +"Daha iyi yapışma için dolgu alanı duvarla örtüşecek şekilde hafifçe " +"genişletilir. Yüzde değeri seyrek dolgunun çizgi genişliğine göredir" msgid "Speed of internal sparse infill" msgstr "İç seyrek dolgunun hızı" @@ -7696,14 +8992,25 @@ msgstr "İç seyrek dolgunun hızı" msgid "Interface shells" msgstr "Arayüz kabukları" -msgid "Force the generation of solid shells between adjacent materials/volumes. Useful for multi-extruder prints with translucent materials or manual soluble support material" -msgstr "Bitişik malzemeler/hacimler arasında katı kabuk oluşumunu zorlayın. Yarı saydam malzemelerle veya elle çözülebilen destek malzemesiyle çoklu ekstruder baskıları için kullanışlıdır" +msgid "" +"Force the generation of solid shells between adjacent materials/volumes. " +"Useful for multi-extruder prints with translucent materials or manual " +"soluble support material" +msgstr "" +"Bitişik malzemeler/hacimler arasında katı kabuk oluşumunu zorlayın. Yarı " +"saydam malzemelerle veya elle çözülebilen destek malzemesiyle çoklu " +"ekstruder baskıları için kullanışlıdır" msgid "Ironing Type" msgstr "Ütüleme Tipi" -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 "Ütüleme, düz yüzeyi daha pürüzsüz hale getirmek için aynı yükseklikteki yüzeye tekrar baskı yapmak için küçük akış kullanmaktır. Bu ayar hangi katmanın ütüleneceğini kontrol eder" +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 "" +"Ütüleme, düz yüzeyi daha pürüzsüz hale getirmek için aynı yükseklikteki " +"yüzeye tekrar baskı yapmak için küçük akış kullanmaktır. Bu ayar hangi " +"katmanın ütüleneceğini kontrol eder" msgid "No ironing" msgstr "Ütüleme yok" @@ -7720,11 +9027,18 @@ msgstr "Tamamı katı katman" msgid "Ironing Pattern" msgstr "Ütüleme Deseni" +msgid "The pattern that will be used when ironing" +msgstr "" + msgid "Ironing flow" msgstr "Ütüleme akışı" -msgid "The amount of material to extrude during ironing. Relative to flow of normal layer height. Too high value results in overextrusion on the surface" -msgstr "Ütüleme sırasında çıkacak malzeme miktarı. Normal katman yüksekliğindeki akışa göre. Çok yüksek değer yüzeyde aşırı ekstrüzyona neden olur" +msgid "" +"The amount of material to extrude during ironing. Relative to flow of normal " +"layer height. Too high value results in overextrusion on the surface" +msgstr "" +"Ütüleme sırasında çıkacak malzeme miktarı. Normal katman yüksekliğindeki " +"akışa göre. Çok yüksek değer yüzeyde aşırı ekstrüzyona neden olur" msgid "Ironing line spacing" msgstr "Ütüleme çizgi aralığı" @@ -7738,17 +9052,34 @@ msgstr "Ütüleme hızı" msgid "Print speed of ironing lines" msgstr "Ütüleme çizgilerinin baskı hızı" +msgid "Ironing angle" +msgstr "" + +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" + msgid "This gcode part is inserted at every layer change after lift z" -msgstr "Bu gcode kısmı, z kaldırma işleminden sonra her katman değişikliğinde eklenir" +msgstr "" +"Bu gcode kısmı, z kaldırma işleminden sonra her katman değişikliğinde eklenir" msgid "Supports silent mode" msgstr "Sessiz modu destekler" -msgid "Whether the machine supports silent mode in which machine use lower acceleration to print" -msgstr "Makinenin yazdırmak için daha düşük hızlanma kullandığı sessiz modu destekleyip desteklemediği" +msgid "" +"Whether the machine supports silent mode in which machine use lower " +"acceleration to print" +msgstr "" +"Makinenin yazdırmak için daha düşük hızlanma kullandığı sessiz modu " +"destekleyip desteklemediği" -msgid "This G-code will be used as a code for the pause print. User can insert pause G-code in gcode viewer" -msgstr "Bu G kodu duraklatma yazdırması için bir kod olarak kullanılacaktır. Kullanıcı gcode görüntüleyiciye duraklatma G kodunu ekleyebilir" +msgid "" +"This G-code will be used as a code for the pause print. User can insert " +"pause G-code in gcode viewer" +msgstr "" +"Bu G kodu duraklatma yazdırması için bir kod olarak kullanılacaktır. " +"Kullanıcı gcode görüntüleyiciye duraklatma G kodunu ekleyebilir" msgid "This G-code will be used as a custom code" msgstr "Bu G kodu özel kod olarak kullanılacak" @@ -7855,45 +9186,81 @@ msgstr "Geri çekilme için maksimum hızlanma (M204 R)" msgid "Maximum acceleration for travel" msgstr "Seyahat için maksimum hızlanma" -msgid "Maximum acceleration for travel (M204 T)" -msgstr "Hareket için maksimum hızlanma (M204 T)" +msgid "Maximum acceleration for travel (M204 T), it only applies to Marlin 2" +msgstr "" -msgid "Part cooling fan speed may be increased when auto cooling is enabled. This is the maximum speed limitation of part cooling fan" -msgstr "Otomatik soğutma etkinleştirildiğinde parça soğutma fanı hızı artırılabilir. Bu, parça soğutma fanının maksimum hız sınırlamasıdır" +msgid "" +"Part cooling fan speed may be increased when auto cooling is enabled. This " +"is the maximum speed limitation of part cooling fan" +msgstr "" +"Otomatik soğutma etkinleştirildiğinde parça soğutma fanı hızı artırılabilir. " +"Bu, parça soğutma fanının maksimum hız sınırlamasıdır" msgid "Max" msgstr "Maksimum" -msgid "The largest printable layer height for extruder. Used tp limits the maximum layer hight when enable adaptive layer height" -msgstr "Ekstrüder için yazdırılabilir en büyük katman yüksekliği. Uyarlanabilir katman yüksekliği etkinleştirildiğinde maksimum katman yüksekliğini sınırlamak için kullanılır" +msgid "" +"The largest printable layer height for extruder. Used tp limits the maximum " +"layer hight when enable adaptive layer height" +msgstr "" +"Ekstrüder için yazdırılabilir en büyük katman yüksekliği. Uyarlanabilir " +"katman yüksekliği etkinleştirildiğinde maksimum katman yüksekliğini " +"sınırlamak için kullanılır" msgid "Extrusion rate smoothing" msgstr "Ekstrüzyon hızını yumuşatma" msgid "" -"This parameter smooths out sudden extrusion rate changes that happen when the printer transitions from printing a high flow (high speed/larger width) extrusion to a lower flow (lower speed/smaller width) extrusion and vice versa.\n" +"This parameter smooths out sudden extrusion rate changes that happen when " +"the printer transitions from printing a high flow (high speed/larger width) " +"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " +"versa.\n" "\n" -"It defines the maximum rate by which the extruded volumetric flow in mm3/sec can change over time. Higher values mean higher extrusion rate changes are allowed, resulting in faster speed transitions.\n" +"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " +"can change over time. Higher values mean higher extrusion rate changes are " +"allowed, resulting in faster speed transitions.\n" "\n" "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 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 just enough smoothing to assist pressure advance achieve a smoother flow transition.\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 " +"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 " +"just enough smoothing to assist pressure advance achieve a smoother flow " +"transition.\n" "\n" -"For slower printers without pressure advance, the value should be set much lower. A value of 10-15mm3/s2 is a good starting point for direct drive extruders and 5-10mm3/s2 for Bowden style. \n" +"For slower printers without pressure advance, the value should be set much " +"lower. A value of 10-15mm3/s2 is a good starting point for direct drive " +"extruders and 5-10mm3/s2 for Bowden style. \n" "\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n" "\n" "Note: this parameter disables arc fitting." msgstr "" -"Bu parametre, yazıcı yüksek akışlı (yüksek hız/daha büyük genişlik) bir ekstrüzyondan daha düşük akışlı (daha düşük hız/küçük genişlik) bir ekstrüzyona geçtiğinde veya tam tersi olduğunda meydana gelen ani ekstrüzyon hızı değişikliklerini düzeltir.\n" +"Bu parametre, yazıcı yüksek akışlı (yüksek hız/daha büyük genişlik) bir " +"ekstrüzyondan daha düşük akışlı (daha düşük hız/küçük genişlik) bir " +"ekstrüzyona geçtiğinde veya tam tersi olduğunda meydana gelen ani ekstrüzyon " +"hızı değişikliklerini düzeltir.\n" "\n" -"Ekstrüde edilen hacimsel akışın mm3/sn cinsinden zaman içinde değişebileceği maksimum oranı tanımlar. Daha yüksek değerler, daha yüksek ekstrüzyon hızı değişikliklerine izin verildiği anlamına gelir ve daha hızlı hız geçişlerine neden olur.\n" +"Ekstrüde edilen hacimsel akışın mm3/sn cinsinden zaman içinde değişebileceği " +"maksimum oranı tanımlar. Daha yüksek değerler, daha yüksek ekstrüzyon hızı " +"değişikliklerine izin verildiği anlamına gelir ve daha hızlı hız geçişlerine " +"neden olur.\n" "\n" "0 değeri özelliği devre dışı bırakır. \n" "\n" -"Yüksek hızlı, yüksek akışlı doğrudan tahrikli bir yazıcı için (Bambu lab veya Voron gibi) bu değer genellikle gerekli değildir. Ancak özellik hızlarının büyük ölçüde değiştiği bazı durumlarda marjinal bir fayda sağlayabilir. Örneğin, çıkıntılar nedeniyle agresif yavaşlamalar olduğunda. Bu durumlarda 300-350mm3/s2 civarında yüksek bir değer önerilir çünkü bu, basınç ilerlemesinin daha yumuşak bir akış geçişi elde etmesine yardımcı olmak için yeterli yumuşatmaya izin verir.\n" +"Yüksek hızlı, yüksek akışlı doğrudan tahrikli bir yazıcı için (Bambu lab " +"veya Voron gibi) bu değer genellikle gerekli değildir. Ancak özellik " +"hızlarının büyük ölçüde değiştiği bazı durumlarda marjinal bir fayda " +"sağlayabilir. Örneğin, çıkıntılar nedeniyle agresif yavaşlamalar olduğunda. " +"Bu durumlarda 300-350mm3/s2 civarında yüksek bir değer önerilir çünkü bu, " +"basınç ilerlemesinin daha yumuşak bir akış geçişi elde etmesine yardımcı " +"olmak için yeterli yumuşatmaya izin verir.\n" "\n" -"Basınç avansı olmayan daha yavaş yazıcılar için değer çok daha düşük ayarlanmalıdır. Doğrudan tahrikli ekstrüderler için 10-15mm3/s2 ve Bowden tarzı için 5-10mm3/s2 değeri iyi bir başlangıç noktasıdır. \n" +"Basınç avansı olmayan daha yavaş yazıcılar için değer çok daha düşük " +"ayarlanmalıdır. Doğrudan tahrikli ekstrüderler için 10-15mm3/s2 ve Bowden " +"tarzı için 5-10mm3/s2 değeri iyi bir başlangıç noktasıdır. \n" "\n" "Bu özellik Prusa slicer'da Basınç Dengeleyici olarak bilinir.\n" "\n" @@ -7906,29 +9273,46 @@ msgid "Smoothing segment length" msgstr "Segment uzunluğunu yumuşatma" msgid "" -"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" +"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" +"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" msgstr "" -"Daha düşük bir değer, daha yumuşak ekstrüzyon hızı geçişleriyle sonuçlanır. Ancak bu, önemli ölçüde daha büyük bir gcode dosyası ve yazıcının işlemesi için daha fazla talimatla sonuçlanır. \n" +"Daha düşük bir değer, daha yumuşak ekstrüzyon hızı geçişleriyle sonuçlanır. " +"Ancak bu, önemli ölçüde daha büyük bir gcode dosyası ve yazıcının işlemesi " +"için daha fazla talimatla sonuçlanır. \n" "\n" -"Varsayılan değer olan 3 çoğu durumda iyi çalışır. Yazıcınız takılıyorsa, yapılan ayarlamaların sayısını azaltmak için bu değeri artırın\n" +"Varsayılan değer olan 3 çoğu durumda iyi çalışır. Yazıcınız takılıyorsa, " +"yapılan ayarlamaların sayısını azaltmak için bu değeri artırın\n" "\n" "İzin verilen değerler: 1-5" msgid "Minimum speed for part cooling fan" msgstr "Parça soğutma fanı için minimum hız" -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 "Yardımcı parça soğutma fanının hızı. Yardımcı fan, soğutma katmanlarının bulunmadığı ilk birkaç katman dışında, yazdırma sırasında bu hızda çalışacaktır" +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 "" +"Yardımcı parça soğutma fanının hızı. Yardımcı fan, soğutma katmanlarının " +"bulunmadığı ilk birkaç katman dışında, yazdırma sırasında bu hızda " +"çalışacaktır" msgid "Min" msgstr "Min" -msgid "The lowest printable layer height for extruder. Used tp limits the minimum layer hight when enable adaptive layer height" -msgstr "Ekstruder için yazdırılabilir en düşük katman yüksekliği. Kullanılan tp, uyarlanabilir katman yüksekliğini etkinleştirirken minimum katman yüksekliğini sınırlar" +msgid "" +"The lowest printable layer height for extruder. Used tp limits the minimum " +"layer hight when enable adaptive layer height" +msgstr "" +"Ekstruder için yazdırılabilir en düşük katman yüksekliği. Kullanılan tp, " +"uyarlanabilir katman yüksekliğini etkinleştirirken minimum katman " +"yüksekliğini sınırlar" msgid "Min print speed" msgstr "Minimum baskı hızı" @@ -7945,14 +9329,22 @@ msgstr "Nozul çapı" msgid "Configuration notes" msgstr "Yapılandırma notları" -msgid "You can put here your personal notes. This text will be added to the G-code header comments." -msgstr "Buraya kişisel notlarınızı yazabilirsiniz. Bu not G-kodu başlık yorumlarına eklenecektir." +msgid "" +"You can put here your personal notes. This text will be added to the G-code " +"header comments." +msgstr "" +"Buraya kişisel notlarınızı yazabilirsiniz. Bu not G-kodu başlık yorumlarına " +"eklenecektir." msgid "Host Type" msgstr "Bağlantı Türü" -msgid "Slic3r can upload G-code files to a printer host. This field must contain the kind of the host." -msgstr "Slic3r, G kodu dosyalarını bir yazıcı ana bilgisayarına yükleyebilir. Bu alan ana bilgisayarın türünü içermelidir." +msgid "" +"Slic3r can upload G-code files to a printer host. This field must contain " +"the kind of the host." +msgstr "" +"Slic3r, G kodu dosyalarını bir yazıcı ana bilgisayarına yükleyebilir. Bu " +"alan ana bilgisayarın türünü içermelidir." msgid "Nozzle volume" msgstr "Nozul hacmi" @@ -7970,25 +9362,45 @@ msgid "Cooling tube length" msgstr "Soğutma borusu uzunluğu" msgid "Length of the cooling tube to limit space for cooling moves inside it." -msgstr "İçindeki soğutma hareketleri alanını sınırlamak üzere soğutma tüpünün uzunluğu." +msgstr "" +"İçindeki soğutma hareketleri alanını sınırlamak üzere soğutma tüpünün " +"uzunluğu." msgid "High extruder current on filament swap" msgstr "Filament değişiminde yüksek ekstruder akımı" -msgid "It may be beneficial to increase the extruder motor current during the filament exchange sequence to allow for rapid ramming feed rates and to overcome resistance when loading a filament with an ugly shaped tip." -msgstr "Hızlı sıkıştırma hızlarına izin vermek ve kötü kesilmiş bir filament yüklerken direncin üstesinden gelmek için filament değişim sırası sırasında ekstrüder motor akımını artırmak faydalı olabilir." +msgid "" +"It may be beneficial to increase the extruder motor current during the " +"filament exchange sequence to allow for rapid ramming feed rates and to " +"overcome resistance when loading a filament with an ugly shaped tip." +msgstr "" +"Hızlı sıkıştırma hızlarına izin vermek ve kötü kesilmiş bir filament " +"yüklerken direncin üstesinden gelmek için filament değişim sırası sırasında " +"ekstrüder motor akımını artırmak faydalı olabilir." msgid "Filament parking position" msgstr "Filament park konumu" -msgid "Distance of the extruder tip from the position where the filament is parked when unloaded. This should match the value in printer firmware." -msgstr "Ekstrüder ucunun, boşaltıldığında filamentin park edildiği konumdan uzaklığı. Bu ayar yazıcı ürün yazılımındaki değerle eşleşmelidir." +msgid "" +"Distance of the extruder tip from the position where the filament is parked " +"when unloaded. This should match the value in printer firmware." +msgstr "" +"Ekstrüder ucunun, boşaltıldığında filamentin park edildiği konumdan " +"uzaklığı. Bu ayar yazıcı ürün yazılımındaki değerle eşleşmelidir." msgid "Extra loading distance" msgstr "Ekstra yükleme mesafesi" -msgid "When set to zero, the distance the filament is moved from parking position during load is exactly the same as it was moved back during unload. When positive, it is loaded further, if negative, the loading move is shorter than unloading." -msgstr "Sıfır olarak ayarlandığında, yükleme sırasında filamentin park konumundan taşındığı mesafe, boşaltma sırasında geri taşındığı mesafe ile aynıdır. Pozitif olduğunda daha fazla yüklenir, negatif olduğunda yükleme hareketi boşaltmadan daha kısadır." +msgid "" +"When set to zero, the distance the filament is moved from parking position " +"during load is exactly the same as it was moved back during unload. When " +"positive, it is loaded further, if negative, the loading move is shorter " +"than unloading." +msgstr "" +"Sıfır olarak ayarlandığında, yükleme sırasında filamentin park konumundan " +"taşındığı mesafe, boşaltma sırasında geri taşındığı mesafe ile aynıdır. " +"Pozitif olduğunda daha fazla yüklenir, negatif olduğunda yükleme hareketi " +"boşaltmadan daha kısadır." msgid "Start end points" msgstr "Başlangıç bitiş noktaları" @@ -7999,8 +9411,15 @@ msgstr "Kesici bölgeden çöp kutusuna kadar olan başlangıç ve bitiş noktal msgid "Reduce infill retraction" msgstr "Dolguda geri çekmeyi azalt" -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 model and save printing time, but make slicing and G-code generating slower" -msgstr "Hareket kesinlikle dolgu alanına girdiğinde geri çekilmeyin. Bu, sızıntının görülemeyeceği anlamına gelir. Bu, karmaşık model için geri çekme sürelerini azaltabilir ve yazdırma süresinden tasarruf sağlayabilir, ancak dilimlemeyi ve G kodu oluşturmayı yavaşlatır" +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 " +"model and save printing time, but make slicing and G-code generating slower" +msgstr "" +"Hareket kesinlikle dolgu alanına girdiğinde geri çekilmeyin. Bu, sızıntının " +"görülemeyeceği anlamına gelir. Bu, karmaşık model için geri çekme sürelerini " +"azaltabilir ve yazdırma süresinden tasarruf sağlayabilir, ancak dilimlemeyi " +"ve G kodu oluşturmayı yavaşlatır" msgid "Enable" msgstr "Aktifle" @@ -8009,25 +9428,37 @@ msgid "Filename format" msgstr "Dosya adı formatı" msgid "User can self-define the project file name when export" -msgstr "Kullanıcı dışa aktarma sırasında proje dosyası adını kendisi tanımlayabilir" +msgstr "" +"Kullanıcı dışa aktarma sırasında proje dosyası adını kendisi tanımlayabilir" msgid "Make overhang printable" msgstr "Çıkıntılar yazdırılabilir" msgid "Modify the geometry to print overhangs without support material." -msgstr "Destek malzemesi olmadan çıkıntıları yazdırmak için geometriyi değiştirin." +msgstr "" +"Destek malzemesi olmadan çıkıntıları yazdırmak için geometriyi değiştirin." msgid "Make overhang printable maximum angle" msgstr "Maksimum yazdırılabilir açı" -msgid "Maximum angle of overhangs to allow after making more steep overhangs printable.90° will not change the model at all and allow any overhang, while 0 will replace all overhangs with conical material." -msgstr "Daha dik çıkıntıları yazdırılabilir hale getirdikten sonra izin verilen maksimum çıkıntı açısı. 90°, modeli hiçbir şekilde değiştirmez ve herhangi bir çıkıntıya izin vermez, 0 ise tüm çıkıntıları konik malzemeyle değiştirir." +msgid "" +"Maximum angle of overhangs to allow after making more steep overhangs " +"printable.90° will not change the model at all and allow any overhang, while " +"0 will replace all overhangs with conical material." +msgstr "" +"Daha dik çıkıntıları yazdırılabilir hale getirdikten sonra izin verilen " +"maksimum çıkıntı açısı. 90°, modeli hiçbir şekilde değiştirmez ve herhangi " +"bir çıkıntıya izin vermez, 0 ise tüm çıkıntıları konik malzemeyle değiştirir." msgid "Make overhang printable hole area" msgstr "Yazdırılabilir çıkıntı delik alanı oluşturun" -msgid "Maximum area of a hole in the base of the model before it's filled by conical material.A value of 0 will fill all the holes in the model base." -msgstr "Modelin tabanındaki bir deliğin, konik malzemeyle doldurulmadan önce maksimum alanı. 0 değeri, model tabanındaki tüm delikleri dolduracaktır." +msgid "" +"Maximum area of a hole in the base of the model before it's filled by " +"conical material.A value of 0 will fill all the holes in the model base." +msgstr "" +"Modelin tabanındaki bir deliğin, konik malzemeyle doldurulmadan önce " +"maksimum alanı. 0 değeri, model tabanındaki tüm delikleri dolduracaktır." msgid "mm²" msgstr "mm²" @@ -8036,11 +9467,19 @@ msgid "Detect overhang wall" msgstr "Çıkıntılı duvarı algıla" #, c-format, boost-format -msgid "Detect the overhang percentage relative to line width and use different speed to print. For 100%% overhang, bridge speed is used." -msgstr "Çizgi genişliğine göre çıkıntı yüzdesini tespit edin ve yazdırmak için farklı hızlar kullanın. %%100 çıkıntı için köprü hızı kullanılır." +msgid "" +"Detect the overhang percentage relative to line width and use different " +"speed to print. For 100%% overhang, bridge speed is used." +msgstr "" +"Çizgi genişliğine göre çıkıntı yüzdesini tespit edin ve yazdırmak için " +"farklı hızlar kullanın. %%100 çıkıntı için köprü hızı kullanılır." -msgid "Line width of inner wall. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "İç duvarın çizgi genişliği. % olarak ifade edilirse Nozul çapı üzerinden hesaplanacaktır." +msgid "" +"Line width of inner wall. If expressed as a %, it will be computed over the " +"nozzle diameter." +msgstr "" +"İç duvarın çizgi genişliği. % olarak ifade edilirse Nozul çapı üzerinden " +"hesaplanacaktır." msgid "Speed of inner wall" msgstr "İç duvarın hızı" @@ -8048,8 +9487,18 @@ msgstr "İç duvarın hızı" msgid "Number of walls of every layer" msgstr "Her katmanın duvar sayısı" -msgid "If you want to process the output G-code through custom scripts, just list their absolute paths here. Separate multiple scripts with a semicolon. Scripts will be passed the absolute path to the G-code file as the first argument, and they can access the Slic3r config settings by reading environment variables." -msgstr "Çıktı G-kodunu özel komut dosyaları aracılığıyla işlemek istiyorsanız, mutlak yollarını burada listeleyin. Birden fazla betiği noktalı virgülle ayırın. Betiklere ilk argüman olarak G-code dosyasının mutlak yolu aktarılır ve ortam değişkenlerini okuyarak Slic3r yapılandırma ayarlarına erişebilirler." +msgid "" +"If you want to process the output G-code through custom scripts, just list " +"their absolute paths here. Separate multiple scripts with a semicolon. " +"Scripts will be passed the absolute path to the G-code file as the first " +"argument, and they can access the Slic3r config settings by reading " +"environment variables." +msgstr "" +"Çıktı G-kodunu özel komut dosyaları aracılığıyla işlemek istiyorsanız, " +"mutlak yollarını burada listeleyin. Birden fazla betiği noktalı virgülle " +"ayırın. Betiklere ilk argüman olarak G-code dosyasının mutlak yolu aktarılır " +"ve ortam değişkenlerini okuyarak Slic3r yapılandırma ayarlarına " +"erişebilirler." msgid "Printer notes" msgstr "Yazıcı notları" @@ -8061,7 +9510,8 @@ msgid "Raft contact Z distance" msgstr "Raft kontak Z mesafesi" msgid "Z gap between object and raft. Ignored for soluble interface" -msgstr "Nesne ve raft arasındaki Z boşluğu. Çözünür arayüz için göz ardı edildi" +msgstr "" +"Nesne ve raft arasındaki Z boşluğu. Çözünür arayüz için göz ardı edildi" msgid "Raft expansion" msgstr "Raft genişletme" @@ -8079,28 +9529,46 @@ msgid "Initial layer expansion" msgstr "İlk katman genişletme" msgid "Expand the first raft or support layer to improve bed plate adhesion" -msgstr "Yatak plakası yapışmasını iyileştirmek için ilk raft veya destek katmanını genişletin" +msgstr "" +"Yatak plakası yapışmasını iyileştirmek için ilk raft veya destek katmanını " +"genişletin" msgid "Raft layers" msgstr "Raft katmanları" -msgid "Object will be raised by this number of support layers. Use this function to avoid wrapping when print ABS" -msgstr "Nesne bu sayıdaki destek katmanı tarafından yükseltilecektir. ABS yazdırırken sarmayı önlemek için bu işlevi kullanın" +msgid "" +"Object will be raised by this number of support layers. Use this function to " +"avoid wrapping when print ABS" +msgstr "" +"Nesne bu sayıdaki destek katmanı tarafından yükseltilecektir. ABS " +"yazdırırken sarmayı önlemek için bu işlevi kullanın" -msgid "G-code path is genereated after simplifing the contour of model to avoid too much points and gcode lines in gcode file. Smaller value means higher resolution and more time to slice" -msgstr "Gcode dosyasında çok fazla nokta ve gcode çizgisinin olmaması için modelin konturu basitleştirildikten sonra G-code yolu oluşturulur. Daha küçük değer, daha yüksek çözünürlük ve dilimleme için daha fazla zaman anlamına gelir" +msgid "" +"G-code path is genereated after simplifing the contour of model to avoid too " +"much points and gcode lines in gcode file. Smaller value means higher " +"resolution and more time to slice" +msgstr "" +"Gcode dosyasında çok fazla nokta ve gcode çizgisinin olmaması için modelin " +"konturu basitleştirildikten sonra G-code yolu oluşturulur. Daha küçük değer, " +"daha yüksek çözünürlük ve dilimleme için daha fazla zaman anlamına gelir" msgid "Travel distance threshold" msgstr "Seyahat mesafesi" -msgid "Only trigger retraction when the travel distance is longer than this threshold" -msgstr "Geri çekmeyi yalnızca hareket mesafesi bu eşikten daha uzun olduğunda tetikleyin" +msgid "" +"Only trigger retraction when the travel distance is longer than this " +"threshold" +msgstr "" +"Geri çekmeyi yalnızca hareket mesafesi bu eşikten daha uzun olduğunda " +"tetikleyin" msgid "Retract amount before wipe" msgstr "Temizleme işlemi öncesi geri çekme miktarı" -msgid "The length of fast retraction before wipe, relative to retraction length" -msgstr "Geri çekme uzunluğuna göre, temizlemeden önce hızlı geri çekilmenin uzunluğu" +msgid "" +"The length of fast retraction before wipe, relative to retraction length" +msgstr "" +"Geri çekme uzunluğuna göre, temizlemeden önce hızlı geri çekilmenin uzunluğu" msgid "Retract when change layer" msgstr "Katman değişiminde geri çek" @@ -8114,26 +9582,46 @@ msgstr "Uzunluk" msgid "Retraction Length" msgstr "Geri Çekme Uzunluğu" -msgid "Some amount of material in extruder is pulled back to avoid ooze during long travel. Set zero to disable retraction" -msgstr "Uzun seyahat sırasında sızıntıyı önlemek için ekstruderdeki malzemenin bir kısmı geri çekilir. Geri çekmeyi devre dışı bırakmak için sıfır ayarlayın" +msgid "" +"Some amount of material in extruder is pulled back to avoid ooze during long " +"travel. Set zero to disable retraction" +msgstr "" +"Uzun seyahat sırasında sızıntıyı önlemek için ekstruderdeki malzemenin bir " +"kısmı geri çekilir. Geri çekmeyi devre dışı bırakmak için sıfır ayarlayın" msgid "Z hop when retract" msgstr "Geri çekme esnasında Z sıçraması" -msgid "Whenever the retraction is done, the nozzle is lifted a little to create clearance between nozzle and the print. It prevents nozzle from hitting the print when travel move. Using spiral line to lift z can prevent stringing" -msgstr "Geri çekme işlemi her yapıldığında, nozul ile baskı arasında açıklık oluşturmak için nozul biraz kaldırılır. Hareket halindeyken nozülün baskıya çarpmasını önler. Z'yi kaldırmak için spiral çizgi kullanmak çekmeyi önleyebilir" +msgid "" +"Whenever the retraction is done, the nozzle is lifted a little to create " +"clearance between nozzle and the print. It prevents nozzle from hitting the " +"print when travel move. Using spiral line to lift z can prevent stringing" +msgstr "" +"Geri çekme işlemi her yapıldığında, nozul ile baskı arasında açıklık " +"oluşturmak için nozul biraz kaldırılır. Hareket halindeyken nozülün baskıya " +"çarpmasını önler. Z'yi kaldırmak için spiral çizgi kullanmak çekmeyi " +"önleyebilir" msgid "Z hop lower boundary" msgstr "Z sıçrama alt sınırı" -msgid "Z hop will only come into effect when Z is above this value and is below the parameter: \"Z hop upper boundary\"" -msgstr "Z sıçraması yalnızca Z bu değerin üzerinde ve parametrenin altında olduğunda devreye girer: \"Z sıçraması üst sınırı\"" +msgid "" +"Z hop will only come into effect when Z is above this value and is below the " +"parameter: \"Z hop upper boundary\"" +msgstr "" +"Z sıçraması yalnızca Z bu değerin üzerinde ve parametrenin altında olduğunda " +"devreye girer: \"Z sıçraması üst sınırı\"" msgid "Z hop upper boundary" msgstr "Z sıçrama üst sınırı" -msgid "If this value is positive, Z hop will only come into effect when Z is above the parameter: \"Z hop lower boundary\" and is below this value" -msgstr "Bu değer pozitifse, Z sıçraması yalnızca Z parametresinin üzerinde olduğunda etkinleşir: \"Z sıçrama alt sınırı\" parametresinin üzerinde ve bu değerin altında olduğunda" +msgid "" +"If this value is positive, Z hop will only come into effect when Z is above " +"the parameter: \"Z hop lower boundary\" and is below this value" +msgstr "" +"Bu değer pozitifse, Z sıçraması yalnızca Z parametresinin üzerinde olduğunda " +"etkinleşir: \"Z sıçrama alt sınırı\" parametresinin üzerinde ve bu değerin " +"altında olduğunda" msgid "Z hop type" msgstr "Z sıçraması türü" @@ -8147,20 +9635,32 @@ msgstr "Sarmal" msgid "Only lift Z above" msgstr "Z'yi sadece şu değerin üstündeki durumlarda kaldır" -msgid "If you set this to a positive value, Z lift will only take place above the specified absolute Z." -msgstr "Bunu pozitif bir değere ayarlarsanız Z kaldırması yalnızca belirtilen mutlak Z'nin üzerinde gerçekleşecektir." +msgid "" +"If you set this to a positive value, Z lift will only take place above the " +"specified absolute Z." +msgstr "" +"Bunu pozitif bir değere ayarlarsanız Z kaldırması yalnızca belirtilen mutlak " +"Z'nin üzerinde gerçekleşecektir." msgid "Only lift Z below" msgstr "Z'yi sadece şu değerin altındaki durumlarda kaldır" -msgid "If you set this to a positive value, Z lift will only take place below the specified absolute Z." -msgstr "Bunu pozitif bir değere ayarlarsanız, Z kaldırma işlemi yalnızca belirtilen mutlak Z değerinin altında gerçekleşir." +msgid "" +"If you set this to a positive value, Z lift will only take place below the " +"specified absolute Z." +msgstr "" +"Bunu pozitif bir değere ayarlarsanız, Z kaldırma işlemi yalnızca belirtilen " +"mutlak Z değerinin altında gerçekleşir." msgid "On surfaces" msgstr "Yüzeyler" -msgid "Enforce Z Hop behavior. This setting is impacted by the above settings (Only lift Z above/below)." -msgstr "Z Hop davranışını zorunlu kılın. Bu ayar yukarıdaki ayarlardan etkilenir (Z'yi yalnızca yukarıya/aşağıya kaldırın)." +msgid "" +"Enforce Z Hop behavior. This setting is impacted by the above settings (Only " +"lift Z above/below)." +msgstr "" +"Z Hop davranışını zorunlu kılın. Bu ayar yukarıdaki ayarlardan etkilenir " +"(Z'yi yalnızca yukarıya/aşağıya kaldırın)." msgid "All Surfaces" msgstr "Tüm Yüzeyler" @@ -8177,11 +9677,19 @@ msgstr "Üst ve alt" msgid "Extra length on restart" msgstr "Yeniden başlatma sırasında ekstra uzunluk" -msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed." -msgstr "İlerleme hareketinden sonra geri çekilme telafi edildiğinde, ekstruder bu ek filament miktarını itecektir. Bu ayara nadiren ihtiyaç duyulur." +msgid "" +"When the retraction is compensated after the travel move, the extruder will " +"push this additional amount of filament. This setting is rarely needed." +msgstr "" +"İlerleme hareketinden sonra geri çekilme telafi edildiğinde, ekstruder bu ek " +"filament miktarını itecektir. Bu ayara nadiren ihtiyaç duyulur." -msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament." -msgstr "Takım değiştirildikten sonra geri çekilme telafi edildiğinde, ekstruder bu ilave filament miktarını itecektir." +msgid "" +"When the retraction is compensated after changing tool, the extruder will " +"push this additional amount of filament." +msgstr "" +"Takım değiştirildikten sonra geri çekilme telafi edildiğinde, ekstruder bu " +"ilave filament miktarını itecektir." msgid "Retraction Speed" msgstr "Geri Çekme Hızı" @@ -8192,14 +9700,23 @@ msgstr "Geri çekme hızları" msgid "Deretraction Speed" msgstr "İleri itme Hızı" -msgid "Speed for reloading filament into extruder. Zero means same speed with retraction" -msgstr "Filamenti ekstrüdere yeniden yükleme hızı. Sıfır, geri çekilmeyle aynı hız anlamına gelir" +msgid "" +"Speed for reloading filament into extruder. Zero means same speed with " +"retraction" +msgstr "" +"Filamenti ekstrüdere yeniden yükleme hızı. Sıfır, geri çekilmeyle aynı hız " +"anlamına gelir" msgid "Use firmware retraction" msgstr "Yazılımsal geri çekme (firmware retraction)" -msgid "This experimental setting uses G10 and G11 commands to have the firmware handle the retraction. This is only supported in recent Marlin." -msgstr "Bu deneysel ayar, bellenimin geri çekme işlemini gerçekleştirmesini sağlamak için G10 ve G11 komutlarını kullanır. Bu yalnızca son Marlin'de desteklenmektedir." +msgid "" +"This experimental setting uses G10 and G11 commands to have the firmware " +"handle the retraction. This is only supported in recent Marlin." +msgstr "" +"Bu deneysel ayar, bellenimin geri çekme işlemini gerçekleştirmesini sağlamak " +"için G10 ve G11 komutlarını kullanır. Bu yalnızca son Marlin'de " +"desteklenmektedir." msgid "Show auto-calibration marks" msgstr "Otomatik kalibrasyon işaretlerini göster" @@ -8225,36 +9742,62 @@ msgstr "Rastgele" msgid "Staggered inner seams" msgstr "Kademeli iç dikişler" -msgid "This option causes the inner seams to be shifted backwards based on their depth, forming a zigzag pattern." -msgstr "Bu seçenek, iç dikişlerin derinliklerine göre geriye doğru kaydırılarak zikzak desen oluşturulmasına neden olur." +msgid "" +"This option causes the inner seams to be shifted backwards based on their " +"depth, forming a zigzag pattern." +msgstr "" +"Bu seçenek, iç dikişlerin derinliklerine göre geriye doğru kaydırılarak " +"zikzak desen oluşturulmasına neden olur." msgid "Seam gap" msgstr "Dikiş boşluğu" msgid "" -"In order to reduce the visibility of the seam in a closed loop extrusion, the loop is interrupted and shortened by a specified amount.\n" -"This amount can be specified in millimeters or as a percentage of the current extruder diameter. The default value for this parameter is 10%." +"In order to reduce the visibility of the seam in a closed loop extrusion, " +"the loop is interrupted and shortened by a specified amount.\n" +"This amount can be specified in millimeters or as a percentage of the " +"current extruder diameter. The default value for this parameter is 10%." msgstr "" -"Kapalı döngü ekstrüzyonda dikişin görünürlüğünü azaltmak için döngü kesintiye uğrar ve belirli bir miktarda kısaltılır.\n" -"Bu miktar milimetre cinsinden veya mevcut ekstruder çapının yüzdesi olarak belirtilebilir. Bu parametrenin varsayılan değeri %10'dur." +"Kapalı döngü ekstrüzyonda dikişin görünürlüğünü azaltmak için döngü " +"kesintiye uğrar ve belirli bir miktarda kısaltılır.\n" +"Bu miktar milimetre cinsinden veya mevcut ekstruder çapının yüzdesi olarak " +"belirtilebilir. Bu parametrenin varsayılan değeri %10'dur." msgid "Role base wipe speed" msgstr "Otomatik temizleme hızı" -msgid "The wipe speed is determined by the speed of the current extrusion role.e.g. if a wipe action is executed immediately following an outer wall extrusion, the speed of the outer wall extrusion will be utilized for the wipe action." -msgstr "Temizleme hızı mevcut ekstrüzyon rolünün hızına göre belirlenir; bir dış duvar ekstrüzyonunun hemen ardından bir silme eylemi yürütülürse, silme eylemi için dış duvar ekstrüzyonunun hızı kullanılacaktır." +msgid "" +"The wipe speed is determined by the speed of the current extrusion role.e.g. " +"if a wipe action is executed immediately following an outer wall extrusion, " +"the speed of the outer wall extrusion will be utilized for the wipe action." +msgstr "" +"Temizleme hızı mevcut ekstrüzyon rolünün hızına göre belirlenir; bir dış " +"duvar ekstrüzyonunun hemen ardından bir silme eylemi yürütülürse, silme " +"eylemi için dış duvar ekstrüzyonunun hızı kullanılacaktır." msgid "Wipe on loops" msgstr "Döngülerde Temizleme" -msgid "To minimize the visibility of the seam in a closed loop extrusion, a small inward movement is executed before the extruder leaves the loop." -msgstr "Kapalı döngü ekstrüzyonda dikişin görünürlüğünü en aza indirmek için, ekstrüder döngüden ayrılmadan önce içeriye doğru küçük bir hareket gerçekleştirilir." +msgid "" +"To minimize the visibility of the seam in a closed loop extrusion, a small " +"inward movement is executed before the extruder leaves the loop." +msgstr "" +"Kapalı döngü ekstrüzyonda dikişin görünürlüğünü en aza indirmek için, " +"ekstrüder döngüden ayrılmadan önce içeriye doğru küçük bir hareket " +"gerçekleştirilir." msgid "Wipe speed" msgstr "Temizleme hızı" -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 "Temizleme hızı, bu konfigürasyonda belirtilen hız ayarına göre belirlenir. Değer yüzde olarak ifade edilirse (örn. %80), yukarıdaki ilerleme hızı ayarına göre hesaplanır. Bu parametrenin varsayılan değeri %80'dir" +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 "" +"Temizleme hızı, bu konfigürasyonda belirtilen hız ayarına göre belirlenir. " +"Değer yüzde olarak ifade edilirse (örn. %80), yukarıdaki ilerleme hızı " +"ayarına göre hesaplanır. Bu parametrenin varsayılan değeri %80'dir" msgid "Skirt distance" msgstr "Etek mesafesi" @@ -8272,25 +9815,41 @@ msgid "Skirt loops" msgstr "Etek Sayısı" msgid "Number of loops for the skirt. Zero means disabling skirt" -msgstr "Etek için ilmek sayısı. Sıfır, eteği devre dışı bırakmak anlamına gelir" +msgstr "" +"Etek için ilmek sayısı. Sıfır, eteği devre dışı bırakmak anlamına gelir" msgid "Skirt speed" msgstr "Etek hızı" msgid "Speed of skirt, in mm/s. Zero means use default layer extrusion speed." -msgstr "Eteğin hızı, mm/s cinsinden. Sıfır, varsayılan katman ekstrüzyon hızının kullanılması anlamına gelir." +msgstr "" +"Eteğin hızı, mm/s cinsinden. Sıfır, varsayılan katman ekstrüzyon hızının " +"kullanılması anlamına gelir." -msgid "The printing speed in exported gcode will be slowed down, when the estimated layer time is shorter than this value, to get better cooling for these layers" -msgstr "Tahmini katman süresi bu değerden kısa olduğunda, bu katmanlar için daha iyi soğutma sağlamak amacıyla, dışa aktarılan gcode'daki yazdırma hızı yavaşlatılacaktır" +msgid "" +"The printing speed in exported gcode will be slowed down, when the estimated " +"layer time is shorter than this value, to get better cooling for these layers" +msgstr "" +"Tahmini katman süresi bu değerden kısa olduğunda, bu katmanlar için daha iyi " +"soğutma sağlamak amacıyla, dışa aktarılan gcode'daki yazdırma hızı " +"yavaşlatılacaktır" msgid "Minimum sparse infill threshold" msgstr "Minimum seyrek dolgu" -msgid "Sparse infill area which is smaller than threshold value is replaced by internal solid infill" -msgstr "Eşik değerinden küçük olan seyrek dolgu alanı, yerini iç katı dolguya bırakmıştır" +msgid "" +"Sparse infill area which is smaller than threshold value is replaced by " +"internal solid infill" +msgstr "" +"Eşik değerinden küçük olan seyrek dolgu alanı, yerini iç katı dolguya " +"bırakmıştır" -msgid "Line width of internal solid infill. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "İç katı dolgunun çizgi genişliği. % olarak ifade edilirse Nozul çapı üzerinden hesaplanacaktır." +msgid "" +"Line width of internal solid infill. If expressed as a %, it will be " +"computed over the nozzle diameter." +msgstr "" +"İç katı dolgunun çizgi genişliği. % olarak ifade edilirse Nozul çapı " +"üzerinden hesaplanacaktır." msgid "Speed of internal solid infill, not the top and bottom surface" msgstr "Üst ve alt yüzeyin değil, iç katı dolgunun hızı" @@ -8298,11 +9857,33 @@ msgstr "Üst ve alt yüzeyin değil, iç katı dolgunun hızı" msgid "Spiral vase" msgstr "Sarmal vazo" -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 generated model has no seam" -msgstr "Spiralleştirme, dış konturun z hareketlerini yumuşatır. Ve katı bir modeli, katı alt katmanlara sahip tek duvarlı bir baskıya dönüştürür. Oluşturulan son modelde dikiş yok" +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 " +"generated model has no seam" +msgstr "" +"Spiralleştirme, dış konturun z hareketlerini yumuşatır. Ve katı bir modeli, " +"katı alt katmanlara sahip tek duvarlı bir baskıya dönüştürür. Oluşturulan " +"son modelde dikiş yok" -msgid "If smooth or traditional mode is selected, a timelapse video will be generated for each print. After each layer is printed, a snapshot is taken with the chamber camera. All of these snapshots are composed into a timelapse video when printing completes. If smooth mode is selected, the toolhead will move to the excess chute after each layer is printed and then take a snapshot. Since the melt filament may leak from the nozzle during the process of taking a snapshot, prime tower is required for smooth mode to wipe nozzle." -msgstr "Düzgün veya geleneksel mod seçilirse her baskı için bir hızlandırılmış video oluşturulacaktır. Her katman basıldıktan sonra oda kamerasıyla anlık görüntü alınır. Bu anlık görüntülerin tümü, yazdırma tamamlandığında hızlandırılmış bir video halinde birleştirilir. Düzgün modu seçilirse, her katman yazdırıldıktan sonra araç kafası fazla kanala hareket edecek ve ardından bir anlık görüntü alacaktır. Anlık görüntü alma işlemi sırasında eriyen filament nozülden sızabileceğinden, nozulu silmek için düzgün modun kullanılması için prime tower gereklidir." +msgid "" +"If smooth or traditional mode is selected, a timelapse video will be " +"generated for each print. After each layer is printed, a snapshot is taken " +"with the chamber camera. All of these snapshots are composed into a " +"timelapse video when printing completes. If smooth mode is selected, the " +"toolhead will move to the excess chute after each layer is printed and then " +"take a snapshot. Since the melt filament may leak from the nozzle during the " +"process of taking a snapshot, prime tower is required for smooth mode to " +"wipe nozzle." +msgstr "" +"Düzgün veya geleneksel mod seçilirse her baskı için bir hızlandırılmış video " +"oluşturulacaktır. Her katman basıldıktan sonra oda kamerasıyla anlık görüntü " +"alınır. Bu anlık görüntülerin tümü, yazdırma tamamlandığında hızlandırılmış " +"bir video halinde birleştirilir. Düzgün modu seçilirse, her katman " +"yazdırıldıktan sonra araç kafası fazla kanala hareket edecek ve ardından bir " +"anlık görüntü alacaktır. Anlık görüntü alma işlemi sırasında eriyen filament " +"nozülden sızabileceğinden, nozulu silmek için düzgün modun kullanılması için " +"prime tower gereklidir." msgid "Traditional" msgstr "Geleneksel" @@ -8337,26 +9918,48 @@ msgstr "Filament sıkıştırmayı etkinleştir" msgid "No sparse layers (EXPERIMENTAL)" msgstr "Seyrek katman yok (DENEYSEL)" -msgid "If enabled, the wipe tower will not be printed on layers with no toolchanges. On layers with a toolchange, extruder will travel downward to print the wipe tower. User is responsible for ensuring there is no collision with the print." -msgstr "Etkinleştirilirse, silme kulesi araç değişimi olmayan katmanlarda yazdırılmayacaktır. Araç değişimi olan katmanlarda, ekstrüder silme kulesini yazdırmak için aşağı doğru hareket edecektir. Baskı ile çarpışma olmamasını sağlamak kullanıcının sorumluluğundadır." +msgid "" +"If enabled, the wipe tower will not be printed on layers with no " +"toolchanges. On layers with a toolchange, extruder will travel downward to " +"print the wipe tower. User is responsible for ensuring there is no collision " +"with the print." +msgstr "" +"Etkinleştirilirse, silme kulesi araç değişimi olmayan katmanlarda " +"yazdırılmayacaktır. Araç değişimi olan katmanlarda, ekstrüder silme kulesini " +"yazdırmak için aşağı doğru hareket edecektir. Baskı ile çarpışma olmamasını " +"sağlamak kullanıcının sorumluluğundadır." msgid "Prime all printing extruders" msgstr "Tüm ekstruderleri temizle" -msgid "If enabled, all printing extruders will be primed at the front edge of the print bed at the start of the print." -msgstr "Etkinleştirilirse, tüm baskı ekstrüderleri baskının başlangıcında baskı yatağının ön kenarında temizlenecektir." +msgid "" +"If enabled, all printing extruders will be primed at the front edge of the " +"print bed at the start of the print." +msgstr "" +"Etkinleştirilirse, tüm baskı ekstrüderleri baskının başlangıcında baskı " +"yatağının ön kenarında temizlenecektir." msgid "Slice gap closing radius" msgstr "Dilim aralığı kapanma yarıçapı" -msgid "Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low." -msgstr "Üçgen mesh dilimleme sırasında 2x boşluk kapatma yarıçapından küçük çatlaklar doldurulmaktadır. Boşluk kapatma işlemi son yazdırma çözünürlüğünü düşürebilir, bu nedenle değerin oldukça düşük tutulması tavsiye edilir." +msgid "" +"Cracks smaller than 2x gap closing radius are being filled during the " +"triangle mesh slicing. The gap closing operation may reduce the final print " +"resolution, therefore it is advisable to keep the value reasonably low." +msgstr "" +"Üçgen mesh dilimleme sırasında 2x boşluk kapatma yarıçapından küçük " +"çatlaklar doldurulmaktadır. Boşluk kapatma işlemi son yazdırma çözünürlüğünü " +"düşürebilir, bu nedenle değerin oldukça düşük tutulması tavsiye edilir." msgid "Slicing Mode" msgstr "Dilimleme Modu" -msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model." -msgstr "3DLabPrint uçak modelleri için \"Çift-tek\" seçeneğini kullanın. Modeldeki tüm delikleri kapatmak için \"Delikleri kapat\"ı kullanın." +msgid "" +"Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " +"close all holes in the model." +msgstr "" +"3DLabPrint uçak modelleri için \"Çift-tek\" seçeneğini kullanın. Modeldeki " +"tüm delikleri kapatmak için \"Delikleri kapat\"ı kullanın." msgid "Regular" msgstr "Düzenli" @@ -8373,8 +9976,14 @@ msgstr "Desteği etkinleştir" msgid "Enable support generation." msgstr "Destek oluşturmayı etkinleştir." -msgid "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 "desteği otomatik olarak oluşturmak için normal(otomatik) ve ağaç(otomatik) kullanılır. Normal(manuel) veya ağaç(manuel) seçilirse yalnızca destek uygulayıcıları oluşturulur" +msgid "" +"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 "" +"desteği otomatik olarak oluşturmak için normal(otomatik) ve ağaç(otomatik) " +"kullanılır. Normal(manuel) veya ağaç(manuel) seçilirse yalnızca destek " +"uygulayıcıları oluşturulur" msgid "normal(auto)" msgstr "normal(otomatik)" @@ -8409,8 +10018,12 @@ msgstr "Model yüzeyinde destek oluşturmayın, yalnızca baskı plakasında" msgid "Support critical regions only" msgstr "Yalnızca kritik bölgeleri destekleyin" -msgid "Only create support for critical regions including sharp tail, cantilever, etc." -msgstr "Yalnızca keskin kuyruk, konsol vb. gibi kritik bölgeler için destek oluşturun." +msgid "" +"Only create support for critical regions including sharp tail, cantilever, " +"etc." +msgstr "" +"Yalnızca keskin kuyruk, konsol vb. gibi kritik bölgeler için destek " +"oluşturun." msgid "Remove small overhangs" msgstr "Küçük çıkıntıları kaldır" @@ -8433,23 +10046,39 @@ msgstr "Alt destek arayüzü ile nesne arasındaki z boşluğu" msgid "Support/raft base" msgstr "Destek/raft tabanı" -msgid "Filament to print support base and raft. \"Default\" means no specific filament for support and current filament is used" -msgstr "Destek tabanını ve salı yazdırmak için filament. \"Varsayılan\", destek için belirli bir filamanın olmadığı ve mevcut filamanın kullanıldığı anlamına gelir" +msgid "" +"Filament to print support base and raft. \"Default\" means no specific " +"filament for support and current filament is used" +msgstr "" +"Destek tabanını ve salı yazdırmak için filament. \"Varsayılan\", destek için " +"belirli bir filamanın olmadığı ve mevcut filamanın kullanıldığı anlamına " +"gelir" -msgid "Line width of support. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Desteğin çizgi genişliği. % olarak ifade edilirse Nozul çapı üzerinden hesaplanacaktır." +msgid "" +"Line width of support. If expressed as a %, it will be computed over the " +"nozzle diameter." +msgstr "" +"Desteğin çizgi genişliği. % olarak ifade edilirse Nozul çapı üzerinden " +"hesaplanacaktır." msgid "Interface use loop pattern" msgstr "Arayüz kullanım döngüsü modeli" -msgid "Cover the top contact layer of the supports with loops. Disabled by default." -msgstr "Desteklerin üst temas katmanını ilmeklerle örtün. Varsayılan olarak devre dışıdır." +msgid "" +"Cover the top contact layer of the supports with loops. Disabled by default." +msgstr "" +"Desteklerin üst temas katmanını ilmeklerle örtün. Varsayılan olarak devre " +"dışıdır." msgid "Support/raft interface" msgstr "Destek/raft arayüzü" -msgid "Filament to print support interface. \"Default\" means no specific filament for support interface and current filament is used" -msgstr "Filament baskı desteği arayüzü. \"Varsayılan\", destek arayüzü için özel bir filamanın olmadığı ve mevcut filamanın kullanıldığı anlamına gelir" +msgid "" +"Filament to print support interface. \"Default\" means no specific filament " +"for support interface and current filament is used" +msgstr "" +"Filament baskı desteği arayüzü. \"Varsayılan\", destek arayüzü için özel bir " +"filamanın olmadığı ve mevcut filamanın kullanıldığı anlamına gelir" msgid "Top interface layers" msgstr "Üst arayüz katmanları" @@ -8490,8 +10119,14 @@ msgstr "Oyuk" msgid "Interface pattern" msgstr "Arayüz deseni" -msgid "Line pattern of support interface. Default pattern for non-soluble support interface is Rectilinear, while default pattern for soluble support interface is Concentric" -msgstr "Destek arayüzünün çizgi deseni. Çözünmeyen destek arayüzü için varsayılan model Doğrusaldır, çözünebilir destek arayüzü için varsayılan model ise Eşmerkezlidir" +msgid "" +"Line pattern of support interface. Default pattern for non-soluble support " +"interface is Rectilinear, while default pattern for soluble support " +"interface is Concentric" +msgstr "" +"Destek arayüzünün çizgi deseni. Çözünmeyen destek arayüzü için varsayılan " +"model Doğrusaldır, çözünebilir destek arayüzü için varsayılan model ise " +"Eşmerkezlidir" msgid "Rectilinear Interlaced" msgstr "Doğrusal Taramalı" @@ -8512,11 +10147,14 @@ msgid "Speed of support" msgstr "Destek hızı" msgid "" -"Style and shape of the support. For normal support, projecting the supports into a regular grid will create more stable supports (default), while snug support towers will save material and reduce object scarring.\n" -"For tree support, slim style will merge branches more aggressively and save a lot of material (default), while hybrid style will create similar structure to normal support under large flat overhangs." +"Style and shape of the support. For normal support, projecting the supports " +"into a regular grid will create more stable supports (default), while snug " +"support towers will save material and reduce object scarring.\n" +"For tree support, slim and organic style will merge branches more " +"aggressively and save a lot of material (default organic), while hybrid " +"style will create similar structure to normal support under large flat " +"overhangs." msgstr "" -"Desteğin stili ve şekli. Normal destek için, desteklerin düzenli bir ızgaraya yansıtılması daha sağlam destekler oluşturur (varsayılan), rahat destek kuleleri ise malzemeden tasarruf sağlar ve nesne izlerini azaltır.\n" -"Ağaç desteği için, ince stil, dalları daha agresif bir şekilde birleştirecek ve çok fazla malzeme tasarrufu sağlayacak (varsayılan), hibrit stil ise büyük düz çıkıntılar altında normal desteğe benzer yapı oluşturacaktır." msgid "Snug" msgstr "Snug" @@ -8536,52 +10174,92 @@ msgstr "Organik" msgid "Independent support layer height" msgstr "Bağımsız destek katmanı yüksekliği" -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 "Destek katmanı, nesne katmanından bağımsız olarak katman yüksekliğini kullanır. Bu, z aralığının özelleştirilmesine destek olmak ve yazdırma süresinden tasarruf etmek içindir. Prime tower etkinleştirildiğinde bu seçenek geçersiz olacaktır." +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 "" +"Destek katmanı, nesne katmanından bağımsız olarak katman yüksekliğini " +"kullanır. Bu, z aralığının özelleştirilmesine destek olmak ve yazdırma " +"süresinden tasarruf etmek içindir. Prime tower etkinleştirildiğinde bu " +"seçenek geçersiz olacaktır." msgid "Threshold angle" msgstr "Destek açısı" -msgid "Support will be generated for overhangs whose slope angle is below the threshold." +msgid "" +"Support will be generated for overhangs whose slope angle is below the " +"threshold." msgstr "Eğim açısı eşiğin altında olan çıkmalar için destek oluşturulacaktır." msgid "Tree support branch angle" msgstr "Ağaç desteği dal açısı" -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 "Bu ayar, ağaç desteğinin dallarının oluşmasına izin verilen maksimum çıkıntı açısını belirler. Açı artırılırsa, dallar daha yatay olarak basılabilir ve daha uzağa ulaşır." +msgid "" +"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 "" +"Bu ayar, ağaç desteğinin dallarının oluşmasına izin verilen maksimum çıkıntı " +"açısını belirler. Açı artırılırsa, dallar daha yatay olarak basılabilir ve " +"daha uzağa ulaşır." msgid "Preferred Branch Angle" msgstr "Tercih Edilen Dal Açısı" #. TRN PrintSettings: "Organic supports" > "Preferred Branch Angle" -msgid "The preferred angle of the branches, when they do not have to avoid the model. Use a lower angle to make them more vertical and more stable. Use a higher angle for branches to merge faster." -msgstr "Modelden kaçınmak zorunda olmadıklarında dalların tercih edilen açısı. Daha dikey ve daha dengeli olmaları için daha düşük bir açı kullanın. Dalların daha hızlı birleşmesi için daha yüksek bir açı kullanın." +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 "" +"Modelden kaçınmak zorunda olmadıklarında dalların tercih edilen açısı. Daha " +"dikey ve daha dengeli olmaları için daha düşük bir açı kullanın. Dalların " +"daha hızlı birleşmesi için daha yüksek bir açı kullanın." msgid "Tree support branch distance" msgstr "Ağaç destek dal mesafesi" -msgid "This setting determines the distance between neighboring tree support nodes." +msgid "" +"This setting determines the distance between neighboring tree support nodes." msgstr "Bu ayar, komşu ağaç destek düğümleri arasındaki mesafeyi belirler." msgid "Branch Density" msgstr "Dal Yoğunluğu" #. TRN PrintSettings: "Organic supports" > "Branch Density" -msgid "Adjusts the density of the support structure used to generate the tips of the branches. A higher value results in better overhangs but the supports are harder to remove, thus it is recommended to enable top support interfaces instead of a high branch density value if dense interfaces are needed." -msgstr "Dalların uçlarını oluşturmak için kullanılan destek yapısının yoğunluğunu ayarlar. Daha yüksek bir değer daha iyi çıkıntılarla sonuçlanır, ancak desteklerin çıkarılması daha zordur, bu nedenle yoğun arayüzler gerekiyorsa yüksek bir dal yoğunluğu değeri yerine üst destek arayüzlerinin etkinleştirilmesi önerilir." +msgid "" +"Adjusts the density of the support structure used to generate the tips of " +"the branches. A higher value results in better overhangs but the supports " +"are harder to remove, thus it is recommended to enable top support " +"interfaces instead of a high branch density value if dense interfaces are " +"needed." +msgstr "" +"Dalların uçlarını oluşturmak için kullanılan destek yapısının yoğunluğunu " +"ayarlar. Daha yüksek bir değer daha iyi çıkıntılarla sonuçlanır, ancak " +"desteklerin çıkarılması daha zordur, bu nedenle yoğun arayüzler gerekiyorsa " +"yüksek bir dal yoğunluğu değeri yerine üst destek arayüzlerinin " +"etkinleştirilmesi önerilir." msgid "Adaptive layer height" msgstr "Uyarlanabilir katman yüksekliği" -msgid "Enabling this option means the height of tree support layer except the first will be automatically calculated " -msgstr "Bu seçeneğin etkinleştirilmesi, ilki hariç ağaç destek katmanının yüksekliğinin otomatik olarak hesaplanacağı anlamına gelir " +msgid "" +"Enabling this option means the height of tree support layer except the " +"first will be automatically calculated " +msgstr "" +"Bu seçeneğin etkinleştirilmesi, ilki hariç ağaç destek katmanının " +"yüksekliğinin otomatik olarak hesaplanacağı anlamına gelir " msgid "Auto brim width" msgstr "Otomatik kenar genişliği" -msgid "Enabling this option means the width of the brim for tree support will be automatically calculated" -msgstr "Bu seçeneğin etkinleştirilmesi, ağaç desteğinin kenar genişliğinin otomatik olarak hesaplanacağı anlamına gelir" +msgid "" +"Enabling this option means the width of the brim for tree support will be " +"automatically calculated" +msgstr "" +"Bu seçeneğin etkinleştirilmesi, ağaç desteğinin kenar genişliğinin otomatik " +"olarak hesaplanacağı anlamına gelir" msgid "Tree support brim width" msgstr "Ağaç desteği kenar genişliği" @@ -8607,15 +10285,28 @@ msgid "Branch Diameter Angle" msgstr "Dal Çapı Açısı" #. TRN PrintSettings: "Organic supports" > "Branch Diameter Angle" -msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the organic support." -msgstr "Aşağıya doğru giderek kalınlaşan dalların çapının açısı. Açının 0 olması, dalların uzunlukları boyunca eşit kalınlığa sahip olmasına neden olacaktır. Birazcık açı organik desteğin stabilitesini artırabilir." +msgid "" +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the organic " +"support." +msgstr "" +"Aşağıya doğru giderek kalınlaşan dalların çapının açısı. Açının 0 olması, " +"dalların uzunlukları boyunca eşit kalınlığa sahip olmasına neden olacaktır. " +"Birazcık açı organik desteğin stabilitesini artırabilir." msgid "Branch Diameter with double walls" msgstr "Çift duvarlı dal çapı" #. TRN PrintSettings: "Organic supports" > "Branch Diameter" -msgid "Branches with area larger than the area of a circle of this diameter will be printed with double walls for stability. Set this value to zero for no double walls." -msgstr "Bu çaptaki bir dairenin alanından daha büyük alana sahip dallar, stabilite için çift duvarlı olarak basılacaktır. Çift duvar olmaması için bu değeri sıfır olarak ayarlayın." +msgid "" +"Branches with area larger than the area of a circle of this diameter will be " +"printed with double walls for stability. Set this value to zero for no " +"double walls." +msgstr "" +"Bu çaptaki bir dairenin alanından daha büyük alana sahip dallar, stabilite " +"için çift duvarlı olarak basılacaktır. Çift duvar olmaması için bu değeri " +"sıfır olarak ayarlayın." msgid "Tree support wall loops" msgstr "Ağaç desteği duvar döngüleri" @@ -8626,14 +10317,32 @@ msgstr "Bu ayar, ağaç desteğinin etrafındaki duvarların sayısını belirti msgid "Tree support with infill" msgstr "Dolgulu ağaç desteği" -msgid "This setting specifies whether to add infill inside large hollows of tree support" -msgstr "Bu ayar, ağaç desteğinin büyük oyuklarının içine dolgu eklenip eklenmeyeceğini belirtir" +msgid "" +"This setting specifies whether to add infill inside large hollows of tree " +"support" +msgstr "" +"Bu ayar, ağaç desteğinin büyük oyuklarının içine dolgu eklenip " +"eklenmeyeceğini belirtir" msgid "Chamber temperature" msgstr "Bölme sıcaklığı" -msgid "Higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength for high temperature materials like ABS, ASA, PC, PA and so on.At the same time, the air filtration of ABS and ASA will get worse.While for PLA, PETG, TPU, PVA and other low temperature materials,the actual chamber temperature should not be high to avoid cloggings, so 0 which stands for turning off is highly recommended" -msgstr "Daha yüksek hazne sıcaklığı, eğrilmeyi bastırmaya veya azaltmaya yardımcı olabilir ve ABS, ASA, PC, PA ve benzeri gibi yüksek sıcaklıktaki malzemeler için potansiyel olarak daha yüksek ara katman yapışmasına yol açabilir Aynı zamanda, ABS ve ASA'nın hava filtrasyonu daha da kötüleşecektir. PLA, PETG, TPU, PVA ve diğer düşük sıcaklıktaki malzemeler için, tıkanmaları önlemek için gerçek hazne sıcaklığı yüksek olmamalıdır, bu nedenle kapatma anlamına gelen 0 şiddetle tavsiye edilir" +msgid "" +"Higher chamber temperature can help suppress or reduce warping and " +"potentially lead to higher interlayer bonding strength for high temperature " +"materials like ABS, ASA, PC, PA and so on.At the same time, the air " +"filtration of ABS and ASA will get worse.While for PLA, PETG, TPU, PVA and " +"other low temperature materials,the actual chamber temperature should not be " +"high to avoid cloggings, so 0 which stands for turning off is highly " +"recommended" +msgstr "" +"Daha yüksek hazne sıcaklığı, eğrilmeyi bastırmaya veya azaltmaya yardımcı " +"olabilir ve ABS, ASA, PC, PA ve benzeri gibi yüksek sıcaklıktaki malzemeler " +"için potansiyel olarak daha yüksek ara katman yapışmasına yol açabilir Aynı " +"zamanda, ABS ve ASA'nın hava filtrasyonu daha da kötüleşecektir. PLA, PETG, " +"TPU, PVA ve diğer düşük sıcaklıktaki malzemeler için, tıkanmaları önlemek " +"için gerçek hazne sıcaklığı yüksek olmamalıdır, bu nedenle kapatma anlamına " +"gelen 0 şiddetle tavsiye edilir" msgid "Nozzle temperature for layers after the initial one" msgstr "İlk katmandan sonraki katmanlar için nozül sıcaklığı" @@ -8641,14 +10350,26 @@ msgstr "İlk katmandan sonraki katmanlar için nozül sıcaklığı" msgid "Detect thin wall" msgstr "İnce duvarı algıla" -msgid "Detect thin wall which can't contain two line width. And use single line to print. Maybe printed not very well, because it's not closed loop" -msgstr "İki çizgi genişliğini içeremeyen ince duvarı tespit edin. Ve yazdırmak için tek satır kullanın. Kapalı döngü olmadığından pek iyi basılmamış olabilir" +msgid "" +"Detect thin wall which can't contain two line width. And use single line to " +"print. Maybe printed not very well, because it's not closed loop" +msgstr "" +"İki çizgi genişliğini içeremeyen ince duvarı tespit edin. Ve yazdırmak için " +"tek satır kullanın. Kapalı döngü olmadığından pek iyi basılmamış olabilir" -msgid "This gcode is inserted when change filament, including T command to trigger tool change" -msgstr "Bu gcode, takım değişimini tetiklemek için T komutu da dahil olmak üzere filament değiştirildiğinde eklenir" +msgid "" +"This gcode is inserted when change filament, including T command to trigger " +"tool change" +msgstr "" +"Bu gcode, takım değişimini tetiklemek için T komutu da dahil olmak üzere " +"filament değiştirildiğinde eklenir" -msgid "Line width for top surfaces. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Üst yüzeyler için çizgi genişliği. % olarak ifade edilirse Nozul çapı üzerinden hesaplanacaktır." +msgid "" +"Line width for top surfaces. If expressed as a %, it will be computed over " +"the nozzle diameter." +msgstr "" +"Üst yüzeyler için çizgi genişliği. % olarak ifade edilirse Nozul çapı " +"üzerinden hesaplanacaktır." msgid "Speed of top surface infill which is solid" msgstr "Sağlam üst yüzey dolgusunun hızı" @@ -8656,8 +10377,14 @@ msgstr "Sağlam üst yüzey dolgusunun hızı" msgid "Top shell layers" msgstr "Üst katmanlar" -msgid "This is the number of solid layers of top shell, including the top surface layer. When the thickness calculated by this value is thinner than top shell thickness, the top shell layers will be increased" -msgstr "Bu, üst yüzey katmanı da dahil olmak üzere üst kabuğun katı katmanlarının sayısıdır. Bu değerle hesaplanan kalınlık üst kabuk kalınlığından ince olduğunda üst kabuk katmanları artırılacaktır" +msgid "" +"This is the number of solid layers of top shell, including the top surface " +"layer. When the thickness calculated by this value is thinner than top shell " +"thickness, the top shell layers will be increased" +msgstr "" +"Bu, üst yüzey katmanı da dahil olmak üzere üst kabuğun katı katmanlarının " +"sayısıdır. Bu değerle hesaplanan kalınlık üst kabuk kalınlığından ince " +"olduğunda üst kabuk katmanları artırılacaktır" msgid "Top solid layers" msgstr "Üst katı katmanlar" @@ -8665,8 +10392,18 @@ msgstr "Üst katı katmanlar" msgid "Top shell thickness" msgstr "Üst katman kalınlığı" -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 having too thin shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is absolutely determained by top shell layers" -msgstr "Üst kabuk katmanları tarafından hesaplanan kalınlık bu değerden daha ince ise dilimleme sırasında üst katı katmanların sayısı artırılır. Bu, katman yüksekliği küçük olduğunda kabuğun çok ince olmasını önleyebilir. 0, bu ayarın devre dışı olduğu ve üst kabuğun kalınlığının kesinlikle üst kabuk katmanları tarafından belirlendiği anlamına gelir" +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 " +"having too thin shell when layer height is small. 0 means that this setting " +"is disabled and thickness of top shell is absolutely determained by top " +"shell layers" +msgstr "" +"Üst kabuk katmanları tarafından hesaplanan kalınlık bu değerden daha ince " +"ise dilimleme sırasında üst katı katmanların sayısı artırılır. Bu, katman " +"yüksekliği küçük olduğunda kabuğun çok ince olmasını önleyebilir. 0, bu " +"ayarın devre dışı olduğu ve üst kabuğun kalınlığının kesinlikle üst kabuk " +"katmanları tarafından belirlendiği anlamına gelir" msgid "Speed of travel which is faster and without extrusion" msgstr "Daha hızlı ve ekstrüzyonsuz seyahat hızı" @@ -8674,17 +10411,31 @@ msgstr "Daha hızlı ve ekstrüzyonsuz seyahat hızı" msgid "Wipe while retracting" msgstr "Geri çekme esnasında temizlik" -msgid "Move nozzle along the last extrusion path when retracting to clean leaked material on nozzle. This can minimize blob when print new part after travel" -msgstr "Nozul üzerinde sızan malzemeyi temizlemek için geri çekerken Nozulu son ekstrüzyon yolu boyunca hareket ettirin. Bu işlem yeni parça yazdırırken damlamayı en aza indirebilir" +msgid "" +"Move nozzle along the last extrusion path when retracting to clean leaked " +"material on nozzle. This can minimize blob when print new part after travel" +msgstr "" +"Nozul üzerinde sızan malzemeyi temizlemek için geri çekerken Nozulu son " +"ekstrüzyon yolu boyunca hareket ettirin. Bu işlem yeni parça yazdırırken " +"damlamayı en aza indirebilir" msgid "Wipe Distance" msgstr "Temizleme Mesafesi" -msgid "Discribe how long the nozzle will move along the last path when retracting" -msgstr "Geri çekme esnasında nozulun son hat boyunca ne kadar süre hareket edeceğini belirtin" +msgid "" +"Discribe how long the nozzle will move along the last path when retracting" +msgstr "" +"Geri çekme esnasında nozulun son hat boyunca ne kadar süre hareket edeceğini " +"belirtin" -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 "Temizleme kulesi, nesneleri yazdırırken görünüm kusurlarını önlemek amacıyla nozul üzerindeki kalıntıları temizlemek ve nozul içindeki oda basıncını dengelemek için kullanılabilir." +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 "" +"Temizleme kulesi, nesneleri yazdırırken görünüm kusurlarını önlemek amacıyla " +"nozul üzerindeki kalıntıları temizlemek ve nozul içindeki oda basıncını " +"dengelemek için kullanılabilir." msgid "Purging volumes" msgstr "Hacimlerin temizlenmesi" @@ -8692,8 +10443,12 @@ msgstr "Hacimlerin temizlenmesi" msgid "Flush multiplier" msgstr "Temizleme çarpanı" -msgid "The actual flushing volumes is equal to the flush multiplier multiplied by the flushing volumes in the table." -msgstr "Gerçek temizleme hacimleri, tablodaki temizleme hacimleri ile temizleme çarpanının çarpımına eşittir." +msgid "" +"The actual flushing volumes is equal to the flush multiplier multiplied by " +"the flushing volumes in the table." +msgstr "" +"Gerçek temizleme hacimleri, tablodaki temizleme hacimleri ile temizleme " +"çarpanının çarpımına eşittir." msgid "Prime volume" msgstr "Ana hacim" @@ -8716,8 +10471,12 @@ msgstr "X eksenine göre silme kulesi dönüş açısı." msgid "Stabilization cone apex angle" msgstr "Stabilizasyon konisi tepe açısı" -msgid "Angle at the apex of the cone that is used to stabilize the wipe tower. Larger angle means wider base." -msgstr "Silme kulesini stabilize etmek için kullanılan koninin tepe noktasındaki açı. Daha büyük açı daha geniş taban anlamına gelir." +msgid "" +"Angle at the apex of the cone that is used to stabilize the wipe tower. " +"Larger angle means wider base." +msgstr "" +"Silme kulesini stabilize etmek için kullanılan koninin tepe noktasındaki " +"açı. Daha büyük açı daha geniş taban anlamına gelir." msgid "Wipe tower purge lines spacing" msgstr "Silme kulesi temizleme hatları aralığı" @@ -8728,56 +10487,152 @@ msgstr "Silme kulesindeki boşaltma hatlarının aralığı." msgid "Wipe tower extruder" msgstr "Silme kulesi ekstrüderi" -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 "Silme kulesinin çevresini yazdırırken kullanılacak ekstrüder. Mevcut olanı kullanmak için 0 olarak ayarlayın (çözünmeyen tercih edilir)." +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 "" +"Silme kulesinin çevresini yazdırırken kullanılacak ekstrüder. Mevcut olanı " +"kullanmak için 0 olarak ayarlayın (çözünmeyen tercih edilir)." msgid "Purging volumes - load/unload volumes" msgstr "Hacimleri temizleme - hacimleri yükleme/boşaltma" -msgid "This vector saves required volumes to change from/to each tool used on the wipe tower. These values are used to simplify creation of the full purging volumes below." -msgstr "Bu vektör, silme kulesinde kullanılan her bir araçtan/araca geçiş için gerekli hacimleri kaydeder. Bu değerler, aşağıdaki tam temizleme hacimlerinin oluşturulmasını basitleştirmek için kullanılır." +msgid "" +"This vector saves required volumes to change from/to each tool used on the " +"wipe tower. These values are used to simplify creation of the full purging " +"volumes below." +msgstr "" +"Bu vektör, silme kulesinde kullanılan her bir araçtan/araca geçiş için " +"gerekli hacimleri kaydeder. Bu değerler, aşağıdaki tam temizleme " +"hacimlerinin oluşturulmasını basitleştirmek için kullanılır." -msgid "Purging after filament change will be done inside objects' infills. This may lower the amount of waste and decrease the print time. If the walls are printed with transparent filament, the mixed color infill will be seen outside. It will not take effect, unless the prime tower is enabled." -msgstr "Filament değişiminden sonra temizleme, nesnelerin dolgularının içinde yapılacaktır. Bu, atık miktarını azaltabilir ve baskı süresini kısaltabilir. Duvarlar şeffaf filament ile basılmışsa, karışık renkli dolgu dışarıda görülecektir. Ana kule etkinleştirilmediği sürece etkili olmayacaktır." +msgid "" +"Purging after filament change will be done inside objects' infills. This may " +"lower the amount of waste and decrease the print time. If the walls are " +"printed with transparent filament, the mixed color infill will be seen " +"outside. It will not take effect, unless the prime tower is enabled." +msgstr "" +"Filament değişiminden sonra temizleme, nesnelerin dolgularının içinde " +"yapılacaktır. Bu, atık miktarını azaltabilir ve baskı süresini kısaltabilir. " +"Duvarlar şeffaf filament ile basılmışsa, karışık renkli dolgu dışarıda " +"görülecektir. Ana kule etkinleştirilmediği sürece etkili olmayacaktır." -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 "Filament değişiminden sonra temizleme, nesnelerin desteğinin içinde yapılacaktır. Bu, atık miktarını azaltabilir ve baskı süresini kısaltabilir. Prime tower etkinleştirilmediği sürece etkili olmayacaktır." +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 "" +"Filament değişiminden sonra temizleme, nesnelerin desteğinin içinde " +"yapılacaktır. Bu, atık miktarını azaltabilir ve baskı süresini kısaltabilir. " +"Prime tower etkinleştirilmediği sürece etkili olmayacaktır." -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 "Bu nesne, filamentten tasarruf etmek ve baskı süresini azaltmak için filament değişiminden sonra nozulu temizlemek için kullanılacaktır. Sonuç olarak nesnelerin renkleri karıştırılacaktır. Prime tower etkinleştirilmediği sürece etkili olmayacaktır." +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 "" +"Bu nesne, filamentten tasarruf etmek ve baskı süresini azaltmak için " +"filament değişiminden sonra nozulu temizlemek için kullanılacaktır. Sonuç " +"olarak nesnelerin renkleri karıştırılacaktır. Prime tower " +"etkinleştirilmediği sürece etkili olmayacaktır." msgid "Maximal bridging distance" msgstr "Maksimum köprüleme mesafesi" msgid "Maximal distance between supports on sparse infill sections." -msgstr "Bu nesne, filamentten tasarruf etmek ve baskı süresini azaltmak için bir filament değişiminden sonra nozülü temizlemek için kullanılacaktır. Sonuç olarak nesnelerin renkleri karıştırılacaktır. Prime tower etkinleştirilmediği sürece etkili olmayacaktır." +msgstr "" +"Bu nesne, filamentten tasarruf etmek ve baskı süresini azaltmak için bir " +"filament değişiminden sonra nozülü temizlemek için kullanılacaktır. Sonuç " +"olarak nesnelerin renkleri karıştırılacaktır. Prime tower " +"etkinleştirilmediği sürece etkili olmayacaktır." msgid "X-Y hole compensation" msgstr "X-Y delik dengeleme" -msgid "Holes of object will be grown or shrunk in XY plane by the configured value. Positive value makes holes bigger. Negative value makes holes smaller. This function is used to adjust size slightly when the object has assembling issue" -msgstr "Nesnenin delikleri XY düzleminde yapılandırılan değer kadar büyütülür veya küçültülür. Pozitif değer delikleri büyütür. Negatif değer delikleri küçültür. Bu fonksiyon, nesnenin montaj sorunu olduğunda boyutu hafifçe ayarlamak için kullanılır" +msgid "" +"Holes of object will be grown or shrunk in XY plane by the configured value. " +"Positive value makes holes bigger. Negative value makes holes smaller. This " +"function is used to adjust size slightly when the object has assembling issue" +msgstr "" +"Nesnenin delikleri XY düzleminde yapılandırılan değer kadar büyütülür veya " +"küçültülür. Pozitif değer delikleri büyütür. Negatif değer delikleri " +"küçültür. Bu fonksiyon, nesnenin montaj sorunu olduğunda boyutu hafifçe " +"ayarlamak için kullanılır" msgid "X-Y contour compensation" msgstr "X-Y kontur telafisi" -msgid "Contour of object will be grown or shrunk in XY plane by the configured value. Positive value makes contour bigger. Negative value makes contour smaller. This function is used to adjust size slightly when the object has assembling issue" -msgstr "Nesnenin konturu XY düzleminde yapılandırılan değer kadar büyütülür veya küçültülür. Pozitif değer konturu büyütür. Negatif değer konturu küçültür. Bu fonksiyon, nesnenin montaj sorunu olduğunda boyutu hafifçe ayarlamak için kullanılır" +msgid "" +"Contour of object will be grown or shrunk in XY plane by the configured " +"value. Positive value makes contour bigger. Negative value makes contour " +"smaller. This function is used to adjust size slightly when the object has " +"assembling issue" +msgstr "" +"Nesnenin konturu XY düzleminde yapılandırılan değer kadar büyütülür veya " +"küçültülür. Pozitif değer konturu büyütür. Negatif değer konturu küçültür. " +"Bu fonksiyon, nesnenin montaj sorunu olduğunda boyutu hafifçe ayarlamak için " +"kullanılır" + +msgid "Convert holes to polyholes" +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 " +"compute the polyhole.\n" +"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" +msgstr "" + +msgid "Polyhole detection margin" +msgstr "" + +#, c-format, boost-format +msgid "" +"Maximum defection of a point to the estimated radius of the circle.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" +"In mm or in % of the radius." +msgstr "" + +msgid "Polyhole twist" +msgstr "" + +msgid "Rotate the polyhole every layer." +msgstr "" msgid "G-code thumbnails" msgstr "G-kodu küçük resimleri" -msgid "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the following format: \"XxY, XxY, ...\"" -msgstr "Resim boyutları aşağıdaki formatta bir .gcode ve .sl1 / .sl1s dosyalarında saklanacaktır: \"XxY, XxY, ...\"" +msgid "" +"Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " +"following format: \"XxY, XxY, ...\"" +msgstr "" +"Resim boyutları aşağıdaki formatta bir .gcode ve .sl1 / .sl1s dosyalarında " +"saklanacaktır: \"XxY, XxY, ...\"" msgid "Use relative E distances" msgstr "Göreceli (relative) E mesafelerini kullan" -msgid "Relative extrusion is recommended when using \"label_objects\" option.Some extruders work better with this option unckecked (absolute extrusion mode). Wipe tower is only compatible with relative mode. It is always enabled on BambuLab printers. Default is checked" -msgstr "\"label_objects\" seçeneği kullanılırken göreceli ekstrüzyon önerilir. Bazı ekstrüderler bu seçeneğin işareti kaldırıldığında (mutlak ekstrüzyon modu) daha iyi çalışır. Temizleme kulesi yalnızca göreceli modla uyumludur. BambuLab yazıcılarında her zaman etkindir. Varsayılan olarak işaretlendi" +msgid "" +"Relative extrusion is recommended when using \"label_objects\" option.Some " +"extruders work better with this option unckecked (absolute extrusion mode). " +"Wipe tower is only compatible with relative mode. It is always enabled on " +"BambuLab printers. Default is checked" +msgstr "" +"\"label_objects\" seçeneği kullanılırken göreceli ekstrüzyon önerilir. Bazı " +"ekstrüderler bu seçeneğin işareti kaldırıldığında (mutlak ekstrüzyon modu) " +"daha iyi çalışır. Temizleme kulesi yalnızca göreceli modla uyumludur. " +"BambuLab yazıcılarında her zaman etkindir. Varsayılan olarak işaretlendi" -msgid "Classic wall generator produces walls with constant extrusion width and for very thin areas is used gap-fill. Arachne engine produces walls with variable extrusion width" -msgstr "Klasik duvar oluşturucu sabit ekstrüzyon genişliğine sahip duvarlar üretir ve çok ince alanlar için boşluk doldurma kullanılır. Arachne motoru değişken ekstrüzyon genişliğine sahip duvarlar üretir" +msgid "" +"Classic wall generator produces walls with constant extrusion width and for " +"very thin areas is used gap-fill. Arachne engine produces walls with " +"variable extrusion width" +msgstr "" +"Klasik duvar oluşturucu sabit ekstrüzyon genişliğine sahip duvarlar üretir " +"ve çok ince alanlar için boşluk doldurma kullanılır. Arachne motoru değişken " +"ekstrüzyon genişliğine sahip duvarlar üretir" msgid "Classic" msgstr "Klasik" @@ -8788,50 +10643,113 @@ msgstr "Arachne" msgid "Wall transition length" msgstr "Duvar geçiş uzunluğu" -msgid "When transitioning between different numbers of walls as the part becomes thinner, a certain amount of space is allotted to split or join the wall segments. It's expressed as a percentage over nozzle diameter" -msgstr "Parça inceldikçe farklı sayıdaki duvarlar arasında geçiş yaparken, duvar parçalarını bölmek veya birleştirmek için belirli bir miktar alan ayrılır. Nozul çapına göre yüzde olarak ifade edilir" +msgid "" +"When transitioning between different numbers of walls as the part becomes " +"thinner, a certain amount of space is allotted to split or join the wall " +"segments. It's expressed as a percentage over nozzle diameter" +msgstr "" +"Parça inceldikçe farklı sayıdaki duvarlar arasında geçiş yaparken, duvar " +"parçalarını bölmek veya birleştirmek için belirli bir miktar alan ayrılır. " +"Nozul çapına göre yüzde olarak ifade edilir" msgid "Wall transitioning filter margin" msgstr "Duvar geçiş filtresi oranı" -msgid "Prevent transitioning back and forth between one extra wall and one less. This margin extends the range of extrusion widths which follow to [Minimum wall width - margin, 2 * Minimum wall width + margin]. Increasing this margin reduces the number of transitions, which reduces the number of extrusion starts/stops and travel time. However, large extrusion width variation can lead to under- or overextrusion problems. It's expressed as a percentage over nozzle diameter" -msgstr "Fazladan bir duvar ile bir eksik arasında ileri geri geçişi önleyin. Bu kenar boşluğu, [Minimum duvar genişliği - kenar boşluğu, 2 * Minimum duvar genişliği + kenar boşluğu] şeklinde takip eden ekstrüzyon genişlikleri aralığını genişletir. Bu marjın arttırılması geçiş sayısını azaltır, bu da ekstrüzyonun başlama/durma sayısını ve seyahat süresini azaltır. Bununla birlikte, büyük ekstrüzyon genişliği değişimi, yetersiz veya aşırı ekstrüzyon sorunlarına yol açabilir. Nozul çapına göre yüzde olarak ifade edilir" +msgid "" +"Prevent transitioning back and forth between one extra wall and one less. " +"This margin extends the range of extrusion widths which follow to [Minimum " +"wall width - margin, 2 * Minimum wall width + margin]. Increasing this " +"margin reduces the number of transitions, which reduces the number of " +"extrusion starts/stops and travel time. However, large extrusion width " +"variation can lead to under- or overextrusion problems. It's expressed as a " +"percentage over nozzle diameter" +msgstr "" +"Fazladan bir duvar ile bir eksik arasında ileri geri geçişi önleyin. Bu " +"kenar boşluğu, [Minimum duvar genişliği - kenar boşluğu, 2 * Minimum duvar " +"genişliği + kenar boşluğu] şeklinde takip eden ekstrüzyon genişlikleri " +"aralığını genişletir. Bu marjın arttırılması geçiş sayısını azaltır, bu da " +"ekstrüzyonun başlama/durma sayısını ve seyahat süresini azaltır. Bununla " +"birlikte, büyük ekstrüzyon genişliği değişimi, yetersiz veya aşırı " +"ekstrüzyon sorunlarına yol açabilir. Nozul çapına göre yüzde olarak ifade " +"edilir" msgid "Wall transitioning threshold angle" msgstr "Duvar geçiş açısı" -msgid "When to create transitions between even and odd numbers of walls. A wedge shape with an angle greater than this setting will not have transitions and no walls will be printed in the center to fill the remaining space. Reducing this setting reduces the number and length of these center walls, but may leave gaps or overextrude" -msgstr "Çift ve tek sayıdaki duvarlar arasında geçişler ne zaman oluşturulmalıdır? Bu ayardan daha büyük bir açıya sahip bir kama şeklinin geçişleri olmayacak ve kalan alanı dolduracak şekilde ortada hiçbir duvar basılmayacaktır. Bu ayarın düşürülmesi, bu merkez duvarların sayısını ve uzunluğunu azaltır ancak boşluklara veya aşırı çıkıntıya neden olabilir" +msgid "" +"When to create transitions between even and odd numbers of walls. A wedge " +"shape with an angle greater than this setting will not have transitions and " +"no walls will be printed in the center to fill the remaining space. Reducing " +"this setting reduces the number and length of these center walls, but may " +"leave gaps or overextrude" +msgstr "" +"Çift ve tek sayıdaki duvarlar arasında geçişler ne zaman oluşturulmalıdır? " +"Bu ayardan daha büyük bir açıya sahip bir kama şeklinin geçişleri olmayacak " +"ve kalan alanı dolduracak şekilde ortada hiçbir duvar basılmayacaktır. Bu " +"ayarın düşürülmesi, bu merkez duvarların sayısını ve uzunluğunu azaltır " +"ancak boşluklara veya aşırı çıkıntıya neden olabilir" msgid "Wall distribution count" msgstr "Duvar dağılım sayısı" -msgid "The number of walls, counted from the center, over which the variation needs to be spread. Lower values mean that the outer walls don't change in width" -msgstr "Varyasyonun yayılması gereken, merkezden sayılan duvar sayısı. Daha düşük değerler, dış duvarların genişliğinin değişmediği anlamına gelir" +msgid "" +"The number of walls, counted from the center, over which the variation needs " +"to be spread. Lower values mean that the outer walls don't change in width" +msgstr "" +"Varyasyonun yayılması gereken, merkezden sayılan duvar sayısı. Daha düşük " +"değerler, dış duvarların genişliğinin değişmediği anlamına gelir" msgid "Minimum feature size" msgstr "Minimum özellik boyutu" -msgid "Minimum thickness of thin features. Model features that are thinner than this value will not be printed, while features thicker than the Minimum feature size will be widened to the Minimum wall width. It's expressed as a percentage over nozzle diameter" -msgstr "İnce özellikler için minimum kalınlık. Bu değerden daha ince olan model özellikleri yazdırılmayacak, Minimum özellik boyutundan daha kalın olan özellikler ise Minimum duvar genişliğine genişletilecektir. Nozul çapı üzerinden yüzde olarak ifade edilir" +msgid "" +"Minimum thickness of thin features. Model features that are thinner than " +"this value will not be printed, while features thicker than the Minimum " +"feature size will be widened to the Minimum wall width. It's expressed as a " +"percentage over nozzle diameter" +msgstr "" +"İnce özellikler için minimum kalınlık. Bu değerden daha ince olan model " +"özellikleri yazdırılmayacak, Minimum özellik boyutundan daha kalın olan " +"özellikler ise Minimum duvar genişliğine genişletilecektir. Nozul çapı " +"üzerinden yüzde olarak ifade edilir" msgid "First layer minimum wall width" msgstr "İlk katman minimum duvar genişliği" -msgid "The minimum wall width that should be used for the first layer is recommended to be set to the same size as the nozzle. This adjustment is expected to enhance adhesion." -msgstr "İlk katman için kullanılması gereken minimum duvar genişliğinin nozul ile aynı boyuta ayarlanması tavsiye edilir. Bu ayarlamanın yapışmayı artırması beklenmektedir." +msgid "" +"The minimum wall width that should be used for the first layer is " +"recommended to be set to the same size as the nozzle. This adjustment is " +"expected to enhance adhesion." +msgstr "" +"İlk katman için kullanılması gereken minimum duvar genişliğinin nozul ile " +"aynı boyuta ayarlanması tavsiye edilir. Bu ayarlamanın yapışmayı artırması " +"beklenmektedir." msgid "Minimum wall width" msgstr "Minimum duvar genişliği" -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 thickness of the feature, the wall will become as thick as the feature itself. It's expressed as a percentage over nozzle diameter" -msgstr "Modelin ince özelliklerinin yerini alacak duvarın genişliği (Minimum özellik boyutuna göre). Minimum duvar genişliği özelliğin kalınlığından daha inceyse duvar, özelliğin kendisi kadar kalın olacaktır. Nozul çapına göre yüzde olarak ifade edilir" +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 " +"thickness of the feature, the wall will become as thick as the feature " +"itself. It's expressed as a percentage over nozzle diameter" +msgstr "" +"Modelin ince özelliklerinin yerini alacak duvarın genişliği (Minimum özellik " +"boyutuna göre). Minimum duvar genişliği özelliğin kalınlığından daha inceyse " +"duvar, özelliğin kendisi kadar kalın olacaktır. Nozul çapına göre yüzde " +"olarak ifade edilir" msgid "Detect narrow internal solid infill" msgstr "Dar iç katı dolguyu tespit et" -msgid "This option will auto detect narrow internal solid infill area. If enabled, concentric pattern will be used for the area to speed printing up. Otherwise, rectilinear pattern is used defaultly." -msgstr "Bu seçenek dar dahili katı dolgu alanını otomatik olarak algılayacaktır. Etkinleştirilirse, yazdırmayı hızlandırmak amacıyla alanda eşmerkezli desen kullanılacaktır. Aksi takdirde varsayılan olarak doğrusal desen kullanılır." +msgid "" +"This option will auto detect narrow internal solid infill area. If enabled, " +"concentric pattern will be used for the area to speed printing up. " +"Otherwise, rectilinear pattern is used defaultly." +msgstr "" +"Bu seçenek dar dahili katı dolgu alanını otomatik olarak algılayacaktır. " +"Etkinleştirilirse, yazdırmayı hızlandırmak amacıyla alanda eşmerkezli desen " +"kullanılacaktır. Aksi takdirde varsayılan olarak doğrusal desen kullanılır." msgid "invalid value " msgstr "geçersiz değer " @@ -8916,7 +10834,9 @@ msgid "No check" msgstr "Kontrol yok" msgid "Do not run any validity checks, such as gcode path conflicts check." -msgstr "Gcode yol çakışmaları kontrolü gibi herhangi bir geçerlilik kontrolü çalıştırmayın." +msgstr "" +"Gcode yol çakışmaları kontrolü gibi herhangi bir geçerlilik kontrolü " +"çalıştırmayın." msgid "Normative check" msgstr "Normatif kontrol" @@ -8946,7 +10866,8 @@ msgid "Arrange Options" msgstr "Hizalama Seçenekleri" msgid "Arrange options: 0-disable, 1-enable, others-auto" -msgstr "Hizalama seçenekleri: 0-devre dışı bırak, 1-etkinleştir, diğer-otomatik" +msgstr "" +"Hizalama seçenekleri: 0-devre dışı bırak, 1-etkinleştir, diğer-otomatik" msgid "Repetions count" msgstr "Tekrar sayısı" @@ -8957,8 +10878,11 @@ msgstr "Tüm modelin tekrar sayısı" msgid "Ensure on bed" msgstr "Baskı yatağında olduğundan emin olun" -msgid "Lift the object above the bed when it is partially below. Disabled by default" -msgstr "Kısmen aşağıda olduğunda nesneyi yatağın üzerine kaldırın. Varsayılan olarak devre dışı" +msgid "" +"Lift the object above the bed when it is partially below. Disabled by default" +msgstr "" +"Kısmen aşağıda olduğunda nesneyi yatağın üzerine kaldırın. Varsayılan olarak " +"devre dışı" msgid "Convert Unit" msgstr "Birimi Dönüştür" @@ -8970,7 +10894,9 @@ msgid "Orient Options" msgstr "Yönlendirme Seçenekleri" msgid "Orient options: 0-disable, 1-enable, others-auto" -msgstr "Yönlendirme seçenekleri: 0-devre dışı bırak, 1-etkinleştir, diğerleri-otomatik" +msgstr "" +"Yönlendirme seçenekleri: 0-devre dışı bırak, 1-etkinleştir, diğerleri-" +"otomatik" msgid "Rotation angle around the Z axis in degrees." msgstr "Z ekseni etrafında derece cinsinden dönüş açısı." @@ -9011,14 +10937,24 @@ msgstr "Bu baskıdaki bazı nesneleri atla" msgid "load uptodate process/machine settings when using uptodate" msgstr "güncellemeyi kullanırken güncelleme işlemi/yazıcıayarlarını yükle" -msgid "load uptodate process/machine settings from the specified file when using uptodate" -msgstr "güncellemeyi kullanırken belirtilen dosyadan güncel işlem/yazıcıayarlarını yükle" +msgid "" +"load uptodate process/machine settings from the specified file when using " +"uptodate" +msgstr "" +"güncellemeyi kullanırken belirtilen dosyadan güncel işlem/yazıcıayarlarını " +"yükle" msgid "Data directory" msgstr "Veri dizini" -msgid "Load and store settings at the given directory. This is useful for maintaining different profiles or including configurations from a network storage." -msgstr "Ayarları verilen dizine yükleyin ve saklayın. Bu, farklı profilleri korumak veya bir ağ depolama birimindeki yapılandırmaları dahil etmek için kullanışlıdır." +msgid "" +"Load and store settings at the given directory. This is useful for " +"maintaining different profiles or including configurations from a network " +"storage." +msgstr "" +"Ayarları verilen dizine yükleyin ve saklayın. Bu, farklı profilleri korumak " +"veya bir ağ depolama birimindeki yapılandırmaları dahil etmek için " +"kullanışlıdır." msgid "Output directory" msgstr "Çıkış dizini" @@ -9029,8 +10965,12 @@ msgstr "Dışa aktarılan dosyalar için çıkış dizini." msgid "Debug level" msgstr "Hata ayıklama düzeyi" -msgid "Sets debug logging level. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:trace\n" -msgstr "Hata ayıklama günlüğü düzeyini ayarlar. 0:önemli, 1:hata, 2:uyarı, 3:bilgi, 4:hata ayıklama, 5:izleme\n" +msgid "" +"Sets debug logging level. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" +"trace\n" +msgstr "" +"Hata ayıklama günlüğü düzeyini ayarlar. 0:önemli, 1:hata, 2:uyarı, 3:bilgi, " +"4:hata ayıklama, 5:izleme\n" msgid "Load custom gcode" msgstr "Özel gcode yükle" @@ -9069,8 +11009,12 @@ msgid "large overhangs" msgstr "büyük çıkıntılar" #, c-format, boost-format -msgid "It seems object %s has %s. Please re-orient the object or enable support generation." -msgstr "Görünüşe göre %s nesnesinde %s var. Lütfen nesneyi yeniden yönlendirin veya destek oluşturmayı etkinleştirin." +msgid "" +"It seems object %s has %s. Please re-orient the object or enable support " +"generation." +msgstr "" +"Görünüşe göre %s nesnesinde %s var. Lütfen nesneyi yeniden yönlendirin veya " +"destek oluşturmayı etkinleştirin." msgid "Optimizing toolpath" msgstr "Takım yolunu optimize etme" @@ -9084,14 +11028,20 @@ msgstr "Modelde çok fazla boş katman var." msgid "Slicing mesh" msgstr "Mesh dilimleme" -msgid "No layers were detected. You might want to repair your STL file(s) or check their size or thickness and retry.\n" -msgstr "Hiçbir katman algılanmadı. STL dosyalarınızı onarmak veya boyutlarını veya kalınlıklarını kontrol edip yeniden denemek isteyebilirsiniz.\n" +msgid "" +"No layers were detected. You might want to repair your STL file(s) or check " +"their size or thickness and retry.\n" +msgstr "" +"Hiçbir katman algılanmadı. STL dosyalarınızı onarmak veya boyutlarını veya " +"kalınlıklarını kontrol edip yeniden denemek isteyebilirsiniz.\n" msgid "" -"An object's XY size compensation will not be used because it is also color-painted.\n" +"An object's XY size compensation will not be used because it is also color-" +"painted.\n" "XY Size compensation can not be combined with color-painting." msgstr "" -"Bir nesnenin XY boyutu telafisi , aynı zamanda renkli boyalı olduğundan kullanılmayacaktır.\n" +"Bir nesnenin XY boyutu telafisi , aynı zamanda renkli boyalı olduğundan " +"kullanılmayacaktır.\n" "XY Boyut telafisi renkli boyamayla birleştirilemez." #, c-format, boost-format @@ -9125,8 +11075,11 @@ msgstr "Destek: %d katmanındaki delikleri düzeltin" msgid "Support: propagate branches at layer %d" msgstr "Destek: %d katmanındaki dalları çoğalt" -msgid "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." -msgstr "Bilinmeyen dosya formatı. Giriş dosyası .stl, .obj, .amf(.xml) uzantılı olmalıdır." +msgid "" +"Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." +msgstr "" +"Bilinmeyen dosya formatı. Giriş dosyası .stl, .obj, .amf(.xml) uzantılı " +"olmalıdır." msgid "Loading of a model file failed." msgstr "Model dosyasının yüklenmesi başarısız oldu." @@ -9135,7 +11088,9 @@ msgid "The supplied file couldn't be read because it's empty" msgstr "Sağlanan dosya boş olduğundan okunamadı" msgid "Unknown file format. Input file must have .3mf or .zip.amf extension." -msgstr "Bilinmeyen dosya formatı. Giriş dosyası .3mf veya .zip.amf uzantılı olmalıdır." +msgstr "" +"Bilinmeyen dosya formatı. Giriş dosyası .3mf veya .zip.amf uzantılı " +"olmalıdır." msgid "Canceled" msgstr "İptal edildi" @@ -9194,8 +11149,10 @@ msgstr "Viki" msgid "How to use calibration result?" msgstr "Kalibrasyon sonucu nasıl kullanılır?" -msgid "You could change the Flow Dynamics Calibration Factor in material editing" -msgstr "Malzeme düzenlemede Akış Dinamiği Kalibrasyon Faktörünü değiştirebilirsiniz" +msgid "" +"You could change the Flow Dynamics Calibration Factor in material editing" +msgstr "" +"Malzeme düzenlemede Akış Dinamiği Kalibrasyon Faktörünü değiştirebilirsiniz" msgid "" "The current firmware version of the printer does not support calibration.\n" @@ -9239,6 +11196,7 @@ msgstr "" msgid "The name cannot be empty." msgstr "Ad boş olamaz." +#, boost-format msgid "The selected preset: %1% is not found." msgstr "Seçilen ön ayar: %1% bulunamadı." @@ -9251,8 +11209,11 @@ msgstr "Ad, mevcut başka bir ön ayar adıyla aynı" msgid "create new preset failed." msgstr "yeni ön ayar oluşturma başarısız oldu." -msgid "Are you sure to cancel the current calibration and return to the home page?" -msgstr "Mevcut kalibrasyonu iptal edip ana sayfaya dönmek istediğinizden emin misiniz?" +msgid "" +"Are you sure to cancel the current calibration and return to the home page?" +msgstr "" +"Mevcut kalibrasyonu iptal edip ana sayfaya dönmek istediğinizden emin " +"misiniz?" msgid "No Printer Connected!" msgstr "Yazıcı Bağlı Değil!" @@ -9291,15 +11252,23 @@ msgid "When do you need Flow Dynamics Calibration" msgstr "Akış Dinamiği Kalibrasyonuna ne zaman ihtiyacınız olur" 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 use. You only need to do the calibration in the following limited cases:\n" -"1. If you introduce a new filament of different brands/models or the filament is damp;\n" +"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 " +"use. You only need to do the calibration in the following limited cases:\n" +"1. If you introduce a new filament of different brands/models or the " +"filament is damp;\n" "2. if the nozzle is worn out or replaced with a new one;\n" -"3. If the max volumetric speed or print temperature is changed in the filament setting." +"3. If the max volumetric speed or print temperature is changed in the " +"filament setting." msgstr "" -"Artık farklı filamentler için tamamen otomatik olan otomatik kalibrasyonu ekledik ve sonuç ileride kullanılmak üzere yazıcıya kaydedilecek. Kalibrasyonu yalnızca aşağıdaki sınırlı durumlarda yapmanız gerekir:\n" -"1. Farklı marka/modelde yeni bir filament taktıysanız veya filament nemliyse;\n" +"Artık farklı filamentler için tamamen otomatik olan otomatik kalibrasyonu " +"ekledik ve sonuç ileride kullanılmak üzere yazıcıya kaydedilecek. " +"Kalibrasyonu yalnızca aşağıdaki sınırlı durumlarda yapmanız gerekir:\n" +"1. Farklı marka/modelde yeni bir filament taktıysanız veya filament " +"nemliyse;\n" "2. Nozul aşınmışsa veya yenisiyle değiştirilmişse;\n" -"3. Filament ayarında maksimum hacimsel hız veya baskı sıcaklığı değiştirilirse." +"3. Filament ayarında maksimum hacimsel hız veya baskı sıcaklığı " +"değiştirilirse." msgid "About this calibration" msgstr "Bu kalibrasyon hakkında" @@ -9307,54 +11276,127 @@ msgstr "Bu kalibrasyon hakkında" msgid "" "Please find the details of Flow Dynamics Calibration from our wiki.\n" "\n" -"Usually the calibration is unnecessary. When you start a single color/material print, with the \"flow dynamics calibration\" option checked in the print start menu, the printer will follow the old way, calibrate the filament before the print; When you start a multi color/material print, the printer will use the default compensation parameter for the filament during every filament switch which will have a good result in most cases.\n" +"Usually the calibration is unnecessary. When you start a single color/" +"material print, with the \"flow dynamics calibration\" option checked in the " +"print start menu, the printer will follow the old way, calibrate the " +"filament before the print; When you start a multi color/material print, the " +"printer will use the default compensation parameter for the filament during " +"every filament switch which will have a good result in most cases.\n" "\n" -"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" +"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" "\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 still investigating the root cause to do improvements with new updates." +"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 still " +"investigating the root cause to do improvements with new updates." msgstr "" -"Lütfen Akış Dinamiği Kalibrasyonunun ayrıntılarını wiki'mizden bulabilirsiniz.\n" +"Lütfen Akış Dinamiği Kalibrasyonunun ayrıntılarını wiki'mizden " +"bulabilirsiniz.\n" "\n" -"Genellikle kalibrasyon gereksizdir. Yazdırma başlat menüsündeki \"akış dinamiği kalibrasyonu\" seçeneği işaretliyken tek renkli/malzeme baskısını başlattığınızda, yazıcı eski yöntemi izleyecek, yazdırmadan önce filamanı kalibre edecektir; Çok renkli/malzeme baskısını başlattığınızda, yazıcı her filament değişiminde filament için varsayılan dengeleme parametresini kullanacaktır ve bu çoğu durumda iyi bir sonuç verecektir.\n" +"Genellikle kalibrasyon gereksizdir. Yazdırma başlat menüsündeki \"akış " +"dinamiği kalibrasyonu\" seçeneği işaretliyken tek renkli/malzeme baskısını " +"başlattığınızda, yazıcı eski yöntemi izleyecek, yazdırmadan önce filamanı " +"kalibre edecektir; Çok renkli/malzeme baskısını başlattığınızda, yazıcı her " +"filament değişiminde filament için varsayılan dengeleme parametresini " +"kullanacaktır ve bu çoğu durumda iyi bir sonuç verecektir.\n" "\n" -"Kalibrasyon sonucunun güvenilir olmamasına yol açacak birkaç durum olduğunu lütfen unutmayın: kalibrasyonu yapmak için doku plakası kullanmak; baskı plakasının yapışması iyi değil (lütfen baskı plakasını yıkayın veya yapıştırıcı uygulayın!) ...Daha fazlasını wiki'mizden bulabilirsiniz.\n" +"Kalibrasyon sonucunun güvenilir olmamasına yol açacak birkaç durum olduğunu " +"lütfen unutmayın: kalibrasyonu yapmak için doku plakası kullanmak; baskı " +"plakasının yapışması iyi değil (lütfen baskı plakasını yıkayın veya " +"yapıştırıcı uygulayın!) ...Daha fazlasını wiki'mizden bulabilirsiniz.\n" "\n" -"Testimizde kalibrasyon sonuçlarında yaklaşık yüzde 10'luk bir titreşim var ve bu da sonucun her kalibrasyonda tam olarak aynı olmamasına neden olabilir. Yeni güncellemelerle iyileştirmeler yapmak için hâlâ temel nedeni araştırıyoruz." +"Testimizde kalibrasyon sonuçlarında yaklaşık yüzde 10'luk bir titreşim var " +"ve bu da sonucun her kalibrasyonda tam olarak aynı olmamasına neden " +"olabilir. Yeni güncellemelerle iyileştirmeler yapmak için hâlâ temel nedeni " +"araştırıyoruz." msgid "When to use Flow Rate Calibration" msgstr "Akış Hızı Kalibrasyonu ne zaman kullanılmalı" msgid "" -"After using Flow Dynamics Calibration, there might still be some extrusion issues, such as:\n" -"1. Over-Extrusion: Excess material on your printed object, forming blobs or zits, or the layers seem thicker than expected and not uniform.\n" -"2. Under-Extrusion: Very thin layers, weak infill strength, or gaps in the top layer of the model, even when printing slowly.\n" +"After using Flow Dynamics Calibration, there might still be some extrusion " +"issues, such as:\n" +"1. Over-Extrusion: Excess material on your printed object, forming blobs or " +"zits, or the layers seem thicker than expected and not uniform.\n" +"2. Under-Extrusion: Very thin layers, weak infill strength, or gaps in the " +"top layer of the model, even when printing slowly.\n" "3. Poor Surface Quality: The surface of your prints seems rough or uneven.\n" -"4. Weak Structural Integrity: Prints break easily or don't seem as sturdy as they should be." +"4. Weak Structural Integrity: Prints break easily or don't seem as sturdy as " +"they should be." msgstr "" -"Akış Dinamiği Kalibrasyonunu kullandıktan sonra hâlâ aşağıdaki gibi bazı ekstrüzyon sorunları olabilir:\n" -"1. Aşırı Ekstrüzyon: Basılı nesnenizdeki fazla malzeme, kabarcıklar veya sivilceler oluşturuyor veya katmanlar beklenenden daha kalın görünüyor ve tekdüze değil.\n" -"2. Eksik Ekstrüzyon: Yavaş yazdırırken bile çok ince katmanlar, zayıf dolgu mukavemeti veya modelin üst katmanındaki boşluklar.\n" -"3. Kötü Yüzey Kalitesi: Baskılarınızın yüzeyi pürüzlü veya düzensiz görünüyor.\n" -"4. Zayıf Yapısal Bütünlük: Baskılar kolayca kırılıyor veya olması gerektiği kadar sağlam görünmüyor." +"Akış Dinamiği Kalibrasyonunu kullandıktan sonra hâlâ aşağıdaki gibi bazı " +"ekstrüzyon sorunları olabilir:\n" +"1. Aşırı Ekstrüzyon: Basılı nesnenizdeki fazla malzeme, kabarcıklar veya " +"sivilceler oluşturuyor veya katmanlar beklenenden daha kalın görünüyor ve " +"tekdüze değil.\n" +"2. Eksik Ekstrüzyon: Yavaş yazdırırken bile çok ince katmanlar, zayıf dolgu " +"mukavemeti veya modelin üst katmanındaki boşluklar.\n" +"3. Kötü Yüzey Kalitesi: Baskılarınızın yüzeyi pürüzlü veya düzensiz " +"görünüyor.\n" +"4. Zayıf Yapısal Bütünlük: Baskılar kolayca kırılıyor veya olması gerektiği " +"kadar sağlam görünmüyor." -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 calibration provides a useful reference flow rate." -msgstr "Ayrıca RC uçaklarında kullanılan LW-PLA gibi köpürtücü malzemeler için Akış Hızı Kalibrasyonu çok önemlidir. Bu malzemeler ısıtıldığında büyük oranda genleşir ve kalibrasyon yararlı bir referans akış hızı sağlar." +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 " +"calibration provides a useful reference flow rate." +msgstr "" +"Ayrıca RC uçaklarında kullanılan LW-PLA gibi köpürtücü malzemeler için Akış " +"Hızı Kalibrasyonu çok önemlidir. Bu malzemeler ısıtıldığında büyük oranda " +"genleşir ve kalibrasyon yararlı bir referans akış hızı sağlar." -msgid "Flow Rate Calibration measures the ratio of expected to actual extrusion volumes. The default setting works well in Bambu Lab printers and official filaments as they were pre-calibrated and fine-tuned. For a regular filament, you usually won't need to perform a Flow Rate Calibration unless you still see the listed defects after you have done other calibrations. For more details, please check out the wiki article." -msgstr "Akış Hızı Kalibrasyonu, beklenen ekstrüzyon hacimlerinin gerçek ekstrüzyon hacimlerine oranını ölçer. Varsayılan ayar, önceden kalibre edilmiş ve ince ayar yapılmış olduğundan Bambu Lab yazıcılarında ve resmi filamentlerde iyi çalışır. Normal bir filament için, diğer kalibrasyonları yaptıktan sonra listelenen kusurları hâlâ göremediğiniz sürece genellikle Akış Hızı Kalibrasyonu yapmanıza gerek kalmaz. Daha fazla ayrıntı için lütfen wiki makalesine göz atın." +msgid "" +"Flow Rate Calibration measures the ratio of expected to actual extrusion " +"volumes. The default setting works well in Bambu Lab printers and official " +"filaments as they were pre-calibrated and fine-tuned. For a regular " +"filament, you usually won't need to perform a Flow Rate Calibration unless " +"you still see the listed defects after you have done other calibrations. For " +"more details, please check out the wiki article." +msgstr "" +"Akış Hızı Kalibrasyonu, beklenen ekstrüzyon hacimlerinin gerçek ekstrüzyon " +"hacimlerine oranını ölçer. Varsayılan ayar, önceden kalibre edilmiş ve ince " +"ayar yapılmış olduğundan Bambu Lab yazıcılarında ve resmi filamentlerde iyi " +"çalışır. Normal bir filament için, diğer kalibrasyonları yaptıktan sonra " +"listelenen kusurları hâlâ göremediğiniz sürece genellikle Akış Hızı " +"Kalibrasyonu yapmanıza gerek kalmaz. Daha fazla ayrıntı için lütfen wiki " +"makalesine göz atın." msgid "" -"Auto Flow Rate Calibration utilizes Bambu Lab's Micro-Lidar technology, directly measuring the calibration patterns. However, please be advised that the efficacy and accuracy of this method may be compromised with specific types of materials. Particularly, filaments that are transparent or semi-transparent, sparkling-particled, or have a high-reflective finish may not be suitable for this calibration and can produce less-than-desirable results.\n" +"Auto Flow Rate Calibration utilizes Bambu Lab's Micro-Lidar technology, " +"directly measuring the calibration patterns. However, please be advised that " +"the efficacy and accuracy of this method may be compromised with specific " +"types of materials. Particularly, filaments that are transparent or semi-" +"transparent, sparkling-particled, or have a high-reflective finish may not " +"be suitable for this calibration and can produce less-than-desirable " +"results.\n" "\n" -"The calibration results may vary between each calibration or filament. We are still improving the accuracy and compatibility of this calibration through firmware updates over time.\n" +"The calibration results may vary between each calibration or filament. We " +"are still improving the accuracy and compatibility of this calibration " +"through firmware updates over time.\n" "\n" -"Caution: Flow Rate Calibration is an advanced process, to be attempted only by those who fully understand its purpose and implications. Incorrect usage can lead to sub-par prints or printer damage. Please make sure to carefully read and understand the process before doing it." +"Caution: Flow Rate Calibration is an advanced process, to be attempted only " +"by those who fully understand its purpose and implications. Incorrect usage " +"can lead to sub-par prints or printer damage. Please make sure to carefully " +"read and understand the process before doing it." msgstr "" -"Otomatik Akış Hızı Kalibrasyonu, Bambu Lab'ın Mikro-Lidar teknolojisini kullanarak kalibrasyon modellerini doğrudan ölçer. Ancak, bu yöntemin etkinliğinin ve doğruluğunun belirli malzeme türleriyle tehlikeye girebileceğini lütfen unutmayın. Özellikle şeffaf veya yarı şeffaf, parlak parçacıklı veya yüksek yansıtıcı yüzeye sahip filamentler bu kalibrasyon için uygun olmayabilir ve arzu edilenden daha az sonuçlar üretebilir.\n" +"Otomatik Akış Hızı Kalibrasyonu, Bambu Lab'ın Mikro-Lidar teknolojisini " +"kullanarak kalibrasyon modellerini doğrudan ölçer. Ancak, bu yöntemin " +"etkinliğinin ve doğruluğunun belirli malzeme türleriyle tehlikeye " +"girebileceğini lütfen unutmayın. Özellikle şeffaf veya yarı şeffaf, parlak " +"parçacıklı veya yüksek yansıtıcı yüzeye sahip filamentler bu kalibrasyon " +"için uygun olmayabilir ve arzu edilenden daha az sonuçlar üretebilir.\n" "\n" -"Kalibrasyon sonuçları her kalibrasyon veya filament arasında farklılık gösterebilir. Zaman içinde ürün yazılımı güncellemeleriyle bu kalibrasyonun doğruluğunu ve uyumluluğunu geliştirmeye devam ediyoruz.\n" +"Kalibrasyon sonuçları her kalibrasyon veya filament arasında farklılık " +"gösterebilir. Zaman içinde ürün yazılımı güncellemeleriyle bu kalibrasyonun " +"doğruluğunu ve uyumluluğunu geliştirmeye devam ediyoruz.\n" "\n" -"Dikkat: Akış Hızı Kalibrasyonu, yalnızca amacını ve sonuçlarını tam olarak anlayan kişiler tarafından denenmesi gereken gelişmiş bir işlemdir. Yanlış kullanım, ortalamanın altında baskılara veya yazıcının zarar görmesine neden olabilir. Lütfen işlemi yapmadan önce işlemi dikkatlice okuyup anladığınızdan emin olun." +"Dikkat: Akış Hızı Kalibrasyonu, yalnızca amacını ve sonuçlarını tam olarak " +"anlayan kişiler tarafından denenmesi gereken gelişmiş bir işlemdir. Yanlış " +"kullanım, ortalamanın altında baskılara veya yazıcının zarar görmesine neden " +"olabilir. Lütfen işlemi yapmadan önce işlemi dikkatlice okuyup " +"anladığınızdan emin olun." msgid "When you need Max Volumetric Speed Calibration" msgstr "Maksimum Hacimsel Hız Kalibrasyonuna ihtiyaç duyduğunuzda" @@ -9363,7 +11405,8 @@ msgid "Over-extrusion or under extrusion" msgstr "Aşırı ekstrüzyon veya düşük ekstrüzyon" msgid "Max Volumetric Speed calibration is recommended when you print with:" -msgstr "Aşağıdakilerle yazdırdığınızda Maksimum Hacimsel Hız kalibrasyonu önerilir:" +msgstr "" +"Aşağıdakilerle yazdırdığınızda Maksimum Hacimsel Hız kalibrasyonu önerilir:" msgid "material with significant thermal shrinkage/expansion, such as..." msgstr "önemli termal büzülme/genleşmeye sahip malzeme, örneğin..." @@ -9374,25 +11417,44 @@ msgstr "yanlış filament çapına sahip malzemeler" msgid "We found the best Flow Dynamics Calibration Factor" msgstr "En iyi Akış Dinamiği Kalibrasyon Faktörünü bulduk" -msgid "Part of the calibration failed! You may clean the plate and retry. The failed test result would be dropped." -msgstr "Kalibrasyonun bir kısmı başarısız oldu! Plakayı temizleyip tekrar deneyebilirsiniz. Başarısız olan test sonucu görmezden gelinir." +msgid "" +"Part of the calibration failed! You may clean the plate and retry. The " +"failed test result would be dropped." +msgstr "" +"Kalibrasyonun bir kısmı başarısız oldu! Plakayı temizleyip tekrar " +"deneyebilirsiniz. Başarısız olan test sonucu görmezden gelinir." -msgid "*We recommend you to add brand, materia, type, and even humidity level in the Name" +msgid "" +"*We recommend you to add brand, materia, type, and even humidity level in " +"the Name" msgstr "*İsme marka, malzeme, tür ve hatta nem seviyesini eklemenizi öneririz" msgid "Failed" msgstr "Başarısız" -msgid "Only one of the results with the same name will be saved. Are you sure you want to overrides the other results?" -msgstr "Aynı ada sahip sonuçlardan yalnızca biri kaydedilecektir. Diğer sonuçları geçersiz kılmak istediğinizden emin misiniz?" +msgid "" +"Only one of the results with the same name will be saved. Are you sure you " +"want to overrides the other results?" +msgstr "" +"Aynı ada sahip sonuçlardan yalnızca biri kaydedilecektir. Diğer sonuçları " +"geçersiz kılmak istediğinizden emin misiniz?" #, 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 want to overrides the historical result?" -msgstr "Aynı ada sahip geçmiş bir kalibrasyon sonucu zaten var: %s. Aynı ada sahip sonuçlardan yalnızca biri kaydedilir. Geçmiş sonucu geçersiz kılmak istediğinizden emin misiniz?" +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 want " +"to overrides the historical result?" +msgstr "" +"Aynı ada sahip geçmiş bir kalibrasyon sonucu zaten var: %s. Aynı ada sahip " +"sonuçlardan yalnızca biri kaydedilir. Geçmiş sonucu geçersiz kılmak " +"istediğinizden emin misiniz?" msgid "Please find the best line on your plate" msgstr "Lütfen plakadaki en iyi çizgiyi bulun" +msgid "Please find the cornor with perfect degree of extrusion" +msgstr "" + msgid "Input Value" msgstr "Girdi değeri" @@ -9432,6 +11494,7 @@ msgstr "En pürüzsüz üst yüzeye sahip bloğun üzerindeki değeri doldurun" msgid "Skip Calibration2" msgstr "Kalibrasyon2'yi atla" +#, c-format, boost-format msgid "flow ratio : %s " msgstr "akış oranı : %s " @@ -9456,8 +11519,12 @@ msgstr "Akış oranına dayalı İnce Kalibrasyon" msgid "Title" msgstr "Başlık" -msgid "A test model will be printed. Please clear the build plate and place it back to the hot bed before calibration." -msgstr "Test modeli yazdırılacaktır. Kalibrasyondan önce lütfen baskı plakasını temizleyin ve yatağa geri koyun." +msgid "" +"A test model will be printed. Please clear the build plate and place it back " +"to the hot bed before calibration." +msgstr "" +"Test modeli yazdırılacaktır. Kalibrasyondan önce lütfen baskı plakasını " +"temizleyin ve yatağa geri koyun." msgid "Printing Parameters" msgstr "Yazdırma Parametreleri" @@ -9501,6 +11568,7 @@ msgstr "Desen" msgid "Method" msgstr "Yöntem" +#, c-format, boost-format msgid "%s is not compatible with %s" msgstr "%s, %s ile uyumlu değil" @@ -9623,8 +11691,8 @@ msgstr "Bölüm 2" msgid "Delete input" msgstr "Girişi sil" -msgid "Send to print" -msgstr "Baskıya gönder" +msgid "Send G-Code to printer host" +msgstr "" msgid "Upload to Printer Host with the following filename:" msgstr "Yazıcıya aşağıdaki dosya adıyla yükleyin:" @@ -9661,8 +11729,8 @@ msgstr "Boyut" msgid "Filename" msgstr "Dosya adı" -msgid "Error Message" -msgstr "Hata mesajı" +msgid "Message" +msgstr "" msgid "Cancel selected" msgstr "Seçileni iptal et" @@ -9679,8 +11747,8 @@ msgstr "Yükleniyor" msgid "Cancelling" msgstr "İptal Ediliyor" -msgid "Error uploading to print host:" -msgstr "Ana bilgisayara yükleme hatası:" +msgid "Error uploading to print host" +msgstr "" msgid "PA Calibration" msgstr "PA Kalibrasyonu" @@ -9762,13 +11830,9 @@ msgstr "Sıcaklık adımı: " msgid "" "Please input valid values:\n" "Start temp: <= 350\n" -"End temp: >= 180\n" +"End temp: >= 170\n" "Start temp > End temp + 5)" msgstr "" -"Lütfen geçerli değerleri girin:\n" -"Başlangıç sıcaklığı: <= 350\n" -"Bitiş sıcaklığı: >= 180\n" -"Başlangıç sıcaklığı > Bitiş sıcaklığı + 5)" msgid "Max volumetric speed test" msgstr "Maksimum hacimsel hız testi" @@ -9784,12 +11848,10 @@ msgstr "adım: " msgid "" "Please input valid values:\n" -"start > 0 step >= 0\n" +"start > 0 \n" +"step >= 0\n" "end > start + step)" msgstr "" -"Lütfen geçerli değerleri girin:\n" -"başlangıç > 0 adım >= 0\n" -"bitiş > başlangıç + adım)" msgid "VFA test" msgstr "VFA testi" @@ -9802,12 +11864,10 @@ msgstr "Bitiş hızı: " msgid "" "Please input valid values:\n" -"start > 10 step >= 0\n" +"start > 10 \n" +"step >= 0\n" "end > start + step)" msgstr "" -"Lütfen geçerli değerleri girin:\n" -"başlangıç > 10 adım >= 0\n" -"bitiş > başlangıç + adım)" msgid "Start retraction length: " msgstr "Geri çekme uzunluğu başlangıcı: " @@ -9836,8 +11896,12 @@ msgstr "Başarılı!" msgid "Refresh Printers" msgstr "Yazıcıları Yenile" -msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate." -msgstr "HTTPS CA dosyası isteğe bağlıdır. Yalnızca HTTPS'yi kendinden imzalı bir sertifikayla kullanıyorsanız gereklidir." +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"HTTPS CA dosyası isteğe bağlıdır. Yalnızca HTTPS'yi kendinden imzalı bir " +"sertifikayla kullanıyorsanız gereklidir." msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "Sertifika dosyaları (*.crt, *.pem)|*.crt;*.pem|Tüm dosyalar|*.*" @@ -9846,20 +11910,34 @@ msgid "Open CA certificate file" msgstr "CA sertifika dosyasını aç" #, c-format, boost-format -msgid "On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain." -msgstr "Bu sistemde %s, sistem Sertifika Deposu veya Anahtar Zincirinden alınan HTTPS sertifikalarını kullanıyor." +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" +"Bu sistemde %s, sistem Sertifika Deposu veya Anahtar Zincirinden alınan " +"HTTPS sertifikalarını kullanıyor." -msgid "To use a custom CA file, please import your CA file into Certificate Store / Keychain." -msgstr "Özel bir CA dosyası kullanmak için lütfen CA dosyanızı Sertifika Deposuna/Anahtarlığa aktarın." +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" +"Özel bir CA dosyası kullanmak için lütfen CA dosyanızı Sertifika Deposuna/" +"Anahtarlığa aktarın." msgid "Connection to printers connected via the print host failed." -msgstr "Yazdırma ana bilgisayarı aracılığıyla bağlanan yazıcılara bağlantı başarısız oldu." +msgstr "" +"Yazdırma ana bilgisayarı aracılığıyla bağlanan yazıcılara bağlantı başarısız " +"oldu." msgid "The start, end or step is not valid value." msgstr "Başlangıç, bitiş veya adım geçerli bir değer değildir." -msgid "Unable to calibrate: maybe because the set calibration value range is too large, or the step is too small" -msgstr "Kalibre edilemiyor: ayarlanan kalibrasyon değeri aralığı çok büyük veya adım çok küçük olduğu için olabilir" +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "" +"Kalibre edilemiyor: ayarlanan kalibrasyon değeri aralığı çok büyük veya adım " +"çok küçük olduğu için olabilir" msgid "Need select printer" msgstr "Yazıcı seçmeniz gerekiyor" @@ -9867,26 +11945,32 @@ msgstr "Yazıcı seçmeniz gerekiyor" #: resources/data/hints.ini: [hint:3D Scene Operations] msgid "" "3D Scene Operations\n" -"Did you know how to control view and object/part selection with mouse and touchpanel in the 3D scene?" +"Did you know how to control view and object/part selection with mouse and " +"touchpanel in the 3D scene?" msgstr "" "3D Sahne İşlemleri\n" -"3D sahnede fare ve dokunmatik panel ile görünümü ve nesne/parça seçimini nasıl kontrol edeceğinizi biliyor muydunuz?" +"3D sahnede fare ve dokunmatik panel ile görünümü ve nesne/parça seçimini " +"nasıl kontrol edeceğinizi biliyor muydunuz?" #: resources/data/hints.ini: [hint:Cut Tool] msgid "" "Cut Tool\n" -"Did you know that you can cut a model at any angle and position with the cutting tool?" +"Did you know that you can cut a model at any angle and position with the " +"cutting tool?" msgstr "" "Kesme Aleti\n" -"Kesici aletle bir modeli istediğiniz açıda ve konumda kesebileceğinizi biliyor muydunuz?" +"Kesici aletle bir modeli istediğiniz açıda ve konumda kesebileceğinizi " +"biliyor muydunuz?" #: resources/data/hints.ini: [hint:Fix Model] msgid "" "Fix Model\n" -"Did you know that you can fix a corrupted 3D model to avoid a lot of slicing problems?" +"Did you know that you can fix a corrupted 3D model to avoid a lot of slicing " +"problems?" msgstr "" "Modeli Düzelt\n" -"Pek çok dilimleme sorununu önlemek için bozuk bir 3D modeli düzeltebileceğinizi biliyor muydunuz?" +"Pek çok dilimleme sorununu önlemek için bozuk bir 3D modeli " +"düzeltebileceğinizi biliyor muydunuz?" #: resources/data/hints.ini: [hint:Timelapse] msgid "" @@ -9902,145 +11986,202 @@ msgid "" "Did you know that you can auto-arrange all objects in your project?" msgstr "" "Otomatik düzenleme\n" -"Projenizdeki tüm nesneleri otomatik olarak düzenleyebileceğinizi biliyor muydunuz?" +"Projenizdeki tüm nesneleri otomatik olarak düzenleyebileceğinizi biliyor " +"muydunuz?" #: resources/data/hints.ini: [hint:Auto-Orient] msgid "" "Auto-Orient\n" -"Did you know that you can rotate objects to an optimal orientation for printing by a simple click?" +"Did you know that you can rotate objects to an optimal orientation for " +"printing by a simple click?" msgstr "" "Otomatik Yönlendirme\n" -"Basit bir tıklamayla nesneleri yazdırma için en uygun yöne döndürebileceğinizi biliyor muydunuz?" +"Basit bir tıklamayla nesneleri yazdırma için en uygun yöne " +"döndürebileceğinizi biliyor muydunuz?" #: resources/data/hints.ini: [hint:Lay on Face] msgid "" "Lay on Face\n" -"Did you know that you can quickly orient a model so that one of its faces sits on the print bed? Select the \"Place on face\" function or press the F key." +"Did you know that you can quickly orient a model so that one of its faces " +"sits on the print bed? Select the \"Place on face\" function or press the " +"F key." msgstr "" "Yüzüstü yatır\n" -"Bir modeli, yüzlerinden biri baskı yatağına oturacak şekilde hızla yönlendirebileceğinizi biliyor muydunuz? \"Yüze yerleştir\" işlevini seçin veya F tuşuna basın." +"Bir modeli, yüzlerinden biri baskı yatağına oturacak şekilde hızla " +"yönlendirebileceğinizi biliyor muydunuz? \"Yüze yerleştir\" işlevini seçin " +"veya F tuşuna basın." #: resources/data/hints.ini: [hint:Object List] msgid "" "Object List\n" -"Did you know that you can view all objects/parts in a list and change settings for each object/part?" +"Did you know that you can view all objects/parts in a list and change " +"settings for each object/part?" msgstr "" "Nesne Listesi\n" -"Tüm nesneleri/parçaları bir listede görüntüleyebileceğinizi ve her nesne/parça için ayarları değiştirebileceğinizi biliyor muydunuz?" +"Tüm nesneleri/parçaları bir listede görüntüleyebileceğinizi ve her nesne/" +"parça için ayarları değiştirebileceğinizi biliyor muydunuz?" #: resources/data/hints.ini: [hint:Simplify Model] msgid "" "Simplify Model\n" -"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. Read more in the documentation." +"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. Read " +"more in the documentation." msgstr "" "Modeli Basitleştir\n" -"Mesh basitleştirme özelliğini kullanarak bir ağdaki üçgen sayısını azaltabileceğinizi biliyor muydunuz? Modele sağ tıklayın ve Modeli basitleştir'i seçin. Daha fazlasını belgelerde okuyun." +"Mesh basitleştirme özelliğini kullanarak bir ağdaki üçgen sayısını " +"azaltabileceğinizi biliyor muydunuz? Modele sağ tıklayın ve Modeli " +"basitleştir'i seçin. Daha fazlasını belgelerde okuyun." #: resources/data/hints.ini: [hint:Slicing Parameter Table] 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?" +"Did you know that you can view all objects/parts on a table and change " +"settings for each object/part?" msgstr "" "Dilimleme Parametre Tablosu\n" -"Bir tablodaki tüm nesneleri/parçaları görüntüleyebileceğinizi ve her nesne/parça için ayarları değiştirebileceğinizi biliyor muydunuz?" +"Bir tablodaki tüm nesneleri/parçaları görüntüleyebileceğinizi ve her nesne/" +"parça için ayarları değiştirebileceğinizi biliyor muydunuz?" #: resources/data/hints.ini: [hint:Split to Objects/Parts] msgid "" "Split to Objects/Parts\n" -"Did you know that you can split a big object into small ones for easy colorizing or printing?" +"Did you know that you can split a big object into small ones for easy " +"colorizing or printing?" msgstr "" "Nesnelere/Parçalara Böl\n" -"Kolayca renklendirmek veya yazdırmak için büyük bir nesneyi küçük nesnelere bölebileceğinizi biliyor muydunuz?" +"Kolayca renklendirmek veya yazdırmak için büyük bir nesneyi küçük nesnelere " +"bölebileceğinizi biliyor muydunuz?" #: resources/data/hints.ini: [hint:Subtract a Part] msgid "" "Subtract a Part\n" -"Did you know that you can subtract one mesh from another using the Negative part modifier? That way you can, for example, create easily resizable holes directly in Orca Slicer. Read more in the documentation." +"Did you know that you can subtract one mesh from another using the Negative " +"part modifier? That way you can, for example, create easily resizable holes " +"directly in Orca Slicer. Read more in the documentation." msgstr "" "Bir Parçayı Çıkar\n" -"Negatif parça değiştiriciyi kullanarak bir ağı diğerinden çıkarabileceğinizi biliyor muydunuz? Bu şekilde örneğin doğrudan Orca Slicer'da kolayca yeniden boyutlandırılabilen delikler oluşturabilirsiniz. Daha fazlasını belgelerde okuyun." +"Negatif parça değiştiriciyi kullanarak bir ağı diğerinden çıkarabileceğinizi " +"biliyor muydunuz? Bu şekilde örneğin doğrudan Orca Slicer'da kolayca yeniden " +"boyutlandırılabilen delikler oluşturabilirsiniz. Daha fazlasını belgelerde " +"okuyun." #: resources/data/hints.ini: [hint:STEP] msgid "" "STEP\n" -"Did you know that you can improve your print quality by slicing a STEP file instead of an STL?\n" -"Orca Slicer supports slicing STEP files, providing smoother results than a lower resolution STL. Give it a try!" +"Did you know that you can improve your print quality by slicing a STEP file " +"instead of an STL?\n" +"Orca Slicer supports slicing STEP files, providing smoother results than a " +"lower resolution STL. Give it a try!" msgstr "" "ADIM\n" -"STL yerine STEP dosyasını dilimleyerek baskı kalitenizi artırabileceğinizi biliyor muydunuz?\n" -"Orca Slicer, STEP dosyalarını dilimlemeyi destekleyerek daha düşük çözünürlüklü bir STL'ye göre daha düzgün sonuçlar sağlar. Bir şans ver!" +"STL yerine STEP dosyasını dilimleyerek baskı kalitenizi artırabileceğinizi " +"biliyor muydunuz?\n" +"Orca Slicer, STEP dosyalarını dilimlemeyi destekleyerek daha düşük " +"çözünürlüklü bir STL'ye göre daha düzgün sonuçlar sağlar. Bir şans ver!" #: resources/data/hints.ini: [hint:Z seam location] msgid "" "Z seam location\n" -"Did you know that you can customize the location of the Z seam, and even paint it on your print, to have it in a less visible location? This improves the overall look of your model. Check it out!" +"Did you know that you can customize the location of the Z seam, and even " +"paint it on your print, to have it in a less visible location? This improves " +"the overall look of your model. Check it out!" msgstr "" "Z dikiş konumu\n" -"Z dikişinin konumunu kişiselleştirebileceğinizi ve hatta daha az görünür bir konuma getirmek için baskının üzerine boyayabileceğinizi biliyor muydunuz? Bu, modelinizin genel görünümünü iyileştirir. Buna bir bak!" +"Z dikişinin konumunu kişiselleştirebileceğinizi ve hatta daha az görünür bir " +"konuma getirmek için baskının üzerine boyayabileceğinizi biliyor muydunuz? " +"Bu, modelinizin genel görünümünü iyileştirir. Buna bir bak!" #: resources/data/hints.ini: [hint:Fine-tuning for flow rate] msgid "" "Fine-tuning for flow rate\n" -"Did you know that flow rate can be fine-tuned for even better-looking prints? Depending on the material, you can improve the overall finish of the printed model by doing some fine-tuning." +"Did you know that flow rate can be fine-tuned for even better-looking " +"prints? Depending on the material, you can improve the overall finish of the " +"printed model by doing some fine-tuning." msgstr "" "Akış hızı için ince ayar\n" -"Baskıların daha da iyi görünmesi için akış hızına ince ayar yapılabileceğini biliyor muydunuz? Malzemeye bağlı olarak, bazı ince ayarlar yaparak yazdırılan modelin genel yüzeyini iyileştirebilirsiniz." +"Baskıların daha da iyi görünmesi için akış hızına ince ayar yapılabileceğini " +"biliyor muydunuz? Malzemeye bağlı olarak, bazı ince ayarlar yaparak " +"yazdırılan modelin genel yüzeyini iyileştirebilirsiniz." #: resources/data/hints.ini: [hint:Split your prints into plates] msgid "" "Split your prints into plates\n" -"Did you know that you can split a model that has a lot of parts into individual plates ready to print? This will simplify the process of keeping track of all the parts." +"Did you know that you can split a model that has a lot of parts into " +"individual plates ready to print? This will simplify the process of keeping " +"track of all the parts." msgstr "" "Baskılarınızı plakalara ayırın\n" -"Çok sayıda parçası olan bir modeli baskıya hazır ayrı kalıplara bölebileceğinizi biliyor muydunuz? Bu, tüm parçaları takip etme sürecini basitleştirecektir." +"Çok sayıda parçası olan bir modeli baskıya hazır ayrı kalıplara " +"bölebileceğinizi biliyor muydunuz? Bu, tüm parçaları takip etme sürecini " +"basitleştirecektir." -#: resources/data/hints.ini: [hint:Speed up your print with Adaptive Layer Height] +#: resources/data/hints.ini: [hint:Speed up your print with Adaptive Layer +#: Height] msgid "" "Speed up your print with Adaptive Layer Height\n" -"Did you know that you can print a model even faster, by using the Adaptive Layer Height option? Check it out!" +"Did you know that you can print a model even faster, by using the Adaptive " +"Layer Height option? Check it out!" msgstr "" "Uyarlanabilir Katman Yüksekliği ile baskınızı hızlandırın\n" -"Uyarlanabilir Katman Yüksekliği seçeneğini kullanarak bir modeli daha da hızlı yazdırabileceğinizi biliyor muydunuz? Buna bir bak!" +"Uyarlanabilir Katman Yüksekliği seçeneğini kullanarak bir modeli daha da " +"hızlı yazdırabileceğinizi biliyor muydunuz? Buna bir bak!" #: resources/data/hints.ini: [hint:Support painting] msgid "" "Support painting\n" -"Did you know that you can paint the location of your supports? This feature makes it easy to place the support material only on the sections of the model that actually need it." +"Did you know that you can paint the location of your supports? This feature " +"makes it easy to place the support material only on the sections of the " +"model that actually need it." msgstr "" "Destek boyama\n" -"Desteklerinizin yerini boyayabileceğinizi biliyor muydunuz? Bu özellik, destek malzemesinin yalnızca modelin gerçekten ihtiyaç duyulan bölümlerine yerleştirilmesini kolaylaştırır." +"Desteklerinizin yerini boyayabileceğinizi biliyor muydunuz? Bu özellik, " +"destek malzemesinin yalnızca modelin gerçekten ihtiyaç duyulan bölümlerine " +"yerleştirilmesini kolaylaştırır." #: resources/data/hints.ini: [hint:Different types of supports] msgid "" "Different types of supports\n" -"Did you know that you can choose from multiple types of supports? Tree supports work great for organic models, while saving filament and improving print speed. Check them out!" +"Did you know that you can choose from multiple types of supports? Tree " +"supports work great for organic models, while saving filament and improving " +"print speed. Check them out!" msgstr "" "Farklı destek türleri\n" -"Birden fazla destek türü arasından seçim yapabileceğinizi biliyor muydunuz? Ağaç destekleri organik modeller için harika çalışır, filamentten tasarruf sağlar ve baskı hızını artırır. Onlara bir göz atın!" +"Birden fazla destek türü arasından seçim yapabileceğinizi biliyor muydunuz? " +"Ağaç destekleri organik modeller için harika çalışır, filamentten tasarruf " +"sağlar ve baskı hızını artırır. Onlara bir göz atın!" #: resources/data/hints.ini: [hint:Printing Silk Filament] msgid "" "Printing Silk Filament\n" -"Did you know that Silk filament needs special consideration to print it successfully? Higher temperature and lower speed are always recommended for the best results." +"Did you know that Silk filament needs special consideration to print it " +"successfully? Higher temperature and lower speed are always recommended for " +"the best results." msgstr "" "İpek Filament Baskı\n" -"İpek filamanın başarılı bir şekilde basılabilmesi için özel dikkat gösterilmesi gerektiğini biliyor muydunuz? En iyi sonuçlar için her zaman daha yüksek sıcaklık ve daha düşük hız önerilir." +"İpek filamanın başarılı bir şekilde basılabilmesi için özel dikkat " +"gösterilmesi gerektiğini biliyor muydunuz? En iyi sonuçlar için her zaman " +"daha yüksek sıcaklık ve daha düşük hız önerilir." #: resources/data/hints.ini: [hint:Brim for better adhesion] msgid "" "Brim for better adhesion\n" -"Did you know that when printing models have a small contact interface with the printing surface, it's recommended to use a brim?" +"Did you know that when printing models have a small contact interface with " +"the printing surface, it's recommended to use a brim?" msgstr "" "Daha iyi yapışma için kenar\n" -"Baskı modellerinde baskı yüzeyi ile küçük bir temas arayüzü bulunduğunda siperlik kullanılması tavsiye edildiğini biliyor muydunuz?" +"Baskı modellerinde baskı yüzeyi ile küçük bir temas arayüzü bulunduğunda " +"siperlik kullanılması tavsiye edildiğini biliyor muydunuz?" #: resources/data/hints.ini: [hint:Set parameters for multiple objects] msgid "" "Set parameters for multiple objects\n" -"Did you know that you can set slicing parameters for all selected objects at one time?" +"Did you know that you can set slicing parameters for all selected objects at " +"one time?" msgstr "" "Birden çok nesne için parametreleri ayarlama\n" -"Seçilen tüm nesneler için dilimleme parametrelerini aynı anda ayarlayabileceğinizi biliyor muydunuz?" +"Seçilen tüm nesneler için dilimleme parametrelerini aynı anda " +"ayarlayabileceğinizi biliyor muydunuz?" #: resources/data/hints.ini: [hint:Stack objects] msgid "" @@ -10053,15 +12194,102 @@ msgstr "" #: resources/data/hints.ini: [hint:Flush into support/objects/infill] msgid "" "Flush into support/objects/infill\n" -"Did you know that you can save the wasted filament by flushing them into support/objects/infill during filament change?" +"Did you know that you can save the wasted filament by flushing them into " +"support/objects/infill during filament change?" msgstr "" "Desteğe/nesnelere/dolguya hizalayın\n" -"Filament değişimi sırasında, boşa harcanan filamanı desteğe/nesnelere/dolguya yıkayarak kurtarabileceğinizi biliyor muydunuz?" +"Filament değişimi sırasında, boşa harcanan filamanı desteğe/nesnelere/" +"dolguya yıkayarak kurtarabileceğinizi biliyor muydunuz?" #: resources/data/hints.ini: [hint:Improve strength] msgid "" "Improve strength\n" -"Did you know that you can use more wall loops and higher sparse infill density to improve the strength of the model?" +"Did you know that you can use more wall loops and higher sparse infill " +"density to improve the strength of the model?" msgstr "" "Gücü artırın\n" -"Modelin gücünü artırmak için daha fazla duvar halkası ve daha yüksek seyrek dolgu yoğunluğu kullanabileceğinizi biliyor muydunuz?" +"Modelin gücünü artırmak için daha fazla duvar halkası ve daha yüksek seyrek " +"dolgu yoğunluğu kullanabileceğinizi biliyor muydunuz?" + +#~ msgid "Total Time Estimation" +#~ msgstr "Toplam Süre Tahmini" + +#~ msgid "The 3mf is not from Bambu Lab, load geometry data only." +#~ msgstr "3mf, Bambu Lab'den değildir, yalnızca geometri verilerini yükleyin." + +#~ msgid "Bamabu Engineering Plate" +#~ msgstr "Bamabu Mühendislik Plakası" + +#~ msgid "High Temp Plate" +#~ msgstr "Tabla" + +#~ msgid "" +#~ "Bed temperature when high temperature plate is installed. Value 0 means " +#~ "the filament does not support to print on the High Temp Plate" +#~ msgstr "" +#~ "Yüksek sıcaklık plakası takıldığında yatak sıcaklığı. 0 değeri, " +#~ "filamentin Yüksek Sıcaklık Plakasına yazdırmayı desteklemediği anlamına " +#~ "gelir" + +#~ msgid "" +#~ "Klipper's max_accel_to_decel will be adjusted to this % of acceleration" +#~ msgstr "" +#~ "Klipper max_accel_to_decel değeri bu hızlanma % değerine ayarlanacaktır" + +#~ msgid "Maximum acceleration for travel (M204 T)" +#~ msgstr "Hareket için maksimum hızlanma (M204 T)" + +#~ msgid "" +#~ "Style and shape of the support. For normal support, projecting the " +#~ "supports into a regular grid will create more stable supports (default), " +#~ "while snug support towers will save material and reduce object scarring.\n" +#~ "For tree support, slim style will merge branches more aggressively and " +#~ "save a lot of material (default), while hybrid style will create similar " +#~ "structure to normal support under large flat overhangs." +#~ msgstr "" +#~ "Desteğin stili ve şekli. Normal destek için, desteklerin düzenli bir " +#~ "ızgaraya yansıtılması daha sağlam destekler oluşturur (varsayılan), rahat " +#~ "destek kuleleri ise malzemeden tasarruf sağlar ve nesne izlerini " +#~ "azaltır.\n" +#~ "Ağaç desteği için, ince stil, dalları daha agresif bir şekilde " +#~ "birleştirecek ve çok fazla malzeme tasarrufu sağlayacak (varsayılan), " +#~ "hibrit stil ise büyük düz çıkıntılar altında normal desteğe benzer yapı " +#~ "oluşturacaktır." + +#~ msgid "Send to print" +#~ msgstr "Baskıya gönder" + +#~ msgid "Error Message" +#~ msgstr "Hata mesajı" + +#~ msgid "Error uploading to print host:" +#~ msgstr "Ana bilgisayara yükleme hatası:" + +#~ msgid "" +#~ "Please input valid values:\n" +#~ "Start temp: <= 350\n" +#~ "End temp: >= 180\n" +#~ "Start temp > End temp + 5)" +#~ msgstr "" +#~ "Lütfen geçerli değerleri girin:\n" +#~ "Başlangıç sıcaklığı: <= 350\n" +#~ "Bitiş sıcaklığı: >= 180\n" +#~ "Başlangıç sıcaklığı > Bitiş sıcaklığı + 5)" + +#~ msgid "" +#~ "Please input valid values:\n" +#~ "start > 0 step >= 0\n" +#~ "end > start + step)" +#~ msgstr "" +#~ "Lütfen geçerli değerleri girin:\n" +#~ "başlangıç > 0 adım >= 0\n" +#~ "bitiş > başlangıç + adım)" + +#~ msgid "" +#~ "Please input valid values:\n" +#~ "start > 10 step >= 0\n" +#~ "end > start + step)" +#~ msgstr "" +#~ "Lütfen geçerli değerleri girin:\n" +#~ "başlangıç > 10 adım >= 0\n" +#~ "bitiş > başlangıç + adım)" diff --git a/localization/i18n/uk/OrcaSlicer_uk.po b/localization/i18n/uk/OrcaSlicer_uk.po index 7f678fe33c8..ff8850b52d2 100644 --- a/localization/i18n/uk/OrcaSlicer_uk.po +++ b/localization/i18n/uk/OrcaSlicer_uk.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-30 10:27+0800\n" +"POT-Creation-Date: 2023-10-11 22:28+0800\n" "PO-Revision-Date: 2023-08-10 20:25-0400\n" "Last-Translator: \n" "Language-Team: \n" @@ -4390,6 +4390,24 @@ msgstr "Настінні філаменти" msgid "Printer settings" msgstr "Налаштування принтера" +msgid "Remove current plate (if not last one)" +msgstr "" + +msgid "Auto orient objects on current plate" +msgstr "" + +msgid "Arrange objects on current plate" +msgstr "" + +msgid "Unlock current plate" +msgstr "" + +msgid "Lock current plate" +msgstr "" + +msgid "Customize current plate" +msgstr "" + msgid "Untitled" msgstr "Без імені" @@ -7229,6 +7247,19 @@ msgid "" "effect" msgstr "Усадка початкового шару на столі для компенсації ефекту слонової ноги" +msgid "Elephant foot compensation layers" +msgstr "" + +msgid "" +"The number of layers on which the elephant foot compensation will be active. " +"The first layer will be shrunk by the elephant foot compensation value, then " +"the next layers will be linearly shrunk less, up to the layer indicated by " +"this value." +msgstr "" + +msgid "layers" +msgstr "шари" + msgid "" "Slicing height for each layer. Smaller layer height means more accurate and " "more printing time" @@ -7785,9 +7816,6 @@ msgstr "" "Вентилятор охолодження першого шару був закритий, щоб покращити " "адгезіюРобочої пластини" -msgid "layers" -msgstr "шари" - msgid "Don't support bridges" msgstr "Не підтримувати мости" @@ -8891,6 +8919,9 @@ msgstr "Весь суцільний шар" msgid "Ironing Pattern" msgstr "" +msgid "The pattern that will be used when ironing" +msgstr "" + msgid "Ironing flow" msgstr "Плавний потік" @@ -8914,6 +8945,14 @@ msgstr "Швидкість розглажування" msgid "Print speed of ironing lines" msgstr "Швидкість друку прасувальних ліній" +msgid "Ironing angle" +msgstr "" + +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" + msgid "This gcode part is inserted at every layer change after lift z" msgstr "Ця частина gcode вставляється при кожній зміні шару після підйому z" @@ -10307,6 +10346,34 @@ msgstr "" "функція використовується для невеликої Корегування розміру, коли об'єкт має " "проблему складання" +msgid "Convert holes to polyholes" +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 " +"compute the polyhole.\n" +"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" +msgstr "" + +msgid "Polyhole detection margin" +msgstr "" + +#, c-format, boost-format +msgid "" +"Maximum defection of a point to the estimated radius of the circle.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" +"In mm or in % of the radius." +msgstr "" + +msgid "Polyhole twist" +msgstr "" + +msgid "Rotate the polyhole every layer." +msgstr "" + msgid "G-code thumbnails" msgstr "Мініатюри G-code" diff --git a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po index 932667cb279..22068e0f83c 100644 --- a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po +++ b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-30 10:27+0800\n" +"POT-Creation-Date: 2023-10-11 22:28+0800\n" "PO-Revision-Date: 2023-04-01 13:21+0800\n" "Last-Translator: Chun \n" "Language-Team: \n" @@ -4232,6 +4232,24 @@ msgstr "線材設置" msgid "Printer settings" msgstr "3D列印機設置" +msgid "Remove current plate (if not last one)" +msgstr "" + +msgid "Auto orient objects on current plate" +msgstr "" + +msgid "Arrange objects on current plate" +msgstr "" + +msgid "Unlock current plate" +msgstr "" + +msgid "Lock current plate" +msgstr "" + +msgid "Customize current plate" +msgstr "" + msgid "Untitled" msgstr "未命名" @@ -6934,6 +6952,19 @@ msgid "" "effect" msgstr "將首層收縮用於補償象腳效應" +msgid "Elephant foot compensation layers" +msgstr "" + +msgid "" +"The number of layers on which the elephant foot compensation will be active. " +"The first layer will be shrunk by the elephant foot compensation value, then " +"the next layers will be linearly shrunk less, up to the layer indicated by " +"this value." +msgstr "" + +msgid "layers" +msgstr "層" + msgid "" "Slicing height for each layer. Smaller layer height means more accurate and " "more printing time" @@ -7432,9 +7463,6 @@ msgid "" msgstr "" "對開始的一些層關閉所有的部件冷卻風扇。通常關閉首層冷卻用來獲得更好的熱床黏接" -msgid "layers" -msgstr "層" - msgid "Don't support bridges" msgstr "不支撐橋接" @@ -8414,6 +8442,9 @@ msgstr "所有實心層" msgid "Ironing Pattern" msgstr "熨燙模式" +msgid "The pattern that will be used when ironing" +msgstr "" + msgid "Ironing flow" msgstr "熨燙流量" @@ -8434,6 +8465,14 @@ msgstr "熨燙速度" msgid "Print speed of ironing lines" msgstr "熨燙的列印速度" +msgid "Ironing angle" +msgstr "" + +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" + msgid "This gcode part is inserted at every layer change after lift z" msgstr "在每次換層抬升Z高度之後插入這段G-code。" @@ -9731,6 +9770,34 @@ msgstr "" "模型外輪廓的尺寸將在X-Y方向收縮或拓展特定值。正值代表擴大。負值代表縮小。這個" "功能通常在模型有裝配問題時微調尺寸" +msgid "Convert holes to polyholes" +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 " +"compute the polyhole.\n" +"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" +msgstr "" + +msgid "Polyhole detection margin" +msgstr "" + +#, c-format, boost-format +msgid "" +"Maximum defection of a point to the estimated radius of the circle.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" +"In mm or in % of the radius." +msgstr "" + +msgid "Polyhole twist" +msgstr "" + +msgid "Rotate the polyhole every layer." +msgstr "" + msgid "G-code thumbnails" msgstr "G-code縮圖尺寸" diff --git a/localization/i18n/zh_cn/OrcaSlicer_zh_CN.po b/localization/i18n/zh_cn/OrcaSlicer_zh_CN.po index 97569d1c72f..9aeca24103a 100644 --- a/localization/i18n/zh_cn/OrcaSlicer_zh_CN.po +++ b/localization/i18n/zh_cn/OrcaSlicer_zh_CN.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Slic3rPE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-30 10:27+0800\n" +"POT-Creation-Date: 2023-10-11 22:28+0800\n" "PO-Revision-Date: 2023-04-01 13:21+0800\n" "Last-Translator: Jiang Yue \n" "Language-Team: \n" @@ -4232,6 +4232,24 @@ msgstr "耗材丝设置" msgid "Printer settings" msgstr "打印机设置" +msgid "Remove current plate (if not last one)" +msgstr "" + +msgid "Auto orient objects on current plate" +msgstr "" + +msgid "Arrange objects on current plate" +msgstr "" + +msgid "Unlock current plate" +msgstr "" + +msgid "Lock current plate" +msgstr "" + +msgid "Customize current plate" +msgstr "" + msgid "Untitled" msgstr "未命名" @@ -6931,6 +6949,19 @@ msgid "" "effect" msgstr "将首层收缩用于补偿象脚效应" +msgid "Elephant foot compensation layers" +msgstr "" + +msgid "" +"The number of layers on which the elephant foot compensation will be active. " +"The first layer will be shrunk by the elephant foot compensation value, then " +"the next layers will be linearly shrunk less, up to the layer indicated by " +"this value." +msgstr "" + +msgid "layers" +msgstr "层" + msgid "" "Slicing height for each layer. Smaller layer height means more accurate and " "more printing time" @@ -7429,9 +7460,6 @@ msgid "" msgstr "" "对开始的一些层关闭所有的部件冷却风扇。通常关闭首层冷却用来获得更好的热床粘接" -msgid "layers" -msgstr "层" - msgid "Don't support bridges" msgstr "不支撑桥接" @@ -8411,6 +8439,9 @@ msgstr "所有实心层" msgid "Ironing Pattern" msgstr "熨烫模式" +msgid "The pattern that will be used when ironing" +msgstr "" + msgid "Ironing flow" msgstr "熨烫流量" @@ -8431,6 +8462,14 @@ msgstr "熨烫速度" msgid "Print speed of ironing lines" msgstr "熨烫的打印速度" +msgid "Ironing angle" +msgstr "" + +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" + msgid "This gcode part is inserted at every layer change after lift z" msgstr "在每次换层抬升Z高度之后插入这段G-code。" @@ -9729,6 +9768,34 @@ msgstr "" "模型外轮廓的尺寸将在X-Y方向收缩或拓展特定值。正值代表扩大。负值代表缩小。这个" "功能通常在模型有装配问题时微调尺寸" +msgid "Convert holes to polyholes" +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 " +"compute the polyhole.\n" +"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" +msgstr "" + +msgid "Polyhole detection margin" +msgstr "" + +#, c-format, boost-format +msgid "" +"Maximum defection of a point to the estimated radius of the circle.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" +"In mm or in % of the radius." +msgstr "" + +msgid "Polyhole twist" +msgstr "" + +msgid "Rotate the polyhole every layer." +msgstr "" + msgid "G-code thumbnails" msgstr "G-code缩略图尺寸" diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp index 7f05287694c..a8a0a6eb0cb 100644 --- a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp @@ -1542,7 +1542,7 @@ void CalibrationPresetPage::set_cali_method(CalibrationMethod method) values.push_back(_L("0.005")); m_custom_range_panel->set_values(values); - m_custom_range_panel->set_unit(_L("")); + m_custom_range_panel->set_unit(""); m_custom_range_panel->Show(); } } diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index b3d51563636..dbadbe40a7c 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2835,12 +2835,12 @@ void TabFilament::build() optgroup->append_single_option_line("activate_air_filtration"); - line = {L("During print"), L("")}; + line = {L("During print"), ""}; line.append_option(optgroup->get_option("during_print_exhaust_fan_speed")); optgroup->append_line(line); - line = {L("Complete print"), L("")}; + line = {L("Complete print"), ""}; line.append_option(optgroup->get_option("complete_print_exhaust_fan_speed")); optgroup->append_line(line); //BBS From 72ddc7a430ba1f3cac85da7e89d03bf591f2483f Mon Sep 17 00:00:00 2001 From: SoftFever Date: Wed, 11 Oct 2023 23:10:22 +0800 Subject: [PATCH 10/18] fix bed axes --- src/slic3r/GUI/3DBed.cpp | 65 ++--------------------------------- src/slic3r/GUI/3DBed.hpp | 34 +----------------- src/slic3r/GUI/GLCanvas3D.cpp | 1 - src/slic3r/GUI/Plater.cpp | 4 +-- 4 files changed, 5 insertions(+), 99 deletions(-) diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 447519d3d64..1b06b31ea77 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -133,67 +133,6 @@ const float* GeometryBuffer::get_vertices_data() const return (m_vertices.size() > 0) ? (const float*)m_vertices.data() : nullptr; } -const float Bed3D::Axes::DefaultStemRadius = 0.5f; -const float Bed3D::Axes::DefaultStemLength = 25.0f; -const float Bed3D::Axes::DefaultTipRadius = 2.5f * Bed3D::Axes::DefaultStemRadius; -const float Bed3D::Axes::DefaultTipLength = 5.0f; - -std::array Bed3D::AXIS_X_COLOR = decode_color_to_float_array("#FF0000"); -std::array Bed3D::AXIS_Y_COLOR = decode_color_to_float_array("#00FF00"); -std::array Bed3D::AXIS_Z_COLOR = decode_color_to_float_array("#0000FF"); - -void Bed3D::update_render_colors() -{ - Bed3D::AXIS_X_COLOR = GLColor(RenderColor::colors[RenderCol_Axis_X]); - Bed3D::AXIS_Y_COLOR = GLColor(RenderColor::colors[RenderCol_Axis_Y]); - Bed3D::AXIS_Z_COLOR = GLColor(RenderColor::colors[RenderCol_Axis_Z]); -} - -void Bed3D::load_render_colors() -{ - RenderColor::colors[RenderCol_Axis_X] = IMColor(Bed3D::AXIS_X_COLOR); - RenderColor::colors[RenderCol_Axis_Y] = IMColor(Bed3D::AXIS_Y_COLOR); - RenderColor::colors[RenderCol_Axis_Z] = IMColor(Bed3D::AXIS_Z_COLOR); -} - -void Bed3D::Axes::render() -{ - auto render_axis = [this](const Transform3f& transform) { - glsafe(::glPushMatrix()); - glsafe(::glMultMatrixf(transform.data())); - m_arrow.render(); - glsafe(::glPopMatrix()); - }; - - if (!m_arrow.is_initialized()) - const_cast(&m_arrow)->init_from(stilized_arrow(16, DefaultTipRadius, DefaultTipLength, DefaultStemRadius, m_stem_length)); - - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); - if (shader == nullptr) - return; - - glsafe(::glEnable(GL_DEPTH_TEST)); - - shader->start_using(); - shader->set_uniform("emission_factor", 0.0f); - - // x axis - const_cast(&m_arrow)->set_color(AXIS_X_COLOR); - render_axis(Geometry::assemble_transform(m_origin, { 0.0, 0.5 * M_PI, 0.0 }).cast()); - - // y axis - const_cast(&m_arrow)->set_color(AXIS_Y_COLOR); - render_axis(Geometry::assemble_transform(m_origin, { -0.5 * M_PI, 0.0, 0.0 }).cast()); - - // z axis - const_cast(&m_arrow)->set_color(AXIS_Z_COLOR); - render_axis(Geometry::assemble_transform(m_origin).cast()); - - shader->stop_using(); - - glsafe(::glDisable(GL_DEPTH_TEST)); -} - //BBS: add part plate logic bool Bed3D::set_shape(const Pointfs& printable_area, const double printable_height, const std::string& custom_model, bool force_as_custom, const Vec2d position, bool with_reset) @@ -407,7 +346,7 @@ BoundingBoxf3 Bed3D::calc_extended_bounding_box(bool consider_model_offset) cons Vec3d offset{ m_position.x(), m_position.y(), 0.f }; //out.merge(m_axes.get_origin() + offset + m_axes.get_total_length() * Vec3d::Ones()); out.merge(Vec3d(0.f, 0.f, GROUND_Z) + offset + m_axes.get_total_length() * Vec3d::Ones()); - out.merge(out.min + Vec3d(-Axes::DefaultTipRadius, -Axes::DefaultTipRadius, out.max.z())); + out.merge(out.min + Vec3d(-m_axes.get_tip_radius(), -m_axes.get_tip_radius(), out.max.z())); //BBS: add part plate related logic. if (consider_model_offset) { // extend to contain model, if any @@ -489,7 +428,7 @@ std::tuple Bed3D::detect_type(const Point void Bed3D::render_axes() { if (m_build_volume.valid()) - m_axes.render(); + m_axes.render(Transform3d::Identity(), 0.25f); } void Bed3D::render_system(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom) diff --git a/src/slic3r/GUI/3DBed.hpp b/src/slic3r/GUI/3DBed.hpp index 8140b71355b..7a466b806a9 100644 --- a/src/slic3r/GUI/3DBed.hpp +++ b/src/slic3r/GUI/3DBed.hpp @@ -42,38 +42,6 @@ class GeometryBuffer class Bed3D { -public: - static std::array AXIS_X_COLOR; - static std::array AXIS_Y_COLOR; - static std::array AXIS_Z_COLOR; - - static void update_render_colors(); - static void load_render_colors(); - - class Axes - { - public: - static const float DefaultStemRadius; - static const float DefaultStemLength; - static const float DefaultTipRadius; - static const float DefaultTipLength; - - private: - Vec3d m_origin{ Vec3d::Zero() }; - float m_stem_length{ DefaultStemLength }; - GLModel m_arrow; - - public: - const Vec3d& get_origin() const { return m_origin; } - void set_origin(const Vec3d& origin) { m_origin = origin; } - void set_stem_length(float length) { - m_stem_length = length; - m_arrow.reset(); - } - float get_total_length() const { return m_stem_length + DefaultTipLength; } - void render(); - }; - public: enum class Type : unsigned char { @@ -100,7 +68,7 @@ class Bed3D PickingModel m_model; Vec3d m_model_offset{ Vec3d::Zero() }; unsigned int m_vbo_id{ 0 }; - Axes m_axes; + CoordAxes m_axes; float m_scale_factor{ 1.0f }; //BBS: add part plate related logic diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 05c5e93f0b2..3b9c4c8defe 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -7305,7 +7305,6 @@ void GLCanvas3D::_render_style_editor() PartPlate::update_render_colors(); GLGizmoBase::update_render_colors(); GLCanvas3D::update_render_colors(); - Bed3D::update_render_colors(); } ImGui::SameLine(0.0f, 3.0f); ImGui::TextUnformatted(name); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index c7619866f49..b78c62e9d97 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3244,7 +3244,7 @@ std::vector Plater::priv::load_files(const std::vector& input_ if (load_config) { if (translate_old) { //set the size back - partplate_list.reset_size(current_width + Bed3D::Axes::DefaultTipRadius, current_depth + Bed3D::Axes::DefaultTipRadius, current_height, false); + partplate_list.reset_size(current_width + CoordAxes::DefaultTipRadius, current_depth + CoordAxes::DefaultTipRadius, current_height, false); } partplate_list.load_from_3mf_structure(plate_data); partplate_list.update_slice_context_to_current_plate(background_process); @@ -7131,7 +7131,7 @@ void Plater::priv::set_bed_shape(const Pointfs& shape, const Pointfs& exclude_ar double z = config->opt_float("printable_height"); //Pointfs& exclude_areas = config->option("bed_exclude_area")->values; - partplate_list.reset_size(max.x() - min.x() - Bed3D::Axes::DefaultTipRadius, max.y() - min.y() - Bed3D::Axes::DefaultTipRadius, z); + partplate_list.reset_size(max.x() - min.x() - CoordAxes::DefaultTipRadius, max.y() - min.y() - CoordAxes::DefaultTipRadius, z); partplate_list.set_shapes(shape, exclude_areas, custom_texture, height_to_lid, height_to_rod); Vec2d new_shape_position = partplate_list.get_current_shape_position(); From a42f82a63dc03c030fc5cf24f2eb7c4ad9764c97 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Thu, 12 Oct 2023 22:04:14 +0800 Subject: [PATCH 11/18] fix bugs --- resources/shaders/flat.fs | 8 + resources/shaders/flat.vs | 11 ++ resources/shaders/flat_clip.fs | 15 ++ resources/shaders/flat_clip.vs | 23 +++ resources/shaders/flat_texture.fs | 10 ++ resources/shaders/flat_texture.vs | 15 ++ src/slic3r/GUI/3DScene.cpp | 17 ++- src/slic3r/GUI/3DScene.hpp | 3 +- src/slic3r/GUI/GCodeViewer.cpp | 149 +++++++++++++------ src/slic3r/GUI/GLCanvas3D.cpp | 8 +- src/slic3r/GUI/GLShadersManager.cpp | 1 + src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 7 + 12 files changed, 211 insertions(+), 56 deletions(-) create mode 100644 resources/shaders/flat.fs create mode 100644 resources/shaders/flat.vs create mode 100644 resources/shaders/flat_clip.fs create mode 100644 resources/shaders/flat_clip.vs create mode 100644 resources/shaders/flat_texture.fs create mode 100644 resources/shaders/flat_texture.vs diff --git a/resources/shaders/flat.fs b/resources/shaders/flat.fs new file mode 100644 index 00000000000..ab656998df7 --- /dev/null +++ b/resources/shaders/flat.fs @@ -0,0 +1,8 @@ +#version 110 + +uniform vec4 uniform_color; + +void main() +{ + gl_FragColor = uniform_color; +} diff --git a/resources/shaders/flat.vs b/resources/shaders/flat.vs new file mode 100644 index 00000000000..d9063f0c70e --- /dev/null +++ b/resources/shaders/flat.vs @@ -0,0 +1,11 @@ +#version 110 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +attribute vec3 v_position; + +void main() +{ + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/flat_clip.fs b/resources/shaders/flat_clip.fs new file mode 100644 index 00000000000..ececb8eb1ae --- /dev/null +++ b/resources/shaders/flat_clip.fs @@ -0,0 +1,15 @@ +#version 110 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + +uniform vec4 uniform_color; + +varying vec3 clipping_planes_dots; + +void main() +{ + if (any(lessThan(clipping_planes_dots, ZERO))) + discard; + + gl_FragColor = uniform_color; +} diff --git a/resources/shaders/flat_clip.vs b/resources/shaders/flat_clip.vs new file mode 100644 index 00000000000..cdf7d4b3b2c --- /dev/null +++ b/resources/shaders/flat_clip.vs @@ -0,0 +1,23 @@ +#version 110 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat4 volume_world_matrix; + +// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane. +uniform vec2 z_range; +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; + +attribute vec3 v_position; + +varying vec3 clipping_planes_dots; + +void main() +{ + // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. + vec4 world_pos = volume_world_matrix * vec4(v_position, 1.0); + clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); + + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/flat_texture.fs b/resources/shaders/flat_texture.fs new file mode 100644 index 00000000000..ffe193b1c00 --- /dev/null +++ b/resources/shaders/flat_texture.fs @@ -0,0 +1,10 @@ +#version 110 + +uniform sampler2D uniform_texture; + +varying vec2 tex_coord; + +void main() +{ + gl_FragColor = texture2D(uniform_texture, tex_coord); +} diff --git a/resources/shaders/flat_texture.vs b/resources/shaders/flat_texture.vs new file mode 100644 index 00000000000..dc4868b04df --- /dev/null +++ b/resources/shaders/flat_texture.vs @@ -0,0 +1,15 @@ +#version 110 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +attribute vec3 v_position; +attribute vec2 v_tex_coord; + +varying vec2 tex_coord; + +void main() +{ + tex_coord = v_tex_coord; + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 1b644a98a3e..af366ffb046 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -1284,9 +1284,12 @@ int GLVolumeCollection::get_selection_support_threshold_angle(bool &enable_suppo return support_threshold_angle ; } -//BBS: add outline drawing logic -void GLVolumeCollection::render( - GLVolumeCollection::ERenderType type, bool disable_cullface, const Transform3d &view_matrix, std::function filter_func, bool with_outline) const +void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, + bool disable_cullface, + const Transform3d &view_matrix, + const Transform3d &projection_matrix, + std::function filter_func, + bool with_outline) const { GLVolumeWithIdAndZList to_render = volumes_to_render(volumes, type, view_matrix, filter_func); if (to_render.empty()) @@ -1306,6 +1309,8 @@ void GLVolumeCollection::render( glsafe(::glDisable(GL_CULL_FACE)); for (GLVolumeWithIdAndZ& volume : to_render) { + const Transform3d& world_matrix = volume.first->world_matrix(); + #if ENABLE_MODIFIERS_ALWAYS_TRANSPARENT if (type == ERenderType::Transparent) { volume.first->force_transparent = true; @@ -1360,7 +1365,11 @@ void GLVolumeCollection::render( float normal_z = -::cos(Geometry::deg2rad((float) support_threshold_angle)); - shader->set_uniform("volume_world_matrix", volume.first->world_matrix()); + const Transform3d model_matrix = world_matrix; + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); + shader->set_uniform("projection_matrix", projection_matrix); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); shader->set_uniform("slope.actived", m_slope.isGlobalActive && !volume.first->is_modifier && !volume.first->is_wipe_tower); shader->set_uniform("slope.volume_world_normal_matrix", static_cast(volume.first->world_matrix().matrix().block(0, 0, 3, 3).inverse().transpose().cast())); shader->set_uniform("slope.normal_z", normal_z); diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index cde588dae36..7499a4e87d6 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -668,10 +668,11 @@ class GLVolumeCollection int get_selection_support_threshold_angle(bool&) const; // Render the volumes by OpenGL. - //BBS: add outline drawing logic + //Orca: support new shader and add outline drawing logic void render(ERenderType type, bool disable_cullface, const Transform3d & view_matrix, + const Transform3d &projection_matrix, std::function filter_func = std::function(), bool with_outline = true) const; diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 5aed6b8ef13..eacd93471b2 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -3923,9 +3923,9 @@ void GCodeViewer::render_toolpaths() }; #if ENABLE_GCODE_VIEWER_STATISTICS - auto render_as_batched_model = [this](TBuffer& buffer, GLShaderProgram& shader) { + auto render_as_batched_model = [this](TBuffer& buffer, GLShaderProgram& shader, int position_id, int normal_id) { #else - auto render_as_batched_model = [](TBuffer& buffer, GLShaderProgram& shader) { + auto render_as_batched_model = [](TBuffer& buffer, GLShaderProgram& shader, int position_id, int normal_id) { #endif // ENABLE_GCODE_VIEWER_STATISTICS struct Range @@ -3935,30 +3935,38 @@ void GCodeViewer::render_toolpaths() bool intersects(const Range& other) const { return (other.last < first || other.first > last) ? false : true; } }; Range buffer_range = { 0, 0 }; - size_t indices_per_instance = buffer.model.data.indices_count(); + const size_t indices_per_instance = buffer.model.data.indices_count(); for (size_t j = 0; j < buffer.indices.size(); ++j) { const IBuffer& i_buffer = buffer.indices[j]; buffer_range.last = buffer_range.first + i_buffer.count / indices_per_instance; +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(i_buffer.vao)); +#endif // ENABLE_GL_CORE_PROFILE glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); - glsafe(::glVertexPointer(buffer.vertices.position_size_floats(), GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - bool has_normals = buffer.vertices.normal_size_floats() > 0; + if (position_id != -1) { + glsafe(::glVertexAttribPointer(position_id, buffer.vertices.position_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); + glsafe(::glEnableVertexAttribArray(position_id)); + } + const bool has_normals = buffer.vertices.normal_size_floats() > 0; if (has_normals) { - glsafe(::glNormalPointer(GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); + if (normal_id != -1) { + glsafe(::glVertexAttribPointer(normal_id, buffer.vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); + glsafe(::glEnableVertexAttribArray(normal_id)); + } } glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); for (auto& range : buffer.model.instances.render_ranges.ranges) { - Range range_range = { range.offset, range.offset + range.count }; + const Range range_range = { range.offset, range.offset + range.count }; if (range_range.intersects(buffer_range)) { shader.set_uniform("uniform_color", range.color); - unsigned int offset = (range_range.first > buffer_range.first) ? range_range.first - buffer_range.first : 0; - size_t offset_bytes = static_cast(offset) * indices_per_instance * sizeof(IBufferType); - Range render_range = { std::max(range_range.first, buffer_range.first), std::min(range_range.last, buffer_range.last) }; - size_t count = static_cast(render_range.last - render_range.first) * indices_per_instance; + const unsigned int offset = (range_range.first > buffer_range.first) ? range_range.first - buffer_range.first : 0; + const size_t offset_bytes = static_cast(offset) * indices_per_instance * sizeof(IBufferType); + const Range render_range = { std::max(range_range.first, buffer_range.first), std::min(range_range.last, buffer_range.last) }; + const size_t count = static_cast(render_range.last - render_range.first) * indices_per_instance; if (count > 0) { glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)count, GL_UNSIGNED_SHORT, (const void*)offset_bytes)); #if ENABLE_GCODE_VIEWER_STATISTICS @@ -3970,11 +3978,15 @@ void GCodeViewer::render_toolpaths() glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - if (has_normals) - glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); - - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); + if (normal_id != -1) + glsafe(::glDisableVertexAttribArray(normal_id)); + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE buffer_range.first = buffer_range.last; } @@ -3997,14 +4009,21 @@ void GCodeViewer::render_toolpaths() if (shader != nullptr) { shader->start_using(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("view_normal_matrix", (Matrix3d)Matrix3d::Identity()); + if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::InstancedModel) { shader->set_uniform("emission_factor", 0.25f); render_as_instanced_model(buffer, *shader); shader->set_uniform("emission_factor", 0.0f); + } else if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) { shader->set_uniform("emission_factor", 0.25f); - render_as_batched_model(buffer, *shader); + const int position_id = shader->get_attrib_location("v_position"); + const int normal_id = shader->get_attrib_location("v_normal"); + render_as_batched_model(buffer, *shader, position_id, normal_id); shader->set_uniform("emission_factor", 0.0f); } else { @@ -4013,7 +4032,11 @@ void GCodeViewer::render_toolpaths() case TBuffer::ERenderPrimitiveType::Line: shader_init_as_lines(*shader); break; default: break; } - int uniform_color = shader->get_uniform_location("uniform_color"); + + shader->set_uniform("emission_factor", 0.15f); + const int position_id = shader->get_attrib_location("v_position"); + const int normal_id = shader->get_attrib_location("v_normal"); + const int uniform_color = shader->get_uniform_location("uniform_color"); auto it_path = buffer.render_paths.rbegin(); //BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(":buffer indices size %1%, render_path size %2% ")%buffer.indices.size() %buffer.render_paths.size(); unsigned int indices_count = static_cast(buffer.indices.size()); @@ -4031,8 +4054,10 @@ void GCodeViewer::render_toolpaths() glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); bool has_normals = buffer.vertices.normal_size_floats() > 0; if (has_normals) { - glsafe(::glNormalPointer(GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); + if (normal_id != -1) { + glsafe(::glVertexAttribPointer(normal_id, buffer.vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); + glsafe(::glEnableVertexAttribArray(normal_id)); + } } glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); @@ -4058,8 +4083,10 @@ void GCodeViewer::render_toolpaths() glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - if (has_normals) - glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); + if (normal_id != -1) + glsafe(::glDisableVertexAttribArray(normal_id)); + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); @@ -4071,42 +4098,64 @@ void GCodeViewer::render_toolpaths() } #if ENABLE_GCODE_VIEWER_STATISTICS - auto render_sequential_range_cap = [this] + auto render_sequential_range_cap = [this, &camera] #else - auto render_sequential_range_cap = [] + auto render_sequential_range_cap = [&camera] #endif // ENABLE_GCODE_VIEWER_STATISTICS (const SequentialRangeCap& cap) { - GLShaderProgram* shader = wxGetApp().get_shader(cap.buffer->shader.c_str()); - if (shader != nullptr) { - shader->start_using(); + const TBuffer* buffer = cap.buffer; + GLShaderProgram* shader = wxGetApp().get_shader(buffer->shader.c_str()); + if (shader == nullptr) + return; - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, cap.vbo)); - glsafe(::glVertexPointer(cap.buffer->vertices.position_size_floats(), GL_FLOAT, cap.buffer->vertices.vertex_size_bytes(), (const void*)cap.buffer->vertices.position_offset_bytes())); - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - bool has_normals = cap.buffer->vertices.normal_size_floats() > 0; - if (has_normals) { - glsafe(::glNormalPointer(GL_FLOAT, cap.buffer->vertices.vertex_size_bytes(), (const void*)cap.buffer->vertices.normal_offset_bytes())); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); + shader->start_using(); + + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("view_normal_matrix", (Matrix3d)Matrix3d::Identity()); + + const int position_id = shader->get_attrib_location("v_position"); + const int normal_id = shader->get_attrib_location("v_normal"); + +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(cap.vao)); +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, cap.vbo)); + if (position_id != -1) { + glsafe(::glVertexAttribPointer(position_id, buffer->vertices.position_size_floats(), GL_FLOAT, GL_FALSE, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.position_offset_bytes())); + glsafe(::glEnableVertexAttribArray(position_id)); + } + const bool has_normals = buffer->vertices.normal_size_floats() > 0; + if (has_normals) { + if (normal_id != -1) { + glsafe(::glVertexAttribPointer(normal_id, buffer->vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.normal_offset_bytes())); + glsafe(::glEnableVertexAttribArray(normal_id)); } + } - shader->set_uniform("uniform_color", cap.color); + shader->set_uniform("uniform_color", cap.color); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cap.ibo)); - glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)cap.indices_count(), GL_UNSIGNED_SHORT, nullptr)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cap.ibo)); + glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)cap.indices_count(), GL_UNSIGNED_SHORT, nullptr)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); #if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.gl_triangles_calls_count; + ++m_statistics.gl_triangles_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS - if (has_normals) - glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); + if (normal_id != -1) + glsafe(::glDisableVertexAttribArray(normal_id)); + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE - shader->stop_using(); - } + shader->stop_using(); }; for (unsigned int i = 0; i < 2; ++i) { @@ -4138,8 +4187,12 @@ void GCodeViewer::render_shells() // glsafe(::glDepthMask(GL_FALSE)); shader->start_using(); - //BBS: reopen cul faces - m_shells.volumes.render(GLVolumeCollection::ERenderType::Transparent, false, wxGetApp().plater()->get_camera().get_view_matrix()); + //reopen cul faces + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("emission_factor", 0.1f); + m_shells.volumes.render(GLVolumeCollection::ERenderType::Transparent, false, camera.get_view_matrix(), camera.get_projection_matrix()); + shader->set_uniform("emission_factor", 0.0f); + shader->stop_using(); // glsafe(::glDepthMask(GL_TRUE)); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 3b9c4c8defe..af4a7653979 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -6903,9 +6903,10 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type, bool with GLGizmosManager& gm = get_gizmos_manager(); if (dynamic_cast(gm.get_current()) == nullptr) { + const Camera& camera = wxGetApp().plater()->get_camera(); if (m_picking_enabled && m_layers_editing.is_enabled() && (m_layers_editing.last_object_id != -1) && (m_layers_editing.object_max_z() > 0.0f)) { int object_id = m_layers_editing.last_object_id; - m_volumes.render(type, false, wxGetApp().plater()->get_camera().get_view_matrix(), [object_id](const GLVolume& volume) { + m_volumes.render(type, false, camera.get_view_matrix(), camera.get_projection_matrix(), [object_id](const GLVolume& volume) { // Which volume to paint without the layer height profile shader? return volume.is_active && (volume.is_modifier || volume.composite_id.object_id != object_id); }); @@ -6920,7 +6921,7 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type, bool with }*/ //BBS:add assemble view related logic // do not cull backfaces to show broken geometry, if any - m_volumes.render(type, m_picking_enabled, wxGetApp().plater()->get_camera().get_view_matrix(), [this, canvas_type](const GLVolume& volume) { + m_volumes.render(type, m_picking_enabled, camera.get_view_matrix(), camera.get_projection_matrix(), [this, canvas_type](const GLVolume& volume) { if (canvas_type == ECanvasType::CanvasAssembleView) { return !volume.is_modifier && !volume.is_wipe_tower; } @@ -6953,7 +6954,8 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type, bool with shader->set_uniform("show_wireframe", false); }*/ //BBS:add assemble view related logic - m_volumes.render(type, false, wxGetApp().plater()->get_camera().get_view_matrix(), [this, canvas_type](const GLVolume& volume) { + const Camera& camera = wxGetApp().plater()->get_camera(); + m_volumes.render(type, false, camera.get_view_matrix(), camera.get_projection_matrix(), [this, canvas_type](const GLVolume& volume) { if (canvas_type == ECanvasType::CanvasAssembleView) { return !volume.is_modifier; } diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index 107fcb5627f..43d68fbab5b 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -46,6 +46,7 @@ std::pair GLShadersManager::init() valid &= append_shader("gouraud_light_instanced", { "gouraud_light_instanced.vs", "gouraud_light_instanced.fs" }); // used to render extrusion and travel paths as lines in gcode preview valid &= append_shader("toolpaths_lines", { "toolpaths_lines.vs", "toolpaths_lines.fs" }); + valid &= append_shader("flat", { "flat.vs", "flat.fs" }); // used to render objects in 3d editor //if (GUI::wxGetApp().is_gl_version_greater_or_equal_to(3, 0)) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index f7bff0faf58..a59cea64444 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -100,6 +100,13 @@ void GLGizmoPainterBase::render_triangles(const Selection& selection) const if (is_left_handed) glsafe(::glFrontFace(GL_CW)); + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("view_model_matrix", view_matrix * trafo_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * trafo_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); + glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(trafo_matrix.data())); From ec41d4adcd1212aadfa9429cc75675e28dc0a375 Mon Sep 17 00:00:00 2001 From: ZdDroid <43038779+ZdDroid@users.noreply.github.com> Date: Thu, 12 Oct 2023 22:49:39 +0800 Subject: [PATCH 12/18] =?UTF-8?q?=E9=80=89=E6=8B=A9=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E6=9C=BA=E5=A2=9E=E5=8A=A0=E5=85=B3=E9=94=AE=E5=AD=97=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=20(#2392)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 选择打印机增加关键字搜索 * revert more format changes --------- Co-authored-by: ZdDroid <601865048@qq.com> Co-authored-by: SoftFever --- resources/web/guide/24/24.js | 13 ++++--- resources/web/guide/24/index.html | 60 +++++++++++++------------------ 2 files changed, 34 insertions(+), 39 deletions(-) diff --git a/resources/web/guide/24/24.js b/resources/web/guide/24/24.js index b7e16b7850e..52e8ff0e374 100644 --- a/resources/web/guide/24/24.js +++ b/resources/web/guide/24/24.js @@ -46,15 +46,15 @@ function HandleModelList(pVal) { if (!pVal.hasOwnProperty("model")) return; - pModel = pVal['model']; - + pModel = pVal['model']; + let nTotal = pModel.length; let ModelHtml = {}; for (let n = 0; n < nTotal; n++) { let OneModel = pModel[n]; - + let strVendor = OneModel['vendor']; - + //Add Vendor Html Node if ($(".OneVendorBlock[vendor='" + strVendor + "']").length == 0) { let sVV = strVendor; @@ -228,6 +228,11 @@ function FilterModelList(keyword) { TranslatePage(); } +function SelectPrinterAll( sVendor ) +{ + $("input[vendor='"+sVendor+"']").prop("checked", true); +} + function SelectPrinterAll(sVendor) { $("input[vendor='" + sVendor + "']").prop("checked", true); diff --git a/resources/web/guide/24/index.html b/resources/web/guide/24/index.html index d4c66983698..082c5dd5110 100644 --- a/resources/web/guide/24/index.html +++ b/resources/web/guide/24/index.html @@ -2,31 +2,31 @@ - - - 引导_P21 - - - - - - - - - - + + +引导_P21 + + + + + + + + + + -
-
Printer Selection
-
-
- +
+
Printer Selection
+
+
+ -
+
+
+ - + -
Printer Selection
-
- -
-
+
- - + +
+
+
Confirm
+
Cancel
+
+ +
+
+
error
+
+
At least one printer must be selected.
+
+
ok
-
-
Confirm
-
Cancel
+ document.onkeydown = function (event) { + var e = event || window.event || arguments.callee.caller.arguments[0]; + + if (e.keyCode == 27) + ClosePage(); - \ No newline at end of file + if (window.event) { + try { e.keyCode = 0; } catch (e) { } + e.returnValue = false; + } + }; + + From 39bd4e87d1b2514900b024e0f5a8061fba648b80 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Thu, 19 Oct 2023 00:32:48 +0800 Subject: [PATCH 18/18] fix windows build --- src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp | 31 ++++---------------- 1 file changed, 6 insertions(+), 25 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp index 604ce3b32c0..89640471c0e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp @@ -28,31 +28,12 @@ const float UndefFloat = -999.f; // connector colors -using ColorRGBA = std::array; - -static const ColorRGBA BLACK() { return {0.0f, 0.0f, 0.0f, 1.0f}; } -static const ColorRGBA BLUE() { return {0.0f, 0.0f, 1.0f, 1.0f}; } -static const ColorRGBA BLUEISH() { return {0.5f, 0.5f, 1.0f, 1.0f}; } -static const ColorRGBA CYAN() { return {0.0f, 1.0f, 1.0f, 1.0f}; } -static const ColorRGBA DARK_GRAY() { return {0.25f, 0.25f, 0.25f, 1.0f}; } -static const ColorRGBA DARK_YELLOW() { return {0.5f, 0.5f, 0.0f, 1.0f}; } -static const ColorRGBA GRAY() { return {0.5f, 0.5f, 0.5f, 1.0f}; } -static const ColorRGBA GREEN() { return {0.0f, 1.0f, 0.0f, 1.0f}; } -static const ColorRGBA GREENISH() { return {0.5f, 1.0f, 0.5f, 1.0f}; } -static const ColorRGBA LIGHT_GRAY() { return {0.75f, 0.75f, 0.75f, 1.0f}; } -static const ColorRGBA MAGENTA() { return {1.0f, 0.0f, 1.0f, 1.0f}; } -static const ColorRGBA ORANGE() { return {0.923f, 0.504f, 0.264f, 1.0f}; } -static const ColorRGBA RED() { return {1.0f, 0.0f, 0.0f, 1.0f}; } -static const ColorRGBA REDISH() { return {1.0f, 0.5f, 0.5f, 1.0f}; } -static const ColorRGBA YELLOW() { return {1.0f, 1.0f, 0.0f, 1.0f}; } -static const ColorRGBA WHITE() { return {1.0f, 1.0f, 1.0f, 1.0f}; } - -static const ColorRGBA PLAG_COLOR = YELLOW(); -static const ColorRGBA DOWEL_COLOR = DARK_YELLOW(); -static const ColorRGBA HOVERED_PLAG_COLOR = CYAN(); +static const ColorRGBA PLAG_COLOR = ColorRGBA::YELLOW(); +static const ColorRGBA DOWEL_COLOR = ColorRGBA::DARK_YELLOW(); +static const ColorRGBA HOVERED_PLAG_COLOR = ColorRGBA::CYAN(); static const ColorRGBA HOVERED_DOWEL_COLOR = {0.0f, 0.5f, 0.5f, 1.0f}; -static const ColorRGBA SELECTED_PLAG_COLOR = GRAY(); -static const ColorRGBA SELECTED_DOWEL_COLOR = GRAY(); // DARK_GRAY(); +static const ColorRGBA SELECTED_PLAG_COLOR = ColorRGBA::GRAY(); +static const ColorRGBA SELECTED_DOWEL_COLOR = ColorRGBA::GRAY(); // DARK_GRAY(); static const ColorRGBA CONNECTOR_DEF_COLOR = {1.0f, 1.0f, 1.0f, 0.5f}; static const ColorRGBA CONNECTOR_ERR_COLOR = {1.0f, 0.3f, 0.3f, 0.5f}; static const ColorRGBA HOVERED_ERR_COLOR = {1.0f, 0.3f, 0.3f, 1.0f}; @@ -954,7 +935,7 @@ void GLGizmoAdvancedCut::render_connectors() const Transform3d view_model_matrix = translate_tf * m_rotate_matrix * scale_tf; - render_connector_model(m_shapes[connector.attribs], render_color, view_model_matrix); + render_connector_model(m_shapes[connector.attribs], render_color.data_array(), view_model_matrix); } }