Метки: slic3r  
2019-07-11  
  
Раздел: Секреты и лайфхаки 3D печати, Слайсеры  
Автор: dark184 Просмотров: 5 243  
Нет комментариев
Slic3r, макросы.
Добавлено в закладки: 2
В очередной раз восхищаюсь возможностями Slic3R, а точнее Slic3r Prusa Edition или просто Slic3r PE. Начиная с версии 2.0.0 разработчики сменили название на PrusaSlicer. Тем не менее хуже он от этого не стал.
В этой статье хочу рассказать еще об одной интересной возможности указанного слайсера, это макросы. Что они могут? Судя по информации, которую мне удалось собрать, возможности макросов не сильно впечатляют, тем не менее в определенных случаях могут очень сильно выручить. Самый простой пример, это термобашня для подбора температуры хотэнда.
Те, кто понимает о чем речь и без меня неплохо разберутся, да и почитать в оригинале никогда лишним не будет, поэтому здесь лежит англоязычное описание. Для остальных переведу эту страничку, приведу в более читабельный вид и дам комментарии там, где они требуются.
Перед тем как начать, стоит разобраться с синтаксисом:
1. Условие
{if <условие 1>}<GCode условия 1>
[{elsif <условие 2>}<GCode условия 2>]
…….
[{elsif <условие n>}<GCode условия n>]
[{else}<GCode если ни одно условие не выполнено>]
{endif}
{} – фигурные скобки обязательны.
<> – здесь служат только для визуального выделения выражений, условий и т.д. Прописывать их в реальном коде нельзя.
[] – все что заключено в квадратные скобки (в реальных макросах эти скобки также не пишутся), это не обязательные конструкции, при написании макросов их можно опустить, если в них нет необходимости.
Разберем построчно данный макрос
{if <условие 1>}<GCode условия 1> – если <условие 1> верно, выполнится строка <GCode условия 1> и выполнение макроса завершится. Все строки до {endif} будут проигнорированы. Если же <условие 1> ложно, то будет проигнорирована только <GCode условия 1> и макрос исполняется далее. Также следует иметь ввиду, оператор if всегда записывается первым.
[{elsif <условие 2>}<GCode условия 2>] – оператор необязательный. Elsif по сути означает “иначе если”, применяется исключительно только с {if <условие 1>}. Действие оператора elsif полностью аналогично оператору if, с той лишь разницей, elsif выполнится при условии что {if <условие 1>} ложно. Как видно таких операторов может быть много, к сожалению мне не удалось найти информации о точном количестве… Полагаю 255 операторов это максимум. Таким образом, каждое условие от {elsif <условие 2>} до {elsif <условие n>} будет проверяться последовательно сверху вниз, до тех пор, пока одно из них не окажется верным. В этом случае выполнится соответствующий код <GCode условия n> и все строки до {endif} будут проигнорированы.
[{else}<GCode если ни одно условие не выполнено>] – оператор необязательный. Тут все понятно, если все предыдущие условия оказались ложными, будет безоговорочно выполнен <GCode если ни одно условие не выполнено>. Отличие от elsif только в отсутствии самого условия. Также как и elsif применяется только в паре с оператором if.
{endif} – оператор указывает на конец условных операторов if, elsif, else. Служит своеобразной меткой, на которую происходит безусловный переход, если любое из предыдущих условий оказалось верным.
Запись условных операторов должна производится исключительно в таком порядке. Для примера, в дополнение к вышеописанной полной конструкции, приведу возможные варианты неполной записи:
{if <условие 1>}<GCode условия 1>
{endif}
{if <условие 1>}<GCode условия 1>
[{elsif <условие 2>}<GCode условия 2>]
{endif}
{if <условие 1>}<GCode условия 1>
[{else}<GCode если условие 1 ложно>]
{endif}
Также следует пояснить что такое “условие”. Это логическое выражение, которое может принимать только 2 значения: “0”(ложь) и “1”(правда). С операторами сравнения(такие, как “больше”, “меньше”, “равно”, “не равно”, “больше или равно”, “меньше или равно”) в принципе проблем нет, они сами по себе могут принимать только два значения. А вот с “И”, “ИЛИ”, “исключающее ИЛИ” могут возникнуть проблемы. “Логическое” означает что любое число, отличное от “0” всегда “правда”. А ну да, это не в тему, в нашем случае кроме как “логических” операторов, других то и нет :D… Привычка.
2. Выражение
{<expression>}
Просто математическое выражение, для примера можно привести
M190 S{<expression>} – ждем нагрева стола до температуры, заданной математическим выражением.
В макросах при записи условий и выражений можно использовать операторы сравнения (<, >, ==, !=, <>, <=, >=), булевы операции (and, or, not или &&, ||, ! соответственно), арифметические (+, -, *, /) и тернарные операторы (?: что соответствует конструкции if else).
Также имеются встроенные функции
min(a,b), max(a,b)
Возвращают из двух аргументов a и b минимальный и максимальный соответственно. На момент написания статьи мне известны только две функции, в будущем скорее всего их набор расширится.
Теперь настало время поговорить… честно говоря даже не знаю как это все назвать… Переменными? Язык не поворачивается назвать. Константами… тоже язык не поворачивается… Значит буду переводить дословно “Заменители”. Что это такое? По сути “заменители” и есть параметры слайсера, которые мы и настраиваем. Только прописаны они текстом. Т.е. под определенным осмысленным текстом скрывается та самая настройка в параметрах слайсера и равна установленному значению. Список “заменителей” находится здесь. Также их названия можно посмотреть в соответствующих файлах профилей, по умолчанию находящихся
C:\Users\”имя пользователя”\AppData\Roaming\Slic3rPE\filament
C:\Users\”имя пользователя”\AppData\Roaming\Slic3rPE\print
C:\Users\”имя пользователя”\AppData\Roaming\Slic3rPE\printer
Далеко не факт что все будут работать, но кто знает, может окажется полезным.
Здесь синтаксис прост, если “заменитель” используется как самостоятельный элемент, его необходимо заключить в квадратные скобки. Если же он используется в математическом или логическом выражении, то сам “заменитель” в квадратные скобки не заключается, а все выражение заключается в фигурные скобки.
M140 S{bed_temperature – 5} – греем стол на 5 градусов ниже установленной температуры.
M140 S[bed_temperature] – греем стол до установленной температуры.
Пожалуй на сегодняшний день, это почти все скромные возможности макросов PrusaSlicer.
Для затравки предлагаю первый макрос. Самый примитивный и простой для понимания. Он каждые 10 слоев понижает температуру хотэнда на 5 градусов
M104 S{265 – (layer_num /10 * 5)}
Этот код необходимо вставить на закладке Printer Settings/Custom G-code в окно “before layer change G-code” или “after layer change G-code”.
У него как минимум два недостатка, которые нужно устранить. Предлагаю на досуге подумать.
Поясню как он работает:
layer_num – возвращает номер слоя.
(layer_num /10 * 5) – здесь 10, это количество слоев через которое необходимо уменьшить температуру, а 5 на сколько уменьшить.
Данное выражение работает только потому, что аргумент для S всегда целочисленного типа, в нашем случае дробная часть просто отсекается.
Настройка лазера в Smoothieware CNC + 3D       PrusaSlicer. Начало.