Как сохранить настройки слайсера Cura в G-коде, чтобы Moonraker/Klipper мог их прочитать?

Я уже некоторое время использую Klipper и Cura (что-то новое для 3D-печати), и я замечаю, что всякий раз, когда я импортирую новый файл G-кода в Klipper, ни одна из настроек слайсера из Cura не отображается в G- файлы кода в Klipper. Однако, когда я импортировал файл G-кода от моего друга (PETG), я сразу заметил, что он появился:

Скриншот списка файлов из веб-интерфейса для klipper

Я посмотрел на разницу в форматах G-кода и заметил, что файл, нарезанный с помощью Prusa, имел настройки в нижней части файла в следующем (усеченном) формате:

;TYPE:Custom
; Filament-specific end gcode
; filament used [mm] = 5342.18
; filament used [cm3] = 12.85
; filament used [g] = 16.32
; filament cost = 0.45
; total filament used [g] = 16.32
; total filament cost = 0.45
; estimated printing time (normal mode) = 2h 49m 42s
; estimated printing time (silent mode) = 2h 50m 36s
; prusaslicer_config = begin
; avoid_crossing_perimeters = 0
; avoid_crossing_perimeters_max_detour = 0
; bed_custom_model =
; bed_custom_texture =
; bed_shape = 0x0,250x0,250x210,0x210
; bed_temperature = 90
; before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0.0\n;[layer_z]\n\n
; between_objects_gcode =
; bottom_fill_pattern = monotonic
; bottom_solid_layers = 5
; bottom_solid_min_thickness = 0.5
; bridge_acceleration = 1000
; bridge_angle = 0
; bridge_fan_speed = 50
; bridge_flow_ratio = 1
; bridge_speed = 25
; cooling = 1
; cooling_tube_length = 5
; elefant_foot_compensation = 0.2
; external_perimeter_extrusion_width = 0.45
; external_perimeter_speed = 25
; external_perimeters_first = 0
; extra_loading_move = -2
; extra_perimeters = 0
; extrusion_multiplier = 1
; extrusion_width = 0.45
; fan_always_on = 1
; fan_below_layer_time = 20
; filament_colour = #FF8000
; filament_cooling_final_speed = 3.4
; filament_cooling_initial_speed = 2.2
; filament_cooling_moves = 4
; filament_cost = 27.82

В то время как G-код, сгенерированный cura, имеет их в следующем формате:

;End of Gcode
;SETTING_3 {"global_quality": "[general]\\nversion = 4\\nname = Filament_Sample-
;SETTING_3 PET-dev.1\\ndefinition = creality_ender3pro\\n\\n[metadata]\\ntype =
;SETTING_3 quality_changes\\nquality_type = standard\\nsetting_version = 22\\n\\
;SETTING_3 n[values]\\nadhesion_type = skirt\\nklipper_experimental_enable = Tru
;SETTING_3 e\\nklipper_ui_temp_support_enable = True\\nretraction_combing = nosk
;SETTING_3 in\\nsupport_enable = False\\nsupport_type = buildplate\\n\\n", "extr
;SETTING_3 uder_quality": ["[general]\\nversion = 4\\nname = Filament_Sample-PET
;SETTING_3 -dev.1\\ndefinition = creality_ender3pro\\n\\n[metadata]\\ntype = qua
;SETTING_3 lity_changes\\nquality_type = standard\\nintent_category = default\\n
;SETTING_3 position = 0\\nsetting_version = 22\\n\\n[values]\\nbrim_gap = 0.17\\
;SETTING_3 nbrim_line_count = 14\\ninfill_enable_travel_optimization = True\\nin
;SETTING_3 fill_sparse_density = 100\\ninset_direction = outside_in\\nironing_en
;SETTING_3 abled = True\\nironing_flow = 5.0\\nironing_inset = 0.2\\nironing_mon
;SETTING_3 otonic = True\\nironing_pattern = zigzag\\nmaterial_flow = 90.0\\nret
;SETTING_3 raction_amount = 3.0\\nretraction_hop = 1.0\\nretraction_hop_enabled
;SETTING_3 = True\\nretraction_hop_only_when_collides = True\\nroofing_layer_cou
;SETTING_3 nt = 1\\nroofing_line_width = 0.2\\nroofing_material_flow = 75.0\\nro
;SETTING_3 ofing_pattern = lines\\nskin_monotonic = True\\nskin_overlap = 4.0\\n
;SETTING_3 speed_print = 100.0\\nsupport_angle = 65.0\\nsupport_conical_enabled
;SETTING_3 = True\\nsupport_interface_density = 20\\nsupport_skip_some_zags = Tr
;SETTING_3 ue\\ntop_bottom_pattern_0 = lines\\ntop_layers = 1\\nwall_line_count
;SETTING_3 = 4\\nwall_overhang_angle = 55.0\\nwall_overhang_speed_factor = 80.0\
;SETTING_3 \n\\n"]}

Prusa хранит их в более удобном формате, тогда как Cura хранит их в формате INI, хранящемся в виде строк в объекте JSON, который затем сохраняется как комментарий G-кода (что кажется до смешного сложным)

У меня уже есть функция bash/jq, которую я использую для анализа комментариев из фрагментированного G-кода Cura и отображения их мне, но я пытаюсь найти способ сделать это автоматически, пока файл G-кода генерируется. Я просмотрел несколько плагинов для Cura, но не нашел ни одного, подходящего для этого.

Я знаю, что мог бы изменить metadata.py (Moonraker), чтобы он анализировал комментарии G-кода в стиле Cura, или даже написать плагин Cura, но мне пришло в голову, что я не могу быть первым, у кого возникла эта проблема. И я ничего не нашел по этому поводу в Google.

Вопрос: есть ли у кого-нибудь простой обходной путь, не требующий написания плагинов или изменения существующих файлов Moonraker?

И дополнительный вопрос: зачем им хранить настройки слайсера, вложенные в три разных формата? Почему?!

TL;DR: Cura хранит конфигурацию печати в комментариях G-кода, но Klipper/Moonraker не может их проанализировать из-за формата. Есть ли простой способ обойти это? (кроме написания плагина или изменения файлов Moonraker)

PS Я вижу, что некоторые плагины связаны с этим, но я не вижу ни одного, который форматирует и сохраняет настройки в файл G-кода. Они либо просто извлекают их из G-кода, либо требуют каждый раз выполнять скрипт (или даже запускать Node-сервер..)

Обновить (Ответ... Вроде)

Итак, посмотрев на питон Moonraker, я увидел, что на самом деле существует <em>Класс Cura</em>, который расширяет класс BaseSlicer и обрабатывает анализ комментариев:

class Cura(BaseSlicer):
    def check_identity(self, data: str) -> Optional[Dict[str, str]]:
        match = re.search(r"Cura_SteamEngine\s(.*)", data)
        if match:
            return {
                'slicer': "Cura",
                'slicer_version': match.group(1)
            }
        return None
        
    # .. Truncated some rows..

    def has_objects(self) -> bool:
        return self._check_has_objects(self.header_data, r"\n;MESH:")

    def parse_filament_weight_total(self) -> Optional[float]:
        return regex_find_float(r";Filament\sweight\s=\s.(%F).", self.header_data)

    def parse_filament_type(self) -> Optional[str]:
        return regex_find_string(r";Filament\stype\s=\s(%S)", self.header_data)

    def parse_filament_name(self) -> Optional[str]:
        return regex_find_string(r";Filament\sname\s=\s(%S)", self.header_data)

    # .. Truncated some rows..

    def parse_nozzle_diameter(self) -> Optional[float]:
        return regex_find_float(r";Nozzle\sdiameter\s=\s(%F)", self.header_data)

И если вы посмотрите на регулярное выражение, оно ищет некоторые имена конфигураций, такие как Вес нити, Имя нити, Тип нити и т. д. Но Cura сохраняет его только как имя, вес и тип, но помещает его в раздел [metadata]. .

Кроме того, все метаданные в стиле Cura просто объединяются в одну строку, в которую каждые 80 символов вводится возврат строки. Это означает, что в зависимости от значений некоторые имена элементов метаданных обрезаются на полпути и в них вводится еще один ;SETTING_3 в качестве префикс, из-за чего простой анализ с помощью RegEx превращается в настоящий кошмар.

Я пытался избежать необходимости изменять какой-либо код Moonraker, но, похоже, мне просто нужно изменить класс Cura, чтобы извлечь все строки, начинающиеся с ;SETTING_3 , а затем объединить > Анализ JSON > Разбор INI.

, 👍2

Обсуждение

Пожалуйста, не публикуйте текст в виде изображения; см. [Почему не рекомендуется использовать изображения текста, кода и математических выражений?](https://meta.stackexchange.com/questions/320052/why-are-images-of-text-code-and-mathematical-expressions-discouraged)., @agarza

@agarza хм, ок. Обновил. Я думал об этом, но решил, что это нормально, потому что я на самом деле не размещал текст для анализа/чтения. Я просто хотел показать бок о бок различия между ними. И у меня был код в черновике, и я подумал, что это просто делает его слишком загроможденным/длинным., @J H

Это отвечает на ваш вопрос? Существует ли (общий) способ встроить используемые настройки слайсера в файл G-кода?, @Bob Ortiz

@BobOrtiz Не совсем. Я на самом деле обнаружил, что есть класс, который должен уметь это делать, уже в Moonraker. Мне просто нужно понять, почему это не работает (я обновил свой оригинальный пост), @J H


1 ответ


Лучший ответ:

1

Не знаю, почему мне не удалось найти это изначально, но вот список строк замены, который можно использовать в настройках G-кода начала/конца профиля машины/принтера.

В настройках профиля машины я вставил следующий текст в верхней части раздела «Начать G-код»:

; Cura/Material/Profile settings
;Layer Height: {layer_height}
;MINZ: {layer_height_0}
;Print Speed: {speed_print}
;first_layer_bed_temp: {material_print_temperature_layer_0}
;Nozzle diameter = {machine_nozzle_size}
;Filament id = {material_id}
;Filament type = {material_type}
;Filament name = {material_name}
;Filament brand = {material_brand}
;Filament amount = {filament_amount}
;Filament weight = {filament_weight}
;Filament cost = {filament_cost}
;Jobname = {jobname}

; Ender 3 Custom Start G-code
; ... Rest of my start G-code was here

И теперь, когда я создаю новый файл G-кода, в нем содержатся следующие данные:

; Cura/Material/Profile settings
;Layer Height: 0.2
;MINZ: 0.2
;Print Speed: 30.0
;first_layer_bed_temp: 260.0
;Nozzle diameter = 0.4
;Filament id = generic_abs_175 #2
;Filament type = ABS
;Filament name = ASA
;Filament brand = iSANGHU
;Filament amount = [1.01]
;Filament weight = [3.013193642578125]
;Filament cost = [0.05423748556640625]
;Jobname = TN1-148_SHAFT_ADAPTOR

; Ender 3 Custom Start G-code

(Примечание: мне пришлось сохранить материал ASA как ABS, потому что, очевидно, Cura считает, что мой профиль принтера несовместим с ASA, поэтому он сохраняется как ABS. но это значение соответствует тому, что указано в конфигурациях)

>

И в MoonRaker это работает отлично

Скриншот левой части списка файлов MoonRaker

Скриншот правой части списка файлов MoonRaker

Источник: Как получить доступ к типу материала (например, PLA, PETG и т. д.) из плагина постобработки Cura?


,