diff --git a/CMakeLists.txt b/CMakeLists.txt
index 47a4fba3cb..40fe0d0918 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -411,12 +411,14 @@ if(SLIC3R_STATIC)
set(Boost_USE_STATIC_LIBS ON)
# Use boost libraries linked statically to the C++ runtime.
# set(Boost_USE_STATIC_RUNTIME ON)
+else()
+ add_definitions(-DBOOST_LOG_DYN_LINK)
endif()
#set(Boost_DEBUG ON)
# set(Boost_COMPILER "-mgw81")
# boost::process was introduced first in version 1.64.0,
# boost::beast::detail::base64 was introduced first in version 1.66.0
-find_package(Boost 1.66 REQUIRED COMPONENTS system filesystem thread log locale regex chrono atomic date_time iostreams program_options)
+find_package(Boost 1.66 REQUIRED COMPONENTS system filesystem thread log log_setup locale regex chrono atomic date_time iostreams program_options)
add_library(boost_libs INTERFACE)
add_library(boost_headeronly INTERFACE)
diff --git a/DockerBuild.sh b/DockerBuild.sh
index 18b7777bf8..99c499b526 100755
--- a/DockerBuild.sh
+++ b/DockerBuild.sh
@@ -2,7 +2,6 @@
PROJECT_ROOT=$(cd -P -- "$(dirname -- "$0")" && printf '%s\n' "$(pwd -P)")
set -x
-
# Wishlist hint: For developers, creating a Docker Compose
# setup with persistent volumes for the build & deps directories
# would speed up recompile times significantly. For end users,
diff --git a/DockerRun.sh b/DockerRun.sh
index c06628e6be..c05022b1b8 100755
--- a/DockerRun.sh
+++ b/DockerRun.sh
@@ -5,6 +5,8 @@ set -x
# -h $HOSTNAME \
# If there's problems with the X display, try this
# -v /tmp/.X11-unix:/tmp/.X11-unix \
+# If you get an error like "Authorization required, but no authorization protocol specified," run line 9 in your terminal before rerunning this program
+# xhost +local:docker
docker run \
`# Use the hosts networking. Printer wifi and also dbus communication` \
--net=host \
diff --git a/Dockerfile b/Dockerfile
index 868779b0af..3e8a33f3fb 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -68,14 +68,14 @@ WORKDIR OrcaSlicer
RUN ./BuildLinux.sh -u
# Build dependencies in ./deps
-RUN ./BuildLinux.sh -d
+RUN ./BuildLinux.sh -dr
# Build slic3r
-RUN ./BuildLinux.sh -s
+RUN ./BuildLinux.sh -sr
# Build AppImage
ENV container podman
-RUN ./BuildLinux.sh -i
+RUN ./BuildLinux.sh -ir
# It's easier to run Orca Slicer as the same username,
# UID and GID as your workstation. Since we bind mount
diff --git a/README.md b/README.md
index 88f587db95..4db8501db4 100644
--- a/README.md
+++ b/README.md
@@ -103,11 +103,19 @@ Explore the latest developments in Orca Slicer with our nightly builds. Feedback
- Run => Options tab => Document Versions: uncheck `Allow debugging when browsing versions`
- menu bar: Product => Run
-- Ubuntu
- - Dependencies **Will be auto-installed with the shell script**: `libmspack-dev libgstreamerd-3-dev libsecret-1-dev libwebkit2gtk-4.0-dev libosmesa6-dev libssl-dev libcurl4-openssl-dev eglexternalplatform-dev libudev-dev libdbus-1-dev extra-cmake-modules libgtk2.0-dev libglew-dev libudev-dev libdbus-1-dev cmake git texinfo`
- - run 'sudo ./BuildLinux.sh -u'
- - run './BuildLinux.sh -dsir'
-
+- Linux (All Distros)
+ - Docker
+ - Dependencies: Docker [Installation Instructions](https://www.docker.com/get-started/), git
+ - clone this repository `git clone https://github.com/SoftFever/OrcaSlicer`
+ - run `cd OrcaSlicer`
+ - run `./DockerBuild.sh`
+ - To run OrcaSlicer:
+ - run `./DockerRun.sh`
+ - For most common errors, open `DockerRun.sh` and read the comments.
+ - Ubuntu
+ - Dependencies **Will be auto installed with the shell script**: `libmspack-dev libgstreamerd-3-dev libsecret-1-dev libwebkit2gtk-4.0-dev libosmesa6-dev libssl-dev libcurl4-openssl-dev eglexternalplatform-dev libudev-dev libdbus-1-dev extra-cmake-modules libgtk2.0-dev libglew-dev libudev-dev libdbus-1-dev cmake git texinfo`
+ - run 'sudo ./BuildLinux.sh -u'
+ - run './BuildLinux.sh -dsir'
# Note:
If you're running Klipper, it's recommended to add the following configuration to your `printer.cfg` file.
diff --git a/localization/i18n/uk/OrcaSlicer_uk.po b/localization/i18n/uk/OrcaSlicer_uk.po
index b7bd723b27..d6bc51d674 100644
--- a/localization/i18n/uk/OrcaSlicer_uk.po
+++ b/localization/i18n/uk/OrcaSlicer_uk.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-12-01 08:07+0100\n"
-"PO-Revision-Date: 2024-06-30 23:05+0300\n"
+"POT-Creation-Date: 2024-10-27 23:05+0800\n"
+"PO-Revision-Date: 2024-12-23 20:09+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: uk_UA\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n"
-"X-Generator: Poedit 3.4.4\n"
+"X-Generator: Poedit 3.5\n"
msgid "Supports Painting"
msgstr "Малювання підтримки"
@@ -78,7 +78,7 @@ msgid "Smart fill angle"
msgstr "Розумний кут заповнення"
msgid "On overhangs only"
-msgstr "Лише на звисах"
+msgstr "Лише на нависаннях"
msgid "Auto support threshold angle: "
msgstr "Пороговий кут автоматичної підтримки: "
@@ -109,7 +109,7 @@ msgid "Support Generated"
msgstr "Генерація підтримки"
msgid "Gizmo-Place on Face"
-msgstr "Gizmo \"Поверхнею на стіл\""
+msgstr "Gizmo-Покласти на Грань"
msgid "Lay on face"
msgstr "Покласти на грань"
@@ -1640,7 +1640,7 @@ msgid "Ironing"
msgstr "Розгладжування"
msgid "Fuzzy Skin"
-msgstr "Нечітка оболонка"
+msgstr "Шорстка Поверхня"
msgid "Extruders"
msgstr "Екструдери"
@@ -1771,7 +1771,7 @@ msgid "Set as individual objects"
msgstr "Встановити як окремі об'єкти"
msgid "Fill bed with copies"
-msgstr "Заповнити весь стіл копіями"
+msgstr "Заповнити пластину копіями"
msgid "Fill the remaining area of bed with copies of the selected object"
msgstr "Заповніть решту площу столу копіями вибраного об'єкта"
@@ -1952,7 +1952,7 @@ msgid "Arrange"
msgstr "Організувати"
msgid "arrange current plate"
-msgstr "упорядкувати поточну табличку"
+msgstr "упорядкувати поточну пластину"
msgid "Reload All"
msgstr "Перезавантажити все"
@@ -2261,10 +2261,10 @@ msgid "Mouse ear"
msgstr "Мишаче вушко"
msgid "Outer brim only"
-msgstr "Кайма тільки зовні"
+msgstr "Тільки зовні"
msgid "Inner brim only"
-msgstr "Кайма тільки всередині"
+msgstr "Тільки всередині"
msgid "Outer and inner brim"
msgstr "Зовні та всередині"
@@ -2276,7 +2276,7 @@ msgid "Outer wall speed"
msgstr "Швидкість зовнішньої стінки"
msgid "Plate"
-msgstr "Стіл"
+msgstr "Пластина"
msgid "Brim"
msgstr "Кайма"
@@ -3672,8 +3672,8 @@ msgid ""
"\n"
"The value will be reset to 0."
msgstr ""
-"Занадто велика компенсація слонячої ноги недоцільна.\n"
-"Якщо є серйозний ефект слонячої ноги, перевірте інші параметри друку.\n"
+"Занадто велика компенсація слонової стопи недоцільна.\n"
+"Якщо є серйозний ефект слонової стопи, перевірте інші параметри друку.\n"
"Наприклад, чи не надто висока температура столу.\n"
"\n"
"Значення буде скинуто на 0."
@@ -4124,7 +4124,7 @@ msgid "Generating geometry index data"
msgstr "Генерація даних індексу геометрії"
msgid "Statistics of All Plates"
-msgstr "Статистика"
+msgstr "Статистика всіх пластин"
msgid "Display"
msgstr "Відображати"
@@ -4202,7 +4202,7 @@ msgid "Filament Changes"
msgstr "Зміна філаменту"
msgid "Wipe"
-msgstr "Протирання"
+msgstr "Очищення"
msgid "Options"
msgstr "Параметри"
@@ -4268,7 +4268,7 @@ msgid "Quality / Speed"
msgstr "Якість/Швидкість"
msgid "Smooth"
-msgstr "Гладкий"
+msgstr "Плаввний"
msgid "Radius"
msgstr "Радіус"
@@ -4355,7 +4355,7 @@ msgid "Align to Y axis"
msgstr "Вирівняти за осі Y"
msgid "Add plate"
-msgstr "Додати плату"
+msgstr "Додати пластину"
msgid "Auto orient"
msgstr "Автоорієнтація"
@@ -4364,7 +4364,7 @@ msgid "Arrange all objects"
msgstr "Упорядкувати всі об'єкти"
msgid "Arrange objects on selected plates"
-msgstr "Розставити об'єкти на столі"
+msgstr "Розставити об'єкти на вибраних пластинах"
msgid "Split to objects"
msgstr "Розділити на об'єкти"
@@ -4376,7 +4376,7 @@ msgid "Assembly View"
msgstr "Вигляд складання"
msgid "Select Plate"
-msgstr "Вибір столу"
+msgstr "Вибрати Пластину"
msgid "Assembly Return"
msgstr "Повернення збірки"
@@ -4417,13 +4417,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 "Відображається лише редагований об'єкт."
@@ -4489,7 +4489,7 @@ msgid "Liveview Retry"
msgstr "Повторити перегляд у реальному часі"
msgid "Resolution"
-msgstr "Дозвіл нарізки"
+msgstr "Роздільна здатність"
msgid "Enable"
msgstr "Увімкнення"
@@ -4559,10 +4559,10 @@ 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 "Нарізати все"
@@ -4571,13 +4571,13 @@ msgid "Export G-code file"
msgstr "Експорт файлу G-коду"
msgid "Export plate sliced file"
-msgstr "Експорт файлу зрізів планшета"
+msgstr "Експортувати файл нарізки пластини"
msgid "Export all sliced file"
-msgstr "Експортувати весь нарізаний файл"
+msgstr "Експортувати файл нарізки всього"
msgid "Print all"
-msgstr "Роздрукувати все"
+msgstr "Друкувати все"
msgid "Send all"
msgstr "Надіслати все"
@@ -4621,14 +4621,14 @@ msgid "Top"
msgstr "Верх"
msgid "Top View"
-msgstr "Вигляд зверху"
+msgstr "Вид зверху"
#. TRN To be shown in the main menu View->Bottom
msgid "Bottom"
msgstr "Низ"
msgid "Bottom View"
-msgstr "Вигляд знизу"
+msgstr "Вид знизу"
msgid "Front"
msgstr "Перед"
@@ -4640,49 +4640,49 @@ msgid "Rear"
msgstr "Зад"
msgid "Rear View"
-msgstr "Вигляд ззаду"
+msgstr "Вид ззаду"
msgid "Left"
msgstr "Ліво"
msgid "Left View"
-msgstr "Вигляд зліва"
+msgstr "Вид зліва"
msgid "Right"
msgstr "Право"
msgid "Right View"
-msgstr "Вигляд справа"
+msgstr "Вид справа"
msgid "Start a new window"
msgstr "Почати нове вікно"
msgid "New Project"
-msgstr "Новий проект"
+msgstr "Новий проєкт"
msgid "Start a new project"
-msgstr "Почати новий проект"
+msgstr "Почати новий проєкт"
msgid "Open a project file"
-msgstr "Відкрийте файл проекту"
+msgstr "Відкрити файл проекту"
msgid "Recent projects"
-msgstr "Недавні проекти"
+msgstr "Недавні проєкти"
msgid "Save Project"
-msgstr "Зберегти проект"
+msgstr "Зберегти проєкт"
msgid "Save current project to file"
-msgstr "Зберегти поточний проект у файл"
+msgstr "Зберегти поточний проєкт у файл"
msgid "Save Project as"
-msgstr "Зберегти проект як"
+msgstr "Зберегти проєкт як"
msgid "Shift+"
msgstr "Shift+"
msgid "Save current project as"
-msgstr "Зберегти поточний проект як"
+msgstr "Зберегти поточний проєкт як"
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "Імпорт 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -4721,7 +4721,7 @@ msgid "Export current sliced file"
msgstr "Експорт поточного нарізаного файлу"
msgid "Export all plate sliced file"
-msgstr "Експортувати весь файл нарізки"
+msgstr "Експортуйте файл нарізки всіх пластин"
msgid "Export G-code"
msgstr "Експорт G-коду"
@@ -4781,10 +4781,10 @@ msgid "Clone copies of selections"
msgstr "Клонувати копії вибраних об'єктів"
msgid "Duplicate Current Plate"
-msgstr ""
+msgstr "Дублювати поточну пластину"
msgid "Duplicate the current plate"
-msgstr ""
+msgstr "Дублювати поточну пластину"
msgid "Select all"
msgstr "Вибрати все"
@@ -4913,7 +4913,7 @@ msgid "Re&load from Disk"
msgstr "Перезавантажити з диска"
msgid "Reload the plater from disk"
-msgstr "Перезавантажити планшет із диска"
+msgstr "Перезавантажити пластину з диска"
msgid "Export &Toolpaths as OBJ"
msgstr "Експорт траєкторій як OBJ"
@@ -5272,7 +5272,7 @@ msgstr ""
"Заголовок: %s\n"
msgid "Download waiting..."
-msgstr "Чекання завантаження..."
+msgstr "Очікування завантаження..."
msgid "Play"
msgstr "Відтворити"
@@ -5832,14 +5832,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 ""
-"Виявлено тег локалізації робочої пластини, і друк припиняється, якщо\n"
-"тег не знаходиться в певному діапазоні."
+"Виявлено тег локалізації робочої пластини, і друк припиняється, якщо тег не "
+"знаходиться в певному діапазоні."
msgid "First Layer Inspection"
msgstr "Перевірка першого шару"
@@ -5893,7 +5893,7 @@ msgid "Material settings"
msgstr ""
msgid "Remove current plate (if not last one)"
-msgstr "Видалити поточну пластину (якщо вона не є остання)"
+msgstr "Видалити поточну пластину (якщо вона не остання)"
msgid "Auto orient objects on current plate"
msgstr "Автоматичне орієнтування об'єктів на поточній пластині"
@@ -5905,13 +5905,13 @@ msgid "Unlock current plate"
msgstr "Розблокувати поточну пластину"
msgid "Lock current plate"
-msgstr "Блокування поточної пластини"
+msgstr "Блокувати поточну пластину"
msgid "Edit current plate name"
-msgstr "Редагувати поточну назву пластини"
+msgstr "Редагувати назву поточної пластини"
msgid "Move plate to the front"
-msgstr ""
+msgstr "Перемістити пластину на перед"
msgid "Customize current plate"
msgstr "Налаштувати поточну пластину"
@@ -5969,7 +5969,7 @@ msgid "Set filaments to use"
msgstr "Встановіть нитки для використання"
msgid "Search plate, object and part."
-msgstr "Пошук плити, об’єкта і деталі."
+msgstr "Пошук пластини, об’єкта і деталі."
msgid "Pellets"
msgstr ""
@@ -6305,7 +6305,7 @@ msgstr ""
"Ви можете зберегти змінені пресети у новому проекті або відмовитися від них"
msgid "Creating a new project"
-msgstr "Створення нового проекту"
+msgstr "Створення нового проєкту"
msgid "Load project"
msgstr "Завантажити проект"
@@ -6477,7 +6477,8 @@ msgid "Private protection"
msgstr "Приватний захист"
msgid "Is the printer ready? Is the print sheet in place, empty and clean?"
-msgstr "Чи готовий принтер? Чи є стіл для друку на місці, чистий і порожній?"
+msgstr ""
+"Чи готовий принтер? Чи на місці поверхня для друку, вона чиста і порожня?"
msgid "Upload and Print"
msgstr "Завантажити і друкувати"
@@ -6780,10 +6781,10 @@ msgstr ""
"одночасно та керувати декількома пристроями."
msgid "Auto arrange plate after cloning"
-msgstr ""
+msgstr "Авто орієнтування пластини після клонування"
msgid "Auto arrange plate after object cloning"
-msgstr ""
+msgstr "Авто орієнтування пластини після клонування об'єкту"
msgid "Network"
msgstr "Мережа"
@@ -7051,10 +7052,10 @@ msgid "Same as Global Bed Type"
msgstr "Те ж, що й глобальний тип столу"
msgid "By Layer"
-msgstr "За шаром"
+msgstr "Пошарово"
msgid "By Object"
-msgstr "По об'єкту"
+msgstr "Пооб'єктно"
msgid "Accept"
msgstr "Приймати"
@@ -7181,22 +7182,22 @@ msgid "Busy"
msgstr "Зайнятий"
msgid "Bambu Cool Plate"
-msgstr "Холодний стіл"
+msgstr "Bambu Холодна Пластина"
msgid "PLA Plate"
-msgstr "PLA Plate"
+msgstr "PLA Пластина"
msgid "Bambu Engineering Plate"
-msgstr "Інженерний стіл"
+msgstr "Bambu Інженерна Пластина"
msgid "Bambu Smooth PEI Plate"
-msgstr "Bambu Smooth PEI пластина"
+msgstr "Bambu Гладка PEI Пластина"
msgid "High temperature Plate"
-msgstr "High temperature Plate"
+msgstr "Високотемпературна Пластина"
msgid "Bambu Textured PEI Plate"
-msgstr "Текстурована пластина PEI з текстурою Bambu"
+msgstr "Bambu Текстурована PEI пластина"
msgid "Send print job to"
msgstr "Надіслати завдання на друк на"
@@ -7393,8 +7394,8 @@ msgid ""
"Caution to use! Flow calibration on Textured PEI Plate may fail due to the "
"scattered surface."
msgstr ""
-"Увага! Калібрування потоку на Textured PEI Plate може не вдалося через "
-"розсіяну поверхню."
+"Використовуйте обережно! Калібрування потоку на пластині Текстурованій PEI "
+"Пластині може бути невдалим через розсіяну поверхню."
msgid "Automatic flow calibration using Micro Lidar"
msgstr "Автоматична калібрування потоку за допомогою мікро лідару"
@@ -7731,7 +7732,7 @@ msgid "Bridging"
msgstr "Створення мостів"
msgid "Overhangs"
-msgstr "Звисання"
+msgstr "Нависання"
msgid "Walls"
msgstr "Стінки"
@@ -7746,16 +7747,16 @@ 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 швидкість означає відсутність уповільнення для "
-"діапазону ступенів звису і використовується швидкість друку стінок"
+"діапазону ступенів нависання і використовується швидкість друку стінок"
msgid "Bridge"
msgstr "Міст"
@@ -7794,7 +7795,7 @@ msgid "Ooze prevention"
msgstr ""
msgid "Skirt"
-msgstr "Плінтус"
+msgstr "Спідниця"
msgid "Special mode"
msgstr "Спеціальний режим"
@@ -7851,7 +7852,7 @@ msgstr ""
"відсутність установки"
msgid "Flow ratio and Pressure Advance"
-msgstr ""
+msgstr "Коефіцієнт потоку та Випередження тиску"
msgid "Print chamber temperature"
msgstr "Температура в камері друку"
@@ -7866,7 +7867,7 @@ msgid "Nozzle temperature when printing"
msgstr "Температура сопла під час друку"
msgid "Cool plate"
-msgstr "Холодний стіл"
+msgstr "Холодна пластина"
msgid ""
"Bed temperature when cool plate is installed. Value 0 means the filament "
@@ -7877,7 +7878,7 @@ msgstr ""
"не підтримує друк на Холодному столі"
msgid "Textured Cool plate"
-msgstr ""
+msgstr "Текстурована Холодна Пластина"
msgid ""
"Bed temperature when cool plate is installed. Value 0 means the filament "
@@ -7885,7 +7886,7 @@ msgid ""
msgstr ""
msgid "Engineering plate"
-msgstr "Інженерний стіл"
+msgstr "Інженерна пластина"
msgid ""
"Bed temperature when engineering plate is installed. Value 0 means the "
@@ -7907,14 +7908,14 @@ msgstr ""
"пластині / Високотемпературній пластині"
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 ""
-"Температура шару під час встановлення плити Textured PEI Plate. Значення 0 "
-"означає Філамент не підтримує друк на текстурованій пластині PEI"
+"Температура шару під час встановлення пластини Текстурована PEI пластина. "
+"Значення 0 означає Філамент не підтримує друк на Текстурованій PEI пластині"
msgid "Volumetric speed limitation"
msgstr "Об'ємне обмеження швидкості"
@@ -8754,7 +8755,7 @@ msgid "Gizmo cut"
msgstr "Виріз Gizmo"
msgid "Gizmo Place face on bed"
-msgstr "Gizmo Покладіть обличчя на стіл"
+msgstr "Gizmo Покласти грань на стіл"
msgid "Gizmo SLA support points"
msgstr "Точки підтримки Gizmo SL"
@@ -9548,7 +9549,7 @@ msgid ""
msgstr ""
msgid "Generating skirt & brim"
-msgstr "Створення спідниці та кайми"
+msgstr "Генерація спідниці та кайми"
msgid "Exporting G-code"
msgstr "Експорт G-code"
@@ -9579,7 +9580,7 @@ msgid "Bed custom texture"
msgstr "Текстура користувача столу"
msgid "Bed custom model"
-msgstr "Стіл індивідуальної моделі"
+msgstr "Індивідуальна модель стола"
msgid "Elephant foot compensation"
msgstr "Компенсація слонової ноги"
@@ -9590,7 +9591,7 @@ msgid ""
msgstr "Усадка початкового шару на столі для компенсації ефекту слонової ноги"
msgid "Elephant foot compensation layers"
-msgstr "Шари компенсації слонячої стопи"
+msgstr "Шари компенсації слонової стопи"
msgid ""
"The number of layers on which the elephant foot compensation will be active. "
@@ -9822,16 +9823,16 @@ msgid "Bed types supported by the printer"
msgstr "Типи ліжок, які підтримує принтер"
msgid "Smooth Cool Plate"
-msgstr ""
+msgstr "Гладка Холодна Пластина"
msgid "Engineering Plate"
-msgstr "Інженерна пластина"
+msgstr "Інженерна Пластина"
msgid "Smooth High Temp Plate"
-msgstr ""
+msgstr "Гладка Високотемпературна Пластина"
msgid "Textured Cool Plate"
-msgstr ""
+msgstr "Текстурована Холодна Пластина"
msgid "First layer print sequence"
msgstr "Послідовність друку першого шару"
@@ -9917,17 +9918,17 @@ msgid "Nowhere"
msgstr "Ніде"
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 "
@@ -9940,7 +9941,7 @@ msgstr ""
"деталей"
msgid "Cooling overhang threshold"
-msgstr "Поріг охолоджувального звису"
+msgstr "Поріг нависання для охолодження"
#, c-format
msgid ""
@@ -9949,11 +9950,11 @@ msgid ""
"of the line without support from lower layer. 0% means forcing cooling for "
"all outer wall no matter how much overhang degree"
msgstr ""
-"Коли ступінь звису друкарської деталі перевищує це значення, примусово "
+"Коли ступінь нависання друкарської деталі перевищує це значення, примусово "
"Встановіть вентилятор охолодження на певну швидкість. Виражається в "
"відсотках, що вказують на ширину лінії без опори від нижнього шару. .0%% "
"означає примусове охолодження всього зовнішньої стінки незалежно від ступеня "
-"звису"
+"нависання"
msgid "Bridge infill direction"
msgstr "Напрямок заповнення мосту"
@@ -9976,7 +9977,7 @@ msgstr ""
"замовчуванням - 100%."
msgid "Bridge flow ratio"
-msgstr "Потік мосту"
+msgstr "Коефіцієнт потоку мостів"
msgid ""
"Decrease this value slightly(for example 0.9) to reduce the amount of "
@@ -9987,7 +9988,7 @@ msgid ""
msgstr ""
msgid "Internal bridge flow ratio"
-msgstr "Коефіцієнт потоку для внутрішніх мостів"
+msgstr "Коефіцієнт потоку внутрішніх мостів"
msgid ""
"This value governs the thickness of the internal bridge layer. This is the "
@@ -10088,10 +10089,10 @@ msgstr ""
"ділянками, де неможливо закріпити мости. "
msgid "Reverse on even"
-msgstr ""
+msgstr "Зміна напрямку на парних шарах"
msgid "Overhang reversal"
-msgstr "Реверс звису"
+msgstr "Розворот нависань"
msgid ""
"Extrude perimeters that have a part over an overhang in the reverse "
@@ -10146,7 +10147,7 @@ msgid "Reverse threshold"
msgstr "Зворотний поріг"
msgid "Overhang reversal threshold"
-msgstr "Поріг розвороту звису"
+msgstr "Поріг розвороту нависань"
#, no-c-format, no-boost-format
msgid ""
@@ -10164,11 +10165,11 @@ 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 ""
-"Увімкнути цей параметр для уповільнення друку при різних ступенях звису"
+"Увімкнути цей параметр для уповільнення друку при різних кутів нависань"
msgid "Slow down for curled perimeters"
msgstr "Уповільнення для нависаючих периметрів"
@@ -10253,7 +10254,7 @@ msgid "Only draw brim over the sharp edges of the model."
msgstr "Робить кайму вушка лише на гострих краях моделі."
msgid "Brim ear max angle"
-msgstr "Максимальний кут для кайми вушка"
+msgstr "Максимальний кут вушка кайми"
msgid ""
"Maximum angle to let a brim ear appear. \n"
@@ -10265,7 +10266,7 @@ msgstr ""
"Якщо встановлено ~180, то край буде створено на всіх ділянках, окрім прямих."
msgid "Brim ear detection radius"
-msgstr "Кайма вушка радіус виявлення"
+msgstr "Радіус виявлення вушка кайма"
msgid ""
"The geometry will be decimated before detecting sharp angles. This parameter "
@@ -10295,10 +10296,10 @@ msgid "Print sequence, layer by layer or object by object"
msgstr "Послідовність друку, шар за шаром або об'єкт за об'єктом"
msgid "By layer"
-msgstr "За шаром"
+msgstr "Пошарово"
msgid "By object"
-msgstr "По об'єкту"
+msgstr "Пооб'єктно"
msgid "Intra-layer order"
msgstr "Внутрішній порядок шарів"
@@ -10307,10 +10308,10 @@ msgid "Print order within a single layer"
msgstr "Друк замовлення в один шар"
msgid "As object list"
-msgstr "Як перелік об'єктів"
+msgstr "За порядком у списку"
msgid "Slow printing down for better layer cooling"
-msgstr "Повільний друк для кращого охолодження шару"
+msgstr "Сповільнювати друк для кращого охолодження шару"
msgid ""
"Enable this option to slow printing speed down to make the final layer time "
@@ -10369,7 +10370,7 @@ msgid "Speed of exhaust fan after printing completes"
msgstr "Швидкість витяжного вентилятора після завершення друку"
msgid "No cooling for the first"
-msgstr "Немає охолодження для першого шару"
+msgstr "Не охолоджувати перші"
msgid ""
"Close all cooling fan for the first certain layers. Cooling fan of the first "
@@ -10414,7 +10415,7 @@ msgstr ""
"сопла, краще вимкнути її."
msgid "Filter out small internal bridges (beta)"
-msgstr ""
+msgstr "Відфільтровувати малі Внутрішні мости (бета)"
msgid ""
"This option can help reducing pillowing on top surfaces in heavily slanted "
@@ -10446,13 +10447,13 @@ msgid ""
msgstr ""
msgid "Filter"
-msgstr ""
+msgstr "Фільтрувати"
msgid "Limited filtering"
-msgstr "Обмежена фільтрація"
+msgstr "Обмежене фільтрування"
msgid "No filtering"
-msgstr "Без фільтрації"
+msgstr "Без фільтрування"
msgid "Max bridge length"
msgstr "Максимальна довжина мосту"
@@ -10834,15 +10835,15 @@ msgid ""
"Enable pressure advance, auto calibration result will be overwritten once "
"enabled."
msgstr ""
-"Включити випередження тиску, результат автоматичного калібрування "
-"будеперезаписано після увімкнення."
+"Включити випередження тиску, результат автоматичного калібрування буде "
+"перезаписано після увімкнення."
msgid "Pressure advance(Klipper) AKA Linear advance factor(Marlin)"
msgstr ""
-"Підвищення тиску (Klipper) AKA Коефіцієнт лінійного просування (Marlin)"
+"Випередження тиску (Klipper) або Коефіцієнт лінійного випередження (Marlin)"
msgid "Enable adaptive pressure advance (beta)"
-msgstr ""
+msgstr "Увімкнути адаптивне випередження тиску (бета)"
#, no-c-format, no-boost-format
msgid ""
@@ -10867,7 +10868,7 @@ msgid ""
msgstr ""
msgid "Adaptive pressure advance measurements (beta)"
-msgstr ""
+msgstr "Виміри адаптивного випередження тиску (бета)"
#, no-c-format, no-boost-format
msgid ""
@@ -10901,7 +10902,7 @@ msgid ""
msgstr ""
msgid "Enable adaptive pressure advance for overhangs (beta)"
-msgstr ""
+msgstr "Увімкнути адаптивне випередження тиску для нависань (бета)"
msgid ""
"Enable adaptive PA for overhangs as well as when flow changes within the "
@@ -10911,7 +10912,7 @@ msgid ""
msgstr ""
msgid "Pressure advance for bridges"
-msgstr ""
+msgstr "Випередження тиску для мостів"
msgid ""
"Pressure advance value for bridges. Set to 0 to disable. \n"
@@ -10930,7 +10931,7 @@ msgstr ""
"виражено у %, вона буде розрахована за діаметром сопла."
msgid "Keep fan always on"
-msgstr "Тримайте вентилятор завжди увімкненим"
+msgstr "Тримати вентилятор завжди увімкненим"
msgid ""
"If enable this setting, part cooling fan will never be stopped and will run "
@@ -11052,7 +11053,7 @@ msgid ""
msgstr ""
msgid "Shrinkage (XY)"
-msgstr ""
+msgstr "Усадка (XY)"
#, no-c-format, no-boost-format
msgid ""
@@ -11070,7 +11071,7 @@ msgstr ""
"виконується після перевірки."
msgid "Shrinkage (Z)"
-msgstr ""
+msgstr "Усадка (Z)"
#, no-c-format, no-boost-format
msgid ""
@@ -11228,7 +11229,7 @@ msgid "The material type of filament"
msgstr "Тип матеріалу філаменту"
msgid "Soluble material"
-msgstr "Розчинний філамент"
+msgstr "Розчинний матеріал"
msgid ""
"Soluble material is commonly used to print support and support interface"
@@ -11260,7 +11261,7 @@ msgid "Filament price. For statistics only"
msgstr "Ціна філаменту. Тільки для статистики"
msgid "money/kg"
-msgstr "р/кг"
+msgstr "грн/кг"
msgid "Vendor"
msgstr "Виробник"
@@ -11504,7 +11505,7 @@ msgstr ""
"діаметру сопла."
msgid "Initial layer height"
-msgstr "Початкова висота шару"
+msgstr "Висота початкового шару"
msgid ""
"Height of initial layer. Making initial layer height to be thick slightly "
@@ -11517,7 +11518,7 @@ msgid "Speed of initial layer except the solid infill part"
msgstr "Швидкість першого шару, за винятком суцільної заповнювальної частини"
msgid "Initial layer infill"
-msgstr "Початкове заповнення шару"
+msgstr "Заповнення початкового шару"
msgid "Speed of solid infill part of initial layer"
msgstr "Швидкість суцільної заповнювальної частини вихідного шару"
@@ -11597,7 +11598,7 @@ msgid "All walls"
msgstr "Всі периметри"
msgid "Fuzzy skin thickness"
-msgstr "Нечітка товщина шкіри"
+msgstr "Товщина Шорсткої Поверхні"
msgid ""
"The width within which to jitter. It's advised to be below outer wall line "
@@ -11607,7 +11608,7 @@ msgstr ""
"зовнішнього периметра"
msgid "Fuzzy skin point distance"
-msgstr "Нечітка відстань від точки шкіри"
+msgstr "Відстань між точками Шорсткої Поверхні"
msgid ""
"The average distance between the random points introduced on each line "
@@ -11616,10 +11617,10 @@ msgstr ""
"Середня відстань між випадковими точками, введеними на кожному відрізкулінії"
msgid "Apply fuzzy skin to first layer"
-msgstr "Нанести нечітку оболочку на перший шар"
+msgstr "Застосувати Шорстку Поверхню до першого шару"
msgid "Whether to apply fuzzy skin on the first layer"
-msgstr "Чи потрібно наносити нечітку оболочку на перший шар"
+msgstr "Чи потрібно застосовувати Шорстку Поверхню до першого шару"
msgid "Filter out tiny gaps"
msgstr "Відфільтрувати крихітні зазори"
@@ -11785,7 +11786,7 @@ msgid "Only overhangs"
msgstr "Тільки нависання"
msgid "Will only take into account the delay for the cooling of overhangs."
-msgstr "Враховуйте лише затримку охолодження звисів."
+msgstr "Буде враховуватись лише затримка охолодження нависань."
msgid "Fan kick-start time"
msgstr "Час запуску вентилятора"
@@ -11918,7 +11919,7 @@ msgid ""
msgstr ""
msgid "Filament to print internal sparse infill."
-msgstr "Філамент для друку внутрішнього заповнення."
+msgstr "Філамент для друку внутрішнього часткового заповнення."
msgid ""
"Line width of internal sparse infill. If expressed as a %, it will be "
@@ -11961,7 +11962,7 @@ msgstr ""
"лінії заповнення"
msgid "Speed of internal sparse infill"
-msgstr "Швидкість внутрішнього заповнення"
+msgstr "Швидкість внутрішнього часткового заповнення"
msgid "Interface shells"
msgstr "Інтерфейсні оболонки"
@@ -12037,7 +12038,7 @@ msgid ""
msgstr ""
msgid "Ironing Type"
-msgstr "Тип Розглажування"
+msgstr "Тип розглажування"
msgid ""
"Ironing is using small flow to print on same height of surface again to make "
@@ -12549,8 +12550,8 @@ 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 "Filament to print walls"
msgstr ""
@@ -12881,7 +12882,7 @@ msgstr ""
"Вимкнути генерацію M73: Встановити час друку, що залишився, у кінцевому gcode"
msgid "Seam position"
-msgstr "Положення шва"
+msgstr "Розташування шва"
msgid "The start position to print each part of outer wall"
msgstr "Початкове положення для друку кожної частини зовнішнього периметра"
@@ -12899,7 +12900,7 @@ msgid "Random"
msgstr "Випадковий"
msgid "Staggered inner seams"
-msgstr "Зміщений внутрішній шов"
+msgstr "Зміщувати внутрішній шов"
msgid ""
"This option causes the inner seams to be shifted backwards based on their "
@@ -12958,7 +12959,7 @@ msgstr ""
"шарфом. Значення за замовчуванням - 155°."
msgid "Conditional overhang threshold"
-msgstr "Умовний поріг звису"
+msgstr "Умовний поріг нависань"
#, no-c-format, no-boost-format
msgid ""
@@ -12968,10 +12969,10 @@ msgid ""
"at 40% of the external wall's width. Due to performance considerations, the "
"degree of overhang is estimated."
msgstr ""
-"Ця опція визначає поріг звису для застосування стрічкових швів. Якщо "
+"Ця опція визначає поріг нависання для застосування стрічкових швів. Якщо "
"непідтримувана частина периметра менша за цей поріг, будуть застосовані "
"стрічкові шви. За замовчуванням поріг встановлюється на рівні 40% від ширини "
-"зовнішньої стіни. З міркувань продуктивності оцінюється ступінь звису."
+"зовнішньої стіни. З міркувань продуктивності оцінюється ступінь нависання."
msgid "Scarf joint speed"
msgstr "Швидкість з'єднання шва"
@@ -12997,7 +12998,7 @@ msgstr ""
"внутрішньої стінки. За замовчуванням встановлено значення 100%."
msgid "Scarf joint flow ratio"
-msgstr "Коефіцієнт пропускної здатності шарфового шва"
+msgstr "Коефіцієнт потоку шарфового шва"
msgid "This factor affects the amount of material for scarf joints."
msgstr "Цей фактор впливає на кількість матеріалу для з'єднання швів."
@@ -13042,7 +13043,7 @@ msgid "Use scarf joint for inner walls as well."
msgstr "Використовувати з’єднання з шарфом також для внутрішніх стін."
msgid "Role base wipe speed"
-msgstr "Базова швидкість очищення ролей"
+msgstr "Швидкість очищення залежно від типу"
msgid ""
"The wipe speed is determined by the speed of the current extrusion role.e.g. "
@@ -13055,7 +13056,7 @@ msgstr ""
"для діїочищення."
msgid "Wipe on loops"
-msgstr "Розгладжування шва"
+msgstr "Очищати при завершенні контуру"
msgid ""
"To minimize the visibility of the seam in a closed loop extrusion, a small "
@@ -13065,7 +13066,7 @@ msgstr ""
"Невеликий рух усередину виконується до виходу екструдера з контуру."
msgid "Wipe before external loop"
-msgstr "Протирання перед зовнішньою стінкою"
+msgstr "Очищати перед зовнішнім контуром"
msgid ""
"To minimize visibility of potential overextrusion at the start of an "
@@ -13103,13 +13104,13 @@ msgstr ""
"За замовчуванням для цього параметра - 80%"
msgid "Skirt distance"
-msgstr "Відстань між спідницею/каймою"
+msgstr "Відступ спідниці"
msgid "Distance from skirt to brim or object"
msgstr "Відстань між спідницею/каймою або моделлю"
msgid "Skirt start point"
-msgstr ""
+msgstr "Початкова точка спідниці"
msgid ""
"Angle from the object center to skirt start point. Zero is the most right "
@@ -13123,7 +13124,7 @@ msgid "How many layers of skirt. Usually only one layer"
msgstr "Скільки шарів спідниці. Зазвичай лише один шар"
msgid "Draft shield"
-msgstr "Чорновий щит"
+msgstr "Захисний бар’єр"
msgid ""
"A draft shield is useful to protect an ABS or ASA print from warping and "
@@ -13144,7 +13145,7 @@ msgid "Enabled"
msgstr "Увімкнуто"
msgid "Skirt type"
-msgstr ""
+msgstr "Тип спідниці"
msgid ""
"Combined - single skirt for all objects, Per object - individual object "
@@ -13152,16 +13153,16 @@ msgid ""
msgstr ""
msgid "Combined"
-msgstr ""
+msgstr "Об'єднана"
msgid "Per object"
-msgstr ""
+msgstr "Роздільна"
msgid "Skirt loops"
-msgstr "Спідниця навколо моделі"
+msgstr "Кількість контурів спідниці"
msgid "Number of loops for the skirt. Zero means disabling skirt"
-msgstr "Кількість петель для спідниці. Нуль означає відключення спідниці"
+msgstr "Кількість контурів для спідниці. Нуль означає відключення спідниці"
msgid "Skirt speed"
msgstr "Швидкість спідниці"
@@ -13193,20 +13194,20 @@ 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 ""
-"Площа заповнення, яка менша за порогове значення, замінюється внутрішнім "
-"суцільним заповненням"
+"Площа часткового заповнення, яка менша за порогове значення, замінюється "
+"внутрішнім суцільним заповненням"
msgid "Solid infill"
-msgstr ""
+msgstr "Суцільне заповнення"
msgid "Filament to print solid infill"
-msgstr ""
+msgstr "Філамент для друку суцільного заповнення"
msgid ""
"Line width of internal solid infill. If expressed as a %, it will be "
@@ -13282,7 +13283,7 @@ msgid ""
msgstr ""
msgid "Preheat time"
-msgstr ""
+msgstr "Час підігріву"
msgid ""
"To reduce the waiting time after tool change, Orca can preheat the next tool "
@@ -13292,7 +13293,7 @@ msgid ""
msgstr ""
msgid "Preheat steps"
-msgstr ""
+msgstr "Кроки підігріву"
msgid ""
"Insert multiple preheat commands(e.g. M104.1). Only useful for Prusa XL. For "
@@ -13450,7 +13451,7 @@ msgstr ""
"горизонтальному площини."
msgid "On build plate only"
-msgstr "Тільки від столу"
+msgstr "Тільки на робочій пластині"
msgid "Don't create support on model surface, only on build plate"
msgstr "Не створюйте опору на поверхні моделі лише від столу"
@@ -13617,10 +13618,10 @@ msgstr ""
"об'єкта.\n"
"Для підтримок органічний, більш агресивно з'єднує гілки та економить багато "
"матеріалу (за замовчуванням органічний), тоді як гібридний стиль створить "
-"структуру, схожу на звичайну опору під великими пласкими звисами."
+"структуру, схожу на звичайну опору під великими пласкими нависаннями."
msgid "Default (Grid/Organic"
-msgstr ""
+msgstr "За замовчуванням (Сітка/Органічна)"
msgid "Snug"
msgstr "Обережний"
@@ -13655,7 +13656,7 @@ msgstr "Кут порога"
msgid ""
"Support will be generated for overhangs whose slope angle is below the "
"threshold."
-msgstr "Буде створена опора для звисів з кутом нахилу нижче порога."
+msgstr "Буде створена опора для нависань з кутом нахилу нижче порогу."
msgid "Tree support branch angle"
msgstr "Кут гілки опори дерева"
@@ -13665,9 +13666,9 @@ msgid ""
"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 "Бажаний кут повороту гілки"
@@ -13701,7 +13702,7 @@ msgid ""
"needed."
msgstr ""
"Регулює щільність опорної структури, яка використовується для створення "
-"кінчиків гілок. Вище значення призводить до кращих звисів, але опори важче "
+"кінчиків гілок. Вище значення призводить до кращих нависань, але опори важче "
"видаляти, тому рекомендується увімкнути верхні опорні інтерфейси замість "
"високого значення щільності гілок, якщо потрібні щільні інтерфейси."
@@ -14076,7 +14077,8 @@ msgid "Maximal bridging distance"
msgstr "Максимальна мостова відстань"
msgid "Maximal distance between supports on sparse infill sections."
-msgstr "Максимальна відстань між підтримками на рідкісних ділянках заповнення."
+msgstr ""
+"Максимальна відстань між підтримками на ділянках часткового заповнення."
msgid "Wipe tower purge lines spacing"
msgstr "Протерти відстань між лініями продувки башти"
@@ -14085,7 +14087,7 @@ msgid "Spacing of purge lines on the wipe tower."
msgstr "Відстань між лініями продувки на протиральній башті."
msgid "Extra flow for purging"
-msgstr ""
+msgstr "Додатковий потік для очищення"
msgid ""
"Extra flow used for the purging lines on the wipe tower. This makes the "
@@ -14094,7 +14096,7 @@ msgid ""
msgstr ""
msgid "Idle temperature"
-msgstr ""
+msgstr "Температура очікування"
msgid ""
"Nozzle temperature when the tool is currently not used in multi-tool setups."
@@ -14441,7 +14443,7 @@ msgid "Currently planned extra extruder priming after de-retraction."
msgstr "В даний час планується додаткове ґрунтування екструдера після накату."
msgid "Absolute E position"
-msgstr ""
+msgstr "Абсолютна позиція E"
msgid ""
"Current position of the extruder axis. Only used with absolute extruder "
@@ -14662,7 +14664,7 @@ msgid "Name of the physical printer used for slicing."
msgstr "Назва фізичного принтера, який використовується для нарізки."
msgid "Number of extruders"
-msgstr ""
+msgstr "Кількість екструдерів"
msgid ""
"Total number of extruders, regardless of whether they are used in the "
@@ -14761,7 +14763,7 @@ msgid "Support: generate toolpath at layer %d"
msgstr "Підтримка: створення траєкторії інструмента на шарі %d"
msgid "Support: detect overhangs"
-msgstr "Підтримка: виявлення звисів"
+msgstr "Підтримка: виявляти нависання"
msgid "Support: generate contact points"
msgstr "Підтримка: створення точок контакту"
@@ -15202,14 +15204,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 "Будь ласка, введіть назву шаблону, який ви хочете зберегти."
@@ -15231,7 +15232,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 "Будь ласка, виберіть блок з найгладшою верхньою поверхнею"
@@ -15251,7 +15252,7 @@ msgid "Complete Calibration"
msgstr "Повне калібрування"
msgid "Fine Calibration based on flow ratio"
-msgstr "Точне калібрування на основі співвідношення потоку"
+msgstr "Точне калібрування на основі коефіцієнту потоку"
msgid "Title"
msgstr "Назва"
@@ -15260,14 +15261,14 @@ 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 "Параметри друку"
msgid "Plate Type"
-msgstr "Тип стільця"
+msgstr "Тип Пластини"
msgid "filament position"
msgstr "положення нитки"
@@ -16742,7 +16743,7 @@ msgstr ""
"Сендвіч режим\n"
"Чи знаєте ви, що можна використовувати сендвіч-режим (внутрішній-зовнішній-"
"внутрішній), щоб покращити точність і узгодженість шарів, якщо ваша модель "
-"не має дуже крутих звисів?"
+"не має дуже крутих нависань?"
#: resources/data/hints.ini: [hint:Chamber temperature]
msgid ""
@@ -16815,7 +16816,7 @@ msgid ""
msgstr ""
"Reverse on odd\n"
"Чи знали ви, що функція Реверс по непарних периметрах може значно "
-"покращити якість поверхні ваших звисів?"
+"покращити якість поверхні ваших нависань?"
#: resources/data/hints.ini: [hint:Cut Tool]
msgid ""
diff --git a/src/libslic3r/Algorithm/PathSorting.hpp b/src/libslic3r/Algorithm/PathSorting.hpp
deleted file mode 100644
index ab44627281..0000000000
--- a/src/libslic3r/Algorithm/PathSorting.hpp
+++ /dev/null
@@ -1,128 +0,0 @@
-#ifndef SRC_LIBSLIC3R_PATH_SORTING_HPP_
-#define SRC_LIBSLIC3R_PATH_SORTING_HPP_
-
-#include "AABBTreeLines.hpp"
-#include "BoundingBox.hpp"
-#include "Line.hpp"
-#include "ankerl/unordered_dense.h"
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-namespace Slic3r {
-namespace Algorithm {
-
-//Sorts the paths such that all paths between begin and last_seed are printed first, in some order. The rest of the paths is sorted
-// such that the paths that are touching some of the already printed are printed first, sorted secondary by the distance to the last point of the last
-// printed path.
-// begin, end, and last_seed are random access iterators. touch_limit_distance is used to check if the paths are touching - if any part of the path gets this close
-// to the second, then they touch.
-// convert_to_lines is a lambda that should accept the path as argument and return it as Lines vector, in correct order.
-template
-void sort_paths(RandomAccessIterator begin, RandomAccessIterator end, Point start, double touch_limit_distance, ToLines convert_to_lines)
-{
- size_t paths_count = std::distance(begin, end);
- if (paths_count <= 1)
- return;
-
- auto paths_touch = [touch_limit_distance](const AABBTreeLines::LinesDistancer &left,
- const AABBTreeLines::LinesDistancer &right) {
- for (const Line &l : left.get_lines()) {
- if (right.distance_from_lines(l.a) < touch_limit_distance) {
- return true;
- }
- }
- if (right.distance_from_lines(left.get_lines().back().b) < touch_limit_distance) {
- return true;
- }
-
- for (const Line &l : right.get_lines()) {
- if (left.distance_from_lines(l.a) < touch_limit_distance) {
- return true;
- }
- }
- if (left.distance_from_lines(right.get_lines().back().b) < touch_limit_distance) {
- return true;
- }
- return false;
- };
-
- std::vector> distancers(paths_count);
- for (size_t path_idx = 0; path_idx < paths_count; path_idx++) {
- distancers[path_idx] = AABBTreeLines::LinesDistancer{convert_to_lines(*std::next(begin, path_idx))};
- }
-
- std::vector> dependencies(paths_count);
- for (size_t path_idx = 0; path_idx < paths_count; path_idx++) {
- for (size_t next_path_idx = path_idx + 1; next_path_idx < paths_count; next_path_idx++) {
- if (paths_touch(distancers[path_idx], distancers[next_path_idx])) {
- dependencies[next_path_idx].insert(path_idx);
- }
- }
- }
-
- Point current_point = start;
-
- std::vector> correct_order_and_direction(paths_count);
- size_t unsorted_idx = 0;
- size_t null_idx = size_t(-1);
- size_t next_idx = null_idx;
- bool reverse = false;
- while (unsorted_idx < paths_count) {
- next_idx = null_idx;
- double lines_dist = std::numeric_limits::max();
- for (size_t path_idx = 0; path_idx < paths_count; path_idx++) {
- if (!dependencies[path_idx].empty())
- continue;
-
- double ldist = distancers[path_idx].distance_from_lines(current_point);
- if (ldist < lines_dist) {
- const auto &lines = distancers[path_idx].get_lines();
- double dist_a = (lines.front().a - current_point).cast().squaredNorm();
- double dist_b = (lines.back().b - current_point).cast().squaredNorm();
- next_idx = path_idx;
- reverse = dist_b < dist_a;
- lines_dist = ldist;
- }
- }
-
- // we have valid next_idx, sort it, update dependencies, update current point
- correct_order_and_direction[next_idx] = {unsorted_idx, reverse};
- unsorted_idx++;
- current_point = reverse ? distancers[next_idx].get_lines().front().a : distancers[next_idx].get_lines().back().b;
-
- dependencies[next_idx].insert(null_idx); // prevent it from being selected again
- for (size_t path_idx = 0; path_idx < paths_count; path_idx++) {
- dependencies[path_idx].erase(next_idx);
- }
- }
-
- for (size_t path_idx = 0; path_idx < paths_count; path_idx++) {
- if (correct_order_and_direction[path_idx].second) {
- std::next(begin, path_idx)->reverse();
- }
- }
-
- for (size_t i = 0; i < correct_order_and_direction.size() - 1; i++) {
- bool swapped = false;
- for (size_t j = 0; j < correct_order_and_direction.size() - i - 1; j++) {
- if (correct_order_and_direction[j].first > correct_order_and_direction[j + 1].first) {
- std::swap(correct_order_and_direction[j], correct_order_and_direction[j + 1]);
- std::iter_swap(std::next(begin, j), std::next(begin, j + 1));
- swapped = true;
- }
- }
- if (swapped == false) {
- break;
- }
- }
-}
-
-}} // namespace Slic3r::Algorithm
-
-#endif /*SRC_LIBSLIC3R_PATH_SORTING_HPP_*/
\ No newline at end of file
diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt
index da4fb9c1df..9dae196b32 100644
--- a/src/libslic3r/CMakeLists.txt
+++ b/src/libslic3r/CMakeLists.txt
@@ -32,7 +32,6 @@ set(lisbslic3r_sources
AABBMesh.cpp
Algorithm/LineSplit.hpp
Algorithm/LineSplit.cpp
- Algorithm/PathSorting.hpp
Algorithm/RegionExpansion.hpp
Algorithm/RegionExpansion.cpp
AnyPtr.hpp
@@ -505,7 +504,7 @@ if (_opts)
target_compile_options(libslic3r_cgal PRIVATE "${_opts_bad}")
endif()
-target_link_libraries(libslic3r_cgal PRIVATE ${_cgal_tgt} libigl mcut)
+target_link_libraries(libslic3r_cgal PRIVATE ${_cgal_tgt} libigl mcut boost_libs)
if (MSVC AND "${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") # 32 bit MSVC workaround
target_compile_definitions(libslic3r_cgal PRIVATE CGAL_DO_NOT_USE_MPZF)
@@ -581,10 +580,6 @@ target_link_libraries(libslic3r
opencv_world
)
-if(NOT SLIC3R_STATIC)
- target_compile_definitions(libslic3r PUBLIC BOOST_ALL_DYN_LINK)
-endif()
-
if(NOT WIN32)
target_link_libraries(libslic3r freetype)
if (NOT APPLE)
diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp
index 4d8f6a5eda..e75698f80f 100644
--- a/src/libslic3r/Fill/Fill.cpp
+++ b/src/libslic3r/Fill/Fill.cpp
@@ -130,7 +130,252 @@ struct SurfaceFill {
// Detect narrow infill regions
// Based on the anti-vibration algorithm from PrusaSlicer:
-// https://github.com/prusa3d/PrusaSlicer/blob/94290e09d75f23719c3d2ab2398737c8be4c3fd6/src/libslic3r/Fill/FillEnsuring.cpp#L100-L289
+// https://github.com/prusa3d/PrusaSlicer/blob/5dc04b4e8f14f65bbcc5377d62cad3e86c2aea36/src/libslic3r/Fill/FillEnsuring.cpp#L37-L273
+
+static coord_t _MAX_LINE_LENGTH_TO_FILTER() // 4 mm.
+{
+ return scaled(4.);
+}
+const constexpr size_t MAX_SKIPS_ALLOWED = 2; // Skip means propagation through long line.
+const constexpr size_t MIN_DEPTH_FOR_LINE_REMOVING = 5;
+
+struct LineNode
+{
+ struct State
+ {
+ // The total number of long lines visited before this node was reached.
+ // We just need the minimum number of all possible paths to decide whether we can remove the line or not.
+ int min_skips_taken = 0;
+ // The total number of short lines visited before this node was reached.
+ int total_short_lines = 0;
+ // Some initial line is touching some long line. This information is propagated to neighbors.
+ bool initial_touches_long_lines = false;
+ bool initialized = false;
+
+ void reset() {
+ this->min_skips_taken = 0;
+ this->total_short_lines = 0;
+ this->initial_touches_long_lines = false;
+ this->initialized = false;
+ }
+ };
+
+ explicit LineNode(const Line &line) : line(line) {}
+
+ Line line;
+ // Pointers to line nodes in the previous and the next section that overlap with this line.
+ std::vector next_section_overlapping_lines;
+ std::vector prev_section_overlapping_lines;
+
+ bool is_removed = false;
+
+ State state;
+
+ // Return true if some initial line is touching some long line and this information was propagated into the current line.
+ bool is_initial_line_touching_long_lines() const {
+ if (prev_section_overlapping_lines.empty())
+ return false;
+
+ for (LineNode *line_node : prev_section_overlapping_lines) {
+ if (line_node->state.initial_touches_long_lines)
+ return true;
+ }
+
+ return false;
+ }
+
+ // Return true if the current line overlaps with some long line in the previous section.
+ bool is_touching_long_lines_in_previous_layer() const {
+ if (prev_section_overlapping_lines.empty())
+ return false;
+
+ const auto MAX_LINE_LENGTH_TO_FILTER = _MAX_LINE_LENGTH_TO_FILTER();
+ for (LineNode *line_node : prev_section_overlapping_lines) {
+ if (!line_node->is_removed && line_node->line.length() >= MAX_LINE_LENGTH_TO_FILTER)
+ return true;
+ }
+
+ return false;
+ }
+
+ // Return true if the current line overlaps with some line in the next section.
+ bool has_next_layer_neighbours() const {
+ if (next_section_overlapping_lines.empty())
+ return false;
+
+ for (LineNode *line_node : next_section_overlapping_lines) {
+ if (!line_node->is_removed)
+ return true;
+ }
+
+ return false;
+ }
+};
+
+using LineNodes = std::vector;
+
+inline bool are_lines_overlapping_in_y_axes(const Line &first_line, const Line &second_line) {
+ return (second_line.a.y() <= first_line.a.y() && first_line.a.y() <= second_line.b.y())
+ || (second_line.a.y() <= first_line.b.y() && first_line.b.y() <= second_line.b.y())
+ || (first_line.a.y() <= second_line.a.y() && second_line.a.y() <= first_line.b.y())
+ || (first_line.a.y() <= second_line.b.y() && second_line.b.y() <= first_line.b.y());
+}
+
+bool can_line_note_be_removed(const LineNode &line_node) {
+ const auto MAX_LINE_LENGTH_TO_FILTER = _MAX_LINE_LENGTH_TO_FILTER();
+ return (line_node.line.length() < MAX_LINE_LENGTH_TO_FILTER)
+ && (line_node.state.total_short_lines > int(MIN_DEPTH_FOR_LINE_REMOVING)
+ || (!line_node.is_initial_line_touching_long_lines() && !line_node.has_next_layer_neighbours()));
+}
+
+// Remove the node and propagate its removal to the previous sections.
+void propagate_line_node_remove(const LineNode &line_node) {
+ std::queue line_node_queue;
+ for (LineNode *prev_line : line_node.prev_section_overlapping_lines) {
+ if (prev_line->is_removed)
+ continue;
+
+ line_node_queue.emplace(prev_line);
+ }
+
+ for (; !line_node_queue.empty(); line_node_queue.pop()) {
+ LineNode &line_to_check = *line_node_queue.front();
+
+ if (can_line_note_be_removed(line_to_check)) {
+ line_to_check.is_removed = true;
+
+ for (LineNode *prev_line : line_to_check.prev_section_overlapping_lines) {
+ if (prev_line->is_removed)
+ continue;
+
+ line_node_queue.emplace(prev_line);
+ }
+ }
+ }
+}
+
+// Filter out short extrusions that could create vibrations.
+static std::vector filter_vibrating_extrusions(const std::vector &lines_sections) {
+ // Initialize all line nodes.
+ std::vector line_nodes_sections(lines_sections.size());
+ for (const Lines &lines_section : lines_sections) {
+ const size_t section_idx = &lines_section - lines_sections.data();
+
+ line_nodes_sections[section_idx].reserve(lines_section.size());
+ for (const Line &line : lines_section) {
+ line_nodes_sections[section_idx].emplace_back(line);
+ }
+ }
+
+ // Precalculate for each line node which line nodes in the previous and next section this line node overlaps.
+ for (auto curr_lines_section_it = line_nodes_sections.begin(); curr_lines_section_it != line_nodes_sections.end(); ++curr_lines_section_it) {
+ if (curr_lines_section_it != line_nodes_sections.begin()) {
+ const auto prev_lines_section_it = std::prev(curr_lines_section_it);
+ for (LineNode &curr_line : *curr_lines_section_it) {
+ for (LineNode &prev_line : *prev_lines_section_it) {
+ if (are_lines_overlapping_in_y_axes(curr_line.line, prev_line.line)) {
+ curr_line.prev_section_overlapping_lines.emplace_back(&prev_line);
+ }
+ }
+ }
+ }
+
+ if (std::next(curr_lines_section_it) != line_nodes_sections.end()) {
+ const auto next_lines_section_it = std::next(curr_lines_section_it);
+ for (LineNode &curr_line : *curr_lines_section_it) {
+ for (LineNode &next_line : *next_lines_section_it) {
+ if (are_lines_overlapping_in_y_axes(curr_line.line, next_line.line)) {
+ curr_line.next_section_overlapping_lines.emplace_back(&next_line);
+ }
+ }
+ }
+ }
+ }
+
+ const auto MAX_LINE_LENGTH_TO_FILTER = _MAX_LINE_LENGTH_TO_FILTER();
+ // Select each section as the initial lines section and propagate line node states from this initial lines section to the last lines section.
+ // During this propagation, we remove those lines that meet the conditions for its removal.
+ // When some line is removed, we propagate this removal to previous layers.
+ for (size_t initial_line_section_idx = 0; initial_line_section_idx < line_nodes_sections.size(); ++initial_line_section_idx) {
+ // Stars from non-removed short lines.
+ for (LineNode &initial_line : line_nodes_sections[initial_line_section_idx]) {
+ if (initial_line.is_removed || initial_line.line.length() >= MAX_LINE_LENGTH_TO_FILTER)
+ continue;
+
+ initial_line.state.reset();
+ initial_line.state.total_short_lines = 1;
+ initial_line.state.initial_touches_long_lines = initial_line.is_touching_long_lines_in_previous_layer();
+ initial_line.state.initialized = true;
+ }
+
+ // Iterate from the initial lines section until the last lines section.
+ for (size_t propagation_line_section_idx = initial_line_section_idx; propagation_line_section_idx < line_nodes_sections.size(); ++propagation_line_section_idx) {
+ // Before we propagate node states into next lines sections, we reset the state of all line nodes in the next line section.
+ if (propagation_line_section_idx + 1 < line_nodes_sections.size()) {
+ for (LineNode &propagation_line : line_nodes_sections[propagation_line_section_idx + 1]) {
+ propagation_line.state.reset();
+ }
+ }
+
+ for (LineNode &propagation_line : line_nodes_sections[propagation_line_section_idx]) {
+ if (propagation_line.is_removed || !propagation_line.state.initialized)
+ continue;
+
+ for (LineNode *neighbour_line : propagation_line.next_section_overlapping_lines) {
+ if (neighbour_line->is_removed)
+ continue;
+
+ const bool is_short_line = neighbour_line->line.length() < MAX_LINE_LENGTH_TO_FILTER;
+ const bool is_skip_allowed = propagation_line.state.min_skips_taken < int(MAX_SKIPS_ALLOWED);
+
+ if (!is_short_line && !is_skip_allowed)
+ continue;
+
+ const int neighbour_total_short_lines = propagation_line.state.total_short_lines + int(is_short_line);
+ const int neighbour_min_skips_taken = propagation_line.state.min_skips_taken + int(!is_short_line);
+
+ if (neighbour_line->state.initialized) {
+ // When the state of the node was previously filled, then we need to update data in such a way
+ // that will maximize the possibility of removing this node.
+ neighbour_line->state.min_skips_taken = std::max(neighbour_line->state.min_skips_taken, neighbour_total_short_lines);
+ neighbour_line->state.min_skips_taken = std::min(neighbour_line->state.min_skips_taken, neighbour_min_skips_taken);
+
+ // We will keep updating neighbor initial_touches_long_lines until it is equal to false.
+ if (neighbour_line->state.initial_touches_long_lines) {
+ neighbour_line->state.initial_touches_long_lines = propagation_line.state.initial_touches_long_lines;
+ }
+ } else {
+ neighbour_line->state.total_short_lines = neighbour_total_short_lines;
+ neighbour_line->state.min_skips_taken = neighbour_min_skips_taken;
+ neighbour_line->state.initial_touches_long_lines = propagation_line.state.initial_touches_long_lines;
+ neighbour_line->state.initialized = true;
+ }
+ }
+
+ if (can_line_note_be_removed(propagation_line)) {
+ // Remove the current node and propagate its removal to the previous sections.
+ propagation_line.is_removed = true;
+ propagate_line_node_remove(propagation_line);
+ }
+ }
+ }
+ }
+
+ // Create lines sections without filtered-out lines.
+ std::vector lines_sections_out(line_nodes_sections.size());
+ for (const std::vector &line_nodes_section : line_nodes_sections) {
+ const size_t section_idx = &line_nodes_section - line_nodes_sections.data();
+
+ for (const LineNode &line_node : line_nodes_section) {
+ if (!line_node.is_removed) {
+ lines_sections_out[section_idx].emplace_back(line_node.line);
+ }
+ }
+ }
+
+ return lines_sections_out;
+}
+
void split_solid_surface(size_t layer_id, const SurfaceFill &fill, ExPolygons &normal_infill, ExPolygons &narrow_infill)
{
assert(fill.surface.surface_type == stInternalSolid);
@@ -152,11 +397,6 @@ void split_solid_surface(size_t layer_id, const SurfaceFill &fill, ExPolygons &n
constexpr double connect_extrusions = true;
- auto segments_overlap = [](coord_t alow, coord_t ahigh, coord_t blow, coord_t bhigh) {
- return (alow >= blow && alow <= bhigh) || (ahigh >= blow && ahigh <= bhigh) || (blow >= alow && blow <= ahigh) ||
- (bhigh >= alow && bhigh <= ahigh);
- };
-
const coord_t scaled_spacing = scaled(fill.params.spacing);
double distance_limit_reconnection = 2.0 * double(scaled_spacing);
double squared_distance_limit_reconnection = distance_limit_reconnection * distance_limit_reconnection;
@@ -180,22 +420,23 @@ void split_solid_surface(size_t layer_id, const SurfaceFill &fill, ExPolygons &n
AABBTreeLines::LinesDistancer area_walls{to_lines(inner_area)};
- const size_t n_vlines = (bb.max.x() - bb.min.x() + scaled_spacing - 1) / scaled_spacing;
- std::vector vertical_lines(n_vlines);
- coord_t y_min = bb.min.y();
- coord_t y_max = bb.max.y();
+ const size_t n_vlines = (bb.max.x() - bb.min.x() + scaled_spacing - 1) / scaled_spacing;
+ const coord_t y_min = bb.min.y();
+ const coord_t y_max = bb.max.y();
+ Lines vertical_lines(n_vlines);
for (size_t i = 0; i < n_vlines; i++) {
coord_t x = bb.min.x() + i * double(scaled_spacing);
vertical_lines[i].a = Point{x, y_min};
vertical_lines[i].b = Point{x, y_max};
}
- if (vertical_lines.size() > 0) {
+
+ if (!vertical_lines.empty()) {
vertical_lines.push_back(vertical_lines.back());
vertical_lines.back().a = Point{coord_t(bb.min.x() + n_vlines * double(scaled_spacing) + scaled_spacing * 0.5), y_min};
vertical_lines.back().b = Point{vertical_lines.back().a.x(), y_max};
}
- std::vector> polygon_sections(n_vlines);
+ std::vector polygon_sections(n_vlines);
for (size_t i = 0; i < n_vlines; i++) {
const auto intersections = area_walls.intersections_with_line(vertical_lines[i]);
@@ -211,88 +452,7 @@ void split_solid_surface(size_t layer_id, const SurfaceFill &fill, ExPolygons &n
}
}
- struct Node
- {
- int section_idx;
- int line_idx;
- int skips_taken = 0;
- bool neighbours_explored = false;
- std::vector> neighbours{};
- };
-
- coord_t length_filter = scale_(4);
- size_t skips_allowed = 2;
- size_t min_removal_conut = 5;
- for (int section_idx = 0; section_idx < int(polygon_sections.size()); ++section_idx) {
- for (int line_idx = 0; line_idx < int(polygon_sections[section_idx].size()); ++line_idx) {
- if (const Line &line = polygon_sections[section_idx][line_idx]; line.a != line.b && line.length() < length_filter) {
- std::set> to_remove{{section_idx, line_idx}};
- std::vector to_visit{{section_idx, line_idx}};
-
- bool initial_touches_long_lines = false;
- if (section_idx > 0) {
- for (int prev_line_idx = 0; prev_line_idx < int(polygon_sections[section_idx - 1].size()); ++prev_line_idx) {
- if (const Line &nl = polygon_sections[section_idx - 1][prev_line_idx];
- nl.a != nl.b && segments_overlap(line.a.y(), line.b.y(), nl.a.y(), nl.b.y())) {
- initial_touches_long_lines = true;
- }
- }
- }
-
- while (!to_visit.empty()) {
- Node curr = to_visit.back();
- const Line &curr_l = polygon_sections[curr.section_idx][curr.line_idx];
- if (curr.neighbours_explored) {
- bool is_valid_for_removal = (curr_l.length() < length_filter) &&
- ((int(to_remove.size()) - curr.skips_taken > int(min_removal_conut)) ||
- (curr.neighbours.empty() && !initial_touches_long_lines));
- if (!is_valid_for_removal) {
- for (const auto &n : curr.neighbours) {
- if (to_remove.find(n) != to_remove.end()) {
- is_valid_for_removal = true;
- break;
- }
- }
- }
- if (!is_valid_for_removal) {
- to_remove.erase({curr.section_idx, curr.line_idx});
- }
- to_visit.pop_back();
- } else {
- to_visit.back().neighbours_explored = true;
- int curr_index = to_visit.size() - 1;
- bool can_use_skip = curr_l.length() <= length_filter && curr.skips_taken < int(skips_allowed);
- if (curr.section_idx + 1 < int(polygon_sections.size())) {
- for (int lidx = 0; lidx < int(polygon_sections[curr.section_idx + 1].size()); ++lidx) {
- if (const Line &nl = polygon_sections[curr.section_idx + 1][lidx];
- nl.a != nl.b && segments_overlap(curr_l.a.y(), curr_l.b.y(), nl.a.y(), nl.b.y()) &&
- (nl.length() < length_filter || can_use_skip)) {
- to_visit[curr_index].neighbours.push_back({curr.section_idx + 1, lidx});
- to_remove.insert({curr.section_idx + 1, lidx});
- Node next_node{curr.section_idx + 1, lidx, curr.skips_taken + (nl.length() >= length_filter)};
- to_visit.push_back(next_node);
- }
- }
- }
- }
- }
-
- for (const auto &pair : to_remove) {
- Line &l = polygon_sections[pair.first][pair.second];
- l.a = l.b;
- }
- }
- }
- }
-
- for (size_t section_idx = 0; section_idx < polygon_sections.size(); section_idx++) {
- polygon_sections[section_idx].erase(std::remove_if(polygon_sections[section_idx].begin(), polygon_sections[section_idx].end(),
- [](const Line &s) { return s.a == s.b; }),
- polygon_sections[section_idx].end());
- std::sort(polygon_sections[section_idx].begin(), polygon_sections[section_idx].end(),
- [](const Line &a, const Line &b) { if (a == b) return false; // Ensure irreflexivity
- return a.a.y() < b.b.y(); });
- }
+ polygon_sections = filter_vibrating_extrusions(polygon_sections);
Polygons reconstructed_area{};
// reconstruct polygon from polygon sections
diff --git a/src/libslic3r/GCode/FanMover.cpp b/src/libslic3r/GCode/FanMover.cpp
index 762d251b5b..b21711b5a7 100644
--- a/src/libslic3r/GCode/FanMover.cpp
+++ b/src/libslic3r/GCode/FanMover.cpp
@@ -50,7 +50,11 @@ float get_axis_value(const std::string& line, char axis)
char match[3] = " X";
match[1] = axis;
- size_t pos = line.find(match) + 2;
+ size_t pos = line.find(match);
+ if (pos == std::string::npos) {
+ return NAN;
+ }
+ pos += 2;
//size_t end = std::min(line.find(' ', pos + 1), line.find(';', pos + 1));
// Try to parse the numeric value.
const char* c = line.c_str();
@@ -83,6 +87,15 @@ int16_t get_fan_speed(const std::string &line, GCodeFlavor flavor) {
if (flavor == (gcfMach3) || flavor == (gcfMachinekit)) {
return (int16_t)get_axis_value(line, 'P');
} else {
+ // Bambu machines use both M106 P1(not P0!) and M106 for part cooling fan.
+ // Non-bambu machines usually use M106 (without P parameter) for part cooling fan.
+ // P2 is reserved for auxiliary fan regardless of bambu or not.
+ // To keep compatibility with Bambu machines, we accept M106 and M106 P1 as the only two valid form
+ // of gcode that control the part cooling fan. Any other command will be ignored!
+ const auto idx = get_axis_value(line, 'P');
+ if (!isnan(idx) && idx != 1.0f) {
+ return -1;
+ }
return (int16_t)get_axis_value(line, 'S');
}
} else if (line.compare(0, 4, "M127") == 0 || line.compare(0, 4, "M107") == 0) {
diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp
index d1e6d9b3bf..9a6a5718ba 100644
--- a/src/libslic3r/Model.cpp
+++ b/src/libslic3r/Model.cpp
@@ -2785,7 +2785,6 @@ std::vector ModelVolume::get_extruders_from_multi_material_painting() co
if (!this->is_mm_painted())
return {};
- assert(static_cast(EnforcerBlockerType::Extruder1) - 1 == 0);
const TriangleSelector::TriangleSplittingData &data = this->mmu_segmentation_facets.get_data();
std::vector extruders;