diff --git a/localization/i18n/hu/OrcaSlicer_hu.po b/localization/i18n/hu/OrcaSlicer_hu.po index 89fc03574c9..f9a65bb3bef 100644 --- a/localization/i18n/hu/OrcaSlicer_hu.po +++ b/localization/i18n/hu/OrcaSlicer_hu.po @@ -16208,7 +16208,7 @@ msgstr "" #, fuzzy msgid "Detect overhang walls" -msgstr "Túlnyúló fal felismerése" +msgstr "Túlnyúló falak felismerése" #, c-format, boost-format msgid "" @@ -16909,8 +16909,8 @@ msgid "" "Sparse infill areas smaller than this threshold value are replaced by " "internal solid infill." msgstr "" -"A küszöbérték alatti ritkás kitöltési terület belső szilárd kitöltéssel " -"kerül leváltásra" +"Az ennél a küszöbértéknél kisebb ritka kitöltési területek belső " +"tömör kitöltéssel helyettesítődnek." msgid "Solid infill" msgstr "Tömör kitöltés" @@ -17685,15 +17685,15 @@ msgstr "Fúvóka hőmérséklete az első réteg után" #, fuzzy msgid "Detect thin walls" -msgstr "Vékony fal felismerése" +msgstr "Vékony falak felismerése" #, fuzzy msgid "" "Detect thin walls which can't contain two line widths, and use single line " "to print. Maybe not printed very well, because it's not a closed loop." msgstr "" -"Felismeri a vékony falat, amit nem lehet két vonalnyi szélességgel " -"nyomtatni, és egyetlen vonallal nyomtatja" +"Felismeri a vékony falakat, amellyeket nem lehet két vonalnyi szélességgel " +"nyomtatni, és egyetlen vonalt használ. Lehet nem jó a nyomat minősége, mert nem zárt hurok." msgid "" "This G-code is inserted when filament is changed, including T commands to " @@ -18326,7 +18326,7 @@ msgstr "" #, fuzzy msgid "Detect narrow internal solid infills" -msgstr "Keskeny belső szilárd kitöltés felismerése" +msgstr "Keskeny belső szilárd kitöltések felismerése" msgid "" "This option will auto-detect narrow internal solid infill areas. If enabled, " diff --git a/localization/i18n/ru/OrcaSlicer_ru.po b/localization/i18n/ru/OrcaSlicer_ru.po index 7081a80d40b..588002756e3 100644 --- a/localization/i18n/ru/OrcaSlicer_ru.po +++ b/localization/i18n/ru/OrcaSlicer_ru.po @@ -163,7 +163,7 @@ msgstr "Очистить всё" msgid "Highlight overhang areas" msgstr "Выделить зоны нависания" -# Аналогичная строка "Gap Fill" используется в меню поддержек и раскраски в значении "Заливка вкраплений/Устранение вкраплений", но эта строка выводится только в таблице анализа линии (расширенный просмотр печати слоя) в значении "тип: заполнение щели" (Feature type: Gap fill). Не путать! +# Эта строка выводится только в таблице анализа линии (расширенный просмотр печати слоя) в значении "тип: заполнение щели" (Feature type: Gap fill). Аналогичная строка "Gap Fill" используется в меню поддержек и раскраски в значении "Заливка вкраплений/Устранение вкраплений". Не путать! msgid "Gap fill" msgstr "Заполнение щели" @@ -201,7 +201,7 @@ msgstr "Заливка вкраплений" #, boost-format msgid "Allows painting only on facets selected by: \"%1%\"" -msgstr "Позволяет рисовать на выбранных гранях, используя: \"%1%\"" +msgstr "Ограничить область работы инструмента настройкой «%1%»" msgid "Highlight faces according to overhang angle." msgstr "Выделение граней по углу нависания." @@ -610,7 +610,7 @@ msgid "Confirm connectors" msgstr "Готово" msgid "Flip cut plane" -msgstr "Перевернуть секущую плоскость" +msgstr "Сменить направление" msgid "Groove change" msgstr "Изменить паз" @@ -1169,8 +1169,9 @@ msgstr "" msgid "Select from True Type Collection." msgstr "Выберите шрифт True Type." +# Это, по сути, просто встроенный инструмент вращения, тут автоматически задаётся поворот в градусах по трём осям msgid "Set text to face camera" -msgstr "Разместить параллельно экрану" +msgstr "Повернуть к экрану" msgid "Orient the text towards the camera." msgstr "Выровнять текст по направлению к камере" @@ -2270,8 +2271,7 @@ msgid "Restore to meters" msgstr "Восстановить в миллиметры" msgid "Assemble the selected objects to an object with multiple parts" -msgstr "" -"Объединение выбранных объектов в модель, состоящую из нескольких частей" +msgstr "Объединение выбранных объектов в модель, состоящую из нескольких частей" msgid "Assemble the selected objects to an object with single part" msgstr "Объединение выбранных моделей в единую" @@ -2820,6 +2820,7 @@ msgstr "Пауза" msgid "Template" msgstr "Шаблон" +# Тянется из 9 мест: группировка материалов: Auto/Custom, Форма стола: %s, тип линии: %s, калибровка температуры – Тип материала: %s (тут колонки узкие, но место вроде есть),). Причём местами должно согласоваться с разными родами (форма: пользов.). Лучше сократить до Пользов. msgid "Custom" msgstr "Пользовательский" @@ -2857,7 +2858,7 @@ msgid "Insert custom G-code at the beginning of this layer." msgstr "Вставить пользовательский G-код в начале этого слоя." msgid "Add Custom Template" -msgstr "Добавить шаблон пользовательского G-кода" +msgstr "Добавить шаблон" msgid "Insert template custom G-code at the beginning of this layer." msgstr "Вставить шаблон пользовательского G-кода в начале этого слоя." @@ -4166,9 +4167,9 @@ msgstr "Удалить" msgid "Not found:" msgstr "Не найдено:" -# Используется в 7 местах +# Используется в 7 местах – сокращаем, т.к. из-за длины растягивается окно с информацией о печати msgid "Model" -msgstr "3D-модель" +msgstr "Модель" msgid "Choose an STL file to import bed shape from:" msgstr "Выберите файл STL для импорта формы стола:" @@ -4362,7 +4363,7 @@ msgid "" "seam_slope_start_height need to be smaller than layer_height.\n" "Reset to 0." msgstr "" -"seam_slope_start_height должна быть меньше высоты слоя.\n" +"Начальная высота не должна превышать высоту слоя.\n" "Значение сброшено на 0." #, fuzzy, c-format, boost-format @@ -5076,7 +5077,7 @@ msgstr "Видимость" # в результате нарезки это, в профиле прутка msgid "Flushed" -msgstr "Очистка" +msgstr "Прочистка" msgid "Tower" msgstr "Башня" @@ -5481,7 +5482,7 @@ msgstr "Выйти из сборки" msgid "Return" msgstr "Назад" -# Не нашёл в интерфейсе, в коде GLCanvas3D.cpp, 8485 строка (на момент февраля 2026) +# Не нашёл в интерфейсе, в коде GLCanvas3D.cpp, 8485 строка (на момент февраля 2026). Похоже, это внутреннее название кнопки с панелью управления визуалом пространства моделей. msgid "Canvas Toolbar" msgstr "" @@ -5560,34 +5561,35 @@ msgstr "Траектория перемещения в G-коде выходит msgid "Not support printing 2 or more TPU filaments." msgstr "Печать двумя и более прутками TPU не поддерживается." -# Подставляется ID экструдера +# Подставляется ID экструдера. Используется для двухэкструдерных Bambu и тулченджеров. Чтобы не мешать в одном месте "инструмент-насадка", лучше взять более универсальное "экструдер". Подставляется в последующее сообщение. #, c-format, boost-format msgid "Tool %d" -msgstr "Инструмент %d" +msgstr "%d экструдер" #, c-format, boost-format msgid "" "Filament %s is placed in the %s, but the generated G-code path exceeds the " "printable range of the %s." -msgstr "" +msgstr "%s назначен на %s, но итоговый G-код выходит за его предел высоты печати [%s]." #, c-format, boost-format msgid "" "Filaments %s are placed in the %s, but the generated G-code path exceeds the " "printable range of the %s." -msgstr "" +msgstr "%s назначены на %s, но итоговый G-код выходит за его предел высоты печати [%s]." +# Возможно, какая-то специфичная проверка для тулченджеров, на профиле H2D при превышении высоты через подъём при откате оно не выводится. Квадратные скобки – костыль для обхода кривизны системы локализации. #, c-format, boost-format msgid "" "Filament %s is placed in the %s, but the generated G-code path exceeds the " "printable height of the %s." -msgstr "" +msgstr "%s назначен на %s, но итоговый G-код выходит за его предел высоты печати [%s]." #, c-format, boost-format msgid "" "Filaments %s are placed in the %s, but the generated G-code path exceeds the " "printable height of the %s." -msgstr "" +msgstr "%s назначены на %s, но итоговый G-код выходит за его предел высоты печати [%s]." msgid "Open wiki for more information." msgstr "Подробнее на Вики." @@ -5597,12 +5599,12 @@ msgstr "При редактировании другие модели скрыв #, c-format, boost-format msgid "Filaments %s cannot be printed directly on the surface of this plate." -msgstr "" +msgstr "Для печати %s требуется подложка или основание из другого материала." msgid "" "PLA and PETG filaments detected in the mixture. Adjust parameters according " "to the Wiki to ensure print quality." -msgstr "" +msgstr "Обнаружено совместное использование PLA и PETG. Для повышения качества рекомендуется настроить параметры в соответствии с руководством." msgid "The prime tower extends beyond the plate boundary." msgstr "Башня очистки выходит за пределы области печати." @@ -5623,7 +5625,7 @@ msgstr "" "в цветной модели. Рекомендуется изменить настройки прочистки:" msgid "Click Wiki for help." -msgstr "Подробнее на Wiki" +msgstr "Открыть руководство" msgid "Click here to regroup" msgstr "Перегруппировать" @@ -5740,6 +5742,7 @@ msgstr "Авторизация" msgid "Prepare" msgstr "Подготовка" +# Предпросмотр – так места хватает, чтобы в split-режиме на экране целиком умещалась кнопка нарезки msgid "Preview" msgstr "Просмотр нарезки" @@ -5761,8 +5764,9 @@ msgstr "Нет" msgid "will be closed before creating a new model. Do you want to continue?" msgstr "будет закрыт перед созданием новой модели. Хотите продолжить?" +# Возможно, имеет смысл убрать тут "стол". Подавляющее большинство проектов – это размещение моделей и их печать на одном столе, поэтому намёк на работу с несколькими столами тут выглядит излишним. А в режиме работы с несколькими столами по противопоставлению "Нарезать/Нарезать все" и так понятно, что к чему относится. Преимущества – это экономит немного места для соседней кнопки, которая сейчас не видна в split-режиме окон слайсера на некоторых экранах (ноутбуки с оптимальным масштабированием). msgid "Slice plate" -msgstr "Нарезать стол" +msgstr "Нарезать" msgid "Print plate" msgstr "Распечатать стол" @@ -5770,7 +5774,7 @@ msgstr "Распечатать стол" msgid "Export G-code file" msgstr "Экспорт в G-код" -# ??????? Используется в двух местах или уже исправили? – Судя по коду, вызывается аж в четырёх местах (Felix) +# ??????? Используется в двух местах или уже исправили? – Судя по коду, вызывается аж в четырёх местах (Felix) UPD: уже в 5 msgid "Send" msgstr "Отправить" @@ -6080,14 +6084,14 @@ msgstr "Коэффициент PA" # Хотя бы в скобках, но отсылаем к калибровке потока, а не расхода (баг #6970) msgid "Pass 1" -msgstr "Первый проход (примерный подбор потока)" +msgstr "Первый проход (примерный подбор)" # Описание для диктора? Подсказка для других систем? Не нашёл, где выводится в Windows. msgid "Flow rate test - Pass 1" msgstr "Тест потока - 1-ый проход" msgid "Pass 2" -msgstr "Второй проход (точный подбор потока)" +msgstr "Второй проход (точный подбор)" # Описание для диктора? Подсказка для других систем? Не нашёл, где выводится в Windows. msgid "Flow rate test - Pass 2" @@ -6834,8 +6838,9 @@ msgstr "Применимо только во время печати" msgid "Silent" msgstr "Тихий" +# Подставляется в "%s экструдер"; используется везде совместно с "High flow" (Обычный режим/Высокий расход) msgid "Standard" -msgstr "Стандартный" +msgstr "Обычный" msgid "Sport" msgstr "Спортивный" @@ -6848,7 +6853,7 @@ msgid "" "monitoring, like spaghetti detection. Please choose carefully." msgstr "" "Будьте осторожны, выключение освещения в процессе работы приведёт к отказу " -"систем интеллектуального отслеживания (например, обнаружения слетевших " +"систем интеллектуального отслеживания (например, обнаружения отрыва " "моделей)." msgid "Keep it On" @@ -7369,7 +7374,7 @@ msgid "Brass" msgstr "Латунь" msgid "High flow" -msgstr "" +msgstr "Высокий расход" msgid "No wiki link available for this printer." msgstr "Ссылка на руководство по этому принтеру отсутствует." @@ -7442,14 +7447,15 @@ msgstr "Внимание: «%s» экструдер не может печата msgid "Mixing %1% with %2% in printing is not recommended.\n" msgstr "Совмещение %1% с %2% при печати не рекомендуется.\n" -# подстановка в составные уведомления. Часто речь идёт именно об экструдере, а не о сопле, плюс "экструдер" лучше согласуется. +# подстановка в составные уведомления (напр.: "0.2mm Стандартный nozzle"). Часто речь идёт именно об экструдере, а не о сопле, плюс "экструдер" лучше согласуется. msgid " nozzle" msgstr " экструдер" +# Очень кривая подстановка (nozzle_diameter, volume_type), поэтому такой вариант. Например, сейчас получается: "Не рекомендуется одновременно использовать сопло 0.2mm Стандартный экструдер и Bambu PETG Transparent" #, boost-format msgid "" "It is not recommended to print the following filament(s) with %1%: %2%\n" -msgstr "Соплом %1% не рекомендуется печатать %2%\n" +msgstr "Не рекомендуется одновременно использовать сопло %1% и %2%\n" msgid "" "It is not recommended to use the following nozzle and filament " @@ -7758,6 +7764,7 @@ msgstr "" "Во избежание повреждения принтера убедитесь, что G-код в этих профилях " "безопасен!" +# Проверить, где используется (кроме окна сохранения профиля) – может лучше переименовать в "Новый профиль"? Чтобы упростить понимание действия совершаемого слайсером действия. msgid "Customized Preset" msgstr "Пользовательский профиль" @@ -8491,7 +8498,7 @@ msgid "Ask When Relevant" msgstr "автовыбор" msgid "Always Ask" -msgstr "выбор действия" +msgstr "окно выбора" msgid "Load Geometry Only" msgstr "3D-модели" @@ -8516,7 +8523,7 @@ msgid "Add STL/STEP files to recent files list" msgstr "Сохранять STL/STEP в списке последних" msgid "Don't warn when loading 3MF with modified G-code" -msgstr "Отключить предупреждение при загрузке 3MF с модифицированным G-кодом" +msgstr "Не предупреждать при загрузке 3MF с модифицированным G-кодом" msgid "Show options when importing STEP file" msgstr "Показывать настройки импорта STEP" @@ -9078,8 +9085,9 @@ msgstr "Пожалуйста, введите значение слоя (>= 2)." msgid "Plate name" msgstr "Имя стола" +# Длинно и не понятно, зачем – это в настройках столов, переопределение типа покрытия msgid "Same as Global Plate Type" -msgstr "Аналогично глобальному типу пластины" +msgstr "По умолчанию" msgid "Bed type" msgstr "Покрытие" @@ -9126,7 +9134,7 @@ msgid "Packing project data into 3MF file" msgstr "Упаковка данных проекта в файл формата 3mf" msgid "Uploading 3MF" -msgstr "Отправка 3mf" +msgstr "Отправка 3MF" msgid "Jump to model publish web page" msgstr "Перейти на веб-страницу публикации модели" @@ -10833,17 +10841,17 @@ msgstr "" msgctxt "Sync_AMS" msgid "Original" -msgstr "Оригинальные" +msgstr "Исходные" msgid "After mapping" -msgstr "" +msgstr "После назначения" msgid "After overwriting" -msgstr "" +msgstr "После переназначения" msgctxt "Sync_AMS" msgid "Plate" -msgstr "" +msgstr "Стол" msgid "" "The connected printer does not match the currently selected printer. Please " @@ -10851,10 +10859,10 @@ msgid "" msgstr "" msgid "Mapping" -msgstr "" +msgstr "Назначение" msgid "Overwriting" -msgstr "" +msgstr "Переназначение" msgid "Reset all filament mapping" msgstr "" @@ -10901,7 +10909,7 @@ msgid "Advanced settings" msgstr "Расширенные настройки" msgid "Add unused AMS filaments to filaments list." -msgstr "" +msgstr "Добавить незадействованные материалы из AMS в список" msgid "Automatically merge the same colors in the model after mapping." msgstr "" @@ -11032,7 +11040,7 @@ msgid "" "changed or filaments changed. You could disable the auto-calculate in Orca " "Slicer > Preferences" msgstr "" -"Программа будет пересчитывать значения при каждом изменении цвета или смены " +"Значения будут пересчитываться при каждом изменении цвета или смене " "материала. Это можно отключить в настройках." msgid "Flushing volume (mm³) for each filament pair." @@ -11930,15 +11938,14 @@ msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." msgstr "" -"В настоящее время для режима черновой башни поддерживаются только " -"относительные координаты экструдера (use_relative_e_distances=1)." +"Черновая башня пока работает только с относительными координатами экструдера (use_relative_e_distances=1)." msgid "" "Ooze prevention is only supported with the wipe tower when " "'single_extruder_multi_material' is off." msgstr "" "Предотвращение течи материала с помощью черновой башни возможно только при " -"отключении печати через общий экструдер (Настройки принтера → Материалы → " +"отключении печати через общий экструдер (Настройки принтера → Многоцвет → " "Общий экструдер)" msgid "" @@ -12347,7 +12354,7 @@ msgid "Password" msgstr "Пароль" msgid "Ignore HTTPS certificate revocation checks" -msgstr "Игнорировать проверки отзыва сертификата HTTPS" +msgstr "Игнорировать проверки отзыва сертификата" msgid "" "Ignore HTTPS certificate revocation checks in case of missing or offline " @@ -13406,14 +13413,13 @@ msgstr "" msgid "Thick external bridges" msgstr "Толстые внешние мосты" +# Более точно было бы "Переключение модели расчёта потока линии моста с обычной приплюснутой на линию с круглым сечением", но лучше упростить технические кодерские аспекты. msgid "" "If enabled, bridges are more reliable, can bridge longer distances, but may " "look worse. If disabled, bridges look better but are reliable just for " "shorter bridged distances." msgstr "" -"Если включено, мосты печатаются более надёжные и на большие расстояния, но " -"могут выглядеть хуже. Если отключено, мосты выглядят лучше, но они надёжны " -"только на коротких расстояниях." +"Рассматривать мосты как линии с круглым сечением, равным диаметру сопла. Поскольку мосты не имеют опоры, такой подход позволяет более точно расчитывать необходимый поток и надёжнее печатать их на бóльшие расстояния, однако без донастройки их внешний вид может ухудшиться. Если отключено, используется классический вариант мостов с заниженным потоком (приплюснутое сечение линии), что улучшает их внешний вид и точность размеров, но делает их эффективными лишь на коротких расстояниях." msgid "Thick internal bridges" msgstr "Толстые внутренние мосты" @@ -13423,9 +13429,7 @@ msgid "" "have this feature turned on. However, consider turning it off if you are " "using large nozzles." msgstr "" -"Если включено, будут использоваться толстые внутренние мосты. Обычно " -"рекомендуется включить эту функцию. Однако при использовании сопел больших " -"диаметров рекомендуется отключить эту опцию." +"Рассматривать мосты как линии с круглым сечением, равным диаметру сопла." msgid "Extra bridge layers (beta)" msgstr "Двухслойные мосты (beta)" @@ -13827,6 +13831,7 @@ msgstr "" "внешней поверхности. Кроме того, это может приводить к тому, что заполнение " "будет просвечиваться через внешнюю поверхность детали.." +# См. https://github.com/OrcaSlicer/OrcaSlicer/pull/12669 msgid "Wall loop direction" msgstr "Направление печати периметров" @@ -14192,14 +14197,10 @@ msgid "" "3. To avoid printing at speeds which cause VFAs (fine artifacts) on the " "external walls" msgstr "" -"Если включено, то скорость печати внешних периметров не будет снижаться, " -"чтобы уложиться в минимальное время печати слоя. Это особенно полезно при " -"следующих сценариях:\n" -"1. Чтобы при печати глянцевыми материалами избежать изменения блеска\n" -"2. Чтобы избежать появления небольших дефектов, которые возникают при " -"изменении скорости и выглядят как горизонтальные полосы\n" -"3. Чтобы избежать печати на скоростях, при которых на внешних периметрах " -"возникают вертикальные артефакты (VFA)" +"Замедлять только внутреннюю часть модели при попытке уложиться в минимальное время, необходимое для охлаждения слоя. Это позволяет сохранить скорость печати внешнего периметра постоянной и может помочь:\n" +"1. улучшить однородность блеска при печати глянцевыми материалами;\n" +"2. избежать неоднородностей на стыке разных скоростей;\n" +"3. избавить поверхность от ряби (при правильной настройке скорости)." msgid "Layer time" msgstr "Время слоя" @@ -14537,12 +14538,13 @@ msgid "" msgstr "" msgid "Tower ironing area" -msgstr "" +msgstr "Разглаживание черновой башни" +# У H2D не требует, на Вики при этом написано, что требует... В баганном порте "улучшений" башни вообще не работает ни при каких обстоятельствах. msgid "" "Ironing area for prime tower interface layer (where different materials " "meet)." -msgstr "" +msgstr "Площадь разглаживания области на стыке двух разных материалов. Снижает риск столкновения сопла с торчащими кончиками линий при дальнейшей прочистке.\n\nПримечание: эта функция требует включения защитных окон черновой башни." msgid "mm²" msgstr "мм²" @@ -15762,7 +15764,7 @@ msgstr "" "Внимание: не все шаблоны поддерживают поворот." msgid "Skeleton infill density" -msgstr "Плотность внутреннего заполнения" +msgstr "Плотность зигзага" msgid "" "The remaining part of the model contour after removing a certain depth from " @@ -15776,7 +15778,7 @@ msgstr "" "умолчанию равно плотности заполнения." msgid "Skin infill density" -msgstr "Плотность оболочки зигзага" +msgstr "Плотность оболочки" msgid "" "The portion of the model's outer surface within a certain depth range is " @@ -15795,7 +15797,7 @@ msgid "The parameter sets the depth of skin." msgstr "Задаёт глубину создания внутренней оболочки." msgid "Infill lock depth" -msgstr "Перекрытие заполнения" +msgstr "Перекрытие зигзага" msgid "The parameter sets the overlapping depth between the interior and skin." msgstr "Задаёт ширину взаимного перекрытия зигзага и его оболочки." @@ -16468,7 +16470,7 @@ msgid "Nozzle volume" msgstr "Объём сопла" msgid "Volume of nozzle between the cutter and the end of nozzle." -msgstr "Объём сопла между ножом и кончиком сопла." +msgstr "Объём остатка материала между ножом и кончиком сопла." msgid "Cooling tube position" msgstr "Позиция охлаждающей трубки" @@ -16670,7 +16672,7 @@ msgid "Printer variant" msgstr "Модификация принтера" msgid "Raft contact Z distance" -msgstr "Зазор между подложкой и моделью" +msgstr "Зазор под моделью" msgid "Z gap between object and raft. Ignored for soluble interface." msgstr "" @@ -16724,7 +16726,7 @@ msgstr "" "эффекта низкополигональной модели." msgid "Travel distance threshold" -msgstr "Порог перемещения для отката" +msgstr "Порог перемещения" msgid "" "Only trigger retraction when the travel distance is longer than this " @@ -16953,26 +16955,26 @@ msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." msgstr "" -"Эта экспериментальная опция использует команды G10 и G11, чтобы сама " -"прошивка обрабатывала откаты. Не поддерживается в старых версиях Marlin." +"Использовать команды G10 и G11 для динамического управления расстоянием отката/подачи на уровне прошивки. Не поддерживается в старых версиях Marlin.\n\nВнимание: несовместимо с «Очисткой сопла при откате»." msgid "Show auto-calibration marks" msgstr "Отображать на столе линии автокалибровки" +# Не отправлять оценку времени, Не маркировать прогресс печати, Отключить маркировку прогресса печати msgid "Disable set remaining print time" -msgstr "Откл. генерацию оставшегося времени печати" +msgstr "Не отмечать прогресс" msgid "" "Disable generating of the M73: Set remaining print time in the final G-code." msgstr "" -"Отключение генерации команды M73 - вывода оставшегося времени печати в " -"конечный G-код." +"Отключить вставку в G-код команд для вывода прогресса печати и оставшегося времени." +# "Позиция швов"? Технически швов бывает несколько – внешний, внутренний, комбинации обычного/косого и несколько отдельных швов на моделях со сложной геометрией. msgid "Seam position" msgstr "Позиция шва" msgid "The start position to print each part of outer wall." -msgstr "Начальная позиция для печати каждой части внешнего периметра." +msgstr "Расположение точек начала печати внешних периметров.\n\n• Ближайшая – самый быстрый вариант с экономией перемещений.\n• В углах – маскировка шва в выступах и впадинах.\n• В углах сзади – маскировка с приоритетом в задней части.\n• Сзади – размещение шва на максимальной координате по Y.\n• Случайная – распределение шва по всей поверхности." msgid "Nearest" msgstr "Ближайшая" @@ -17325,15 +17327,14 @@ msgstr "" "охлаждения этих слоёв." msgid "Minimum sparse infill threshold" -msgstr "Мин. порог разреженного заполнения" +msgstr "Заполнять области менее" #, fuzzy msgid "" "Sparse infill areas smaller than this threshold value are replaced by " "internal solid infill." msgstr "" -"Область с разреженным заполнением, размер которого меньше этого порогового " -"значения, заменяется сплошным заполнением." +"Заполнять целиком области внутри слоя с площадью меньше указанного значения." msgid "Solid infill" msgstr "Сплошное заполнение" @@ -17650,16 +17651,16 @@ msgid "Tree (manual)" msgstr "[Р] древовидная" msgid "Support/object XY distance" -msgstr "Зазор между моделью и поддержкой по XY" +msgstr "Отступ от модели" msgid "XY separation between an object and its support." -msgstr "Зазор между моделью и поддержкой по осям XY." +msgstr "Расстояние между поддержкой и моделью по горизонтали." msgid "Support/object first layer gap" -msgstr "Зазор между моделью и поддержкой на первом слое" +msgstr "Отступ на первом слое" msgid "XY separation between an object and its support at the first layer." -msgstr "Зазор между моделью и поддержкой по осям XY на первом слое." +msgstr "Расстояние между поддержкой и моделью по горизонтали на первом слое." msgid "Pattern angle" msgstr "Угол шаблона поддержки" @@ -17682,8 +17683,8 @@ msgid "" "Only create support for critical regions including sharp tail, cantilever, " "etc." msgstr "" -"Создание поддержек только для критических областей, включая острые концы, " -"консоли (горизонтально выступающие элементы) и т.д." +"Создавать поддержки только для критических областей (острые концы, " +"выступы, явные нависания и т.п.)" msgid "Ignore small overhangs" msgstr "Игнорировать небольшие нависания" @@ -17866,7 +17867,7 @@ msgstr "" "Горизонтальное расширение (+) или сужение (-) поддержки в плоскости XY." msgid "Speed of support." -msgstr "Скорость печати поддержки." +msgstr "Ограничение линейной скорости при печати поддержки." msgid "" "Style and shape of the support. For normal support, projecting the supports " @@ -17918,8 +17919,9 @@ msgstr "" "времени печати. Опция неактивна, когда включена черновая башня." msgid "Threshold angle" -msgstr "Порог нависания" +msgstr "Максимальный угол" +# На случай, если #12367 не объединят: "Создавать поддержки для поверхностей с указанным или более острым углом нависания над столом. С понижением угла повышается допустимый наклон поверхности для печати без поддержки.\n\nПримечание: используйте 0° для переключения обычных поддержек в режим обнаружения нависаний по проценту выноса линии. Древовидные поддержки при этом будут использовать угол по умолчанию (30°)" ВНИМАНИЕ: последнее предложение – особенность PR msgid "" "Support will be generated for overhangs whose slope angle is below the " "threshold." @@ -17929,7 +17931,7 @@ msgstr "" # ??? Порог перекрытия периметров msgid "Threshold overlap" -msgstr "Порог перекрытия" +msgstr "Минимальный вынос" # ????? Если «Пороговый угол поддержки» равен нулю, поддержка будет создаваться только там, где верхний слой висит в воздухе слишком сильно, т.е. его перекрытие с нижним слоем меньше заданного тут порога. Чем меньше значение, тем более крутые нависания можно печатать без поддержек. msgid "" @@ -17937,7 +17939,7 @@ msgid "" "overlap is below the threshold. The smaller this value is, the steeper the " "overhang that can be printed without support." msgstr "" -"Задаёт порог перекрытия периметров для генерации поддержки.\n" +"Пороговое значение для печати периметров без поддержки.\n" "Если «Порог нависания» равен нулю, поддержка будет создаваться для " "нависающих участков, где верхний периметр опирается на нижний менее чем на " "заданный процент своей ширины. Чем меньше значение этого параметра, тем " @@ -18288,13 +18290,13 @@ msgid "" msgstr "" "Выполнять откат совместно с небольшим движением вдоль напечатанной линии, " "чтобы очистить сопло от подтёков материала. Это может уменьшить «паутину» и " -"дефекты переэкструзии при печати новой линии после холостого перемещения." +"дефекты переэкструзии при печати новой линии после холостого перемещения.\n\nВнимание: несовместимо с «Откатом на уровне прошивки»." # Как выяснилось в чате K3D, "Расстояние очистки" вводит людей в заблуждение, т.к. из-за путаницы в старой терминологии люди думали, что очистка здесь – это откат (его часть). msgid "Wipe Distance" msgstr "Длина движения очистки" -# Очень кривая формулировка с "retraction move" – в другой настройке в оригинале так назван непосредственно откат, что вводит в заблуждение. Тут имеется ввиду именнт движение при откате, при котором остатки пластика вытираются об линию. Зачем это дублируется здесь – без понятия, эта же информация в другой формулировке сообщается пользователю в предыдущей настройке. Удалено последнее предложение – оно не имеет ничего общего с реальностью и вводит в заблуждение (см. описание первичного отката) +# Очень кривая формулировка с "retraction move" – в другой настройке в оригинале так назван непосредственно откат, что вводит в заблуждение. Тут имеется ввиду именно движение при откате, при котором остатки пластика вытираются об линию. Зачем это дублируется здесь – без понятия, эта же информация в другой формулировке сообщается пользователю в предыдущей настройке. msgid "" "Describe how long the nozzle will move along the last path when retracting.\n" "\n" @@ -18307,9 +18309,9 @@ msgid "" msgstr "" "Расстояние перемещения при выполнении движения очистки.\n" "\n" -"В зависимости от длительности очистки, скорости и длины отката настройка " -"перемещения может потребоваться, чтобы лучше очищать подтёки материала из " -"сопла." +"В зависимости от длительности очистки, скорости и длины отката эта настройка " +"может понадобиться, чтобы лучше очищать подтёки материала из " +"сопла.\n\nВнимание: процент первичного отката будет увеличен, если длины очистки окажется недостаточно при текущей скорости отката (или из-за иных ограничений)." msgid "" "The wiping tower can be used to clean up the residue on the nozzle and " @@ -18325,8 +18327,7 @@ msgstr "Внутренние рёбра" msgid "Enable internal ribs to increase the stability of the prime tower." msgstr "" -"Создавать внутренние рёбра жёсткости для повышения стабильности печати " -"черновой башни." +"Создавать внутренние опоры на протяжении всей высоты башни для повышения её устойчивости. Если отключено, опоры создаются только под слоями прочистки материала.\n\nПримечание: влияет только на принтеры Bambu, в остальных случаях башня автоматически сужается по необходимости." # ??? настройка отключена в коде msgid "Purging volumes" @@ -18443,9 +18444,9 @@ msgstr "" "3. Рёбра жёсткости, которые добавляются по четырём углам черновой башни для " "повышения устойчивости." -# Тянется из "Форма стола" и "Форма черновой башни" +# Тянется из "Форма стола" (в создании принтера) и "Форма черновой башни" msgid "Rectangle" -msgstr "Прямоугольник" +msgstr "Прямоугольная" msgid "Rib" msgstr "Усиленная" @@ -18681,9 +18682,10 @@ msgid "" "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " "following format: \"XxY, XxY, ...\"" msgstr "" -"Размеры изображения, которые будут сохранены в файлах .sl1 / .sl1s в " -"следующем формате: \"XxY, XxY, ...\"" +"Параметры изображений для сохранения в файлах .gcode, .sl1 и .sl1s. Задаются в " +"следующем виде: \"XxY/PNG, XxY/PNG, ...\".\nПоддерживаются форматы JPG, PNG, QOI, BTT_TFT и COLPIC." +# Легаси, сейчас формат задаётся отдельно для каждого отдельного изображения внутри файла. msgid "Format of G-code thumbnails" msgstr "Формат эскизов G-кода" @@ -18714,15 +18716,13 @@ msgid "" "very thin areas is used gap-fill. Arachne engine produces walls with " "variable extrusion width." msgstr "" -"Движок классического генератора периметров создаёт их с постоянной шириной " -"экструзии, а для очень тонких участков используется параметр «Заполнять " -"щели».\n" +"Классический генератор создаёт периметры с постоянной шириной линии, " +"а для очень тонких участков используется заполнение щелей.\n" "\n" -"Движок Arachne же создаёт периметры с переменной шириной экструзии, что " -"позволяет печатать без щелей, лучше пропечатывать мелкие элементы (при " -"условии, что у вас правильно откалиброван LA/PA). Этот параметр также влияет " -"на концентрическое заполнение." +"Генератор Arachne создаёт периметры с адаптивной шириной линии, что при правильно настроенном Pressure Advance " +"позволяет избегать образования щелей и лучше печатать мелкие элементы." +# Исторически переводим по названию движка, а так по контексту тут новичкам было бы полнятнее "Адаптивный" генератор. msgid "Arachne" msgstr "Arachne" @@ -20600,7 +20600,7 @@ msgid "" "Recommended: Set Damp to 0.\n" "This will use the printer's default or saved value." msgstr "" -"Совет: установите значение затухания (Damp) равным 0\n" +"Совет: установите значение затухания (Damp) равным 0 " "для использования значения из прошивки принтера." msgid "" @@ -20613,7 +20613,7 @@ msgstr "" msgid "Please input a valid damping factor (0 < Damping/zeta factor <= 1)" msgstr "" "Введите допустимый коэффициент затухания (0 < Затухание/коэффициент " -"затухания <= 1)" +"затухания ≤ 1)" msgid "Input shaping Damp test" msgstr "Тест затухания Input shaping" @@ -20640,14 +20640,13 @@ msgid "" "Please input valid values:\n" "(0 < Freq < 500)" msgstr "" -"Введите допустимые значения:\n" -"(0 < Частота < 500)" +"Введите допустимое значение:\n" +"(0 < частота < 500)" msgid "" "Please input a valid damping factor (0 <= DampingStart < DampingEnd <= 1)" msgstr "" -"Введите допустимый коэффициент затухания (0 <= DampingStart < DampingEnd <= " -"1)" +"Введите допустимый коэффициент затухания (0 ≤ начало < конец ≤ 1)" msgid "Cornering test" msgstr "Тест прохождения углов" @@ -20667,12 +20666,13 @@ msgstr "Тестируемый диапазон" msgid "Note: Lower values = sharper corners but slower speeds." msgstr "Примечание: чем ниже значения, тем острее и медленнее печатаются углы." +# Junction Deviation – a, c, e и o заменены на кириллические для обхода бага с расчётом ширины текста для переноса строк (чтобы текст не обрезался, короче). msgid "" "Marlin 2 Junction Deviation detected:\n" "To test Classic Jerk, set 'Maximum Junction Deviation' in Motion ability to " "0." msgstr "" -"Внимание: тестируется работа Junction Deviation.\n" +"Внимание: тестируется Junсtiоn Dеviаtiоn.\n" "Для тестирования рывков необходимо обнулить его значение (профиль принтера → " "ограничения → рывки → Макс. значение Junction Deviation)." @@ -21514,14 +21514,13 @@ msgstr "Веб-интерфейс хоста печати на вкладке « msgid "Replace the BambuLab's device tab with print host webui" msgstr "Заменить вкладку принтера BambuLab на веб-интерфейс хоста печати" -# Слишком мало места, текст срезается. Костылим с неразрывными пробелами. +# HTTPS – на кириллице, чтобы обойти баг с переносом. msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." msgstr "" -"Файл корневого сертификата HTTPS необходим только при\n" -"использовании HTTPS с самоподписанным сертификатом.\n" -" " +"Файл корневого сертификата НТТРS необходим только при использовании\n" +"НТТРS с самоподписанным сертификатом." msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "Файлы сертификатов (*.crt, *.pem)|*.crt;*.pem|Все файлы|*.*" @@ -22288,7 +22287,7 @@ msgid "We will slice according to this grouping method:" msgstr "Осуществлять нарезку в соответствии с этой группировкой:" msgid "Tip: You can drag the filaments to reassign them to different nozzles." -msgstr "Совет: для назначения материала можно перетащить его в нужное поле." +msgstr "Совет: для назначения материала перетащите его в нужное поле." msgid "" "The filament grouping method for current plate is determined by the dropdown " diff --git a/resources/profiles/OrcaFilamentLibrary.json b/resources/profiles/OrcaFilamentLibrary.json index 4a6838b51d2..b3ab214e332 100644 --- a/resources/profiles/OrcaFilamentLibrary.json +++ b/resources/profiles/OrcaFilamentLibrary.json @@ -392,6 +392,10 @@ "name": "AliZ PLA @base", "sub_path": "filament/AliZ/AliZ PLA @base.json" }, + { + "name": "FILL3D PLA Turbo @base", + "sub_path": "filament/FILL3D/FILL3D PLA Turbo @base.json" + }, { "name": "Bambu PLA Aero @base", "sub_path": "filament/Bambu/Bambu PLA Aero @base.json" @@ -1052,6 +1056,10 @@ "name": "AliZ PLA @System", "sub_path": "filament/AliZ/AliZ PLA @System.json" }, + { + "name": "FILL3D PLA Turbo @System", + "sub_path": "filament/FILL3D/FILL3D PLA Turbo @System.json" + }, { "name": "Bambu PLA Aero @System", "sub_path": "filament/Bambu/Bambu PLA Aero @System.json" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/FILL3D/FILL3D PLA Turbo @System.json b/resources/profiles/OrcaFilamentLibrary/filament/FILL3D/FILL3D PLA Turbo @System.json new file mode 100644 index 00000000000..028011b1093 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/FILL3D/FILL3D PLA Turbo @System.json @@ -0,0 +1,9 @@ +{ + "type": "filament", + "setting_id": "FILL3D001SYS", + "name": "FILL3D PLA Turbo @System", + "from": "system", + "instantiation": "true", + "inherits": "FILL3D PLA Turbo @base", + "compatible_printers": [] +} diff --git a/resources/profiles/OrcaFilamentLibrary/filament/FILL3D/FILL3D PLA Turbo @base.json b/resources/profiles/OrcaFilamentLibrary/filament/FILL3D/FILL3D PLA Turbo @base.json new file mode 100644 index 00000000000..eb107903d6a --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/FILL3D/FILL3D PLA Turbo @base.json @@ -0,0 +1,95 @@ +{ + "type": "filament", + "name": "FILL3D PLA Turbo @base", + "from": "system", + "filament_id": "FILL3D001", + "instantiation": "false", + "inherits": "fdm_filament_pla", + "adaptive_pressure_advance": [ + "1" + ], + "adaptive_pressure_advance_model": [ + "0.03,23.43,5000\n0.028,25.31,5000\n0.025,28.12,5000\n0.025,23.43,12000\n0.020,25.31,12000\n0.018,28.12,12000" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "35" + ], + "cool_plate_temp_initial_layer": [ + "35" + ], + "enable_pressure_advance": [ + "1" + ], + "fan_cooling_layer_time": [ + "100" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cost": [ + "25.4" + ], + "filament_density": [ + "1.31" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "32" + ], + "filament_type": [ + "PLA" + ], + "filament_vendor": [ + "FILL3D" + ], + "hot_plate_temp": [ + "55" + ], + "hot_plate_temp_initial_layer": [ + "55" + ], + "nozzle_temperature": [ + "235" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "pressure_advance": [ + "0.036" + ], + "slow_down_layer_time": [ + "4" + ], + "slow_down_min_speed": [ + "10" + ], + "supertack_plate_temp": [ + "45" + ], + "supertack_plate_temp_initial_layer": [ + "45" + ], + "temperature_vitrification": [ + "45" + ], + "textured_plate_temp": [ + "55" + ], + "textured_plate_temp_initial_layer": [ + "55" + ] +} diff --git a/resources/web/data/text.js b/resources/web/data/text.js index a39270c0421..e5d31d252c4 100644 --- a/resources/web/data/text.js +++ b/resources/web/data/text.js @@ -1112,7 +1112,7 @@ var LangText = { t112: "Присоединяйтесь к программе", t113: "Вы можете изменить свой выбор в любое время.", t126: "Загрузка...", - orca1: "Редактировать информацию о проекте", + orca1: "Изменить информацию", orca2: "Информация отсутствует", orca3: "Режим конфиденциальности", orca4: "Это остановит передачу данных в облачные сервисы Bambu. Помешает только владельцам Bambu Lab, не использующим режим «Только LAN».", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 914cfe4becf..6463338f7d6 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1235,6 +1235,16 @@ StringObjectException Print::validate(StringObjectException *warning, Polygons* } if (m_config.enable_prime_tower) { + for (const PrintObject* object : m_objects) { + if (object->config().precise_z_height.value && warning != nullptr) { + StringObjectException warningtemp; + warningtemp.string = L("Enabling both precise Z height and the prime tower may cause slicing errors."); + warningtemp.opt_key = "precise_z_height"; + warningtemp.is_warning = true; + *warning = warningtemp; + break; + } + } } else { if (m_config.enable_wrapping_detection && warning!=nullptr) { StringObjectException warningtemp; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index e83e461ea91..b9becfa63c4 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -38,7 +38,6 @@ #include "slic3r/Utils/UndoRedo.hpp" #include "slic3r/Utils/MacDarkMode.hpp" -#include #include #if ENABLE_RETINA_GL @@ -2835,15 +2834,8 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re DynamicPrintConfig& proj_cfg = wxGetApp().preset_bundle->project_config; float x = dynamic_cast(proj_cfg.option("wipe_tower_x"))->get_at(plate_id); float y = dynamic_cast(proj_cfg.option("wipe_tower_y"))->get_at(plate_id); - // Helper: persist corrected wipe tower position to config so the next slice uses valid coords. - auto persist_wipe_tower_pos = [&](float nx, float ny) { - ConfigOptionFloat cx(nx), cy(ny); - proj_cfg.option("wipe_tower_x")->set_at(&cx, plate_id, 0); - proj_cfg.option("wipe_tower_y")->set_at(&cy, plate_id, 0); - }; float w = dynamic_cast(m_config->option("prime_tower_width"))->value; float a = dynamic_cast(proj_cfg.option("wipe_tower_rotation_angle"))->value; - // BBS float v = dynamic_cast(m_config->option("prime_volume"))->value; Vec3d plate_origin = ppl.get_plate(plate_id)->get_origin(); @@ -2870,31 +2862,9 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re } coordf_t plate_bbox_x_min_local_coord = plate_bbox_2d.min(0) - plate_origin(0); - coordf_t plate_bbox_y_min_local_coord = plate_bbox_2d.min(1) - plate_origin(1); coordf_t plate_bbox_x_max_local_coord = plate_bbox_2d.max(0) - plate_origin(0); coordf_t plate_bbox_y_max_local_coord = plate_bbox_2d.max(1) - plate_origin(1); - const float tower_w = (float) wipe_tower_size(0); - const float tower_h = (float) wipe_tower_size(1); - const float min_x = (float) plate_bbox_x_min_local_coord + margin; - const float max_x = (float) plate_bbox_x_max_local_coord - margin; - const float min_y = (float) plate_bbox_y_min_local_coord + margin; - const float max_y = (float) plate_bbox_y_max_local_coord - margin; - - // snap wipe tower back to nearest edge if it was initially loaded outside the plate boundary - float new_x = (x < min_x) ? min_x : ((x + tower_w > max_x) ? (max_x - tower_w) : x); - float new_y = (y < min_y) ? min_y : ((y + tower_h > max_y) ? (max_y - tower_h) : y); - - if (new_x != x || new_y != y) { - // do notification - _set_warning_notification(EWarning::PreviewPrimeTowerOutside, true); - x = new_x; - y = new_y; - // Persist the correction to config so the next slice uses the valid position - persist_wipe_tower_pos(new_x, new_y); - } - - if (!current_print->is_step_done(psWipeTower) || !current_print->wipe_tower_data().wipe_tower_mesh_data) { // update for wipe tower position { @@ -2914,13 +2884,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re BoundingBoxf3 plate_bbox = wxGetApp().plater()->get_partplate_list().get_plate(plate_id)->get_build_volume(true); BoundingBox plate_bbox2d = BoundingBox(scaled(Vec2f(plate_bbox.min[0], plate_bbox.min[1])), scaled(Vec2f(plate_bbox.max[0], plate_bbox.max[1]))); Vec2f offset = WipeTower::move_box_inside_box(tower_bottom_bbox, plate_bbox2d, scaled(margin)); - // move_box_inside_box returns mm (already unscaled); apply directly. - // If the actual brim polygon is outside bounds, persist the correction to config. - float display_x = x + offset[0]; - float display_y = y + offset[1]; - if (offset.norm() > float(EPSILON)) - persist_wipe_tower_pos(display_x, display_y); - int volume_idx_wipe_tower_new = m_volumes.load_real_wipe_tower_preview(1000 + plate_id, display_x + plate_origin(0), display_y + plate_origin(1), + int volume_idx_wipe_tower_new = m_volumes.load_real_wipe_tower_preview(1000 + plate_id, x + plate_origin(0), y + plate_origin(1), current_print->wipe_tower_data().wipe_tower_mesh_data->real_wipe_tower_mesh, current_print->wipe_tower_data().wipe_tower_mesh_data->real_brim_mesh, true,a,/*!print->is_step_done(psWipeTower)*/ true, m_initialized); @@ -9679,9 +9643,6 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state) case EWarning::PrimeTowerOutside: text = _u8L("The prime tower extends beyond the plate boundary."); break; - case EWarning::PreviewPrimeTowerOutside: - text = _u8L("Prime tower position exceeded build plate boundaries and was repositioned to the nearest valid edge."); - break; case EWarning::NozzleFilamentIncompatible: { text = _u8L(get_nozzle_filament_incompatible_text()); break; @@ -9836,6 +9797,10 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state) bool GLCanvas3D::is_flushing_matrix_error() { + // Flushing volumes only apply to single-extruder multi-material (SEMM) and BBL printers + if (!Sidebar::should_show_SEMM_buttons()) + return false; + const auto &project_config = wxGetApp().preset_bundle->project_config; const std::vector &config_matrix = (project_config.option("flush_volumes_matrix"))->values; const std::vector &config_multiplier = (project_config.option("flush_multiplier"))->values; diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 6434ab4389b..17a388c731d 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -381,14 +381,13 @@ class GLCanvas3D ToolHeightOutside, TPUPrintableError, FilamentPrintableError, - LeftExtruderPrintableError, // before slice - RightExtruderPrintableError, // before slice - MultiExtruderPrintableError, // after slice - MultiExtruderHeightOutside, // after slice + LeftExtruderPrintableError, // before slice + RightExtruderPrintableError, // before slice + MultiExtruderPrintableError, // after slice + MultiExtruderHeightOutside, // after slice FilamentUnPrintableOnFirstLayer, MixUsePLAAndPETG, - PrimeTowerOutside, // after slice - PreviewPrimeTowerOutside, // before slice + PrimeTowerOutside, NozzleFilamentIncompatible, MixtureFilamentIncompatible, FlushingVolumeZero diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index 5be497059c8..98c285f46aa 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -3755,11 +3755,6 @@ void PartPlateList::init() m_plate_cols = 1; m_current_plate = 0; - if (m_plater) { - // In GUI mode - set_default_wipe_tower_pos_for_plate(0); - } - select_plate(0); unprintable_plate.set_index(1); @@ -4058,7 +4053,7 @@ void PartPlateList::release_icon_textures() } } -void PartPlateList::set_default_wipe_tower_pos_for_plate(int plate_idx) +void PartPlateList::set_default_wipe_tower_pos_for_plate(int plate_idx, bool init_pos) { DynamicConfig & proj_cfg = wxGetApp().preset_bundle->project_config; ConfigOptionFloats *wipe_tower_x = proj_cfg.opt("wipe_tower_x"); @@ -4068,19 +4063,69 @@ void PartPlateList::set_default_wipe_tower_pos_for_plate(int plate_idx) auto printer_structure_opt = wxGetApp().preset_bundle->printers.get_edited_preset().config.option>("printer_structure"); // set the default position, the same with print config(left top) - ConfigOptionFloat wt_x_opt(WIPE_TOWER_DEFAULT_X_POS); - ConfigOptionFloat wt_y_opt(WIPE_TOWER_DEFAULT_Y_POS); + float x = WIPE_TOWER_DEFAULT_X_POS; + float y = WIPE_TOWER_DEFAULT_Y_POS; if (printer_structure_opt && printer_structure_opt->value == PrinterStructure::psI3) { - wt_x_opt = ConfigOptionFloat(I3_WIPE_TOWER_DEFAULT_X_POS); - wt_y_opt = ConfigOptionFloat(I3_WIPE_TOWER_DEFAULT_Y_POS); + x = I3_WIPE_TOWER_DEFAULT_X_POS; + y = I3_WIPE_TOWER_DEFAULT_Y_POS; } - // Clamp default position to fit within the actual plate dimensions so the wipe tower - // doesn't start outside the bed for printers smaller than the hardcoded defaults. - const double wt_default_margin = 2.; - const double wt_estimated_width = 60.; // conservative estimate matching prime_tower_width default - const double wt_estimated_depth = 20.; // conservative depth estimate - wt_x_opt.value = std::max(wt_default_margin, std::min(wt_x_opt.value, m_plate_width - wt_estimated_width - wt_default_margin)); - wt_y_opt.value = std::max(wt_default_margin, std::min(wt_y_opt.value, m_plate_depth - wt_estimated_depth - wt_default_margin)); + + PartPlate *part_plate = get_plate(plate_idx); + Vec3d plate_origin = part_plate->get_origin(); + BoundingBoxf3 plate_bbox = part_plate->get_bounding_box(); + BoundingBoxf plate_bbox_2d(Vec2d(plate_bbox.min(0), plate_bbox.min(1)), Vec2d(plate_bbox.max(0), plate_bbox.max(1))); + const std::vector &extruder_areas = part_plate->get_extruder_areas(); + for (const Pointfs &points : extruder_areas) { + BoundingBoxf bboxf(points); + plate_bbox_2d.min = plate_bbox_2d.min(0) >= bboxf.min(0) ? plate_bbox_2d.min : bboxf.min; + plate_bbox_2d.max = plate_bbox_2d.max(0) <= bboxf.max(0) ? plate_bbox_2d.max : bboxf.max; + } + + coordf_t plate_bbox_x_min_local_coord = plate_bbox_2d.min(0) - plate_origin(0); + coordf_t plate_bbox_x_max_local_coord = plate_bbox_2d.max(0) - plate_origin(0); + coordf_t plate_bbox_y_max_local_coord = plate_bbox_2d.max(1) - plate_origin(1); + + std::vector filament_maps = part_plate->get_real_filament_maps(proj_cfg); + DynamicPrintConfig full_config = wxGetApp().preset_bundle->full_config(false, filament_maps); + const DynamicPrintConfig &print_cfg = wxGetApp().preset_bundle->prints.get_edited_preset().config; + float w = dynamic_cast(print_cfg.option("prime_tower_width"))->value; + float v = dynamic_cast(full_config.option("prime_volume"))->value; + bool enable_wrapping = false; + const ConfigOptionBool *wrapping_opt = dynamic_cast(full_config.option("enable_wrapping_detection")); + if (wrapping_opt) enable_wrapping = wrapping_opt->value; + int nozzle_nums = wxGetApp().preset_bundle->get_printer_extruder_count(); + Vec3d wipe_tower_size = part_plate->estimate_wipe_tower_size(print_cfg, w, v, nozzle_nums, init_pos ? 2 : 0, false, enable_wrapping); + + if (!init_pos && (is_approx(wipe_tower_size(0), 0.0) || is_approx(wipe_tower_size(1), 0.0))) { + wipe_tower_size = part_plate->estimate_wipe_tower_size(print_cfg, w, v, nozzle_nums, 2, false, enable_wrapping); + } + + // Compute brim-aware margin: brim extends outward from tower position + float brim_width = 0.f; + const ConfigOptionFloat *brim_opt = print_cfg.option("prime_tower_brim_width"); + if (brim_opt) { + brim_width = brim_opt->value; + if (brim_width < 0) brim_width = WipeTower::get_auto_brim_by_height((float) wipe_tower_size.z()); + } + const float margin = WIPE_TOWER_MARGIN + brim_width; + + // clamp wipe tower position within plate boundaries + { + if (x + margin + wipe_tower_size(0) > plate_bbox_x_max_local_coord) { + x = plate_bbox_x_max_local_coord - wipe_tower_size(0) - margin; + } else if (x < margin + plate_bbox_x_min_local_coord) { + x = margin + plate_bbox_x_min_local_coord; + } + + if (y + margin + wipe_tower_size(1) > plate_bbox_y_max_local_coord) { + y = plate_bbox_y_max_local_coord - wipe_tower_size(1) - margin; + } else if (y < margin) { + y = margin; + } + } + + ConfigOptionFloat wt_x_opt(x); + ConfigOptionFloat wt_y_opt(y); dynamic_cast(proj_cfg.option("wipe_tower_x"))->set_at(&wt_x_opt, plate_idx, 0); dynamic_cast(proj_cfg.option("wipe_tower_y"))->set_at(&wt_y_opt, plate_idx, 0); } @@ -4191,6 +4236,11 @@ void PartPlateList::reinit() //re-calc the bounding boxes calc_bounding_boxes(); + if (m_plater) { + // In GUI mode + set_default_wipe_tower_pos_for_plate(0, true); + } + return; } @@ -4262,7 +4312,7 @@ int PartPlateList::create_plate(bool adjust_position) // update wipe tower config if (m_plater) { // In GUI mode - set_default_wipe_tower_pos_for_plate(new_index); + set_default_wipe_tower_pos_for_plate(new_index, true); } unprintable_plate.set_index(new_index+1); diff --git a/src/slic3r/GUI/PartPlate.hpp b/src/slic3r/GUI/PartPlate.hpp index 70e3ec8e9ac..9585c7aa953 100644 --- a/src/slic3r/GUI/PartPlate.hpp +++ b/src/slic3r/GUI/PartPlate.hpp @@ -628,13 +628,12 @@ class PartPlateList : public ObjectBase void generate_icon_textures(); void release_icon_textures(); - void set_default_wipe_tower_pos_for_plate(int plate_idx); - friend class cereal::access; friend class UndoRedo::StackImpl; friend class PartPlate; public: + void set_default_wipe_tower_pos_for_plate(int plate_idx, bool init_pos = false); class BedTextureInfo { public: class TexturePart { diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 5e68e9de30e..4534b0886af 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -10505,11 +10505,16 @@ void Plater::priv::init_notification_manager() void Plater::priv::update_objects_position_when_select_preset(const std::function &select_prest) { - // TODO: Orca hack select_prest(); wxGetApp().obj_list()->update_object_list_by_printer_technology(); + // Re-clamp wipe tower positions to new bed boundaries after preset change + PartPlateList &cur_plate_list = this->partplate_list; + for (size_t plate_id = 0; plate_id < cur_plate_list.get_plate_list().size(); ++plate_id) { + cur_plate_list.set_default_wipe_tower_pos_for_plate(plate_id); + } + update(); } diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 954923cfdd1..c94fd1c7a4f 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1589,7 +1589,7 @@ void Tab::on_value_change(const std::string& opt_key, const boost::any& value) } bool is_precise_z_height = m_config->option("precise_z_height")->value; if (boost::any_cast(value) && is_precise_z_height) { - MessageDialog dlg(wxGetApp().plater(), _L("Enabling both precise Z height and the prime tower may cause the size of prime tower to increase. Do you still want to enable?"), + MessageDialog dlg(wxGetApp().plater(), _L("Enabling both precise Z height and the prime tower may cause slicing errors. Do you still want to enable?"), _L("Warning"), wxICON_WARNING | wxYES | wxNO); if (dlg.ShowModal() == wxID_NO) { DynamicPrintConfig new_conf = *m_config; @@ -1631,7 +1631,7 @@ void Tab::on_value_change(const std::string& opt_key, const boost::any& value) if (opt_key == "precise_z_height") { bool wipe_tower_enabled = m_config->option("enable_prime_tower")->value; if (boost::any_cast(value) && wipe_tower_enabled) { - MessageDialog dlg(wxGetApp().plater(), _L("Enabling both precise Z height and the prime tower may cause the size of prime tower to increase. Do you still want to enable?"), + MessageDialog dlg(wxGetApp().plater(), _L("Enabling both precise Z height and the prime tower may cause slicing errors. Do you still want to enable precise Z height?"), _L("Warning"), wxICON_WARNING | wxYES | wxNO); if (dlg.ShowModal() == wxID_NO) { DynamicPrintConfig new_conf = *m_config;