-
-
Save samwiseg0/3d4cb07742db83343bf7ef381c7c86b3 to your computer and use it in GitHub Desktop.
| # -*- coding: utf-8 -*- | |
| import argparse | |
| import configparser | |
| import json | |
| import os | |
| def sanitize_value(value): | |
| # Remove leading and trailing whitespaces, including newline characters | |
| value = value.strip() | |
| # Remove any extra quotes or escape characters | |
| value = value.strip("\"'") | |
| value = value.replace("\\", "") | |
| return value | |
| def ini_to_json(ini_file_path, json_output_directory): | |
| # Read the entire INI file as a string | |
| with open(ini_file_path) as f: | |
| ini_content = f.read() | |
| # Insert the default section header for settings without section headers | |
| ini_content = "[printer_settings]\n" + ini_content | |
| # Parse the INI file as a configparser | |
| config = configparser.ConfigParser(interpolation=None) | |
| config.read_string(ini_content, source=ini_file_path) | |
| # Create the updated key mapping | |
| key_mapping = { | |
| # Exact matches | |
| "chamber_temperature": "chamber_temperature", | |
| "filament_cost": "filament_cost", | |
| "filament_density": "filament_density", | |
| "filament_diameter": "filament_diameter", | |
| "filament_max_volumetric_speed": "filament_max_volumetric_speed", | |
| "filament_minimal_purge_on_wipe_tower": "filament_minimal_purge_on_wipe_tower", | |
| "filament_retract_before_wipe": "filament_retract_before_wipe", | |
| "filament_retract_lift_above": "filament_retract_lift_above", | |
| "filament_retract_lift_below": "filament_retract_lift_below", | |
| "filament_retract_restart_extra": "filament_retract_restart_extra", | |
| "filament_shrink": "filament_shrink", | |
| "filament_soluble": "filament_soluble", | |
| "filament_type": "filament_type", | |
| "filament_vendor": "filament_vendor", | |
| "filament_wipe": "filament_wipe", | |
| "full_fan_speed_layer": "full_fan_speed_layer", | |
| # Translated | |
| "bed_temperature": "hot_plate_temp", | |
| "bridge_fan_speed": "overhang_fan_speed", | |
| "disable_fan_first_layers": "close_fan_the_first_x_layers", | |
| "end_filament_gcode": "filament_end_gcode", | |
| "extrusion_multiplier": "filament_flow_ratio", | |
| "fan_always_on": "reduce_fan_stop_start_freq", | |
| "fan_below_layer_time": "fan_cooling_layer_time", | |
| "filament_colour": "default_filament_colour", | |
| "filament_deretract_speed": "filament_deretraction_speed", | |
| "filament_retract_layer_change": "filament_retract_when_changing_layer", | |
| "filament_retract_length": "filament_retraction_length", | |
| "filament_retract_lift": "filament_z_hop", | |
| "filament_retract_speed": "filament_retraction_speed", | |
| "first_layer_bed_temperature": "hot_plate_temp_initial_layer", | |
| "first_layer_temperature": "nozzle_temperature_initial_layer", | |
| "max_fan_speed": "fan_max_speed", | |
| "min_fan_speed": "fan_min_speed", | |
| "min_print_speed": "slow_down_min_speed", | |
| "slowdown_below_layer_time": "slow_down_layer_time", | |
| "start_filament_gcode": "filament_start_gcode", | |
| "temperature": "nozzle_temperature", | |
| # New key for filament_type condition | |
| "overhang_fan_threshold": "overhang_fan_threshold" | |
| } | |
| # Convert the data to a dictionary with values as arrays | |
| data = {} | |
| for key in key_mapping: | |
| if key in config["printer_settings"]: | |
| value = config["printer_settings"][key] | |
| value = sanitize_value(value) | |
| # Check if the key is "filament_max_volumetric_speed" and the value is 0 | |
| if key == "filament_max_volumetric_speed" and value == "0": | |
| value = "15" # Set default value to 15 | |
| # Check if the key is "filament_type" | |
| if key == "filament_type": | |
| if value in ['ABS', 'ABS+', 'PCCF', 'ASA', 'PC']: | |
| # Set "overhang_fan_threshold" to "25%" if filament_type is "ABS" | |
| data[key_mapping["overhang_fan_threshold"]] = ["25%"] | |
| else: | |
| # Set "overhang_fan_threshold" to "50%" for any other filament_type | |
| data[key_mapping["overhang_fan_threshold"]] = ["50%"] | |
| # For other keys, use the normal key mapping | |
| data[key_mapping[key]] = [value] | |
| # Add the "name" key with the input file name | |
| data["name"] = os.path.splitext(os.path.basename(ini_file_path))[0] | |
| # Add the static keys | |
| data["is_custom_defined"] = "1" | |
| data["version"] = "1.5.1.2" | |
| # Create the output JSON file path inside the json_output_directory | |
| json_file_path = os.path.join(json_output_directory, f"{data['name']}.json") | |
| # Write the data to a JSON file | |
| with open(json_file_path, 'w') as json_file: | |
| json.dump(data, json_file, indent=4) | |
| def convert_all_ini_to_json(directory_path): | |
| # Create the 'json' subfolder if it doesn't exist | |
| json_output_directory = os.path.join(directory_path, "json") | |
| os.makedirs(json_output_directory, exist_ok=True) | |
| for filename in os.listdir(directory_path): | |
| if filename.endswith(".ini"): | |
| ini_file_path = os.path.join(directory_path, filename) | |
| ini_to_json(ini_file_path, json_output_directory) | |
| if __name__ == "__main__": | |
| # Parse command-line arguments | |
| parser = argparse.ArgumentParser(description="Convert SS/PS filament profile INI files to \ | |
| JSON files to use with OrcaSlicer.") | |
| parser.add_argument("directory", nargs="?", default=os.getcwd(), help="Directory path \ | |
| containing SS/PS filament \ | |
| profile files") | |
| args = parser.parse_args() | |
| directory_path = args.directory | |
| convert_all_ini_to_json(directory_path) |
Not the OP, but I got this working by just creating a .py file (eg. converter.py) and pasting the script taken from here. Then I just opened cmd, ran python converter.py path-to-folder-with-ps-ini-files (eg. the filament folder in your PrusaSlicer configuration folder) and immediately after a json folder appeared in there, with all filaments converted to json format.
Too bad OrcaSlicer doesnt seem to want to import the filaments I converted.
Not the OP, but I got this working by just creating a .py file (eg. converter.py) and pasting the script taken from here. Then I just opened cmd, ran
python converter.py path-to-folder-with-ps-ini-files(eg. the filament folder in your PrusaSlicer configuration folder) and immediately after a json folder appeared in there, with all filaments converted to json format.Too bad OrcaSlicer doesn't seem to want to import the filaments I converted.
This is the correct usage. The files it makes just need to be coped over to the profile you use in Orca. In Orca, Goto help -> Configuration folder -> User -> YOURUSERID -> filaments. Copy them into that folder while Orca is closed. You should see them after relaunching Orca.
Any chance this works with print settings as well?
Not in its current form. I just recreated my printers from scratch. With enough work it can be modified to convert those files as well.
Love the idea of this script. Could you add some installation/use instructions? What version of python? How to add the modules required?
Thank you 🙏