Вместо предисловия
Есть у меня привычка - писать себе будущему заметки, особенно, если решение какого-то вопроса оказалось неочевидным и потребовало заметных трат времени и сил. А если есть вариант, что этот же вопрос придётся решать опять, но не скоро, то заметка обязательна. Собственно, текст ниже - такая заметка "для себя". Но когда я её закончил, то понял - добавь это абзац, поменяй формулировки и вот тебе заметка для Хабра.
Начало
Последнее время подсел на печать нейлоновой триммерной леской и резиноподобным материалом BFGummy. При выборе материала Nylon в параметрах печати включается "not supported", а Gummy просто отсутствует в материалах
Скрытое изображение

Можно конечно создать свой профиль и выбирать его каждый раз,
Скрытое изображение

но нередко об этом забываешь и запросто можно начать печатать с некоторыми параметрами по умолчанию. Такая же картина, если материала изначально не было в списке, как BFGummy
Суть хотелки - хочу, что бы в слайсере были нормальные параметры для материалов, которые будут сами включаться, при смене этого самого материала. Хочу добавить сопло 0.2 мм, есть на него планы.
Вводные данные
В качестве ОС у меня Debian и другой нет. Принтер - FlyingBear GHOST 6. Слайсер Cura скопирована в ~/.local/lib/cura/ из запущенного AppImage, оттуда и запускается (далее этот каталог буду называть <CURA_BASE>). Сразу обозначу и остальные каталоги, которые понадобятся для решения вопроса. Основные ресурсы для работы, каталог создан самой Cura'ой (я точно его не создавал) - ~/.local/share/cura/<CURA_VERSION>, как можно догадаться <CURA_VERSION> - версия установленной Cura, дальше каталог будет именоваться <CURA_SHARE>, каталог с конфигом Cura ~/.config/cura/ - <CURA_CONFIG>. Думаю, в Windows есть аналоги этих каталогов, и в комментариях напишут их расположение.
При беглом поиске вариантов решения, самый частый вариант - настроить "кастомный" принтер и у него можно настраивать что угодно. Почему-то этот вариант мне не нравился и поиски были продолжены. Вариант с которого началась эта заметка был найден на 3Dtoday (https://3dtoday.ru/questions/kak-dobavit-ili-vybrat-soplo-02-v-cura-540#)
Вопрос с соплом самый простой. В каталоге <CURA_BASE>/share/cura/resources/variants/ находим каталог со своей маркой принтера (в моём случае flyingbear). В каталоге находим файлы
...
flyingbear_ghost_5_0.25.inst.cfg
flyingbear_ghost_5_0.30.inst.cfg
flyingbear_ghost_5_0.40.inst.cfg
flyingbear_ghost_5_0.50.inst.cfg
flyingbear_ghost_5_0.60.inst.cfg
flyingbear_ghost_5_0.80.inst.cfg
Долго не думая копируем один из них с именем flyingbear_ghost_5_0.20.inst.cfg, а можно и просто переименовать ненужный (ни разу не видел в продаже сопло на 0.25мм). Открываем новый файл в любом текстовом редакторе. Нас интересуют поля name и machine_nozzle_size, просто вбиваем туда нужные нам значения
[general]
definition = flyingbear_ghost_5
name = 0.20mm Nozzle
version = 4
[metadata]
hardware_type = nozzle
setting_version = 22
type = variant
[values]
machine_nozzle_size = 0.20
После перезагрузки слайсера, получим в списке новое сопло.
Скрытое изображение

С материалами уже намного интереснее.
Если коротко, то сначала, при необходимости, создаётся материал, а потом профили печати для него. Для нейлона нужен только профиль, сам материал уже есть.
Общий список материалов храниться в каталоге <CURA_BASE>/share/cura/resources/materials/ в xml-файлах с расширением xml.fdm_material, например, fdplast_abs_tomato.xml.fdm_material. Структура названия файла не случайна, через символ подчёркивания разделены: производитель (марка); название материала; цвет которым изображается модель в слайсере. Для создания профилей печати, независимо от марки материала, должен быть generic-профиль, именно на него ссылается файл профиля печати. Например. Для добавления в общий список Gummy от Bestfilament, понадобился generic_gummy.xml.fdm_material-файл. Есть ещё нюанс. Так как мой принтер рассчитан под пластик с диаметром прутка 1.75 мм, то необходим ещё файл под него и он имеет название generic_gummy_175.xml.fdm_material. Разница между файлами как минимум в указанном диаметре 2.85 и 1.75. Ниже пример моего файла для материала.
<?xml version="1.0" encoding="UTF-8"?>
<!--
Generic Gummy profile. The data in this file may not be correct for your specific machine.
-->
<fdmmaterial xmlns="http://www.ultimaker.com/material" xmlns:cura="http://www.ultimaker.com/cura" version="1.3">
<metadata>
<name>
<brand>Generic</brand>
<material>Gummy</material>
<color>Generic</color>
</name>
<GUID>6941fbcf-baeb-4ec4-ac17-9b1c79b274d2</GUID>
<version>34</version>
<color_code>#874AF9</color_code>
<description>Резиноподобный высокотемпературный материал. Хим/масло/бензостойкостью не обладает</description>
<adhesion_info>Использовать самый сильный адгезив, иначе, отпадает.</adhesion_info>
</metadata>
<properties>
<density>1.21</density>
<diameter>1.75</diameter>
</properties>
<settings>
<setting key="print temperature">240.0</setting>
<setting key="standby temperature">175</setting>
<setting key="heated bed temperature">110.0</setting>
<setting key="build volume temperature">28</setting>
<setting key="print cooling">0.0</setting>
<setting key="adhesion tendency">0</setting>
<setting key="surface energy">100</setting>
<setting key="retraction amount">0.5</setting>
<setting key="retraction speed">12.0</setting>
</settings>
</fdmmaterial>
Самый простой способ создать этот файл - скопировать его из <CURA_SHARE>/materials/ вписав предварительно Generic в поля brand и color. Но это generic материал, в списке материалов он не будет относиться к какому-либо производителю. Что бы добавить материал к производителю, нужно создать ещё один файл, с соответствующим названием, в моём случае - bestfilament_gummy_dodgerblue.xml.fdm_material.
<?xml version='1.0' encoding='utf-8'?>
<fdmmaterial version="1.3" xmlns="http://www.ultimaker.com/material" xmlns:cura="http://www.ultimaker.com/cura">
<metadata>
<name>
<brand>Best Filament</brand>
<material>Gummy</material>
<color>DodgerBlue</color>
<label>BF Gummy DodgerBlue</label>
</name>
<GUID>ce5a8c43-72a9-43fe-a7fe-2d243d52eff8</GUID>
<color_code>#1E90FF</color_code>
<version>34</version>
</metadata>
<properties>
<density>1.21</density>
<diameter>1.75</diameter>
<weight>500</weight>
</properties>
<settings>
<setting key="print cooling">0.0</setting>
<setting key="print temperature">245.0</setting>
<setting key="heated bed temperature">110</setting>
<setting key="standby temperature">200</setting>
<setting key="retraction amount">0.5</setting>
<setting key="retraction speed">12.0</setting>
</settings>
</fdmmaterial>
По сути это тот же файл файл, что и generic, только в полях brand, color и label указаны какие-то конкретные значения. Код цвета и его название можно взять в любой HTML-палитре. Поле GUID можно не трогать, программа нигде не ругается на повторяющиеся ID-шники, но можно и поменять взяв новый прямо у системы
cat /proc/sys/kernel/random/uuid
А теперь, собственно, перейдём к каталогу из которого можно взять файл для создания материала.
Файлы описания материалов, созданных пользователем, храняться в <CURA_SHARE>/materials/. Если материал был создан пользователем "с нуля", то файл имеет название типа custom_material+%232.xml.fdm_material и содержит описание материала в разделе settings. Если материал создаётся на основе уже имеющегося, то файл носит имя "родителя" плюс некий порядковый номер, например, fdplast_petg_gray+%232.xml.fdm_material. Как понятно из названия, это ответвление PET-G от FDPlast. В поле settings такого файл указываются только переопределяемые параметры материала. У меня есть две катушки PET-G от одного производителя купленные у него одновременно, только разного цвета, и они имеют разную оптимальную температуру печати - разница порядка десяти градусов. Поэтому пришлось добавить их как два разных материала, что бы температуру правильную не забывать ставить.
Собственно остались мелочи - создать профиль печати, для материала. Сами профили, для каждого поддерживаемого принтера, хранятся в каталоге <CURA_BASE>/share/cura/resources/quality/<МАРКА_ПРИНТЕРА>/. В этом каталоге хранятся подкаталоги для каждого из подготовленных материалов. Так как я добавляю gummy, то соответственно такой каталог и создаю. Что бы долго не думать, копирую файл-профиль из одного существующих каталогов, только меняю в имени название материала.
В самом файле наобходимо прописать название материала, размер сопла и в группе values параметры печати, причём не все, а только изменяемые от некоторых дефолтных. Так как, наверняка, добавляемым материалом уже печатали и получили некоторый набор параметров которые нужно теперь зафиксировать, то нужно просто эти параметры скопировать. Все сохранённые пользователем профили печати храняться в <CURA_SHARE>/quality_changes/, где нужный можно найти по имени принтера и имени профиля данного при сохранении. Собственно оттуда все поля для values и копируем. В моём случае получился вот такой файл профиля печати
[general]
definition = flyingbear_base
name = Standard Quality
version = 4
[metadata]
material = generic_gummy
quality_type = normal
setting_version = 22
type = quality
variant = 0.4mm Nozzle
[values]
adhesion_type = brim
bottom_layers = 5
brim_gap = 0.05
cool_fan_enabled = False
infill_line_distance = 0.5
infill_pattern = lines
infill_sparse_density = 100
material_print_temperature = 245.0
retraction_enable = False
speed_infill = 25
speed_print = 25
top_layers = 5
wall_0_wipe_dist = 0.5
wall_line_count = 2
z_seam_corner = z_seam_corner_inner
z_seam_type = random
На этом собственно всё. При выборе материала, автоматом включаются параметры печати для него.
Скрытое изображение

Как по мне это пусть маленькое, но удобство.
Какие минусы у данного метода. При обновлении слайсера очередной перезаписью каталога, можно потерять все внесённые изменения. И вот тут может пригодиться <CURA_CONFIG>. В нём хранятся настройки всех запускавшихся версий Cura. Можно написать небольшой скрипт, для определения последней версии программы по именам подкаталогов в <CURA_CONFIG> и скопировать ей необходимые файлы из некоторого места хранения. Но этот вопрос решает каждый сам как хочет и если хочет.