Last active
January 18, 2025 21:57
-
-
Save samwiseg0/3d4cb07742db83343bf7ef381c7c86b3 to your computer and use it in GitHub Desktop.
Convert SuperSlicer/PrusaSlicer filament profiles to OrcaSlicer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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) |
Oh alright, I tried importing them via File - Import - Config but they wouldn't import. I'll try again with your method.
Any chance this works with print settings as well?
Sent from Outlook for Android<https://aka.ms/AAb9ysg>
…________________________________
From: samwiseg0 ***@***.***>
Sent: Saturday, January 18, 2025 8:04:02 PM
To: samwiseg0 ***@***.***>
Cc: Comment ***@***.***>
Subject: Re: samwiseg0/ss_ps_fil_to_orca_fil.py
@samwiseg0 commented on this gist.
________________________________
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. Goto help -> Configuration folder -> User -> youruserID -> filaments. Copy them into that folder while Orca is shutdown. You should see them after relaunching Orca.
—
Reply to this email directly, view it on GitHub<https://gist.github.com/samwiseg0/3d4cb07742db83343bf7ef381c7c86b3#gistcomment-5396819> or unsubscribe<https://github.com/notifications/unsubscribe-auth/APY5EHN6TVLQBYZZI5NHB5D2LKQSFBFKMF2HI4TJMJ2XIZLTSKBKK5TBNR2WLJDUOJ2WLJDOMFWWLO3UNBZGKYLEL5YGC4TUNFRWS4DBNZ2F6YLDORUXM2LUPGBKK5TBNR2WLJDHNFZXJJDOMFWWLK3UNBZGKYLEL52HS4DFVRZXKYTKMVRXIX3UPFYGLK2HNFZXIQ3PNVWWK3TUUZ2G64DJMNZZDAVEOR4XAZNEM5UXG5FFOZQWY5LFVEYTEMZYGYZTONJXU52HE2LHM5SXFJTDOJSWC5DF>.
You are receiving this email because you commented on the thread.
Triage notifications on the go with GitHub Mobile for iOS<https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675> or Android<https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>.
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.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.