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;