Постобработка G-кода в PrusaSlicer

Аватара пользователя
demonlibra
Помогаю слегка
Сообщения: 2552
Зарегистрирован: 18 янв 2020, 11:49
Откуда: Ростов-на-Дону

Постобработка G-кода в PrusaSlicer

Сообщение demonlibra »

Prusa Knowledge Base - Post-processing scripts
Slic3r Manual - Post-Processing Scripts
Bob’s Project Notebook - Post-processing PrusaSlicer G-Code

Если штатных возможностей формирования и замены g-кода в PrusaSlicer Вам не хватает, можно использовать сценарии постобработки.
Можно использовать любой доступный Вам интерпретатор, например Perl, Python, Ruby, Bash, VBScript, ...
  1. Необходимо указать пути к интерпретатору и сценарию в поле Настройки печати - Выходные параметры - Скрипты постобработки.
    Если сценариев несколько, укажите путь к каждому из них на отдельной строке.
    Если сценарий необходимо временно исключить, добавьте символ # в начало строки.
    Изображение Изображение
  2. Сценарии постобработки запускаются при Экспорте в G-код.
    PrusaSlicer автоматически добавляет в качестве последнего аргумента сценария путь к временному файлу с g-кодом.
    Сценарий должен обработать временный файл и сохранить в него результат.
  3. После завершения сценария и передачи интерпретатором кода 0, результат сохраняется в файл, указанный пользователем.
    Если код отличается от 0, выводит сообщение об ошибке.
Примечания
  • Предварительный просмотр g-кода в окне слайсера показывает код без постобработки.
  • В python для получения аргументов, переданных сценарию, используется модули sys или argparse:

    Код: Выделить всё

    import sys
    file_input = str(sys.argv[1])
    
    sys.argv[0] - содержит путь к сценарию
    sys.argv[1] - содержит путь к файлу с g-кодом
    Если сценарию передаются дополнительные аргументы, для получения последнего аргумента используйте номер [-1]

    Код: Выделить всё

    import sys
    file_input = str(sys.argv[-1])
    

  • PrusaSlicer передаёт все параметры профилей через переменные окружения.
    Имена переменных окружений пишутся полностью заглавными буквами и начинаются с 'SLIC3R_'
    Для получения параметра в python используется модуль getenv из библиотеки os
    Пример для получения значения параметра высоты слоя layer_height

    Код: Выделить всё

    from os import getenv
    asdfg=str(getenv('SLIC3R_LAYER_HEIGHT')
    

  • При возникновении ошибки исполнения сценария, т.е если интерпретатор передаёт код завершения отличный от 0, результаты постобработки не сохраняются и выводится сообщение с кодом ошибки и выводом от интерпретатора. Это можно использовать для вывода своих сообщений, например:

    Код: Выделить всё

    if flag:
    	sys.exit("\n!!! Внимание !!!\n\nЧто-то пошло не по плану.\nПроверьте там и здесь.")
    
    Изображение
Установка python3 в GNU/Linux
  1. Для установки python3 в GNU/Linux на основе Debian выполните в терминале

    Код: Выделить всё

    sudo apt install python3

  2. Чтобы сделать python3 по умолчанию выполните команду, которая обновит ссылку на python в вашем /usr/bin каталоге

    Код: Выделить всё

    sudo ln -sf python3 /usr/bin/python
Установка python3 в Windows
Не бойся поломать. Бойся не починить ))
Изображение
Аватара пользователя
demonlibra
Помогаю слегка
Сообщения: 2552
Зарегистрирован: 18 янв 2020, 11:49
Откуда: Ростов-на-Дону

Re: Сценарии постобработки g-кода в PrusaSlicer

Сообщение demonlibra »

Пример использования постобработки

Мой стартовый код содержит следующие команды для оптимизации процесса нагрева и исключения вытекание пластика:

Код: Выделить всё

M104 S{first_layer_temperature[0]-60} ; Нагрев HotEnd`а ниже заданной температуры чтобы не вытекал пластик
M190 S[first_layer_bed_temperature]   ; Нагрев стола с ожиданием
;----------------------------------
G28                                   ; Калибровка осей
G0 X20 Y20 Z0 F1200                   ; Упираем сопло в стол MOVE TO START POSITION
;----------------------------------
M109 S[first_layer_temperature]       ; Нагрев HotEnd`а до заданной температуры с ожиданием
Указать координаты начала печати не представляется возможным, поэтому в качестве начальной координаты используется край стола. После нагрева HotEnd`а произойдёт перемещение к началу печати юбки или каймы.
Написал сценарий на python3, который подставляет реальные координаты начальной точки печати юбки или каймы, что исключает холостое перемещение.

Ссылка на сценарий

Поиск строки с начальными координатами печати юбки или каймы выполняется по комментариям слайсера.
Поэтому необходимо в профиле PrusaSlicer включить функцию Настройки печати - Выходные параметры - Подробный G-код.
Изображение

В результате строка

Код: Выделить всё

G0 X20 Y20 Z0 F1200                   ; Упираем сопло в стол MOVE TO START POSITION
будет заменена на позицию печати юбки

Код: Выделить всё

G1 X64.836 Y67.004 Z0.0 F1200 ; MOVE TO START POSITION POST-PROCESSING
Изображение

Код: Выделить всё

M104 S185                     ; Нагрев HotEnd`а ниже заданной температуры чтобы не вытекал пластик
M190 S110                     ; Нагрев стола с ожиданием
;----------------------------------
G28                           ; Калибровка осей
G1 X64.836 Y67.004 Z0.0 F1200 ; MOVE TO START POSITION POST-PROCESSING
;----------------------------------
M109 S245                     ; Нагрев HotEnd`а до заданной температуры с ожиданием
G21                           ; set units to millimeters
G90                           ; use absolute coordinates
M83                           ; use relative distances for extrusion
;HEIGHT:0.3
G1 Z.3 F9000                  ; move to next layer (0)
G1 X64.836 Y67.004 ; move to first skirt point
;TYPE:Skirt/Brim
;WIDTH:0.6
G1 F600
G1 X66.054 Y65.924 E.10871    ; skirt
G1 X67.533 Y64.855 E.12194    ; skirt
G1 X69.022 Y63.993 E.11488    ; skirt
...
Не бойся поломать. Бойся не починить ))
Изображение
Аватара пользователя
demonlibra
Помогаю слегка
Сообщения: 2552
Зарегистрирован: 18 янв 2020, 11:49
Откуда: Ростов-на-Дону

Re: Постобработка G-кода в PrusaSlicer

Сообщение demonlibra »

Немного модернизировал сценарий при помощи модуля argparser.
Теперь маркер можно передать в виде аргумента сценарию. Для этого необходимо написать --marker "строка для поиска"

Изображение

Так же добавил аргумент --debug, при использовании которого будет сохранён файл отладки возле временного файла с g-кодом.

Изображение
Не бойся поломать. Бойся не починить ))
Изображение
Аватара пользователя
demonlibra
Помогаю слегка
Сообщения: 2552
Зарегистрирован: 18 янв 2020, 11:49
Откуда: Ростов-на-Дону

Re: Постобработка G-кода в PrusaSlicer

Сообщение demonlibra »

Напишите, если у Вас есть интересные идеи постобработки для PrusaSlicer, которые могут быть полезны сообществу.
Не бойся поломать. Бойся не починить ))
Изображение
Аватара пользователя
demonlibra
Помогаю слегка
Сообщения: 2552
Зарегистрирован: 18 янв 2020, 11:49
Откуда: Ростов-на-Дону

Re: Постобработка G-кода в PrusaSlicer

Сообщение demonlibra »

Сценарий калибровки ретракта добавляет команды изменения параметров ретракта прошивки через заданный шаг.
  • Включите функцию
    Настройки принтера -> Общие -> Дополнительно -> Использовать ретракт из прошивки
  • Разместите два цилиндра на краях стола.
    Количество периметров: 1 или 2
    Количество слоёв крышки и дна: 0
    Изображение Изображение
  • Добавьте в список скриптов постобработки пути к интепритатору и сценарию с аргументами:

    Код: Выделить всё

    /usr/bin/python3 /home/demonlibra/.config/PrusaSlicer/post_process/retract_calibrate.py --lerdge --start=0.5 --step=0.2 --step_height=3 --speed=25 --z_hope=0;
Аргументы сценария:

Код: Выделить всё

--start=...		Начальное значение длины ретракта, мм (по умолчанию 0).
--step=...		Шаг изменения длины ретракта, мм (по умолчанию 0.2)
--step_height=...	Высота печати с одной длиной ретракта, мм (по умолчанию 5)
--step_layers=...	Количество слоёв с одной длиной ретракта, мм (по умолчанию выключено)
			Если указать step_layers, не будет использоваться step_height
--speed=...		Скорость ретракта, мм/сек (по умолчанию 20)
--z_hope=...		Подъём головы при ретракте, мм (по умолчанию 0)
--lerdge		Указать для платы Lerdge (добавляет команду M208)
--klipper		Указать для прошивки Klipper (вместо M207 добавляет команду SET_RETRACTION)
Не бойся поломать. Бойся не починить ))
Изображение
Аватара пользователя
demonlibra
Помогаю слегка
Сообщения: 2552
Зарегистрирован: 18 янв 2020, 11:49
Откуда: Ростов-на-Дону

Re: Постобработка G-кода в PrusaSlicer

Сообщение demonlibra »

Сценарий overhang_perimeters изменяет скорость печати внешних периметров с нависанием.
Угол нависания определяется поддержками.
Поддержки удаляются из кода автоматически.

В профилях PrusaSlicer необходимо:
  • Включить функции "Генерация вспомогательных структур" и "Автоматически созданные поддержки".
  • Задать "Угол нависания поддержки" для определения нависающих периметров.
  • Включить функцию "Синхронизация со слоями поддержки".
  • Включить функцию "Использовать относительные координаты для экструдера (E)".
  • Включить функцию "Использовать ретракт из прошивки".
Аргументы сценария:
  • --speed=0.5 - Cкорость нависающих периметров
    Если задать < 1.0, то уменьшать скорость пропорционально
    Если задать > 1, то считать скорость постоянной (--speed=20 - задать скорость периметра 20 мм/сек)
Изображение Изображение Изображение
Не бойся поломать. Бойся не починить ))
Изображение
Аватара пользователя
demonlibra
Помогаю слегка
Сообщения: 2552
Зарегистрирован: 18 янв 2020, 11:49
Откуда: Ростов-на-Дону

Re: Постобработка G-кода в PrusaSlicer

Сообщение demonlibra »

Сценарий bridge_fan_advance добавляет команды активации обдува для слоёв с мостами, что исключает снижение скорости вентилятора при большом количестве мелких мостов на слоях.

В профилях PrusaSlicer необходимо:
  • Включить функцию "Подробный G-код"
  • Задать "Скорость вентилятора при печати мостов" в профиле прутка.
Изображение
Не бойся поломать. Бойся не починить ))
Изображение
Аватара пользователя
demonlibra
Помогаю слегка
Сообщения: 2552
Зарегистрирован: 18 янв 2020, 11:49
Откуда: Ростов-на-Дону

Re: Постобработка G-кода в PrusaSlicer

Сообщение demonlibra »

Сценарий continue_print.py комментирует часть кода для продолжения печати с определённого слоя или высоты.

Перед перемещением к начальной точке добавляются команды выдавливание филамента
G1 E50 F300
G10

После перемещения добавляется возврат
G11

Сценарий использует особенности PrusaSlicer, но может быть запущен засомостоятельно в консоли:

Код: Выделить всё

python3 continue_print.py --from_height=6.1 cube.gcode out.gcode
Аргументы сценария:
  • --from_layer=...
    Продолжить с номера слоя
  • --from_height=...
    Продолжить с высоты, мм
Важно чтобы при калибровке подвижные элементы не столкнулись с частями ранее напечатанной модели.
Не бойся поломать. Бойся не починить ))
Изображение

Вернуться в «PrusaSlicer»