Compare commits

...

19 Commits

Author SHA1 Message Date
Ian Chua
09b96dfe99 fix: pull user profiles during each cycle and show message dialog if there are conflicts 2026-05-07 19:03:22 +08:00
Noisyfox
100a9a20d1 Fix unicode preset name issue (#13503) 2026-05-06 23:45:32 +08:00
GeordieTomo
97c7afa2af Feature/fuzzy skin ripple mode (#13471)
* fuzzy skin ripple mode

add fuzzy skin ripple mode, which is a uniform pattern option. fixes #13325

* remove unused wall width parameter

* remove cmath import

* style consistency

---------

Co-authored-by: SoftFever <softfeverever@gmail.com>
2026-05-06 23:02:42 +08:00
SoftFever
02c9ab6a02 update profile validator (#13494) 2026-05-06 18:43:23 +08:00
yw4z
d84ac149d1 Fix filamanent / printer selection stucks on loading (#13492)
* Update re3D rPP.json

* add vector type check

---------

Co-authored-by: SoftFever <softfeverever@gmail.com>
2026-05-06 18:42:25 +08:00
LH
57cee529b4 Add LH Stinger printer profiles (#13410) 2026-05-05 14:33:30 -03:00
yw4z
c2ac0baa05 Fix iconic button sizes on widgets (paint modes and gcode viewer buttons) (#13365)
* init

* update
2026-05-06 00:07:15 +08:00
yw4z
1433521f98 Improvements for Color paint widget (#13421)
* init

* fix build error

* Update GLGizmoMmuSegmentation.cpp

* Update GLGizmoMmuSegmentation.cpp

* Update GLGizmoMmuSegmentation.cpp

* fix popup positioning and add tooltip for remap info
2026-05-05 20:35:31 +08:00
yw4z
b3482265e0 Simplify drawing splash screen using wxPaintDC and Fix scaling & blank rendering issues (#12586)
* Update GUI_App.cpp

* Update GUI_App.cpp

* make splash screen parentless
2026-05-05 20:34:10 +08:00
SoftFever
aa35d3ae17 preserve a single trailing newline when reformatting JSON files 2026-05-05 14:58:26 +08:00
Jakub Hencl
7ecf2225a4 Update Czech translations in OrcaSlicer_cs.po (#13465) 2026-05-04 19:12:34 -03:00
Ian Bassi
62ccd979c6 EFC Density description (#13476) 2026-05-04 12:37:54 -03:00
Ian Bassi
a943252b6a Wiki redirections (#13474) 2026-05-04 11:19:21 -03:00
Dennis Klappe
8e9906f747 Fix Ender-3 V3 KE nozzle switching (#13438)
Fix Ender-3 V3 KE nozzle switching by adding printer_variant

The four Creality Ender-3 V3 KE 0.X nozzle profiles were missing the
printer_variant key, so OrcaSlicer could not map a UI nozzle selection
to a specific profile and reverted every choice to 0.2mm. Add the
matching printer_variant to each, following the CR-10 SE / K1C pattern.
2026-05-04 17:41:07 +08:00
Ian Bassi
84ccee7fe6 Add indentation check to profile workflow (#13417)
Introduce an 'indentation_check' job step to .github/workflows/check_profiles.yml that validates profile JSON files under resources/profiles use tab-only indentation (1 tab per level). The step runs an inline Python check, emits a log (indentation_check.log) with errors and a fix tip, and exits non‑zero on violations. Workflow conditionals for preparing the PR comment artifact, uploading the artifact, and failing the job were updated to include the new step so indentation failures are reported alongside other profile validation failures.
2026-05-04 15:57:50 +08:00
yw4z
988b500f33 [Linux] Fix Black borders on checkbox and switch button (#13362)
init
2026-05-04 15:54:17 +08:00
Rodrigo Faselli
1d4c7c56a2 Fix crash ZAA (#13450)
fix crash zaa

Co-authored-by: SoftFever <softfeverever@gmail.com>
2026-05-04 15:52:34 +08:00
Kiss Lorand
a3f229f406 Fix extrusion of some support layers at wrong Z height (again) (#13460)
Fix extrusion of some support layers at wrong Z height

Fixes the issue that PR #12736 (github.com/OrcaSlicer/OrcaSlicer/pull/12736) reverted the changes of PR #13327 (github.com/OrcaSlicer/OrcaSlicer/pull/13327)
2026-05-03 23:36:02 +08:00
Ian Bassi
d7955cad16 ZAA Wiki redirection + tooltip (#13446)
* ZAA Wiki redirection + puntutation

* Clarify tooltip text for Z parameters
2026-05-03 11:51:42 -03:00
77 changed files with 5801 additions and 647 deletions

View File

@@ -34,6 +34,46 @@ jobs:
python3 ./scripts/orca_extra_profile_check.py 2>&1 | tee ${{ runner.temp }}/extra_json_check.log
exit ${PIPESTATUS[0]}
- name: Check profile indentation
id: indentation_check
continue-on-error: true
run: |
set +e
python3 - <<'PY' 2>&1 | tee ${{ runner.temp }}/indentation_check.log
import re
from pathlib import Path
import sys
profiles_root = Path("resources/profiles")
invalid_files = []
for file_path in sorted(profiles_root.rglob("*.json")):
try:
for line_number, line in enumerate(file_path.read_text(encoding="utf-8").splitlines(), start=1):
if not line.strip():
continue
leading_ws = re.match(r"^[ \t]*", line).group(0)
if " " in leading_ws:
invalid_files.append((file_path, line_number))
break
except Exception as exc:
print(f"[ERROR] Unable to read {file_path}: {exc}")
invalid_files.append((file_path, 0))
if invalid_files:
for path, line in invalid_files:
if line > 0:
print(f"[ERROR] Space indentation found in {path}:{line}")
else:
print(f"[ERROR] Could not validate indentation in {path}")
print("Use tab indentation in profile JSON files (1 tab per indentation level).")
print("Tip: run python3 ./scripts/orca_filament_lib.py --fix --force to normalize formatting.")
sys.exit(1)
print("All profile JSON files use tab-only indentation.")
PY
exit ${PIPESTATUS[0]}
# download
- name: Download
working-directory: ${{ github.workspace }}
@@ -62,7 +102,7 @@ jobs:
exit ${PIPESTATUS[0]}
- name: Prepare comment artifact
if: ${{ always() && github.event_name == 'pull_request' && (steps.extra_json_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
if: ${{ always() && github.event_name == 'pull_request' && (steps.extra_json_check.outcome == 'failure' || steps.indentation_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
run: |
mkdir -p ${{ runner.temp }}/profile-check-results
@@ -79,6 +119,15 @@ jobs:
echo ""
fi
if [ "${{ steps.indentation_check.outcome }}" = "failure" ]; then
echo "### Indentation Check Failed"
echo ""
echo '```'
head -c 30000 ${{ runner.temp }}/indentation_check.log || echo "No output captured"
echo '```'
echo ""
fi
if [ "${{ steps.validate_system.outcome }}" = "failure" ]; then
echo "### System Profile Validation Failed"
echo ""
@@ -104,7 +153,7 @@ jobs:
echo "${{ github.event.pull_request.number }}" > ${{ runner.temp }}/profile-check-results/pr_number.txt
- name: Upload comment artifact
if: ${{ always() && github.event_name == 'pull_request' && (steps.extra_json_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
if: ${{ always() && github.event_name == 'pull_request' && (steps.extra_json_check.outcome == 'failure' || steps.indentation_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
uses: actions/upload-artifact@v7
with:
name: profile-check-results
@@ -112,7 +161,7 @@ jobs:
retention-days: 1
- name: Fail if any check failed
if: ${{ always() && (steps.extra_json_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
if: ${{ always() && (steps.extra_json_check.outcome == 'failure' || steps.indentation_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
run: |
echo "One or more profile checks failed. See above for details."
exit 1

View File

@@ -11072,7 +11072,7 @@ msgid "Gizmo assemble"
msgstr "Gizmo sestavit"
msgid "Gizmo brim ears"
msgstr "Gizmo přídavky okraje (uši)"
msgstr "Gizmo ouška lemu"
msgid "Zoom in"
msgstr "Přiblížit"
@@ -12583,13 +12583,13 @@ msgstr ""
"průtokovým poměrem filamentu a případně průtokovým poměrem objektu."
msgid "Set other flow ratios"
msgstr "Set other flow ratios"
msgstr "Nastavit další poměry průtoku"
msgid "Change flow ratios for other extrusion path types."
msgstr "Change flow ratios for other extrusion path types."
msgstr "Změnit poměry průtoku pro další typy extruzních drah."
msgid "First layer flow ratio"
msgstr "First layer flow ratio"
msgstr "Poměr průtoku první vrstvy"
msgid ""
"This factor affects the amount of material on the first layer for the "
@@ -12598,14 +12598,14 @@ msgid ""
"For the first layer, the actual flow ratio for each path role (does not "
"affect brims and skirts) will be multiplied by this value."
msgstr ""
"This factor affects the amount of material on the first layer for the "
"extrusion path roles listed in this section.\n"
"Tento faktor ovlivňuje množství materiálu na první vrstvě pro role extruzních "
"drah uvedené v této sekci.\n"
"\n"
"For the first layer, the actual flow ratio for each path role (does not "
"affect brims and skirts) will be multiplied by this value."
"Pro první vrstvu bude skutečný poměr průtoku pro každou roli dráhy (neovlivňuje "
"lem a sukni) vynásoben touto hodnotou."
msgid "Outer wall flow ratio"
msgstr "Outer wall flow ratio"
msgstr "Poměr průtoku vnější stěny"
msgid ""
"This factor affects the amount of material for outer walls.\n"
@@ -12613,13 +12613,13 @@ msgid ""
"The actual outer wall flow used is calculated by multiplying this value by "
"the filament flow ratio, and if set, the object's flow ratio."
msgstr ""
"This factor affects the amount of material for outer walls.\n"
"Tento faktor ovlivňuje množství materiálu pro vnější stěny.\n"
"\n"
"The actual outer wall flow used is calculated by multiplying this value by "
"the filament flow ratio, and if set, the object's flow ratio."
"Skutečný průtok pro vnější stěny se vypočítá vynásobením této hodnoty "
"poměrem průtoku filamentu a případně také poměrem průtoku objektu."
msgid "Inner wall flow ratio"
msgstr "Inner wall flow ratio"
msgstr "Poměr průtoku vnitřní stěny"
msgid ""
"This factor affects the amount of material for inner walls.\n"
@@ -12627,13 +12627,13 @@ msgid ""
"The actual inner wall flow used is calculated by multiplying this value by "
"the filament flow ratio, and if set, the object's flow ratio."
msgstr ""
"This factor affects the amount of material for inner walls.\n"
"Tento faktor ovlivňuje množství materiálu pro vnitřní stěny.\n"
"\n"
"The actual inner wall flow used is calculated by multiplying this value by "
"the filament flow ratio, and if set, the object's flow ratio."
"Skutečný průtok pro vnitřní stěny se vypočítá vynásobením této hodnoty "
"poměrem průtoku filamentu a případně také poměrem průtoku objektu."
msgid "Overhang flow ratio"
msgstr "Overhang flow ratio"
msgstr "Poměr průtoku převisů"
msgid ""
"This factor affects the amount of material for overhangs.\n"
@@ -12641,13 +12641,13 @@ msgid ""
"The actual overhang flow used is calculated by multiplying this value by the "
"filament flow ratio, and if set, the object's flow ratio."
msgstr ""
"This factor affects the amount of material for overhangs.\n"
"Tento faktor ovlivňuje množství materiálu pro převisy.\n"
"\n"
"The actual overhang flow used is calculated by multiplying this value by the "
"filament flow ratio, and if set, the object's flow ratio."
"Skutečný průtok pro převisy se vypočítá vynásobením této hodnoty "
"poměrem průtoku filamentu a případně také poměrem průtoku objektu."
msgid "Sparse infill flow ratio"
msgstr "Sparse infill flow ratio"
msgstr "Poměr průtoku řídké výplně"
msgid ""
"This factor affects the amount of material for sparse infill.\n"
@@ -12655,13 +12655,13 @@ msgid ""
"The actual sparse infill flow used is calculated by multiplying this value "
"by the filament flow ratio, and if set, the object's flow ratio."
msgstr ""
"This factor affects the amount of material for sparse infill.\n"
"Tento faktor ovlivňuje množství materiálu pro řídkou výplň.\n"
"\n"
"The actual sparse infill flow used is calculated by multiplying this value "
"by the filament flow ratio, and if set, the object's flow ratio."
"Skutečný průtok pro řídkou výplň se vypočítá vynásobením této hodnoty "
"poměrem průtoku filamentu a případně také poměrem průtoku objektu."
msgid "Internal solid infill flow ratio"
msgstr "Internal solid infill flow ratio"
msgstr "Poměr průtoku vnitřní plné výplně"
msgid ""
"This factor affects the amount of material for internal solid infill.\n"
@@ -12669,13 +12669,13 @@ msgid ""
"The actual internal solid infill flow used is calculated by multiplying this "
"value by the filament flow ratio, and if set, the object's flow ratio."
msgstr ""
"This factor affects the amount of material for internal solid infill.\n"
"Tento faktor ovlivňuje množství materiálu pro vnitřní plnou výplň.\n"
"\n"
"The actual internal solid infill flow used is calculated by multiplying this "
"value by the filament flow ratio, and if set, the object's flow ratio."
"Skutečný průtok pro vnitřní plnou výplň se vypočítá vynásobením této hodnoty "
"poměrem průtoku filamentu a případně také poměrem průtoku objektu."
msgid "Gap fill flow ratio"
msgstr "Gap fill flow ratio"
msgstr "Poměr průtoku vyplnění mezer"
msgid ""
"This factor affects the amount of material for filling the gaps.\n"
@@ -12683,13 +12683,13 @@ msgid ""
"The actual gap filling flow used is calculated by multiplying this value by "
"the filament flow ratio, and if set, the object's flow ratio."
msgstr ""
"This factor affects the amount of material for filling the gaps.\n"
"Tento faktor ovlivňuje množství materiálu pro vyplnění mezer.\n"
"\n"
"The actual gap filling flow used is calculated by multiplying this value by "
"the filament flow ratio, and if set, the object's flow ratio."
"Skutečný průtok pro vyplnění mezer se vypočítá vynásobením této hodnoty "
"poměrem průtoku filamentu a případně také poměrem průtoku objektu."
msgid "Support flow ratio"
msgstr "Support flow ratio"
msgstr "Poměr průtoku podpěr"
msgid ""
"This factor affects the amount of material for support.\n"
@@ -12697,13 +12697,13 @@ msgid ""
"The actual support flow used is calculated by multiplying this value by the "
"filament flow ratio, and if set, the object's flow ratio."
msgstr ""
"This factor affects the amount of material for support.\n"
"Tento faktor ovlivňuje množství materiálu pro podpěry.\n"
"\n"
"The actual support flow used is calculated by multiplying this value by the "
"filament flow ratio, and if set, the object's flow ratio."
"Skutečný průtok pro podpěry se vypočítá vynásobením této hodnoty "
"poměrem průtoku filamentu a případně také poměrem průtoku objektu."
msgid "Support interface flow ratio"
msgstr "Support interface flow ratio"
msgstr "Poměr průtoku rozhraní podpěr"
msgid ""
"This factor affects the amount of material for the support interface.\n"
@@ -12711,10 +12711,10 @@ msgid ""
"The actual support interface flow used is calculated by multiplying this "
"value by the filament flow ratio, and if set, the object's flow ratio."
msgstr ""
"This factor affects the amount of material for the support interface.\n"
"Tento faktor ovlivňuje množství materiálu pro rozhraní podpěr.\n"
"\n"
"The actual support interface flow used is calculated by multiplying this "
"value by the filament flow ratio, and if set, the object's flow ratio."
"Skutečný průtok pro rozhraní podpěr se vypočítá vynásobením této hodnoty "
"poměrem průtoku filamentu a případně také poměrem průtoku objektu."
msgid "Precise wall"
msgstr "Přesná stěna"

View File

@@ -1,6 +1,6 @@
{
"name": "Creality",
"version": "02.03.02.70",
"version": "02.03.02.71",
"force_update": "0",
"description": "Creality configurations",
"machine_model_list": [

View File

@@ -5,6 +5,7 @@
"from": "system",
"setting_id": "GM001",
"instantiation": "true",
"printer_variant": "0.2",
"printer_settings_id": "Creality",
"printer_model": "Creality Ender-3 V3 KE",
"gcode_flavor": "klipper",

View File

@@ -5,6 +5,7 @@
"from": "system",
"setting_id": "GM001",
"instantiation": "true",
"printer_variant": "0.4",
"printer_settings_id": "Creality",
"printer_model": "Creality Ender-3 V3 KE",
"gcode_flavor": "klipper",

View File

@@ -5,6 +5,7 @@
"from": "system",
"setting_id": "GM001",
"instantiation": "true",
"printer_variant": "0.6",
"printer_settings_id": "Creality",
"printer_model": "Creality Ender-3 V3 KE",
"gcode_flavor": "klipper",

View File

@@ -5,6 +5,7 @@
"from": "system",
"setting_id": "GM001",
"instantiation": "true",
"printer_variant": "0.8",
"printer_settings_id": "Creality",
"printer_model": "Creality Ender-3 V3 KE",
"gcode_flavor": "klipper",

159
resources/profiles/LH.json Normal file
View File

@@ -0,0 +1,159 @@
{
"name": "LH",
"url": "https://github.com/lhndo/LH-Stinger",
"version": "01.00.00.00",
"force_update": "0",
"description": "LH 3D Printer Configuration",
"machine_model_list": [
{
"name": "LH Stinger",
"sub_path": "machine/LH Stinger.json"
},
{
"name": "LH Stinger MMU",
"sub_path": "machine/LH Stinger MMU.json"
}
],
"process_list": [
{
"name": "fdm_process_common",
"sub_path": "process/fdm_process_common.json"
},
{
"name": "fdm_process_lh_common",
"sub_path": "process/fdm_process_lh_common.json"
},
{
"name": "0.20mm Daily @LH Stinger",
"sub_path": "process/0.20mm Daily @LH Stinger.json"
},
{
"name": "0.25mm Vase Mode @LH Stinger",
"sub_path": "process/0.25mm Vase Mode @LH Stinger.json"
},
{
"name": "0.20mm TPU @LH Stinger",
"sub_path": "process/0.20mm TPU @LH Stinger.json"
},
{
"name": "0.20mm Strength @LH Stinger",
"sub_path": "process/0.20mm Strength @LH Stinger.json"
},
{
"name": "0.20mm Speed @LH Stinger",
"sub_path": "process/0.20mm Speed @LH Stinger.json"
},
{
"name": "0.20mm Solid @LH Stinger",
"sub_path": "process/0.20mm Solid @LH Stinger.json"
},
{
"name": "0.20mm Quiet @LH Stinger",
"sub_path": "process/0.20mm Quiet @LH Stinger.json"
},
{
"name": "0.20mm PETG @LH Stinger",
"sub_path": "process/0.20mm PETG @LH Stinger.json"
},
{
"name": "0.20mm MMU @LH Stinger",
"sub_path": "process/0.20mm MMU @LH Stinger.json"
},
{
"name": "0.10mm HueForge @LH Stinger",
"sub_path": "process/0.10mm HueForge @LH Stinger.json"
},
{
"name": "0.14mm Detail Strength @LH Stinger",
"sub_path": "process/0.14mm Detail Strength @LH Stinger.json"
},
{
"name": "0.14mm Detail @LH Stinger",
"sub_path": "process/0.14mm Detail @LH Stinger.json"
}
],
"filament_list": [
{
"name": "fdm_filament_common",
"sub_path": "filament/fdm_filament_common.json"
},
{
"name": "fdm_filament_abs",
"sub_path": "filament/fdm_filament_abs.json"
},
{
"name": "fdm_filament_asa",
"sub_path": "filament/fdm_filament_asa.json"
},
{
"name": "fdm_filament_pc",
"sub_path": "filament/fdm_filament_pc.json"
},
{
"name": "fdm_filament_pet",
"sub_path": "filament/fdm_filament_pet.json"
},
{
"name": "fdm_filament_pla",
"sub_path": "filament/fdm_filament_pla.json"
},
{
"name": "fdm_filament_tpu",
"sub_path": "filament/fdm_filament_tpu.json"
},
{
"name": "LHS ASA",
"sub_path": "filament/LHS ASA.json"
},
{
"name": "LHS ABS",
"sub_path": "filament/LHS ABS.json"
},
{
"name": "LHS TPU",
"sub_path": "filament/LHS TPU.json"
},
{
"name": "LHS PLA",
"sub_path": "filament/LHS PLA.json"
},
{
"name": "LHS TPU Foamy 78A",
"sub_path": "filament/LHS TPU Foamy 78A.json"
},
{
"name": "LHS PETG",
"sub_path": "filament/LHS PETG.json"
},
{
"name": "LHS PCTG",
"sub_path": "filament/LHS PCTG.json"
},
{
"name": "LHS PC CF",
"sub_path": "filament/LHS PC CF.json"
}
],
"machine_list": [
{
"name": "fdm_machine_common",
"sub_path": "machine/fdm_machine_common.json"
},
{
"name": "fdm_lh_common",
"sub_path": "machine/fdm_lh_common.json"
},
{
"name": "fdm_lh_mmu_common",
"sub_path": "machine/fdm_lh_mmu_common.json"
},
{
"name": "LH Stinger 0.4 nozzle",
"sub_path": "machine/LH Stinger 0.4 nozzle.json"
},
{
"name": "LH Stinger MMU 0.4 nozzle",
"sub_path": "machine/LH Stinger MMU 0.4 nozzle.json"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,355 @@
{
"name": "LHS ABS",
"type": "filament",
"filament_id": "LHF_abs",
"setting_id": "LHF_S_abs",
"from": "system",
"instantiation": "true",
"inherits": "fdm_filament_asa",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
],
"activate_air_filtration": [
"0"
],
"activate_chamber_temp_control": [
"0"
],
"adaptive_pressure_advance": [
"0"
],
"adaptive_pressure_advance_bridges": [
"0"
],
"adaptive_pressure_advance_model": [
"0,0,0\n0,0,0"
],
"adaptive_pressure_advance_overhangs": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"chamber_temperature": [
"0"
],
"close_fan_the_first_x_layers": [
"2"
],
"complete_print_exhaust_fan_speed": [
"70"
],
"cool_plate_temp": [
"0"
],
"cool_plate_temp_initial_layer": [
"0"
],
"default_filament_colour": [
""
],
"dont_slow_down_outer_wall": [
"0"
],
"during_print_exhaust_fan_speed": [
"70"
],
"enable_overhang_bridge_fan": [
"1"
],
"enable_pressure_advance": [
"1"
],
"eng_plate_temp": [
"100"
],
"eng_plate_temp_initial_layer": [
"105"
],
"fan_cooling_layer_time": [
"25"
],
"fan_max_speed": [
"25"
],
"fan_min_speed": [
"25"
],
"filament_adaptive_volumetric_speed": [
"0"
],
"filament_adhesiveness_category": [
"0"
],
"filament_change_length": [
"10"
],
"filament_cooling_final_speed": [
"0"
],
"filament_cooling_initial_speed": [
"0"
],
"filament_cooling_moves": [
"0"
],
"filament_cost": [
"20"
],
"filament_density": [
"1.04"
],
"filament_deretraction_speed": [
"nil"
],
"filament_diameter": [
"1.75"
],
"filament_end_gcode": [
"; filament end gcode\n"
],
"filament_extruder_variant": [
"Direct Drive Standard"
],
"filament_flow_ratio": [
"0.926"
],
"filament_flush_temp": [
"0"
],
"filament_flush_volumetric_speed": [
"0"
],
"filament_ironing_flow": [
"nil"
],
"filament_ironing_inset": [
"nil"
],
"filament_ironing_spacing": [
"nil"
],
"filament_ironing_speed": [
"nil"
],
"filament_is_support": [
"0"
],
"filament_loading_speed": [
"0"
],
"filament_loading_speed_start": [
"0"
],
"filament_long_retractions_when_cut": [
"nil"
],
"filament_max_volumetric_speed": [
"45"
],
"filament_minimal_purge_on_wipe_tower": [
"0"
],
"filament_multitool_ramming": [
"0"
],
"filament_multitool_ramming_flow": [
"0"
],
"filament_multitool_ramming_volume": [
"0"
],
"filament_notes": [
""
],
"filament_printable": [
"3"
],
"filament_ramming_parameters": [
"120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_lift_above": [
"nil"
],
"filament_retract_lift_below": [
"nil"
],
"filament_retract_lift_enforce": [
"nil"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_distances_when_cut": [
"nil"
],
"filament_retraction_length": [
"nil"
],
"filament_retraction_minimum_travel": [
"nil"
],
"filament_retraction_speed": [
"nil"
],
"filament_settings_id": [
"LHS - ASA"
],
"filament_shrink": [
"100%"
],
"filament_shrinkage_compensation_z": [
"100%"
],
"filament_soluble": [
"0"
],
"filament_stamping_distance": [
"0"
],
"filament_stamping_loading_speed": [
"0"
],
"filament_start_gcode": [
"; filament start gcode\n; MPC_SET HEATER=extruder FILAMENT_DENSITY=1.07 FILAMENT_HEAT_CAPACITY=2.1\nMAX_FAN LINK_AUX=0"
],
"filament_toolchange_delay": [
"0"
],
"filament_tower_interface_pre_extrusion_dist": [
"10"
],
"filament_tower_interface_pre_extrusion_length": [
"0"
],
"filament_tower_interface_print_temp": [
"-1"
],
"filament_tower_interface_purge_volume": [
"20"
],
"filament_tower_ironing_area": [
"4"
],
"filament_type": [
"ASA"
],
"filament_unloading_speed": [
"0"
],
"filament_unloading_speed_start": [
"0"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"nil"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"4"
],
"hot_plate_temp": [
"105"
],
"hot_plate_temp_initial_layer": [
"105"
],
"idle_temperature": [
"0"
],
"internal_bridge_fan_speed": [
"-1"
],
"ironing_fan_speed": [
"-1"
],
"long_retractions_when_ec": [
"0"
],
"nozzle_temperature": [
"260"
],
"nozzle_temperature_initial_layer": [
"260"
],
"nozzle_temperature_range_high": [
"300"
],
"nozzle_temperature_range_low": [
"240"
],
"overhang_fan_speed": [
"50"
],
"overhang_fan_threshold": [
"50%"
],
"pellet_flow_coefficient": [
"0.4157"
],
"pressure_advance": [
"0.019"
],
"reduce_fan_stop_start_freq": [
"1"
],
"required_nozzle_HRC": [
"3"
],
"retraction_distances_when_ec": [
"10"
],
"slow_down_for_layer_cooling": [
"1"
],
"slow_down_layer_time": [
"15"
],
"slow_down_min_speed": [
"10"
],
"supertack_plate_temp": [
"0"
],
"supertack_plate_temp_initial_layer": [
"0"
],
"support_material_interface_fan_speed": [
"-1"
],
"temperature_vitrification": [
"110"
],
"textured_cool_plate_temp": [
"40"
],
"textured_cool_plate_temp_initial_layer": [
"40"
],
"textured_plate_temp": [
"100"
],
"textured_plate_temp_initial_layer": [
"105"
],
"filament_vendor": [
"LH Stinger"
],
"volumetric_speed_coefficients": [
""
]
}

View File

@@ -0,0 +1,352 @@
{
"name": "LHS ASA",
"filament_id": "LHF_asa",
"setting_id": "LHF_S_asa",
"type": "filament",
"from": "system",
"instantiation": "true",
"inherits": "fdm_filament_asa",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
],
"activate_air_filtration": [
"0"
],
"activate_chamber_temp_control": [
"0"
],
"adaptive_pressure_advance": [
"0"
],
"adaptive_pressure_advance_bridges": [
"0"
],
"adaptive_pressure_advance_model": [
"0,0,0\n0,0,0"
],
"adaptive_pressure_advance_overhangs": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"chamber_temperature": [
"0"
],
"close_fan_the_first_x_layers": [
"2"
],
"complete_print_exhaust_fan_speed": [
"70"
],
"cool_plate_temp": [
"0"
],
"cool_plate_temp_initial_layer": [
"0"
],
"default_filament_colour": [
""
],
"dont_slow_down_outer_wall": [
"0"
],
"during_print_exhaust_fan_speed": [
"70"
],
"enable_overhang_bridge_fan": [
"1"
],
"enable_pressure_advance": [
"1"
],
"eng_plate_temp": [
"100"
],
"eng_plate_temp_initial_layer": [
"105"
],
"fan_cooling_layer_time": [
"25"
],
"fan_max_speed": [
"25"
],
"fan_min_speed": [
"25"
],
"filament_adaptive_volumetric_speed": [
"0"
],
"filament_adhesiveness_category": [
"0"
],
"filament_change_length": [
"10"
],
"filament_cooling_final_speed": [
"0"
],
"filament_cooling_initial_speed": [
"0"
],
"filament_cooling_moves": [
"0"
],
"filament_cost": [
"20"
],
"filament_density": [
"1.04"
],
"filament_deretraction_speed": [
"nil"
],
"filament_diameter": [
"1.75"
],
"filament_end_gcode": [
"; filament end gcode\n"
],
"filament_extruder_variant": [
"Direct Drive Standard"
],
"filament_flow_ratio": [
"0.926"
],
"filament_flush_temp": [
"0"
],
"filament_flush_volumetric_speed": [
"0"
],
"filament_ironing_flow": [
"nil"
],
"filament_ironing_inset": [
"nil"
],
"filament_ironing_spacing": [
"nil"
],
"filament_ironing_speed": [
"nil"
],
"filament_is_support": [
"0"
],
"filament_loading_speed": [
"0"
],
"filament_loading_speed_start": [
"0"
],
"filament_long_retractions_when_cut": [
"nil"
],
"filament_max_volumetric_speed": [
"45"
],
"filament_minimal_purge_on_wipe_tower": [
"0"
],
"filament_multitool_ramming": [
"0"
],
"filament_multitool_ramming_flow": [
"0"
],
"filament_multitool_ramming_volume": [
"0"
],
"filament_notes": [
""
],
"filament_printable": [
"3"
],
"filament_ramming_parameters": [
"120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_lift_above": [
"nil"
],
"filament_retract_lift_below": [
"nil"
],
"filament_retract_lift_enforce": [
"nil"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_distances_when_cut": [
"nil"
],
"filament_retraction_length": [
"nil"
],
"filament_retraction_minimum_travel": [
"nil"
],
"filament_retraction_speed": [
"nil"
],
"filament_shrink": [
"100%"
],
"filament_shrinkage_compensation_z": [
"100%"
],
"filament_soluble": [
"0"
],
"filament_stamping_distance": [
"0"
],
"filament_stamping_loading_speed": [
"0"
],
"filament_start_gcode": [
"; filament start gcode\n; MPC_SET HEATER=extruder FILAMENT_DENSITY=1.07 FILAMENT_HEAT_CAPACITY=2.1\nMAX_FAN LINK_AUX=0"
],
"filament_toolchange_delay": [
"0"
],
"filament_tower_interface_pre_extrusion_dist": [
"10"
],
"filament_tower_interface_pre_extrusion_length": [
"0"
],
"filament_tower_interface_print_temp": [
"-1"
],
"filament_tower_interface_purge_volume": [
"20"
],
"filament_tower_ironing_area": [
"4"
],
"filament_type": [
"ASA"
],
"filament_unloading_speed": [
"0"
],
"filament_unloading_speed_start": [
"0"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"nil"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"4"
],
"hot_plate_temp": [
"105"
],
"hot_plate_temp_initial_layer": [
"105"
],
"idle_temperature": [
"0"
],
"internal_bridge_fan_speed": [
"-1"
],
"ironing_fan_speed": [
"-1"
],
"long_retractions_when_ec": [
"0"
],
"nozzle_temperature": [
"260"
],
"nozzle_temperature_initial_layer": [
"260"
],
"nozzle_temperature_range_high": [
"300"
],
"nozzle_temperature_range_low": [
"240"
],
"overhang_fan_speed": [
"50"
],
"overhang_fan_threshold": [
"50%"
],
"pellet_flow_coefficient": [
"0.4157"
],
"pressure_advance": [
"0.019"
],
"reduce_fan_stop_start_freq": [
"1"
],
"required_nozzle_HRC": [
"3"
],
"retraction_distances_when_ec": [
"10"
],
"slow_down_for_layer_cooling": [
"1"
],
"slow_down_layer_time": [
"15"
],
"slow_down_min_speed": [
"10"
],
"supertack_plate_temp": [
"0"
],
"supertack_plate_temp_initial_layer": [
"0"
],
"support_material_interface_fan_speed": [
"-1"
],
"temperature_vitrification": [
"110"
],
"textured_cool_plate_temp": [
"40"
],
"textured_cool_plate_temp_initial_layer": [
"40"
],
"textured_plate_temp": [
"100"
],
"textured_plate_temp_initial_layer": [
"105"
],
"filament_vendor": [
"LH Stinger"
],
"volumetric_speed_coefficients": [
""
]
}

View File

@@ -0,0 +1,122 @@
{
"name": "LHS PC CF",
"type": "filament",
"filament_id": "LHF_pccf",
"setting_id": "LHF_S_pccf",
"from": "system",
"instantiation": "true",
"inherits": "fdm_filament_pla",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
],
"additional_cooling_fan_speed": [
"0"
],
"close_fan_the_first_x_layers": [
"4"
],
"enable_pressure_advance": [
"1"
],
"fan_cooling_layer_time": [
"11"
],
"fan_max_speed": [
"5"
],
"fan_min_speed": [
"5"
],
"filament_cooling_final_speed": [
"0"
],
"filament_cooling_initial_speed": [
"0"
],
"filament_cooling_moves": [
"0"
],
"filament_density": [
"1.18"
],
"filament_flow_ratio": [
"0.945"
],
"filament_loading_speed": [
"0"
],
"filament_loading_speed_start": [
"0"
],
"filament_max_volumetric_speed": [
"35"
],
"filament_minimal_purge_on_wipe_tower": [
"0"
],
"filament_multitool_ramming_flow": [
"0"
],
"filament_multitool_ramming_volume": [
"0"
],
"filament_notes": [
"Extrusion Override set to a higher value\nAux disabled\nZ-Offset increased to 0.025 due to nozzle expansion at 300C"
],
"filament_retraction_length": [
"0.4"
],
"filament_shrink": [
"99.8%"
],
"filament_start_gcode": [
"; filament start gcode\n; MPC_SET HEATER=extruder FILAMENT_DENSITY=1.36 FILAMENT_HEAT_CAPACITY=2.6\nMAX_FAN LINK_AUX=0"
],
"filament_type": [
"PC"
],
"filament_unloading_speed": [
"0"
],
"filament_unloading_speed_start": [
"0"
],
"hot_plate_temp": [
"105"
],
"hot_plate_temp_initial_layer": [
"105"
],
"is_custom_defined": "0",
"nozzle_temperature": [
"300"
],
"nozzle_temperature_initial_layer": [
"300"
],
"nozzle_temperature_range_high": [
"300"
],
"nozzle_temperature_range_low": [
"270"
],
"overhang_fan_speed": [
"35"
],
"pressure_advance": [
"0.025"
],
"slow_down_layer_time": [
"7"
],
"slow_down_min_speed": [
"12"
],
"filament_vendor": [
"LH Stinger"
],
"temperature_vitrification": [
"140"
]
}

View File

@@ -0,0 +1,352 @@
{
"name": "LHS PCTG",
"type": "filament",
"filament_id": "LHF_pctg",
"setting_id": "LHF_S_pctg",
"from": "system",
"instantiation": "true",
"inherits": "fdm_filament_pla",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
],
"activate_air_filtration": [
"0"
],
"activate_chamber_temp_control": [
"0"
],
"adaptive_pressure_advance": [
"0"
],
"adaptive_pressure_advance_bridges": [
"0"
],
"adaptive_pressure_advance_model": [
"0,0,0\n0,0,0"
],
"adaptive_pressure_advance_overhangs": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"chamber_temperature": [
"0"
],
"close_fan_the_first_x_layers": [
"1"
],
"complete_print_exhaust_fan_speed": [
"70"
],
"cool_plate_temp": [
"35"
],
"cool_plate_temp_initial_layer": [
"35"
],
"default_filament_colour": [
""
],
"dont_slow_down_outer_wall": [
"0"
],
"during_print_exhaust_fan_speed": [
"70"
],
"enable_overhang_bridge_fan": [
"1"
],
"enable_pressure_advance": [
"1"
],
"eng_plate_temp": [
"0"
],
"eng_plate_temp_initial_layer": [
"0"
],
"fan_cooling_layer_time": [
"13"
],
"fan_max_speed": [
"50"
],
"fan_min_speed": [
"20"
],
"filament_adaptive_volumetric_speed": [
"0"
],
"filament_adhesiveness_category": [
"0"
],
"filament_change_length": [
"10"
],
"filament_cooling_final_speed": [
"0"
],
"filament_cooling_initial_speed": [
"0"
],
"filament_cooling_moves": [
"0"
],
"filament_cost": [
"20"
],
"filament_density": [
"1.24"
],
"filament_deretraction_speed": [
"25"
],
"filament_diameter": [
"1.75"
],
"filament_end_gcode": [
"; filament end gcode\n"
],
"filament_extruder_variant": [
"Direct Drive Standard"
],
"filament_flow_ratio": [
"0.953"
],
"filament_flush_temp": [
"0"
],
"filament_flush_volumetric_speed": [
"0"
],
"filament_ironing_flow": [
"nil"
],
"filament_ironing_inset": [
"nil"
],
"filament_ironing_spacing": [
"nil"
],
"filament_ironing_speed": [
"nil"
],
"filament_is_support": [
"0"
],
"filament_loading_speed": [
"0"
],
"filament_loading_speed_start": [
"0"
],
"filament_long_retractions_when_cut": [
"nil"
],
"filament_max_volumetric_speed": [
"25"
],
"filament_minimal_purge_on_wipe_tower": [
"0"
],
"filament_multitool_ramming": [
"0"
],
"filament_multitool_ramming_flow": [
"10"
],
"filament_multitool_ramming_volume": [
"10"
],
"filament_notes": [
""
],
"filament_printable": [
"3"
],
"filament_ramming_parameters": [
"120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_lift_above": [
"nil"
],
"filament_retract_lift_below": [
"nil"
],
"filament_retract_lift_enforce": [
"nil"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_distances_when_cut": [
"nil"
],
"filament_retraction_length": [
"0.6"
],
"filament_retraction_minimum_travel": [
"nil"
],
"filament_retraction_speed": [
"30"
],
"filament_shrink": [
"100%"
],
"filament_shrinkage_compensation_z": [
"100%"
],
"filament_soluble": [
"0"
],
"filament_stamping_distance": [
"0"
],
"filament_stamping_loading_speed": [
"0"
],
"filament_start_gcode": [
"; filament start gcode\n; MPC_SET HEATER=extruder FILAMENT_DENSITY=1.25 FILAMENT_HEAT_CAPACITY=5.5\nMAX_FAN LINK_AUX=0"
],
"filament_toolchange_delay": [
"0"
],
"filament_tower_interface_pre_extrusion_dist": [
"10"
],
"filament_tower_interface_pre_extrusion_length": [
"0"
],
"filament_tower_interface_print_temp": [
"-1"
],
"filament_tower_interface_purge_volume": [
"20"
],
"filament_tower_ironing_area": [
"4"
],
"filament_type": [
"PCTG"
],
"filament_unloading_speed": [
"0"
],
"filament_unloading_speed_start": [
"0"
],
"filament_wipe": [
"0"
],
"filament_wipe_distance": [
"nil"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"3"
],
"hot_plate_temp": [
"90"
],
"hot_plate_temp_initial_layer": [
"85"
],
"idle_temperature": [
"0"
],
"internal_bridge_fan_speed": [
"30"
],
"ironing_fan_speed": [
"-1"
],
"long_retractions_when_ec": [
"0"
],
"nozzle_temperature": [
"280"
],
"nozzle_temperature_initial_layer": [
"270"
],
"nozzle_temperature_range_high": [
"300"
],
"nozzle_temperature_range_low": [
"230"
],
"overhang_fan_speed": [
"50"
],
"overhang_fan_threshold": [
"50%"
],
"pellet_flow_coefficient": [
"0.4157"
],
"pressure_advance": [
"0.038"
],
"reduce_fan_stop_start_freq": [
"1"
],
"required_nozzle_HRC": [
"3"
],
"retraction_distances_when_ec": [
"10"
],
"slow_down_for_layer_cooling": [
"1"
],
"slow_down_layer_time": [
"12"
],
"slow_down_min_speed": [
"15"
],
"supertack_plate_temp": [
"45"
],
"supertack_plate_temp_initial_layer": [
"45"
],
"support_material_interface_fan_speed": [
"50"
],
"temperature_vitrification": [
"80"
],
"textured_cool_plate_temp": [
"40"
],
"textured_cool_plate_temp_initial_layer": [
"40"
],
"textured_plate_temp": [
"55"
],
"textured_plate_temp_initial_layer": [
"55"
],
"filament_vendor": [
"LH Stinger"
],
"volumetric_speed_coefficients": [
""
]
}

View File

@@ -0,0 +1,352 @@
{
"name": "LHS PETG",
"type": "filament",
"filament_id": "LHF_petg",
"setting_id": "LHF_S_petg",
"from": "system",
"instantiation": "true",
"inherits": "fdm_filament_pla",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
],
"activate_air_filtration": [
"0"
],
"activate_chamber_temp_control": [
"0"
],
"adaptive_pressure_advance": [
"0"
],
"adaptive_pressure_advance_bridges": [
"0"
],
"adaptive_pressure_advance_model": [
"0,0,0\n0,0,0"
],
"adaptive_pressure_advance_overhangs": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"chamber_temperature": [
"0"
],
"close_fan_the_first_x_layers": [
"1"
],
"complete_print_exhaust_fan_speed": [
"70"
],
"cool_plate_temp": [
"35"
],
"cool_plate_temp_initial_layer": [
"35"
],
"default_filament_colour": [
""
],
"dont_slow_down_outer_wall": [
"0"
],
"during_print_exhaust_fan_speed": [
"70"
],
"enable_overhang_bridge_fan": [
"1"
],
"enable_pressure_advance": [
"1"
],
"eng_plate_temp": [
"0"
],
"eng_plate_temp_initial_layer": [
"0"
],
"fan_cooling_layer_time": [
"15"
],
"fan_max_speed": [
"65"
],
"fan_min_speed": [
"35"
],
"filament_adaptive_volumetric_speed": [
"0"
],
"filament_adhesiveness_category": [
"0"
],
"filament_change_length": [
"10"
],
"filament_cooling_final_speed": [
"0"
],
"filament_cooling_initial_speed": [
"0"
],
"filament_cooling_moves": [
"0"
],
"filament_cost": [
"20"
],
"filament_density": [
"1.24"
],
"filament_deretraction_speed": [
"nil"
],
"filament_diameter": [
"1.75"
],
"filament_end_gcode": [
"; filament end gcode\n"
],
"filament_extruder_variant": [
"Direct Drive Standard"
],
"filament_flow_ratio": [
"0.923"
],
"filament_flush_temp": [
"0"
],
"filament_flush_volumetric_speed": [
"0"
],
"filament_ironing_flow": [
"nil"
],
"filament_ironing_inset": [
"nil"
],
"filament_ironing_spacing": [
"nil"
],
"filament_ironing_speed": [
"nil"
],
"filament_is_support": [
"0"
],
"filament_loading_speed": [
"0"
],
"filament_loading_speed_start": [
"0"
],
"filament_long_retractions_when_cut": [
"nil"
],
"filament_max_volumetric_speed": [
"27"
],
"filament_minimal_purge_on_wipe_tower": [
"0"
],
"filament_multitool_ramming": [
"0"
],
"filament_multitool_ramming_flow": [
"0"
],
"filament_multitool_ramming_volume": [
"0"
],
"filament_notes": [
""
],
"filament_printable": [
"3"
],
"filament_ramming_parameters": [
"120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_lift_above": [
"nil"
],
"filament_retract_lift_below": [
"nil"
],
"filament_retract_lift_enforce": [
"nil"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_distances_when_cut": [
"nil"
],
"filament_retraction_length": [
"0.6"
],
"filament_retraction_minimum_travel": [
"nil"
],
"filament_retraction_speed": [
"nil"
],
"filament_shrink": [
"100%"
],
"filament_shrinkage_compensation_z": [
"100%"
],
"filament_soluble": [
"0"
],
"filament_stamping_distance": [
"0"
],
"filament_stamping_loading_speed": [
"0"
],
"filament_start_gcode": [
"; filament start gcode\n; MPC_SET HEATER=extruder FILAMENT_DENSITY=1.27 FILAMENT_HEAT_CAPACITY=5.5\nMAX_FAN LINK_AUX=0"
],
"filament_toolchange_delay": [
"0"
],
"filament_tower_interface_pre_extrusion_dist": [
"10"
],
"filament_tower_interface_pre_extrusion_length": [
"0"
],
"filament_tower_interface_print_temp": [
"-1"
],
"filament_tower_interface_purge_volume": [
"20"
],
"filament_tower_ironing_area": [
"4"
],
"filament_type": [
"PETG"
],
"filament_unloading_speed": [
"0"
],
"filament_unloading_speed_start": [
"0"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"nil"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"3"
],
"hot_plate_temp": [
"80"
],
"hot_plate_temp_initial_layer": [
"80"
],
"idle_temperature": [
"0"
],
"internal_bridge_fan_speed": [
"50"
],
"ironing_fan_speed": [
"-1"
],
"long_retractions_when_ec": [
"0"
],
"nozzle_temperature": [
"260"
],
"nozzle_temperature_initial_layer": [
"260"
],
"nozzle_temperature_range_high": [
"300"
],
"nozzle_temperature_range_low": [
"230"
],
"overhang_fan_speed": [
"90"
],
"overhang_fan_threshold": [
"50%"
],
"pellet_flow_coefficient": [
"0.4157"
],
"pressure_advance": [
"0.047"
],
"reduce_fan_stop_start_freq": [
"1"
],
"required_nozzle_HRC": [
"3"
],
"retraction_distances_when_ec": [
"10"
],
"slow_down_for_layer_cooling": [
"1"
],
"slow_down_layer_time": [
"14"
],
"slow_down_min_speed": [
"15"
],
"supertack_plate_temp": [
"45"
],
"supertack_plate_temp_initial_layer": [
"45"
],
"support_material_interface_fan_speed": [
"80"
],
"temperature_vitrification": [
"80"
],
"textured_cool_plate_temp": [
"40"
],
"textured_cool_plate_temp_initial_layer": [
"40"
],
"textured_plate_temp": [
"55"
],
"textured_plate_temp_initial_layer": [
"55"
],
"filament_vendor": [
"LH Stinger"
],
"volumetric_speed_coefficients": [
""
]
}

View File

@@ -0,0 +1,352 @@
{
"name": "LHS PLA",
"type": "filament",
"filament_id": "LHF_pla",
"setting_id": "LHF_S_pla",
"from": "system",
"instantiation": "true",
"inherits": "fdm_filament_pla",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
],
"activate_air_filtration": [
"0"
],
"activate_chamber_temp_control": [
"0"
],
"adaptive_pressure_advance": [
"0"
],
"adaptive_pressure_advance_bridges": [
"0"
],
"adaptive_pressure_advance_model": [
"0,0,0\n0,0,0"
],
"adaptive_pressure_advance_overhangs": [
"0"
],
"additional_cooling_fan_speed": [
"70"
],
"chamber_temperature": [
"0"
],
"close_fan_the_first_x_layers": [
"1"
],
"complete_print_exhaust_fan_speed": [
"70"
],
"cool_plate_temp": [
"35"
],
"cool_plate_temp_initial_layer": [
"35"
],
"default_filament_colour": [
""
],
"dont_slow_down_outer_wall": [
"0"
],
"during_print_exhaust_fan_speed": [
"70"
],
"enable_overhang_bridge_fan": [
"1"
],
"enable_pressure_advance": [
"1"
],
"eng_plate_temp": [
"0"
],
"eng_plate_temp_initial_layer": [
"0"
],
"fan_cooling_layer_time": [
"20"
],
"fan_max_speed": [
"100"
],
"fan_min_speed": [
"65"
],
"filament_adaptive_volumetric_speed": [
"0"
],
"filament_adhesiveness_category": [
"0"
],
"filament_change_length": [
"10"
],
"filament_cooling_final_speed": [
"0"
],
"filament_cooling_initial_speed": [
"0"
],
"filament_cooling_moves": [
"0"
],
"filament_cost": [
"20"
],
"filament_density": [
"1.24"
],
"filament_deretraction_speed": [
"nil"
],
"filament_diameter": [
"1.75"
],
"filament_end_gcode": [
"; filament end gcode\n"
],
"filament_extruder_variant": [
"Direct Drive Standard"
],
"filament_flow_ratio": [
"0.95"
],
"filament_flush_temp": [
"0"
],
"filament_flush_volumetric_speed": [
"0"
],
"filament_ironing_flow": [
"nil"
],
"filament_ironing_inset": [
"nil"
],
"filament_ironing_spacing": [
"nil"
],
"filament_ironing_speed": [
"nil"
],
"filament_is_support": [
"0"
],
"filament_loading_speed": [
"0"
],
"filament_loading_speed_start": [
"0"
],
"filament_long_retractions_when_cut": [
"nil"
],
"filament_max_volumetric_speed": [
"45"
],
"filament_minimal_purge_on_wipe_tower": [
"0"
],
"filament_multitool_ramming": [
"0"
],
"filament_multitool_ramming_flow": [
"0"
],
"filament_multitool_ramming_volume": [
"0"
],
"filament_notes": [
""
],
"filament_printable": [
"3"
],
"filament_ramming_parameters": [
"120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_lift_above": [
"nil"
],
"filament_retract_lift_below": [
"nil"
],
"filament_retract_lift_enforce": [
"nil"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_distances_when_cut": [
"nil"
],
"filament_retraction_length": [
"nil"
],
"filament_retraction_minimum_travel": [
"nil"
],
"filament_retraction_speed": [
"nil"
],
"filament_shrink": [
"100%"
],
"filament_shrinkage_compensation_z": [
"100%"
],
"filament_soluble": [
"0"
],
"filament_stamping_distance": [
"0"
],
"filament_stamping_loading_speed": [
"0"
],
"filament_start_gcode": [
"; filament start gcode\n; MPC_SET HEATER=extruder FILAMENT_DENSITY=1.24 FILAMENT_HEAT_CAPACITY=3.2\n; MAX_FAN LINK_AUX=0"
],
"filament_toolchange_delay": [
"0"
],
"filament_tower_interface_pre_extrusion_dist": [
"10"
],
"filament_tower_interface_pre_extrusion_length": [
"0"
],
"filament_tower_interface_print_temp": [
"-1"
],
"filament_tower_interface_purge_volume": [
"20"
],
"filament_tower_ironing_area": [
"4"
],
"filament_type": [
"PLA"
],
"filament_unloading_speed": [
"0"
],
"filament_unloading_speed_start": [
"0"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"nil"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"60"
],
"hot_plate_temp_initial_layer": [
"60"
],
"idle_temperature": [
"0"
],
"internal_bridge_fan_speed": [
"-1"
],
"ironing_fan_speed": [
"-1"
],
"long_retractions_when_ec": [
"0"
],
"nozzle_temperature": [
"235"
],
"nozzle_temperature_initial_layer": [
"230"
],
"nozzle_temperature_range_high": [
"280"
],
"nozzle_temperature_range_low": [
"190"
],
"overhang_fan_speed": [
"100"
],
"overhang_fan_threshold": [
"25%"
],
"pellet_flow_coefficient": [
"0.4157"
],
"pressure_advance": [
"0.02"
],
"reduce_fan_stop_start_freq": [
"1"
],
"required_nozzle_HRC": [
"3"
],
"retraction_distances_when_ec": [
"10"
],
"slow_down_for_layer_cooling": [
"1"
],
"slow_down_layer_time": [
"8"
],
"slow_down_min_speed": [
"15"
],
"supertack_plate_temp": [
"45"
],
"supertack_plate_temp_initial_layer": [
"45"
],
"support_material_interface_fan_speed": [
"100"
],
"temperature_vitrification": [
"45"
],
"textured_cool_plate_temp": [
"40"
],
"textured_cool_plate_temp_initial_layer": [
"40"
],
"textured_plate_temp": [
"55"
],
"textured_plate_temp_initial_layer": [
"60"
],
"filament_vendor": [
"LH Stinger"
],
"volumetric_speed_coefficients": [
""
]
}

View File

@@ -0,0 +1,352 @@
{
"name": "LHS TPU Foamy 78A",
"type": "filament",
"filament_id": "LHF_ftpuf",
"setting_id": "LHF_S_ftpuf",
"from": "system",
"instantiation": "true",
"inherits": "fdm_filament_tpu",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
],
"activate_air_filtration": [
"0"
],
"activate_chamber_temp_control": [
"0"
],
"adaptive_pressure_advance": [
"0"
],
"adaptive_pressure_advance_bridges": [
"0"
],
"adaptive_pressure_advance_model": [
"0,0,0\n0,0,0"
],
"adaptive_pressure_advance_overhangs": [
"0"
],
"additional_cooling_fan_speed": [
"55"
],
"chamber_temperature": [
"0"
],
"close_fan_the_first_x_layers": [
"1"
],
"complete_print_exhaust_fan_speed": [
"70"
],
"cool_plate_temp": [
"30"
],
"cool_plate_temp_initial_layer": [
"30"
],
"default_filament_colour": [
""
],
"dont_slow_down_outer_wall": [
"0"
],
"during_print_exhaust_fan_speed": [
"70"
],
"enable_overhang_bridge_fan": [
"1"
],
"enable_pressure_advance": [
"1"
],
"eng_plate_temp": [
"30"
],
"eng_plate_temp_initial_layer": [
"30"
],
"fan_cooling_layer_time": [
"30"
],
"fan_max_speed": [
"60"
],
"fan_min_speed": [
"60"
],
"filament_adaptive_volumetric_speed": [
"0"
],
"filament_adhesiveness_category": [
"0"
],
"filament_change_length": [
"10"
],
"filament_cooling_final_speed": [
"0"
],
"filament_cooling_initial_speed": [
"0"
],
"filament_cooling_moves": [
"0"
],
"filament_cost": [
"20"
],
"filament_density": [
"1.02"
],
"filament_deretraction_speed": [
"20"
],
"filament_diameter": [
"1.75"
],
"filament_end_gcode": [
"; filament end gcode\n"
],
"filament_extruder_variant": [
"Direct Drive Standard"
],
"filament_flow_ratio": [
"0.85"
],
"filament_flush_temp": [
"0"
],
"filament_flush_volumetric_speed": [
"0"
],
"filament_ironing_flow": [
"nil"
],
"filament_ironing_inset": [
"nil"
],
"filament_ironing_spacing": [
"nil"
],
"filament_ironing_speed": [
"nil"
],
"filament_is_support": [
"0"
],
"filament_loading_speed": [
"0"
],
"filament_loading_speed_start": [
"0"
],
"filament_long_retractions_when_cut": [
"nil"
],
"filament_max_volumetric_speed": [
"4"
],
"filament_minimal_purge_on_wipe_tower": [
"0"
],
"filament_multitool_ramming": [
"0"
],
"filament_multitool_ramming_flow": [
"0"
],
"filament_multitool_ramming_volume": [
"0"
],
"filament_notes": [
""
],
"filament_printable": [
"3"
],
"filament_ramming_parameters": [
"120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_lift_above": [
"nil"
],
"filament_retract_lift_below": [
"nil"
],
"filament_retract_lift_enforce": [
"nil"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_distances_when_cut": [
"nil"
],
"filament_retraction_length": [
"1.2"
],
"filament_retraction_minimum_travel": [
"1"
],
"filament_retraction_speed": [
"30"
],
"filament_shrink": [
"100%"
],
"filament_shrinkage_compensation_z": [
"100%"
],
"filament_soluble": [
"0"
],
"filament_stamping_distance": [
"0"
],
"filament_stamping_loading_speed": [
"0"
],
"filament_start_gcode": [
"; filament start gcode\n; MPC_SET HEATER=extruder FILAMENT_DENSITY=1.02 FILAMENT_HEAT_CAPACITY=2\n; MAX_FAN LINK_AUX=0 \nSET_PRESSURE_ADVANCE EXTRUDER=extruder SMOOTH_TIME=0.04"
],
"filament_toolchange_delay": [
"0"
],
"filament_tower_interface_pre_extrusion_dist": [
"10"
],
"filament_tower_interface_pre_extrusion_length": [
"0"
],
"filament_tower_interface_print_temp": [
"-1"
],
"filament_tower_interface_purge_volume": [
"20"
],
"filament_tower_ironing_area": [
"4"
],
"filament_type": [
"TPU"
],
"filament_unloading_speed": [
"0"
],
"filament_unloading_speed_start": [
"0"
],
"filament_wipe": [
"0"
],
"filament_wipe_distance": [
"nil"
],
"filament_z_hop": [
"0"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"25"
],
"hot_plate_temp_initial_layer": [
"25"
],
"idle_temperature": [
"0"
],
"internal_bridge_fan_speed": [
"-1"
],
"ironing_fan_speed": [
"-1"
],
"long_retractions_when_ec": [
"0"
],
"nozzle_temperature": [
"265"
],
"nozzle_temperature_initial_layer": [
"260"
],
"nozzle_temperature_range_high": [
"280"
],
"nozzle_temperature_range_low": [
"240"
],
"overhang_fan_speed": [
"70"
],
"overhang_fan_threshold": [
"25%"
],
"pellet_flow_coefficient": [
"0.4157"
],
"pressure_advance": [
"0.06"
],
"reduce_fan_stop_start_freq": [
"1"
],
"required_nozzle_HRC": [
"3"
],
"retraction_distances_when_ec": [
"10"
],
"slow_down_for_layer_cooling": [
"1"
],
"slow_down_layer_time": [
"5"
],
"slow_down_min_speed": [
"20"
],
"supertack_plate_temp": [
"0"
],
"supertack_plate_temp_initial_layer": [
"0"
],
"support_material_interface_fan_speed": [
"100"
],
"temperature_vitrification": [
"30"
],
"textured_cool_plate_temp": [
"40"
],
"textured_cool_plate_temp_initial_layer": [
"40"
],
"textured_plate_temp": [
"35"
],
"textured_plate_temp_initial_layer": [
"35"
],
"filament_vendor": [
"LH Stinger"
],
"volumetric_speed_coefficients": [
""
]
}

View File

@@ -0,0 +1,352 @@
{
"name": "LHS TPU",
"type": "filament",
"filament_id": "LHF_ptpu_pl",
"setting_id": "LHF_S_ptpu_pl",
"from": "system",
"instantiation": "true",
"inherits": "fdm_filament_tpu",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
],
"activate_air_filtration": [
"0"
],
"activate_chamber_temp_control": [
"0"
],
"adaptive_pressure_advance": [
"0"
],
"adaptive_pressure_advance_bridges": [
"0"
],
"adaptive_pressure_advance_model": [
"0,0,0\n0,0,0"
],
"adaptive_pressure_advance_overhangs": [
"0"
],
"additional_cooling_fan_speed": [
"55"
],
"chamber_temperature": [
"0"
],
"close_fan_the_first_x_layers": [
"1"
],
"complete_print_exhaust_fan_speed": [
"70"
],
"cool_plate_temp": [
"30"
],
"cool_plate_temp_initial_layer": [
"30"
],
"default_filament_colour": [
""
],
"dont_slow_down_outer_wall": [
"0"
],
"during_print_exhaust_fan_speed": [
"70"
],
"enable_overhang_bridge_fan": [
"1"
],
"enable_pressure_advance": [
"1"
],
"eng_plate_temp": [
"30"
],
"eng_plate_temp_initial_layer": [
"30"
],
"fan_cooling_layer_time": [
"20"
],
"fan_max_speed": [
"100"
],
"fan_min_speed": [
"60"
],
"filament_adaptive_volumetric_speed": [
"0"
],
"filament_adhesiveness_category": [
"0"
],
"filament_change_length": [
"10"
],
"filament_cooling_final_speed": [
"0"
],
"filament_cooling_initial_speed": [
"0"
],
"filament_cooling_moves": [
"0"
],
"filament_cost": [
"20"
],
"filament_density": [
"1.22"
],
"filament_deretraction_speed": [
"20"
],
"filament_diameter": [
"1.75"
],
"filament_end_gcode": [
"; filament end gcode\n"
],
"filament_extruder_variant": [
"Direct Drive Standard"
],
"filament_flow_ratio": [
"0.965"
],
"filament_flush_temp": [
"0"
],
"filament_flush_volumetric_speed": [
"0"
],
"filament_ironing_flow": [
"nil"
],
"filament_ironing_inset": [
"nil"
],
"filament_ironing_spacing": [
"nil"
],
"filament_ironing_speed": [
"nil"
],
"filament_is_support": [
"0"
],
"filament_loading_speed": [
"0"
],
"filament_loading_speed_start": [
"0"
],
"filament_long_retractions_when_cut": [
"nil"
],
"filament_max_volumetric_speed": [
"20"
],
"filament_minimal_purge_on_wipe_tower": [
"0"
],
"filament_multitool_ramming": [
"0"
],
"filament_multitool_ramming_flow": [
"0"
],
"filament_multitool_ramming_volume": [
"0"
],
"filament_notes": [
""
],
"filament_printable": [
"3"
],
"filament_ramming_parameters": [
"120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_lift_above": [
"nil"
],
"filament_retract_lift_below": [
"nil"
],
"filament_retract_lift_enforce": [
"Bottom Only"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_distances_when_cut": [
"nil"
],
"filament_retraction_length": [
"0.9"
],
"filament_retraction_minimum_travel": [
"nil"
],
"filament_retraction_speed": [
"35"
],
"filament_shrink": [
"100%"
],
"filament_shrinkage_compensation_z": [
"100%"
],
"filament_soluble": [
"0"
],
"filament_stamping_distance": [
"0"
],
"filament_stamping_loading_speed": [
"0"
],
"filament_start_gcode": [
"; filament start gcode\n; MPC_SET HEATER=extruder FILAMENT_DENSITY=1.22 FILAMENT_HEAT_CAPACITY=2\n; MAX_FAN LINK_AUX=0\nSET_PRESSURE_ADVANCE EXTRUDER=extruder SMOOTH_TIME=0.04"
],
"filament_toolchange_delay": [
"0"
],
"filament_tower_interface_pre_extrusion_dist": [
"10"
],
"filament_tower_interface_pre_extrusion_length": [
"0"
],
"filament_tower_interface_print_temp": [
"-1"
],
"filament_tower_interface_purge_volume": [
"20"
],
"filament_tower_ironing_area": [
"4"
],
"filament_type": [
"TPU"
],
"filament_unloading_speed": [
"0"
],
"filament_unloading_speed_start": [
"0"
],
"filament_wipe": [
"0"
],
"filament_wipe_distance": [
"nil"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"30"
],
"hot_plate_temp_initial_layer": [
"30"
],
"idle_temperature": [
"0"
],
"internal_bridge_fan_speed": [
"-1"
],
"ironing_fan_speed": [
"-1"
],
"long_retractions_when_ec": [
"0"
],
"nozzle_temperature": [
"245"
],
"nozzle_temperature_initial_layer": [
"230"
],
"nozzle_temperature_range_high": [
"300"
],
"nozzle_temperature_range_low": [
"200"
],
"overhang_fan_speed": [
"100"
],
"overhang_fan_threshold": [
"25%"
],
"pellet_flow_coefficient": [
"0.4157"
],
"pressure_advance": [
"0.08"
],
"reduce_fan_stop_start_freq": [
"1"
],
"required_nozzle_HRC": [
"3"
],
"retraction_distances_when_ec": [
"10"
],
"slow_down_for_layer_cooling": [
"1"
],
"slow_down_layer_time": [
"12"
],
"slow_down_min_speed": [
"12"
],
"supertack_plate_temp": [
"0"
],
"supertack_plate_temp_initial_layer": [
"0"
],
"support_material_interface_fan_speed": [
"100"
],
"temperature_vitrification": [
"30"
],
"textured_cool_plate_temp": [
"40"
],
"textured_cool_plate_temp_initial_layer": [
"40"
],
"textured_plate_temp": [
"35"
],
"textured_plate_temp_initial_layer": [
"35"
],
"filament_vendor": [
"LH Stinger"
],
"volumetric_speed_coefficients": [
""
]
}

View File

@@ -0,0 +1,88 @@
{
"type": "filament",
"name": "fdm_filament_abs",
"inherits": "fdm_filament_common",
"from": "system",
"instantiation": "false",
"cool_plate_temp": [
"105"
],
"eng_plate_temp": [
"105"
],
"hot_plate_temp": [
"105"
],
"textured_plate_temp": [
"105"
],
"cool_plate_temp_initial_layer": [
"105"
],
"eng_plate_temp_initial_layer": [
"105"
],
"hot_plate_temp_initial_layer": [
"105"
],
"textured_plate_temp_initial_layer": [
"105"
],
"slow_down_for_layer_cooling": [
"1"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"30"
],
"filament_max_volumetric_speed": [
"28.6"
],
"filament_type": [
"ABS"
],
"filament_density": [
"1.04"
],
"filament_cost": [
"20"
],
"nozzle_temperature_initial_layer": [
"260"
],
"reduce_fan_stop_start_freq": [
"1"
],
"fan_max_speed": [
"80"
],
"fan_min_speed": [
"10"
],
"overhang_fan_threshold": [
"25%"
],
"overhang_fan_speed": [
"80"
],
"nozzle_temperature": [
"260"
],
"temperature_vitrification": [
"110"
],
"nozzle_temperature_range_low": [
"240"
],
"nozzle_temperature_range_high": [
"270"
],
"slow_down_min_speed": [
"10"
],
"slow_down_layer_time": [
"3"
]
}

View File

@@ -0,0 +1,88 @@
{
"type": "filament",
"name": "fdm_filament_asa",
"inherits": "fdm_filament_common",
"from": "system",
"instantiation": "false",
"cool_plate_temp": [
"105"
],
"eng_plate_temp": [
"105"
],
"hot_plate_temp": [
"105"
],
"textured_plate_temp": [
"105"
],
"cool_plate_temp_initial_layer": [
"105"
],
"eng_plate_temp_initial_layer": [
"105"
],
"hot_plate_temp_initial_layer": [
"105"
],
"textured_plate_temp_initial_layer": [
"105"
],
"slow_down_for_layer_cooling": [
"1"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"35"
],
"filament_max_volumetric_speed": [
"28.6"
],
"filament_type": [
"ASA"
],
"filament_density": [
"1.04"
],
"filament_cost": [
"20"
],
"nozzle_temperature_initial_layer": [
"260"
],
"reduce_fan_stop_start_freq": [
"1"
],
"fan_max_speed": [
"80"
],
"fan_min_speed": [
"10"
],
"overhang_fan_threshold": [
"25%"
],
"overhang_fan_speed": [
"80"
],
"nozzle_temperature": [
"260"
],
"temperature_vitrification": [
"110"
],
"nozzle_temperature_range_low": [
"240"
],
"nozzle_temperature_range_high": [
"270"
],
"slow_down_min_speed": [
"10"
],
"slow_down_layer_time": [
"3"
]
}

View File

@@ -0,0 +1,141 @@
{
"type": "filament",
"name": "fdm_filament_common",
"from": "system",
"instantiation": "false",
"cool_plate_temp": [
"60"
],
"eng_plate_temp": [
"60"
],
"hot_plate_temp": [
"60"
],
"textured_plate_temp": [
"60"
],
"cool_plate_temp_initial_layer": [
"60"
],
"eng_plate_temp_initial_layer": [
"60"
],
"hot_plate_temp_initial_layer": [
"60"
],
"textured_plate_temp_initial_layer": [
"60"
],
"overhang_fan_threshold": [
"95%"
],
"overhang_fan_speed": [
"100"
],
"slow_down_for_layer_cooling": [
"1"
],
"close_fan_the_first_x_layers": [
"3"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"filament_flow_ratio": [
"1"
],
"reduce_fan_stop_start_freq": [
"0"
],
"fan_cooling_layer_time": [
"60"
],
"filament_cost": [
"0"
],
"filament_density": [
"0"
],
"filament_deretraction_speed": [
"nil"
],
"filament_diameter": [
"1.75"
],
"filament_max_volumetric_speed": [
"0"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_retraction_minimum_travel": [
"nil"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_length": [
"nil"
],
"filament_z_hop": [
"nil"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retraction_speed": [
"nil"
],
"filament_settings_id": [
""
],
"filament_soluble": [
"0"
],
"filament_type": [
"PLA"
],
"filament_vendor": [
"Generic"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"nil"
],
"bed_type": [
"Cool Plate"
],
"nozzle_temperature_initial_layer": [
"200"
],
"full_fan_speed_layer": [
"0"
],
"fan_max_speed": [
"100"
],
"fan_min_speed": [
"35"
],
"slow_down_min_speed": [
"10"
],
"slow_down_layer_time": [
"8"
],
"filament_start_gcode": [
"; Filament gcode\n"
],
"nozzle_temperature": [
"200"
],
"temperature_vitrification": [
"100"
]
}

View File

@@ -0,0 +1,88 @@
{
"type": "filament",
"name": "fdm_filament_pc",
"inherits": "fdm_filament_common",
"from": "system",
"instantiation": "false",
"cool_plate_temp": [
"0"
],
"eng_plate_temp": [
"110"
],
"hot_plate_temp": [
"110"
],
"textured_plate_temp": [
"110"
],
"cool_plate_temp_initial_layer": [
"0"
],
"eng_plate_temp_initial_layer": [
"110"
],
"hot_plate_temp_initial_layer": [
"110"
],
"textured_plate_temp_initial_layer": [
"110"
],
"slow_down_for_layer_cooling": [
"1"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"30"
],
"filament_max_volumetric_speed": [
"23.2"
],
"filament_type": [
"PC"
],
"filament_density": [
"1.04"
],
"filament_cost": [
"20"
],
"nozzle_temperature_initial_layer": [
"270"
],
"reduce_fan_stop_start_freq": [
"1"
],
"fan_max_speed": [
"60"
],
"fan_min_speed": [
"10"
],
"overhang_fan_threshold": [
"25%"
],
"overhang_fan_speed": [
"60"
],
"nozzle_temperature": [
"280"
],
"temperature_vitrification": [
"140"
],
"nozzle_temperature_range_low": [
"260"
],
"nozzle_temperature_range_high": [
"280"
],
"slow_down_min_speed": [
"10"
],
"slow_down_layer_time": [
"2"
]
}

View File

@@ -0,0 +1,82 @@
{
"type": "filament",
"name": "fdm_filament_pet",
"inherits": "fdm_filament_common",
"from": "system",
"instantiation": "false",
"cool_plate_temp": [
"60"
],
"eng_plate_temp": [
"0"
],
"hot_plate_temp": [
"80"
],
"textured_plate_temp": [
"80"
],
"cool_plate_temp_initial_layer": [
"60"
],
"eng_plate_temp_initial_layer": [
"0"
],
"hot_plate_temp_initial_layer": [
"80"
],
"textured_plate_temp_initial_layer": [
"80"
],
"slow_down_for_layer_cooling": [
"1"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"20"
],
"filament_max_volumetric_speed": [
"25"
],
"filament_type": [
"PETG"
],
"filament_density": [
"1.27"
],
"filament_cost": [
"30"
],
"nozzle_temperature_initial_layer": [
"255"
],
"reduce_fan_stop_start_freq": [
"1"
],
"fan_max_speed": [
"100"
],
"fan_min_speed": [
"20"
],
"overhang_fan_speed": [
"100"
],
"nozzle_temperature": [
"255"
],
"temperature_vitrification": [
"80"
],
"nozzle_temperature_range_low": [
"220"
],
"nozzle_temperature_range_high": [
"260"
],
"filament_start_gcode": [
"; filament start gcode\n"
]
}

View File

@@ -0,0 +1,94 @@
{
"type": "filament",
"name": "fdm_filament_pla",
"inherits": "fdm_filament_common",
"from": "system",
"instantiation": "false",
"fan_cooling_layer_time": [
"100"
],
"filament_max_volumetric_speed": [
"12"
],
"filament_type": [
"PLA"
],
"filament_density": [
"1.24"
],
"filament_cost": [
"20"
],
"cool_plate_temp": [
"60"
],
"eng_plate_temp": [
"60"
],
"hot_plate_temp": [
"60"
],
"textured_plate_temp": [
"60"
],
"cool_plate_temp_initial_layer": [
"60"
],
"eng_plate_temp_initial_layer": [
"60"
],
"hot_plate_temp_initial_layer": [
"60"
],
"textured_plate_temp_initial_layer": [
"60"
],
"nozzle_temperature_initial_layer": [
"220"
],
"reduce_fan_stop_start_freq": [
"1"
],
"slow_down_for_layer_cooling": [
"1"
],
"fan_max_speed": [
"100"
],
"fan_min_speed": [
"100"
],
"overhang_fan_speed": [
"100"
],
"overhang_fan_threshold": [
"50%"
],
"close_fan_the_first_x_layers": [
"1"
],
"nozzle_temperature": [
"220"
],
"temperature_vitrification": [
"60"
],
"nozzle_temperature_range_low": [
"190"
],
"nozzle_temperature_range_high": [
"230"
],
"slow_down_min_speed": [
"10"
],
"slow_down_layer_time": [
"4"
],
"additional_cooling_fan_speed": [
"70"
],
"filament_start_gcode": [
"; filament start gcode\n"
]
}

View File

@@ -0,0 +1,88 @@
{
"type": "filament",
"name": "fdm_filament_tpu",
"inherits": "fdm_filament_common",
"from": "system",
"instantiation": "false",
"cool_plate_temp": [
"30"
],
"eng_plate_temp": [
"30"
],
"hot_plate_temp": [
"35"
],
"textured_plate_temp": [
"35"
],
"cool_plate_temp_initial_layer": [
"30"
],
"eng_plate_temp_initial_layer": [
"30"
],
"hot_plate_temp_initial_layer": [
"35"
],
"textured_plate_temp_initial_layer": [
"35"
],
"fan_cooling_layer_time": [
"100"
],
"filament_max_volumetric_speed": [
"15"
],
"filament_type": [
"TPU"
],
"filament_density": [
"1.24"
],
"filament_cost": [
"20"
],
"filament_retraction_length": [
"0.4"
],
"nozzle_temperature_initial_layer": [
"240"
],
"reduce_fan_stop_start_freq": [
"1"
],
"slow_down_for_layer_cooling": [
"1"
],
"fan_max_speed": [
"100"
],
"fan_min_speed": [
"100"
],
"overhang_fan_speed": [
"100"
],
"additional_cooling_fan_speed": [
"70"
],
"close_fan_the_first_x_layers": [
"1"
],
"nozzle_temperature": [
"240"
],
"temperature_vitrification": [
"60"
],
"nozzle_temperature_range_low": [
"200"
],
"nozzle_temperature_range_high": [
"250"
],
"filament_start_gcode": [
"; filament start gcode\n"
]
}

View File

@@ -0,0 +1,16 @@
{
"type": "machine",
"name": "LH Stinger 0.4 nozzle",
"inherits": "fdm_lh_common",
"from": "system",
"setting_id": "LHS_m01_04",
"instantiation": "true",
"printer_model": "LH Stinger",
"nozzle_diameter": [
"0.4"
],
"default_filament_profile": [
"LHS PLA"
],
"printer_variant": "0.4"
}

View File

@@ -0,0 +1,16 @@
{
"type": "machine",
"name": "LH Stinger MMU 0.4 nozzle",
"inherits": "fdm_lh_mmu_common",
"from": "system",
"setting_id": "LHS_m01_mmu_04",
"instantiation": "true",
"printer_model": "LH Stinger MMU",
"nozzle_diameter": [
"0.4"
],
"default_filament_profile": [
"LHS PLA"
],
"printer_variant": "0.4"
}

View File

@@ -0,0 +1,12 @@
{
"type": "machine_model",
"name": "LH Stinger MMU",
"model_id": "LHS_M_mmu",
"nozzle_diameter": "0.4",
"machine_tech": "FFF",
"family": "LH",
"bed_model": "LH_Stinger_buildplate_model.STL",
"bed_texture": "LH_Stinger_MMU_buildplate_texture.png",
"hotend_model": "",
"default_materials": "LHS PLA;LHS PETG;LHS PCTG;LHS ASA;LHS ABS;LHS PC CF;LHS TPU Foamy 78A;LHS TPU;"
}

View File

@@ -0,0 +1,12 @@
{
"type": "machine_model",
"name": "LH Stinger",
"model_id": "LHS_M_base",
"nozzle_diameter": "0.4",
"machine_tech": "FFF",
"family": "LH",
"bed_model": "LH_Stinger_buildplate_model.STL",
"bed_texture": "LH_Stinger_buildplate_texture.png",
"hotend_model": "",
"default_materials": "LHS PLA;LHS PETG;LHS PCTG;LHS ASA;LHS ABS;LHS PC CF;LHS TPU Foamy 78A;LHS TPU;"
}

View File

@@ -0,0 +1,157 @@
{
"type": "machine",
"name": "fdm_lh_common",
"inherits": "fdm_machine_common",
"from": "system",
"instantiation": "false",
"gcode_flavor": "klipper",
"machine_max_acceleration_e": [
"5000",
"5000"
],
"machine_max_acceleration_extruding": [
"200000",
"20000"
],
"machine_max_acceleration_retracting": [
"200000",
"5000"
],
"machine_max_acceleration_travel": [
"20000",
"20000"
],
"machine_max_acceleration_x": [
"200000",
"20000"
],
"machine_max_acceleration_y": [
"200000",
"20000"
],
"machine_max_acceleration_z": [
"2000",
"200"
],
"machine_max_speed_e": [
"200",
"25"
],
"machine_max_speed_x": [
"1000",
"200"
],
"machine_max_speed_y": [
"1000",
"200"
],
"machine_max_speed_z": [
"100",
"12"
],
"machine_max_jerk_e": [
"15",
"2.5"
],
"machine_max_jerk_x": [
"15",
"9"
],
"machine_max_jerk_y": [
"15",
"9"
],
"machine_max_jerk_z": [
"15",
"0.4"
],
"machine_min_extruding_rate": [
"0",
"0"
],
"machine_min_travel_rate": [
"0",
"0"
],
"max_layer_height": [
"0.32"
],
"min_layer_height": [
"0.08"
],
"printable_area": [
"18x38",
"218x38",
"218x238",
"18x238"
],
"printable_height": "180",
"extruder_clearance_radius": "65",
"extruder_clearance_height_to_rod": "36",
"extruder_clearance_height_to_lid": "140",
"printer_settings_id": "",
"printer_technology": "FFF",
"printer_variant": "0.4",
"retraction_minimum_travel": [
"1"
],
"retract_before_wipe": [
"70%"
],
"retract_when_changing_layer": [
"1"
],
"retraction_length": [
"0.3"
],
"retract_length_toolchange": [
"0"
],
"z_hop": [
"0.2"
],
"retract_restart_extra": [
"0"
],
"retract_restart_extra_toolchange": [
"0"
],
"retraction_speed": [
"40"
],
"deretraction_speed": [
"30"
],
"retract_lift_enforce": [
"Top and Bottom"
],
"z_hop_types": [
"Auto Lift"
],
"silent_mode": "0",
"single_extruder_multi_material": "1",
"change_filament_gcode": "",
"manual_filament_change": "1",
"wipe": [
"1"
],
"default_filament_profile": [
"LH Generic PLA"
],
"enable_filament_ramming": "0",
"default_print_profile": "0.20mm Daily @LH Stinger",
"bed_exclude_area": [
"0x0"
],
"machine_start_gcode": "PRINT_START_LHS BED=[bed_temperature_initial_layer_single] HOTEND=[nozzle_temperature_initial_layer] AUTOMESH=1 AUTOPURGE=1 QUIETMODE={if print_preset =~ /.*Quiet.*/ }1{else}0{endif}\n",
"machine_end_gcode": "PRINT_END",
"layer_change_gcode": ";AFTER_LAYER_CHANGES\n;[layer_z]",
"before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\n",
"machine_pause_gcode": "PAUSE",
"scan_first_layer": "0",
"nozzle_type": [
"brass"
],
"bed_temperature_formula": "by_first_filament",
"auxiliary_fan": "1"
}

View File

@@ -0,0 +1,21 @@
{
"type": "machine",
"name": "fdm_lh_mmu_common",
"inherits": "fdm_lh_common",
"from": "system",
"instantiation": "false",
"cooling_tube_length": "0",
"cooling_tube_retraction": "0",
"enable_filament_ramming": "0",
"extra_loading_move": "0",
"machine_start_gcode": " _SP_PRINT_START LANE=[initial_tool] TEMP=[nozzle_temperature_initial_layer]\n\nPRINT_START_LHS BED=[bed_temperature_initial_layer_single] HOTEND=[nozzle_temperature_initial_layer] AUTOMESH=1 AUTOPURGE=1 QUIETMODE={if print_preset =~ /.*Quiet.*/ }1{else}0{endif}\n\n",
"change_filament_gcode": " _SP_SET_PURGE PURGE=[first_flush_volume] ",
"layer_change_gcode": ";AFTER_LAYER_CHANGES\n;[layer_z]",
"machine_end_gcode": "PRINT_END\n\n_SP_PRINT_END",
"machine_tool_change_time": "20",
"parking_pos_retraction": "0",
"manual_filament_change": "0",
"retract_length_toolchange": [
"0"
]
}

View File

@@ -0,0 +1,119 @@
{
"type": "machine",
"name": "fdm_machine_common",
"from": "system",
"instantiation": "false",
"printer_technology": "FFF",
"deretraction_speed": [
"40"
],
"extruder_colour": [
"#FCE94F"
],
"extruder_offset": [
"0x0"
],
"gcode_flavor": "marlin",
"silent_mode": "0",
"machine_max_acceleration_e": [
"5000"
],
"machine_max_acceleration_extruding": [
"10000"
],
"machine_max_acceleration_retracting": [
"1000"
],
"machine_max_acceleration_x": [
"10000"
],
"machine_max_acceleration_y": [
"10000"
],
"machine_max_acceleration_z": [
"500"
],
"machine_max_speed_e": [
"60"
],
"machine_max_speed_x": [
"500"
],
"machine_max_speed_y": [
"500"
],
"machine_max_speed_z": [
"10"
],
"machine_max_jerk_e": [
"5"
],
"machine_max_jerk_x": [
"8"
],
"machine_max_jerk_y": [
"8"
],
"machine_max_jerk_z": [
"0.4"
],
"machine_min_extruding_rate": [
"0"
],
"machine_min_travel_rate": [
"0"
],
"max_layer_height": [
"0.32"
],
"min_layer_height": [
"0.08"
],
"printable_height": "250",
"extruder_clearance_radius": "65",
"extruder_clearance_height_to_rod": "36",
"extruder_clearance_height_to_lid": "140",
"nozzle_diameter": [
"0.4"
],
"printer_settings_id": "",
"printer_variant": "0.4",
"retraction_minimum_travel": [
"2"
],
"retract_before_wipe": [
"70%"
],
"retract_when_changing_layer": [
"1"
],
"retraction_length": [
"1"
],
"retract_length_toolchange": [
"1"
],
"z_hop": [
"0"
],
"retract_restart_extra": [
"0"
],
"retract_restart_extra_toolchange": [
"0"
],
"retraction_speed": [
"60"
],
"single_extruder_multi_material": "1",
"change_filament_gcode": "",
"wipe": [
"1"
],
"default_print_profile": "",
"machine_start_gcode": "G0 Z20 F9000\nG92 E0; G1 E-10 F1200\nG28\nM970 Q1 A10 B10 C130 K0\nM970 Q1 A10 B131 C250 K1\nM974 Q1 S1 P0\nM970 Q0 A10 B10 C130 H20 K0\nM970 Q0 A10 B131 C250 K1\nM974 Q0 S1 P0\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nG29 ;Home\nG90;\nG92 E0 ;Reset Extruder \nG1 Z2.0 F3000 ;Move Z Axis up \nG1 X10.1 Y20 Z0.28 F5000.0 ;Move to start position\nM109 S205;\nG1 X10.1 Y200.0 Z0.28 F1500.0 E15 ;Draw the first line\nG1 X10.4 Y200.0 Z0.28 F5000.0 ;Move to side a little\nG1 X10.4 Y20 Z0.28 F1500.0 E30 ;Draw the second line\nG92 E0 ;Reset Extruder \nG1 X110 Y110 Z2.0 F3000 ;Move Z Axis up",
"machine_end_gcode": "M400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-4.0 F3600; retract \nG91\nG1 Z3;\nM104 S0 ; turn off hotend\nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nG90 \nG0 X110 Y200 F3600 \nprint_end",
"layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]",
"before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\n",
"machine_pause_gcode": "M601"
}

View File

@@ -0,0 +1,42 @@
{
"type": "process",
"name": "0.10mm HueForge @LH Stinger",
"inherits": "fdm_process_lh_common",
"from": "system",
"setting_id": "LHS_P_hueforge",
"instantiation": "true",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
],
"bottom_shell_layers": "999",
"bottom_solid_infill_flow_ratio": "0.98",
"detect_narrow_internal_solid_infill": "0",
"ensure_vertical_shell_thickness": "none",
"initial_layer_acceleration": "1000",
"initial_layer_infill_speed": "150",
"initial_layer_print_height": "0.16",
"initial_layer_speed": "80",
"layer_height": "0.1",
"max_travel_detour_distance": "60",
"print_extruder_id": [
"1"
],
"print_extruder_variant": [
"Direct Drive Standard"
],
"reduce_crossing_wall": "1",
"skirt_loops": "1",
"slice_closing_radius": "0.042",
"sparse_infill_density": "0%",
"top_bottom_infill_wall_overlap": "15%",
"top_shell_layers": "0",
"top_solid_infill_flow_ratio": "0.98",
"brim_type": "no_brim",
"wall_generator": "arachne",
"wall_sequence": "inner wall/outer wall",
"reduce_infill_retraction": "1",
"gap_fill_target": "nowhere",
"filter_out_gap_fill": "0.5",
"wall_loops": "1"
}

View File

@@ -0,0 +1,54 @@
{
"type": "process",
"name": "0.14mm Detail @LH Stinger",
"inherits": "fdm_process_lh_common",
"from": "system",
"setting_id": "LHS_P_detail",
"instantiation": "true",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
],
"bottom_shell_layers": "5",
"bridge_flow": "1.2",
"default_jerk": "10",
"enable_support": "1",
"ensure_vertical_shell_thickness": "ensure_moderate",
"filter_out_gap_fill": "10",
"infill_jerk": "10",
"infill_wall_overlap": "10%",
"initial_layer_infill_speed": "90",
"initial_layer_jerk": "10",
"initial_layer_travel_speed": "250",
"inner_wall_jerk": "10",
"internal_bridge_flow": "1.2",
"layer_height": "0.14",
"max_travel_detour_distance": "50",
"outer_wall_jerk": "10",
"print_extruder_id": [
"1"
],
"print_extruder_variant": [
"Direct Drive Standard"
],
"reduce_crossing_wall": "1",
"skirt_loops": "2",
"slow_down_layers": "2",
"small_perimeter_speed": "75%",
"small_perimeter_threshold": "3",
"sparse_infill_pattern": "rectilinear",
"sparse_infill_density": "15%",
"support_angle": "45",
"support_base_pattern": "rectilinear",
"support_base_pattern_spacing": "1.5",
"support_bottom_z_distance": "0.15",
"support_style": "organic",
"support_type": "tree(auto)",
"top_shell_layers": "6",
"top_surface_jerk": "10",
"wall_generator": "arachne",
"min_length_factor": "0.5",
"gap_fill_target": "nowhere",
"wall_loops": "3",
"travel_jerk": "10"
}

View File

@@ -0,0 +1,67 @@
{
"type": "process",
"name": "0.14mm Detail Strength @LH Stinger",
"inherits": "fdm_process_lh_common",
"from": "system",
"setting_id": "LHS_P_detail_strength",
"instantiation": "true",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
],
"bottom_shell_layers": "6",
"bottom_shell_thickness": "0.8",
"bridge_acceleration": "7500",
"bridge_flow": "1.2",
"brim_width": "3",
"default_acceleration": "15000",
"default_jerk": "10",
"gap_infill_speed": "200",
"infill_anchor": "1000",
"infill_anchor_max": "1000",
"infill_jerk": "10",
"initial_layer_infill_speed": "90",
"initial_layer_jerk": "10",
"initial_layer_travel_speed": "250",
"inner_wall_acceleration": "10000",
"inner_wall_speed": "200",
"inner_wall_jerk": "10",
"internal_solid_infill_acceleration": "15000",
"internal_solid_infill_speed": "200",
"layer_height": "0.14",
"max_travel_detour_distance": "50",
"outer_wall_acceleration": "7500",
"outer_wall_jerk": "10",
"outer_wall_speed": "200",
"print_extruder_id": [
"1"
],
"print_extruder_variant": [
"Direct Drive Standard"
],
"reduce_crossing_wall": "1",
"skirt_loops": "2",
"slow_down_layers": "2",
"small_perimeter_speed": "75%",
"small_perimeter_threshold": "3",
"sparse_infill_acceleration": "15000",
"sparse_infill_speed": "200",
"sparse_infill_density": "40%",
"sparse_infill_pattern": "gyroid",
"support_base_pattern_spacing": "1.5",
"support_bottom_interface_spacing": "0.3",
"support_bottom_z_distance": "0.15",
"support_interface_speed": "300",
"support_speed": "200",
"support_type": "normal(manual)",
"top_shell_layers": "7",
"top_shell_thickness": "1",
"top_surface_acceleration": "7500",
"top_surface_jerk": "10",
"top_surface_speed": "200",
"travel_jerk": "10",
"wall_generator": "arachne",
"wall_sequence": "inner wall/outer wall",
"top_bottom_infill_wall_overlap": "25%",
"wall_loops": "4"
}

View File

@@ -0,0 +1,12 @@
{
"type": "process",
"name": "0.20mm Daily @LH Stinger",
"inherits": "fdm_process_lh_common",
"from": "system",
"setting_id": "LHS_P_daily",
"instantiation": "true",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
]
}

View File

@@ -0,0 +1,48 @@
{
"type": "process",
"name": "0.20mm MMU @LH Stinger",
"inherits": "fdm_process_lh_common",
"from": "system",
"setting_id": "LHS_P_mmu",
"instantiation": "true",
"compatible_printers": [
"LH Stinger MMU 0.4 nozzle"
],
"bottom_surface_pattern": "monotonicline",
"bridge_acceleration": "7000",
"default_jerk": "10",
"detect_narrow_internal_solid_infill": "0",
"filter_out_gap_fill": "1",
"gap_infill_speed": "220",
"infill_jerk": "10",
"infill_wall_overlap": "8%",
"initial_layer_infill_speed": "120",
"initial_layer_jerk": "10",
"initial_layer_line_width": "0.4",
"inner_wall_acceleration": "15000",
"inner_wall_jerk": "10",
"inner_wall_speed": "220",
"internal_solid_infill_acceleration": "15000",
"internal_solid_infill_speed": "220",
"only_one_wall_first_layer": "1",
"outer_wall_jerk": "10",
"outer_wall_speed": "220",
"prime_tower_width": "80",
"print_extruder_id": [
"1"
],
"print_extruder_variant": [
"Direct Drive Standard"
],
"raft_first_layer_density": "50%",
"small_perimeter_threshold": "2",
"sparse_infill_acceleration": "15000",
"sparse_infill_pattern": "rectilinear",
"sparse_infill_speed": "220",
"top_bottom_infill_wall_overlap": "8%",
"top_surface_jerk": "10",
"top_surface_speed": "150",
"wall_generator": "arachne",
"sparse_infill_density": "15%",
"travel_jerk": "10"
}

View File

@@ -0,0 +1,74 @@
{
"type": "process",
"name": "0.20mm PETG @LH Stinger",
"inherits": "fdm_process_lh_common",
"from": "system",
"setting_id": "LHS_P_petg",
"instantiation": "true",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
],
"accel_to_decel_factor": "90%",
"bottom_shell_layers": "5",
"bridge_acceleration": "3000",
"bridge_density": "95%",
"bridge_flow": "1.1",
"bridge_speed": "30",
"brim_ears_max_angle": "180",
"brim_object_gap": "0.04",
"default_acceleration": "15000",
"default_jerk": "10",
"filter_out_gap_fill": "1",
"gap_infill_speed": "200",
"infill_jerk": "10",
"infill_wall_overlap": "10%",
"initial_layer_infill_speed": "100",
"initial_layer_jerk": "10",
"initial_layer_print_height": "0.25",
"initial_layer_travel_speed": "250",
"inner_wall_acceleration": "15000",
"inner_wall_speed": "200",
"inner_wall_jerk": "10",
"inner_wall_line_width": "0.44",
"internal_bridge_speed": "50",
"internal_solid_infill_acceleration": "15000",
"internal_solid_infill_speed": "200",
"internal_solid_infill_line_width": "0.44",
"line_width": "0.44",
"max_travel_detour_distance": "50",
"outer_wall_jerk": "10",
"outer_wall_line_width": "0.44",
"outer_wall_speed": "200",
"overhang_1_4_speed": "60%",
"overhang_2_4_speed": "40",
"overhang_3_4_speed": "20",
"overhang_reverse_internal_only": "1",
"overhang_reverse_threshold": "0%",
"print_extruder_id": [
"1"
],
"print_extruder_variant": [
"Direct Drive Standard"
],
"raft_first_layer_density": "60%",
"reduce_crossing_wall": "1",
"skirt_loops": "2",
"slow_down_layers": "2",
"small_perimeter_threshold": "10",
"sparse_infill_acceleration": "15000",
"sparse_infill_speed": "200",
"sparse_infill_line_width": "0.44",
"support_interface_speed": "200",
"support_line_width": "0.42",
"support_speed": "200",
"top_bottom_infill_wall_overlap": "18%",
"top_shell_layers": "6",
"top_surface_acceleration": "5000",
"top_surface_jerk": "10",
"top_surface_speed": "130",
"travel_jerk": "10",
"wall_loops": "3",
"gap_fill_target": "nowhere",
"wipe_tower_max_purge_speed": "150"
}

View File

@@ -0,0 +1,53 @@
{
"type": "process",
"name": "0.20mm Quiet @LH Stinger",
"inherits": "fdm_process_lh_common",
"from": "system",
"setting_id": "LHS_P_quiet",
"instantiation": "true",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
],
"accel_to_decel_factor": "75%",
"bridge_acceleration": "5000",
"bridge_speed": "40",
"default_acceleration": "10000",
"default_jerk": "5",
"filter_out_gap_fill": "10",
"gap_infill_speed": "200",
"infill_jerk": "5",
"infill_wall_overlap": "10%",
"initial_layer_infill_speed": "100",
"initial_layer_jerk": "5",
"initial_layer_travel_speed": "180",
"inner_wall_acceleration": "10000",
"inner_wall_jerk": "5",
"internal_bridge_speed": "60",
"internal_solid_infill_acceleration": "10000",
"outer_wall_acceleration": "5000",
"outer_wall_jerk": "5",
"outer_wall_speed": "200",
"print_extruder_id": [
"1"
],
"print_extruder_variant": [
"Direct Drive Standard"
],
"raft_first_layer_density": "60%",
"sparse_infill_acceleration": "10000",
"sparse_infill_pattern": "rectilinear",
"support_interface_speed": "170",
"support_speed": "170",
"top_surface_jerk": "5",
"top_surface_speed": "200",
"inner_wall_speed": "200",
"sparse_infill_speed": "200",
"internal_solid_infill_speed": "200",
"travel_acceleration": "10000",
"travel_jerk": "5",
"sparse_infill_density": "15%",
"accel_to_decel_enable": "1",
"gap_fill_target": "nowhere",
"travel_speed": "200"
}

View File

@@ -0,0 +1,64 @@
{
"type": "process",
"name": "0.20mm Solid @LH Stinger",
"inherits": "fdm_process_lh_common",
"from": "system",
"setting_id": "LHS_P_solid",
"instantiation": "true",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
],
"accel_to_decel_factor": "90%",
"bottom_shell_layers": "2",
"bridge_acceleration": "5000",
"bridge_density": "97%",
"brim_object_gap": "0.04",
"default_acceleration": "15000",
"default_jerk": "10",
"detect_narrow_internal_solid_infill": "0",
"enable_support": "1",
"ensure_vertical_shell_thickness": "none",
"filter_out_gap_fill": "2",
"gap_infill_speed": "200",
"infill_jerk": "10",
"infill_wall_overlap": "18%",
"initial_layer_jerk": "10",
"initial_layer_line_width": "0.45",
"initial_layer_print_height": "0.25",
"inner_wall_acceleration": "15000",
"inner_wall_jerk": "10",
"internal_solid_infill_acceleration": "15000",
"outer_wall_jerk": "10",
"outer_wall_speed": "200",
"overhang_1_4_speed": "60%",
"overhang_2_4_speed": "40",
"overhang_3_4_speed": "20",
"print_extruder_id": [
"1"
],
"print_extruder_variant": [
"Direct Drive Standard"
],
"raft_first_layer_density": "60%",
"small_perimeter_threshold": "7",
"sparse_infill_acceleration": "15000",
"sparse_infill_density": "98%",
"sparse_infill_pattern": "rectilinear",
"support_interface_speed": "200",
"support_speed": "200",
"top_shell_layers": "2",
"top_shell_thickness": "0.6",
"top_solid_infill_flow_ratio": "0.96",
"top_surface_acceleration": "5000",
"top_surface_jerk": "10",
"top_surface_speed": "150",
"inner_wall_speed": "200",
"sparse_infill_speed": "200",
"internal_solid_infill_speed": "200",
"internal_bridge_density": "95%",
"internal_bridge_speed": "150",
"gap_fill_target": "nowhere",
"wall_loops": "3",
"travel_jerk": "10"
}

View File

@@ -0,0 +1,43 @@
{
"type": "process",
"name": "0.20mm Speed @LH Stinger",
"inherits": "fdm_process_lh_common",
"from": "system",
"setting_id": "LHS_P_speed",
"instantiation": "true",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
],
"bridge_acceleration": "15000",
"default_acceleration": "30000",
"filter_out_gap_fill": "10",
"infill_wall_overlap": "10%",
"initial_layer_speed": "90",
"inner_wall_acceleration": "30000",
"inner_wall_speed": "600",
"internal_solid_infill_acceleration": "30000",
"internal_solid_infill_speed": "600",
"outer_wall_acceleration": "15000",
"outer_wall_speed": "600",
"print_extruder_id": [
"1"
],
"print_extruder_variant": [
"Direct Drive Standard"
],
"raft_first_layer_density": "80%",
"sparse_infill_acceleration": "30000",
"sparse_infill_pattern": "rectilinear",
"sparse_infill_speed": "600",
"support_bottom_z_distance": "0.15",
"support_expansion": "2",
"support_interface_top_layers": "3",
"support_object_xy_distance": "0.25",
"top_surface_acceleration": "15000",
"top_surface_speed": "300",
"travel_acceleration": "30000",
"sparse_infill_density": "15%",
"gap_fill_target": "nowhere",
"travel_speed": "600"
}

View File

@@ -0,0 +1,66 @@
{
"type": "process",
"name": "0.20mm Strength @LH Stinger",
"inherits": "fdm_process_lh_common",
"from": "system",
"setting_id": "LHS_P_strength",
"instantiation": "true",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
],
"accel_to_decel_factor": "90%",
"bottom_shell_layers": "5",
"bridge_acceleration": "5000",
"bridge_flow": "1.4",
"brim_object_gap": "0.04",
"default_acceleration": "15000",
"default_jerk": "10",
"filter_out_gap_fill": "1",
"gap_infill_speed": "200",
"infill_anchor": "1000",
"infill_anchor_max": "1000",
"infill_jerk": "10",
"initial_layer_infill_speed": "120",
"initial_layer_jerk": "10",
"initial_layer_speed": "90",
"initial_layer_travel_speed": "250",
"inner_wall_acceleration": "15000",
"inner_wall_jerk": "10",
"inner_wall_line_width": "0.46",
"internal_solid_infill_acceleration": "15000",
"internal_solid_infill_line_width": "0.46",
"line_width": "0.46",
"outer_wall_jerk": "10",
"outer_wall_line_width": "0.46",
"outer_wall_speed": "200",
"overhang_1_4_speed": "60%",
"overhang_2_4_speed": "40",
"overhang_3_4_speed": "20",
"precise_outer_wall": "0",
"print_extruder_id": [
"1"
],
"print_extruder_variant": [
"Direct Drive Standard"
],
"sparse_infill_acceleration": "15000",
"sparse_infill_density": "40%",
"sparse_infill_line_width": "0.46",
"sparse_infill_pattern": "gyroid",
"support_bottom_z_distance": "0.15",
"support_interface_speed": "200",
"support_line_width": "0.42",
"support_speed": "200",
"top_shell_layers": "6",
"top_shell_thickness": "1",
"top_surface_acceleration": "5000",
"top_surface_jerk": "10",
"top_surface_speed": "200",
"inner_wall_speed": "200",
"sparse_infill_speed": "200",
"internal_solid_infill_speed": "200",
"travel_jerk": "10",
"wall_sequence": "inner wall/outer wall",
"wall_loops": "4"
}

View File

@@ -0,0 +1,82 @@
{
"type": "process",
"name": "0.20mm TPU @LH Stinger",
"inherits": "fdm_process_lh_common",
"from": "system",
"setting_id": "LHS_P_tpu",
"instantiation": "true",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
],
"accel_to_decel_factor": "90%",
"bridge_acceleration": "5000",
"bridge_density": "95%",
"bridge_flow": "1.4",
"bridge_speed": "40",
"brim_ears_max_angle": "180",
"brim_object_gap": "0.02",
"default_acceleration": "15000",
"default_jerk": "5",
"elefant_foot_compensation": "0.15",
"filter_out_gap_fill": "40",
"gap_infill_speed": "200",
"infill_jerk": "5",
"initial_layer_infill_speed": "70",
"initial_layer_jerk": "5",
"initial_layer_print_height": "0.25",
"initial_layer_speed": "40",
"initial_layer_travel_speed": "200",
"inner_wall_acceleration": "15000",
"inner_wall_jerk": "5",
"inner_wall_line_width": "0.46",
"internal_bridge_flow": "1.2",
"internal_bridge_speed": "50",
"internal_solid_infill_acceleration": "15000",
"internal_solid_infill_line_width": "0.46",
"internal_solid_infill_speed": "180",
"line_width": "0.46",
"max_travel_detour_distance": "50",
"outer_wall_jerk": "5",
"outer_wall_line_width": "0.46",
"outer_wall_speed": "150",
"overhang_1_4_speed": "60%",
"overhang_2_4_speed": "40",
"overhang_3_4_speed": "20",
"print_extruder_id": [
"1"
],
"print_extruder_variant": [
"Direct Drive Standard"
],
"raft_first_layer_density": "80%",
"reduce_crossing_wall": "1",
"skirt_loops": "2",
"slow_down_layers": "2",
"small_perimeter_speed": "60%",
"small_perimeter_threshold": "10",
"sparse_infill_acceleration": "15000",
"sparse_infill_line_width": "0.46",
"sparse_infill_speed": "150",
"sparse_infill_density": "15%",
"staggered_inner_seams": "1",
"support_expansion": "2",
"support_interface_speed": "200",
"support_line_width": "0.42",
"support_speed": "200",
"top_bottom_infill_wall_overlap": "18%",
"top_surface_acceleration": "5000",
"top_surface_jerk": "5",
"top_surface_line_width": "0.42",
"top_surface_speed": "150",
"travel_jerk": "10",
"wipe_speed": "80",
"inner_wall_speed": "200",
"ensure_vertical_shell_thickness": "ensure_moderate",
"wall_sequence": "inner wall/outer wall",
"wall_loops": "3",
"gap_fill_target": "nowhere",
"reduce_infill_retraction": "1",
"infill_wall_overlap": "22%",
"wipe_tower_max_purge_speed": "80"
}

View File

@@ -0,0 +1,70 @@
{
"type": "process",
"name": "0.25mm Vase Mode @LH Stinger",
"inherits": "fdm_process_lh_common",
"from": "system",
"setting_id": "LHS_P_vase_mode",
"instantiation": "true",
"compatible_printers": [
"LH Stinger 0.4 nozzle",
"LH Stinger MMU 0.4 nozzle"
],
"accel_to_decel_factor": "90%",
"bottom_shell_layers": "5",
"bridge_acceleration": "5000",
"bridge_flow": "1.4",
"brim_object_gap": "0.04",
"default_acceleration": "15000",
"default_jerk": "10",
"filter_out_gap_fill": "1",
"gap_infill_speed": "200",
"infill_jerk": "10",
"infill_wall_overlap": "10%",
"initial_layer_jerk": "10",
"initial_layer_line_width": "0.65",
"initial_layer_print_height": "0.25",
"initial_layer_speed": "80",
"initial_layer_travel_speed": "250",
"inner_wall_acceleration": "15000",
"inner_wall_jerk": "10",
"inner_wall_line_width": "0.46",
"internal_solid_infill_acceleration": "15000",
"internal_solid_infill_line_width": "0.46",
"layer_height": "0.25",
"line_width": "0.46",
"notes": "Decrease your Filament - Minimum layer time to ~2 seconds and set your fan speeds to be constant",
"outer_wall_jerk": "10",
"outer_wall_line_width": "0.65",
"outer_wall_speed": "200",
"overhang_1_4_speed": "60%",
"overhang_2_4_speed": "40",
"overhang_3_4_speed": "20",
"print_extruder_id": [
"1"
],
"print_extruder_variant": [
"Direct Drive Standard"
],
"sparse_infill_acceleration": "15000",
"sparse_infill_density": "0%",
"sparse_infill_line_width": "0.46",
"sparse_infill_pattern": "3dhoneycomb",
"spiral_mode": "1",
"spiral_mode_smooth": "1",
"support_interface_speed": "200",
"support_line_width": "0.42",
"support_speed": "200",
"top_bottom_infill_wall_overlap": "10%",
"top_shell_layers": "0",
"top_shell_thickness": "1",
"top_surface_acceleration": "5000",
"top_surface_jerk": "10",
"top_surface_speed": "200",
"inner_wall_speed": "200",
"sparse_infill_speed": "200",
"internal_solid_infill_speed": "200",
"wall_sequence": "inner wall/outer wall",
"travel_jerk": "10",
"skirt_loops": "1",
"wall_loops": "1"
}

View File

@@ -0,0 +1,108 @@
{
"type": "process",
"name": "fdm_process_common",
"from": "system",
"instantiation": "false",
"adaptive_layer_height": "0",
"reduce_crossing_wall": "0",
"max_travel_detour_distance": "0",
"bottom_surface_pattern": "monotonic",
"bottom_shell_thickness": "0",
"bridge_speed": "50",
"brim_width": "5",
"brim_object_gap": "0.1",
"compatible_printers": [],
"compatible_printers_condition": "",
"print_sequence": "by layer",
"default_acceleration": "1000",
"initial_layer_acceleration": "500",
"top_surface_acceleration": "1000",
"travel_acceleration": "1000",
"inner_wall_acceleration": "1000",
"outer_wall_acceleration": "700",
"bridge_no_support": "0",
"draft_shield": "disabled",
"elefant_foot_compensation": "0",
"enable_arc_fitting": "0",
"wall_infill_order": "inner wall/outer wall/infill",
"infill_direction": "45",
"sparse_infill_density": "15%",
"sparse_infill_pattern": "crosshatch",
"initial_layer_print_height": "0.2",
"infill_combination": "0",
"infill_wall_overlap": "25%",
"interface_shells": "0",
"ironing_flow": "10%",
"ironing_spacing": "0.15",
"ironing_speed": "30",
"ironing_type": "no ironing",
"reduce_infill_retraction": "1",
"filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[initial_tool]}_{printer_model}_{print_time}.gcode",
"detect_overhang_wall": "1",
"slowdown_for_curled_perimeters": "1",
"overhang_1_4_speed": "0",
"overhang_2_4_speed": "50",
"overhang_3_4_speed": "30",
"overhang_4_4_speed": "10",
"line_width": "110%",
"inner_wall_line_width": "110%",
"outer_wall_line_width": "100%",
"top_surface_line_width": "93.75%",
"sparse_infill_line_width": "110%",
"initial_layer_line_width": "120%",
"internal_solid_infill_line_width": "120%",
"support_line_width": "96%",
"wall_loops": "3",
"print_settings_id": "",
"raft_layers": "0",
"seam_position": "aligned",
"skirt_distance": "2",
"skirt_height": "3",
"min_skirt_length": "4",
"skirt_loops": "0",
"minimum_sparse_infill_area": "15",
"spiral_mode": "0",
"standby_temperature_delta": "-5",
"enable_support": "0",
"resolution": "0.012",
"support_type": "normal(auto)",
"support_on_build_plate_only": "0",
"support_top_z_distance": "0.2",
"support_bottom_z_distance": "0.2",
"support_filament": "0",
"support_interface_loop_pattern": "0",
"support_interface_filament": "0",
"support_interface_top_layers": "2",
"support_interface_bottom_layers": "2",
"support_interface_spacing": "0.5",
"support_interface_speed": "80",
"support_base_pattern": "default",
"support_base_pattern_spacing": "2.5",
"support_speed": "150",
"support_threshold_angle": "30",
"support_object_xy_distance": "0.35",
"tree_support_branch_angle": "30",
"tree_support_wall_count": "0",
"tree_support_with_infill": "0",
"detect_thin_wall": "0",
"top_surface_pattern": "monotonicline",
"top_shell_thickness": "0.8",
"enable_prime_tower": "0",
"wipe_tower_no_sparse_layers": "0",
"prime_tower_width": "60",
"xy_hole_compensation": "0",
"xy_contour_compensation": "0",
"layer_height": "0.2",
"bottom_shell_layers": "3",
"top_shell_layers": "4",
"bridge_flow": "1",
"initial_layer_speed": "45",
"initial_layer_infill_speed": "45",
"outer_wall_speed": "45",
"inner_wall_speed": "80",
"sparse_infill_speed": "150",
"internal_solid_infill_speed": "150",
"top_surface_speed": "50",
"gap_infill_speed": "30",
"travel_speed": "200"
}

View File

@@ -0,0 +1,109 @@
{
"type": "process",
"name": "fdm_process_lh_common",
"inherits": "fdm_process_common",
"from": "system",
"instantiation": "false",
"exclude_object": "1",
"accel_to_decel_enable": "0",
"bottom_shell_layers": "4",
"bridge_acceleration": "10000",
"bridge_density": "100%",
"brim_object_gap": "0.05",
"brim_width": "4",
"default_acceleration": "20000",
"dont_filter_internal_bridges": "limited",
"elefant_foot_compensation": "0.05",
"ensure_vertical_shell_thickness": "ensure_critical_only",
"filter_out_gap_fill": "1",
"gap_fill_target": "everywhere",
"gap_infill_speed": "400",
"independent_support_layer_height": "0",
"infill_jerk": "15",
"infill_wall_overlap": "15%",
"top_bottom_infill_wall_overlap": "22%",
"initial_layer_acceleration": "600",
"initial_layer_infill_speed": "140",
"initial_layer_jerk": "15",
"initial_layer_line_width": "0.5",
"initial_layer_speed": "60",
"initial_layer_travel_speed": "300",
"inner_wall_acceleration": "20000",
"inner_wall_jerk": "15",
"inner_wall_line_width": "0.4",
"inner_wall_speed": "400",
"internal_bridge_speed": "70",
"internal_solid_infill_acceleration": "20000",
"internal_solid_infill_line_width": "0.4",
"internal_solid_infill_speed": "400",
"ironing_flow": "19%",
"ironing_inset": "0.3",
"ironing_speed": "50",
"line_width": "0.4",
"min_bead_width": "75%",
"min_feature_size": "20%",
"min_length_factor": "1.5",
"min_width_top_surface": "200%",
"only_one_wall_top": "1",
"outer_wall_acceleration": "10000",
"outer_wall_jerk": "15",
"outer_wall_line_width": "0.4",
"outer_wall_speed": "400",
"overhang_1_4_speed": "70%",
"overhang_4_4_speed": "15",
"prime_tower_brim_width": "2",
"prime_tower_width": "80",
"prime_volume": "75",
"raft_first_layer_density": "70%",
"reduce_infill_retraction": "0",
"resolution": "0.01",
"role_based_wipe_speed": "0",
"seam_gap": "0",
"skirt_distance": "8",
"skirt_height": "1",
"skirt_speed": "100",
"skirt_start_angle": "-25",
"slice_closing_radius": "0.04",
"slowdown_for_curled_perimeters": "0",
"sparse_infill_acceleration": "20000",
"sparse_infill_density": "20%",
"sparse_infill_line_width": "0.4",
"sparse_infill_pattern": "3dhoneycomb",
"sparse_infill_speed": "400",
"support_angle": "135",
"support_base_pattern_spacing": "2",
"support_expansion": "1",
"support_interface_spacing": "0.3",
"support_interface_speed": "400",
"support_line_width": "0.4",
"support_object_xy_distance": "0.2",
"support_on_build_plate_only": "1",
"support_speed": "400",
"support_style": "snug",
"support_top_z_distance": "0.15",
"thick_internal_bridges": "0",
"top_shell_layers": "5",
"top_surface_acceleration": "10000",
"top_surface_jerk": "15",
"top_surface_line_width": "0.4",
"top_surface_speed": "250",
"travel_acceleration": "20000",
"travel_jerk": "15",
"travel_speed": "400",
"wall_generator": "classic",
"wall_loops": "2",
"wall_sequence": "outer wall/inner wall",
"wipe_speed": "150",
"wipe_tower_bridging": "15",
"wipe_tower_extra_flow": "120%",
"wipe_tower_max_purge_speed": "200",
"enable_prime_tower": "1",
"precise_outer_wall": "0",
"print_extruder_id": [
"1"
],
"brim_type": "auto_brim",
"print_extruder_variant": [
"Direct Drive Standard"
]
}

View File

@@ -6,7 +6,9 @@
"from": "system",
"instantiation": "true",
"inherits": "fdm_filament_pet",
"filament_type": "PP",
"filament_type": [
"PP"
],
"nozzle_temperature_initial_layer": [
"185"
],

View File

@@ -360,6 +360,50 @@ CONFLICT_KEYS = [
['extruder_clearance_radius', 'extruder_clearance_max_radius'],
]
VECTOR_KEYS = {
"filament_type",
}
def check_vector_type_keys(profiles_dir, vendor_name):
"""
Check that properties expected to be vectors (JSON arrays) are not stored as scalars.
For example, `filament_type` must be a list like ["PA-CF"], not a string "PA-CF".
Parameters:
profiles_dir (Path): Base profiles directory
vendor_name (str): Vendor name
Returns:
int: Number of errors found
"""
error_count = 0
vendor_path = profiles_dir / vendor_name
if not vendor_path.exists():
return 0
for file_path in vendor_path.rglob("*.json"):
try:
with open(file_path, "r", encoding="UTF-8") as fp:
data = json.load(fp)
except Exception as e:
print_error(f"Error processing {file_path.relative_to(profiles_dir)}: {e}")
error_count += 1
continue
if not isinstance(data, dict):
continue
for key in VECTOR_KEYS:
if key in data and not isinstance(data[key], list):
print_error(
f"'{key}' must be an array in {file_path.relative_to(profiles_dir)}, "
f"got {type(data[key]).__name__}: {data[key]!r}"
)
error_count += 1
return error_count
def check_conflict_keys(profiles_dir, vendor_name):
"""
Check for keys that could not be specified at the same time,
@@ -448,6 +492,8 @@ def main():
errors_found += new_errors
warnings_found += new_warnings
errors_found += check_vector_type_keys(profiles_dir, vendor_name)
errors_found += check_filament_id(vendor_name, vendor_path / "filament")
checked_vendor_count += 1

View File

@@ -132,6 +132,7 @@ def update_profile_library(vendor="",profile_type="filament"):
library[profile_section] = sorted_profiles
f.seek(0)
json.dump(library, f, indent="\t", ensure_ascii=False)
f.write('\n')
f.truncate()
print(f"Profile library for {vendor} updated successfully!")
@@ -230,6 +231,7 @@ def clean_up_profile(vendor="", profile_type="", force=False):
f.seek(0)
ordered_profile = create_ordered_profile(_profile, ['type', 'name', 'renamed_from', 'inherits', 'from', 'setting_id', 'filament_id', 'instantiation'])
json.dump(ordered_profile, f, indent="\t", ensure_ascii=False)
f.write('\n')
f.truncate()
print(f"Updated profile: {full_path}")
except Exception as e:
@@ -274,6 +276,7 @@ def rename_filament_system(vendor="OrcaFilamentLibrary"):
if modified:
with open(full_path, 'w', encoding='utf-8') as f:
json.dump(data, f, indent="\t", ensure_ascii=False)
f.write('\n')
print(f"Updated {full_path}")
except Exception as e:

View File

@@ -491,7 +491,11 @@ public:
{ Polygons out; this->polygons_covered_by_spacing(out, scaled_epsilon); return out; }
// Minimum volumetric velocity of this extrusion entity. Used by the constant nozzle pressure algorithm.
double min_mm3_per_mm() const override;
Polyline as_polyline() const override { return this->polygon().split_at_first_point(); }
Polyline as_polyline() const override {
if (this->paths.empty() || this->length() <= 0.)
return Polyline();
return this->polygon().split_at_first_point();
}
void collect_polylines(Polylines &dst) const override { Polyline pl = this->as_polyline(); if (! pl.empty()) dst.emplace_back(std::move(pl)); }
void collect_points(Points &dst) const override {
size_t n = std::accumulate(paths.begin(), paths.end(), 0, [](const size_t n, const ExtrusionPath &p){ return n + p.polyline.size(); });

View File

@@ -66,9 +66,240 @@ static std::unique_ptr<noise::module::Module> get_noise_module(const FuzzySkinCo
}
}
// ---------------------------------------------------------------------------
// Ripple noise — deterministic sine-wave displacement along the path arc length.
//
// Unlike the other noise types, the ripple pattern is driven by cumulative arc
// length along the print path rather than world-space (x, y, z) coordinates.
// This gives a uniform wave period regardless of the polygon's geometry.
//
// A consistent visual anchor is established by finding the leftmost Y=0 crossing
// of the polygon (the point where the sine wave always peaks when phase shift is
// zero), ensuring the pattern aligns across layers.
//
// Per-layer-group phase shifting works as follows:
// period_index = floor(layer_id / layers_between_ripple_offset)
// phase_shift = period_index * ripple_offset * 2π [radians]
//
// Setting layers_between_ripple_offset = 1 shifts the phase on every layer;
// setting it to N makes N consecutive layers share the same pattern.
// ---------------------------------------------------------------------------
// Compute the per-layer-group phase shift in radians.
static double ripple_phase_shift_rad(const FuzzySkinConfig& cfg)
{
if (cfg.ripple_offset == 0.0 || cfg.layers_between_ripple_offset <= 0)
return 0.0;
const int effective_layer = std::max(cfg.layer_id, 0);
const int period_index = effective_layer / std::max(cfg.layers_between_ripple_offset, 1);
const double raw_shift = period_index * cfg.ripple_offset * (2.0 * M_PI);
return fmod(raw_shift, 2.0 * M_PI);
}
// Find the arc-length (in mm) of the visual anchor point along the polygon perimeter.
// The anchor is the leftmost Y=0 crossing, falling back to the vertex with the
// smallest |y| if no crossing exists. The anchor is where sin(phase) = 1 (a peak)
// when the phase shift is zero, giving a stable reference across layers.
static double ripple_anchor_arc_mm(const Points& poly)
{
const size_t np = poly.size();
// Find anchor world position: leftmost Y=0 crossing.
Vec2d anchor_world(std::numeric_limits<double>::max(), std::numeric_limits<double>::max());
bool found_crossing = false;
for (size_t i = 0; i < np; ++i) {
const double ya = unscale_(poly[i].y());
const double yb = unscale_(poly[(i + 1) % np].y());
if ((ya <= 0.0 && yb >= 0.0) || (ya >= 0.0 && yb <= 0.0)) {
const double t = (std::abs(yb - ya) < 1e-9) ? 0.0 : ya / (ya - yb);
const double x_cross = unscale_(poly[i].x()) +
std::max(0.0, std::min(1.0, t)) * (unscale_(poly[(i + 1) % np].x()) - unscale_(poly[i].x()));
if (!found_crossing || x_cross < anchor_world.x()) {
anchor_world = Vec2d(x_cross, 0.0);
found_crossing = true;
}
}
}
if (!found_crossing) {
double best_abs_y = std::numeric_limits<double>::max();
for (const Point& p : poly) {
const double ay = std::abs(unscale_(p.y()));
if (ay < best_abs_y) {
best_abs_y = ay;
anchor_world = Vec2d(unscale_(p.x()), unscale_(p.y()));
}
}
}
// Find the arc-length of the closest point on the polyline to anchor_world.
double anchor_arc_mm = 0.0;
double best_dist_sq = std::numeric_limits<double>::max();
double accum_mm = 0.0;
for (size_t i = 0; i < np; ++i) {
const Vec2d pa_mm(unscale_(poly[i].x()), unscale_(poly[i].y()));
const Vec2d pb_mm(unscale_(poly[(i + 1) % np].x()), unscale_(poly[(i + 1) % np].y()));
const Vec2d seg = pb_mm - pa_mm;
const double seg_len = seg.norm();
if (seg_len > 1e-9) {
const double t = std::max(0.0, std::min(1.0, (anchor_world - pa_mm).dot(seg) / (seg_len * seg_len)));
const double dist_sq = (pa_mm + seg * t - anchor_world).squaredNorm();
if (dist_sq < best_dist_sq) {
best_dist_sq = dist_sq;
anchor_arc_mm = accum_mm + t * seg_len;
}
}
accum_mm += seg_len;
}
return anchor_arc_mm;
}
// Apply a sine-wave ripple displacement to a closed polygon.
// Points are resampled at cfg.point_distance intervals along the perimeter.
static void fuzzy_polyline_ripple(Points& poly, const FuzzySkinConfig& cfg)
{
const double amplitude = unscale_(cfg.thickness);
const double N = static_cast<double>(cfg.ripples_per_layer);
const double fill_step_mm = unscale_(cfg.point_distance);
if (N <= 0.0 || fill_step_mm < 1e-6)
return;
// Compute total perimeter length in mm.
const size_t np = poly.size();
double perimeter_mm = 0.0;
for (size_t i = 0; i < np; ++i)
perimeter_mm += unscale_((poly[(i + 1) % np] - poly[i]).cast<double>().norm());
if (perimeter_mm < 1e-6)
return;
const double anchor_arc_mm = ripple_anchor_arc_mm(poly);
const double phase_shift_rad = ripple_phase_shift_rad(cfg);
// Phase function: φ(s) = N·2π·(s - anchor_arc) / perimeter + π/2 + phase_shift
// Adding π/2 ensures sin(φ) = 1 at the anchor when phase_shift = 0 (a peak).
const double phase_at_anchor = M_PI * 2.0 + phase_shift_rad;
auto arc_phase = [&](double arc_mm) -> double { return N * (2.0 * M_PI) * (arc_mm - anchor_arc_mm) / perimeter_mm + phase_at_anchor; };
Points out;
out.reserve(static_cast<size_t>(perimeter_mm / fill_step_mm) + np * 2);
double accum_mm = 0.0;
for (size_t i = 0; i < np; ++i) {
const Point& p0 = poly[i];
const Point& p1 = poly[(i + 1) % np];
const Vec2d seg = (p1 - p0).cast<double>();
const double seg_len = seg.norm();
if (seg_len < EPSILON)
continue;
const double seg_len_mm = unscale_(seg_len);
const Vec2d seg_unit = seg / seg_len;
const Vec2d seg_perp = perp(seg_unit);
const double seg_end_mm = accum_mm + seg_len_mm;
const double first_s = std::ceil(accum_mm / fill_step_mm) * fill_step_mm;
for (double s = first_s; s < seg_end_mm; s += fill_step_mm) {
const double t = (s - accum_mm) / seg_len_mm;
const double disp = std::sin(arc_phase(s)) * amplitude;
const Point pt = p0 + (seg * t).cast<coord_t>();
out.emplace_back(pt + (seg_perp * scale_(disp)).cast<coord_t>());
}
accum_mm = seg_end_mm;
}
while (out.size() < 3)
out.emplace_back(poly[poly.size() - 2]);
if (out.size() >= 3)
poly = std::move(out);
}
// Apply a sine-wave ripple displacement to an Arachne extrusion line.
// Mirrors fuzzy_polyline_ripple but operates on ExtrusionJunction vectors so
// that per-point line width (j.w) is preserved correctly.
static void fuzzy_extrusion_line_ripple(Arachne::ExtrusionJunctions& ext_lines, const FuzzySkinConfig& cfg)
{
const double amplitude = unscale_(cfg.thickness);
const double N = static_cast<double>(cfg.ripples_per_layer);
const double fill_step_mm = unscale_(cfg.point_distance);
if (N <= 0.0 || fill_step_mm < 1e-6)
return;
// Build a Points vector for perimeter/anchor calculations.
Points poly;
poly.reserve(ext_lines.size());
for (const auto& j : ext_lines)
poly.push_back(j.p);
// Compute total length in mm.
const size_t np = poly.size();
double perimeter_mm = 0.0;
for (size_t i = 0; i + 1 < np; ++i)
perimeter_mm += unscale_((poly[i + 1] - poly[i]).cast<double>().norm());
if (perimeter_mm < 1e-6)
return;
const double anchor_arc_mm = ripple_anchor_arc_mm(poly);
const double phase_shift_rad = ripple_phase_shift_rad(cfg);
const double phase_at_anchor = M_PI * 2.0 + phase_shift_rad;
auto arc_phase = [&](double arc_mm) -> double { return N * (2.0 * M_PI) * (arc_mm - anchor_arc_mm) / perimeter_mm + phase_at_anchor; };
Arachne::ExtrusionJunctions out;
out.reserve(static_cast<size_t>(perimeter_mm / fill_step_mm) + np * 2);
double accum_mm = 0.0;
for (size_t i = 0; i + 1 < np; ++i) {
const Arachne::ExtrusionJunction& j0 = ext_lines[i];
const Arachne::ExtrusionJunction& j1 = ext_lines[i + 1];
const Vec2d seg = (j1.p - j0.p).cast<double>();
const double seg_len = seg.norm();
if (seg_len < EPSILON)
continue;
const double seg_len_mm = unscale_(seg_len);
const Vec2d seg_unit = seg / seg_len;
const Vec2d seg_perp = perp(seg_unit);
const double seg_end_mm = accum_mm + seg_len_mm;
const double first_s = std::ceil(accum_mm / fill_step_mm) * fill_step_mm;
for (double s = first_s; s < seg_end_mm; s += fill_step_mm) {
const double t = (s - accum_mm) / seg_len_mm;
const double disp = std::sin(arc_phase(s)) * amplitude;
const Point pt = j0.p + (seg * t).cast<coord_t>();
out.emplace_back(pt + (seg_perp * scale_(disp)).cast<coord_t>(), j1.w, j1.perimeter_index);
}
accum_mm = seg_end_mm;
}
while (out.size() < 3) {
size_t point_idx = ext_lines.size() - 2;
out.emplace_back(ext_lines[point_idx].p, ext_lines[point_idx].w, ext_lines[point_idx].perimeter_index);
if (point_idx == 0)
break;
--point_idx;
}
if (out.size() >= 3)
ext_lines = std::move(out);
}
// Thanks Cura developers for this function.
void fuzzy_polyline(Points& poly, bool closed, coordf_t slice_z, const FuzzySkinConfig& cfg)
{
if (cfg.noise_type == NoiseType::Ripple) {
if (poly.size() < 3)
return;
fuzzy_polyline_ripple(poly, cfg);
return;
}
std::unique_ptr<noise::module::Module> noise = get_noise_module(cfg);
const double min_dist_between_points = cfg.point_distance * 3. / 4.; // hardcoded: the point distance may vary between 3/4 and 5/4 the supplied value
@@ -113,6 +344,14 @@ void fuzzy_polyline(Points& poly, bool closed, coordf_t slice_z, const FuzzySkin
// Thanks Cura developers for this function.
void fuzzy_extrusion_line(Arachne::ExtrusionJunctions& ext_lines, coordf_t slice_z, const FuzzySkinConfig& cfg, bool closed)
{
if (cfg.noise_type == NoiseType::Ripple) {
if (ext_lines.size() < 3)
return;
fuzzy_extrusion_line_ripple(ext_lines, cfg);
return;
}
std::unique_ptr<noise::module::Module> noise = get_noise_module(cfg);
const double min_dist_between_points = cfg.point_distance * 3. / 4.; // hardcoded: the point distance may vary between 3/4 and 5/4 the supplied value
@@ -190,7 +429,11 @@ void group_region_by_fuzzify(PerimeterGenerator& g)
region_config.fuzzy_skin_scale,
region_config.fuzzy_skin_octaves,
region_config.fuzzy_skin_persistence,
region_config.fuzzy_skin_mode};
region_config.fuzzy_skin_mode,
region_config.fuzzy_skin_ripples_per_layer,
region_config.fuzzy_skin_ripple_offset,
region_config.fuzzy_skin_layers_between_ripple_offset,
g.layer_id};
auto& surfaces = regions[cfg];
for (const auto& surface : region->slices.surfaces) {
surfaces.push_back(&surface);

View File

@@ -6232,7 +6232,6 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
gcode += this->travel_to(first_point, path.role(), "move to first " + description + " point", z);
m_need_change_layer_lift_z = false;
// Orca: ensure Z matches planned layer height
if (!slope_need_z_travel && (_last_pos_undefined || m_need_change_layer_lift_z)) {
const std::string z_sync_comment = _last_pos_undefined ?

View File

@@ -21,6 +21,10 @@ struct FuzzySkinConfig
int noise_octaves;
double noise_persistence;
FuzzySkinMode mode;
int ripples_per_layer;
double ripple_offset;
int layers_between_ripple_offset;
int layer_id;
bool operator==(const FuzzySkinConfig& r) const
{
@@ -32,7 +36,10 @@ struct FuzzySkinConfig
&& noise_scale == r.noise_scale
&& noise_octaves == r.noise_octaves
&& noise_persistence == r.noise_persistence
&& mode == r.mode;
&& mode == r.mode
&& ripples_per_layer == r.ripples_per_layer
&& ripple_offset == r.ripple_offset
&& layers_between_ripple_offset == r.layers_between_ripple_offset;
}
bool operator!=(const FuzzySkinConfig& r) const { return !(*this == r); }
@@ -52,6 +59,10 @@ template<> struct hash<Slic3r::FuzzySkinConfig>
boost::hash_combine(seed, std::hash<double>{}(c.noise_scale));
boost::hash_combine(seed, std::hash<int>{}(c.noise_octaves));
boost::hash_combine(seed, std::hash<double>{}(c.noise_persistence));
boost::hash_combine(seed, std::hash<Slic3r::FuzzySkinMode>{}(c.mode));
boost::hash_combine(seed, std::hash<int>{}(c.ripples_per_layer));
boost::hash_combine(seed, std::hash<double>{}(c.ripple_offset));
boost::hash_combine(seed, std::hash<int>{}(c.layers_between_ripple_offset));
return seed;
}
};

View File

@@ -38,6 +38,9 @@ Polyline Polygon::split_at_vertex(const Point &point) const
Polyline Polygon::split_at_index(int index) const
{
Polyline polyline;
if (this->points.empty())
return polyline;
polyline.points.reserve(this->points.size() + 1);
for (Points::const_iterator it = this->points.begin() + index; it != this->points.end(); ++it)
polyline.points.push_back(*it);

View File

@@ -1043,7 +1043,7 @@ static std::vector<std::string> s_Preset_print_options{
"support_ironing_flow",
"support_ironing_spacing",
"max_travel_detour_distance",
"fuzzy_skin", "fuzzy_skin_thickness", "fuzzy_skin_point_distance", "fuzzy_skin_first_layer", "fuzzy_skin_noise_type", "fuzzy_skin_mode", "fuzzy_skin_scale", "fuzzy_skin_octaves", "fuzzy_skin_persistence",
"fuzzy_skin", "fuzzy_skin_thickness", "fuzzy_skin_point_distance", "fuzzy_skin_first_layer", "fuzzy_skin_noise_type", "fuzzy_skin_mode", "fuzzy_skin_scale", "fuzzy_skin_octaves", "fuzzy_skin_persistence", "fuzzy_skin_ripples_per_layer", "fuzzy_skin_ripple_offset", "fuzzy_skin_layers_between_ripple_offset",
"max_volumetric_extrusion_rate_slope", "max_volumetric_extrusion_rate_slope_segment_length","extrusion_rate_smoothing_external_perimeter_only",
"inner_wall_speed", "outer_wall_speed", "sparse_infill_speed", "internal_solid_infill_speed",
"top_surface_speed", "support_speed", "support_object_xy_distance", "support_object_first_layer_gap", "support_interface_speed",

View File

@@ -4549,6 +4549,7 @@ std::pair<PresetsConfigSubstitutions, size_t> PresetBundle::load_vendor_configs_
std::string version_str = it.value();
auto config_version = Semver::parse(version_str);
if (! config_version) {
++m_errors;
throw ConfigurationError((boost::format("vendor %1%'s config version: %2% invalid\nSuggest cleaning the directory %3% firstly")
% vendor_name % version_str % path).str());
} else {

View File

@@ -183,7 +183,8 @@ static t_config_enum_values s_keys_map_NoiseType {
{ "perlin", int(NoiseType::Perlin) },
{ "billow", int(NoiseType::Billow) },
{ "ridgedmulti", int(NoiseType::RidgedMulti) },
{ "voronoi", int(NoiseType::Voronoi) }
{ "voronoi", int(NoiseType::Voronoi) },
{ "ripple", int(NoiseType::Ripple) }
};
CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(NoiseType)
@@ -696,11 +697,11 @@ void PrintConfigDef::init_common_params()
def->set_default_value(new ConfigOptionInt(1));
def = this->add("elefant_foot_layers_density", coPercent);
def->label = L("Elefant foot layers density");
def->label = L("Elephant foot layers density");
def->category = L("Quality");
def->tooltip = L("Density of internal solid infill for elefant foot layers compensation. "
"The initial value for the second layer is set. "
"Subsequent layers become linearly denser by the height specified in elefant_foot_compensation_layers. ");
def->tooltip = L("Density of internal solid infill for Elephant foot layers compensation.\n"
"The initial value for the second layer is set.\n"
"Subsequent layers become linearly denser by the height specified in elefant_foot_compensation_layers.");
def->sidetext = "%";
def->min = 50;
def->max = 100;
@@ -2191,6 +2192,7 @@ void PrintConfigDef::init_fff_params()
"This setting changes all extrusion flow of this filament in G-code proportionally. "
"The recommended value range is between 0.95 and 1.05. "
"You may be able to tune this value to get a nice flat surface if there is slight overflow or underflow.");
def->min = 0;
def->max = 2;
def->mode = comAdvanced;
def->nullable = true;
@@ -3369,7 +3371,7 @@ void PrintConfigDef::init_fff_params()
def->tooltip = L("The width within which to jitter. It's advised to be below outer wall line width.");
def->sidetext = L("mm"); // millimeters, CIS languages need translation
def->min = 0;
def->max = 1;
def->max = 2;
def->mode = comSimple;
def->set_default_value(new ConfigOptionFloat(0.2));
@@ -3421,18 +3423,21 @@ void PrintConfigDef::init_fff_params()
"Perlin: Perlin noise, which gives a more consistent texture.\n"
"Billow: Similar to perlin noise, but clumpier.\n"
"Ridged Multifractal: Ridged noise with sharp, jagged features. Creates marble-like textures.\n"
"Voronoi: Divides the surface into voronoi cells, and displaces each one by a random amount. Creates a patchwork texture.");
"Voronoi: Divides the surface into voronoi cells, and displaces each one by a random amount. Creates a patchwork texture.\n"
"Ripple: Uniform ripple pattern that ripples left and right of the original path. Repeating pattern, woven appearance.");
def->enum_keys_map = &ConfigOptionEnum<NoiseType>::get_enum_values();
def->enum_values.push_back("classic");
def->enum_values.push_back("perlin");
def->enum_values.push_back("billow");
def->enum_values.push_back("ridgedmulti");
def->enum_values.push_back("voronoi");
def->enum_values.push_back("ripple");
def->enum_labels.push_back(L("Classic"));
def->enum_labels.push_back(L("Perlin"));
def->enum_labels.push_back(L("Billow"));
def->enum_labels.push_back(L("Ridged Multifractal"));
def->enum_labels.push_back(L("Voronoi"));
def->enum_labels.push_back(L("Ripple"));
def->mode = comSimple;
def->set_default_value(new ConfigOptionEnum<NoiseType>(NoiseType::Classic));
@@ -3464,6 +3469,38 @@ void PrintConfigDef::init_fff_params()
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloat(0.5));
def = this->add("fuzzy_skin_ripples_per_layer", coInt);
def->label = L("Number of ripples per layer");
def->category = L("Others");
def->tooltip = L("When using the Ripple noise type, this controls how many full cycles of ripples will be added per layer.");
def->min = 1;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionInt(15));
def = this->add("fuzzy_skin_ripple_offset", coFloat);
def->label = L("Ripple offset");
def->category = L("Others");
def->tooltip = L("When using the Ripple noise type, shifts the ripple pattern forward along the print path by this amount each "
"layer-period. A value of 0 keeps every layer identical. A value equal to 0.5 shifts by a full "
"half-wavelength, inverting the pattern. The shift is applied once per 'Layers between Ripple offset' layers, "
"so consecutive layers within a period are printed identically on top of each other.");
def->min = 0;
def->max = 1;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloat(0.5));
def = this->add("fuzzy_skin_layers_between_ripple_offset", coInt);
def->label = L("Layers between ripple offset");
def->category = L("Others");
def->tooltip = L("When using the Ripple noise type with a non-zero layer offset, this controls how "
"many consecutive layers share the same ripple phase before the offset is applied. "
"For example, a period of 3 means layers 0, 1 and 2 are identical, then layers 3, 4 "
"and 5 are shifted by one full 'Ripple layer offset', and so on. "
"Set to 1 to shift on every layer.");
def->min = 1;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionInt(1));
def = this->add("filter_out_gap_fill", coFloat);
def->label = L("Filter out tiny gaps");
def->category = L("Layers and Perimeters");
@@ -4124,15 +4161,16 @@ void PrintConfigDef::init_fff_params()
def = this->add("zaa_enabled", coBool);
def->label = L("Z contouring enabled");
def->category = L("Quality");
def->tooltip = L("Enable Z-layer contouring (aka Z-layer anti-aliasing)");
def->tooltip = L("Enable Z-layer contouring (aka Z-layer anti-aliasing).");
def->mode = comExpert;
def->set_default_value(new ConfigOptionBool(false));
def = this->add("zaa_minimize_perimeter_height", coFloat);
def->label = L("Minimize wall height angle");
def->category = L("Quality");
def->tooltip = L("Reduce height of top surface perimeters to match height of model edge. "
"Effects perimeters whose slope is less than this angle in degrees. Reasonable value is 35. Set 0 to disable.");
def->tooltip = L("Reduce the height of top-surface perimeters to match the model edge height.\n"
"Affects perimeters with a slope less than this angle (degrees).\n"
"A reasonable value is 35. Set to 0 to disable.");
def->sidetext = L("°");
def->min = 0;
def->max = 90;
@@ -4142,14 +4180,15 @@ void PrintConfigDef::init_fff_params()
def = this->add("zaa_dont_alternate_fill_direction", coBool);
def->label = L("Don't alternate fill direction");
def->category = L("Quality");
def->tooltip = L("Disable alternating fill direction when using Z contouring");
def->tooltip = L("Disable alternating fill direction when using Z contouring.");
def->mode = comExpert;
def->set_default_value(new ConfigOptionBool(false));
def = this->add("zaa_min_z", coFloat);
def->label = L("Minimum z height");
def->category = L("Quality");
def->tooltip = L("Minimum z layer height. Also controls slicing plane");
def->tooltip = L("Minimum Z-layer height.\n"
"Also controls the slicing plane.");
def->sidetext = L("mm");
def->min = 0;
def->max = 100;
@@ -5237,7 +5276,8 @@ void PrintConfigDef::init_fff_params()
def->label = L("Scarf joint flow ratio");
def->category = L("Quality");
def->tooltip = L("This factor affects the amount of material for scarf joints.");
def->mode = comDevelop;
def->mode = comExpert;
def->min = 0;
def->max = 2;
def->set_default_value(new ConfigOptionFloat(1));

View File

@@ -56,6 +56,7 @@ enum class NoiseType {
Billow,
RidgedMulti,
Voronoi,
Ripple,
};
enum class WipeTowerType {
@@ -1084,6 +1085,9 @@ PRINT_CONFIG_CLASS_DEFINE(
((ConfigOptionFloat, fuzzy_skin_scale))
((ConfigOptionInt, fuzzy_skin_octaves))
((ConfigOptionFloat, fuzzy_skin_persistence))
((ConfigOptionInt, fuzzy_skin_ripples_per_layer))
((ConfigOptionFloat, fuzzy_skin_ripple_offset))
((ConfigOptionInt, fuzzy_skin_layers_between_ripple_offset))
((ConfigOptionFloat, gap_infill_speed))
((ConfigOptionInt, sparse_infill_filament))
((ConfigOptionFloatOrPercent, sparse_infill_line_width))

View File

@@ -881,9 +881,13 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co
// Show noise type specific options with the same logic
NoiseType fuzzy_skin_noise_type = config->opt_enum<NoiseType>("fuzzy_skin_noise_type");
toggle_line("fuzzy_skin_scale", fuzzy_skin_noise_type != NoiseType::Classic && has_fuzzy_skin);
toggle_line("fuzzy_skin_octaves", fuzzy_skin_noise_type != NoiseType::Classic && fuzzy_skin_noise_type != NoiseType::Voronoi && has_fuzzy_skin);
toggle_line("fuzzy_skin_persistence", (fuzzy_skin_noise_type == NoiseType::Perlin || fuzzy_skin_noise_type == NoiseType::Billow) && has_fuzzy_skin);
const bool is_ripple = fuzzy_skin_noise_type == NoiseType::Ripple;
toggle_line("fuzzy_skin_scale", fuzzy_skin_noise_type != NoiseType::Classic && has_fuzzy_skin && !is_ripple);
toggle_line("fuzzy_skin_octaves", fuzzy_skin_noise_type != NoiseType::Classic && fuzzy_skin_noise_type != NoiseType::Voronoi && has_fuzzy_skin && !is_ripple);
toggle_line("fuzzy_skin_persistence", (fuzzy_skin_noise_type == NoiseType::Perlin || fuzzy_skin_noise_type == NoiseType::Billow) && has_fuzzy_skin && !is_ripple);
toggle_line("fuzzy_skin_ripples_per_layer", is_ripple && has_fuzzy_skin);
toggle_line("fuzzy_skin_ripple_offset", is_ripple && has_fuzzy_skin);
toggle_line("fuzzy_skin_layers_between_ripple_offset", is_ripple && has_fuzzy_skin);
bool have_arachne = config->opt_enum<PerimeterGeneratorType>("wall_generator") == PerimeterGeneratorType::Arachne;
for (auto el : {"wall_transition_length", "wall_transition_filter_deviation", "wall_transition_angle", "min_feature_size", "min_length_factor",

View File

@@ -516,13 +516,15 @@ void GCodeViewer::SequentialView::Marker::render_position_window(const libvgcode
}
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding , 3.f * m_scale);
ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(.5f, .5f));
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding , ImVec2(2.f, 2.f) * m_scale);
ImGui::PushStyleColor(ImGuiCol_Button , ImVec4(0, 0, 0, 0));
ImGui::PushStyleColor(ImGuiCol_ButtonHovered , ImVec4(84 / 255.f, 84 / 255.f, 90 / 255.f, 1.f));
ImGui::PushStyleColor(ImGuiCol_ButtonActive , ImVec4(84 / 255.f, 84 / 255.f, 90 / 255.f, 1.f));
const float main_wnd_height = ImGui::GetWindowHeight();
if (ImGui::Button(into_u8(properties_shown ? ImGui::UnfoldButtonIcon : ImGui::FoldButtonIcon).c_str(), ImVec2(24.f, 24.f) * m_scale)) {
// ORCA use glyph based button for fixing button sizes changing depends on used font size on platform
const wchar_t foldIcon = properties_shown ? ImGui::UnfoldButtonIcon : ImGui::FoldButtonIcon;
if (imgui.glyph_button(foldIcon, ImVec2(16.f, 16.f) * m_scale)) {
properties_shown = !properties_shown;
static float main_wnd_height_temp = ImGui::GetWindowHeight();
static float first_click = true;
@@ -537,7 +539,8 @@ void GCodeViewer::SequentialView::Marker::render_position_window(const libvgcode
ImGui::SameLine();
ImGui::SetCursorPosY(ImGui::GetCursorPosY() - ImGui::GetStyle().FramePadding.y); // aligns button with next group
if(!properties_shown)
ImGui::SetCursorPosY(ImGui::GetCursorPosY() - ImGui::GetStyle().FramePadding.y); // aligns button with next group
ImGui::BeginGroup(); // group contents to make information area more compact
@@ -3327,29 +3330,26 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
ImGui::Dummy({ window_padding, window_padding });
ImGui::Dummy({ window_padding, window_padding });
ImGui::SameLine(window_padding * 2); // ORCA Ignores item spacing to get perfect window margins since since this part uses dummies for window padding
std::wstring btn_name;
if (m_fold)
btn_name = ImGui::UnfoldButtonIcon;
else
btn_name = ImGui::FoldButtonIcon;
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0));
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(84 / 255.f, 84 / 255.f, 90 / 255.f, 1.f));
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(84 / 255.f, 84 / 255.f, 90 / 255.f, 1.f));
float calc_padding = (ImGui::GetFrameHeight() - 16 * m_scale) / 2; // ORCA calculated padding for 16x16 icon
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(calc_padding, calc_padding)); // ORCA Center icon with frame padding
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f * m_scale); // ORCA Match button style with combo box
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding , ImVec2(2.f, 2.f) * m_scale);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f * m_scale); // ORCA Match button style with combo box
float button_width = 16 * m_scale + calc_padding * 2; // ORCA match buttons height with combo box
if (ImGui::Button(into_u8(btn_name).c_str(), ImVec2(button_width, button_width))) {
// ORCA use glyph based button for fixing button sizes changing depends on used font size on platform
const wchar_t foldIcon = m_fold ? ImGui::UnfoldButtonIcon : ImGui::FoldButtonIcon;
if (imgui.glyph_button(foldIcon, ImVec2(16.f, 16.f) * m_scale)) {
m_fold = !m_fold;
}
ImGui::SameLine();
const wchar_t gCodeToggle = ImGui::gCodeButtonIcon;
if (ImGui::Button(into_u8(gCodeToggle).c_str(), ImVec2(button_width, button_width))) {
if (imgui.glyph_button(gCodeToggle, ImVec2(16.f, 16.f) * m_scale)) {
wxGetApp().toggle_show_gcode_window();
wxGetApp().plater()->get_current_canvas3D()->post_event(SimpleEvent(wxEVT_PAINT));
}
ImGui::PopStyleColor(3);
ImGui::PopStyleVar(2);

View File

@@ -23,6 +23,7 @@
#include "slic3r/GUI/I18N.hpp"
#include <algorithm>
#include <atomic>
#include <iterator>
#include <exception>
#include <cstdlib>
@@ -276,8 +277,8 @@ bool is_associate_files(std::wstring extend)
class SplashScreen : public wxSplashScreen
{
public:
SplashScreen(const wxBitmap& bitmap, long splashStyle, int milliseconds, wxPoint pos = wxDefaultPosition)
: wxSplashScreen(bitmap, splashStyle, milliseconds, static_cast<wxWindow*>(wxGetApp().mainframe), wxID_ANY, wxDefaultPosition, wxDefaultSize,
SplashScreen(wxPoint pos = wxDefaultPosition)
: wxSplashScreen(wxBitmap(FromDIP(wxSize(480,480),nullptr)), wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_TIMEOUT, 1500, nullptr, wxID_ANY, wxDefaultPosition, wxDefaultSize,
#ifdef __APPLE__
wxBORDER_NONE | wxFRAME_NO_TASKBAR | wxSTAY_ON_TOP
#else
@@ -285,51 +286,53 @@ public:
#endif // !__APPLE__
)
{
int init_dpi = get_dpi_for_window(this);
this->SetPosition(pos);
this->CenterOnScreen();
int new_dpi = get_dpi_for_window(this);
m_scale = (float)(new_dpi) / (float)(init_dpi);
scale_font(m_font_version, 1.65f); // only scale this one since it hasnt a preloaded font like Label::Body_24;
m_main_bitmap = bitmap;
m_bg_color = StateColor::darkModeColorFor(wxColour("#FFFFFF"));
m_fg_color = StateColor::darkModeColorFor(wxColour("#6B6A6A"));
bool dark_mode = m_fg_color != wxColour("#6B6A6A");
wxSize sz = m_window->GetClientSize();
BitmapCache bmp_cache;
m_logo_bmp = *bmp_cache.load_svg(dark_mode ? "splash_logo_dark" : "splash_logo", sz.GetWidth(), sz.GetHeight());
scale_bitmap(m_main_bitmap, m_scale);
m_window->Bind(wxEVT_PAINT, &SplashScreen::OnPaint, this);
m_window->Refresh();
m_window->Update();
}
// init constant texts and scale fonts
m_constant_text.init(Label::Body_16);
void OnPaint(wxPaintEvent& evt)
{
wxPaintDC dc(m_window);
wxSize c_sz = m_window->GetClientSize();
// ORCA scale all fonts with monitor scale
scale_font(m_constant_text.version_font, m_scale * 2);
scale_font(m_constant_text.based_on_font, m_scale * 1.5f);
scale_font(m_constant_text.credits_font, m_scale * 2);
dc.SetBackground(wxBrush(m_bg_color));
dc.Clear();
if (m_logo_bmp.IsOk())
dc.DrawBitmap(m_logo_bmp, 0, 0, true);
// this font will be used for the action string
m_action_font = m_constant_text.credits_font;
wxRect rc = wxRect(0, 0, c_sz.GetWidth(), 0);
dc.SetTextForeground(m_fg_color);
// draw logo and constant info text
Decorate(m_main_bitmap);
wxGetApp().UpdateFrameDarkUI(this);
dc.SetFont(m_font_version);
rc.y = c_sz.GetHeight() * 0.72;
rc.height = dc.GetTextExtent(m_text_version).GetHeight();
dc.DrawLabel(m_text_version, rc, wxALIGN_CENTER);
dc.SetFont(m_font_action);
rc.y = c_sz.GetHeight() * 0.88;
rc.height = dc.GetTextExtent(m_text_action).GetHeight();
dc.DrawLabel(m_text_action, rc, wxALIGN_CENTER);
}
void SetText(const wxString& text)
{
set_bitmap(m_main_bitmap);
if (!text.empty()) {
wxBitmap bitmap(m_main_bitmap);
wxMemoryDC memDC;
memDC.SelectObject(bitmap);
memDC.SetFont(m_action_font);
memDC.SetTextForeground(StateColor::darkModeColorFor(wxColour(144, 144, 144)));
int width = bitmap.GetWidth();
int text_height = memDC.GetTextExtent(text).GetHeight();
int text_width = memDC.GetTextExtent(text).GetWidth();
wxRect text_rect(wxPoint(0, m_action_line_y_position), wxPoint(width, m_action_line_y_position + text_height));
memDC.DrawLabel(text, text_rect, wxALIGN_CENTER);
memDC.SelectObject(wxNullBitmap);
set_bitmap(bitmap);
m_text_action = text;
m_window->Refresh();
m_window->Update();
#ifdef __WXOSX__
// without this code splash screen wouldn't be updated under OSX
wxYield();
@@ -337,77 +340,6 @@ public:
}
}
void Decorate(wxBitmap& bmp)
{
if (!bmp.IsOk())
return;
bool is_dark = wxGetApp().app_config->get("dark_color_mode") == "1";
// use a memory DC to draw directly onto the bitmap
wxMemoryDC memDc(bmp);
int width = bmp.GetWidth();
int height = bmp.GetHeight();
// Logo
BitmapCache bmp_cache;
wxBitmap logo_bmp = *bmp_cache.load_svg(is_dark ? "splash_logo_dark" : "splash_logo", width, height); // use with full width & height
memDc.DrawBitmap(logo_bmp, 0, 0, true);
// Version
memDc.SetFont(m_constant_text.version_font);
memDc.SetTextForeground(StateColor::darkModeColorFor(wxColor(134, 134, 134)));
wxSize version_ext = memDc.GetTextExtent(m_constant_text.version);
wxRect version_rect(
wxPoint(0, int(height * 0.70)),
wxPoint(width, int(height * 0.70) + version_ext.GetHeight())
);
memDc.DrawLabel(m_constant_text.version, version_rect, wxALIGN_CENTER);
// Dynamic Text
m_action_line_y_position = int(height * 0.83);
}
static wxBitmap MakeBitmap()
{
int width = FromDIP(480, nullptr);
int height = FromDIP(480, nullptr);
wxImage image(width, height);
wxBitmap new_bmp(image);
wxMemoryDC memDC;
memDC.SelectObject(new_bmp);
memDC.SetBrush(StateColor::darkModeColorFor(*wxWHITE));
memDC.DrawRectangle(-1, -1, width + 2, height + 2);
memDC.DrawBitmap(new_bmp, 0, 0, true);
return new_bmp;
}
void set_bitmap(wxBitmap& bmp)
{
m_window->SetBitmap(bmp);
m_window->Refresh();
m_window->Update();
}
void scale_bitmap(wxBitmap& bmp, float scale)
{
if (scale == 1.0)
return;
wxImage image = bmp.ConvertToImage();
if (!image.IsOk() || image.GetWidth() == 0 || image.GetHeight() == 0)
return;
int width = int(scale * image.GetWidth());
int height = int(scale * image.GetHeight());
image.Rescale(width, height, wxIMAGE_QUALITY_BILINEAR);
bmp = wxBitmap(std::move(image));
}
void scale_font(wxFont& font, float scale)
{
#ifdef __WXMSW__
@@ -425,47 +357,16 @@ public:
#endif //__WXMSW__
}
private:
wxStaticText* m_staticText_slicer_name;
wxStaticText* m_staticText_slicer_version;
wxStaticBitmap* m_bitmap;
wxStaticText* m_staticText_loading;
wxBitmap m_logo_bmp;
wxColour m_fg_color;
wxColour m_bg_color;
wxBitmap m_main_bitmap;
wxFont m_action_font;
int m_action_line_y_position;
float m_scale {1.0};
wxString m_text_version = GUI_App::format_display_version();
wxString m_text_action = _L("Loading configuration") + dots;
struct ConstantText
{
wxString title;
wxString version;
wxString credits;
wxFont title_font;
wxFont version_font;
wxFont credits_font;
wxFont based_on_font;
void init(wxFont init_font)
{
// title
//title = wxGetApp().is_editor() ? SLIC3R_APP_FULL_NAME : GCODEVIEWER_APP_NAME;
// dynamically get the version to display
version = GUI_App::format_display_version();
// credits infornation
credits = "";
//title_font = Label::Head_16;
version_font = Label::Body_13;
based_on_font = Label::Body_8;
credits_font = Label::Body_8;
}
}
m_constant_text;
wxFont m_font_version = Label::Body_16;
wxFont m_font_action = Label::Body_16;
};
#ifdef __linux__
@@ -2844,9 +2745,6 @@ bool GUI_App::on_init_inner()
SplashScreen * scrn = nullptr;
if (app_config->get("show_splash_screen") == "true") {
// make a bitmap with dark grey banner on the left side
//BBS make BBL splash screen bitmap
wxBitmap bmp = SplashScreen::MakeBitmap();
// Detect position (display) to show the splash screen
// Now this position is equal to the mainframe position
wxPoint splashscreen_pos = wxDefaultPosition;
@@ -2858,9 +2756,9 @@ bool GUI_App::on_init_inner()
BOOST_LOG_TRIVIAL(info) << "begin to show the splash screen...";
//BBS use BBL splashScreen
scrn = new SplashScreen(bmp, wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_TIMEOUT, 1500, splashscreen_pos);
scrn = new SplashScreen(splashscreen_pos);
wxYield();
scrn->SetText(_L("Loading configuration")+ dots);
//scrn->SetText(_L("Loading configuration")+ dots);
}
BOOST_LOG_TRIVIAL(info) << "loading systen presets...";
@@ -6576,6 +6474,7 @@ void GUI_App::start_sync_user_preset(bool with_progress_dlg)
ProgressFn progressFn;
WasCancelledFn cancelFn;
std::function<void(bool)> finishFn;
auto preset_resolution_pending = std::make_shared<std::atomic_bool>(false);
BOOST_LOG_TRIVIAL(info) << "start_sync_service...";
// BBS
@@ -6591,17 +6490,23 @@ void GUI_App::start_sync_user_preset(bool with_progress_dlg)
cancelFn = [this, dlg]() {
return is_closing() || dlg->WasCanceled();
};
finishFn = [this, userid = m_agent->get_user_id(), dlg, t = std::weak_ptr<int>(m_user_sync_token)](bool ok) {
finishFn = [this, userid = m_agent->get_user_id(), dlg, t = std::weak_ptr<int>(m_user_sync_token), preset_resolution_pending](bool ok) {
if (ok)
preset_resolution_pending->store(true);
CallAfter([=]{
dlg->Destroy();
if (ok && m_agent && t.lock() == m_user_sync_token && userid == m_agent->get_user_id()) reload_settings();
preset_resolution_pending->store(false);
});
};
}
else {
finishFn = [this, userid = m_agent->get_user_id(), t = std::weak_ptr<int>(m_user_sync_token)](bool ok) {
finishFn = [this, userid = m_agent->get_user_id(), t = std::weak_ptr<int>(m_user_sync_token), preset_resolution_pending](bool ok) {
if (ok)
preset_resolution_pending->store(true);
CallAfter([=] {
if (ok && m_agent && t.lock() == m_user_sync_token && userid == m_agent->get_user_id()) reload_settings();
preset_resolution_pending->store(false);
});
};
cancelFn = [this]() {
@@ -6609,6 +6514,138 @@ void GUI_App::start_sync_user_preset(bool with_progress_dlg)
};
}
struct CloudPresetChange
{
std::string type;
std::string name;
std::string setting_id;
long long update_time {0};
bool deleted {false};
};
auto make_setting_check_fn = [this](bool *need_reload = nullptr, std::vector<CloudPresetChange> *incoming_changes = nullptr) -> CheckFn {
return [this, need_reload, incoming_changes](std::map<std::string, std::string> info) {
auto value_or_empty = [&info](const std::string &key) -> std::string {
auto it = info.find(key);
return it == info.end() ? std::string() : it->second;
};
if (info.find("deleted") != info.end()) {
if (need_reload)
*need_reload = true;
if (incoming_changes) {
CloudPresetChange change;
change.setting_id = value_or_empty(BBL_JSON_KEY_SETTING_ID);
change.deleted = true;
incoming_changes->push_back(std::move(change));
}
return true;
}
auto type = value_or_empty(BBL_JSON_KEY_TYPE);
auto name = value_or_empty(BBL_JSON_KEY_NAME);
auto setting_id = value_or_empty(BBL_JSON_KEY_SETTING_ID);
auto update_time_str = value_or_empty(ORCA_JSON_KEY_UPDATE_TIME);
long long update_time = 0;
if (!update_time_str.empty())
update_time = std::atoll(update_time_str.c_str());
bool need_sync = true;
if (preset_bundle && type == "filament") {
need_sync = preset_bundle->filaments.need_sync(name, setting_id, update_time);
} else if (preset_bundle && type == "print") {
need_sync = preset_bundle->prints.need_sync(name, setting_id, update_time);
} else if (preset_bundle && type == "printer") {
need_sync = preset_bundle->printers.need_sync(name, setting_id, update_time);
}
if (need_sync) {
if (need_reload)
*need_reload = true;
if (incoming_changes)
incoming_changes->push_back({ type, name, setting_id, update_time, false });
}
return need_sync;
};
};
auto has_local_preset_changes = [this]() -> bool {
if (!preset_bundle)
return false;
auto collection_has_changes = [this](PresetCollection &presets) {
if (presets.get_edited_preset().is_user() && presets.current_is_dirty())
return true;
std::vector<Preset> presets_to_sync;
return presets.get_user_presets(preset_bundle, presets_to_sync) > 0;
};
return collection_has_changes(preset_bundle->prints) ||
collection_has_changes(preset_bundle->filaments) ||
collection_has_changes(preset_bundle->printers);
};
auto save_dirty_user_preset_for_sync = [this](PresetCollection &presets) {
if (!preset_bundle || !presets.get_edited_preset().is_user() || !presets.current_is_dirty())
return;
const std::string name = presets.get_edited_preset().name;
presets.save_current_preset(name, false, false, nullptr);
if (Preset *preset = presets.find_preset(name, false, true)) {
preset->sync_info = preset->setting_id.empty() ? "create" : "update";
if (m_agent)
preset->user_id = m_agent->get_user_id();
preset->save_info();
}
};
auto keep_deleted_cloud_preset_local = [this](PresetCollection &presets, const std::string &setting_id) -> bool {
if (setting_id.empty())
return false;
bool found = false;
presets.lock();
for (Preset &preset : presets) {
if (preset.is_user() && preset.setting_id == setting_id) {
preset.setting_id.clear();
preset.sync_info = "create";
if (m_agent)
preset.user_id = m_agent->get_user_id();
preset.save_info();
found = true;
break;
}
}
presets.unlock();
return found;
};
auto keep_cloud_changes_local = [this, save_dirty_user_preset_for_sync, keep_deleted_cloud_preset_local](const std::vector<CloudPresetChange> &incoming_changes) {
if (!preset_bundle)
return;
save_dirty_user_preset_for_sync(preset_bundle->prints);
save_dirty_user_preset_for_sync(preset_bundle->filaments);
save_dirty_user_preset_for_sync(preset_bundle->printers);
for (const CloudPresetChange &change : incoming_changes) {
if (change.deleted) {
if (!keep_deleted_cloud_preset_local(preset_bundle->prints, change.setting_id) &&
!keep_deleted_cloud_preset_local(preset_bundle->filaments, change.setting_id))
keep_deleted_cloud_preset_local(preset_bundle->printers, change.setting_id);
continue;
}
if (change.type == "filament")
preset_bundle->filaments.set_sync_info_and_save(change.name, change.setting_id, "update", change.update_time);
else if (change.type == "print")
preset_bundle->prints.set_sync_info_and_save(change.name, change.setting_id, "update", change.update_time);
else if (change.type == "printer")
preset_bundle->printers.set_sync_info_and_save(change.name, change.setting_id, "update", change.update_time);
}
};
// Do a one-time scan for files that may be pending deletion (e.g., was deleted while not connected to internet)
// Scan for orphaned .info files on startup and add them to deletion queue
scan_orphaned_info_files();
@@ -6617,7 +6654,7 @@ void GUI_App::start_sync_user_preset(bool with_progress_dlg)
Bind(EVT_UPDATE_PRESET_BUNDLE,&GUI_App::update_single_bundle,this);
m_sync_update_thread = Slic3r::create_thread(
[this, progressFn, cancelFn, finishFn, t = std::weak_ptr<int>(m_user_sync_token)] {
[this, progressFn, cancelFn, finishFn, make_setting_check_fn, has_local_preset_changes, keep_cloud_changes_local, preset_resolution_pending, t = std::weak_ptr<int>(m_user_sync_token)] {
// get setting list, update setting list
std::string version = preset_bundle->get_vendor_profile_version(PresetBundle::ORCA_DEFAULT_BUNDLE).to_string();
if(!m_agent) return;
@@ -6626,24 +6663,7 @@ void GUI_App::start_sync_user_preset(bool with_progress_dlg)
// So that we can sync presets that are migrated from old version or users manually put preset files in preset folder
preset_bundle->check_and_fix_user_presets_syncinfo(m_agent->get_user_id());
int ret = m_agent->get_setting_list2(version, [this](auto info) {
auto type = info[BBL_JSON_KEY_TYPE];
auto name = info[BBL_JSON_KEY_NAME];
auto setting_id = info[BBL_JSON_KEY_SETTING_ID];
auto update_time_str = info[ORCA_JSON_KEY_UPDATE_TIME];
long long update_time = 0;
if (!update_time_str.empty())
update_time = std::atoll(update_time_str.c_str());
if (type == "filament") {
return preset_bundle->filaments.need_sync(name, setting_id, update_time);
} else if (type == "print") {
return preset_bundle->prints.need_sync(name, setting_id, update_time);
} else if (type == "printer") {
return preset_bundle->printers.need_sync(name, setting_id, update_time);
} else {
return true;
}
}, progressFn, cancelFn);
int ret = m_agent->get_setting_list2(version, make_setting_check_fn(), progressFn, cancelFn);
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << __LINE__ << " get_setting_list2 ret = " << ret << " m_is_closing = " << m_is_closing;
finishFn(ret == 0);
@@ -6666,42 +6686,89 @@ void GUI_App::start_sync_user_preset(bool with_progress_dlg)
//sync preset
if (!preset_bundle) continue;
int total_count = 0;
sync_count = preset_bundle->prints.get_user_presets(preset_bundle, presets_to_sync);
if (sync_count > 0) {
for (Preset& preset : presets_to_sync) {
sync_preset(&preset);
boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
bool cloud_presets_need_reload = false;
std::vector<CloudPresetChange> incoming_changes;
int pull_ret = m_agent->get_setting_list2(
version,
make_setting_check_fn(&cloud_presets_need_reload, &incoming_changes),
nullptr,
[this]() { return is_closing(); });
BOOST_LOG_TRIVIAL(info) << "start_sync_user_preset: periodic get_setting_list2 ret = " << pull_ret
<< ", cloud_presets_need_reload = " << cloud_presets_need_reload;
bool skip_user_preset_upload = preset_resolution_pending->load();
if (pull_ret == 0 && cloud_presets_need_reload) {
skip_user_preset_upload = true;
if (!preset_resolution_pending->exchange(true)) {
CallAfter([this, incoming_changes, has_local_preset_changes, keep_cloud_changes_local, preset_resolution_pending, t] {
if (is_closing() || !m_agent || t.expired() || t.lock() != m_user_sync_token) {
preset_resolution_pending->store(false);
return;
}
if (!has_local_preset_changes()) {
BOOST_LOG_TRIVIAL(info) << "start_sync_user_preset: applying incoming cloud preset changes";
reload_settings();
preset_resolution_pending->store(false);
return;
}
MessageDialog dlg(mainframe,
_L("Cloud presets were updated while you have local preset changes.\n\nChoose which version to keep. This decision is final."),
_L("Preset sync conflict"),
wxYES_NO | wxYES_DEFAULT | wxICON_WARNING);
dlg.SetButtonLabel(wxID_YES, _L("Use incoming"));
dlg.SetButtonLabel(wxID_NO, _L("Keep local"));
int answer = dlg.ShowModal();
if (answer == wxID_YES) {
BOOST_LOG_TRIVIAL(info) << "start_sync_user_preset: user chose incoming cloud presets";
reload_settings();
} else {
BOOST_LOG_TRIVIAL(info) << "start_sync_user_preset: user chose local presets";
keep_cloud_changes_local(incoming_changes);
}
preset_resolution_pending->store(false);
});
}
}
total_count += sync_count;
sync_count = preset_bundle->filaments.get_user_presets(preset_bundle, presets_to_sync);
if (sync_count > 0) {
for (Preset& preset : presets_to_sync) {
sync_preset(&preset);
boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
if (!skip_user_preset_upload) {
int total_count = 0;
sync_count = preset_bundle->prints.get_user_presets(preset_bundle, presets_to_sync);
if (sync_count > 0) {
for (Preset& preset : presets_to_sync) {
sync_preset(&preset);
boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
}
}
}
total_count += sync_count;
total_count += sync_count;
sync_count = preset_bundle->printers.get_user_presets(preset_bundle, presets_to_sync);
if (sync_count > 0) {
for (Preset& preset : presets_to_sync) {
sync_preset(&preset);
boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
sync_count = preset_bundle->filaments.get_user_presets(preset_bundle, presets_to_sync);
if (sync_count > 0) {
for (Preset& preset : presets_to_sync) {
sync_preset(&preset);
boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
}
}
}
total_count += sync_count;
total_count += sync_count;
if (total_count == 0) {
CallAfter([this] {
if (!is_closing())
plater()->get_notification_manager()->close_notification_of_type(NotificationType::BBLUserPresetExceedLimit);
});
}
sync_count = preset_bundle->printers.get_user_presets(preset_bundle, presets_to_sync);
if (sync_count > 0) {
for (Preset& preset : presets_to_sync) {
sync_preset(&preset);
boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
}
}
total_count += sync_count;
process_delete_presets();
if (total_count == 0) {
CallAfter([this] {
if (!is_closing())
plater()->get_notification_manager()->close_notification_of_type(NotificationType::BBLUserPresetExceedLimit);
});
}
process_delete_presets();
}
}
// sync subscribed bundles, if orca

View File

@@ -13,6 +13,10 @@
#include <wx/msw/registry.h>
#endif // _WIN32
#ifdef __WXGTK__
#include <gtk/gtk.h>
#endif
#include <wx/toplevel.h>
#include <wx/sizer.h>
#include <wx/checkbox.h>
@@ -496,6 +500,60 @@ void fit_in_display(wxTopLevelWindow& window, wxSize desired_size)
window.SetSize(desired_size);
}
#ifdef __WXGTK__
void RemoveButtonBorder(wxWindow* win)
{
GtkWidget* widget = win->GetHandle();
if (!widget) return;
#if GTK_CHECK_VERSION(3, 0, 0)
// GTK3+: use CSS provider
GtkCssProvider* provider = gtk_css_provider_new();
const char* css =
"button {"
" border: none;"
" outline: none;"
" box-shadow: none;"
" padding: 0px;"
" margin: 0px;"
" min-height: 0px;"
" min-width: 0px;"
" background: none;"
"}";
#if GTK_CHECK_VERSION(4, 0, 0)
// GTK4: no GError argument
gtk_css_provider_load_from_data(provider, css, -1);
#else
// GTK3: has GError argument
gtk_css_provider_load_from_data(provider, css, -1, nullptr);
#endif
GtkStyleContext* ctx = gtk_widget_get_style_context(widget);
gtk_style_context_add_provider(
ctx,
GTK_STYLE_PROVIDER(provider),
GTK_STYLE_PROVIDER_PRIORITY_USER
);
g_object_unref(provider);
#else
// GTK2: use rc string, no CSS
gtk_rc_parse_string(
"style \"no-border\" {"
" GtkButton::inner-border = { 0, 0, 0, 0 }"
" GtkWidget::focus-line-width = 0"
" GtkWidget::focus-padding = 0"
" xthickness = 0"
" ythickness = 0"
"}"
"widget \"*.GtkBitmapToggleButton\" style \"no-border\""
);
#endif
}
#endif // __WXGTK__
#ifdef __linux__
// Detect if the application is running inside a debugger.
// https://stackoverflow.com/a/69842462/3289421

View File

@@ -461,6 +461,10 @@ void dataview_remove_insets(wxDataViewCtrl* dv);
void staticbox_remove_margin(wxStaticBox* sb);
#endif
#ifdef __WXGTK3__
void RemoveButtonBorder(wxWindow* win);
#endif
#if defined(__WXOSX__) || defined(__linux__)
bool is_debugger_present();
#endif

View File

@@ -191,6 +191,12 @@ void GLGizmoFdmSupports::on_render_input_window(float x, float y, float bottom_l
if (! m_c->selection_info()->model_object())
return;
float scale = m_parent.get_scale();
#ifdef WIN32
int dpi = get_dpi_for_window(wxGetApp().GetTopWindow());
scale *= (float) dpi / (float) DPI_DEFAULT;
#endif // WIN32
// BBS
wchar_t old_tool = m_current_tool;
@@ -258,30 +264,24 @@ void GLGizmoFdmSupports::on_render_input_window(float x, float y, float bottom_l
std::array<wxString, 4> tool_tips = { _L("Circle"), _L("Sphere"), _L("Fill"), _L("Gap Fill") };
for (int i = 0; i < tool_ids.size(); i++) {
std::string str_label = std::string("##");
std::wstring btn_name = icons[i] + boost::nowide::widen(str_label);
//std::string str_label = std::string("##");
//std::wstring btn_name = icons[i] + boost::nowide::widen(str_label);
if (i != 0) ImGui::SameLine((empty_button_width + m_imgui->scaled(1.75f)) * i + m_imgui->scaled(1.3f));
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0);
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.f, 0.f, 0.f, 0.f)); // ORCA Removes button background on dark mode
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f)); // ORCA: Fixes icon rendered without colors while using Light theme
if (m_current_tool == tool_ids[i]) {
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.f, 0.59f, 0.53f, 0.25f)); // ORCA use orca color for selected tool / brush
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.f, 0.59f, 0.53f, 0.25f)); // ORCA use orca color for selected tool / brush
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(0.f, 0.59f, 0.53f, 0.30f)); // ORCA use orca color for selected tool / brush
ImGui::PushStyleColor(ImGuiCol_Border, ImGuiWrapper::COL_ORCA); // ORCA use orca color for border on selected tool / brush
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 1.0);
}
bool btn_clicked = ImGui::Button(into_u8(btn_name).c_str());
if (m_current_tool == tool_ids[i])
{
ImGui::PopStyleColor(4);
ImGui::PopStyleVar(2);
}
ImGui::PopStyleColor(2);
ImGui::PopStyleVar(1);
bool is_active = m_current_tool == tool_ids[i];
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.f);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding , 3.f * scale);
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding , ImVec2(4.f * scale, 4.f * scale));
ImGui::PushStyleColor(ImGuiCol_Text , ImVec4(1,1,1,1)); // ORCA Fixes icon rendered without colors while using Light theme
ImGui::PushStyleColor(ImGuiCol_Button , is_active ? ImVec4(0.f, .59f, .53f, .25f) : ImVec4(0,0,0,0)); // ORCA
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, is_active ? ImVec4(0.f, .59f, .53f, .25f) : ImVec4(.6f,.6f,.6f,.2f)); // ORCA
ImGui::PushStyleColor(ImGuiCol_ButtonActive , is_active ? ImVec4(0.f, .59f, .53f, .30f) : ImVec4(0,0,0,0)); // ORCA
ImGui::PushStyleColor(ImGuiCol_Border , is_active ? ImGuiWrapper::COL_ORCA : ImVec4(0,0,0,0)); // ORCA
ImGui::PushStyleColor(ImGuiCol_BorderActive , is_active ? ImGuiWrapper::COL_ORCA : ImVec4(0,0,0,0)); // ORCA matched color for fixing flicker on click
bool btn_clicked = m_imgui->glyph_button(icons[i], ImVec2(16.f * scale, 16.f * scale)); // ORCA glyph_button for fixing unequal paddings
ImGui::PopStyleColor(6);
ImGui::PopStyleVar(3);
if (btn_clicked && m_current_tool != tool_ids[i]) {
m_current_tool = tool_ids[i];

View File

@@ -117,6 +117,12 @@ void GLGizmoFuzzySkin::on_render_input_window(float x, float y, float bottom_lim
if (!mo)
return;
float scale = m_parent.get_scale();
#ifdef WIN32
int dpi = get_dpi_for_window(wxGetApp().GetTopWindow());
scale *= (float) dpi / (float) DPI_DEFAULT;
#endif // WIN32
const DynamicPrintConfig &obj_cfg = mo->config.get();
const float approx_height = m_imgui->scaled(22.f);
@@ -192,29 +198,24 @@ void GLGizmoFuzzySkin::on_render_input_window(float x, float y, float bottom_lim
icons = { ImGui::CircleButtonIcon, ImGui::SphereButtonIcon, ImGui::TriangleButtonIcon, ImGui::FillButtonIcon };
std::array<wxString, 4> tool_tips = { _L("Circle"), _L("Sphere"), _L("Triangle"), _L("Fill") };
for (int i = 0; i < tool_ids.size(); i++) {
std::string str_label = std::string("");
std::wstring btn_name = icons[i] + boost::nowide::widen(str_label);
//std::string str_label = std::string("");
//std::wstring btn_name = icons[i] + boost::nowide::widen(str_label);
if (i != 0) ImGui::SameLine((empty_button_width + m_imgui->scaled(1.75f)) * i + m_imgui->scaled(1.5f));
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0);
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.f, 0.f, 0.f, 0.f)); // ORCA Removes button background on dark mode
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f)); // ORCA Fixes icon rendered without colors while using Light theme
if (m_current_tool == tool_ids[i]) {
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.f, 0.59f, 0.53f, 0.25f)); // ORCA use orca color for selected tool / brush
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.f, 0.59f, 0.53f, 0.25f)); // ORCA use orca color for selected tool / brush
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(0.f, 0.59f, 0.53f, 0.30f)); // ORCA use orca color for selected tool / brush
ImGui::PushStyleColor(ImGuiCol_Border, ImGuiWrapper::COL_ORCA); // ORCA use orca color for border on selected tool / brush
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 1.0);
}
bool btn_clicked = ImGui::Button(into_u8(btn_name).c_str());
if (m_current_tool == tool_ids[i])
{
ImGui::PopStyleColor(4);
ImGui::PopStyleVar(2);
}
ImGui::PopStyleColor(2);
ImGui::PopStyleVar(1);
bool is_active = m_current_tool == tool_ids[i];
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.f);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding , 3.f * scale);
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding , ImVec2(4.f * scale, 4.f * scale));
ImGui::PushStyleColor(ImGuiCol_Text , ImVec4(1,1,1,1)); // ORCA Fixes icon rendered without colors while using Light theme
ImGui::PushStyleColor(ImGuiCol_Button , is_active ? ImVec4(0.f, .59f, .53f, .25f) : ImVec4(0,0,0,0)); // ORCA
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, is_active ? ImVec4(0.f, .59f, .53f, .25f) : ImVec4(.6f,.6f,.6f,.2f)); // ORCA
ImGui::PushStyleColor(ImGuiCol_ButtonActive , is_active ? ImVec4(0.f, .59f, .53f, .30f) : ImVec4(0,0,0,0)); // ORCA
ImGui::PushStyleColor(ImGuiCol_Border , is_active ? ImGuiWrapper::COL_ORCA : ImVec4(0,0,0,0)); // ORCA
ImGui::PushStyleColor(ImGuiCol_BorderActive , is_active ? ImGuiWrapper::COL_ORCA : ImVec4(0,0,0,0)); // ORCA matched color for fixing flicker on click
bool btn_clicked = m_imgui->glyph_button(icons[i], ImVec2(16.f * scale, 16.f * scale)); // ORCA glyph_button for fixing unequal paddings
ImGui::PopStyleColor(6);
ImGui::PopStyleVar(3);
if (btn_clicked && m_current_tool != tool_ids[i]) {
m_current_tool = tool_ids[i];

View File

@@ -115,9 +115,9 @@ bool GLGizmoMmuSegmentation::on_init()
m_desc["smart_fill_angle"] = _L("Smart fill angle");
m_desc["height_range"] = _L("Height range");
m_desc["toggle_wireframe"] = _L("Toggle Wireframe");
m_desc["perform_remap"] = _L("Remap filaments");
m_desc["perform_remap"] = _u8L("Remap filaments");
m_desc["remap"] = _L("Remap");
m_desc["cancel_remap"] = _L("Cancel");
m_desc["remap_reset"] = _L("Reset");
std::pair<wxString, wxString> paint_shortcut = {_L("Left mouse button"), m_desc["paint"]};
std::pair<wxString, wxString> erase_shortcut = {shift + _L("Left mouse button"), m_desc["erase"]};
@@ -304,10 +304,56 @@ void GLGizmoMmuSegmentation::render_tooltip_button(float x, float y)
GLGizmoUtils::render_tooltip_button(m_imgui, m_parent, get_shortcuts(), x, y);
}
// ORCA
bool GLGizmoMmuSegmentation::draw_color_button(int idx, std::string id_str, const ColorRGBA& color, ColorRGBA& map_color, bool active, float scale)
{
ImDrawList* draw_list = ImGui::GetWindowDrawList();
std::string label_id = std::to_string(idx) + id_str + std::to_string(idx);
ImVec2 pos = ImGui::GetCursorScreenPos();
ImVec2 size = ImVec2(27.f * scale, 27.f * scale);
ImVec4 color_vec = ImGuiWrapper::to_ImVec4(color);
ImU32 br_color = ImGui::ColorConvertFloat4ToU32(active ? ImGuiWrapper::COL_ORCA : m_is_dark_mode ? ImVec4(.35f, .35f, .35f, 1) : ImVec4(.85f, .85f, .85f, 1));
bool dark_tone = (0.299f * color.r() + 0.587f * color.g() + 0.114f * color.b()) < 0.51f; // matching values used by wxWidgets with clr.GetLuminance() < 0.51
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding , 7.f * scale);
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding , ImVec2(0, 0));
ImGui::PushStyleColor(ImGuiCol_Text , dark_tone ? ImVec4(1,1,1,1) : ImVec4(0,0,0,1));
ImGui::PushStyleColor(ImGuiCol_Button , color_vec);
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, color_vec);
ImGui::PushStyleColor(ImGuiCol_ButtonActive , color_vec);
bool clicked = ImGui::Button(label_id.c_str(), size);
ImGui::PopStyleVar(3);
ImGui::PopStyleColor(4);
auto drawBorder = [&](float d, float r, float t, ImU32 col) {
draw_list->AddRect({pos.x + d * scale, pos.y + d * scale}, {pos.x + size.x - d * scale , pos.y + size.y - d * scale}, col, r * scale, 0, t * scale);
};
drawBorder(1.5f, 3.f, 4.f, ImGui::ColorConvertFloat4ToU32(ImGui::GetStyleColorVec4(ImGuiCol_WindowBg)));
if(active)
drawBorder(.5f, 4.f , 2.f, br_color);
else
drawBorder(3.f, 2.5f, 1.f, br_color);
if (color != map_color){ // show mapped color as bubble if mapped
ImVec2 center = {pos.x + size.x - 3.f * scale, pos.y + 3.f * scale};
draw_list->AddCircleFilled(center, 6.f * scale, br_color, 16); // outer border for better visibility
draw_list->AddCircleFilled(center, 5.f * scale, ImGuiWrapper::to_ImU32(map_color), 16);
}
return clicked;
};
void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bottom_limit)
{
if (!m_c->selection_info()->model_object()) return;
float scale = m_parent.get_scale();
#ifdef WIN32
int dpi = get_dpi_for_window(wxGetApp().GetTopWindow());
scale *= (float) dpi / (float) DPI_DEFAULT;
#endif // WIN32
const float approx_height = m_imgui->scaled(22.0f);
y = std::min(y, bottom_limit - approx_height);
GizmoImguiSetNextWIndowPos(x, y, ImGuiCond_Always);
@@ -363,69 +409,67 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott
const float drag_left_width = ImGui::GetStyle().WindowPadding.x + sliders_width - space_size;
const float max_tooltip_width = ImGui::GetFontSize() * 20.0f;
ImDrawList * draw_list = ImGui::GetWindowDrawList();
ImVec2 pos = ImGui::GetCursorScreenPos();
static float color_button_high = 25.0;
draw_list->AddRectFilled({pos.x - 10.0f, pos.y - 7.0f}, {pos.x + window_width + ImGui::GetFrameHeight(), pos.y + color_button_high}, ImGui::GetColorU32(ImGuiCol_FrameBgActive, 1.0f), 5.0f);
float color_button = ImGui::GetCursorPos().y;
m_imgui->text(m_desc.at("filaments"));
float start_pos_x = ImGui::GetCursorPos().x;
const ImVec2 max_label_size = ImGui::CalcTextSize("99", NULL, true);
const float item_spacing = m_imgui->scaled(0.8f);
size_t n_extruder_colors = std::min((size_t)EnforcerBlockerType::ExtruderMax, m_extruders_colors.size());
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(7.f * scale, 7.f * scale));
ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, 0); // removes extra space on tree node indentation
for (int extruder_idx = 0; extruder_idx < n_extruder_colors; extruder_idx++) {
const ColorRGBA &extruder_color = m_extruders_colors[extruder_idx];
ImVec4 color_vec = ImGuiWrapper::to_ImVec4(extruder_color);
std::string color_label = std::string("##extruder color ") + std::to_string(extruder_idx);
std::string item_text = std::to_string(extruder_idx + 1);
const ImVec2 label_size = ImGui::CalcTextSize(item_text.c_str(), NULL, true);
const ImVec2 button_size(max_label_size.x + m_imgui->scaled(0.5f),0.f);
if (extruder_idx % max_filament_items_per_line != 0)
ImGui::SameLine();
float button_offset = start_pos_x;
if (extruder_idx % max_filament_items_per_line != 0) {
button_offset += filament_item_width * (extruder_idx % max_filament_items_per_line);
ImGui::SameLine(button_offset);
if (draw_color_button(
extruder_idx + 1, // idx
"###extruder_color_", // button_id
m_extruders_colors[extruder_idx], // color
m_extruders_colors[extruder_idx], // mapped_color (not used in here)
m_selected_extruder_idx == extruder_idx, // is_active
scale
)){
m_selected_extruder_idx = extruder_idx;
}
// draw filament background
ImGuiColorEditFlags flags = ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_NoTooltip;
if (m_selected_extruder_idx != extruder_idx) flags |= ImGuiColorEditFlags_NoBorder;
#ifdef __APPLE__
ImGui::PushStyleColor(ImGuiCol_FrameBg, ImGuiWrapper::COL_ORCA); // ORCA use orca color for selected filament border
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0);
bool color_picked = ImGui::ColorButton(color_label.c_str(), color_vec, flags, button_size);
ImGui::PopStyleVar(2);
ImGui::PopStyleColor(1);
#else
ImGui::PushStyleColor(ImGuiCol_FrameBg, ImGuiWrapper::COL_ORCA); // ORCA use orca color for selected filament border
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 2.0);
bool color_picked = ImGui::ColorButton(color_label.c_str(), color_vec, flags, button_size);
ImGui::PopStyleVar(2);
ImGui::PopStyleColor(1);
#endif
color_button_high = ImGui::GetCursorPos().y - color_button - 2.0;
if (color_picked) { m_selected_extruder_idx = extruder_idx; }
if (extruder_idx < 16 && ImGui::IsItemHovered()) m_imgui->tooltip(_L("Shortcut Key ") + std::to_string(extruder_idx + 1), max_tooltip_width);
// draw filament id
float gray = 0.299 * extruder_color.r() + 0.587 * extruder_color.g() + 0.114 * extruder_color.b();
ImGui::SameLine(button_offset + (button_size.x - label_size.x) / 2.f);
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, {10.0,15.0});
if (gray * 255.f < 80.f)
ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 1.0f), "%s", item_text.c_str());
else
ImGui::TextColored(ImVec4(0.0f, 0.0f, 0.0f, 1.0f), "%s", item_text.c_str());
ImGui::PopStyleVar();
}
//ImGui::NewLine();
// ORCA: Remap filaments section (Border only, Title in border).
// Styled as a panel for visual grouping.
if (ImGui::TreeNodeEx(m_desc.at("perform_remap").c_str(), ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_FramePadding)){
render_filament_remap_ui(window_width, max_tooltip_width, scale);
bool has_mapping = false;
for (size_t i = 0; i < m_extruder_remap.size(); ++i){
if(m_extruder_remap[i] != i){
has_mapping = true;
break;
}
}
ImGui::Dummy(ImVec2(0,0));
// ORCA: Add Remap and Cancel buttons (outside the panel)
m_imgui->disabled_begin(!has_mapping); // disable when no mapping
if (m_imgui->button(m_desc.at("remap"))) {
this->remap_filament_assignments();
// Reset mapping to identity after apply
for (size_t i = 0; i < m_extruder_remap.size(); ++i) m_extruder_remap[i] = i;
}
m_imgui->disabled_end(/*m_is_unknown_font*/);
if (has_mapping){ // show only when it has mapping
ImGui::SameLine();
if (m_imgui->button(m_desc.at("remap_reset"))) {
// Reset mapping to identity
for (size_t i = 0; i < m_extruder_remap.size(); ++i) m_extruder_remap[i] = i;
}
}
//ImGui::Dummy(ImVec2(0.0f, 3.f * scale));
ImGui::TreePop();
}
ImGui::PopStyleVar(2); // IndentSpacing ItemSpacing
ImGui::Dummy(ImVec2(0.0f, ImGui::GetFontSize() * 0.1));
m_imgui->text(m_desc.at("tool_type"));
@@ -439,29 +483,24 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott
icons = { ImGui::CircleButtonIcon, ImGui::SphereButtonIcon, ImGui::TriangleButtonIcon, ImGui::HeightRangeIcon, ImGui::FillButtonIcon, ImGui::GapFillIcon };
std::array<wxString, 6> tool_tips = { _L("Circle"), _L("Sphere"), _L("Triangle"), _L("Height Range"), _L("Fill"), _L("Gap Fill") };
for (int i = 0; i < tool_ids.size(); i++) {
std::string str_label = std::string("");
std::wstring btn_name = icons[i] + boost::nowide::widen(str_label);
//std::string str_label = std::string("");
//std::wstring btn_name = icons[i] + boost::nowide::widen(str_label);
if (i != 0) ImGui::SameLine((empty_button_width + m_imgui->scaled(1.75f)) * i + m_imgui->scaled(1.5f));
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0);
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.f, 0.f, 0.f, 0.f)); // ORCA Removes button background on dark mode
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f)); // ORCA Fixes icon rendered without colors while using Light theme
if (m_current_tool == tool_ids[i]) {
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.f, 0.59f, 0.53f, 0.25f)); // ORCA use orca color for selected tool / brush
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.f, 0.59f, 0.53f, 0.25f)); // ORCA use orca color for selected tool / brush
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(0.f, 0.59f, 0.53f, 0.30f)); // ORCA use orca color for selected tool / brush
ImGui::PushStyleColor(ImGuiCol_Border, ImGuiWrapper::COL_ORCA); // ORCA use orca color for border on selected tool / brush
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 1.0);
}
bool btn_clicked = ImGui::Button(into_u8(btn_name).c_str());
if (m_current_tool == tool_ids[i])
{
ImGui::PopStyleColor(4);
ImGui::PopStyleVar(2);
}
ImGui::PopStyleColor(2);
ImGui::PopStyleVar(1);
bool is_active = m_current_tool == tool_ids[i];
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.f);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding , 3.f * scale);
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding , ImVec2(4.f * scale, 4.f * scale));
ImGui::PushStyleColor(ImGuiCol_Text , ImVec4(1,1,1,1)); // ORCA Fixes icon rendered without colors while using Light theme
ImGui::PushStyleColor(ImGuiCol_Button , is_active ? ImVec4(0.f, .59f, .53f, .25f) : ImVec4(0,0,0,0)); // ORCA
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, is_active ? ImVec4(0.f, .59f, .53f, .25f) : ImVec4(.6f,.6f,.6f,.2f)); // ORCA
ImGui::PushStyleColor(ImGuiCol_ButtonActive , is_active ? ImVec4(0.f, .59f, .53f, .30f) : ImVec4(0,0,0,0)); // ORCA
ImGui::PushStyleColor(ImGuiCol_Border , is_active ? ImGuiWrapper::COL_ORCA : ImVec4(0,0,0,0)); // ORCA
ImGui::PushStyleColor(ImGuiCol_BorderActive , is_active ? ImGuiWrapper::COL_ORCA : ImVec4(0,0,0,0)); // ORCA matched color for fixing flicker on click
bool btn_clicked = m_imgui->glyph_button(icons[i], ImVec2(16.f * scale, 16.f * scale)); // ORCA glyph_button for fixing unequal paddings
ImGui::PopStyleColor(6);
ImGui::PopStyleVar(3);
if (btn_clicked && m_current_tool != tool_ids[i]) {
m_current_tool = tool_ids[i];
@@ -598,60 +637,6 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott
m_c->object_clipper()->set_position_by_ratio(clp_dist, true);
}
ImGui::Separator();
// ORCA: Remap filaments section (Border only, Title in border).
// Styled as a panel for visual grouping.
if (m_imgui->button(m_desc.at("perform_remap"))) {
m_show_remap_panel = !m_show_remap_panel;
}
if (m_show_remap_panel)
{
ImGui::Spacing();
ImDrawList* draw_list = ImGui::GetWindowDrawList();
std::string title = into_u8(m_desc.at("perform_remap"));
float available_width = ImGui::GetContentRegionAvail().x;
// ORCA: Draw Background filled (consistent with Filaments section)
// Use static to remember height from previous frame so we can draw it behind.
static float remap_panel_high = 40.0f;
ImVec2 p_bg_min = ImGui::GetCursorScreenPos();
// Adjust background position: slight negative offset to align with padding, width fills available
// height from static variable.
draw_list->AddRectFilled({p_bg_min.x - 10.0f, p_bg_min.y - 7.0f}, {p_bg_min.x + available_width + ImGui::GetFrameHeight(), p_bg_min.y + remap_panel_high}, ImGui::GetColorU32(ImGuiCol_FrameBgActive, 1.0f), 5.0f);
float start_y = ImGui::GetCursorPos().y;
// ORCA: Title as simple text - Removed as per request (redundant with button)
// m_imgui->text(title);
ImGui::BeginGroup();
// ORCA: Reduce vertical spacing within this group
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(m_imgui->scaled(0.4f), m_imgui->scaled(0.2f)));
render_filament_remap_ui(window_width, max_tooltip_width);
ImGui::PopStyleVar();
ImGui::EndGroup();
// ORCA: Update height for next frame fill
remap_panel_high = ImGui::GetCursorPos().y - start_y;
// ORCA: Add Remap and Cancel buttons (outside the panel)
ImGui::Spacing();
if (m_imgui->button(m_desc.at("remap"))) {
this->remap_filament_assignments();
// Reset mapping to identity after apply
for (size_t i = 0; i < m_extruder_remap.size(); ++i) m_extruder_remap[i] = i;
}
ImGui::SameLine();
if (m_imgui->button(m_desc.at("cancel_remap"))) {
// Reset mapping to identity
for (size_t i = 0; i < m_extruder_remap.size(); ++i) m_extruder_remap[i] = i;
}
}
ImGui::Separator();
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(6.0f, 10.0f));
@@ -1000,180 +985,85 @@ void GLGizmoMmuSegmentation::update_used_filaments()
}
}
void GLGizmoMmuSegmentation::render_filament_remap_ui(float window_width, float max_tooltip_width)
void GLGizmoMmuSegmentation::render_filament_remap_ui(float window_width, float max_tooltip_width, float scale)
{
size_t n_extr = std::min((size_t)EnforcerBlockerType::ExtruderMax, m_extruders_colors.size());
const ImVec2 max_label_size = ImGui::CalcTextSize("99", NULL, true);
const ImVec2 button_size(max_label_size.x + m_imgui->scaled(0.5f), 0.f);
int displayed_count = 0;
const int max_per_line = 8;
// ORCA: Use m_used_filaments to show only relevant source filaments
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(7.f * scale, 7.f * scale));
for (size_t src : m_used_filaments) {
if (src >= n_extr) continue;
const ColorRGBA &src_col = m_extruders_colors[src]; // keep for text contrast
const ColorRGBA &dst_col = m_extruders_colors[m_extruder_remap[src]];
// ORCA: Button now shows the SOURCE color (per maintainer request)
// This keeps the UI stable until "Remap" is clicked.
ImVec4 col_vec = ImGuiWrapper::to_ImVec4(src_col);
if (displayed_count > 0 && (displayed_count % max_per_line != 0))
ImGui::SameLine();
std::string btn_id = "##remap_src_" + std::to_string(src);
std::string pop_id = "popup_" + std::to_string(src);
ImGuiColorEditFlags flags = ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoInputs |
ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_NoPicker |
ImGuiColorEditFlags_NoTooltip;
// ORCA: Show border ONLY if the popup is open (visual feedback for active selection)
// Decoupled from m_selected_extruder_idx to prevent unwanted selection highlights.
if (!ImGui::IsPopupOpen(pop_id.c_str()))
flags |= ImGuiColorEditFlags_NoBorder;
#ifdef __APPLE__
ImGui::PushStyleColor(ImGuiCol_FrameBg, ImGuiWrapper::COL_ORCA);
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0);
bool clicked = ImGui::ColorButton(btn_id.c_str(), col_vec, flags, button_size);
ImGui::PopStyleVar(2);
ImGui::PopStyleColor(1);
#else
ImGui::PushStyleColor(ImGuiCol_FrameBg, ImGuiWrapper::COL_ORCA);
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 2.0);
bool clicked = ImGui::ColorButton(btn_id.c_str(), col_vec, flags, button_size);
ImGui::PopStyleVar(2);
ImGui::PopStyleColor(1);
#endif
// overlay destination number with proper contrast calculation
// ORCA: Text still shows DESTINATION index, but contrast is against SOURCE color now.
std::string dst_txt = std::to_string(m_extruder_remap[src] + 1);
float gray = 0.299f * src_col.r() + 0.587f * src_col.g() + 0.114f * src_col.b();
ImVec2 txt_sz = ImGui::CalcTextSize(dst_txt.c_str());
ImVec2 pos = ImGui::GetItemRectMin();
ImVec2 size = ImGui::GetItemRectSize();
if (gray * 255.f < 80.f)
ImGui::GetWindowDrawList()->AddText(
ImVec2(pos.x + (size.x - txt_sz.x) * 0.5f, pos.y + (size.y - txt_sz.y) * 0.5f),
IM_COL32(255,255,255,255), dst_txt.c_str());
else
ImGui::GetWindowDrawList()->AddText(
ImVec2(pos.x + (size.x - txt_sz.x) * 0.5f, pos.y + (size.y - txt_sz.y) * 0.5f),
IM_COL32(0,0,0,255), dst_txt.c_str());
bool src_clicked = draw_color_button(
(int)src + 1, // idx
"###remap_src_", // button_id
m_extruders_colors[src], // color
m_extruders_colors[m_extruder_remap[src]], // mapped_color (shows bubble if not matches with Color)
ImGui::IsPopupOpen(pop_id.c_str()), // is_active
scale
);
// ORCA: Show NEW color as a small triangle in the corner if remapped
if (src != m_extruder_remap[src]) {
float s = m_imgui->scaled(0.55f);
float offset = m_imgui->scaled(0.15f); // Inset to avoid rounded corner clipping
ImVec2 p = ImVec2(pos.x + offset, pos.y + offset);
// Contrast outline: White for dark backgrounds, Black for light backgrounds
// Use dst_col (new color) for outline contrast check? Or src_col?
// Usually outline is around the triangle (dst_col).
float dst_gray = 0.299f * dst_col.r() + 0.587f * dst_col.g() + 0.114f * dst_col.b();
ImU32 outline_col = (dst_gray * 255.f < 80.f) ? IM_COL32(255, 255, 255, 180) : IM_COL32(0, 0, 0, 180);
ImDrawList* draw_list = ImGui::GetWindowDrawList();
draw_list->AddTriangleFilled(
p,
ImVec2(p.x + s, p.y),
ImVec2(p.x, p.y + s),
ImGuiWrapper::to_ImU32(dst_col));
// ORCA: Add a thin outline for better contrast when colors are similar
draw_list->AddTriangle(
p,
ImVec2(p.x + s, p.y),
ImVec2(p.x, p.y + s),
outline_col,
0.5f);
}
// popup with possible destinations
if (clicked) {
if (src_clicked) {
// Calculate popup position centered below the current button
ImVec2 button_pos = ImGui::GetItemRectMin();
ImVec2 button_size = ImGui::GetItemRectSize();
ImVec2 popup_pos(button_pos.x + button_size.x * 0.5f, button_pos.y + button_size.y);
// Set popup styling BEFORE opening popup
// Ensure popup is within the main viewport bounds
int dst_count = (int)std::min(n_extr, (size_t)max_per_line);
float est_popup_w = button_size.x * dst_count
+ ImGui::GetStyle().ItemSpacing.x * (dst_count - 1)
+ ImGui::GetStyle().WindowPadding.x * 2.f;
ImGuiViewport* vp = ImGui::GetMainViewport();
float right_limit = vp->WorkPos.x + vp->WorkSize.x - est_popup_w * 0.5f; // pivot is 0.5 so subtract half
float centered_x = button_pos.x + button_size.x * 0.5f; // pivot 0.5 just needs center x
ImVec2 popup_pos(std::min(centered_x, right_limit), button_pos.y + button_size.y);
ImGui::SetNextWindowPos(popup_pos, ImGuiCond_Appearing, ImVec2(0.5f, -0.1f));
ImGui::SetNextWindowBgAlpha(1.0f); // Ensure full opacity
ImGui::OpenPopup(pop_id.c_str());
}
if (ImGui::IsItemHovered() && src != m_extruder_remap[src]) // show tooltip if it has mapping info
m_imgui->tooltip(std::to_string(src + 1) + " >> " + std::to_string(m_extruder_remap[src] + 1), max_tooltip_width);
// Apply popup styling before BeginPopup using standard Orca colors
ImGui::PushStyleVar(ImGuiStyleVar_PopupRounding, 4.0f);
ImGui::PushStyleVar(ImGuiStyleVar_PopupBorderSize, 1.0f);
// ORCA: Use FrameBgActive for consistency and to ensure visibility of white filaments
ImGui::PushStyleColor(ImGuiCol_PopupBg, ImGui::GetStyleColorVec4(ImGuiCol_FrameBgActive));
ImGui::PushStyleColor(ImGuiCol_Border, m_is_dark_mode ? ImVec4(0.5f, 0.5f, 0.5f, 1.0f) : ImVec4(0.6f, 0.6f, 0.6f, 1.0f));
ImGui::PushStyleVar(ImGuiStyleVar_PopupRounding , 8.0f * scale);
ImGui::PushStyleVar(ImGuiStyleVar_PopupBorderSize, 2.0f * scale); // thicker & colored border to prevent mixing with main window. Current ImGui version not supports shadows
ImGui::PushStyleColor(ImGuiCol_PopupBg, ImGui::GetStyleColorVec4(ImGuiCol_WindowBg));
ImGui::PushStyleColor(ImGuiCol_Border , ImGui::ColorConvertFloat4ToU32(ImGuiWrapper::COL_ORCA));
if (ImGui::BeginPopup(pop_id.c_str())) {
m_imgui->text(_L("To:"));
for (int dst = 0; dst < (int)n_extr; ++dst) {
const ColorRGBA &dst_col_popup = m_extruders_colors[dst];
ImVec4 dst_vec = ImGuiWrapper::to_ImVec4(dst_col_popup);
if (dst > 0 && (dst % max_per_line != 0))
ImGui::SameLine();
std::string dst_btn = "##dst_" + std::to_string(src) + "_" + std::to_string(dst);
// Apply same styling to destination buttons
ImGuiColorEditFlags dst_flags = ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoInputs |
ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_NoPicker |
ImGuiColorEditFlags_NoTooltip;
// Show border for currently selected destination filament
if (m_extruder_remap[src] != dst) dst_flags |= ImGuiColorEditFlags_NoBorder;
#ifdef __APPLE__
ImGui::PushStyleColor(ImGuiCol_FrameBg, ImGuiWrapper::COL_ORCA);
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0);
bool dst_clicked = ImGui::ColorButton(dst_btn.c_str(), dst_vec, dst_flags, button_size);
ImGui::PopStyleVar(2);
ImGui::PopStyleColor(1);
#else
ImGui::PushStyleColor(ImGuiCol_FrameBg, ImGuiWrapper::COL_ORCA);
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 2.0);
bool dst_clicked = ImGui::ColorButton(dst_btn.c_str(), dst_vec, dst_flags, button_size);
ImGui::PopStyleVar(2);
ImGui::PopStyleColor(1);
#endif
// overlay destination number on popup buttons
std::string dst_num_txt = std::to_string(dst + 1);
float dst_gray = 0.299f * dst_col_popup.r() + 0.587f * dst_col_popup.g() + 0.114f * dst_col_popup.b();
ImVec2 dst_txt_sz = ImGui::CalcTextSize(dst_num_txt.c_str());
ImVec2 dst_pos = ImGui::GetItemRectMin();
ImVec2 dst_size = ImGui::GetItemRectSize();
if (dst_gray * 255.f < 80.f)
ImGui::GetWindowDrawList()->AddText(
ImVec2(dst_pos.x + (dst_size.x - dst_txt_sz.x) * 0.5f, dst_pos.y + (dst_size.y - dst_txt_sz.y) * 0.5f),
IM_COL32(255,255,255,255), dst_num_txt.c_str());
else
ImGui::GetWindowDrawList()->AddText(
ImVec2(dst_pos.x + (dst_size.x - dst_txt_sz.x) * 0.5f, dst_pos.y + (dst_size.y - dst_txt_sz.y) * 0.5f),
IM_COL32(0,0,0,255), dst_num_txt.c_str());
if (dst_clicked)
{
bool dst_clicked = draw_color_button(
dst + 1, // idx
"###remap_dst_", // button_id
m_extruders_colors[dst], // color
m_extruders_colors[dst], // mapped_color (non fuctional in here)
m_extruder_remap[src] == dst, // is_active
scale
);
if (dst_clicked) {
m_extruder_remap[src] = dst;
// update the source button color immediately
ImGui::CloseCurrentPopup();
}
}
ImGui::Dummy(ImVec2(0.0f, 2.f * scale));
ImGui::EndPopup();
}
@@ -1183,6 +1073,7 @@ void GLGizmoMmuSegmentation::render_filament_remap_ui(float window_width, float
displayed_count++;
}
ImGui::PopStyleVar(1); // ItemSpacing
}
void GLGizmoMmuSegmentation::remap_filament_assignments()

View File

@@ -114,7 +114,6 @@ protected:
bool m_detect_geometry_edge = true;
// Filament remap feature
bool m_show_remap_panel = false;
std::vector<size_t> m_extruder_remap; // index → target extruder index
// ORCA: Cache used filaments to filter UI
std::set<size_t> m_used_filaments; // Set of used filament indices (cached)
@@ -136,13 +135,16 @@ private:
void init_model_triangle_selectors();
// ORCA
bool draw_color_button(int idx, std::string id_str, const ColorRGBA& color, ColorRGBA& map_color, bool active, float scale);
// BBS
void update_triangle_selectors_colors();
void init_extruders_data();
// Filament remapping methods
void remap_filament_assignments();
void render_filament_remap_ui(float window_width, float max_tooltip_width);
void render_filament_remap_ui(float window_width, float max_tooltip_width, float scale);
// ORCA: Helper to update the cache of used filaments
void update_used_filaments();

View File

@@ -121,6 +121,12 @@ void GLGizmoSeam::on_render_input_window(float x, float y, float bottom_limit)
if (! m_c->selection_info()->model_object())
return;
float scale = m_parent.get_scale();
#ifdef WIN32
int dpi = get_dpi_for_window(wxGetApp().GetTopWindow());
scale *= (float) dpi / (float) DPI_DEFAULT;
#endif // WIN32
const float approx_height = m_imgui->scaled(12.5f);
y = std::min(y, bottom_limit - approx_height);
//BBS: GUI refactor: move gizmo to the right
@@ -170,29 +176,25 @@ void GLGizmoSeam::on_render_input_window(float x, float y, float bottom_limit)
icons = { ImGui::CircleButtonIcon, ImGui::SphereButtonIcon };
std::array<wxString, 2> tool_tips = { _L("Circle"), _L("Sphere")};
for (int i = 0; i < tool_ids.size(); i++) {
std::string str_label = std::string("##");
std::wstring btn_name = icons[i] + boost::nowide::widen(str_label);
//std::string str_label = std::string("##");
//std::wstring btn_name = icons[i] + boost::nowide::widen(str_label);
if (i != 0) ImGui::SameLine((empty_button_width + m_imgui->scaled(1.75f)) * i + m_imgui->scaled(1.3f));
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0);
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.f, 0.f, 0.f, 0.f)); // ORCA Removes button background on dark mode
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f)); // ORCA: Fixes icon rendered without colors while using Light theme
if (m_current_tool == tool_ids[i]) {
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.f, 0.59f, 0.53f, 0.25f)); // ORCA use orca color for selected tool / brush
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.f, 0.59f, 0.53f, 0.25f)); // ORCA use orca color for selected tool / brush
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(0.f, 0.59f, 0.53f, 0.30f)); // ORCA use orca color for selected tool / brush
ImGui::PushStyleColor(ImGuiCol_Border, ImGuiWrapper::COL_ORCA); // ORCA use orca color for border on selected tool / brush
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 1.0);
}
bool btn_clicked = ImGui::Button(into_u8(btn_name).c_str());
if (m_current_tool == tool_ids[i])
{
ImGui::PopStyleColor(4);
ImGui::PopStyleVar(2);
}
ImGui::PopStyleColor(2);
ImGui::PopStyleVar(1);
bool is_active = m_current_tool == tool_ids[i];
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.f);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding , 3.f * scale);
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding , ImVec2(4.f * scale, 4.f * scale));
ImGui::PushStyleColor(ImGuiCol_Text , ImVec4(1,1,1,1)); // ORCA Fixes icon rendered without colors while using Light theme
ImGui::PushStyleColor(ImGuiCol_Button , is_active ? ImVec4(0.f, .59f, .53f, .25f) : ImVec4(0,0,0,0)); // ORCA
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, is_active ? ImVec4(0.f, .59f, .53f, .25f) : ImVec4(.6f,.6f,.6f,.2f)); // ORCA
ImGui::PushStyleColor(ImGuiCol_ButtonActive , is_active ? ImVec4(0.f, .59f, .53f, .30f) : ImVec4(0,0,0,0)); // ORCA
ImGui::PushStyleColor(ImGuiCol_Border , is_active ? ImGuiWrapper::COL_ORCA : ImVec4(0,0,0,0)); // ORCA
ImGui::PushStyleColor(ImGuiCol_BorderActive , is_active ? ImGuiWrapper::COL_ORCA : ImVec4(0,0,0,0)); // ORCA matched color for fixing flicker on click
bool btn_clicked = m_imgui->glyph_button(icons[i], ImVec2(16.f * scale, 16.f * scale)); // ORCA glyph_button for fixing unequal paddings
ImGui::PopStyleColor(6);
ImGui::PopStyleVar(3);
if (btn_clicked && m_current_tool != tool_ids[i]) {
m_current_tool = tool_ids[i];
for (auto& triangle_selector : m_triangle_selectors) {

View File

@@ -908,6 +908,54 @@ bool ImGuiWrapper::button(const wxString& label, const ImVec2 &size, bool enable
return (enable) ? res : false;
}
// ORCA Glyph based button for correctly rendering icon size based Glyph
// excludes spacings after Glyph and centers icon properly
// compared to image_button this supports styling
bool ImGuiWrapper::glyph_button(wchar_t icon_char, ImVec2 icon_size)
{
ImDrawList* draw_list = ImGui::GetWindowDrawList();
ImFont* font = ImGui::GetFont();
ImGuiStyle& style = ImGui::GetStyle();
ImVec2 padding = style.FramePadding;
float border_w = style.FrameBorderSize;
float rounding = style.FrameRounding;
std::string icon_str = into_u8(icon_char);
const char* icon = icon_str.c_str();
float width = icon_size.x + (padding.x + border_w) * 2.f;
float height = icon_size.y + (padding.y + border_w) * 2.f;
ImVec2 rc_min = ImGui::GetCursorScreenPos();
ImVec2 rc_max = ImVec2(rc_min.x + width, rc_min.y + height);
ImGui::Dummy(ImVec2(width, height));
ImGuiCol bg_color = ImGuiCol_Button;
ImGuiCol border_color = ImGuiCol_Border;
bool clicked = false;
if (ImGui::IsMouseHoveringRect(rc_min, rc_max)) {
bg_color = ImGuiCol_ButtonHovered;
if (ImGui::IsMouseClicked(ImGuiMouseButton_Left)) {
bg_color = ImGuiCol_ButtonActive;
border_color = ImGuiCol_BorderShadow;
clicked = true;
}
}
draw_list->AddRectFilled(rc_min, rc_max, ImGui::GetColorU32(bg_color), rounding);
if (border_w > 0.f)
draw_list->AddRect(rc_min, rc_max, ImGui::GetColorU32(border_color), rounding, 0, border_w);
ImVec2 text_pos = ImVec2(
rc_min.x + (width - font->FontSize) * .5f,
rc_min.y + (height - font->FontSize) * .5f
);
draw_list->AddText(font, font->FontSize, text_pos, ImGui::GetColorU32(ImGuiCol_Text), icon);
return clicked;
}
bool ImGuiWrapper::radio_button(const wxString &label, bool active)
{
auto label_utf8 = into_u8(label);

View File

@@ -133,6 +133,7 @@ public:
bool bbl_button(const wxString &label, const wxString& tooltip = {});
bool button(const wxString& label, float width, float height);
bool button(const wxString& label, const ImVec2 &size, bool enable); // default size = ImVec2(0.f, 0.f)
bool glyph_button(wchar_t icon_char, ImVec2 icon_size); // ORCA
bool radio_button(const wxString &label, bool active);
static ImVec4 to_ImVec4(const ColorRGB &color);
bool input_double(const std::string &label, const double &value, const std::string &format = "%.3f");

View File

@@ -1355,16 +1355,16 @@ void PlaterPresetComboBox::update()
bool unsupported = group == "Unsupported presets";
for (auto it : list) {
// ORCA add sorting support for vendor / type for user presets
auto groupName2 = groupName == "by_bundle" ? (preset_bundle_names[it->first].empty() ? _L("Unspecified") : preset_bundle_names[it->first])
: groupName == "by_type" ? (preset_filament_types[it->first].empty() ? _L("Unspecified") : preset_filament_types[it->first])
: groupName == "by_vendor" ? (preset_filament_vendors[it->first].empty() ? _L("Unspecified") : preset_filament_vendors[it->first])
auto groupName2 = groupName == "by_bundle" ? (preset_bundle_names[it->first].empty() ? _L("Unspecified") : from_u8(preset_bundle_names[it->first]))
: groupName == "by_type" ? (preset_filament_types[it->first].empty() ? _L("Unspecified") : from_u8(preset_filament_types[it->first]))
: groupName == "by_vendor" ? (preset_filament_vendors[it->first].empty() ? _L("Unspecified") : from_u8(preset_filament_vendors[it->first]))
: groupByGroup ? groupName
: preset_filament_vendors[it->first];
: from_u8(preset_filament_vendors[it->first]);
int index = groupName == "by_bundle"
? Append(preset_aliases[it->first], *it->second,
? Append(from_u8(preset_aliases[it->first]), *it->second,
from_u8(preset_bundle_ids[it->first]), groupName2, nullptr,
unsupported ? DD_ITEM_STYLE_DISABLED : 0)
: Append(preset_aliases[it->first], *it->second, groupName2, nullptr,
: Append(from_u8(preset_aliases[it->first]), *it->second, groupName2, nullptr,
unsupported ? DD_ITEM_STYLE_DISABLED : 0);
SetItemAlias(index, it->first);
if (unsupported)
@@ -1380,7 +1380,7 @@ void PlaterPresetComboBox::update()
}
} else {
for (std::map<wxString, wxBitmap *>::const_iterator it = presets.begin(); it != presets.end(); ++it) {
int index = Append(preset_aliases[it->first], *it->second);
int index = Append(from_u8(preset_aliases[it->first]), *it->second);
SetItemAlias(index, it->first);
SetItemTooltip(index, preset_descriptions[it->first]);
if (group == "System presets")
@@ -1767,10 +1767,10 @@ void TabPresetComboBox::update()
// Get bundle name for grouping
wxString bundle_name = _L("Unspecified");
if (preset_bundle_names.count(it->first) > 0 && !preset_bundle_names[it->first].empty()) {
bundle_name = preset_bundle_names[it->first];
bundle_name = from_u8(preset_bundle_names[it->first]);
}
// Use Append with group parameter for sub-dropdown grouping
int item_id = Append(preset_aliases[it->first], *it->second.first, from_u8(preset_bundle_ids[it->first]), bundle_name);
int item_id = Append(from_u8(preset_aliases[it->first]), *it->second.first, from_u8(preset_bundle_ids[it->first]), bundle_name);
SetItemAlias(item_id, it->first);
SetItemTooltip(item_id, preset_descriptions[it->first]);
bool is_enabled = it->second.second;

View File

@@ -2303,7 +2303,7 @@ void TabPrint::build()
optgroup->append_single_option_line("xy_hole_compensation", "quality_settings_precision#x-y-compensation");
optgroup->append_single_option_line("xy_contour_compensation", "quality_settings_precision#x-y-compensation");
optgroup->append_single_option_line("elefant_foot_compensation", "quality_settings_precision#elephant-foot-compensation");
optgroup->append_single_option_line("elefant_foot_layers_density", "quality_settings_precision#elephant-foot-compensation");
optgroup->append_single_option_line("elefant_foot_layers_density", "quality_settings_precision#elephant-foot-compensation-density");
optgroup->append_single_option_line("elefant_foot_compensation_layers", "quality_settings_precision#elephant-foot-compensation");
optgroup->append_single_option_line("precise_outer_wall", "quality_settings_precision#precise-wall");
optgroup->append_single_option_line("precise_z_height", "quality_settings_precision#precise-z-height");
@@ -2321,25 +2321,25 @@ void TabPrint::build()
optgroup->append_single_option_line("ironing_angle_fixed", "quality_settings_ironing#fixed-angle");
optgroup = page->new_optgroup("Z Contouring", L"param_advanced");
optgroup->append_single_option_line("zaa_enabled");
optgroup->append_single_option_line("zaa_minimize_perimeter_height");
optgroup->append_single_option_line("zaa_min_z");
optgroup->append_single_option_line("zaa_dont_alternate_fill_direction");
optgroup->append_single_option_line("zaa_enabled", "quality_settings_z_contouring");
optgroup->append_single_option_line("zaa_minimize_perimeter_height", "quality_settings_z_contouring#minimize-wall-height-angle");
optgroup->append_single_option_line("zaa_min_z", "quality_settings_z_contouring#minimum-z-height");
optgroup->append_single_option_line("zaa_dont_alternate_fill_direction", "quality_settings_z_contouring#dont-alternate-fill-direction");
// Orca: it's not used yet, so hide it in UI for now
// optgroup->append_single_option_line("ironing_expansion");
optgroup = page->new_optgroup(L("Wall generator"), L"param_wall_generator");
optgroup->append_single_option_line("wall_generator", "quality_settings_wall_generator");
optgroup->append_single_option_line("wall_transition_angle", "quality_settings_wall_generator#arachne");
optgroup->append_single_option_line("wall_transition_filter_deviation", "quality_settings_wall_generator#arachne");
optgroup->append_single_option_line("wall_transition_length", "quality_settings_wall_generator#arachne");
optgroup->append_single_option_line("wall_distribution_count", "quality_settings_wall_generator#arachne");
optgroup->append_single_option_line("initial_layer_min_bead_width", "quality_settings_wall_generator#arachne");
optgroup->append_single_option_line("min_bead_width", "quality_settings_wall_generator#arachne");
optgroup->append_single_option_line("min_feature_size", "quality_settings_wall_generator#arachne");
optgroup->append_single_option_line("min_length_factor", "quality_settings_wall_generator#arachne");
optgroup->append_single_option_line("wall_maximum_resolution", "quality_settings_wall_generator#arachne");
optgroup->append_single_option_line("wall_maximum_deviation", "quality_settings_wall_generator#arachne");
optgroup->append_single_option_line("wall_transition_angle", "quality_settings_wall_generator#wall-transitioning-threshhold-angle");
optgroup->append_single_option_line("wall_transition_filter_deviation", "quality_settings_wall_generator#wall-transitioning-filter-margin");
optgroup->append_single_option_line("wall_transition_length", "quality_settings_wall_generator#wall-transitioning-length");
optgroup->append_single_option_line("wall_distribution_count", "quality_settings_wall_generator#wall-distribution-count");
optgroup->append_single_option_line("initial_layer_min_bead_width", "quality_settings_wall_generator#first-layer-minimum-wall-width");
optgroup->append_single_option_line("min_bead_width", "quality_settings_wall_generator#minimum-wall-width");
optgroup->append_single_option_line("min_feature_size", "quality_settings_wall_generator#minimum-feature-size");
optgroup->append_single_option_line("min_length_factor", "quality_settings_wall_generator#minimum-wall-length");
optgroup->append_single_option_line("wall_maximum_resolution", "quality_settings_wall_generator#maximum-wall-resolution");
optgroup->append_single_option_line("wall_maximum_deviation", "quality_settings_wall_generator#maximum-wall-deviation");
optgroup = page->new_optgroup(L("Walls and surfaces"), L"param_wall_surface");
optgroup->append_single_option_line("wall_sequence", "quality_settings_wall_and_surfaces#walls-printing-order");
@@ -2677,6 +2677,9 @@ void TabPrint::build()
optgroup->append_single_option_line("fuzzy_skin_scale", "others_settings_fuzzy_skin#skin-feature-size");
optgroup->append_single_option_line("fuzzy_skin_octaves", "others_settings_fuzzy_skin#skin-noise-octaves");
optgroup->append_single_option_line("fuzzy_skin_persistence", "others_settings_fuzzy_skin#skin-noise-persistence");
optgroup->append_single_option_line("fuzzy_skin_ripples_per_layer", "others_settings_fuzzy_skin#ripples-per-layer");
optgroup->append_single_option_line("fuzzy_skin_ripple_offset", "others_settings_fuzzy_skin#ripple-offset");
optgroup->append_single_option_line("fuzzy_skin_layers_between_ripple_offset", "others_settings_fuzzy_skin#layers-between-ripple-offset");
optgroup->append_single_option_line("fuzzy_skin_first_layer", "others_settings_fuzzy_skin#apply-fuzzy-skin-to-first-layer");
optgroup = page->new_optgroup(L("G-code output"), L"param_gcode");

View File

@@ -2,6 +2,10 @@
#include "../wxExtensions.hpp"
#ifdef __WXGTK3__
#include "../GUI_Utils.hpp"
#endif
CheckBox::CheckBox(wxWindow *parent, int id)
: wxBitmapToggleButton(parent, id, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE)
, m_on(this, "check_on", 18)
@@ -24,16 +28,12 @@ CheckBox::CheckBox(wxWindow *parent, int id)
Bind(wxEVT_ENTER_WINDOW, &CheckBox::updateBitmap, this);
Bind(wxEVT_LEAVE_WINDOW, &CheckBox::updateBitmap, this);
#endif
update();
#ifdef __WXGTK__
wxSize bestSize = GetBestSize();
bestSize.IncTo(m_on.GetBmpSize());
SetSize(bestSize);
SetMinSize(bestSize);
#else
SetSize(m_on.GetBmpSize());
SetMinSize(m_on.GetBmpSize());
#ifdef __WXGTK3__
Slic3r::GUI::RemoveButtonBorder(this);
#endif
Rescale();
}
void CheckBox::SetValue(bool value)
@@ -61,16 +61,9 @@ void CheckBox::Rescale()
m_on_focused.msw_rescale();
m_half_focused.msw_rescale();
m_off_focused.msw_rescale();
update();
#ifdef __WXGTK__
wxSize bestSize = GetBestSize();
bestSize.IncTo(m_on.GetBmpSize());
SetSize(bestSize);
SetMinSize(bestSize);
#else
SetSize(m_on.GetBmpSize());
SetMinSize(m_on.GetBmpSize());
#endif
update();
}
void CheckBox::update()

View File

@@ -11,6 +11,10 @@
#include "libslic3r/MacUtils.hpp"
#endif
#ifdef __WXGTK3__
#include "../GUI_Utils.hpp"
#endif
#include <wx/dcmemory.h>
#include <wx/dcclient.h>
#include <wx/dcgraph.h>
@@ -28,6 +32,11 @@ SwitchButton::SwitchButton(wxWindow* parent, wxWindowID id)
SetBackgroundColour(StaticBox::GetParentBackgroundColor(parent));
Bind(wxEVT_TOGGLEBUTTON, [this](auto& e) { update(); e.Skip(); });
SetFont(Label::Body_12);
#ifdef __WXGTK3__
Slic3r::GUI::RemoveButtonBorder(this);
#endif
Rescale();
}