diff --git a/README.md b/README.md index 7d707f8..700944b 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,9 @@ pip install -r requirements.txt spoolman2slicer uses [Jinja2](https://palletsprojects.com/p/jinja/) templates for the configuration files it creates. They are stored with the filaments' material's name in `templates-/`. -If the material's template isn't found, `default.template` is used. +If the material's template isn't found, `default..template` +is used, where `suffix` is the config files suffix (`ini` for Super Slicer, +`info` and `json` for Orca Slicer). The variables available in the templates is the return data from Spoolman's filament request, described @@ -75,12 +77,14 @@ sm2s also adds its own fields under the sm2s field: * name - the name of the tool's program file. * version - the version of the tool. * now - the time when the file is created. -* slicer_suffix - the filename suffix used by the slicer. +* now_int - the time when the file is created as the number of seconds since UNIX' epoch. +* slicer_suffix - the filename's suffix. To generate your own templates, copy your existing filament settings -from the slicers config dir (on linux: ~/.config/SuperSlicer/filament/) -to the template dir with the material's name plus ".template", then -change the fields' values like the provided template files. +from the slicers config dir (on linux: `~/.config/SuperSlicer/filament/`, +`~/.config/OrcaSlicer/user/default/filament/`) to the template dir with +the material's name plus ".template", then change the fields' +values like the provided template files. The filename used for the filaments is created by the `filename.template` template. @@ -91,5 +95,9 @@ the `filename.template` template. ```sh ./spoolman2slicer.py -U -d ~/.config/SuperSlicer/filament/ ``` +or +```sh +./spoolman2slicer.py -s orcaslicer -U -d ~/.config/OrcaSlicer/user/default/filament/ +``` See the other options above. diff --git a/spoolman2slicer.py b/spoolman2slicer.py index 06e0333..02d93c3 100755 --- a/spoolman2slicer.py +++ b/spoolman2slicer.py @@ -19,7 +19,8 @@ import requests from websockets.client import connect -DEFAULT_TEMPLATE = "default.template" +DEFAULT_TEMPLATE_PREFIX = "default." +DEFAULT_TEMPLATE_SUFFIX = ".template" FILENAME_TEMPLATE = "filename.template" ORCASLICER = "orcaslicer" @@ -32,9 +33,7 @@ description="Fetches filaments from Spoolman and creates slicer filament config files.", ) -parser.add_argument( - "--version", action="version", version="%(prog)s " + VERSION -) +parser.add_argument("--version", action="version", version="%(prog)s " + VERSION) parser.add_argument( "-d", "--dir", @@ -91,13 +90,14 @@ filename_usage = {} -def add_sm2s_to_filament(filament): +def add_sm2s_to_filament(filament, suffix): """Adds the sm2s object to filament""" sm2s = { "name": parser.prog, "version": VERSION, "now": time.asctime(), - "slicer_suffix": get_config_suffix(), + "now_int": int(time.time()), + "slicer_suffix": suffix, } filament["sm2s"] = sm2s @@ -105,9 +105,9 @@ def add_sm2s_to_filament(filament): def get_config_suffix(): """Returns the slicer's config file prefix""" if args.slicer == SUPERSLICER: - return "ini" + return ["ini"] if args.slicer == ORCASLICER: - return "json" + return ["json", "info"] raise ValueError("That slicer is not yet supported") @@ -124,9 +124,28 @@ def get_filament_filename(filament): return args.dir + "/" + template.render(filament) +def get_cached_filename_from_filaments_id(filament): + """Returns the cached (old) filename for the filament""" + return filament_id_to_filename.get( + f"{filament['id']}-{filament['sm2s']['slicer_suffix']}" + ) + + +def set_cached_filename_from_filaments_id(filament, filename): + """Stores the filename for the filament in a cache""" + filament_id_to_filename[f"{filament['id']}-{filament['sm2s']['slicer_suffix']}"] = ( + filename + ) + + +def get_default_template_for_suffix(suffix): + """Get the template filename for the given suffix""" + return f"{DEFAULT_TEMPLATE_PREFIX}{suffix}{DEFAULT_TEMPLATE_SUFFIX}" + + def delete_filament(filament, is_update=False): """Delete the filament's file if no longer in use""" - filename = filament_id_to_filename[filament["id"]] + filename = get_cached_filename_from_filaments_id(filament) if not filename in filename_usage: return @@ -136,7 +155,6 @@ def delete_filament(filament, is_update=False): new_filename = None if is_update: - add_sm2s_to_filament(filament) new_filename = get_filament_filename(filament) if filename != new_filename: @@ -147,16 +165,16 @@ def delete_filament(filament, is_update=False): def delete_all_filaments(): """Delete all config files in the filament dir""" for filename in os.listdir(args.dir): - if filename.endswith("." + get_config_suffix()): - filename = args.dir + "/" + filename - print(f"Deleting: {filename}") - os.remove(filename) + for suffix in get_config_suffix(): + if filename.endswith("." + suffix): + filename = args.dir + "/" + filename + print(f"Deleting: {filename}") + os.remove(filename) def write_filament(filament): """Output the filament to the right file""" - add_sm2s_to_filament(filament) filename = get_filament_filename(filament) if filename in filename_usage: filename_usage[filename] += 1 @@ -165,21 +183,30 @@ def write_filament(filament): filament_id = filament["id"] - old_filename = filament_id_to_filename.get(filament_id) + # old_filename = filament_id_to_filename.get(filament_id) + old_filename = get_cached_filename_from_filaments_id(filament) - filament_id_to_filename[filament_id] = filename + # filament_id_to_filename[filament_id] = filename + set_cached_filename_from_filaments_id(filament, filename) if "material" in filament: - template_name = f"{filament['material']}.template" + template_name = ( + f"{filament['material']}.{filament['sm2s']['slicer_suffix']}.template" + ) else: - template_name = DEFAULT_TEMPLATE + template_name = get_default_template_for_suffix( + filament["sm2s"]["slicer_suffix"] + ) try: template = templates.get_template(template_name) if args.verbose: print(f"Using {template_name} as template") except TemplateNotFound: - template = templates.get_template(DEFAULT_TEMPLATE) + template_name = get_default_template_for_suffix( + filament["sm2s"]["slicer_suffix"] + ) + template = templates.get_template(template_name) if args.verbose: print("Using the default template") @@ -212,13 +239,17 @@ def load_and_update_all_filaments(url: str): for spool in spools: filament = spool["filament"] - write_filament(filament) + for suffix in get_config_suffix(): + add_sm2s_to_filament(filament, suffix) + write_filament(filament) def handle_filament_update(filament): """Handles update of a filament""" - delete_filament(filament, is_update=True) - write_filament(filament) + for suffix in get_config_suffix(): + add_sm2s_to_filament(filament, suffix) + delete_filament(filament, is_update=True) + write_filament(filament) def handle_spool_update_msg(msg): @@ -227,11 +258,15 @@ def handle_spool_update_msg(msg): spool = msg["payload"] filament = spool["filament"] if msg["type"] == "added": - write_filament(filament) + for suffix in get_config_suffix(): + add_sm2s_to_filament(filament, suffix) + write_filament(filament) elif msg["type"] == "updated": handle_filament_update(filament) elif msg["type"] == "deleted": - delete_filament(filament) + for suffix in get_config_suffix(): + add_sm2s_to_filament(filament, suffix) + delete_filament(filament) else: print(f"Got unknown filament update msg: {msg}") diff --git a/templates-orcaslicer/ABS+.json.template b/templates-orcaslicer/ABS+.json.template new file mode 100644 index 0000000..0e73414 --- /dev/null +++ b/templates-orcaslicer/ABS+.json.template @@ -0,0 +1,68 @@ +{ + "_comment": "Generated by {{sm2s.name}} {{sm2s.version}}", + "default_filament_colour": [ + "#{{color_hex}}" + ], + "filament_cost": [ + "{{price}}" + ], + "filament_spool_weight": [ + "{{spool_weight}}" + ], + "filament_type": [ + "{{material}}" + ], + "filament_diameter": [ + "{{diameter}}" + ], + "filament_density": [ + "{{density}}" + ], + "filament_flow_ratio": [ + "0.924" + ], + "filament_settings_id": [ + "{{id}}" + ], + "filament_start_gcode": [ + "SET_PRESSURE_ADVANCE ADVANCE={{extra.pressure_advance|default(0)|float}}\nASSERT_ACTIVE_FILAMENT ID={{id}}" + ], + "filament_vendor": [ + "{{vendor.name}}" + ], + "from": "User", + "inherits": "Voron Generic ABS", + "is_custom_defined": "0", + "name": "{{name}}", + "nozzle_temperature": [ + "{{settings_extruder_temp|int}}" + ], + "nozzle_temperature_initial_layer": [ + "{{settings_extruder_temp|int + 5}}" + ], + "cool_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "eng_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "hot_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "textured_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "cool_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int + 10}}" + ], + "eng_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int + 10}}" + ], + "hot_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int + 10}}" + ], + "textured_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int + 10}}" + ], + "version": "2.1.1.0" +} diff --git a/templates-orcaslicer/ASA.json.template b/templates-orcaslicer/ASA.json.template new file mode 100644 index 0000000..bab008a --- /dev/null +++ b/templates-orcaslicer/ASA.json.template @@ -0,0 +1,68 @@ +{ + "_comment": "Generated by {{sm2s.name}} {{sm2s.version}}", + "default_filament_colour": [ + "#{{color_hex}}" + ], + "filament_cost": [ + "{{price}}" + ], + "filament_spool_weight": [ + "{{spool_weight}}" + ], + "filament_type": [ + "{{material}}" + ], + "filament_diameter": [ + "{{diameter}}" + ], + "filament_density": [ + "{{density}}" + ], + "filament_flow_ratio": [ + "0.924" + ], + "filament_settings_id": [ + "{{id}}" + ], + "filament_start_gcode": [ + "SET_PRESSURE_ADVANCE ADVANCE={{extra.pressure_advance|default(0)|float}}\nASSERT_ACTIVE_FILAMENT ID={{id}}" + ], + "filament_vendor": [ + "{{vendor.name}}" + ], + "from": "User", + "inherits": "Voron Generic ASA", + "is_custom_defined": "0", + "name": "{{name}}", + "nozzle_temperature": [ + "{{settings_extruder_temp|int}}" + ], + "nozzle_temperature_initial_layer": [ + "{{settings_extruder_temp|int + 5}}" + ], + "cool_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "eng_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "hot_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "textured_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "cool_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int + 10}}" + ], + "eng_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int + 10}}" + ], + "hot_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int + 10}}" + ], + "textured_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int + 10}}" + ], + "version": "2.1.1.0" +} diff --git a/templates-orcaslicer/PLA.json.template b/templates-orcaslicer/PLA.json.template new file mode 100644 index 0000000..1b42f62 --- /dev/null +++ b/templates-orcaslicer/PLA.json.template @@ -0,0 +1,68 @@ +{ + "_comment": "Generated by {{sm2s.name}} {{sm2s.version}}", + "default_filament_colour": [ + "#{{color_hex}}" + ], + "filament_cost": [ + "{{price}}" + ], + "filament_spool_weight": [ + "{{spool_weight}}" + ], + "filament_type": [ + "{{material}}" + ], + "filament_diameter": [ + "{{diameter}}" + ], + "filament_density": [ + "{{density}}" + ], + "filament_flow_ratio": [ + "0.94" + ], + "filament_settings_id": [ + "{{id}}" + ], + "filament_start_gcode": [ + "SET_PRESSURE_ADVANCE ADVANCE={{extra.pressure_advance|default(0)|float}}\nASSERT_ACTIVE_FILAMENT ID={{id}}" + ], + "filament_vendor": [ + "{{vendor.name}}" + ], + "from": "User", + "inherits": "Voron Generic PLA", + "is_custom_defined": "0", + "name": "{{name}}", + "nozzle_temperature": [ + "{{settings_extruder_temp|int}}" + ], + "nozzle_temperature_initial_layer": [ + "{{settings_extruder_temp|int + 10}}" + ], + "cool_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "eng_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "hot_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "textured_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "cool_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int + 10}}" + ], + "eng_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int + 10}}" + ], + "hot_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int + 10}}" + ], + "textured_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int + 10}}" + ], + "version": "2.1.1.0" +} diff --git a/templates-orcaslicer/TPU.json.template b/templates-orcaslicer/TPU.json.template new file mode 100644 index 0000000..bd7214e --- /dev/null +++ b/templates-orcaslicer/TPU.json.template @@ -0,0 +1,68 @@ +{ + "_comment": "Generated by {{sm2s.name}} {{sm2s.version}}", + "default_filament_colour": [ + "#{{color_hex}}" + ], + "filament_cost": [ + "{{price}}" + ], + "filament_spool_weight": [ + "{{spool_weight}}" + ], + "filament_type": [ + "{{material}}" + ], + "filament_diameter": [ + "{{diameter}}" + ], + "filament_density": [ + "{{density}}" + ], + "filament_flow_ratio": [ + "0.94" + ], + "filament_settings_id": [ + "{{id}}" + ], + "filament_start_gcode": [ + "SET_PRESSURE_ADVANCE ADVANCE={{extra.pressure_advance|default(0)|float}}\nASSERT_ACTIVE_FILAMENT ID={{id}}" + ], + "filament_vendor": [ + "{{vendor.name}}" + ], + "from": "User", + "inherits": "Voron Generic TPU", + "is_custom_defined": "0", + "name": "{{name}}", + "nozzle_temperature": [ + "{{settings_extruder_temp|int}}" + ], + "nozzle_temperature_initial_layer": [ + "{{settings_extruder_temp|int + 10}}" + ], + "cool_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "eng_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "hot_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "textured_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "cool_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int}}" + ], + "eng_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int}}" + ], + "hot_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int}}" + ], + "textured_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int}}" + ], + "version": "2.1.1.0" +} diff --git a/templates-orcaslicer/default.info.template b/templates-orcaslicer/default.info.template new file mode 100644 index 0000000..480139f --- /dev/null +++ b/templates-orcaslicer/default.info.template @@ -0,0 +1,5 @@ +sync_info = create +user_id = +setting_id = +base_id = GFSA04 +updated_time = {{sm2s.now_int}} diff --git a/templates-orcaslicer/default.json.template b/templates-orcaslicer/default.json.template new file mode 100644 index 0000000..1b42f62 --- /dev/null +++ b/templates-orcaslicer/default.json.template @@ -0,0 +1,68 @@ +{ + "_comment": "Generated by {{sm2s.name}} {{sm2s.version}}", + "default_filament_colour": [ + "#{{color_hex}}" + ], + "filament_cost": [ + "{{price}}" + ], + "filament_spool_weight": [ + "{{spool_weight}}" + ], + "filament_type": [ + "{{material}}" + ], + "filament_diameter": [ + "{{diameter}}" + ], + "filament_density": [ + "{{density}}" + ], + "filament_flow_ratio": [ + "0.94" + ], + "filament_settings_id": [ + "{{id}}" + ], + "filament_start_gcode": [ + "SET_PRESSURE_ADVANCE ADVANCE={{extra.pressure_advance|default(0)|float}}\nASSERT_ACTIVE_FILAMENT ID={{id}}" + ], + "filament_vendor": [ + "{{vendor.name}}" + ], + "from": "User", + "inherits": "Voron Generic PLA", + "is_custom_defined": "0", + "name": "{{name}}", + "nozzle_temperature": [ + "{{settings_extruder_temp|int}}" + ], + "nozzle_temperature_initial_layer": [ + "{{settings_extruder_temp|int + 10}}" + ], + "cool_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "eng_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "hot_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "textured_plate_temp" : [ + "{{settings_bed_temp|int}}" + ], + "cool_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int + 10}}" + ], + "eng_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int + 10}}" + ], + "hot_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int + 10}}" + ], + "textured_plate_temp_initial_layer" : [ + "{{settings_bed_temp|int + 10}}" + ], + "version": "2.1.1.0" +} diff --git a/templates-orcaslicer/default.template b/templates-orcaslicer/default.template deleted file mode 100644 index 4ad96d5..0000000 --- a/templates-orcaslicer/default.template +++ /dev/null @@ -1 +0,0 @@ -default diff --git a/templates-superslicer/ABS+.template b/templates-superslicer/ABS+.ini.template similarity index 100% rename from templates-superslicer/ABS+.template rename to templates-superslicer/ABS+.ini.template diff --git a/templates-superslicer/ASA.template b/templates-superslicer/ASA.ini.template similarity index 100% rename from templates-superslicer/ASA.template rename to templates-superslicer/ASA.ini.template diff --git a/templates-superslicer/PLA.template b/templates-superslicer/PLA.ini.template similarity index 100% rename from templates-superslicer/PLA.template rename to templates-superslicer/PLA.ini.template diff --git a/templates-superslicer/TPU.template b/templates-superslicer/TPU.ini.template similarity index 100% rename from templates-superslicer/TPU.template rename to templates-superslicer/TPU.ini.template diff --git a/templates-superslicer/default.template b/templates-superslicer/default.ini.template similarity index 100% rename from templates-superslicer/default.template rename to templates-superslicer/default.ini.template