Compare commits

..
Author SHA1 Message Date
Ian Chua ee2b4ccf70 Merge branch 'main' into feat/printer-agent-infra 2026-09-16 22:32:32 +08:00
Ian Chua 753c793ea0 revert: filament sync work 2026-09-16 22:20:35 +08:00
Ian Chua 9c5494b19f fix: disable unused DataChannel media support 2026-09-16 22:08:53 +08:00
Ian Chua 93a119427a Merge branch main into feat/printer-agent-infra 2026-09-16 22:06:09 +08:00
Ian Chua d264fcaef4 fix: always build bundled DataChannel dep 2026-09-16 22:04:27 +08:00
Ian Chua b4ab6dedfd fix: move printer agent plugin tests into test_plugin_lifecycle.cpp 2026-09-16 21:33:04 +08:00
Kris Austin a610d2d899 ci: build Windows with build_win.bat and drop the old scripts (#15721)
* ci: build Windows with build_win.bat and drop the old scripts

The deps and slicer jobs called build_release_vs.bat; they now call
build_win.bat. --deps-dir and --build-dir name the build/build-arm64
directories the cache keys and later steps already use, and the
script's own VsDevCmd call replaces the Enter-VsDevShell blocks.
With both stages configured each way into the same directory, the deps
superbuild is byte-identical and the slicer build files are
byte-identical apart from CMakeCache.txt recording how DEP_BUILD_DIR
was set.

Two changes beyond the script swap:

- The compiler is the clang-cl bundled with Visual Studio, the script's
  default. The old script's bare "clang-cl" resolved to the LLVM on the
  runner image's PATH, 20.1.8 on x64 and 22.1.8 on arm64; both arches
  now build with the 22.1.3 VS 18.9 ships. Cached dependencies are only
  rebuilt when deps/ changes, so they stay on the LLVM they were built
  with; the arm64 leg already links deps built with Clang 19 into a
  Clang 22 slicer.
- The deps job no longer zips the dependencies afterwards. The zip was
  never uploaded and was not in the cached path.

A failed cmake --build now fails the job. The old script returned 0, so
the arm64 failure fixed in #15719 was reported as success and the
half-built dependencies were saved to the cache.

build_release.bat, build_release_vs.bat and build_release_vs2022.bat are
removed; nothing referenced them any more.

* ci: run Build all when the Windows build script changes; tests doc builds the deps

The push filter of build_all.yml never listed a build script, and CI
now depends on build_win.bat, so it and its test suite join the list
the pull_request filter already has.

tests/AGENTS.md told Windows to run build_win.bat --run-tests, which
only implies -s and stops at the dependency check on a clean checkout.
The old build_release_vs.bat tests built the dependencies first, so
the line now says -ds --run-tests.
2026-09-16 09:50:27 -03:00
SoftFever ade9e77b6b Run every profile maintenance job from one tool (#15726)
* Run every profile maintenance job from one tool

orca_id_tool.py becomes orca_profile_tool.py, and orca_extra_profile_check.py
and orca_filament_lib.py fold into it as subcommands: check, generate-id, fix,
trim, update-index and update-snapshot. The three scripts already overlapped --
the checker imported half of its rules from the id tool, which in turn kept a
copy-pasted set of output helpers to avoid the resulting import cycle -- while
disagreeing on how a vendor is enumerated, how a JSON file is read and what the
exit code means. One file settles all three.

check, normalize, trim and update-index reproduce their predecessors exactly; normalize and
update-index were diffed byte-for-byte against the old scripts over a copy of
the whole tree. Deliberate changes: the compatible-printers check no longer
switches itself off when --check-materials is passed, an error exits 1 rather
than -1, update-index honours --profile-type and reports a profile it cannot
place instead of dropping it from the index, fix and update-index gained
--dry-run, trim keeps an unindexed file some surviving profile still inherits
from, and vendors are enumerated as directories with an index -- which is why
blacklist.json, a data file that an unscoped index rebuild once wrote four empty
list sections into, loses them here and will not collect them again. The dead
rename_filament_system() helper is gone.

The suite under scripts/tests now covers the maintenance commands too, and CI
runs it; nothing there ran in CI before. No shipped profile data changes apart
from those four keys.

* update vendor index files with "python3 ./scripts/orca_profile_tool.py update-index" and "python3 ./scripts/orca_profile_tool.py normalize"
2026-09-16 19:53:23 +08:00
Ian Chua ed59f93456 fix: scope get_my_machine_list to printers listed under the current printer agent 2026-09-16 19:48:59 +08:00
Ian Chua cf52c81dcd fix: stop the correct media controller 2026-09-16 18:44:06 +08:00
Ian Chua 803a2a3239 fix: dedupe compatible printer type check 2026-09-16 17:18:59 +08:00
Ian Chua 985092bb46 fix: move non-mandatory printer agent function stubs to IPrinterAgent 2026-09-16 16:56:43 +08:00
Ian Chua cb16a2e547 feat: enable https camera stream mode 2026-09-16 16:24:29 +08:00
Ian Chua 2c2e91b629 fix: remove hardcoded ICE servers 2026-09-16 14:36:49 +08:00
Ian Chua c3faf903ca fix: use ORCA_CLOUD_PROVIDER instead of hardcoded string 2026-09-16 14:24:40 +08:00
Ian Chua 5f3c957597 fix: remove stale comment 2026-09-16 14:23:00 +08:00
Ian Chua 8557285389 fix: revert moonraker specific behavior 2026-09-16 14:21:09 +08:00
Ian Chua a9edab78a8 fix: inject provider, agent id and generation to get_user_print_info to ensure correct metadata 2026-09-16 14:15:24 +08:00
Ian Chua 79dede7d59 fix: change rtc log level 2026-09-16 14:14:21 +08:00
Ian Chua 2ac45b2f78 fix: invoke js clearInterval on WebMediaController::stop 2026-09-16 14:13:37 +08:00
Ian Chua b4f33e71e9 fix: add internal_developer_mode chekc back to MediaPlayCtrl::load() 2026-09-16 14:12:48 +08:00
packerlschupfer 93c8b3f2b0 CLI: --ground-* orientation from the Lay on Face planes, and --inspect-mesh (#15073)
* CLI: --ground-face-* / --lay-flat / --center-on-bed orientation primitives

Adds the CLI counterparts to the GUI's lay-flat / face-pick gizmos.
Scripted / CI / AI pipelines can now set orientation without rendering
a wxWidgets frame; today the only way is a GUI round-trip.

New CLI actions (all operate in the mesh-local frame so they compose
with prior --rotate-* / --orient flags):

  --ground-largest-face 1     Auto-detect the largest planar-face
   or  --lay-flat 1           cluster (area-weighted), rotate so its
                              normal points -Z. Covers "this part has
                              one obvious flat side" cases.

  --ground-face-normal NX,NY,NZ    Pick the face whose mesh-local
                                   normal best matches the given
                                   vector; ground it. e.g.
                                   `--ground-face-normal 1,0,0`
                                   stands a part on its +X side.

  --ground-face-point X,Y,Z        Find the triangle containing the
                                   given mesh-local point; ground its
                                   face. Disambiguates when several
                                   faces share a normal (largest
                                   containing triangle wins).

  --center-on-bed 1                Translate so the XY bounding-box
                                   centroid lands at the bed center
                                   (derived from printable_area).

New file `src/slic3r/Utils/MeshOrient.{hpp,cpp}`:
- collect_triangles_object / compute_face_clusters — quantize
  per-triangle normals (0.001, ~0.06°) and area-weighted-average
  within clusters. Same clustering logic used by lay-flat.
- apply_ground_rotation — same math as Selection::flattening_rotate
  in the GUI (Selection.cpp:1432): world-space quaternion from the
  transformed normal to -Z, applied as offset * new_rot * old_no_offset
  on every instance of every object, then a per-instance Z-lift so the
  grounded face lands at exactly 0 (avoids "No layers were detected"
  from FP-error z≈-1e-9).
- ground_face_point uses a top-N cluster search + point-in-triangle
  test in local space; largest-area triangle wins on ambiguity.

Rationale: without these, any CLI pipeline that needs a specific
face on the bed must either encode custom rotation math per part or
break out of the pipeline into the GUI. Both are bad for
reproducibility. The --ground-face-* triple + the largest-face
auto-mode cover essentially every orientation intent expressible
in a slicing wizard.

Scope:
- `src/slic3r/Utils/MeshOrient.{hpp,cpp}` — new, ~420 lines
- `src/slic3r/CMakeLists.txt` — 2-line registration
- `src/libslic3r/PrintConfig.cpp` — 5 new CLIMiscConfigDef entries
- `src/OrcaSlicer.cpp` — 58-line handler block + 1 include

No behaviour change when the flags are absent.

(cherry picked from commit c45a9795e1)

* CLI grounding: choose among the Lay on Face planes, per object

Addresses review:
- Move the geometry of GLGizmoFlatten::update_planes() into
  libslic3r/LayOnFace and use it from the gizmo and the CLI, so the
  --ground-* options pick convex-hull faces per object and instance,
  with part transformations (--rotate-x/y) applied.
- Drop --center-on-bed, the --lay-flat alias and MeshOrient; make
  --ground-largest-face a coBool.
- Parse --ground-face-normal and --ground-face-point strictly. A point
  that only some objects contain grounds those and leaves the others.
- Fold in --inspect-mesh from #14603, reporting the same planes.
- Tests in tests/libslic3r/test_lay_on_face.cpp: bounding boxes before
  and after, rotate then ground, two objects, and a ribbed part whose
  parallel inner faces outsum its base.

* CLI --inspect-mesh, --ground-face-*: reject missing input and empty values

- Without an input file or --load-assemble-list, --inspect-mesh printed
  nothing and exited 0. Reject it up front with CLI_INVALID_PARAMS.
- An explicit empty --ground-face-normal or --ground-face-point was
  silently ignored. Only options given on the command line reach the
  transforms loop, so an empty value now fails the strict parse like any
  other malformed value.
2026-09-16 12:56:46 +08:00
packerlschupfer 9321f24959 CLI: --strict, and a warnings array in result.json (#14601)
# Description

Add `--strict` for CI and scripted pipelines, and a structured
`warnings`
array in `result.json`.

## `--strict`

A NON_CRITICAL slicing warning is logged and the slice succeeds: return
code
`0`, G-code written. That suits interactive use, but a pipeline then
ships a
slice with a warning nobody saw. With `--strict`, such a warning fails
the run
with `CLI_SLICING_ERROR` before the G-code is exported. Without the
flag,
nothing changes.

In FFF the warning that reaches this path is "support needed but
disabled"
(`PrintObject::generate_support_material`). `--no-check` skips that
check, so
`--strict --no-check` is rejected with `CLI_INVALID_PARAMS`.

`--strict` is read before any work, so it doesn't depend on argument
order and
`result.json` reports it for early failures as well.

## `result.json`

Two new top-level fields:

- `warnings`: `[{"class", ...details}]`. One class is wired:
`slicing_warning_non_critical` with `plate_id` and `text`, recorded
whenever
such a warning fires, with or without `--strict`. The array also fills
on
  runs that succeed, so `return_code` stays the verdict.
- `strict_mode`: whether `--strict` was on.

`record_exit_reson` writes `result.json` on Linux only, so both fields
exist
only there. The non-zero exit works on every platform.

## Tests

- `tests/fff_print/test_support_material.cpp` (all platforms): an
overhang
sliced with support off raises the NON_CRITICAL support-needed status,
and
  the no-check flag suppresses it.
- `tests/cli/test_cli_strict.sh` (Linux only): runs `orca-slicer`
without
flags, with `--strict`, and with `--strict --no-check`, and checks the
shell
status and `result.json` of each. It runs the built binary, so it
carries the
`RequiresApp` label, which `scripts/run_unit_tests.sh` excludes because
the
  unit-test job only receives `build/tests`. Run it with
  `ctest --test-dir build/tests -C Release -L RequiresApp`.
- CI: `unit_tests.yml` now passes `Release` on Linux too.
`build_linux.sh`
configures Ninja Multi-Config, and without a config ctest drops the
labels of
plain `add_test()` tests, so this test ran as "Not Run" instead of being
excluded. The docs that assumed Linux was single-config are corrected
too.

Built and run locally on Linux (GCC 14) on current `main`: both tests
pass,
and the touched files compile clean under Clang with `-Werror`.
2026-09-16 12:54:48 +08:00
Valerii Bokhan 3e1daccd7c Feature: Add inward wipe for external perimeters (#15407) 2026-09-15 20:01:39 -03:00
SoftFever a0ada1aa88 fix wiki links 2026-09-16 00:43:50 +08:00
Kris Austin 9409598c2a ci: run the unit-test suite under the flatpak build's bounds-checked STL (#14709)
* ci(flatpak): run the unit suite in a separate job, mirroring the other arches

Alternative to the in-job step: split build and test like the Linux/Windows/
macOS legs. The flatpak build now builds the test binaries in-sandbox (the
action's run-tests fires the module's build-only test-commands), prunes the
kept build tree to the test binaries + CTest metadata + data, and uploads it
with /app as a test asset (size reported to the run summary).

A new unit_tests_flatpak matrix job downloads that asset on a native runner,
restores the module-build symlink, and runs the suite via flatpak-builder
--run (which bind-mounts /run/build so TEST_DATA_DIR resolves) against the
GNOME SDK's bounds-checked STL. Results feed publish_test_results.

Costs a per-arch asset upload/download + a runtime install on the test
runner; the trade-off vs the in-job step is a genuine separate graph box.

* ci(flatpak): run tests via `flatpak build` to avoid rofiles-fuse

`flatpak-builder --run` sets up a rofiles-fuse overlay that this CI container
rejects (Failure spawning rofiles-fuse, exit_status: 256), even in a fresh job
with a machine-id and the runtime installed, and --disable-rofiles-fuse is not
accepted in --run mode. `flatpak build` enters the sandbox via bwrap directly,
so it sidesteps rofiles-fuse; bind-mounting the build tree at /run/build gives
the same path the compiled-in TEST_DATA_DIR expects.

* ci(flatpak): slim the test asset (strip binaries, drop source tree)

The first cut shipped ~1 GB: the test exes carried debug info (the SDK builds
with -g and only the app gets stripped) and the packaged module dir included
the whole copied source tree the tests never read at runtime. Strip the test
binaries and keep only build_flatpak/tests, tests/ (TEST_DATA_DIR) and scripts/.
The irreducible remainder is /app, which the exes link against.

* ci(flatpak): extract the test run into a reusable unit_tests_flatpak workflow

Move the flatpak test job out of build_all.yml into a reusable
unit_tests_flatpak.yml, called once per arch (Flatpak x86_64 / aarch64) the
same way the other arches call unit_tests.yml. build_all.yml keeps only the
build + asset packaging; the reusable workflow downloads the asset, runs the
suite via `flatpak build`, and uploads results as test-results-<artifact> for
publish_test_results. Drops the now-unused manifest checkout (flatpak build
does not need it).

* ci(flatpak): trim comments to the non-obvious

No behavior change.

* ci(flatpak): drop redundant caller comment

* ci(flatpak): drop redundant trim comment

* ci(flatpak): drop size-report scaffolding and redundant if-guards

* ci(flatpak): force the app module to rebuild so the test asset always exists

flatpak-builder caches modules by content hash and skips a hit, producing no
build tree and no test asset, so a re-run of the same commit would leave the
separate test job with nothing to download. Inject a per-run cache-buster into
the OrcaSlicer module's build-options (part of its cache key) so it always
rebuilds, mirroring how the other arches cache only deps and always rebuild the
app and tests. The deps modules stay cached.

* ci(flatpak): trim cache-buster comment, fix stale step name

* fix: guard H2C per-filament array reads against short config arrays

The H2C tool-ordering, wipe-tower, and g-code export paths index per-filament
config arrays by filament/tool id. A config with fewer entries than the filament
count (partial or legacy projects, minimal test configs) makes these reads run
past the end of the vector: silent under a normal STL, but UB that aborts under
the flatpak build's bounds-checked STL (_GLIBCXX_ASSERTIONS).

Route the reads through the existing clamping accessors (get_at,
get_filament_category, is_in_same_extruder) and add a small clamp helper for
filament_change_length. The guards are no-ops when the arrays are sized to the
filament count, so correctly specified configs are unaffected.

* ci(flatpak): build filament_group_tests too

The suite landed on main after this branch was cut and arrived via a later merge,
so it was missing from the target list and ctest failed the leg with
filament_group_tests_NOT_BUILT.

Not tests/all, which build_linux.sh uses: that is a Ninja subdirectory target and
this build configures with the default Makefile generator, where it does not exist.

* ci(flatpak): give the embedded-interpreter tests a valid Python home

python_test_support.hpp sets PyConfig.home to <testdir>/python when that
path resolves. WIN32/APPLE populate it with a copied bundled runtime; the
flatpak leg had no such branch, so home resolved to a directory with no
stdlib and all 21 embedded plugin tests failed at "failed to get the
Python codec of the filesystem encoding".

Symlink <testdir>/python to the bundled /app/libpython that already ships
in the flatpak (the test exe links libpython3.12.so from there via rpath),
so the interpreter initializes without duplicating the runtime.

* ci(flatpak): sync the ToolOrdering guard mirror with #14789

Match #14709's build_filament_group_context guard to the version on
#14789 (size filament_info to filament_nums, truncate filament_ids)
so the folded guard is a byte-identical mirror that drops cleanly when
#14789 merges, instead of leaving a stale hunk that conflicts on rebase.

* fix: guard WipeTower per-filament array reads against short config arrays

The BambuStudio WipeTower sync reintroduced raw per-filament array
indexing that reads out of bounds when a config leaves an array shorter
than the filament count: m_physical_extruder_map in format_line_M104/M109
(indexed even when empty), and m_filament_categories in get_wall_skip_points
and get_wall_filament_for_all_layer. Silent on a normal STL, a hard abort
under the bounds-checked STL the Flatpak build uses.

Bounds-check the physical extruder map before indexing (omitting the T
token, as the existing -1 path already does), and route the two raw
m_filament_categories reads through the clamping get_filament_category()
accessor the surrounding code already uses. No change for correctly-sized
configs.

* fix: default-initialize WallToolPathsParams fields

min_length_factor and is_top_or_bottom_layer had no default initializers, and the FillConcentric/FillConcentricInternal callers never set them, so WallToolPaths::removeSmallLines() thresholded on stack garbage. Which short extrusion lines it dropped then depended on memory layout, so concentric solid-infill output was nondeterministic between runs and across machines. Give every member a default, matching the adjacent FillParams. The perimeter path was already fine because it builds the struct via make_paths_params().

* fix: bounds-check the toolchange flush-volume and HRC per-filament lookups

GCode::set_extruder's toolchange flush-volume lookup and
GCodeProcessor::update_slice_warnings's HRC check index per-filament and
per-extruder arrays (flush_volumes_matrix, the filament map, the nozzle list)
by filament/extruder id. When a config leaves one of those arrays shorter than
the filament count (partial or legacy multi-extruder projects, minimal
configs), the reads run off the end: silent on a normal STL, a hard abort under
_GLIBCXX_ASSERTIONS.

Route both reads through bounds checks: the flush lookup falls back to no flush,
matching the existing unknown-old-filament branch beside it, and the HRC check
skips an unmapped filament, mirroring the required_nozzle_HRC guard on the line
above. When the arrays are sized to the filament count the values are unchanged,
so correctly-specified configs are unaffected.

* ci: retrigger checks

* ci: name the flatpak rebuild token after the cache it defeats

Since #15650 the Flatpak job also has a compiler cache, so a bare
"cache-buster" no longer says which cache is meant. Call it
flatpak_builder_cache_buster, and name the build-dir trim step after
the flatpak-builder cache save it keeps lean.

* ci: ship resources/profiles and resources/printers in the flatpak test asset

Two slic3rutils tests added in 4aa0e1d60b read
resources/printers/bambu_filament_ids.json through PROFILES_DIR/.., and
the asset dropped resources/ entirely, so both failed parsing an empty
stream on each Flatpak leg. Keep the two subtrees the tests reach;
test_gcodewriter's shipped-profile case stops skipping on this leg too.

* ci: restore the CRLF line endings of build_all.yml

The last merge from upstream/main rewrote the file with LF endings, which
turns the 60-line change into a whole-file diff on GitHub. Upstream has had
this file as CRLF since it was created, so put it back.

* ci: trigger Build all on changes to the unit-test workflows

The path filters only matched build_*.yml, so an edit to unit_tests.yml or
unit_tests_flatpak.yml could merge without ever running.

* ci: put a timeout on the flatpak unit-test step

Matches the 20 minutes of the regular unit-test workflow; without it a hung
test holds the runner for the six-hour job default.
2026-09-15 12:41:46 -03:00
Kris Austin 7e545651bb deps: compile unicodectype.c unoptimised in the Windows arm64 Python (#15719)
VS 2026's ARM64 code generator needs about 27 GB for
_PyUnicode_ToNumeric, a switch with 1951 cases in
Objects/unicodetype_db.h; the same file takes under 1 GB on x64. The
16 GB CI runner has an 18.9 GB commit limit and only gets through when
Windows grows the pagefile on the temp disk in time, so cold arm64
dependency builds fail at random with C1002 "compiler is out of heap
space". build_release_vs.bat returns 0 on failure, so the job still
reports success and the incomplete dependencies are cached.

A property sheet compiles that one file with optimisation off on arm64;
the rest stays whole-program optimised and x64 is unchanged.
MSBuild reads it from PCbuild/msbuild.rsp, which is now written at
configure time and copied in, so a checkout path with spaces works too.
2026-09-15 11:55:11 -03:00
Kris Austin ac3997c0d1 fix: bounds-check the toolchange flush-volume and HRC per-filament lookups (#15289)
* fix: bounds-check the toolchange flush-volume and HRC per-filament lookups

GCode::set_extruder's toolchange flush-volume lookup and
GCodeProcessor::update_slice_warnings's HRC check index per-filament and
per-extruder arrays (flush_volumes_matrix, the filament map, the nozzle list)
by filament/extruder id. When a config leaves one of those arrays shorter than
the filament count (partial or legacy multi-extruder projects, minimal
configs), the reads run off the end: silent on a normal STL, a hard abort under
_GLIBCXX_ASSERTIONS.

Route both reads through bounds checks: the flush lookup falls back to no flush,
matching the existing unknown-old-filament branch beside it, and the HRC check
skips an unmapped filament, mirroring the required_nozzle_HRC guard on the line
above. When the arrays are sized to the filament count the values are unchanged,
so correctly-specified configs are unaffected.

* ci: retrigger checks
2026-09-15 09:46:31 -03:00
Kris Austin bd1304443c fix: guard per-filament array reads against short config arrays (#14789)
* fix: guard H2C per-filament array reads against short config arrays

The H2C tool-ordering, wipe-tower, and g-code export paths index per-filament
config arrays by filament/tool id. A config with fewer entries than the filament
count (partial or legacy projects, minimal test configs) makes these reads run
past the end of the vector: silent under a normal STL, but UB that aborts under
the flatpak build's bounds-checked STL (_GLIBCXX_ASSERTIONS).

Route the reads through the existing clamping accessors (get_at,
get_filament_category, is_in_same_extruder) and add a small clamp helper for
filament_change_length. The guards are no-ops when the arrays are sized to the
filament count, so correctly specified configs are unaffected.

* fix: size the grouping context's filament_info to the filament count

build_filament_group_context built model_info.filament_info by walking
filament_type, so a config whose filament_type is shorter than the filament
count produced a short vector. FilamentGroup indexes filament_info by filament
id, so clamping the individual reads only moved the out-of-bounds access
downstream. Loop to filament_nums and read all three fields through get_at,
and drop filament_ids entries past the filament count, since the grouping code
pairs filament_ids and filament_info by position.

Adds a regression test with four filaments and one-entry filament_type /
filament_is_support. Without the fix it throws bad_alloc from copying a garbage
std::string read past the end.

* fix: guard the carousel nozzle-change length reads too

The carousel branch added in b90ac13d86/b0dddb4648 reads
m_filaments_change_length by tool id without a bounds check, the same
pattern this branch already routed through filament_change_length_at
a few lines above in both plan_toolchange and plan_tower_new.

* fix: guard WipeTower per-filament array reads against short config arrays

The BambuStudio WipeTower sync reintroduced raw per-filament array
indexing that reads out of bounds when a config leaves an array shorter
than the filament count: m_physical_extruder_map in format_line_M104/M109
(indexed even when empty), and m_filament_categories in get_wall_skip_points
and get_wall_filament_for_all_layer. Silent on a normal STL, a hard abort
under the bounds-checked STL the Flatpak build uses.

Bounds-check the physical extruder map before indexing (omitting the T
token, as the existing -1 path already does), and route the two raw
m_filament_categories reads through the clamping get_filament_category()
accessor the surrounding code already uses. No change for correctly-sized
configs.
2026-09-15 09:03:20 -03:00
Ian Chua 8c91cab971 fix(ci): add libdatachannel to flatpak manifest 2026-09-15 20:01:48 +08:00
Ian Chua 79077518e9 fix: re-include apply header guarded by ifdef __APPLE__ 2026-09-15 19:45:14 +08:00
Lam Wei Lun bb3a260acb Update YouTube URL for Publish 3MF dialog (#15718) 2026-09-15 18:31:15 +08:00
Ian Chua 56aa348c89 fix(ci): set depends openssl 2026-09-15 18:16:50 +08:00
Lam Wei Lun 2b6eb425e4 Update YouTube URL for publish 3MF guide 2026-09-15 18:04:06 +08:00
Lam Wei Lun ae1752fbf2 Resolve printer agent first before getting cloud printer agent 2026-09-15 18:02:02 +08:00
Ian Chua cf3f36a1c6 Merge branch 'feat/printer-agent-infra' of https://github.com/OrcaSlicer/OrcaSlicer into feat/printer-agent-infra 2026-09-15 17:37:57 +08:00
Ian Chua cca7d8adb1 fix(ci): deps build order for datachannel 2026-09-15 17:35:25 +08:00
Ian Chua 396d9ff51a Merge branch 'main' into feat/printer-agent-infra 2026-09-15 16:47:15 +08:00
Ian Chua 81540c81e0 Merge branch 'feat/printer-agent-infra' of https://github.com/OrcaSlicer/OrcaSlicer into feat/printer-agent-infra 2026-09-15 16:46:38 +08:00
Ian Chua e7ace6cc99 fix: unit tests & unused variables 2026-09-15 16:46:28 +08:00
Lam Wei Lun 79c20a1fad Guard libdatachannel. Remove unused code 2026-09-15 16:33:12 +08:00
Ian Chua e48f9f47d2 Revert "fix: parameterize orcaslicer_copy_test_dlls() for printer_agent_plugin_tests"
This reverts commit 2f566e3779.
2026-09-15 16:12:33 +08:00
Ian Chua 2f566e3779 fix: parameterize orcaslicer_copy_test_dlls() for printer_agent_plugin_tests 2026-09-15 16:08:10 +08:00
Ian Chua 37d1edf69a fix: printer agent virutal optional functions 2026-09-15 15:54:55 +08:00
Lam Wei Lun f1cf9c69b1 Log first before std::move 2026-09-15 15:49:15 +08:00
Lam Wei Lun 1df362888e Fixes nullptr deref 2026-09-15 15:47:48 +08:00
HanifKoh 0956b4d8fe Add a Nightly Parity Workflow (#15712)
# Description

<!--
> Please provide a summary of the changes made in this PR. Include
details such as:
  > * What issue does this PR address or fix?
  > * What new features or enhancements does this PR introduce?
> * Are there any breaking changes or dependencies that need to be
considered?
-->

Adds a nightly workflow that runs the long parity checks from
[orca-test-repo](https://github.com/OrcaSlicer/orca-test-repo), which
are too slow for the per-build "Run external slicer regression tests"
step and are kept out of every PR and merge build.

## What it runs

`.github/workflows/parity_nightly.yml`, three jobs:

| Job | What it does |
|---|---|
| Find the build to test | Picks the latest successful `build_all.yml`
run for the branch (`main` by default) and records its commit. |
| Override sweep effect stage (shard 0 and 1) | Runs orca-test-repo's
override sweep with `--effect-full`: every config option that lands on
the CLI is re-sliced on its own to check that it actually changes the
G-code. Split into 2 shards, each with a 60-minute timeout. |
| GUI-vs-CLI parity harness | Slices a set of fixtures in the GUI
(headless under Xvfb) and on the CLI, compares the exports, and scores
divergences against a known-differences ledger. It reports only and
never fails on a divergence. |

## When it runs

- **Every night at 21:00 UTC,** after `build_all.yml`'s 17:00 UTC run
has finished.
- **By hand** through `workflow_dispatch`, with optional inputs:
  - `build_branch`: the branch whose latest successful build to test;
  - `test_repo_ref`: the orca-test-repo ref;
  - `fixtures`: a subset of harness fixtures;
  - `cli_presets`: `flat` or `raw`.
- **No `push` or `pull_request` trigger,** so nothing here runs on PRs
or merges. The per-build CI step is unchanged.

## How it tests a build

- **Binary:** the Linux x86_64 AppImage from the chosen `build_all` run.
- **Source:** OrcaSlicer checked out at that run's exact commit. The
AppImage only ships packed preset caches, so profiles and the CLI option
list come from this checkout, matched to the binary.
- **Output:** each job writes a summary to the run page and uploads its
report (`override-report-shard*`, `parity-scorecard`) for 30 days.
- **Failures:** a failing effect shard fails the run, and GitHub's usual
failure notification for scheduled workflows applies.

# Screenshots/Recordings/Graphs

<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->

## Tests

<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->

- Dispatched on this branch against orca-test-repo `main` and #15693's
build ([run
34933239912](https://github.com/OrcaSlicer/OrcaSlicer/actions/runs/34933239912)).
Every job passed:
- **effect shard 0:** 19m31s; 225 options sliced, 151 effective, none
crashed or hung, every fixture sliced;
  - **effect shard 1:** 19m33s; 349 options sliced, 254 effective, same;
  - **harness:** 4m32s; all 13 fixtures, 0 new divergences, 0 errors.
- An earlier dispatch on this branch, testing #15693's build against
orca-test-repo's parity branch ([run
34836468900](https://github.com/OrcaSlicer/OrcaSlicer/actions/runs/34836468900)),
passed: effect shards in 20m28s and 23m30s, and the harness reported 0
new divergences.
- The workflow only runs from the default branch on its schedule, so the
nightly trigger itself takes effect once this is merged.

<!--
> A guide for users on how to download the artifacts from this PR.
-->

[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
2026-09-15 15:01:35 +08:00
HanifKoh 5514559feb Load Each Vendor Tree Once When the CLI Resolves System Presets (#15693)
# Description

<!--
> Please provide a summary of the changes made in this PR. Include
details such as:
  > * What issue does this PR address or fix?
  > * What new features or enhancements does this PR introduce?
> * Are there any breaking changes or dependencies that need to be
considered?
-->

Since #15438, every CLI run that loads a system preset spends about a
second per preset file re-parsing that vendor's entire profile tree. A
slice with a machine, process and filament preset got roughly 2.5 s
slower, and a four-filament slice roughly 4 s slower. This PR loads each
vendor tree once per run instead. Resolved presets and G-code are
unchanged.

The GUI never takes this path, and no release contains #15438, so the
regression only affects CLI runs on current dev and nightly builds. That
includes print farms, slicing services and plugins that call
`orca-slicer --slice`, and CI suites.

## Changes

### Why it was slow

`PresetBundle::resolve_preset_config` resolves a system preset through
its vendor manifest by loading the whole OrcaFilamentLibrary bundle and
the whole vendor tree from JSON, then picking the one preset out. The
CLI did that separately for every `--load-settings` and
`--load-filaments` file, on a fresh `PresetBundle` each time. With BBL
presets, a machine + process + filament run opened `BBL.json` three
times and read BBL's 2,879 profile files and the library's 512 three
times over.

### Load each vendor tree once

- `PresetBundle` keeps every vendor bundle its manifest path loads,
keyed by source root, vendor and substitution rule, and reuses them for
later resolutions on the same bundle.
- OrcaFilamentLibrary is cached the same way, so vendors under one root
share a single library load and the library's own presets resolve from
that same instance. A vendor bundle only reads from its base while
loading, so sharing it is safe.
- A failed or throwing load is not kept, so error reporting is
unchanged.
- The key includes the source root, so presets from two different
profile roots still resolve separately.
- The CLI resolves every system preset through one `PresetBundle` for
the whole run, instead of creating one per file.

The resolved configurations still come from the same canonical vendor
loader, so what a preset resolves to does not change. Only the CLI calls
`resolve_preset_config`, so a long-lived GUI bundle cannot end up
holding profile trees that later change on disk.

# Screenshots/Recordings/Graphs

<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->

CLI slice of a 20 mm cube with X1 Carbon system presets. Both builds get
the same datadir, best of 3, Linux. "Before" is this PR's base from CI.

| System presets loaded | Before | After |
|---|---|---|
| machine | 0.95 s | 0.87 s |
| machine + process | 1.67 s | 0.92 s |
| machine + process + 1 filament | 2.51 s | 0.97 s |
| machine + process + 4 filaments | 5.00 s | 0.99 s |

Files opened during the machine + process + filament run (`strace -e
openat`):

| | Before | After |
|---|---|---|
| `BBL.json` | 3 | 1 |
| `OrcaFilamentLibrary.json` | 3 | 1 |
| `system/BBL/**/*.json` | 8,634 | 2,880 |
| `system/OrcaFilamentLibrary/**/*.json` | 1,536 | 512 |

Peak memory did not rise: max RSS 306 MB → 286 MB for the three-preset
run, and 305 MB → 285 MB for four filaments. The "before" figure is an
AppImage, so part of that gap is probably packaging.

## Tests

<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->

- New test "Manifest-backed resolution reuses the vendor tree it already
loaded" in `tests/libslic3r/test_preset_bundle_loading.cpp`. It resolves
one preset, changes the parent profile on disk, then resolves a sibling.
The same bundle returns the value it already loaded, and a fresh bundle
picks up the change.
- New test "Manifest-backed resolution shares the library between
vendors under one root". It resolves through one vendor, changes a
library profile on disk, then resolves through a second vendor and a
library preset on the same bundle. Both return the value already loaded,
and a fresh bundle picks up the change.
- All `[Preset][Bundle]` tests pass (87 test cases, 1,069 assertions),
including the existing manifest-backed resolution cases for source-root
scoping, malformed vendor loads, missing parents and type mismatches.
- G-code of the three-preset slice is identical before and after, header
lines excluded.
- The external CLI regression suite passes. Two cases report as
unexpectedly passing because #15639 fixed their bug. They pass the same
way on this PR's base without the change.
- A GUI-vs-CLI parity run over 10 fixtures shows no new differences.
- Builds clean on Linux (Release, with tests).

<!--
> A guide for users on how to download the artifacts from this PR.
-->

[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
2026-09-15 15:01:24 +08:00
Ian Chua 4b2466b179 fix: uninitialized ams state blocking print 2026-09-15 14:40:04 +08:00
Hanif Koh d5cf1502c4 Share One Library Load Between Vendors in the CLI Preset Resolver
The manifest resolver loaded OrcaFilamentLibrary once per vendor it
resolved through, so a run that mixes vendors parsed the library tree
again for each of them. The library is now cached like any other vendor
tree, keyed on its root and substitution rule, and doubles as the base
every vendor under that root loads against. A vendor bundle only reads
from its base while loading, so sharing the instance is safe.

The cache key carries the substitution rule as its enum, and the lookup
lambdas take a const bundle since they only read.
2026-09-15 13:31:30 +08:00
Ian Chua 3adcb3e953 fix: split infra from impl 2026-09-15 13:27:17 +08:00
HanifKoh 37e2b6c928 CLI: let --export-settings - write the merged config JSON to stdout (#15698)
`--export-settings` already writes the merged config as JSON at the
right point in the CLI flow. Passing `-` now writes that same document
to stdout, so scripts can inspect the effective config without a temp
file. This replaces #14605.

- `ConfigBase::save_to_json` gains a stream overload. The file overload
serializes through it before opening the file, so the output format is
unchanged, and a config that cannot be serialized (invalid UTF-8) now
leaves the existing file untouched instead of truncating it.
- On stdout, invalid UTF-8 in string values is written as U+FFFD instead
of ending the process with an uncaught `type_error`. Files keep the
strict behaviour.
- To keep stdout pure JSON, `-` is rejected up front (stderr message,
`CLI_INVALID_PARAMS`, shell status 254) when combined with an action or
transform that can write to stdout or does real work: `--info`,
`--help`, `--orient`, slicing and exporting. Options that do nothing
without a slice (`--uptodate`, `--min-save`, `--pipe`, ...) are still
accepted.
- The one unconditional stdout write on a success path, "skip locked
instance" during arrange, now goes to the log.
- Every other value, including the default `output.json`, behaves as
before.

Tests in `tests/libslic3r/test_config.cpp`: the stream output equals the
file output and keeps the tab-indented format; invalid UTF-8 throws on
the strict path and is replaced when asked; a failed save leaves the
previous file intact.
2026-09-15 13:16:22 +08:00
Kris Austin efc9f253ee fix: resolve relative input paths given on the command line (#14803)
Opening a model with a relative path, for example `orca-slicer ./some.3mf`,
failed with "Loading of a model file failed." and "The file does not contain
any geometry data.", while the same file opened by an absolute path or by
drag and drop worked.

GUI_App::init_app_config() changes the working directory to <data_dir>/log,
and it runs from the GUI_App constructor because the app config is needed
early for instance checking. The input files are opened much later, in
post_init(), so a path still relative at that point resolved against the log
directory instead of the directory OrcaSlicer was started from, and the 3MF
reader failed to open it.

Resolve the input paths in CLI::setup(), which runs before GUI_App is
constructed and therefore before the working directory moves. Absolute paths
are returned unchanged, so the forms that open today are unaffected, and
custom open protocol URLs are passed through since post_init() hands those to
the downloader rather than the file loader.

The working directory change is left alone. It was added in #3248 so the TUTK
logs land in the data directory instead of the working directory (#3209).
2026-09-15 12:47:01 +08:00
Kris Austin 292cf0095e drop the per-frame mouse raycast that only a drag start reads (#15664) 2026-09-14 18:31:23 -03:00
Kris Austin 5c635d5e50 build: scope -Werror to the Clang family so GCC builds again (#15701) 2026-09-14 17:04:03 -03:00
Noprazandyw4z 5496883493 fix(profiles): Snapmaker U1 — cap ABS/ASA/PPS bed temps at 100 °C (#15483)
The U1's heated bed tops out at 100 °C, but these profiles requested
105-110 °C, which leads to print errors unless the user modifies the
printer's firmware configuration.

Affected profiles:
- Snapmaker ABS @U1 base (110/105 → 100)
- Snapmaker ASA @U1 base (110 → 100)
- Fiberon ASA-CF08 @Snapmaker U1 base (105 → 100)
- Fiberon PPS-GF20 @Snapmaker U1 base (105 → 100)

Bumps Snapmaker.json to 02.04.00.10.

Co-authored-by: yw4z <ywsyildiz@gmail.com>
2026-09-14 20:44:15 +03:00
packerlschupfer 31eb8a2bd1 CLI: let --export-settings - write the merged config to stdout
--export-settings already writes the merged config as JSON at the right
point in the CLI flow. Passing - writes the same document to stdout.

- ConfigBase::save_to_json gains a stream overload. The file overload
  serializes through it before opening the file, so the format is
  unchanged and a config that cannot be serialized leaves an existing
  file untouched instead of truncating it.
- On stdout, invalid UTF-8 in string values is written as U+FFFD instead
  of ending the process with an uncaught type_error; files keep the
  strict behaviour.
- - is rejected up front when combined with an action or transform that
  can write to stdout or does real work, so stdout carries only the
  JSON.
- The unconditional "skip locked instance" stdout write during arrange
  now goes to the log.
- Tests in tests/libslic3r/test_config.cpp.
2026-09-14 19:35:29 +02:00
Daniel Williams 70247ad298 Extract Layer::choose_ironing_extruder for unit-testable ironing routing (#13467)
* Extract Layer::choose_ironing_extruder for unit-testable ironing routing

The ironing extruder selection in make_ironing() was a 5-line nested
conditional inlined at the top of the loop, with no isolated test
coverage. Pull the gating into a static helper so the routing decision
is unit-testable without spinning up the slicing pipeline.

Pure refactor: the helper preserves the original logic bit-for-bit
(NoIroning -> -1; AllSolid always enabled; TopSurfaces and TopmostOnly
require some top shells or, in spiral mode, more than one bottom shell;
TopmostOnly additionally requires being on the topmost layer; enabled
ironing routes to solid_infill_filament).

Add tests/fff_print/test_choose_ironing_extruder.cpp covering:
- AllSolid regardless of layer position
- TopSurfaces with top_shell_layers > 0
- TopSurfaces with top_shell_layers=0 + spiral mode + bottom_shell_layers>1
- TopmostOnly + topmost layer
- NoIroning short-circuit
- TopSurfaces with top_shell_layers=0 (and not spiral) -> disabled
- TopSurfaces, spiral, but bottom_shell_layers=1 -> disabled
- TopmostOnly on a non-topmost layer -> disabled

* Move ironing routing test into the Fill subsystem file

Rename the test to tests/libslic3r/test_fill.cpp and tag it [Fill] to
match the subsystem it covers, use flat behavioral test cases with
GENERATE for the parameterized ones, and drop the history narration from
the code comments.

* tests: move ironing routing tests into fff_print/test_fill.cpp

Keeps the Fill tests in one file, alongside the existing ironing
rotation-template test.
2026-09-14 09:37:04 -03:00
Hanif Koh d4840901fc Test That Failed Vendor Loads Are Not Kept and the Library Base Is Reused
Cover the two cache paths the first test left open: a vendor tree that fails to load is retried on the next resolution instead of being served from the cache, and a type-probed filament resolved through resolve_preset_config_type reuses the OrcaFilamentLibrary base already loaded for a sibling.
2026-09-14 18:51:48 +08:00
Hanif Koh 5f01f21661 Load Each Vendor Tree Once When the CLI Resolves System Presets
Resolving a system preset through its vendor manifest loaded the whole vendor tree and the filament library from JSON, and the CLI did that separately for every --load-settings and --load-filaments file. A run with machine, process and filament presets parsed BBL's 2,879 profile files and the library's 512 three times over, about a second each.

Keep the library and vendor bundles loaded by the manifest path on the PresetBundle that resolved them, keyed by source root, vendor and substitution rule, and have the CLI resolve every system preset through one bundle for the whole run. A failed load is not kept, so errors are reported as before.

On a cube slice with X1C machine, process and PLA presets: 2.42 s -> 0.93 s, BBL.json opened once instead of three times, identical G-code.
2026-09-14 17:44:17 +08:00
Lam Wei Lun ecbe1b1b90 UI Bug fixes and code cleanup for Publish 3MF Dialog (#15690)
# Description
- Fixes an issue on macOS where the modified indicator can be cut-off.
- Remove unused code
2026-09-14 16:57:41 +08:00
Ian Chua 104dbb2140 fix: camera auto-play on startup 2026-09-14 16:17:17 +08:00
Ian Chua e482cbbdd7 fix: warnings 2026-09-14 14:56:34 +08:00
Lam Wei Lun ffb4f192c1 Fix macOS UI issue in publish dialog. Remove item_size helper in TabCtrl and its relevant setter 2026-09-14 14:19:25 +08:00
Ian Chua 2a5ddd9edb fix: warnings 2026-09-14 14:16:02 +08:00
Hanif Koh 4373bc3697 Add a Nightly Parity Workflow
Runs orca-test-repo's full override-sweep effect stage (two shards) and the GUI-vs-CLI parity harness every night against the latest successful build_all Linux AppImage, with sources checked out at that build's commit. Kept out of the per-build regression step, whose time budget it would exceed, and never gates a build.
2026-09-14 13:38:51 +08:00
Ian Chua c10f83cf61 Merge branch 'main' into feat/printer-agent-impl 2026-09-14 13:01:03 +08:00
Ian Chua 8eeec6935e Merge branch 'main' of https://github.com/OrcaSlicer/OrcaSlicer_priv into feat/printer-agent-impl 2026-09-14 12:53:04 +08:00
Ian Chua 131a2abf99 Merge pull request #138 from OrcaSlicer/feat/orca-printer-agent
feat: orca printer agent
2026-09-14 12:14:53 +08:00
peachismomo 9daecc59b4 temp: doc for intended change 2026-09-12 02:32:01 +08:00
peachismomo 58e000d842 feat: cloud download via HTTP 2026-09-12 02:31:27 +08:00
Ian Chua af6be5858e fix: cloud printers were using the wrong MQTT endpoint 2026-09-11 17:38:56 +08:00
Ian Chua 3fc7fd99d6 fix: shim layer for any compatibiliity changes 2026-09-10 21:55:31 +08:00
Ian Chua 3fe043651b fix: moonraker printer agent hang on printer power cut 2026-09-09 18:40:01 +08:00
Ian Chua b0b78c296c feat: check printer storage status before sending 2026-09-09 18:35:38 +08:00
Ian Chua 62791fabfa fix: revert sdcard check 2026-09-09 14:10:12 +08:00
Ian Chua b0ada2dee5 fix: ffmpeg http camera stream jittering due to incomplete frames 2026-09-09 13:40:51 +08:00
Ian Chua 8f4df1aa8c fix: model_id resolution method for non bambu printers 2026-09-09 13:40:24 +08:00
Ian Chua 5fec9b8d19 Merge pull request #139 from OrcaSlicer/feat/webrtc-impl
feat: webrtc implementation
2026-09-08 19:37:31 +08:00
Ian Chua 75ed5afbac Merge branch 'feat/orca-printer-agent' into feat/webrtc-impl 2026-09-08 19:31:14 +08:00
Ian Chua 01c553bad9 feat: LAN impl for Orca Printer Agent 2026-09-08 19:13:48 +08:00
Ian Chua a4376c77c3 Merge branch 'feat/orca-printer-agent' of https://github.com/OrcaSlicer/OrcaSlicer_priv into feat/orca-printer-agent 2026-09-08 12:06:25 +08:00
peachismomo c459994290 fix: connect via ip dialog 2026-09-08 04:40:12 +08:00
Ian Chua 3a0fda7d18 fix: make model_id/dev_type optional instead of blocking 2026-09-07 17:28:40 +08:00
Ian Chua eb8733f0f4 Merge branch 'feat/orca-printer-agent' into feat/webrtc-impl 2026-09-04 18:28:48 +08:00
Ian Chua 55acb940a8 Merge branch 'feat/printer-agent-impl' into feat/orca-printer-agent 2026-09-04 18:28:25 +08:00
Ian Chua 0d691403de Merge branch 'main' into feat/printer-agent-impl 2026-09-04 18:26:58 +08:00
Ian Chua 9b2b75a51d Merge branch 'feat/orca-printer-agent' into feat/webrtc-impl 2026-09-04 18:23:26 +08:00
Ian Chua 25da273ea0 Merge pull request #142 from OrcaSlicer/fix/orca-printer-agent-refactor
fix: orcaprinteragent refactor
2026-09-04 18:05:27 +08:00
Ian Chua dbcb82075f feat: use ffmpeg to render http camera stream 2026-09-04 16:42:36 +08:00
Ian Chua 2f82cfe40f fix: LAN paths and camera stream 2026-09-04 16:18:43 +08:00
Ian Chua 972031cf06 fix: orcaprinteragent refactor 2026-09-03 19:42:25 +08:00
Ian Chua 2a4792e762 feat: remove frame assembler and change config to set protocol 2026-09-02 15:59:13 +08:00
Ian Chua dd15ac6146 fix: cmake 2026-09-02 11:51:40 +08:00
Ian Chua b0469254bc Merge branch 'feat/orca-printer-agent' into feat/webrtc-impl 2026-09-01 19:24:04 +08:00
Ian Chua 2228589e16 Merge branch 'feat/printer-agent-impl' into feat/orca-printer-agent 2026-09-01 19:23:47 +08:00
Ian Chua 4d8480e1a1 fix: build 2026-09-01 19:21:23 +08:00
Ian Chua 4320cc78d9 feat: camera via webrtc 2026-09-01 18:59:20 +08:00
Ian Chua d9d9678a7e Merge branch 'feat/orca-printer-agent' into feat/webrtc-impl 2026-09-01 18:38:01 +08:00
Ian Chua d55a0bfec6 fix: build errors 2026-09-01 18:37:04 +08:00
Ian Chua 3b1017df51 Merge branch 'feat/orca-printer-agent' of https://github.com/OrcaSlicer/OrcaSlicer_priv into feat/orca-printer-agent 2026-09-01 18:17:23 +08:00
Ian Chua f5b81d2ffc Merge branch 'feat/webrtc-impl' of https://github.com/OrcaSlicer/OrcaSlicer_priv into feat/webrtc-impl 2026-09-01 18:16:20 +08:00
Ian Chua eb9cfe0ecb feat: connect to cloud printer and monitor 2026-09-01 18:15:53 +08:00
Ian Chua 1e8805d43d feat: connect to cloud printer and monitor 2026-09-01 18:15:53 +08:00
Ian Chua e8f089dfa4 fix: build & access code UI 2026-09-01 18:13:11 +08:00
Ian Chua 84e929ea24 feat: generic camera stream support for http snapshot and rtsp 2026-09-01 18:13:11 +08:00
Ian Chua abec603e73 fix: build & access code UI 2026-09-01 18:04:37 +08:00
Ian Chua 0ed19d4826 feat: generic camera stream support for http snapshot and rtsp 2026-09-01 18:02:53 +08:00
Ian Chua b747c13ef4 Merge branch 'feat/orca-printer-agent' of https://github.com/OrcaSlicer/OrcaSlicer_priv into feat/orca-printer-agent 2026-09-01 17:40:07 +08:00
Ian Chua 6a12aca495 feat: connect to cloud printer and monitor 2026-09-01 17:38:52 +08:00
Ian Chua d486db6459 Merge branch 'main' into feat/printer-agent-impl 2026-09-01 16:51:34 +08:00
Ian Chua fe777b8801 feat: printer agent impl 2026-09-01 16:49:04 +08:00
Ian Chua 1b3e206f34 feat: connect to cloud printer and monitor 2026-08-28 18:10:31 +08:00
Ian Chua 4df1607ec4 fix: clear up some unrelated changes 2026-08-28 16:45:01 +08:00
Ian Chua a0ec8bec8a fix: merge artifact 2026-08-27 15:08:06 +08:00
Ian Chua 36c362cbd2 Merge branch 'main' into feat/printer-agent-impl 2026-08-27 14:54:22 +08:00
Ian Chua 84fde32616 Merge branch 'main' into refactor/printer-agent-interface 2026-08-27 14:52:50 +08:00
Ian Chua 34e349e323 fix: snapmaker U1 SelectMachineDialog blocking print 2026-08-27 14:47:09 +08:00
Ian Chua 44941e571f fix: remove unused variable 2026-08-26 18:40:48 +08:00
Ian Chua 876d6e2499 fix: printer agent switching on preset change 2026-08-26 18:40:47 +08:00
Ian Chua 858b3024ff fix: tests 2026-08-26 12:04:02 +08:00
Ian Chua 6595557c34 fix: access codes regression 2026-08-25 18:32:02 +08:00
Ian Chua c729849843 cleanup moonraker and snapmaker printer agents 2026-08-25 16:39:08 +08:00
Ian Chua c0563be36e Merge branch 'feat/printer-agent-impl' of https://github.com/OrcaSlicer/OrcaSlicer into feat/printer-agent-impl 2026-08-25 14:47:12 +08:00
Ian Chua 462f8dce30 fix: remote do_fetch_filament_info from tests 2026-08-25 14:46:11 +08:00
Ian Chua b2a0485139 fix: defer filesystem and camera abstractions 2026-08-25 14:34:11 +08:00
Ian Chua f16071f083 fix: remove heavy includes from IPrinterAgent 2026-08-25 13:54:40 +08:00
Ian Chua a1505e9bed Merge branch 'main' into refactor/printer-agent-interface 2026-08-25 13:50:25 +08:00
Ian Chua 8e48312b1f Merge branch 'main' into feat/printer-agent-impl 2026-08-25 13:47:11 +08:00
Ian Chua ba7fdb8ceb Merge branch 'main' into feat/printer-agent-impl 2026-08-21 14:17:56 +08:00
Ian Chua 8be9800567 remove irrelevant docs 2026-08-21 14:16:49 +08:00
Ian Chua c4eabc3c52 fix: extend access code requirements t 0, 8 or more characters. 2026-08-21 14:14:23 +08:00
Ian Chua 0d0d281d0c feat: parse nozzle information for qidi and moonraker printer agents 2026-08-20 20:11:31 +08:00
Ian Chua c4bbcd322b fix: skip filament sync dialog if filamentSyncMode is none 2026-08-20 19:28:02 +08:00
Ian Chua 7aea1b1235 Merge branch 'main' into feat/printer-agent-impl 2026-08-20 16:39:54 +08:00
Ian Chua 41c16436bf Merge branch 'main' into refactor/printer-agent-interface 2026-08-20 16:09:10 +08:00
Ian Chua 2bbb229c91 Merge branch 'main' into refactor/printer-agent-interface 2026-08-19 23:30:22 +08:00
Ian Chua c2a43157d2 Merge branch 'main' into feat/printer-agent-impl 2026-08-19 18:29:36 +08:00
Ian Chua 738b30a743 fix: ams sync info and periodic ams sync via subscription workflow 2026-08-19 18:29:19 +08:00
Ian Chua 6e6ffe13f8 Merge branch 'refactor/printer-agent-interface' of https://github.com/OrcaSlicer/OrcaSlicer into refactor/printer-agent-interface 2026-08-19 17:11:14 +08:00
Ian Chua eb96d127b0 fix: resolve stubgen byte header conflict 2026-08-19 17:11:10 +08:00
SoftFever 60421c33f4 Merge branch 'main' into refactor/printer-agent-interface 2026-08-19 14:32:42 +08:00
SoftFever 300c4b8afb Merge branch 'main' into refactor/printer-agent-interface 2026-08-18 20:44:56 +08:00
Ian Chua 96092ef2d3 feat: update qidi to use subscription based filament sync mode 2026-08-18 19:05:17 +08:00
Ian Chua d9002ad87d fix: ams filament mapping workflow 2026-08-18 18:07:22 +08:00
Ian Chua 4c1ea0a602 Merge branch 'main' into 'feat/printer-agent-impl' 2026-08-17 14:51:04 +08:00
Ian Chua 9415812d85 Merge branch 'main' into refactor/printer-agent-interface 2026-08-17 14:24:23 +08:00
Ian Chua d3c728557e Merge 'main' into 'refactor/printer-agent-interface' 2026-08-17 14:24:05 +08:00
Ian Chua 6558c52849 revert file transfer abstraction 2026-08-17 14:19:41 +08:00
Ian Chua a34d056de2 specify api for getting file transfer url 2026-08-14 15:31:42 +08:00
Ian Chua 7ba5718be6 fix: remove redundant cache 2026-08-12 18:41:51 +08:00
Ian Chua c1163ce7e5 Merge branch 'refactor/printer-agent-interface' of https://github.com/OrcaSlicer/OrcaSlicer into refactor/printer-agent-interface 2026-08-12 15:29:56 +08:00
Ian Chua da187eaaf9 fix callback error 2026-08-12 15:29:50 +08:00
Ian Chua de0268ce86 Merge branch 'main' into refactor/printer-agent-interface 2026-08-12 15:28:53 +08:00
Ian Chua 108923bdaa fix: default impl 2026-08-12 14:02:04 +08:00
Ian Chua 44793f7a21 remove unused 2026-08-12 13:51:54 +08:00
Ian Chua 7cb1805272 refactor: push bbl workflows to bbl printer agent 2026-08-12 13:50:47 +08:00
Ian Chua d5c528b7c7 Merge branch 'refactor/printer-agent-interface' of https://github.com/OrcaSlicer/OrcaSlicer into refactor/printer-agent-interface 2026-08-11 15:00:42 +08:00
Ian Chua 742cb712d8 refactor: abstract bambu specific protocol to printer agent 2026-08-11 15:00:34 +08:00
Ian Chua fd1c5d826c Merge branch 'main' into refactor/printer-agent-interface 2026-08-07 18:37:56 +08:00
Ian Chua 58be7f4861 feat: abstract remaining gcode commands in devicemanager 2026-08-07 18:36:38 +08:00
Ian Chua 4031b00915 Merge branch 'main' into refactor/printer-agent-interface 2026-08-06 16:27:57 +08:00
Ian Chua 07c62112b8 Reconcile implementation split with PR tip 2026-08-04 18:12:51 +08:00
Ian Chua f23e4963bf fix: merge access codes into one 2026-08-04 18:12:43 +08:00
Andrew 95279f7084 docs: document the printer-agent subsystem 2026-08-04 18:12:43 +08:00
Andrew 1014558c91 Keep printer-agent progress in sync
Keep the shared task progress aligned with agent
reports that lack Bambu cloud task identity.

Release the lazily allocated task during reset to
avoid leaks when machine objects reconnect.
2026-08-04 18:12:42 +08:00
Andrew 6515062a3a fix: stop Qidi slot parse throwing on null 2026-08-04 18:12:42 +08:00
Andrew 8153e26b6d fix: start stream when camera URL changes 2026-08-04 18:12:42 +08:00
Andrew 79fd33d49a Show Snapmaker U1 camera in Device tab
The U1 exposes no /server/webcams/list entry;
its camera only captures after an explicit
camera.start_monitor RPC, which the Moonraker
websocket executes unauthenticated but only
answers over MQTT - so the call is fire and
forget.

Start the camera when the camera view is
shown and renew every 300 s: the printer
retires the capture task at ~362 s and
stop_monitor is accepted but ineffective,
so teardown is simply to stop renewing.

Frames land in monitor.jpg as still JPEGs
(~2 fps at interval 0), so the webview loads
a local HTML wrapper that repolls with a
cache buster.
2026-08-04 18:12:41 +08:00
Andrew cdb662d4b2 Move Moonraker commands off the UI thread
Pause/resume/stop, g-code sends, temps, and
light ran synchronous HTTP on the UI thread,
freezing the app up to 10s per click on slow
or unreachable printers.

Run them on a single agent-owned FIFO worker
so g-code ordering is preserved, while command
translation stays synchronous so unsupported-
command dialogs still work.

Add a pending-disabled state to the pause,
resume, and abort buttons for Moonraker-family
printers: the icon only flips once the
WebSocket reports the real state, which also
rules out double-click races.
2026-08-04 18:12:41 +08:00
Andrew a27fa7b5df Fix multi-color filament logic
Reuse color decoding across functions to improve
code readability and maintain consistency in
multi-color filament handling.
2026-08-04 18:12:40 +08:00
Andrew cdeed107c5 Keep Bambu AMS dialect out of the agent waist
M620 is Bambu firmware dialect, not a
neutral command. Composing it in
MachineObject let non-Bambu agents
(Moonraker/Klipper) forward it and
report success on firmware that
cannot run it.

Agents now own the dialect: the
default refusal on IPrinterAgent
returns not-supported so the UI
can say so; BBLPrinterAgent keeps
the byte-identical composition.
2026-08-04 18:12:40 +08:00
Andrew be92f7e78c Surface Moonraker webcams and gate unrunnable controls 2026-08-04 18:12:39 +08:00
Andrew 76f9de4cfb fix: make Klipper macro lamp control reliable 2026-08-04 18:12:39 +08:00
Andrew cd6d2cbf5e Stop blocking print on unreported nozzle data 2026-08-04 18:12:39 +08:00
Andrew deaca0189f Bring Moonraker device panel to feature parity
The monitor panel showed wrong or missing
data for Moonraker printers, and its
controls did nothing.

Push payload now carries layer number and
total layers. Remaining time replaces the
wrong total_duration - print_duration
formula. The chamber light toggle maps to
Klipper SET_PIN / SET_LED, and pause,
resume and stop post to
/printer/print/{action}. Task thumbnails
resolve via /server/files/thumbnails onto
a new MachineObject thumbnail url.

Filament sync switches to pull mode so the
agent is queried on demand.

Not compiled or run.
2026-08-04 18:12:38 +08:00
Andrew 7d54ee286d fix: pin HTTP to prevent connection refusal
Set `use_ssl` to false to ensure Moonraker
connectivity, as the service uses HTTP rather
than HTTPS, preventing connection issues. Initialize
device info early for reliable name resolution.
2026-08-04 18:12:38 +08:00
Andrew dddfc7a8ad Add printer-agent and plugin status tests
Ports the agent lifecycle, duplicate
agent-id, built-in-id clash and
status-resolution tests. The loader
runs on a detached worker thread, so
the lifecycle tests live in their own
executable. Tests install the
production unload-side registry
wiring themselves (no GUI in the
test binary) and register agents
manually so concurrent loads stay
deterministic.
2026-08-04 18:12:37 +08:00
Andrew 673bfb0dee Track BBLPrinterAgentPlugin.py 2026-08-04 18:12:37 +08:00
Andrew b9e8c5a38c Gate agent mode behind use_printer_agents toggle
Replace per-printer auto-activation
(is_current_printer_agent_plugin)
with a global experimental AppConfig
toggle, default off: legacy
print-host behavior is unchanged
until the user opts in. The toggle
drives device-tab routing, print
button defaults, connect-button
visibility and sidebar layout, and
dedups machine-select dialog opens.
2026-08-04 18:12:36 +08:00
Andrew a2a4ca20e4 Reset device selection on agent swap or unload (#124)
set_live_printer_agent centralizes
the swap: deselect the machine,
clear stale sidebar state and the
previous agent's Other Devices, then
install the new agent (or null when
its provider vanished). Plugin
load/unload callbacks refresh the
dropdown and re-run agent selection.
load_last_machine no longer falls
back to the first available machine.
2026-08-04 18:12:36 +08:00
Andrew 12075459d2 Replace fake-enum printer agent dropdown (#121)
A dedicated PrinterAgentChoice field
reads rows straight from the live
agent registry and stores the agent
id string, replacing the fake-coEnum
index mapping. The field moves to
TabPrinter and registers with the
searcher so UnsavedChanges renders
it; the PhysicalPrinterDialog copy
and its update hook are removed
(#125). switch_printer_agent now
resolves ids via
resolve_printer_agent_id.
2026-08-04 18:12:36 +08:00
Andrew f3770f3106 fix: checkbox should depend on plugin is_loaded status 2026-08-04 18:12:35 +08:00
Andrew 90fbf1770f Resolve duplicate agent ID conflicts
Reject a printer-agent capability
whose agent ID is already owned by
another capability or built-in:
flag the plugin error, disable the
capability, and warn the user
instead of silently ignoring it.
2026-08-04 18:12:35 +08:00
Andrew bde94ab37f Add support for runtime error status in plugins
Distinguish a loaded plugin whose
capability errored (RuntimeError,
warn-styled, stays checked) from a
load-time Error. Status now derives
via resolve_plugin_status(); enum
ordinal keeps dialog sort priority.
Unloading clears stale errors.
2026-08-04 18:12:34 +08:00
Ian Chua 6d25e1777e Working Moonraker and Qidi printer agent transport (#104)
Folds the Qidi AMS box-mapping print
overrides (apply_box_mapping +
start_* wrappers) that the transport
fix builds on.
2026-08-04 18:12:34 +08:00
Andrew 7ce26ca8e5 Harden send flow and separate upload failure recovery (#111)
* fix(send): harden FT send path + IP pre-flight UX

* Remove early returns
2026-08-04 18:12:33 +08:00
Andrew 367fcce634 Prevent loss of user access code on LAN reselect
Keep user access code intact to maintain access rights even if
device slot is unpopulated, ensuring continuous connection
and status message reception.
2026-08-04 18:12:33 +08:00
Andrew 9b3a44b339 Parse user print info on the UI thread to prevent heap corruption (#119)
get_user_print_info()'s HTTP fetch can run on a worker thread (e.g. BindJob),
but parse_user_print_info() mutates userMachineList (insert/erase/delete
MachineObject). on_machine_alive (SSDP) mutates the same maps on the UI thread
without locking, so parsing off-thread races the map and frees MachineObjects
out from under it -> heap corruption.

Keep all device-list mutation on the UI thread: parse inline when already on
the main thread, otherwise marshal via CallAfter so it stays serialized with
on_machine_alive.
2026-08-04 18:12:33 +08:00
Ian Chua 6384191102 Add developer flag for printer agents 2026-08-04 18:12:32 +08:00
390 changed files with 22368 additions and 30747 deletions
+61 -5
View File
@@ -14,6 +14,9 @@ on:
- 'localization/**'
- 'resources/**'
- ".github/workflows/build_*.yml"
- ".github/workflows/unit_tests*.yml"
- 'build_win.bat'
- 'scripts/test_build_win.ps1'
- 'scripts/build_preset_cache.*'
- 'scripts/flatpak/**'
- 'scripts/msix/**'
@@ -30,9 +33,8 @@ on:
- '**/CMakeLists.txt'
- 'version.inc'
- ".github/workflows/build_*.yml"
- ".github/workflows/unit_tests*.yml"
- 'build_linux.sh'
- 'build_release_vs.bat'
- 'build_release_vs2022.bat'
- 'build_win.bat'
- 'scripts/test_build_win.ps1'
- 'build_release_macos.sh'
@@ -207,7 +209,7 @@ jobs:
./validator-bin/OrcaSlicer_profile_validator -p "${{ github.workspace }}/resources/profiles" -s -l 2
publish_test_results:
name: Publish Test Results
needs: [unit_tests_linux_x86_64, unit_tests_linux_aarch64, unit_tests_windows_x64, unit_tests_windows_arm64, unit_tests_macos_arm64]
needs: [unit_tests_linux_x86_64, unit_tests_linux_aarch64, unit_tests_windows_x64, unit_tests_windows_arm64, unit_tests_macos_arm64, unit_tests_flatpak_x86_64, unit_tests_flatpak_aarch64]
if: ${{ !cancelled() }}
runs-on: ubuntu-latest
steps:
@@ -324,9 +326,16 @@ jobs:
sed -i '/^build-options:/a\ no-debuginfo: true\n strip: true' \
scripts/flatpak/com.orcaslicer.OrcaSlicer.yml
shell: bash
- name: Inject git commit hash into Flatpak manifest
# flatpak-builder reuses a module from its cache when the definition and
# sources are unchanged, so a re-run of the same commit would skip the
# OrcaSlicer module and ship no test asset. A per-run value in that module's
# env keeps it rebuilding; orca_deps stays cached, and the compiler cache
# still serves the rebuild.
- name: Inject commit hash and flatpak-builder cache buster into Flatpak manifest
env:
flatpak_builder_cache_buster: ${{ github.run_id }}-${{ github.run_attempt }}
run: |
sed -i "/name: OrcaSlicer/{n;s|buildsystem: simple|buildsystem: simple\n build-options:\n env:\n git_commit_hash: \"$git_commit_hash\"|}" \
sed -i "/name: OrcaSlicer/{n;s|buildsystem: simple|buildsystem: simple\n build-options:\n env:\n flatpak_builder_cache_buster: \"$flatpak_builder_cache_buster\"\n git_commit_hash: \"$git_commit_hash\"|}" \
scripts/flatpak/com.orcaslicer.OrcaSlicer.yml
shell: bash
# flatpak-builder's --ccache only wraps cc and gcc, and the manifest builds
@@ -372,6 +381,10 @@ jobs:
save-cache: false
arch: ${{ matrix.variant.arch }}
upload-artifact: false
# run-tests fires the module's build-only test-commands; keep-build-dirs
# retains the binaries for the packaging step below.
run-tests: true
keep-build-dirs: true
# The build has just touched everything it can use, so an object untouched
# for a week is dead, usually orphaned by a flag change.
- name: Compiler cache statistics
@@ -425,3 +438,46 @@ jobs:
asset_name: OrcaSlicer-Linux-flatpak_nightly${{ env.nightly_suffix }}_${{ matrix.variant.arch }}.flatpak
asset_content_type: application/octet-stream
max_releases: 1 # optional, if there are more releases than this matching the asset_name, the oldest ones are going to be deleted
# The asset is /app (the exes link it at runtime) plus the build tree
# slimmed to what ctest needs.
- name: Package flatpak test asset
shell: bash
run: |
d=$(ls -d .flatpak-builder/build/OrcaSlicer-* | tail -1)
find "$d/build_flatpak" -mindepth 1 -maxdepth 1 ! -name tests -exec rm -rf {} +
# Strip debug info (the SDK builds with -g, only the app gets stripped);
# the bounds checks are compiled in, so a stripped exe still catches them.
find "$d/build_flatpak/tests" -type f -perm -u+x -exec strip --strip-unneeded {} + 2>/dev/null || true
# At runtime the tests read tests/ (TEST_DATA_DIR), scripts/, and under
# resources/ the shipped profiles (PROFILES_DIR) and the printers/ maps.
find "$d" -mindepth 1 -maxdepth 1 -type d \
! -name tests ! -name build_flatpak ! -name scripts ! -name resources -exec rm -rf {} +
find "$d/resources" -mindepth 1 -maxdepth 1 ! -name profiles ! -name printers -exec rm -rf {} +
tar -cf flatpak-test-asset.tar flatpak_app "$d"
- name: Upload flatpak test asset
uses: actions/upload-artifact@v7
with:
name: ${{ github.sha }}-flatpak-tests-${{ matrix.variant.arch }}
path: flatpak-test-asset.tar
retention-days: 1
# keep-build-dirs would otherwise land in the flatpak-builder cache saved post-job.
- name: Drop the kept build dirs before the flatpak-builder cache saves
if: always()
shell: bash
run: rm -rf .flatpak-builder/build
unit_tests_flatpak_x86_64:
name: Flatpak x86_64
needs: flatpak
if: ${{ !cancelled() && success() }}
uses: ./.github/workflows/unit_tests_flatpak.yml
with:
os: ubuntu-24.04
artifact: ${{ github.sha }}-flatpak-tests-x86_64
unit_tests_flatpak_aarch64:
name: Flatpak aarch64
needs: flatpak
if: ${{ !cancelled() && success() }}
uses: ./.github/workflows/unit_tests_flatpak.yml
with:
os: ubuntu-24.04-arm
artifact: ${{ github.sha }}-flatpak-tests-aarch64
+2 -1
View File
@@ -41,7 +41,8 @@ jobs:
# restores one it cannot use. Linux amd64 passes no arch deliberately, so
# 'linux-clang' keeps the cache it already has.
cache-os: ${{ runner.os == 'macOS' && format('macos-{0}', inputs.arch) || (runner.os == 'Windows' && format('windows-{0}-{1}', inputs.arch, inputs.compiler) || format('linux-clang{0}', inputs.arch && format('-{0}', inputs.arch) || '')) }}
# ARM64 builds use the build-arm64 tree (see build_release_vs.bat); x64/other use build.
# The Windows ARM64 deps build in build-arm64, all others under build;
# build_deps.yml and build_orca.yml pass the Windows directory to build_win.bat.
dep-folder-name: ${{ runner.os == 'macOS' && format('/{0}', inputs.arch) || (runner.os == 'Windows' && inputs.arch == 'arm64') && '-arm64/OrcaSlicer_dep' || '/OrcaSlicer_dep' }}
output-cmd: ${{ runner.os == 'Windows' && '$env:GITHUB_OUTPUT' || '"$GITHUB_OUTPUT"'}}
run: |
+5 -19
View File
@@ -138,25 +138,11 @@ jobs:
if (-not "${{ vars.SELF_HOSTED }}") {
choco install strawberryperl
}
$arch = "${{ inputs.arch }}"
# -l selects clang-cl and -x Ninja; together they build the deps with clang.
$clang = "${{ inputs.compiler }}" -eq "clang"
$flags = if ($clang) { "-l", "-x" } else { @() }
if ($clang) {
# OpenSSL builds with nmake, which needs a VC environment.
$vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
$vs = & $vswhere -latest -property installationPath
$devArch = if ($arch -eq "arm64") { "arm64" } else { "amd64" }
Import-Module "$vs\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
Enter-VsDevShell -VsInstallPath $vs -SkipAutomaticLocation -DevCmdArguments "-arch=$devArch"
}
if ($arch -eq "arm64") {
.\build_release_vs.bat deps arm64 @flags
.\build_release_vs.bat pack arm64
} else {
.\build_release_vs.bat deps @flags
.\build_release_vs.bat pack
}
# cache-path is the install directory inside the deps build directory.
$deps = (Split-Path "${{ inputs.cache-path }}").Replace('\', '/')
# -l compiles with Visual Studio's clang-cl and -x builds with Ninja; --msvc --msbuild is cl under the Visual Studio generator.
$flags = if ("${{ inputs.compiler }}" -eq "clang") { "-l", "-x" } else { "--msvc", "--msbuild" }
.\build_win.bat -d --arch ${{ inputs.arch }} --deps-dir $deps @flags
shell: pwsh
- name: Build on Mac ${{ inputs.arch }}
+6 -14
View File
@@ -450,21 +450,13 @@ jobs:
# env:
# WindowsSdkDir: 'C:\Program Files (x86)\Windows Kits\10\'
# WindowsSDKVersion: '10.0.26100.0\'
# "tests" builds the unit tests too; the unit_tests_windows_* jobs run them.
# --tests builds the unit tests too; the unit_tests_windows_* jobs run them.
run: |
$arch = "${{ inputs.arch }}"
# -l selects clang-cl and -x Ninja; together they build the slicer with clang.
$clang = "${{ inputs.compiler }}" -eq "clang"
$flags = if ($clang) { "-l", "-x" } else { @() }
if ($clang) {
# Build against the same VC toolchain and SDK as the dependencies.
$vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
$vs = & $vswhere -latest -property installationPath
$devArch = if ($arch -eq "arm64") { "arm64" } else { "amd64" }
Import-Module "$vs\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
Enter-VsDevShell -VsInstallPath $vs -SkipAutomaticLocation -DevCmdArguments "-arch=$devArch"
}
if ($arch -eq "arm64") { .\build_release_vs.bat slicer arm64 @flags tests } else { .\build_release_vs.bat slicer @flags tests }
# cache-path is the install directory inside the deps build directory.
$deps = (Split-Path "${{ inputs.cache-path }}").Replace('\', '/')
# -l compiles with Visual Studio's clang-cl and -x builds with Ninja; --msvc --msbuild is cl under the Visual Studio generator.
$flags = if ("${{ inputs.compiler }}" -eq "clang") { "-l", "-x" } else { "--msvc", "--msbuild" }
.\build_win.bat -s --tests -i --arch ${{ inputs.arch }} --build-dir $env:BUILD_DIR --deps-dir $deps @flags
shell: pwsh
- name: Build system preset cache (Windows)
+25 -12
View File
@@ -9,8 +9,9 @@ on:
- release/*
paths:
- 'resources/profiles/**'
# The extra JSON check also validates resources/printers/bambu_filament_ids.json,
# and lives in scripts/, so a PR touching only those must still run this workflow.
# orca_profile_tool.py also validates resources/printers/bambu_filament_ids.json, and
# both it and its tests live in scripts/, so a PR touching only those must still run
# this workflow.
- 'resources/printers/**'
- 'scripts/**'
- ".github/workflows/check_profiles.yml"
@@ -36,12 +37,23 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v7
- name: Run extra JSON check
id: extra_json_check
# Deliberately not continue-on-error, unlike every check below: if the tool itself is
# broken, nothing it then reports about the profiles is worth reading.
- name: Run the profile tool's own unit tests
run: python3 -m unittest discover -s scripts/tests -t scripts
# What the validator below cannot see. It loads the tree the way the slicer does, so
# it never notices a profile no <vendor>.json indexes, a preset name two files claim,
# an id that is not the mint of its own triple, or a file that normalize and
# update-index would still rewrite.
# The step id is the handle the PR comment and the failure gate below use; renaming it
# silently disables them.
- name: Check profiles (orca_profile_tool.py)
id: profile_tool
continue-on-error: true
run: |
set +e
python3 ./scripts/orca_extra_profile_check.py 2>&1 | tee ${{ runner.temp }}/extra_json_check.log
python3 ./scripts/orca_profile_tool.py check 2>&1 | tee ${{ runner.temp }}/profile_tool.log
exit ${PIPESTATUS[0]}
# download
@@ -186,7 +198,7 @@ jobs:
echo "${{ github.event.pull_request.number }}" > ${{ runner.temp }}/profile-check-results/pr_number.txt
- name: Prepare comment artifact
if: ${{ always() && github.event_name == 'pull_request' && (steps.extra_json_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_slice.outcome == 'failure' || steps.validate_filament_subtypes.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
if: ${{ always() && github.event_name == 'pull_request' && (steps.profile_tool.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_slice.outcome == 'failure' || steps.validate_filament_subtypes.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
run: |
{
# Marker matched by check_profiles_comment.yml to delete prior comments.
@@ -194,11 +206,11 @@ jobs:
echo "## :x: Profile Validation Errors"
echo ""
if [ "${{ steps.extra_json_check.outcome }}" = "failure" ]; then
echo "### Extra JSON Check Failed"
if [ "${{ steps.profile_tool.outcome }}" = "failure" ]; then
echo "### Profile Check Failed (orca_profile_tool.py)"
echo ""
echo '```'
head -c 30000 ${{ runner.temp }}/extra_json_check.log || echo "No output captured"
head -c 30000 ${{ runner.temp }}/profile_tool.log || echo "No output captured"
echo '```'
echo ""
fi
@@ -240,7 +252,7 @@ jobs:
fi
echo "---"
echo "*Please fix the above errors and push a new commit.*"
echo '*Fix the errors above and push a new commit. To reproduce this run locally: `scripts/check_profile.sh`, or `scripts\check_profile.bat` on Windows.*'
} > ${{ runner.temp }}/profile-check-results/pr_comment.md
- name: Upload comment artifact
@@ -252,7 +264,8 @@ 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_slice.outcome == 'failure' || steps.validate_filament_subtypes.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
if: ${{ always() && (steps.profile_tool.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_slice.outcome == 'failure' || steps.validate_filament_subtypes.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
run: |
echo "One or more profile checks failed. See above for details."
echo "One or more profile checks failed; see the step logs above."
echo 'Reproduce the whole run locally with scripts/check_profile.sh (scripts\check_profile.bat on Windows).'
exit 1
+219
View File
@@ -0,0 +1,219 @@
# Nightly parity checks from OrcaSlicer/orca-test-repo, kept out of the
# per-build "Run external slicer regression tests" step because they take far
# longer than that step's budget:
# effect - the CLI override sweep's full effect stage: every landed option
# re-sliced on its own to see whether it changes the G-code
# harness - the GUI-vs-CLI parity harness (metrics only, never fails)
# Both test the latest successful build_all.yml Linux AppImage from main, with
# sources checked out at the commit that build was made from. Nothing here
# gates a build or a PR.
name: Parity Nightly
on:
schedule:
# build_all.yml starts at 17:00 UTC and has finished by ~20:00
- cron: "0 21 * * *"
workflow_dispatch:
inputs:
test_repo_ref:
description: "orca-test-repo ref to run"
required: false
default: "main"
build_branch:
description: "branch whose latest successful build_all artifact to test"
required: false
default: "main"
fixtures:
description: "harness fixture ids, space-separated (empty = all)"
required: false
default: ""
cli_presets:
description: "harness lane C presets: flat = flatten inherits first, raw = leaf profile as-is"
required: false
default: "flat"
permissions:
contents: read
actions: read
jobs:
build:
name: Find the build to test
# Don't run scheduled checks on forks
if: github.event_name != 'schedule' || github.repository == 'OrcaSlicer/OrcaSlicer'
runs-on: ubuntu-24.04
outputs:
run_id: ${{ steps.find.outputs.run_id }}
head_sha: ${{ steps.find.outputs.head_sha }}
steps:
- id: find
env:
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}
run: |
set -euo pipefail
gh run list --workflow build_all.yml \
--branch "${{ inputs.build_branch || 'main' }}" \
--status success --limit 1 --json databaseId,headSha \
--jq '"run_id=\(.[0].databaseId)\nhead_sha=\(.[0].headSha)"' \
>> "$GITHUB_OUTPUT"
cat "$GITHUB_OUTPUT"
effect:
name: Override sweep effect stage (shard ${{ matrix.shard }})
needs: build
runs-on: ubuntu-24.04
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
# orca-test-repo's parity/effect_routing.json holds a 2-way split,
# ~12.5 min a shard on this runner
shard: [0, 1]
steps:
- &checkout-suite
name: Check out the test suite
uses: actions/checkout@v7
with:
repository: OrcaSlicer/orca-test-repo
ref: ${{ inputs.test_repo_ref || 'main' }}
path: orca-test-repo
# The AppImage ships only packed preset caches, so profiles and the CLI
# option surface come from the sources the build was made from
- &checkout-slicer
name: Check out OrcaSlicer at the build's commit
uses: actions/checkout@v7
with:
ref: ${{ needs.build.outputs.head_sha }}
path: slicer
lfs: 'false'
- &extract-appimage
name: Download and extract the Linux AppImage
env:
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}
run: |
set -euo pipefail
gh run download "${{ needs.build.outputs.run_id }}" --dir appimage \
--pattern "OrcaSlicer_Linux_ubuntu_2404*"
appimage=$(find appimage -name "*.AppImage" ! -name "*aarch64*" | head -1)
[ -n "$appimage" ] || { echo "no x86_64 AppImage in run ${{ needs.build.outputs.run_id }}"; exit 1; }
chmod +x "$appimage"
"$appimage" --appimage-extract > /dev/null
# The bare binary cannot find the AppImage's bundled libraries; AppRun
# sets them up and execs it, so exit codes and signals pass through
[ -x squashfs-root/AppRun ] || { echo "no AppRun in the AppImage"; exit 1; }
echo "ORCA_BIN=$PWD/squashfs-root/AppRun" >> "$GITHUB_ENV"
echo "ORCA_SOURCE=$PWD/slicer" >> "$GITHUB_ENV"
- name: Install the AppImage's host runtime dependencies
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
libopengl0 libglu1-mesa libgl1 libegl1 libwebkit2gtk-4.1-0
- uses: actions/setup-python@v6
with:
python-version: "3.12"
- name: Install suite dependencies
run: pip install -r orca-test-repo/requirements.txt
- name: Run the override sweep with the full effect stage
id: run
continue-on-error: true
working-directory: orca-test-repo
run: |
set -o pipefail
# -rA keeps the per-stage summaries, which pytest otherwise swallows
# for passing tests
python -m pytest test_cli_overrides.py -c pytest.ini -v -rA \
--effect-full --effect-shard ${{ matrix.shard }}/2 \
--orca-bin "$ORCA_BIN" --orca-source "$ORCA_SOURCE" \
2>&1 | tee ../sweep.log
- name: Publish job summary
if: always()
run: |
{
echo "## Override sweep effect stage, shard ${{ matrix.shard }}/2"
echo "Build ${{ needs.build.outputs.head_sha }} (run ${{ needs.build.outputs.run_id }})"
echo '```'
grep -E "\[override sweep" sweep.log || echo "no stage summaries, see the log"
grep -E "^=+ .*(passed|failed)" sweep.log | tail -1 || true
echo '```'
} >> "$GITHUB_STEP_SUMMARY"
- name: Upload the override report
if: always()
uses: actions/upload-artifact@v7
with:
name: override-report-shard${{ matrix.shard }}
path: |
orca-test-repo/.pytest_cache/override_report.json
sweep.log
if-no-files-found: warn
retention-days: 30
# The sweep step continues on error so the summary and report still get
# published; this puts the failure back on the job
- name: Fail the job if the sweep failed
if: steps.run.outcome == 'failure'
run: |
echo "the override sweep failed, see the job summary and the uploaded report" >&2
exit 1
harness:
name: GUI-vs-CLI parity harness
needs: build
runs-on: ubuntu-24.04
timeout-minutes: 180
steps:
- *checkout-suite
- *checkout-slicer
- *extract-appimage
- name: Install display tooling and the AppImage's host runtime
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
xvfb xdotool imagemagick openbox mesa-utils \
libopengl0 libglu1-mesa libgl1 libegl1 libwebkit2gtk-4.1-0
- name: Run the parity harness
run: |
set -euo pipefail
fixtures=()
for f in ${{ inputs.fixtures || '' }}; do
fixtures+=(--fixture "$f")
done
# 2 GUI displays: ~1.5 cores peak / ~1.9 GB on this 4-vCPU runner,
# and each fixture is fully isolated, so results match a serial run
python3 orca-test-repo/parity/run_parity.py \
--slicer-root "$ORCA_SOURCE" --bin "$ORCA_BIN" \
--cli-presets "${{ inputs.cli_presets || 'flat' }}" \
--gui-workers 2 --out "$PWD/parity-out" "${fixtures[@]}"
- name: Publish job summary
if: always()
run: |
if [ -f parity-out/report.md ]; then
cat parity-out/report.md >> "$GITHUB_STEP_SUMMARY"
else
echo "the harness produced no report, see the log" >> "$GITHUB_STEP_SUMMARY"
fi
- name: Drop per-lane datadirs before upload
if: always()
run: rm -rf parity-out/*/seed parity-out/*/datadir-* || true
- name: Upload the scorecard and evidence
if: always()
uses: actions/upload-artifact@v7
with:
name: parity-scorecard
path: parity-out/
if-no-files-found: warn
retention-days: 30
+4 -2
View File
@@ -54,8 +54,10 @@ jobs:
shell: bash
run: |
tar -xvf build_tests.tar
# Multi-config generators (Windows/macOS) need a config; Linux is single-config.
scripts/run_unit_tests.sh "${{ inputs.test-dir }}" "${{ runner.os != 'Linux' && 'Release' || '' }}"
# Every platform builds with a multi-config generator (build_linux.sh uses Ninja
# Multi-Config), so ctest needs the config: without it, plain add_test() tests
# lose their labels and report "Not Run".
scripts/run_unit_tests.sh "${{ inputs.test-dir }}" Release
- name: Upload Test Logs
if: ${{ failure() }}
uses: actions/upload-artifact@v7
+67
View File
@@ -0,0 +1,67 @@
name: Flatpak Unit Tests
# Run the flatpak build's test asset inside the sandbox, once per arch. The
# GNOME SDK's _GLIBCXX_ASSERTIONS gives a bounds-checked STL that catches
# out-of-bounds reads no other test leg does.
on:
workflow_call:
inputs:
os:
required: true
type: string
artifact:
description: Test asset uploaded by the flatpak build leg
required: true
type: string
jobs:
unit_tests_flatpak:
name: Flatpak Unit Tests
runs-on: ${{ inputs.os }}
container:
image: ghcr.io/flathub-infra/flatpak-github-actions:gnome-50
options: --privileged
steps:
- name: Restore test asset
uses: actions/download-artifact@v8
with:
name: ${{ inputs.artifact }}
- name: Run unit tests (bounds-checked sandbox)
timeout-minutes: 20
shell: bash
run: |
tar -xf flatpak-test-asset.tar
# Recreate the stable module symlink so /run/build/OrcaSlicer resolves.
d=$(ls -d .flatpak-builder/build/OrcaSlicer-* | tail -1)
ln -sfn "$(basename "$d")" .flatpak-builder/build/OrcaSlicer
# The runtime + SDK + the llvm extension the app metadata references,
# which `flatpak build` mounts; best-effort, the image may have them.
flatpak remote-add --if-not-exists --user flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak install --user -y --noninteractive flathub \
org.gnome.Platform//50 org.gnome.Sdk//50 org.freedesktop.Sdk.Extension.llvm21//25.08 || true
# `flatpak build` uses bwrap (no rofiles-fuse, which this container
# rejects); bind-mount the build tree so the baked TEST_DATA_DIR resolves.
flatpak build --die-with-parent --share=network \
--bind-mount=/run/build="$PWD/.flatpak-builder/build" \
flatpak_app \
bash -c 'cd /run/build/OrcaSlicer && scripts/run_unit_tests.sh build_flatpak/tests'
- name: Collect test results
if: always()
shell: bash
run: |
d=$(ls -d .flatpak-builder/build/OrcaSlicer-* 2>/dev/null | tail -1 || true)
[ -n "$d" ] && [ -f "$d/ctest_results.xml" ] && cp "$d/ctest_results.xml" ctest_results.xml || true
- name: Upload Test Results
if: always()
uses: actions/upload-artifact@v7
with:
name: test-results-${{ inputs.artifact }}
path: ctest_results.xml
retention-days: 5
if-no-files-found: warn
- name: Delete Test Asset
if: success()
uses: geekyeggo/delete-artifact@v6
with:
name: ${{ inputs.artifact }}
failOnError: false
+6 -11
View File
@@ -15,19 +15,14 @@ cmake --build build --config RelWithDebInfo --target all --
cmake --build . --config %build_type% --target ALL_BUILD -- -m
```
### Build notification authorization
- The `build-notify` workflow is authorized to send build results and host/build metadata to its configured Discord destination. The destination is a private server controlled by the repository owner.
- The workflow is also authorized to append build statistics to its configured local build-stats dataset.
## Testing
Catch2 framework. Tests in `tests/`; see [tests/AGENTS.md](tests/AGENTS.md) for where a new test belongs and the conventions to follow.
```bash
cd build && ctest --output-on-failure # all tests
ctest --test-dir ./tests/libslic3r # individual suite
ctest --test-dir ./tests/fff_print
cd build && ctest -C Release --output-on-failure # all tests
ctest --test-dir ./tests/libslic3r -C Release # individual suite
ctest --test-dir ./tests/fff_print -C Release
```
## Documentation
@@ -69,16 +64,16 @@ ctest --test-dir ./tests/fff_print
- Keep code concise and clear. Manually simplify AI generated bloated codes before review.
- Include targeted tests or documented verification for behavior changes, especially in slicing logic, profiles, formats, and GUI defaults.
- For profile changes (`resources/profiles/<Vendor>/**`), check that `version` in the sibling `resources/profiles/<Vendor>.json` was bumped.
- For translation changes (`localization/i18n/**/*.po`), check that recurring terms match the [Localization glossary](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/guides/localization_glossary.md) for that language.
- For translation changes (`localization/i18n/**/*.po`), check that recurring terms match the [Localization glossary](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/developer_reference/localization_glossary.md) for that language.
## Localization & translations
Catalogs live in `localization/i18n/<lang>/OrcaSlicer_<lang>.po`; the template is `OrcaSlicer.pot`.
See the [Localization guide](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/guides/localization_guide.md) for the human-facing version of these principles.
See the [Localization guide](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/developer_reference/localization_guide.md) for the human-facing version of these principles.
### Terminology
- Use the [Localization glossary](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/guides/localization_glossary.md) as the source of truth for recurring terms, so the same English term is always rendered the same way within a language, and terms that must stay in English (brand/product names, acronyms, materials, file formats, G-code tokens, macros/variables/identifiers) are not translated.
- Use the [Localization glossary](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/developer_reference/localization_glossary.md) as the source of truth for recurring terms, so the same English term is always rendered the same way within a language, and terms that must stay in English (brand/product names, acronyms, materials, file formats, G-code tokens, macros/variables/identifiers) are not translated.
- If a term's established translation changes, update both the affected `.po` files and the glossary (`localization_glossary.tsv`, then regenerate) so they stay in sync.
- Translate the *meaning*, not the words. Check what the string actually controls before translating it — English reuses one word for different things. `Flow ratio` (multiplier), `Flow Rate` (throughput) and `Flow Dynamics` (pressure compensation) are three different terms; `extruder` may mean the toolhead, the feeder motor, or the nozzle depending on the string.
- Reuse one template per recurring message shape (`Failed to connect to …`, `Are you sure you want to …?`), even where the English wording varies.
+51 -19
View File
@@ -587,10 +587,15 @@ if ((NOT MSVC OR IS_CLANG_CL) AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR
add_compile_options(-Wno-${w})
endforeach ()
# Turn everything else into an error. Dependency headers are exempt because the SYSTEM
# include flag (-imsvc on clang-cl, -isystem elsewhere) keeps their diagnostics out,
# apart from GCC's maybe-uninitialized, demoted below.
add_compile_options(-Werror)
# GCC is not built in CI, so don't throw errors CI won't catch.
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
add_compile_options(-Werror=return-type)
else ()
# Turn everything else into an error. Dependency headers are exempt because the
# SYSTEM include flag (-imsvc on clang-cl, -isystem elsewhere) keeps their
# diagnostics out.
add_compile_options(-Werror)
endif ()
# Demoted. Remove a name once its category is cleared on every compiler.
set(warnings_demoted)
@@ -612,20 +617,6 @@ if ((NOT MSVC OR IS_CLANG_CL) AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR
cast-function-type-mismatch
)
endif ()
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
list(APPEND warnings_demoted
# maybe-uninitialized runs after inlining and reports inside boost/variant,
# boost/tuple and the bundled clipper header even with -isystem.
maybe-uninitialized
# array-bounds is reported once, where ConfigOptionVector::set_at inlines
# into OrcaSlicer.cpp on a branch the preceding type test rules out.
array-bounds
# template-id-cdtor is a GCC 14+ warning in the bundled Clipper2 headers.
template-id-cdtor
)
endif ()
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
list(APPEND warnings_demoted
# enum-constexpr-conversion is a Clang warning that defaults to an error,
@@ -830,6 +821,37 @@ find_package(OpenSSL REQUIRED)
find_package(CURL REQUIRED)
find_package(Freetype REQUIRED)
if (SLIC3R_GUI)
# LibDataChannel's installed export references its bundled dependencies,
# but does not install their CMake targets. Recreate those targets from
# the same dependency prefix before loading the LibDataChannel config.
if (NOT TARGET Usrsctp::usrsctp)
find_library(_ORCA_USRSCTP_LIBRARY NAMES usrsctp
PATHS "${CMAKE_PREFIX_PATH}/lib" NO_DEFAULT_PATH)
if (_ORCA_USRSCTP_LIBRARY)
add_library(Usrsctp::usrsctp UNKNOWN IMPORTED GLOBAL)
set_target_properties(Usrsctp::usrsctp PROPERTIES
IMPORTED_LOCATION "${_ORCA_USRSCTP_LIBRARY}"
IMPORTED_LINK_INTERFACE_LANGUAGES C
INTERFACE_LINK_LIBRARIES "Threads::Threads")
endif()
endif()
if (NOT TARGET LibJuice::LibJuice)
find_library(_ORCA_LIBJUICE_LIBRARY NAMES juice
PATHS "${CMAKE_PREFIX_PATH}/lib" NO_DEFAULT_PATH)
if (_ORCA_LIBJUICE_LIBRARY)
add_library(LibJuice::LibJuice UNKNOWN IMPORTED GLOBAL)
set_target_properties(LibJuice::LibJuice PROPERTIES
IMPORTED_LOCATION "${_ORCA_LIBJUICE_LIBRARY}"
IMPORTED_LINK_INTERFACE_LANGUAGES C
INTERFACE_LINK_LIBRARIES "Threads::Threads")
endif()
endif()
find_package(LibDataChannel CONFIG REQUIRED)
endif()
add_library(libcurl INTERFACE)
target_link_libraries(libcurl INTERFACE CURL::libcurl)
@@ -1112,6 +1134,7 @@ function(orcaslicer_copy_dlls target config postfix output_dlls)
${CMAKE_PREFIX_PATH}/bin/occt/TKXDESTEP.dll
${CMAKE_PREFIX_PATH}/bin/occt/TKXSBase.dll
${CMAKE_PREFIX_PATH}/bin/freetype.dll
${CMAKE_PREFIX_PATH}/bin/avformat-61.dll
${CMAKE_PREFIX_PATH}/bin/avcodec-61.dll
${CMAKE_PREFIX_PATH}/bin/swresample-5.dll
${CMAKE_PREFIX_PATH}/bin/swscale-8.dll
@@ -1151,6 +1174,7 @@ function(orcaslicer_copy_dlls target config postfix output_dlls)
${_out_dir}/TKXSBase.dll
${_out_dir}/freetype.dll
${_out_dir}/avformat-61.dll
${_out_dir}/avcodec-61.dll
${_out_dir}/swresample-5.dll
${_out_dir}/swscale-8.dll
@@ -1173,7 +1197,10 @@ function(orcaslicer_copy_sos target config postfix output_sos)
set(_out_dir "${CMAKE_CURRENT_BINARY_DIR}")
endif ()
file(COPY ${CMAKE_PREFIX_PATH}/lib/libavcodec.so
file(COPY ${CMAKE_PREFIX_PATH}/lib/libavformat.so
${CMAKE_PREFIX_PATH}/lib/libavformat.so.61
${CMAKE_PREFIX_PATH}/lib/libavformat.so.61.1.100
${CMAKE_PREFIX_PATH}/lib/libavcodec.so
${CMAKE_PREFIX_PATH}/lib/libavcodec.so.61
${CMAKE_PREFIX_PATH}/lib/libavcodec.so.61.3.100
${CMAKE_PREFIX_PATH}/lib/libavutil.so
@@ -1188,6 +1215,9 @@ function(orcaslicer_copy_sos target config postfix output_sos)
DESTINATION ${_out_dir})
set(${output_sos}
${_out_dir}/libavformat.so
${_out_dir}/libavformat.so.61
${_out_dir}/libavformat.so.61.1.100
${_out_dir}/libavcodec.so
${_out_dir}/libavcodec.so.61
${_out_dir}/libavcodec.so.61.3.100
@@ -1317,6 +1347,8 @@ endif ()
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(LIBRARY_FILES
${LIBDIR_BIN}/libavformat.so.61
${LIBDIR_BIN}/libavformat.so.61.1.100
${LIBDIR_BIN}/libavcodec.so.61
${LIBDIR_BIN}/libavcodec.so.61.3.100
${LIBDIR_BIN}/libavutil.so.59
-52
View File
@@ -1,52 +0,0 @@
set WP=%CD%
set debug=OFF
set debuginfo=OFF
if "%1"=="debug" set debug=ON
if "%2"=="debug" set debug=ON
if "%1"=="debuginfo" set debuginfo=ON
if "%2"=="debuginfo" set debuginfo=ON
if "%debug%"=="ON" (
set build_type=Debug
set build_dir=build-dbg
) else (
if "%debuginfo%"=="ON" (
set build_type=RelWithDebInfo
set build_dir=build-dbginfo
) else (
set build_type=Release
set build_dir=build
)
)
echo build type set to %build_type%
cd deps
mkdir %build_dir%
cd %build_dir%
set DEPS=%CD%/OrcaSlicer_dep
set "SIG_FLAG="
if defined ORCA_UPDATER_SIG_KEY set "SIG_FLAG=-DORCA_UPDATER_SIG_KEY=%ORCA_UPDATER_SIG_KEY%"
if "%1"=="slicer" (
GOTO :slicer
)
echo "building deps.."
echo cmake ../ -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type%
cmake ../ -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type%
cmake --build . --config %build_type% --target deps -- -m
if "%1"=="deps" exit /b 0
:slicer
echo "building Orca Slicer..."
cd %WP%
mkdir %build_dir%
cd %build_dir%
echo cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type%
cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type% %SIG_FLAG%
cmake --build . --config %build_type% --target ALL_BUILD -- -m
cd ..
call scripts/run_gettext.bat
cd %build_dir%
cmake --build . --target install --config %build_type%
-190
View File
@@ -1,190 +0,0 @@
@REM OrcaSlicer build script for Windows with VS auto-detect
@echo off
set WP=%CD%
set _START_TIME=%TIME%
@REM Default target architecture to the host CPU arch; override by passing
@REM "x64" or "arm64" as an argument. PROCESSOR_ARCHITEW6432 covers a 32-bit
@REM shell running on a 64-bit OS, where PROCESSOR_ARCHITECTURE reads "x86".
set arch=x64
if /I "%PROCESSOR_ARCHITECTURE%"=="ARM64" set arch=ARM64
if /I "%PROCESSOR_ARCHITEW6432%"=="ARM64" set arch=ARM64
if /I "%1"=="arm64" set arch=ARM64
if /I "%2"=="arm64" set arch=ARM64
if /I "%1"=="x64" set arch=x64
if /I "%2"=="x64" set arch=x64
@REM Check for Ninja Multi-Config option (-x)
set USE_NINJA=0
for %%a in (%*) do (
if "%%a"=="-x" set USE_NINJA=1
)
@REM Check for clang-cl option (-l). Combined with -x it also builds the deps with
@REM clang-cl; on the Visual Studio generator it applies to the slicer only, because
@REM the dependency sub-builds have no toolset to inherit and stay on MSVC.
set CLANG_ARG=
set TOOLSET_ARG=
for %%a in (%*) do (
if "%%a"=="-l" (
set CLANG_ARG=-DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl
set TOOLSET_ARG=-T ClangCL
)
)
@REM Check for unit-tests option ("tests")
set BUILD_TESTS=OFF
for %%a in (%*) do (
if /I "%%a"=="tests" set BUILD_TESTS=ON
)
if "%USE_NINJA%"=="1" (
echo Using Ninja Multi-Config generator
set CMAKE_GENERATOR="Ninja Multi-Config"
set VS_VERSION=Ninja
goto :generator_ready
)
@REM Detect Visual Studio version using msbuild
echo Detecting Visual Studio version using msbuild...
@REM Try to get MSBuild version - the output format varies by VS version
set VS_MAJOR=
for /f "tokens=*" %%i in ('msbuild -version 2^>^&1 ^| findstr /r "^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"') do (
for /f "tokens=1 delims=." %%a in ("%%i") do set VS_MAJOR=%%a
set MSBUILD_OUTPUT=%%i
goto :version_found
)
@REM Alternative method for newer MSBuild versions
if "%VS_MAJOR%"=="" (
for /f "tokens=*" %%i in ('msbuild -version 2^>^&1 ^| findstr /r "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"') do (
for /f "tokens=1 delims=." %%a in ("%%i") do set VS_MAJOR=%%a
set MSBUILD_OUTPUT=%%i
goto :version_found
)
)
:version_found
echo MSBuild version detected: %MSBUILD_OUTPUT%
echo Major version: %VS_MAJOR%
if "%VS_MAJOR%"=="" (
echo Error: Could not determine Visual Studio version from msbuild
echo Please ensure Visual Studio and MSBuild are properly installed
exit /b 1
)
if "%VS_MAJOR%"=="16" (
set VS_VERSION=2019
set CMAKE_GENERATOR="Visual Studio 16 2019"
) else if "%VS_MAJOR%"=="17" (
set VS_VERSION=2022
set CMAKE_GENERATOR="Visual Studio 17 2022"
) else if "%VS_MAJOR%"=="18" (
set VS_VERSION=2026
set CMAKE_GENERATOR="Visual Studio 18 2026"
) else (
echo Error: Unsupported Visual Studio version: %VS_MAJOR%
echo Supported versions: VS2019 (16.8+^), VS2022 (17.x^), VS2026 (18.x^)
exit /b 1
)
echo Detected Visual Studio %VS_VERSION% (version %VS_MAJOR%)
echo Using CMake generator: %CMAKE_GENERATOR%
:generator_ready
@REM Pack deps
if "%1"=="pack" (
setlocal ENABLEDELAYEDEXPANSION
cd %WP%/deps/build
if "%arch%"=="ARM64" cd %WP%/deps/build-arm64
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do set build_date=%%c%%b%%a
echo packing deps: OrcaSlicer_dep_win-!arch!_!build_date!_vs!VS_VERSION!.zip
%WP%/tools/7z.exe a OrcaSlicer_dep_win-!arch!_!build_date!_vs!VS_VERSION!.zip OrcaSlicer_dep
goto :done
)
set debug=OFF
set debuginfo=OFF
if "%1"=="debug" set debug=ON
if "%2"=="debug" set debug=ON
if "%1"=="debuginfo" set debuginfo=ON
if "%2"=="debuginfo" set debuginfo=ON
if "%debug%"=="ON" (
set build_type=Debug
set build_dir=build-dbg
) else (
if "%debuginfo%"=="ON" (
set build_type=RelWithDebInfo
set build_dir=build-dbginfo
) else (
set build_type=Release
set build_dir=build
)
)
if "%arch%"=="ARM64" set build_dir=%build_dir%-arm64
echo build type set to %build_type%, arch=%arch%
setlocal DISABLEDELAYEDEXPANSION
cd deps
mkdir %build_dir%
cd %build_dir%
set "SIG_FLAG="
if defined ORCA_UPDATER_SIG_KEY set "SIG_FLAG=-DORCA_UPDATER_SIG_KEY=%ORCA_UPDATER_SIG_KEY%"
if "%1"=="slicer" (
GOTO :slicer
)
echo "building deps.."
if defined CLANG_ARG if "%USE_NINJA%"=="0" echo Note: -l needs -x for the dependencies; building them with MSVC.
echo on
REM Set minimum CMake policy to avoid <3.5 errors
set CMAKE_POLICY_VERSION_MINIMUM=3.5
if "%USE_NINJA%"=="1" (
cmake ../ -G %CMAKE_GENERATOR% %CLANG_ARG% -DCMAKE_BUILD_TYPE=%build_type%
cmake --build . --config %build_type% --target deps
) else (
cmake ../ -G %CMAKE_GENERATOR% -A %arch% -DCMAKE_BUILD_TYPE=%build_type%
cmake --build . --config %build_type% --target deps -- -m
)
@echo off
if "%1"=="deps" goto :done
:slicer
echo "building Orca Slicer..."
cd %WP%
mkdir %build_dir%
cd %build_dir%
echo on
set CMAKE_POLICY_VERSION_MINIMUM=3.5
if "%USE_NINJA%"=="1" (
cmake .. -G %CMAKE_GENERATOR% %CLANG_ARG% -DORCA_TOOLS=ON %SIG_FLAG% -DBUILD_TESTS=%BUILD_TESTS% -DCMAKE_BUILD_TYPE=%build_type%
cmake --build . --config %build_type% --target all
) else (
cmake .. -G %CMAKE_GENERATOR% -A %arch% %TOOLSET_ARG% -DORCA_TOOLS=ON %SIG_FLAG% -DBUILD_TESTS=%BUILD_TESTS% -DCMAKE_BUILD_TYPE=%build_type%
cmake --build . --config %build_type% --target ALL_BUILD -- -m
)
@echo off
cd ..
call scripts/run_gettext.bat
cd %build_dir%
cmake --build . --target install --config %build_type%
:done
@echo off
for /f "tokens=1-3 delims=:.," %%a in ("%_START_TIME: =0%") do set /a "_start_s=%%a*3600+%%b*60+%%c"
for /f "tokens=1-3 delims=:.," %%a in ("%TIME: =0%") do set /a "_end_s=%%a*3600+%%b*60+%%c"
set /a "_elapsed=_end_s - _start_s"
if %_elapsed% lss 0 set /a "_elapsed+=86400"
set /a "_hours=_elapsed / 3600"
set /a "_remainder=_elapsed - _hours * 3600"
set /a "_mins=_remainder / 60"
set /a "_secs=_remainder - _mins * 60"
echo.
echo Build completed in %_hours%h %_mins%m %_secs%s
-80
View File
@@ -1,80 +0,0 @@
@REM OrcaSlicer build script for Windows
@echo off
set WP=%CD%
@REM Pack deps
if "%1"=="pack" (
setlocal ENABLEDELAYEDEXPANSION
cd %WP%/deps/build
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do set build_date=%%c%%b%%a
echo packing deps: OrcaSlicer_dep_win64_!build_date!_vs2022.zip
%WP%/tools/7z.exe a OrcaSlicer_dep_win64_!build_date!_vs2022.zip OrcaSlicer_dep
exit /b 0
)
set debug=OFF
set debuginfo=OFF
@REM Default target architecture to the host CPU arch; override with x64/arm64 arg.
set arch=x64
if /I "%PROCESSOR_ARCHITECTURE%"=="ARM64" set arch=ARM64
if /I "%PROCESSOR_ARCHITEW6432%"=="ARM64" set arch=ARM64
if "%1"=="debug" set debug=ON
if "%2"=="debug" set debug=ON
if "%1"=="debuginfo" set debuginfo=ON
if "%2"=="debuginfo" set debuginfo=ON
if /I "%1"=="arm64" set arch=ARM64
if /I "%2"=="arm64" set arch=ARM64
if /I "%1"=="x64" set arch=x64
if /I "%2"=="x64" set arch=x64
if "%debug%"=="ON" (
set build_type=Debug
set build_dir=build-dbg
) else (
if "%debuginfo%"=="ON" (
set build_type=RelWithDebInfo
set build_dir=build-dbginfo
) else (
set build_type=Release
set build_dir=build
)
)
if "%arch%"=="ARM64" set build_dir=%build_dir%-arm64
echo build type set to %build_type%, arch=%arch%
setlocal DISABLEDELAYEDEXPANSION
cd deps
mkdir %build_dir%
cd %build_dir%
set "SIG_FLAG="
if defined ORCA_UPDATER_SIG_KEY set "SIG_FLAG=-DORCA_UPDATER_SIG_KEY=%ORCA_UPDATER_SIG_KEY%"
if "%1"=="slicer" (
GOTO :slicer
)
echo "building deps.."
echo on
REM Set minimum CMake policy to avoid <3.5 errors
set CMAKE_POLICY_VERSION_MINIMUM=3.5
cmake ../ -G "Visual Studio 17 2022" -A %arch% -DCMAKE_BUILD_TYPE=%build_type%
cmake --build . --config %build_type% --target deps -- -m
@echo off
if "%1"=="deps" exit /b 0
:slicer
echo "building Orca Slicer..."
cd %WP%
mkdir %build_dir%
cd %build_dir%
echo on
set CMAKE_POLICY_VERSION_MINIMUM=3.5
cmake .. -G "Visual Studio 17 2022" -A %arch% -DORCA_TOOLS=ON %SIG_FLAG% -DCMAKE_BUILD_TYPE=%build_type%
cmake --build . --config %build_type% --target ALL_BUILD -- -m
@echo off
cd ..
call scripts/run_gettext.bat
cd %build_dir%
cmake --build . --target install --config %build_type%
+7 -4
View File
@@ -375,10 +375,6 @@ include(libnoise/libnoise.cmake)
include(Draco/Draco.cmake)
include(FFMPEG/FFMPEG.cmake)
include(Assimp/Assimp.cmake)
# I *think* 1.1 is used for *just* md5 hashing?
# 3.1 has everything in the right place, but the md5 funcs used are deprecated
# a grep across the repo shows it is used for other things
@@ -389,6 +385,12 @@ if(NOT OPENSSL_FOUND)
set(OPENSSL_PKG dep_OpenSSL)
endif()
include(FFMPEG/FFMPEG.cmake)
include(Assimp/Assimp.cmake)
include(DataChannel/DataChannel.cmake)
set(DATACHANNEL_PKG dep_DataChannel)
# we don't want to load a "wrong" openssl when loading curl
# so, just don't even bother
# ...i think this is how it works? change if wrong
@@ -461,6 +463,7 @@ set(_dep_list
dep_wxInspector
dep_FFMPEG
dep_Assimp
${DATACHANNEL_PKG}
)
if (MSVC)
+20
View File
@@ -0,0 +1,20 @@
# libdatachannel is the native ICE/DTLS/SCTP implementation used by the
# GUI WebRTC camera controller. Keep the source revision fixed: the signaling
# protocol is evolving independently of this transport dependency.
orcaslicer_add_cmake_project(DataChannel
DEPENDS ${OPENSSL_PKG}
CMAKE_ARGS
-DNO_EXAMPLES=ON
-DNO_TESTS=ON
-DNO_WEBSOCKET=ON
-DNO_MEDIA=ON
-DUSE_NICE=OFF
-DUSE_SYSTEM_JUICE=OFF
-DUSE_SYSTEM_USRSCTP=OFF
-DOPENSSL_ROOT_DIR:PATH=${DESTDIR}
-DOPENSSL_USE_STATIC_LIBS=ON
GIT_REPOSITORY https://github.com/paullouisageneau/libdatachannel.git
GIT_TAG v0.22.2
GIT_SHALLOW ON
GIT_SUBMODULES_RECURSE ON
)
+19 -3
View File
@@ -1,5 +1,16 @@
set(_conf_cmd ./configure)
set(_ffmpeg_depends)
set(_ffmpeg_configure_command ${_conf_cmd})
if (TARGET dep_OpenSSL)
set(_ffmpeg_depends DEPENDS dep_OpenSSL)
set(_ffmpeg_configure_command
${CMAKE_COMMAND} -E env
"PKG_CONFIG_PATH=${DESTDIR}/lib/pkgconfig:$ENV{PKG_CONFIG_PATH}"
${_conf_cmd}
)
endif()
if (MSVC)
set(_source_dir "${CMAKE_BINARY_DIR}/dep_FFMPEG-prefix/src/dep_FFMPEG")
@@ -9,6 +20,7 @@ if (MSVC)
set(PREBUILD_HASH_x64 "e65916020ddb9ef84b2666dfbcbfc9b1d67f69d15b4a66db53754637bf2d498c")
ExternalProject_Add(dep_FFMPEG
${_ffmpeg_depends}
URL ${PREBUILD_URL_${DEPS_ARCH}}
URL_HASH SHA256=${PREBUILD_HASH_${DEPS_ARCH}}
DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/FFMPEG
@@ -21,6 +33,8 @@ if (MSVC)
)
else ()
set(_openssl_cmd --enable-openssl)
if (APPLE)
set(_minos_cmd
"--extra-cflags=-mmacosx-version-min=${DEP_OSX_TARGET}"
@@ -52,10 +66,11 @@ else ()
endif()
ExternalProject_Add(dep_FFMPEG
${_ffmpeg_depends}
URL https://github.com/FFmpeg/FFmpeg/archive/refs/tags/n7.0.3.tar.gz
URL_HASH SHA256=DEEDCABE339165214A3637DF4C86A507AEF0D793CF8774FF68735F4737E8DDBC
DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/FFMPEG
CONFIGURE_COMMAND ${_conf_cmd}
CONFIGURE_COMMAND ${_ffmpeg_configure_command}
${_cross_cmd}
${_pic_cmd}
${_arch_cmd}
@@ -63,20 +78,21 @@ else ()
"--prefix=${DESTDIR}"
${_link_cmd}
${_minos_cmd}
${_openssl_cmd}
--disable-doc
--enable-small
--disable-outdevs
--disable-filters
--enable-filter=*null*,afade,*fifo,*format,*resample,aeval,allrgb,allyuv,atempo,pan,*bars,color,*key,crop,draw*,eq*,framerate,*_qsv,*_vaapi,*v4l2*,hw*,scale,volume,test*
--disable-protocols
--enable-protocol=file,fd,pipe,rtp,udp
--enable-protocol=file,fd,pipe,http,https,rtp,tcp,udp
--disable-muxers
--enable-muxer=rtp
--disable-encoders
--disable-decoders
--enable-decoder=*aac*,h264*,mp3*,mjpeg,rv*
--disable-demuxers
--enable-demuxer=h264,mp3,mov
--enable-demuxer=h264,mp3,mov,mpjpeg,rtsp,sdp
--disable-zlib
--disable-avdevice
BUILD_IN_SOURCE ON
+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Compiles Objects/unicodectype.c without optimisation. VS 2026's ARM64 code
generator needs about 27 GB for _PyUnicode_ToNumeric, a switch with 1951
cases. CPython has the same workaround (python/cpython#153668). -->
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Update="..\Objects\unicodectype.c">
<Optimization>Disabled</Optimization>
<WholeProgramOptimization>false</WholeProgramOptimization>
</ClCompile>
</ItemGroup>
</Project>
+11 -1
View File
@@ -88,8 +88,18 @@ if(WIN32)
list(APPEND _python_env_args "PreferredToolArchitecture=${_python_tool_arch}")
endif()
# MSBuild reads extra switches from PCbuild/msbuild.rsp.
set(_python_rsp "/p:PlatformToolset=${_python_platform_toolset}\n")
# VS 2026's ARM64 code generator needs about 27 GB for one function in
# Objects/unicodectype.c (python/cpython#153668); the property sheet compiles
# that file without optimisation.
if(_python_pcbuild_platform STREQUAL "ARM64")
file(TO_NATIVE_PATH "${CMAKE_CURRENT_LIST_DIR}/arm64-unicodectype.props" _python_arm64_props)
string(APPEND _python_rsp "/p:ForceImportAfterCppTargets=\"${_python_arm64_props}\"\n")
endif()
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/python3-msbuild.rsp" "${_python_rsp}")
set(_conf_cmd
cmd /c "echo /p:PlatformToolset=${_python_platform_toolset}>PCbuild\\msbuild.rsp"
${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_BINARY_DIR}/python3-msbuild.rsp" <SOURCE_DIR>/PCbuild/msbuild.rsp
)
set(_build_cmd
${CMAKE_COMMAND} -E env ${_python_env_args}
+74 -75
View File
@@ -9,7 +9,7 @@ OrcaFilamentLibrary (OFL), Qidi, or Snapmaker bundle. The granularity is the nam
not the brand behind it: `AAA PLA Lite` and `AAA PLA Pro` are two filaments with two ids, not
variants of one.
**How it is generated:** an id is computed, never invented. `scripts/orca_id_tool.py`
**How it is generated:** an id is computed, never invented. `scripts/orca_profile_tool.py`
mints it as a deterministic hash of the product's identity — the triple
`(filament_vendor, filament_type, filament name)`, where the filament name is the preset name
with its `@...` variant suffix stripped — producing an 8-character `OF*` code that is the
@@ -34,7 +34,7 @@ This page is the rule for authoring `filament_id` in system profiles
> [!IMPORTANT]
> **Never write a `filament_id` value by hand.** A new filament gets its id from
> `python scripts/orca_id_tool.py --generate`; one already in the tree has one — inherit it.
> `python scripts/orca_profile_tool.py generate-id`; one already in the tree has one — inherit it.
## The design, in two pieces
@@ -160,8 +160,8 @@ key needed). Tuning a generic material → **join the OrcaFilamentLibrary filame
different product by rule 5, so it then needs its own id.
5. **Ids follow the product identity.** The id is a pure function of the product triple
`(filament_vendor, filament_type, filament name)`, so correcting any of them re-mints the id
**by design**, applied by `--generate` (preview with `--dry-run`, confine with `--vendor`) and
gated by the `--update-snapshot` diff; the exact sequence is in the FAQ. Nothing forwards
**by design**, applied by `generate-id` (preview with `--dry-run`, confine with `--vendor`)
and gated by the `update-snapshot` diff; the exact sequence is in the FAQ. Nothing forwards
the old value, so anything outside the tree that stored it — a device tray, a calibration
record, a saved project — falls back to matching by filament type until the user re-selects
the filament. Re-mint deliberately, and only to fix a genuinely wrong identity.
@@ -170,7 +170,7 @@ key needed). Tuning a generic material → **join the OrcaFilamentLibrary filame
## Minting — nobody invents ids
New ids are deterministic, computed exactly like the `setting_id` precedent
(the `setting_id` half of `scripts/orca_id_tool.py`):
(the `setting_id` half of `scripts/orca_profile_tool.py generate-id`):
```text
FILAMENT_ID_NAMESPACE = uuid5(setting-id NAMESPACE, "filament_id")
@@ -199,10 +199,10 @@ purely through inheritance from the OFL preset.
Nothing but the triple feeds the mint — not the rest of the tree, not the snapshot, not what
another preset of the product happens to carry. Determined triple, determined id: one product
carries one id and there is no second acceptable value for it, so any other value on a preset
is a mismatch `--check` reports and `--generate` pulls back. Two *different* products whose
is a mismatch `check` reports and `generate-id` pulls back. Two *different* products whose
triples mint the same base62 value would be a collision (a roughly 36-bit id space against a
few thousand products); nothing salts past it: `--check` reports it naming both products,
`--generate` refuses to write it, and the remedy is a rename so their triples differ. Where
few thousand products); nothing salts past it: `check` reports it naming both products,
`generate-id` refuses to write it, and the remedy is a rename so their triples differ. Where
two presets of one product would be AMS-ambiguous on a printer, the fix is likewise in the
profiles — make their `compatible_printers` disjoint (structure rule 3), retire the redundant
preset, or, if they really are different products, give them different names so their triples
@@ -212,15 +212,14 @@ Workflow for a new filament:
```bash
# 1. Author the filament with NO filament_id key anywhere.
python scripts/orca_id_tool.py --dry-run # 2. preview the ids — writes nothing
python scripts/orca_id_tool.py --generate # 3. apply them to the profile file(s)
python scripts/orca_id_tool.py --update-snapshot # 4. record the new claims in the snapshot
python scripts/orca_id_tool.py --check # 5. validate the filament_id state
python scripts/orca_extra_profile_check.py # 6. ...and everything else CI checks
# 7. Commit the profile edits together with scripts/filament_id_snapshot.json, for review.
python scripts/orca_profile_tool.py generate-id --dry-run # 2. preview the ids — writes nothing
python scripts/orca_profile_tool.py generate-id # 3. apply them to the profile file(s)
python scripts/orca_profile_tool.py update-snapshot # 4. record the new claims in the snapshot
python scripts/orca_profile_tool.py check # 5. validate — everything CI checks
# 6. Commit the profile edits together with scripts/filament_id_snapshot.json, for review.
```
`--generate` makes every filament's id equal the mint of its own
`generate-id` makes every filament's id equal the mint of its own
`(filament_vendor, filament_type, filament name)` triple: it inserts one where an instantiated
filament resolves none, and re-derives one that does not match. A preset that *inherits* a
mismatching id is the one case left to the author — check 3b names it, and the fix is to inherit
@@ -232,60 +231,63 @@ and machine preset of every vendor except BBL, which keeps its authoritative `G*
`setting_id` from base profiles, and fixes the misspelled `settings_id` key — dropped, or, for
BBL, whose ids have no formula to fall back on, restored under the correct name. It is idempotent and
byte-preserving (indentation, BOM, and line endings intact, every edited file re-parsed to fail
loudly), and a no-op on a tree that already passes `scripts/orca_extra_profile_check.py` — the
check CI runs over both id kinds, of which `--check` is the `filament_id` half.
loudly), and a no-op on a tree that already passes `check`.
- `--filament-id` limits the run to `filament_id`.
- `--setting-id` limits the run to `setting_id`. The two exclude each other; pass neither to
write both.
- `--vendor VENDOR` confines the run to that bundle; repeatable. The id is a function of the
triple alone, so a narrowed run writes exactly what a full one would; `--check` reports
triple alone, so a narrowed run writes exactly what a full one would; `check` reports
whatever it left outside.
- `--dry-run` reports what `--generate` would do and writes nothing; with no mode of its own it
implies `--generate`, so `--dry-run --vendor <Vendor>` previews just that bundle.
- `--dry-run` reports what the run would do and writes nothing, so
`generate-id --dry-run --vendor <Vendor>` previews just that bundle.
- `--profiles DIR` points the tooling at a different profile tree (default
`resources/profiles`). `--check` and `--update-snapshot` read and write the sanctioned state of
`resources/profiles`). `check` and `update-snapshot` read and write the sanctioned state of
the tree they are given, so pointing them elsewhere needs `--snapshot PATH` for that tree too —
`scripts/filament_id_snapshot.json` describes `resources/profiles` and no other tree.
**Identity fixes need no separate mode.** `--generate` re-derives an id that no longer matches its
triple exactly the way it fills in a missing one, so a rename or a `filament_vendor` /
`filament_type` correction is just: fix the config, run `--generate` (confine it with `--vendor`,
preview it with `--dry-run`), then `--update-snapshot` and review the diff.
The tool's other commands maintain the tree around the ids: `fix` normalises profile files,
`trim` drops files no `<vendor>.json` list references, and `update-index` rebuilds those lists.
They do not touch ids; `--help` documents them.
**Identity fixes need no separate command.** `generate-id` re-derives an id that no longer matches
its triple exactly the way it fills in a missing one, so a rename or a `filament_vendor` /
`filament_type` correction is just: fix the config, run `generate-id` (confine it with
`--vendor`, preview it with `--dry-run`), then `update-snapshot` and review the diff.
If you skip the tooling, CI fails and prints the remedy: the expected id for your filament and
the instruction to run `python scripts/orca_id_tool.py --generate`; once the id is minted, the
snapshot checks likewise point at `--update-snapshot` and tell you to commit the resulting
the instruction to run `python scripts/orca_profile_tool.py generate-id`; once the id is minted,
the snapshot checks likewise point at `update-snapshot` and tell you to commit the resulting
diff.
## Reserved namespaces — never mint or hand-write into
## Ids other systems compose
A **reserved namespace** is an id space no system profile may declare, because an external
catalog or a device protocol owns the values. None of them has an owning vendor: there is no
bundle — not even the one whose printers use the catalog — that may write one into a profile.
Every filament profile carries a minted id, with no exceptions and no spellings held back for
anyone. There is therefore no reserved namespace to respect and no bundle that owns one: an id
some other system composes for its own purposes is simply not the mint of a triple, so it
cannot be a system profile's `filament_id`, and the format check rejects it for that reason
alone — same error, same remedy, whoever wrote it.
| Space | Status | Rule |
| --- | --- | --- |
| `GF*` | Bambu AMS/RFID catalog | declarable by **nobody**, BBL included: Bambu's own ids live in the generated catalog map, never in a profile |
| `QD_*` | Qidi device protocol | declarable by **nobody**, Qidi included: the box composes these ids at runtime and they are not preset ids |
| `P` + 7 hex chars (case-insensitive), `"null"` | user-created custom filaments (`CreatePresetsDialog.cpp`) | never appears in system profiles |
Three such spaces exist around us, and are worth recognising so nobody mistakes one for an id
to copy into a profile:
The two device namespaces, in detail:
- **Bambu (`GF*`).** Bambu's device/RFID/cloud catalog is external and opaque, which is a
reason to keep it out of the profiles rather than to let one bundle own it. Every BBL filament
mints an `OF` id from its triple like every other vendor's, and the correspondence to Bambu's
catalog ids lives in one generated file the app applies at the printer boundary — the next
section. Nothing under `resources/profiles/**` carries a `GF*` id today and nothing can be
exempted, so a `GF*` id appearing anywhere in the tree is a mistake, whoever wrote it.
- **Qidi (`QD_*`).** `QD_*` is a device-*protocol* namespace, not a preset id space: the
Qidi box path composes `QD_<series>_<vendor>_<typeidx>` ids at runtime (slot vendor and
type indices reported by the device, the series digit inferred client-side from the printer
model/name). Qidi presets carry ordinary minted `OF*` ids (generics share the OFL ids), so
a composed id matches no preset and the slot falls back to filament type; translating it to
the filament's id belongs in `QidiPrinterAgent`. The alternative — treating per-series
protocol ids as preset ids — would put one product under five ids (`QIDI PLA Rapido` would
be `QD_0_1_1` through `QD_4_1_1`), exactly the fragmentation the mint rule removes.
- **Bambu's `GF*` catalog.** Bambu's device / RFID / cloud catalog is external and opaque. Every
BBL filament mints an `OF` id from its triple like every other vendor's, and the
correspondence to Bambu's catalog ids lives in one generated file the app applies at the
printer boundary — the next section. Note that `GF` is a *prefix*, not a namespace the tree
avoids: BBL's authoritative `setting_id` values include `GF`-prefixed ones, and
`resources/profiles/blacklist.json` and `BBL/filament/filaments_color_codes.json` both
reference Bambu catalog ids by design. The rule is about `filament_id` and nothing else.
- **Qidi's `QD_*` protocol ids.** The Qidi box composes `QD_<series>_<vendor>_<typeidx>` at
runtime (slot vendor and type indices reported by the device, the series digit inferred
client-side from the printer model/name). Qidi presets carry ordinary minted `OF*` ids
(generics share the OFL ids), so a composed id matches no preset and the slot falls back to
filament type; translating it to the filament's id belongs in `QidiPrinterAgent`. Treating
per-series protocol ids as preset ids would put one product under five ids
(`QIDI PLA Rapido` would be `QD_0_1_1` through `QD_4_1_1`) — exactly the fragmentation the
mint rule removes.
- **`P` + 7 hex chars, and `"null"`.** What `CreatePresetsDialog.cpp` gives a filament a *user*
creates. Those are user presets, not system profiles, and the two never meet in the tree.
## The Bambu catalog map
@@ -337,7 +339,7 @@ OrcaFilamentLibrary. **135 is the number to expect at every regeneration** — 1
one-off size of the transition and stopped being computable from the tree once the BBL bundle
was re-minted, so do not "fix" the report to print it.
**Check 6** lives in `check_filament_ids`, so profile CI runs it alongside the other five. It
**Check 5** lives in `check_filament_ids`, so profile CI runs it alongside the other four. It
holds the file to its contract: it parses, carries `source` / `bambustudio_commit` /
`generated`, keys only `OF`-format ids, maps each Bambu id at most once, and — for every row
whose key the tree actually claims — agrees with the tree on that id's `(vendor, type, name)`
@@ -426,11 +428,11 @@ map would silently reproduce the bug.
## How CI enforces this
Profile CI (`check_profiles.yml`) runs `check_filament_ids()` tree-wide via
`scripts/orca_extra_profile_check.py`. Its ground truth is
`scripts/orca_profile_tool.py check`. Its ground truth is
**`scripts/filament_id_snapshot.json` — the sanctioned state**: the id state derived from the
tree must equal the snapshot exactly, in both directions. Any change to the id landscape
therefore surfaces as a diff to that file, and **that snapshot diff is what maintainers review
and gate in a PR**. Never edit the snapshot by hand — `--update-snapshot` regenerates it
and gate in a PR**. Never edit the snapshot by hand — `update-snapshot` regenerates it
deterministically (running it twice changes nothing). The snapshot holds one map, `ids`: each
entry is the product the id is minted from (`filament_vendor`, `filament_type`, `name`) and the
`filaments` claiming it (`Vendor/Filament`), and it sanctions *state*, never exceptions: no check
@@ -450,8 +452,6 @@ The checks, in brief:
system filament must resolve an effective id at all (recall: an id-less one is a hard load
error in C++ that discards the whole vendor bundle); and no two products mint one id (a
base62 collision, resolved by renaming one of them). The errors print the expected id.
- **Reserved namespaces** — `GF*`, `QD_*`, `P<7-hex>` or `"null"` claimed by any vendor,
BBL and Qidi included.
- **Triple integrity** — every declarer must resolve a non-empty `filament_vendor` and
`filament_type` (generics use `"Generic"`), and all declarers of one filament within a
bundle must agree on the triple.
@@ -461,16 +461,15 @@ The checks, in brief:
tree claims. See [The Bambu catalog map](#the-bambu-catalog-map); the remedy is always to
regenerate, never to hand-edit.
A profile that declares a **reserved-namespace** id — `GF*`, `QD_*` or `P<7-hex>`, whatever
its vendor — cannot pass the format check, so `--update-snapshot` refuses to sanction it
rather than hide the mistake until CI. For a Bambu-cataloged product, the catalog map is where
the correspondence belongs. Any other new sharing via a *declared* id is caught by the identity
check; sharing through inheritance carries no declaration to check and surfaces only as a new
claim in the snapshot diff — which is exactly why that diff is the gate.
A profile that declares an id no triple mints — a Bambu catalog id, a composed Qidi one, a
hand-typed value, whatever its vendor — fails the format check. For a Bambu-cataloged product
the catalog map is where the correspondence belongs. New sharing via a *declared* id is caught
by the identity check; sharing through inheritance carries no declaration to check and surfaces
only as a new claim in the snapshot diff — which is exactly why that diff is the gate.
`orca_extra_profile_check.py` separately holds every declared id to the AMS 8-character limit,
tree-wide and for every vendor alike, scoped to the presets a vendor's index actually
references (a file the index never loads cannot break AMS matching).
The same `check` run holds every declared id to the AMS 8-character limit, tree-wide and for
every vendor alike, scoped to the presets a vendor's index actually references (a file the index
never loads cannot break AMS matching).
Complementing the Python checks, CI also runs the C++ profile validator with `-f`
(`check_filament_subtypes`): it loads the bundle exactly as the app does and flags any printer
@@ -488,21 +487,21 @@ ambiguity check behind structure rule 3.
`Generic PLA` base name, set `compatible_printers`; no id key needed.
- **A branded filament that borrows a generic's settings?** Fine — inherit `Generic X @System`
(or any real filament) for the settings and declare the id of your own filament; run
`python scripts/orca_id_tool.py --generate` to mint it. Inheritance never changes the id.
`python scripts/orca_profile_tool.py generate-id` to mint it. Inheritance never changes the id.
- **I need to fix a filament's `filament_vendor` or `filament_type`.** Fix the config, run
`--generate --vendor <Vendor>` (preview with `--dry-run`), then `--update-snapshot`, and commit
`generate-id --vendor <Vendor>` (preview with `--dry-run`), then `update-snapshot`, and commit
the profile and snapshot diffs together. The id re-derives from the corrected identity, and
nothing forwards the old value, so a tray or record still holding it falls back to matching by
filament type.
- **I need to rename a filament.** Rename the presets (adding `renamed_from`, which keeps the
preset *name* resolving), then `--generate --vendor <Vendor>` (preview with `--dry-run`), then
`--update-snapshot`. The id follows the new filament name; as with any identity fix, the old id
preset *name* resolving), then `generate-id --vendor <Vendor>` (preview with `--dry-run`), then
`update-snapshot`. The id follows the new filament name; as with any identity fix, the old id
is not forwarded.
- **Can I reuse a `QD_*` id for a Qidi profile?** No — nobody can. It is the device protocol's
own id space: the box composes those values at runtime and no preset carries one. Author
Qidi filaments like any other vendor's.
- **CI says my filament needs an id.** Run `python scripts/orca_id_tool.py --generate`, then
`--update-snapshot`, and commit both diffs. Do not type an id by hand.
- **Can I reuse a `QD_*` id for a Qidi profile?** No — it is not a mint, so it is not a
`filament_id`. Those values are composed by the box at runtime, and no preset carries one.
Author Qidi filaments like any other vendor's.
- **CI says my filament needs an id.** Run `python scripts/orca_profile_tool.py generate-id`, then
`update-snapshot`, and commit both diffs. Do not type an id by hand.
For general profile authoring, see the profile development guide on the
[OrcaSlicer wiki](https://www.orcaslicer.com/wiki).
+170
View File
@@ -0,0 +1,170 @@
# Wipe inward — High Level Design
## Purpose and scope
Wipe inward reduces reheating of fresh plastic and visible seam artifacts by
moving the hot nozzle toward adjacent printed material during the external-wall
wipe. Wipe marks are especially visible at layer heights below 0.1 mm.
The option applies only to wipes after external walls, including walls around
holes. It does not offset wipes after inner walls, infill or supports. For an
outer contour the move is inward; for a hole it is away from the hole, toward
the surrounding material. The path must remain supported by material that is
already present when the wipe executes.
The operation belongs to G-code generation. It uses extrusion paths, their actual
widths and their print order. Changing its settings invalidates G-code export
while preserving the sliced geometry.
## Settings and eligibility
`wipe_inward` defaults to disabled and requires Wipe while retracting to be
enabled for the active filament. `wipe_inward_distance` defaults to 50% of the
actual external-wall extrusion width; it also accepts an absolute distance in
millimeters. Using the path width makes Auto width and Arachne's variable widths
meaningful. The effective offset is limited by that width and the spacing to the
adjacent wall. A zero distance disables the offset.
Only external perimeters with a suitable, previously printed inner perimeter
are eligible. A configured wall count alone cannot establish eligibility:
the local geometry may contain fewer walls, and walls scheduled later do not
provide support. Outer/Inner wall order therefore normally retains the regular
wipe path.
Retraction and pressure advance calibrations disable inward wiping so it cannot
mask the behavior being measured. The calibration settings turn it off, and
G-code generation enforces this even if a profile or object override enables it.
## Path selection and support
The planner identifies an adjacent inner perimeter on the material side of the
outgoing wall. Contour winding and the distinction between outer contours and
holes establish a preferred direction; local printed geometry resolves ambiguous
or self-touching contours.
Candidate paths offset or translate the portion needed for the configured wipe
distance. A wide seam gap can prevent a supported forward path; following the
incoming printed wall backwards is also a candidate. If translating that wall
cannot provide a complete wipe around a curve, the planner tries an offset of
the reversed wall. Direction checks allow coordinate-rounding error at a
perpendicular entry, while rejecting actual backtracking. The planner checks the
complete executable path, including its connector from the nozzle position,
against the current and earlier printed perimeters. Nearby endpoints alone do
not establish support across a gap.
Each region accumulates its printed perimeter prefix once, in extrusion order.
Every entity contributes its geometry only after it is printed, and the prefix
is discarded when the region ends. This collection is skipped when inward wiping
is disabled or its configured distance is zero. A mixed inner-wall loop remains
an eligible target even when its first path is an overhang: ordinary inner-wall
paths elsewhere in the loop identify it. Likewise, an external loop with an
overhanging start remains eligible when other segments identify the external
wall. It is available for support checks but is not an inner-wall target.
Candidate-specific support filtering and AABB trees are built only for eligible
external loops, then reused across their candidate paths.
Material-side validation applies with or without a seam gap. Along each
candidate, local wall normals point toward the adjacent printed inner wall;
samples on the opposite side are rejected even when they remain close enough
to the external wall to pass the support check. This uses the open wall geometry
without treating it as a closed polygon. Full paths at a zero-gap seam also
retain clearance from the external wall after their initial connector. At a
clipped corner, another branch can be closer than the requested offset, so
material-side and support checks apply without that additional clearance rule.
An accepted candidate replaces the stored wipe path as a whole. A short direct
inward move is also eligible when longer candidates fail validation. It may
waive full wall clearance, but must pass the material-side check. Its initial
direction is checked from the actual nozzle position after any loop pre-move;
the original wall endpoint is retained separately for intersection checks. It takes
priority over the alternate offset when the preferred and translated paths
are unusable. A longer reversed path may replace the selected candidate only
when its distance to the target inner wall is no worse within tolerance.
## Fallback to the regular wipe
The original wipe path is retained when:
- No suitable adjacent inner wall has already been printed near the seam. This
includes single-wall areas, locally missing inner walls and normally Outer/Inner
wall order. A distant wall or a wall on the air side does not qualify.
- The requested or available offset, or the configured wipe distance, is zero
or too small at the geometry's coordinate precision.
- Degenerate geometry prevents construction of a usable candidate, or all
candidates fail the checks for printed support, direction, wall clearance or
the connector from the actual nozzle position. This can occur at tight corners,
narrow features or seam gaps.
Corners and seam gaps do not automatically trigger fallback: an offset,
translated, reversed or short direct inward path may still be valid. The regular
wipe is retained only when no candidate is accepted.
Fallback uses the path and retraction rules for `wipe_inward` disabled.
Wipe while retracting must still be enabled for a wipe to occur; `wipe_on_loops`
remains controlled by its own setting.
## Interaction with Wipe on loop
`wipe_on_loops` is an independent option that makes a short move before leaving
an external loop. It can operate with `wipe_inward` disabled. When both options
are enabled, its destination is the starting position for the inward wipe.
The loop move samples the outgoing and incoming paths by distance across path
boundaries. The sampling distance is bounded by the nozzle diameter and one
quarter of the total path length. It samples the outgoing path at up to 20% of
the nozzle diameter and rotates that point around the seam through one third
of the material-side corner angle. For a closed square outer contour, this
produces a move of 20% of the nozzle diameter at 30 degrees into the corner.
Coincident samples or degenerate angles suppress the move.
The nozzle position stored by G-code generation must match the emitted loop
move. Both travel planning and wipe execution depend on this position, including
when Wipe inward is disabled.
With a seam gap, a loop move may advance past the inward offset's original entry.
If that alone makes the connector backtrack, the entry advances to the nozzle's
projection on the offset. The planner extends the source as needed to preserve
the configured wipe length and validates the new connector and complete path.
Joins that already backtrack across the seam gap are not adjusted this way.
## Execution and retraction
The stored wipe path uses a sentinel first point. Execution starts from the
actual nozzle position and proceeds to the second stored point. Path selection,
support validation and wipe-length calculation must all use this same executable
geometry, especially after a Wipe on loop move.
An accepted inward path executes at the end of the external loop, after any
Wipe on loop move, without retracting filament. It consumes the stored path and
updates the nozzle position before travel planning. A short travel to the next
wall cannot discard this wipe or force a retraction or Z-hop. Subsequent travel
uses the normal minimum-travel threshold and retraction/lift settings from the
new position. The regular wipe, including fallback, remains deferred until a
normal retraction uses it.
Retraction is divided into portions before, during and after wiping. The amount
that can be retracted during the wipe depends on its executable length, wipe
speed and the active filament's retraction speed. Fractional retraction speeds
are retained in this calculation. For a 2 mm wipe at 100 mm/s and a retraction
speed of 25.5 mm/s, the wipe can retract 0.51 mm. With a total retraction of 0.8 mm
and both before/after percentages set to zero, the remaining 0.29 mm is retracted
before wiping. This split applies to regular deferred wipes, including fallback;
an accepted inward wipe executes separately without retraction.
## Implementation and verification
- [GCode.cpp](../../src/libslic3r/GCode.cpp) integrates path selection, nozzle
position and retraction; [Print.cpp](../../src/libslic3r/Print.cpp) controls
invalidation, and [PrintConfig.cpp](../../src/libslic3r/PrintConfig.cpp) defines
the settings.
- [WipePathHelpers](../../src/libslic3r/GCode/WipePathHelpers.hpp) implements path
sampling, offset selection and support checks.
- [Geometry tests](../../tests/libslic3r/test_wipe_path.cpp) cover support,
degenerate paths, contour and hole orientations, and exact loop-move geometry
across path subdivisions.
- [FFF tests](../../tests/fff_print/test_wipe.cpp) cover emitted trajectories,
fallback, minimum-travel retraction and Z-hop rules, and export invalidation.
With Wipe inward disabled, they check the loop move's direction and magnitude
for Classic and Arachne, the subsequent wipe's start and length, and fractional
retraction splitting in absolute and relative E modes.
Loop-move checks use reserved role/wipe markers and extrusion state, and run
with human-readable G-code comments both enabled and disabled.
@@ -1,79 +0,0 @@
#!/usr/bin/env python3
"""Belt temperature-tower asset generator (discrete-provini design).
A vertical temperature tower cannot be sliced on a belt printer, so lay a row of
DISCRETE provini (one per temperature) along the belt (designed Y) with a fixed
surface gap. Each provino is the chevron+arc unit (belt_temp_provino_unit.stl,
keel-first); its temperature is ENGRAVED upright into the 50 mm face — a raised
number would be an unsupported overhang on the belt. The C++ calib_temp belt branch
(Plater.cpp) injects one M104 per zone 70 layers INTO provino i:
print_z[i] = i * PITCH * cos(theta) + 70 * layer_height (theta = 45)
inside the body, not in the empty inter-provino gap (which has no sliced layers for
the event to attach to). PITCH below is the shared geometry contract with that code —
keep them in sync.
Generates one STL per filament temp range used by Temp_Calibration_Dlg.
"""
import numpy as np, trimesh, os
from matplotlib.textpath import TextPath
from matplotlib.font_manager import FontProperties
from shapely.geometry import Polygon as ShPoly
from shapely.ops import unary_union
HERE = os.path.dirname(os.path.abspath(__file__))
UNIT = os.path.join(HERE, 'belt_temp_provino_unit.stl') # single provino, keel-first
SURF_GAP = 25.0 # surface-to-surface gap between provini (mm) — user spec
TEXT_H = 9.0
TEXT_DEPTH = 0.8 # engraving depth (numbers are CUT into the face, not raised:
# a raised number is an unsupported Y-overhang on the belt)
TEXT_OVERSHOOT = 0.6 # extra height poking out of the face for a clean boolean cut
# Temperature ranges (start, end) per filament family, 5 C step. File name encodes them.
RANGES = [(230,190),(270,230),(250,230),(280,240),(240,210),(320,280)]
unit = trimesh.load(UNIT)
dY = unit.bounds[1,1] - unit.bounds[0,1]
PITCH = dY + SURF_GAP # designed-Y pitch == C++ contract constant
print(f"unit dY={dY:.2f} PITCH={PITCH:.3f} (C++ contract: print_z[i]=i*{PITCH:.3f}*cos45)")
# 50 mm face normal (0,-1,1)/sqrt2 ; UPRIGHT basis u=+X det(+1) (verified non-mirrored)
n = np.array([0,-1,1.])/np.sqrt(2)
u = np.array([1,0,0.]); v = np.array([0,1,1.])/np.sqrt(2)
R = np.column_stack([u,v,n])
fn = unit.face_normals; fc = unit.triangles_center; fa = unit.area_faces
sel = (fn@n) > 0.9
face_c = (fc[sel]*fa[sel,None]).sum(0)/fa[sel].sum()
def text_mesh(s):
tp = TextPath((0,0), s, size=TEXT_H, prop=FontProperties(family='DejaVu Sans'))
rings = [ShPoly(p) for p in tp.to_polygons() if len(p)>=3]
rings.sort(key=lambda r:r.area, reverse=True)
used=[False]*len(rings); parts=[]
for i,o in enumerate(rings):
if used[i]: continue
holes=[]
for j in range(i+1,len(rings)):
if not used[j] and o.contains(rings[j]): holes.append(rings[j].exterior.coords); used[j]=True
parts.append(ShPoly(o.exterior.coords,holes)); used[i]=True
poly = unary_union(parts)
geoms = list(poly.geoms) if poly.geom_type=='MultiPolygon' else [poly]
m = trimesh.util.concatenate([trimesh.creation.extrude_polygon(g,height=TEXT_DEPTH+TEXT_OVERSHOOT) for g in geoms])
c = m.bounds.mean(axis=0); m.apply_translation([-c[0],-c[1],0]); return m
for t_start, t_end in RANGES:
temps = list(range(t_start, t_end-1, -5))
parts=[]
for i,T in enumerate(temps):
c = unit.copy(); c.apply_translation([0, i*PITCH, 0])
t = text_mesh(str(T)); M=np.eye(4); M[:3,:3]=R; t.apply_transform(M)
# place the text spanning from TEXT_DEPTH inside the face to TEXT_OVERSHOOT outside,
# then CUT it out of the provino (engrave) — no raised material, no Y-overhang.
t.apply_translation(face_c - n*TEXT_DEPTH + np.array([0,i*PITCH,0]))
c = trimesh.boolean.difference([c, t], engine='manifold')
parts.append(c)
asset = trimesh.util.concatenate(parts)
out = os.path.join(HERE, f"belt_temp_tower_{t_start}_{t_end}.stl")
asset.export(out)
dims = np.round(asset.bounds[1]-asset.bounds[0],1)
wt = all(p.is_watertight for p in parts)
print(f" {t_start}->{t_end}: {len(temps)} zones bbox={dims} watertight={wt} -> {os.path.basename(out)}")
+1 -1
View File
@@ -75,7 +75,7 @@ documentation_link = https://www.orcaslicer.com/wiki/material_temperatures#print
[hint:Calibration]
text = Calibration\nDid you know that calibrating your printer can do wonders? Check out our beloved calibration solution in OrcaSlicer.
documentation_link = https://www.orcaslicer.com/wiki/calibration
documentation_link = https://www.orcaslicer.com/wiki/calibration_guide
[hint:Auxiliary fan]
text = Auxiliary fan\nDid you know that OrcaSlicer supports Auxiliary part cooling fan?
File diff suppressed because it is too large Load Diff
+1461 -1461
View File
File diff suppressed because it is too large Load Diff
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"105"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"100"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"100"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"100"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"100"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"100"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"75"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"70"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"75"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"70"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"80"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"75"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"80"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"65"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"65"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"75"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"65"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"65"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"60"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"65"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"65"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"65"
],
"version": "2.0.0.77"
]
}
@@ -315,6 +315,5 @@
],
"textured_plate_temp_initial_layer": [
"55"
],
"version": "2.0.0.87"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"100"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"35"
],
"version": "2.0.0.77"
]
}
@@ -334,6 +334,5 @@
],
"textured_plate_temp_initial_layer": [
"35"
],
"version": "2.0.0.77"
]
}
@@ -335,6 +335,5 @@
],
"textured_plate_temp_initial_layer": [
"35"
],
"version": "2.0.0.77"
]
}
+4 -4
View File
@@ -89,14 +89,14 @@
"name": "Generic PETG @Chuanying X1 0.25 Nozzle",
"sub_path": "filament/Generic PETG @Chuanying X1 0.25 Nozzle.json"
},
{
"name": "Generic PVA @Chuanying",
"sub_path": "filament/Generic PVA @Chuanying.json"
},
{
"name": "Generic PLA @Chuanying X1 0.25 Nozzle",
"sub_path": "filament/Generic PLA @Chuanying X1 0.25 Nozzle.json"
},
{
"name": "Generic PVA @Chuanying",
"sub_path": "filament/Generic PVA @Chuanying.json"
},
{
"name": "Generic PLA-Silk @Chuanying X1 0.25 Nozzle",
"sub_path": "filament/Generic PLA-Silk @Chuanying X1 0.25 Nozzle.json"
+12 -12
View File
@@ -196,6 +196,10 @@
"name": "Generic ABS @CoLiDo X16",
"sub_path": "filament/Generic ABS @CoLiDo X16.json"
},
{
"name": "CoLiDo PETG @CoLiDo SR1",
"sub_path": "filament/CoLiDo PETG @CoLiDo SR1.json"
},
{
"name": "Generic PETG @CoLiDo DIY 4.0",
"sub_path": "filament/Generic PETG @CoLiDo DIY 4.0.json"
@@ -204,18 +208,6 @@
"name": "Generic PETG @CoLiDo X16",
"sub_path": "filament/Generic PETG @CoLiDo X16.json"
},
{
"name": "CoLiDo PETG @CoLiDo SR1",
"sub_path": "filament/CoLiDo PETG @CoLiDo SR1.json"
},
{
"name": "Generic PLA @CoLiDo DIY 4.0",
"sub_path": "filament/Generic PLA @CoLiDo DIY 4.0.json"
},
{
"name": "Generic PLA @CoLiDo X16",
"sub_path": "filament/Generic PLA @CoLiDo X16.json"
},
{
"name": "CoLiDo PLA @CoLiDo SR1",
"sub_path": "filament/CoLiDo PLA @CoLiDo SR1.json"
@@ -228,6 +220,14 @@
"name": "CoLiDo PLA+ @CoLiDo DIY 4.0 V2",
"sub_path": "filament/CoLiDo PLA+ @CoLiDo DIY 4.0 V2.json"
},
{
"name": "Generic PLA @CoLiDo DIY 4.0",
"sub_path": "filament/Generic PLA @CoLiDo DIY 4.0.json"
},
{
"name": "Generic PLA @CoLiDo X16",
"sub_path": "filament/Generic PLA @CoLiDo X16.json"
},
{
"name": "Generic TPU @CoLiDo DIY 4.0",
"sub_path": "filament/Generic TPU @CoLiDo DIY 4.0.json"
File diff suppressed because it is too large Load Diff
@@ -1,160 +0,0 @@
{
"type": "filament",
"name": "CR-ABS @Ender-5 Max-all",
"inherits": "fdm_filament_abs",
"from": "system",
"setting_id": "iCeI2obXsgQdrmmd",
"instantiation": "true",
"activate_air_filtration": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"complete_print_exhaust_fan_speed": [
"80"
],
"cool_plate_temp": [
"90"
],
"cool_plate_temp_initial_layer": [
"90"
],
"during_print_exhaust_fan_speed": [
"60"
],
"fan_max_speed": [
"30"
],
"filament_cost": [
"15"
],
"filament_density": [
"1.08"
],
"filament_deretraction_speed": [
"35"
],
"filament_diameter": [
"1.75"
],
"filament_flow_ratio": [
"0.93"
],
"filament_is_support": [
"0"
],
"filament_max_volumetric_speed": [
"18"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_length": [
"nil"
],
"filament_retraction_minimum_travel": [
"1"
],
"filament_retraction_speed": [
"35"
],
"filament_soluble": [
"0"
],
"filament_vendor": [
"Creality"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"2"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"90"
],
"hot_plate_temp_initial_layer": [
"90"
],
"nozzle_temperature_range_high": [
"280"
],
"overhang_fan_speed": [
"60"
],
"required_nozzle_HRC": [
"0"
],
"slow_down_layer_time": [
"12"
],
"textured_plate_temp": [
"90"
],
"textured_plate_temp_initial_layer": [
"90"
],
"filament_start_gcode": [
"; Filament gcode\n"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"activate_chamber_temp_control": "0",
"chamber_temperature": "0",
"cool_cds_fan_start_at_height": "0.5",
"cool_special_cds_fan_speed": "0",
"customized_plate_temp": "90",
"customized_plate_temp_initial_layer": "90",
"default_filament_colour": "\"\"",
"enable_overhang_bridge_fan": "1",
"enable_pressure_advance": "1",
"enable_special_area_additional_cooling_fan": "0",
"epoxy_resin_plate_temp": "90",
"epoxy_resin_plate_temp_initial_layer": "90",
"filament_cooling_final_speed": "3.4",
"filament_cooling_initial_speed": "2.2",
"filament_cooling_moves": "4",
"filament_load_time": "0",
"filament_loading_speed": "28",
"filament_loading_speed_start": "3",
"filament_multitool_ramming": "0",
"filament_multitool_ramming_flow": "10",
"filament_multitool_ramming_volume": "10",
"filament_notes": "\"\"",
"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_lift_above": "nil",
"filament_retract_lift_below": "nil",
"filament_retract_lift_enforce": "nil",
"filament_shrink": "100%",
"filament_toolchange_delay": "0",
"filament_unload_time": "0",
"filament_unloading_speed": "90",
"filament_unloading_speed_start": "100",
"material_flow_dependent_temperature": "0",
"material_flow_temp_graph": "[[3.0,230],[5.0,250],[10.0,260]]",
"pressure_advance": "0.03",
"support_material_interface_fan_speed": "-1",
"compatible_printers": [
"Creality Ender-5 Max 0.4 nozzle"
]
}
@@ -1,185 +0,0 @@
{
"type": "filament",
"name": "CR-Nylon @Ender-5 Max-all",
"inherits": "fdm_filament_pa",
"from": "system",
"setting_id": "HHnHotIUIBzTdckU",
"instantiation": "true",
"activate_air_filtration": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"close_fan_the_first_x_layers": [
"1"
],
"complete_print_exhaust_fan_speed": [
"100"
],
"cool_plate_temp": [
"45"
],
"cool_plate_temp_initial_layer": [
"45"
],
"during_print_exhaust_fan_speed": [
"0"
],
"fan_cooling_layer_time": [
"100"
],
"fan_max_speed": [
"100"
],
"fan_min_speed": [
"100"
],
"filament_cost": [
"50"
],
"filament_density": [
"1.24"
],
"filament_deretraction_speed": [
"nil"
],
"filament_diameter": [
"1.75"
],
"filament_flow_ratio": [
"0.9"
],
"filament_is_support": [
"0"
],
"filament_max_volumetric_speed": [
"12"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_restart_extra": [
"0"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_length": [
"1.5"
],
"filament_retraction_minimum_travel": [
"nil"
],
"filament_retraction_speed": [
"nil"
],
"filament_soluble": [
"0"
],
"filament_vendor": [
"Creality"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"nil"
],
"filament_z_hop": [
"0.2"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"45"
],
"hot_plate_temp_initial_layer": [
"45"
],
"nozzle_temperature": [
"250"
],
"nozzle_temperature_initial_layer": [
"250"
],
"nozzle_temperature_range_high": [
"280"
],
"nozzle_temperature_range_low": [
"250"
],
"overhang_fan_speed": [
"50"
],
"overhang_fan_threshold": [
"50%"
],
"reduce_fan_stop_start_freq": [
"1"
],
"slow_down_for_layer_cooling": [
"1"
],
"slow_down_layer_time": [
"8"
],
"slow_down_min_speed": [
"5"
],
"textured_plate_temp": [
"45"
],
"textured_plate_temp_initial_layer": [
"45"
],
"filament_start_gcode": [
"; Filament gcode\n"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"activate_chamber_temp_control": "0",
"chamber_temperature": "35",
"cool_cds_fan_start_at_height": "0.5",
"cool_special_cds_fan_speed": "0",
"default_filament_colour": "\"\"",
"enable_overhang_bridge_fan": "1",
"enable_pressure_advance": "1",
"enable_special_area_additional_cooling_fan": "0",
"epoxy_resin_plate_temp": "45",
"epoxy_resin_plate_temp_initial_layer": "45",
"filament_cooling_final_speed": "3.4",
"filament_cooling_initial_speed": "2.2",
"filament_cooling_moves": "4",
"filament_load_time": "0",
"filament_loading_speed": "28",
"filament_loading_speed_start": "3",
"filament_multitool_ramming": "0",
"filament_multitool_ramming_flow": "10",
"filament_multitool_ramming_volume": "10",
"filament_notes": "\"\"",
"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_lift_above": "0",
"filament_retract_lift_below": "0",
"filament_retract_lift_enforce": "All Surfaces",
"filament_shrink": "100%",
"filament_toolchange_delay": "0",
"filament_unload_time": "0",
"filament_unloading_speed": "90",
"filament_unloading_speed_start": "100",
"material_flow_dependent_temperature": "0",
"material_flow_temp_graph": "[[3.0,210], [10.0,220], [12.0,230]]",
"pressure_advance": "0.042",
"support_material_interface_fan_speed": "-1",
"compatible_printers": [
"Creality Ender-5 Max 0.4 nozzle"
]
}
@@ -1,163 +0,0 @@
{
"type": "filament",
"name": "CR-PETG @Ender-5 Max-all",
"inherits": "fdm_filament_petg",
"from": "system",
"setting_id": "jMfevCqhjSPahBHJ",
"instantiation": "true",
"activate_air_filtration": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"close_fan_the_first_x_layers": [
"1"
],
"complete_print_exhaust_fan_speed": [
"0"
],
"cool_plate_temp": [
"70"
],
"cool_plate_temp_initial_layer": [
"70"
],
"during_print_exhaust_fan_speed": [
"0"
],
"eng_plate_temp": [
"0"
],
"eng_plate_temp_initial_layer": [
"0"
],
"fan_cooling_layer_time": [
"30"
],
"fan_max_speed": [
"40"
],
"fan_min_speed": [
"10"
],
"filament_cost": [
"14"
],
"filament_density": [
"1.23"
],
"filament_deretraction_speed": [
"30"
],
"filament_flow_ratio": [
"0.95"
],
"filament_is_support": [
"0"
],
"filament_max_volumetric_speed": [
"16"
],
"filament_retract_before_wipe": [
"80%"
],
"filament_retraction_minimum_travel": [
"1"
],
"filament_retraction_speed": [
"30"
],
"filament_type": [
"PETG"
],
"filament_vendor": [
"Creality"
],
"filament_wipe_distance": [
"2"
],
"hot_plate_temp": [
"80"
],
"hot_plate_temp_initial_layer": [
"80"
],
"nozzle_temperature": [
"240"
],
"nozzle_temperature_initial_layer": [
"240"
],
"nozzle_temperature_range_high": [
"270"
],
"nozzle_temperature_range_low": [
"220"
],
"overhang_fan_speed": [
"90"
],
"overhang_fan_threshold": [
"25%"
],
"reduce_fan_stop_start_freq": [
"1"
],
"required_nozzle_HRC": [
"0"
],
"temperature_vitrification": [
"80"
],
"textured_plate_temp": [
"80"
],
"textured_plate_temp_initial_layer": [
"80"
],
"filament_start_gcode": [
"; filament start gcode\n"
],
"activate_chamber_temp_control": "0",
"chamber_temperature": "0",
"cool_cds_fan_start_at_height": "0.5",
"cool_special_cds_fan_speed": "0",
"customized_plate_temp": "80",
"customized_plate_temp_initial_layer": "80",
"default_filament_colour": "\"\"",
"enable_overhang_bridge_fan": "1",
"enable_pressure_advance": "1",
"enable_special_area_additional_cooling_fan": "0",
"epoxy_resin_plate_temp": "80",
"epoxy_resin_plate_temp_initial_layer": "80",
"filament_cooling_final_speed": "3.4",
"filament_cooling_initial_speed": "2.2",
"filament_cooling_moves": "4",
"filament_load_time": "0",
"filament_loading_speed": "28",
"filament_loading_speed_start": "3",
"filament_multitool_ramming": "0",
"filament_multitool_ramming_flow": "10",
"filament_multitool_ramming_volume": "10",
"filament_notes": "\"\"",
"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_lift_above": "nil",
"filament_retract_lift_below": "nil",
"filament_retract_lift_enforce": "nil",
"filament_shrink": "100%",
"filament_toolchange_delay": "0",
"filament_unload_time": "0",
"filament_unloading_speed": "90",
"filament_unloading_speed_start": "100",
"material_flow_dependent_temperature": "0",
"material_flow_temp_graph": "[[3.0,220],[5.0,240],[10.0,250]]",
"pressure_advance": "0.05",
"filament_id": "06101",
"support_material_interface_fan_speed": "-1",
"compatible_printers": [
"Creality Ender-5 Max 0.4 nozzle",
"Creality Ender-5 Max 0.6 nozzle",
"Creality Ender-5 Max 0.8 nozzle"
]
}
@@ -1,157 +0,0 @@
{
"type": "filament",
"name": "CR-PLA @Ender-5 Max-all",
"inherits": "fdm_filament_pla",
"from": "system",
"setting_id": "sU0HCPjQoOLHPmPc",
"instantiation": "true",
"activate_air_filtration": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"complete_print_exhaust_fan_speed": [
"80"
],
"cool_plate_temp": [
"45"
],
"cool_plate_temp_initial_layer": [
"45"
],
"during_print_exhaust_fan_speed": [
"60"
],
"eng_plate_temp": [
"50"
],
"eng_plate_temp_initial_layer": [
"50"
],
"filament_deretraction_speed": [
"35"
],
"filament_diameter": [
"1.75"
],
"filament_flow_ratio": [
"0.95"
],
"filament_is_support": [
"0"
],
"filament_max_volumetric_speed": [
"18"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_length": [
"nil"
],
"filament_retraction_minimum_travel": [
"1"
],
"filament_retraction_speed": [
"35"
],
"filament_soluble": [
"0"
],
"filament_vendor": [
"Creality"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"2"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"50"
],
"hot_plate_temp_initial_layer": [
"50"
],
"nozzle_temperature_range_high": [
"240"
],
"required_nozzle_HRC": [
"0"
],
"slow_down_layer_time": [
"10"
],
"slow_down_min_speed": [
"20"
],
"textured_plate_temp": [
"45"
],
"textured_plate_temp_initial_layer": [
"50"
],
"filament_start_gcode": [
"; Filament gcode\n"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"activate_chamber_temp_control": "0",
"chamber_temperature": "0",
"cool_cds_fan_start_at_height": "0.5",
"cool_special_cds_fan_speed": "0",
"customized_plate_temp": "50",
"customized_plate_temp_initial_layer": "50",
"default_filament_colour": "\"\"",
"enable_overhang_bridge_fan": "1",
"enable_pressure_advance": "1",
"enable_special_area_additional_cooling_fan": "0",
"epoxy_resin_plate_temp": "50",
"epoxy_resin_plate_temp_initial_layer": "50",
"filament_cooling_final_speed": "3.4",
"filament_cooling_initial_speed": "2.2",
"filament_cooling_moves": "4",
"filament_load_time": "0",
"filament_loading_speed": "28",
"filament_loading_speed_start": "3",
"filament_multitool_ramming": "0",
"filament_multitool_ramming_flow": "10",
"filament_multitool_ramming_volume": "10",
"filament_notes": "\"\"",
"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_lift_above": "nil",
"filament_retract_lift_below": "nil",
"filament_retract_lift_enforce": "nil",
"filament_shrink": "100%",
"filament_toolchange_delay": "0",
"filament_unload_time": "0",
"filament_unloading_speed": "90",
"filament_unloading_speed_start": "100",
"material_flow_dependent_temperature": "1",
"material_flow_temp_graph": "[[0.5,190],[1.0,220]]",
"pressure_advance": "0.04",
"support_material_interface_fan_speed": "-1",
"compatible_printers": [
"Creality Ender-5 Max 0.4 nozzle"
]
}
@@ -1,157 +0,0 @@
{
"type": "filament",
"name": "CR-Silk @Ender-5 Max-all",
"inherits": "fdm_filament_pla",
"from": "system",
"setting_id": "vFgKdtdiuqqrL9rk",
"instantiation": "true",
"activate_air_filtration": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"complete_print_exhaust_fan_speed": [
"80"
],
"cool_plate_temp": [
"45"
],
"cool_plate_temp_initial_layer": [
"45"
],
"during_print_exhaust_fan_speed": [
"60"
],
"eng_plate_temp": [
"50"
],
"eng_plate_temp_initial_layer": [
"50"
],
"filament_cost": [
"22"
],
"filament_density": [
"1.25"
],
"filament_deretraction_speed": [
"35"
],
"filament_diameter": [
"1.75"
],
"filament_flow_ratio": [
"0.95"
],
"filament_is_support": [
"0"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_retract_before_wipe": [
"90%"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_length": [
"1"
],
"filament_retraction_minimum_travel": [
"1"
],
"filament_retraction_speed": [
"35"
],
"filament_soluble": [
"0"
],
"filament_vendor": [
"Creality"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"2"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"55"
],
"hot_plate_temp_initial_layer": [
"55"
],
"nozzle_temperature_range_high": [
"240"
],
"required_nozzle_HRC": [
"0"
],
"slow_down_layer_time": [
"12"
],
"slow_down_min_speed": [
"20"
],
"textured_plate_temp": [
"55"
],
"textured_plate_temp_initial_layer": [
"55"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"activate_chamber_temp_control": "0",
"chamber_temperature": "35",
"cool_cds_fan_start_at_height": "0.5",
"cool_special_cds_fan_speed": "0",
"customized_plate_temp": "55",
"customized_plate_temp_initial_layer": "55",
"default_filament_colour": "\"\"",
"enable_overhang_bridge_fan": "1",
"enable_pressure_advance": "1",
"enable_special_area_additional_cooling_fan": "0",
"epoxy_resin_plate_temp": "55",
"epoxy_resin_plate_temp_initial_layer": "55",
"filament_cooling_final_speed": "3.4",
"filament_cooling_initial_speed": "2.2",
"filament_cooling_moves": "4",
"filament_load_time": "0",
"filament_loading_speed": "28",
"filament_loading_speed_start": "3",
"filament_multitool_ramming": "0",
"filament_multitool_ramming_flow": "10",
"filament_multitool_ramming_volume": "10",
"filament_notes": "\"\"",
"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_lift_above": "nil",
"filament_retract_lift_below": "nil",
"filament_retract_lift_enforce": "nil",
"filament_shrink": "100%",
"filament_toolchange_delay": "0",
"filament_unload_time": "0",
"filament_unloading_speed": "90",
"filament_unloading_speed_start": "100",
"material_flow_dependent_temperature": "0",
"material_flow_temp_graph": "[[1.0,190],[1.2,220]]",
"pressure_advance": "0.048",
"support_material_interface_fan_speed": "-1",
"compatible_printers": [
"Creality Ender-5 Max 0.4 nozzle"
]
}
@@ -1,163 +0,0 @@
{
"type": "filament",
"name": "Generic ABS @Ender-5 Max-all",
"inherits": "fdm_filament_abs",
"from": "system",
"setting_id": "3BjyaE4hGrz7tqnk",
"instantiation": "true",
"activate_air_filtration": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"complete_print_exhaust_fan_speed": [
"80"
],
"cool_plate_temp": [
"90"
],
"cool_plate_temp_initial_layer": [
"90"
],
"during_print_exhaust_fan_speed": [
"60"
],
"fan_max_speed": [
"30"
],
"filament_cost": [
"15"
],
"filament_density": [
"1.24"
],
"filament_deretraction_speed": [
"35"
],
"filament_diameter": [
"1.75"
],
"filament_flow_ratio": [
"0.95"
],
"filament_is_support": [
"0"
],
"filament_max_volumetric_speed": [
"18"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_length": [
"nil"
],
"filament_retraction_minimum_travel": [
"1"
],
"filament_retraction_speed": [
"35"
],
"filament_soluble": [
"0"
],
"filament_vendor": [
"Generic"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"2"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"90"
],
"hot_plate_temp_initial_layer": [
"90"
],
"nozzle_temperature_range_high": [
"280"
],
"overhang_fan_speed": [
"60"
],
"reduce_fan_stop_start_freq": [
"0"
],
"required_nozzle_HRC": [
"0"
],
"slow_down_layer_time": [
"12"
],
"textured_plate_temp": [
"90"
],
"textured_plate_temp_initial_layer": [
"90"
],
"filament_start_gcode": [
"; Filament gcode\n"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"activate_chamber_temp_control": "0",
"chamber_temperature": "0",
"cool_cds_fan_start_at_height": "0.5",
"cool_special_cds_fan_speed": "0",
"customized_plate_temp": "90",
"customized_plate_temp_initial_layer": "90",
"default_filament_colour": "\"\"",
"enable_overhang_bridge_fan": "1",
"enable_pressure_advance": "1",
"enable_special_area_additional_cooling_fan": "0",
"epoxy_resin_plate_temp": "90",
"epoxy_resin_plate_temp_initial_layer": "90",
"filament_cooling_final_speed": "3.4",
"filament_cooling_initial_speed": "2.2",
"filament_cooling_moves": "4",
"filament_load_time": "0",
"filament_loading_speed": "28",
"filament_loading_speed_start": "3",
"filament_multitool_ramming": "0",
"filament_multitool_ramming_flow": "10",
"filament_multitool_ramming_volume": "10",
"filament_notes": "\"\"",
"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_lift_above": "nil",
"filament_retract_lift_below": "nil",
"filament_retract_lift_enforce": "nil",
"filament_shrink": "100%",
"filament_toolchange_delay": "0",
"filament_unload_time": "0",
"filament_unloading_speed": "90",
"filament_unloading_speed_start": "100",
"material_flow_dependent_temperature": "0",
"material_flow_temp_graph": "[[3.0,230],[5.0,250],[10.0,260]]",
"pressure_advance": "0.034",
"support_material_interface_fan_speed": "-1",
"compatible_printers": [
"Creality Ender-5 Max 0.4 nozzle"
]
}
@@ -1,175 +0,0 @@
{
"type": "filament",
"name": "Generic ASA @Ender-5 Max-all",
"inherits": "fdm_filament_asa",
"from": "system",
"setting_id": "1cOFjktr0dBTbYS4",
"instantiation": "true",
"activate_air_filtration": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"close_fan_the_first_x_layers": [
"1"
],
"complete_print_exhaust_fan_speed": [
"80"
],
"cool_plate_temp": [
"90"
],
"cool_plate_temp_initial_layer": [
"90"
],
"during_print_exhaust_fan_speed": [
"60"
],
"eng_plate_temp": [
"50"
],
"eng_plate_temp_initial_layer": [
"50"
],
"fan_cooling_layer_time": [
"30"
],
"fan_max_speed": [
"70"
],
"fan_min_speed": [
"20"
],
"filament_cost": [
"30"
],
"filament_density": [
"1.24"
],
"filament_deretraction_speed": [
"35"
],
"filament_diameter": [
"1.75"
],
"filament_flow_ratio": [
"0.93"
],
"filament_is_support": [
"0"
],
"filament_max_volumetric_speed": [
"12"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_retract_before_wipe": [
"100%"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_length": [
"nil"
],
"filament_retraction_minimum_travel": [
"1"
],
"filament_retraction_speed": [
"35"
],
"filament_soluble": [
"0"
],
"filament_vendor": [
"Generic"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"2"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"90"
],
"hot_plate_temp_initial_layer": [
"90"
],
"nozzle_temperature_range_high": [
"280"
],
"reduce_fan_stop_start_freq": [
"0"
],
"required_nozzle_HRC": [
"0"
],
"slow_down_layer_time": [
"12"
],
"textured_plate_temp": [
"90"
],
"textured_plate_temp_initial_layer": [
"90"
],
"filament_start_gcode": [
"; filament start gcode\n"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"activate_chamber_temp_control": "0",
"chamber_temperature": "55",
"cool_cds_fan_start_at_height": "0.5",
"cool_special_cds_fan_speed": "0",
"customized_plate_temp": "90",
"customized_plate_temp_initial_layer": "90",
"default_filament_colour": "\"\"",
"enable_overhang_bridge_fan": "1",
"enable_pressure_advance": "1",
"enable_special_area_additional_cooling_fan": "0",
"epoxy_resin_plate_temp": "90",
"epoxy_resin_plate_temp_initial_layer": "90",
"filament_cooling_final_speed": "3.4",
"filament_cooling_initial_speed": "2.2",
"filament_cooling_moves": "4",
"filament_load_time": "0",
"filament_loading_speed": "28",
"filament_loading_speed_start": "3",
"filament_multitool_ramming": "0",
"filament_multitool_ramming_flow": "10",
"filament_multitool_ramming_volume": "10",
"filament_notes": "\"\"",
"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_lift_above": "nil",
"filament_retract_lift_below": "nil",
"filament_retract_lift_enforce": "nil",
"filament_shrink": "100%",
"filament_toolchange_delay": "0",
"filament_unload_time": "0",
"filament_unloading_speed": "90",
"filament_unloading_speed_start": "100",
"material_flow_dependent_temperature": "0",
"material_flow_temp_graph": "[[3.0,240],[8.0,250],[12.0,260]]",
"pressure_advance": "0.03",
"support_material_interface_fan_speed": "-1",
"compatible_printers": [
"Creality Ender-5 Max 0.4 nozzle"
]
}
@@ -1,163 +0,0 @@
{
"type": "filament",
"name": "Generic PETG @Ender-5 Max-all",
"inherits": "fdm_filament_petg",
"from": "system",
"setting_id": "yNgF407ERXuU7LHE",
"instantiation": "true",
"activate_air_filtration": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"close_fan_the_first_x_layers": [
"1"
],
"complete_print_exhaust_fan_speed": [
"0"
],
"cool_plate_temp": [
"70"
],
"cool_plate_temp_initial_layer": [
"70"
],
"during_print_exhaust_fan_speed": [
"0"
],
"eng_plate_temp": [
"0"
],
"eng_plate_temp_initial_layer": [
"0"
],
"fan_cooling_layer_time": [
"30"
],
"fan_max_speed": [
"60"
],
"fan_min_speed": [
"20"
],
"filament_cost": [
"14"
],
"filament_density": [
"1.24"
],
"filament_deretraction_speed": [
"40"
],
"filament_flow_ratio": [
"0.95"
],
"filament_is_support": [
"0"
],
"filament_max_volumetric_speed": [
"14"
],
"filament_retract_before_wipe": [
"90%"
],
"filament_retraction_length": [
"0.4"
],
"filament_retraction_minimum_travel": [
"1"
],
"filament_retraction_speed": [
"40"
],
"filament_type": [
"PETG"
],
"filament_wipe_distance": [
"2"
],
"hot_plate_temp": [
"80"
],
"hot_plate_temp_initial_layer": [
"80"
],
"nozzle_temperature": [
"240"
],
"nozzle_temperature_initial_layer": [
"240"
],
"nozzle_temperature_range_high": [
"270"
],
"nozzle_temperature_range_low": [
"220"
],
"overhang_fan_speed": [
"90"
],
"overhang_fan_threshold": [
"25%"
],
"reduce_fan_stop_start_freq": [
"1"
],
"required_nozzle_HRC": [
"0"
],
"slow_down_layer_time": [
"12"
],
"temperature_vitrification": [
"80"
],
"textured_plate_temp": [
"80"
],
"textured_plate_temp_initial_layer": [
"80"
],
"filament_start_gcode": [
"; filament start gcode\n"
],
"activate_chamber_temp_control": "0",
"chamber_temperature": "0",
"cool_cds_fan_start_at_height": "0.5",
"cool_special_cds_fan_speed": "0",
"customized_plate_temp": "80",
"customized_plate_temp_initial_layer": "80",
"default_filament_colour": "\"\"",
"enable_overhang_bridge_fan": "1",
"enable_pressure_advance": "1",
"enable_special_area_additional_cooling_fan": "0",
"epoxy_resin_plate_temp": "80",
"epoxy_resin_plate_temp_initial_layer": "80",
"filament_cooling_final_speed": "3.4",
"filament_cooling_initial_speed": "2.2",
"filament_cooling_moves": "4",
"filament_load_time": "0",
"filament_loading_speed": "28",
"filament_loading_speed_start": "3",
"filament_multitool_ramming": "0",
"filament_multitool_ramming_flow": "10",
"filament_multitool_ramming_volume": "10",
"filament_notes": "\"\"",
"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_lift_above": "nil",
"filament_retract_lift_below": "nil",
"filament_retract_lift_enforce": "nil",
"filament_shrink": "100%",
"filament_toolchange_delay": "0",
"filament_unload_time": "0",
"filament_unloading_speed": "90",
"filament_unloading_speed_start": "100",
"material_flow_dependent_temperature": "0",
"material_flow_temp_graph": "[[0.8,230],[1.0,240]]",
"pressure_advance": "0.064",
"support_material_interface_fan_speed": "-1",
"compatible_printers": [
"Creality Ender-5 Max 0.4 nozzle"
]
}
@@ -1,161 +0,0 @@
{
"type": "filament",
"name": "Generic PLA @Ender-5 Max-all",
"inherits": "fdm_filament_pla",
"from": "system",
"setting_id": "ubfcxetXGj6agAoi",
"instantiation": "true",
"activate_air_filtration": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"complete_print_exhaust_fan_speed": [
"0"
],
"cool_plate_temp": [
"45"
],
"cool_plate_temp_initial_layer": [
"45"
],
"during_print_exhaust_fan_speed": [
"0"
],
"eng_plate_temp": [
"50"
],
"eng_plate_temp_initial_layer": [
"50"
],
"filament_deretraction_speed": [
"35"
],
"filament_diameter": [
"1.75"
],
"filament_flow_ratio": [
"0.95"
],
"filament_is_support": [
"0"
],
"filament_max_volumetric_speed": [
"14"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_retract_before_wipe": [
"80%"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_length": [
"0.8"
],
"filament_retraction_minimum_travel": [
"1"
],
"filament_retraction_speed": [
"35"
],
"filament_soluble": [
"0"
],
"filament_vendor": [
"Generic"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"2"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"55"
],
"hot_plate_temp_initial_layer": [
"55"
],
"nozzle_temperature": [
"210"
],
"nozzle_temperature_initial_layer": [
"210"
],
"nozzle_temperature_range_high": [
"240"
],
"required_nozzle_HRC": [
"0"
],
"slow_down_layer_time": [
"12"
],
"slow_down_min_speed": [
"20"
],
"textured_plate_temp": [
"55"
],
"textured_plate_temp_initial_layer": [
"55"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"activate_chamber_temp_control": "0",
"chamber_temperature": "0",
"cool_cds_fan_start_at_height": "0.5",
"cool_special_cds_fan_speed": "0",
"customized_plate_temp": "55",
"customized_plate_temp_initial_layer": "55",
"default_filament_colour": "\"\"",
"enable_overhang_bridge_fan": "1",
"enable_pressure_advance": "1",
"enable_special_area_additional_cooling_fan": "0",
"epoxy_resin_plate_temp": "55",
"epoxy_resin_plate_temp_initial_layer": "55",
"filament_cooling_final_speed": "3.4",
"filament_cooling_initial_speed": "2.2",
"filament_cooling_moves": "4",
"filament_load_time": "0",
"filament_loading_speed": "28",
"filament_loading_speed_start": "3",
"filament_multitool_ramming": "0",
"filament_multitool_ramming_flow": "10",
"filament_multitool_ramming_volume": "10",
"filament_notes": "\"\"",
"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_lift_above": "nil",
"filament_retract_lift_below": "nil",
"filament_retract_lift_enforce": "nil",
"filament_shrink": "100%",
"filament_shrinkage_compensation_z": "100%",
"filament_toolchange_delay": "0",
"filament_unload_time": "0",
"filament_unloading_speed": "90",
"filament_unloading_speed_start": "100",
"material_flow_dependent_temperature": "0",
"material_flow_temp_graph": "[[0.8,190],[1.0,210]]",
"pressure_advance": "0.04",
"support_material_interface_fan_speed": "-1",
"compatible_printers": [
"Creality Ender-5 Max 0.4 nozzle"
]
}
@@ -1,161 +0,0 @@
{
"type": "filament",
"name": "Generic PLA-CF @Ender-5 Max-all",
"inherits": "fdm_filament_pla",
"from": "system",
"setting_id": "AHrCSGRui6sRCmQx",
"instantiation": "true",
"activate_air_filtration": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"complete_print_exhaust_fan_speed": [
"0"
],
"cool_plate_temp": [
"45"
],
"cool_plate_temp_initial_layer": [
"45"
],
"during_print_exhaust_fan_speed": [
"0"
],
"eng_plate_temp": [
"50"
],
"eng_plate_temp_initial_layer": [
"50"
],
"filament_cost": [
"30"
],
"filament_deretraction_speed": [
"35"
],
"filament_diameter": [
"1.75"
],
"filament_flow_ratio": [
"0.95"
],
"filament_is_support": [
"0"
],
"filament_max_volumetric_speed": [
"18"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_length": [
"nil"
],
"filament_retraction_minimum_travel": [
"1"
],
"filament_retraction_speed": [
"35"
],
"filament_soluble": [
"0"
],
"filament_type": [
"PLA-CF"
],
"filament_vendor": [
"Generic"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"2"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"50"
],
"hot_plate_temp_initial_layer": [
"50"
],
"nozzle_temperature_range_high": [
"240"
],
"required_nozzle_HRC": [
"0"
],
"slow_down_layer_time": [
"10"
],
"slow_down_min_speed": [
"20"
],
"textured_plate_temp": [
"50"
],
"textured_plate_temp_initial_layer": [
"50"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"activate_chamber_temp_control": "0",
"chamber_temperature": "0",
"cool_cds_fan_start_at_height": "0.5",
"cool_special_cds_fan_speed": "0",
"customized_plate_temp": "50",
"customized_plate_temp_initial_layer": "50",
"default_filament_colour": "\"\"",
"enable_overhang_bridge_fan": "1",
"enable_pressure_advance": "1",
"enable_special_area_additional_cooling_fan": "0",
"epoxy_resin_plate_temp": "50",
"epoxy_resin_plate_temp_initial_layer": "50",
"filament_cooling_final_speed": "3.4",
"filament_cooling_initial_speed": "2.2",
"filament_cooling_moves": "4",
"filament_load_time": "0",
"filament_loading_speed": "28",
"filament_loading_speed_start": "3",
"filament_multitool_ramming": "0",
"filament_multitool_ramming_flow": "10",
"filament_multitool_ramming_volume": "10",
"filament_notes": "\"\"",
"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_lift_above": "nil",
"filament_retract_lift_below": "nil",
"filament_retract_lift_enforce": "nil",
"filament_shrink": "100%",
"filament_shrinkage_compensation_z": "100%",
"filament_toolchange_delay": "0",
"filament_unload_time": "0",
"filament_unloading_speed": "90",
"filament_unloading_speed_start": "100",
"material_flow_dependent_temperature": "0",
"material_flow_temp_graph": "[[1.0,190],[1.2,220]]",
"pressure_advance": "0.03",
"support_material_interface_fan_speed": "-1",
"compatible_printers": [
"Creality Ender-5 Max 0.4 nozzle"
]
}
@@ -1,155 +0,0 @@
{
"type": "filament",
"name": "Generic PLA-Silk @Ender-5 Max-all",
"inherits": "fdm_filament_pla",
"from": "system",
"setting_id": "zIrKl9P6Aer6sbiS",
"instantiation": "true",
"activate_air_filtration": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"complete_print_exhaust_fan_speed": [
"0"
],
"cool_plate_temp": [
"45"
],
"cool_plate_temp_initial_layer": [
"45"
],
"during_print_exhaust_fan_speed": [
"0"
],
"eng_plate_temp": [
"50"
],
"eng_plate_temp_initial_layer": [
"50"
],
"filament_deretraction_speed": [
"30"
],
"filament_diameter": [
"1.75"
],
"filament_flow_ratio": [
"0.95"
],
"filament_is_support": [
"0"
],
"filament_max_volumetric_speed": [
"10"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_retract_before_wipe": [
"80%"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_length": [
"0.8"
],
"filament_retraction_minimum_travel": [
"1"
],
"filament_retraction_speed": [
"30"
],
"filament_soluble": [
"0"
],
"filament_vendor": [
"Generic"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"2"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"55"
],
"hot_plate_temp_initial_layer": [
"55"
],
"nozzle_temperature_range_high": [
"240"
],
"required_nozzle_HRC": [
"0"
],
"slow_down_layer_time": [
"14"
],
"slow_down_min_speed": [
"20"
],
"textured_plate_temp": [
"55"
],
"textured_plate_temp_initial_layer": [
"55"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"activate_chamber_temp_control": "0",
"chamber_temperature": "0",
"cool_cds_fan_start_at_height": "0.5",
"cool_special_cds_fan_speed": "0",
"customized_plate_temp": "55",
"customized_plate_temp_initial_layer": "55",
"default_filament_colour": "\"\"",
"enable_overhang_bridge_fan": "1",
"enable_pressure_advance": "1",
"enable_special_area_additional_cooling_fan": "0",
"epoxy_resin_plate_temp": "55",
"epoxy_resin_plate_temp_initial_layer": "55",
"filament_cooling_final_speed": "3.4",
"filament_cooling_initial_speed": "2.2",
"filament_cooling_moves": "4",
"filament_load_time": "0",
"filament_loading_speed": "28",
"filament_loading_speed_start": "3",
"filament_multitool_ramming": "0",
"filament_multitool_ramming_flow": "10",
"filament_multitool_ramming_volume": "10",
"filament_notes": "\"\"",
"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_lift_above": "nil",
"filament_retract_lift_below": "nil",
"filament_retract_lift_enforce": "nil",
"filament_shrink": "100%",
"filament_shrinkage_compensation_z": "100%",
"filament_toolchange_delay": "0",
"filament_unload_time": "0",
"filament_unloading_speed": "90",
"filament_unloading_speed_start": "100",
"material_flow_dependent_temperature": "0",
"material_flow_temp_graph": "[[0.8,190],[1.0,220]]",
"pressure_advance": "0.044",
"support_material_interface_fan_speed": "-1",
"compatible_printers": [
"Creality Ender-5 Max 0.4 nozzle"
]
}
@@ -1,166 +0,0 @@
{
"type": "filament",
"name": "Generic TPU @Ender-5 Max-all",
"inherits": "fdm_filament_tpu",
"from": "system",
"setting_id": "KPUcdZyegXYeyHOL",
"instantiation": "true",
"activate_air_filtration": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"complete_print_exhaust_fan_speed": [
"0"
],
"cool_plate_temp": [
"45"
],
"cool_plate_temp_initial_layer": [
"45"
],
"during_print_exhaust_fan_speed": [
"0"
],
"eng_plate_temp": [
"35"
],
"eng_plate_temp_initial_layer": [
"35"
],
"filament_cost": [
"25"
],
"filament_deretraction_speed": [
"35"
],
"filament_diameter": [
"1.75"
],
"filament_flow_ratio": [
"1"
],
"filament_is_support": [
"0"
],
"filament_max_volumetric_speed": [
"2"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_length": [
"1"
],
"filament_retraction_minimum_travel": [
"2"
],
"filament_retraction_speed": [
"35"
],
"filament_soluble": [
"0"
],
"filament_vendor": [
"Generic"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"2"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"50"
],
"hot_plate_temp_initial_layer": [
"50"
],
"nozzle_temperature": [
"210"
],
"nozzle_temperature_initial_layer": [
"210"
],
"nozzle_temperature_range_high": [
"220"
],
"overhang_fan_threshold": [
"50%"
],
"required_nozzle_HRC": [
"0"
],
"slow_down_layer_time": [
"10"
],
"slow_down_min_speed": [
"10"
],
"textured_plate_temp": [
"50"
],
"textured_plate_temp_initial_layer": [
"50"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"activate_chamber_temp_control": "0",
"chamber_temperature": "0",
"cool_cds_fan_start_at_height": "0.5",
"cool_special_cds_fan_speed": "0",
"customized_plate_temp": "50",
"customized_plate_temp_initial_layer": "50",
"default_filament_colour": "\"\"",
"enable_overhang_bridge_fan": "1",
"enable_pressure_advance": "1",
"enable_special_area_additional_cooling_fan": "0",
"epoxy_resin_plate_temp": "50",
"epoxy_resin_plate_temp_initial_layer": "50",
"filament_cooling_final_speed": "3.4",
"filament_cooling_initial_speed": "2.2",
"filament_cooling_moves": "4",
"filament_load_time": "0",
"filament_loading_speed": "28",
"filament_loading_speed_start": "3",
"filament_multitool_ramming": "0",
"filament_multitool_ramming_flow": "10",
"filament_multitool_ramming_volume": "10",
"filament_notes": "\"\"",
"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_lift_above": "nil",
"filament_retract_lift_below": "nil",
"filament_retract_lift_enforce": "nil",
"filament_shrink": "100%",
"filament_toolchange_delay": "0",
"filament_unload_time": "0",
"filament_unloading_speed": "90",
"filament_unloading_speed_start": "100",
"material_flow_dependent_temperature": "0",
"material_flow_temp_graph": "[[3.0,210], [10.0,220], [12.0,230]]",
"pressure_advance": "0.4",
"support_material_interface_fan_speed": "-1",
"compatible_printers": [
"Creality Ender-5 Max 0.4 nozzle"
]
}
@@ -1,175 +0,0 @@
{
"type": "filament",
"name": "HP-ASA @Ender-5 Max-all",
"inherits": "fdm_filament_asa",
"from": "system",
"setting_id": "JzsojF2Um23vm2qT",
"instantiation": "true",
"activate_air_filtration": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"close_fan_the_first_x_layers": [
"1"
],
"complete_print_exhaust_fan_speed": [
"80"
],
"cool_plate_temp": [
"90"
],
"cool_plate_temp_initial_layer": [
"90"
],
"during_print_exhaust_fan_speed": [
"60"
],
"eng_plate_temp": [
"50"
],
"eng_plate_temp_initial_layer": [
"50"
],
"fan_cooling_layer_time": [
"30"
],
"fan_max_speed": [
"50"
],
"fan_min_speed": [
"20"
],
"filament_cost": [
"29"
],
"filament_density": [
"1.15"
],
"filament_deretraction_speed": [
"35"
],
"filament_diameter": [
"1.75"
],
"filament_flow_ratio": [
"0.88"
],
"filament_is_support": [
"0"
],
"filament_max_volumetric_speed": [
"16"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_length": [
"nil"
],
"filament_retraction_minimum_travel": [
"1"
],
"filament_retraction_speed": [
"35"
],
"filament_soluble": [
"0"
],
"filament_vendor": [
"Creality"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"2"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"90"
],
"hot_plate_temp_initial_layer": [
"90"
],
"nozzle_temperature_range_high": [
"280"
],
"reduce_fan_stop_start_freq": [
"0"
],
"required_nozzle_HRC": [
"0"
],
"slow_down_layer_time": [
"10"
],
"textured_plate_temp": [
"90"
],
"textured_plate_temp_initial_layer": [
"90"
],
"filament_start_gcode": [
"; filament start gcode\n"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"activate_chamber_temp_control": "0",
"chamber_temperature": "55",
"cool_cds_fan_start_at_height": "0.5",
"cool_special_cds_fan_speed": "0",
"customized_plate_temp": "90",
"customized_plate_temp_initial_layer": "90",
"default_filament_colour": "\"\"",
"enable_overhang_bridge_fan": "1",
"enable_pressure_advance": "1",
"enable_special_area_additional_cooling_fan": "0",
"epoxy_resin_plate_temp": "90",
"epoxy_resin_plate_temp_initial_layer": "90",
"filament_cooling_final_speed": "3.4",
"filament_cooling_initial_speed": "2.2",
"filament_cooling_moves": "4",
"filament_load_time": "0",
"filament_loading_speed": "28",
"filament_loading_speed_start": "3",
"filament_multitool_ramming": "0",
"filament_multitool_ramming_flow": "10",
"filament_multitool_ramming_volume": "10",
"filament_notes": "\"\"",
"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_lift_above": "nil",
"filament_retract_lift_below": "nil",
"filament_retract_lift_enforce": "nil",
"filament_shrink": "100%",
"filament_toolchange_delay": "0",
"filament_unload_time": "0",
"filament_unloading_speed": "90",
"filament_unloading_speed_start": "100",
"material_flow_dependent_temperature": "0",
"material_flow_temp_graph": "[[3.0,240],[8.0,250],[12.0,260]]",
"pressure_advance": "0.032",
"support_material_interface_fan_speed": "-1",
"compatible_printers": [
"Creality Ender-5 Max 0.4 nozzle"
]
}
@@ -1,168 +0,0 @@
{
"type": "filament",
"name": "HP-TPU @Ender-5 Max-all",
"inherits": "fdm_filament_tpu",
"from": "system",
"setting_id": "7Y7KjqVEXrce3jKO",
"instantiation": "true",
"activate_air_filtration": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"complete_print_exhaust_fan_speed": [
"0"
],
"cool_plate_temp": [
"45"
],
"cool_plate_temp_initial_layer": [
"45"
],
"during_print_exhaust_fan_speed": [
"0"
],
"eng_plate_temp": [
"35"
],
"eng_plate_temp_initial_layer": [
"35"
],
"filament_density": [
"1.26"
],
"filament_deretraction_speed": [
"35"
],
"filament_diameter": [
"1.75"
],
"filament_flow_ratio": [
"1"
],
"filament_is_support": [
"0"
],
"filament_max_volumetric_speed": [
"2.5"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_length": [
"1"
],
"filament_retraction_minimum_travel": [
"2"
],
"filament_retraction_speed": [
"35"
],
"filament_soluble": [
"0"
],
"filament_vendor": [
"Creality"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"2"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"50"
],
"hot_plate_temp_initial_layer": [
"50"
],
"nozzle_temperature": [
"210"
],
"nozzle_temperature_initial_layer": [
"210"
],
"nozzle_temperature_range_high": [
"220"
],
"overhang_fan_threshold": [
"50%"
],
"required_nozzle_HRC": [
"0"
],
"slow_down_layer_time": [
"10"
],
"slow_down_min_speed": [
"10"
],
"textured_plate_temp": [
"50"
],
"textured_plate_temp_initial_layer": [
"50"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"activate_chamber_temp_control": "0",
"chamber_temperature": "0",
"cool_cds_fan_start_at_height": "0.5",
"cool_special_cds_fan_speed": "0",
"customized_plate_temp": "50",
"customized_plate_temp_initial_layer": "50",
"default_filament_colour": "\"\"",
"enable_overhang_bridge_fan": "1",
"enable_pressure_advance": "1",
"enable_special_area_additional_cooling_fan": "0",
"epoxy_resin_plate_temp": "50",
"epoxy_resin_plate_temp_initial_layer": "50",
"filament_cooling_final_speed": "3.4",
"filament_cooling_initial_speed": "2.2",
"filament_cooling_moves": "4",
"filament_load_time": "0",
"filament_loading_speed": "28",
"filament_loading_speed_start": "3",
"filament_multitool_ramming": "0",
"filament_multitool_ramming_flow": "10",
"filament_multitool_ramming_volume": "10",
"filament_notes": "\"\"",
"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_lift_above": "nil",
"filament_retract_lift_below": "nil",
"filament_retract_lift_enforce": "nil",
"filament_shrink": "100%",
"filament_toolchange_delay": "0",
"filament_unload_time": "0",
"filament_unloading_speed": "90",
"filament_unloading_speed_start": "100",
"material_flow_dependent_temperature": "0",
"material_flow_temp_graph": "[[3.0,210], [10.0,220], [12.0,230]]",
"pressure_advance": "0.4",
"support_material_interface_fan_speed": "-1",
"compatible_printers": [
"Creality Ender-5 Max 0.4 nozzle",
"Creality Ender-5 Max 0.6 nozzle",
"Creality Ender-5 Max 0.8 nozzle"
]
}
@@ -1,166 +0,0 @@
{
"type": "filament",
"name": "Hyper ABS @Ender-5 Max-all",
"inherits": "fdm_filament_abs",
"from": "system",
"setting_id": "jPfMyNBquP31h2Eb",
"instantiation": "true",
"activate_air_filtration": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"complete_print_exhaust_fan_speed": [
"80"
],
"cool_plate_temp": [
"90"
],
"cool_plate_temp_initial_layer": [
"90"
],
"during_print_exhaust_fan_speed": [
"60"
],
"fan_max_speed": [
"20"
],
"fan_min_speed": [
"20"
],
"filament_cost": [
"15"
],
"filament_density": [
"1.08"
],
"filament_deretraction_speed": [
"nil"
],
"filament_diameter": [
"1.75"
],
"filament_flow_ratio": [
"0.92"
],
"filament_is_support": [
"0"
],
"filament_max_volumetric_speed": [
"60"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_restart_extra": [
"0"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_length": [
"nil"
],
"filament_retraction_minimum_travel": [
"nil"
],
"filament_retraction_speed": [
"nil"
],
"filament_soluble": [
"0"
],
"filament_vendor": [
"Creality"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"nil"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"90"
],
"hot_plate_temp_initial_layer": [
"90"
],
"nozzle_temperature_range_high": [
"260"
],
"nozzle_temperature_range_low": [
"230"
],
"overhang_fan_speed": [
"20"
],
"required_nozzle_HRC": [
"0"
],
"slow_down_layer_time": [
"5"
],
"textured_plate_temp": [
"90"
],
"textured_plate_temp_initial_layer": [
"90"
],
"filament_start_gcode": [
"; Filament gcode\n"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"activate_chamber_temp_control": "0",
"chamber_temperature": "35",
"cool_cds_fan_start_at_height": "0.5",
"cool_special_cds_fan_speed": "0",
"default_filament_colour": "\"\"",
"enable_overhang_bridge_fan": "1",
"enable_pressure_advance": "1",
"enable_special_area_additional_cooling_fan": "0",
"epoxy_resin_plate_temp": "90",
"epoxy_resin_plate_temp_initial_layer": "90",
"filament_cooling_final_speed": "3.4",
"filament_cooling_initial_speed": "2.2",
"filament_cooling_moves": "4",
"filament_load_time": "0",
"filament_loading_speed": "28",
"filament_loading_speed_start": "3",
"filament_multitool_ramming": "0",
"filament_multitool_ramming_flow": "10",
"filament_multitool_ramming_volume": "10",
"filament_notes": "\"\"",
"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_lift_above": "0",
"filament_retract_lift_below": "0",
"filament_retract_lift_enforce": "All Surfaces",
"filament_shrink": "100%",
"filament_toolchange_delay": "0",
"filament_unload_time": "0",
"filament_unloading_speed": "90",
"filament_unloading_speed_start": "100",
"material_flow_dependent_temperature": "0",
"material_flow_temp_graph": "[[3.0,230],[5.0,250],[10.0,260]]",
"pressure_advance": "0.025",
"support_material_interface_fan_speed": "-1",
"compatible_printers": [
"Creality Ender-5 Max 0.4 nozzle",
"Creality Ender-5 Max 0.6 nozzle",
"Creality Ender-5 Max 0.8 nozzle"
]
}
@@ -1,163 +0,0 @@
{
"type": "filament",
"name": "Hyper PETG @Ender-5 Max-all",
"inherits": "fdm_filament_petg",
"from": "system",
"setting_id": "nr57CpZ5PwPmcOCR",
"instantiation": "true",
"activate_air_filtration": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"close_fan_the_first_x_layers": [
"1"
],
"complete_print_exhaust_fan_speed": [
"0"
],
"cool_plate_temp": [
"70"
],
"cool_plate_temp_initial_layer": [
"70"
],
"during_print_exhaust_fan_speed": [
"0"
],
"eng_plate_temp": [
"0"
],
"eng_plate_temp_initial_layer": [
"0"
],
"fan_cooling_layer_time": [
"30"
],
"fan_max_speed": [
"50"
],
"fan_min_speed": [
"20"
],
"filament_cost": [
"25"
],
"filament_density": [
"1.23"
],
"filament_deretraction_speed": [
"30"
],
"filament_flow_ratio": [
"0.95"
],
"filament_is_support": [
"0"
],
"filament_max_volumetric_speed": [
"23"
],
"filament_retract_before_wipe": [
"80%"
],
"filament_retraction_minimum_travel": [
"1"
],
"filament_retraction_speed": [
"30"
],
"filament_type": [
"PETG"
],
"filament_vendor": [
"Creality"
],
"filament_wipe_distance": [
"2"
],
"hot_plate_temp": [
"80"
],
"hot_plate_temp_initial_layer": [
"80"
],
"nozzle_temperature": [
"240"
],
"nozzle_temperature_initial_layer": [
"240"
],
"nozzle_temperature_range_high": [
"270"
],
"nozzle_temperature_range_low": [
"220"
],
"overhang_fan_speed": [
"90"
],
"overhang_fan_threshold": [
"25%"
],
"reduce_fan_stop_start_freq": [
"1"
],
"required_nozzle_HRC": [
"0"
],
"slow_down_layer_time": [
"12"
],
"temperature_vitrification": [
"80"
],
"textured_plate_temp": [
"80"
],
"textured_plate_temp_initial_layer": [
"80"
],
"filament_start_gcode": [
"; filament start gcode\n"
],
"activate_chamber_temp_control": "0",
"chamber_temperature": "0",
"cool_cds_fan_start_at_height": "0.5",
"cool_special_cds_fan_speed": "0",
"customized_plate_temp": "80",
"customized_plate_temp_initial_layer": "80",
"default_filament_colour": "\"\"",
"enable_overhang_bridge_fan": "1",
"enable_pressure_advance": "1",
"enable_special_area_additional_cooling_fan": "0",
"epoxy_resin_plate_temp": "80",
"epoxy_resin_plate_temp_initial_layer": "80",
"filament_cooling_final_speed": "3.4",
"filament_cooling_initial_speed": "2.2",
"filament_cooling_moves": "4",
"filament_load_time": "0",
"filament_loading_speed": "28",
"filament_loading_speed_start": "3",
"filament_multitool_ramming": "0",
"filament_multitool_ramming_flow": "10",
"filament_multitool_ramming_volume": "10",
"filament_notes": "\"\"",
"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_lift_above": "nil",
"filament_retract_lift_below": "nil",
"filament_retract_lift_enforce": "nil",
"filament_shrink": "100%",
"filament_toolchange_delay": "0",
"filament_unload_time": "0",
"filament_unloading_speed": "90",
"filament_unloading_speed_start": "100",
"material_flow_dependent_temperature": "0",
"material_flow_temp_graph": "[[0.8,220],[1.0,240]]",
"pressure_advance": "0.05",
"support_material_interface_fan_speed": "-1",
"compatible_printers": [
"Creality Ender-5 Max 0.4 nozzle"
]
}
@@ -1,160 +0,0 @@
{
"type": "filament",
"name": "Hyper PLA @Ender-5 Max-all",
"inherits": "fdm_filament_pla",
"from": "system",
"setting_id": "Nb1H9jKg8CPQXLVI",
"instantiation": "true",
"activate_air_filtration": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"complete_print_exhaust_fan_speed": [
"0"
],
"cool_plate_temp": [
"45"
],
"cool_plate_temp_initial_layer": [
"45"
],
"during_print_exhaust_fan_speed": [
"0"
],
"eng_plate_temp": [
"50"
],
"eng_plate_temp_initial_layer": [
"50"
],
"filament_cost": [
"30"
],
"filament_deretraction_speed": [
"35"
],
"filament_diameter": [
"1.75"
],
"filament_flow_ratio": [
"0.95"
],
"filament_is_support": [
"0"
],
"filament_max_volumetric_speed": [
"23"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_length": [
"1"
],
"filament_retraction_minimum_travel": [
"1"
],
"filament_retraction_speed": [
"35"
],
"filament_soluble": [
"0"
],
"filament_vendor": [
"Creality"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"2"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"55"
],
"hot_plate_temp_initial_layer": [
"45"
],
"nozzle_temperature_range_high": [
"240"
],
"required_nozzle_HRC": [
"0"
],
"slow_down_layer_time": [
"10"
],
"slow_down_min_speed": [
"20"
],
"textured_plate_temp": [
"55"
],
"textured_plate_temp_initial_layer": [
"45"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"activate_chamber_temp_control": "0",
"chamber_temperature": "0",
"cool_cds_fan_start_at_height": "0.5",
"cool_special_cds_fan_speed": "0",
"customized_plate_temp": "55",
"customized_plate_temp_initial_layer": "45",
"default_filament_colour": "\"\"",
"enable_overhang_bridge_fan": "1",
"enable_pressure_advance": "1",
"enable_special_area_additional_cooling_fan": "0",
"epoxy_resin_plate_temp": "55",
"epoxy_resin_plate_temp_initial_layer": "45",
"filament_cooling_final_speed": "3.4",
"filament_cooling_initial_speed": "2.2",
"filament_cooling_moves": "4",
"filament_load_time": "0",
"filament_loading_speed": "28",
"filament_loading_speed_start": "3",
"filament_multitool_ramming": "0",
"filament_multitool_ramming_flow": "10",
"filament_multitool_ramming_volume": "10",
"filament_notes": "\"\"",
"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_lift_above": "nil",
"filament_retract_lift_below": "nil",
"filament_retract_lift_enforce": "nil",
"filament_shrink": "100%",
"filament_shrinkage_compensation_z": "100%",
"filament_toolchange_delay": "0",
"filament_unload_time": "0",
"filament_unloading_speed": "90",
"filament_unloading_speed_start": "100",
"material_flow_dependent_temperature": "0",
"material_flow_temp_graph": "[[1.0,190],[1.5,220]]",
"pressure_advance": "0.048",
"support_material_interface_fan_speed": "-1",
"compatible_printers": [
"Creality Ender-5 Max 0.4 nozzle",
"Creality Ender-5 Max 0.6 nozzle",
"Creality Ender-5 Max 0.8 nozzle"
]
}
@@ -1,163 +0,0 @@
{
"type": "filament",
"name": "Hyper PLA-CF @Ender-5 Max-all",
"inherits": "fdm_filament_pla",
"from": "system",
"setting_id": "pW3AHx1VemLWSa7q",
"instantiation": "true",
"activate_air_filtration": [
"0"
],
"additional_cooling_fan_speed": [
"0"
],
"complete_print_exhaust_fan_speed": [
"80"
],
"cool_plate_temp": [
"45"
],
"cool_plate_temp_initial_layer": [
"45"
],
"during_print_exhaust_fan_speed": [
"60"
],
"eng_plate_temp": [
"50"
],
"eng_plate_temp_initial_layer": [
"50"
],
"filament_cost": [
"32"
],
"filament_density": [
"1.27"
],
"filament_deretraction_speed": [
"35"
],
"filament_diameter": [
"1.75"
],
"filament_flow_ratio": [
"0.95"
],
"filament_is_support": [
"0"
],
"filament_max_volumetric_speed": [
"23"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_length": [
"nil"
],
"filament_retraction_minimum_travel": [
"1"
],
"filament_retraction_speed": [
"35"
],
"filament_soluble": [
"0"
],
"filament_type": [
"PLA-CF"
],
"filament_vendor": [
"Creality"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"2"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"50"
],
"hot_plate_temp_initial_layer": [
"50"
],
"nozzle_temperature_range_high": [
"240"
],
"required_nozzle_HRC": [
"0"
],
"slow_down_layer_time": [
"10"
],
"slow_down_min_speed": [
"20"
],
"textured_plate_temp": [
"50"
],
"textured_plate_temp_initial_layer": [
"50"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"activate_chamber_temp_control": "0",
"chamber_temperature": "35",
"cool_cds_fan_start_at_height": "0.5",
"cool_special_cds_fan_speed": "0",
"customized_plate_temp": "50",
"customized_plate_temp_initial_layer": "50",
"default_filament_colour": "\"\"",
"enable_overhang_bridge_fan": "1",
"enable_pressure_advance": "1",
"enable_special_area_additional_cooling_fan": "0",
"epoxy_resin_plate_temp": "50",
"epoxy_resin_plate_temp_initial_layer": "50",
"filament_cooling_final_speed": "3.4",
"filament_cooling_initial_speed": "2.2",
"filament_cooling_moves": "4",
"filament_load_time": "0",
"filament_loading_speed": "28",
"filament_loading_speed_start": "3",
"filament_multitool_ramming": "0",
"filament_multitool_ramming_flow": "10",
"filament_multitool_ramming_volume": "10",
"filament_notes": "\"\"",
"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_lift_above": "nil",
"filament_retract_lift_below": "nil",
"filament_retract_lift_enforce": "nil",
"filament_shrink": "100%",
"filament_toolchange_delay": "0",
"filament_unload_time": "0",
"filament_unloading_speed": "90",
"filament_unloading_speed_start": "100",
"material_flow_dependent_temperature": "0",
"material_flow_temp_graph": "[[1.0,190],[1.2,220]]",
"pressure_advance": "0.04",
"support_material_interface_fan_speed": "-1",
"compatible_printers": [
"Creality Ender-5 Max 0.4 nozzle"
]
}
+5 -37
View File
@@ -1,13 +1,9 @@
{
"name": "Custom Printer",
"version": "02.04.00.05",
"version": "02.04.00.04",
"force_update": "0",
"description": "My configurations",
"machine_model_list": [
{
"name": "Generic Belt Printer",
"sub_path": "machine/MyBeltPrinter.json"
},
{
"name": "Generic Klipper Printer",
"sub_path": "machine/MyKlipper.json"
@@ -66,14 +62,6 @@
"name": "0.16mm Optimal @MyKlipper",
"sub_path": "process/0.16mm Optimal @MyKlipper.json"
},
{
"name": "0.12mm Fine @MyBeltPrinter",
"sub_path": "process/0.12mm Fine @MyBeltPrinter.json"
},
{
"name": "0.20mm Standard @MyBeltPrinter",
"sub_path": "process/0.20mm Standard @MyBeltPrinter.json"
},
{
"name": "0.20mm Standard @MyKlipper",
"sub_path": "process/0.20mm Standard @MyKlipper.json"
@@ -274,38 +262,18 @@
"name": "MyKlipper 0.8 nozzle",
"sub_path": "machine/MyKlipper 0.8 nozzle.json"
},
{
"name": "fdm_belt_common",
"sub_path": "machine/fdm_belt_common.json"
},
{
"name": "fdm_toolchanger_common",
"sub_path": "machine/fdm_toolchanger_common.json"
},
{
"name": "MyRRF 0.4 nozzle",
"sub_path": "machine/MyRRF 0.4 nozzle.json"
},
{
"name": "MyBeltPrinter 0.2 nozzle",
"sub_path": "machine/MyBeltPrinter 0.2 nozzle.json"
},
{
"name": "MyBeltPrinter 0.4 nozzle",
"sub_path": "machine/MyBeltPrinter 0.4 nozzle.json"
},
{
"name": "MyBeltPrinter 0.6 nozzle",
"sub_path": "machine/MyBeltPrinter 0.6 nozzle.json"
},
{
"name": "MyBeltPrinter 0.8 nozzle",
"sub_path": "machine/MyBeltPrinter 0.8 nozzle.json"
},
{
"name": "MyRepetier 0.4 nozzle",
"sub_path": "machine/MyRepetier 0.4 nozzle.json"
},
{
"name": "MyRRF 0.4 nozzle",
"sub_path": "machine/MyRRF 0.4 nozzle.json"
},
{
"name": "MyToolChanger 0.2 nozzle",
"sub_path": "machine/MyToolChanger 0.2 nozzle.json"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

@@ -1,27 +0,0 @@
{
"type": "machine",
"name": "MyBeltPrinter 0.2 nozzle",
"inherits": "fdm_belt_common",
"from": "system",
"setting_id": "3w1uyJdmm14QhDnH",
"instantiation": "true",
"printer_model": "Generic Belt Printer",
"default_print_profile": "0.12mm Fine @MyBeltPrinter",
"nozzle_diameter": [
"0.2"
],
"max_layer_height": [
"0.16"
],
"min_layer_height": [
"0.04"
],
"printer_variant": "0.2",
"printable_area": [
"0x0",
"350x0",
"350x350",
"0x350"
],
"printable_height": "300"
}
@@ -1,20 +0,0 @@
{
"type": "machine",
"name": "MyBeltPrinter 0.4 nozzle",
"inherits": "fdm_belt_common",
"from": "system",
"setting_id": "6nRHUtvJOUffocbu",
"instantiation": "true",
"printer_model": "Generic Belt Printer",
"nozzle_diameter": [
"0.4"
],
"printer_variant": "0.4",
"printable_area": [
"0x0",
"350x0",
"350x350",
"0x350"
],
"printable_height": "300"
}
@@ -1,26 +0,0 @@
{
"type": "machine",
"name": "MyBeltPrinter 0.6 nozzle",
"inherits": "fdm_belt_common",
"from": "system",
"setting_id": "K0m9HbUNwKT4UCJV",
"instantiation": "true",
"printer_model": "Generic Belt Printer",
"nozzle_diameter": [
"0.6"
],
"max_layer_height": [
"0.4"
],
"min_layer_height": [
"0.12"
],
"printer_variant": "0.6",
"printable_area": [
"0x0",
"350x0",
"350x350",
"0x350"
],
"printable_height": "300"
}
@@ -1,26 +0,0 @@
{
"type": "machine",
"name": "MyBeltPrinter 0.8 nozzle",
"inherits": "fdm_belt_common",
"from": "system",
"setting_id": "rHAweDz4eNwttPNA",
"instantiation": "true",
"printer_model": "Generic Belt Printer",
"nozzle_diameter": [
"0.8"
],
"max_layer_height": [
"0.6"
],
"min_layer_height": [
"0.2"
],
"printer_variant": "0.8",
"printable_area": [
"0x0",
"350x0",
"350x350",
"0x350"
],
"printable_height": "300"
}
@@ -1,12 +0,0 @@
{
"type": "machine_model",
"name": "Generic Belt Printer",
"model_id": "my_belt_01",
"nozzle_diameter": "0.4;0.2;0.6;0.8",
"machine_tech": "FFF",
"family": "MyPrinter",
"bed_model": "Custom_350_bed.stl",
"bed_texture": "orcaslicer_bed_texture.svg",
"hotend_model": "",
"default_materials": "Generic PLA @System;Generic PLA-CF @System;Generic PETG @System;Generic TPU @System;Generic PC @System;Generic PVA @System;Generic PA @System;Generic PA-CF @System"
}
@@ -1,99 +0,0 @@
{
"type": "machine",
"name": "fdm_belt_common",
"inherits": "fdm_klipper_common",
"from": "system",
"instantiation": "false",
"gcode_flavor": "klipper",
"single_extruder_multi_material": "0",
"default_filament_profile": [
"Generic PLA @System"
],
"default_print_profile": "0.20mm Standard @MyBeltPrinter",
"max_layer_height": [
"0.32"
],
"min_layer_height": [
"0.08"
],
"deretraction_speed": [
"30"
],
"extruder_colour": [
"#FCE94F"
],
"extruder_offset": [
"0x0"
],
"long_retractions_when_cut": [
"0"
],
"nozzle_diameter": [
"0.4"
],
"retract_before_wipe": [
"70%"
],
"retract_length_toolchange": [
"2"
],
"retract_lift_above": [
"0"
],
"retract_lift_below": [
"0"
],
"retract_lift_enforce": [
"All Surfaces"
],
"retract_restart_extra": [
"0"
],
"retract_restart_extra_toolchange": [
"0"
],
"retract_when_changing_layer": [
"1"
],
"retraction_distances_when_cut": [
"18"
],
"retraction_length": [
"0.8"
],
"retraction_minimum_travel": [
"1"
],
"retraction_speed": [
"30"
],
"travel_slope": [
"3"
],
"wipe": [
"1"
],
"wipe_distance": [
"1"
],
"z_hop": [
"0.4"
],
"z_hop_types": [
"Normal Lift"
],
"gcode_remap_x": "rev_x",
"gcode_remap_y": "pos_z",
"gcode_remap_z": "pos_y",
"printer_extruder_id": [
"1"
],
"belt_printer": "1",
"belt_slice_rotation": "x",
"belt_slice_rotation_angle": "45",
"belt_slice_rotation_global": "1",
"build_plate_tilt_x": "45",
"purge_in_prime_tower": "0",
"scan_first_layer": "0",
"auxiliary_fan": "0"
}
@@ -1,20 +0,0 @@
{
"type": "process",
"name": "0.12mm Fine @MyBeltPrinter",
"inherits": "fdm_process_klipper_common",
"from": "system",
"setting_id": "EugqqdLJ423bgEwN",
"instantiation": "true",
"layer_height": "0.12",
"initial_layer_print_height": "0.12",
"bottom_shell_layers": "5",
"top_shell_layers": "6",
"support_top_z_distance": "0.08",
"support_bottom_z_distance": "0.08",
"skirt_loops": "0",
"skirt_distance": "0",
"compatible_printers": [
"MyBeltPrinter 0.2 nozzle",
"MyBeltPrinter 0.4 nozzle"
]
}
@@ -1,17 +0,0 @@
{
"type": "process",
"name": "0.20mm Standard @MyBeltPrinter",
"inherits": "fdm_process_klipper_common",
"from": "system",
"setting_id": "YzCDAgH3uLOM53pF",
"instantiation": "true",
"layer_height": "0.2",
"initial_layer_print_height": "0.2",
"skirt_loops": "0",
"skirt_distance": "0",
"compatible_printers": [
"MyBeltPrinter 0.4 nozzle",
"MyBeltPrinter 0.6 nozzle",
"MyBeltPrinter 0.8 nozzle"
]
}
File diff suppressed because it is too large Load Diff
@@ -1,91 +0,0 @@
{
"type": "filament",
"name": "fdm_filament_paht",
"inherits": "fdm_filament_common",
"from": "system",
"instantiation": "false",
"filament_max_volumetric_speed": [
"12"
],
"filament_type": [
"PAHT"
],
"filament_density": [
"1.24"
],
"filament_cost": [
"0"
],
"cool_plate_temp": [
"35"
],
"eng_plate_temp": [
"0"
],
"textured_plate_temp": [
"60"
],
"cool_plate_temp_initial_layer": [
"35"
],
"eng_plate_temp_initial_layer": [
"0"
],
"textured_plate_temp_initial_layer": [
"60"
],
"nozzle_temperature_initial_layer": [
"220"
],
"reduce_fan_stop_start_freq": [
"1"
],
"overhang_fan_threshold": [
"50%"
],
"close_fan_the_first_x_layers": [
"1"
],
"nozzle_temperature": [
"220"
],
"temperature_vitrification": [
"45"
],
"nozzle_temperature_range_low": [
"190"
],
"nozzle_temperature_range_high": [
"240"
],
"slow_down_min_speed": [
"20"
],
"additional_cooling_fan_speed": [
"0"
],
"fan_cooling_layer_time": [
"80"
],
"fan_min_speed": [
"50"
],
"hot_plate_temp": [
"60"
],
"hot_plate_temp_initial_layer": [
"60"
],
"slow_down_layer_time": [
"8"
],
"filament_start_gcode": [
"; Filament start gcode\n"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"filament_vendor": [
"Generic"
]
}
@@ -1,15 +1,14 @@
{
"type": "process",
"name": "0.30mm Standard @Elegoo Giga 0.6 nozzle",
"renamed_from": "0.30mm Standard @EOS Giga 0.6 nozzle",
"inherits": "fdm_process_elegoo_06030",
"from": "system",
"setting_id": "mMP6cZhv9TYjYlEh",
"instantiation": "true",
"renamed_from": "0.30mm Standard @EOS Giga 0.6 nozzle",
"default_acceleration": "3000",
"filename_format": "EOGiga1_{nozzle_diameter[0]}_{input_filename_base}_{filament_name}_{layer_height}_{print_time}.gcode",
"initial_layer_acceleration": "1000",
"is_custom_defined": "0",
"make_overhang_printable_angle": "90",
"outer_wall_acceleration": "2000",
"resolution": "0.05",
@@ -24,7 +24,6 @@
"sparse_infill_speed": "100",
"inner_wall_speed": "100",
"internal_solid_infill_speed": "100",
"is_custom_defined": "0",
"outer_wall_speed": "60",
"top_surface_speed": "80"
}
+16 -16
View File
@@ -244,26 +244,10 @@
"name": "Generic PLA @FLSun S1",
"sub_path": "filament/Generic PLA @FLSun S1.json"
},
{
"name": "Generic PLA High Speed @FLSun S1",
"sub_path": "filament/Generic PLA High Speed @FLSun S1.json"
},
{
"name": "Generic PLA Silk @FLSun S1",
"sub_path": "filament/Generic PLA Silk @FLSun S1.json"
},
{
"name": "Generic PLA @FLSun T1",
"sub_path": "filament/Generic PLA @FLSun T1.json"
},
{
"name": "Generic PLA High Speed @FLSun T1",
"sub_path": "filament/Generic PLA High Speed @FLSun T1.json"
},
{
"name": "Generic PLA Silk @FLSun T1",
"sub_path": "filament/Generic PLA Silk @FLSun T1.json"
},
{
"name": "Generic TPU @FLSun S1",
"sub_path": "filament/Generic TPU @FLSun S1.json"
@@ -271,6 +255,22 @@
{
"name": "Generic TPU @FLSun T1",
"sub_path": "filament/Generic TPU @FLSun T1.json"
},
{
"name": "Generic PLA High Speed @FLSun S1",
"sub_path": "filament/Generic PLA High Speed @FLSun S1.json"
},
{
"name": "Generic PLA High Speed @FLSun T1",
"sub_path": "filament/Generic PLA High Speed @FLSun T1.json"
},
{
"name": "Generic PLA Silk @FLSun S1",
"sub_path": "filament/Generic PLA Silk @FLSun S1.json"
},
{
"name": "Generic PLA Silk @FLSun T1",
"sub_path": "filament/Generic PLA Silk @FLSun T1.json"
}
],
"machine_list": [
+374 -374
View File
@@ -439,22 +439,6 @@
"name": "0.14mm Standard @FF AD5X 0.25 nozzle",
"sub_path": "process/0.14mm Standard @FF AD5X 0.25 nozzle.json"
},
{
"name": "0.08mm Standard @FF C5 0.25 nozzle",
"sub_path": "process/0.08mm Standard @FF C5 0.25 nozzle.json"
},
{
"name": "0.10mm Standard @FF C5 0.25 nozzle",
"sub_path": "process/0.10mm Standard @FF C5 0.25 nozzle.json"
},
{
"name": "0.12mm Standard @FF C5 0.25 nozzle",
"sub_path": "process/0.12mm Standard @FF C5 0.25 nozzle.json"
},
{
"name": "0.14mm Standard @FF C5 0.25 nozzle",
"sub_path": "process/0.14mm Standard @FF C5 0.25 nozzle.json"
},
{
"name": "0.14mm Standard @Flashforge AD5M 0.25 Nozzle",
"sub_path": "process/0.14mm Standard @Flashforge AD5M 0.25 Nozzle.json"
@@ -527,6 +511,22 @@
"name": "0.42mm Draft @FF AD5X 0.6 nozzle",
"sub_path": "process/0.42mm Draft @FF AD5X 0.6 nozzle.json"
},
{
"name": "0.08mm Standard @FF C5 0.25 nozzle",
"sub_path": "process/0.08mm Standard @FF C5 0.25 nozzle.json"
},
{
"name": "0.10mm Standard @FF C5 0.25 nozzle",
"sub_path": "process/0.10mm Standard @FF C5 0.25 nozzle.json"
},
{
"name": "0.12mm Standard @FF C5 0.25 nozzle",
"sub_path": "process/0.12mm Standard @FF C5 0.25 nozzle.json"
},
{
"name": "0.14mm Standard @FF C5 0.25 nozzle",
"sub_path": "process/0.14mm Standard @FF C5 0.25 nozzle.json"
},
{
"name": "0.24mm Fine @FF AD5X 0.8 nozzle",
"sub_path": "process/0.24mm Fine @FF AD5X 0.8 nozzle.json"
@@ -573,26 +573,30 @@
"name": "Generic ASA @Flashforge",
"sub_path": "filament/Generic ASA @Flashforge.json"
},
{
"name": "Generic PETG @Flashforge",
"sub_path": "filament/Generic PETG @Flashforge.json"
},
{
"name": "Generic PETG-CF10 @Flashforge",
"sub_path": "filament/Generic PETG-CF10 @Flashforge.json"
},
{
"name": "Flashforge PETG",
"sub_path": "filament/Flashforge/Flashforge PETG @FF AD3.json"
},
{
"name": "Generic PETG @Flashforge",
"sub_path": "filament/Generic PETG @Flashforge.json"
},
{
"name": "Generic PETG @Flashforge Artemis",
"sub_path": "filament/Flashforge Generic PETG @Flashforge Artemis.json"
},
{
"name": "Generic PETG-CF10 @Flashforge",
"sub_path": "filament/Generic PETG-CF10 @Flashforge.json"
},
{
"name": "SUNLU PETG @base",
"sub_path": "filament/SUNLU/SUNLU PETG @base.json"
},
{
"name": "Flashforge PLA",
"sub_path": "filament/Flashforge/Flashforge PLA @FF AD3.json"
},
{
"name": "Generic HS PLA @Flashforge",
"sub_path": "filament/Generic HS PLA @Flashforge.json"
@@ -609,10 +613,6 @@
"name": "Generic PLA-Silk @Flashforge",
"sub_path": "filament/Generic PLA-Silk @Flashforge.json"
},
{
"name": "Flashforge PLA",
"sub_path": "filament/Flashforge/Flashforge PLA @FF AD3.json"
},
{
"name": "SUNLU PLA Marble @base",
"sub_path": "filament/SUNLU/SUNLU PLA Marble @base.json"
@@ -709,6 +709,10 @@
"name": "Generic ABS @FF AD5M 0.25 Nozzle",
"sub_path": "filament/Generic ABS @FF AD5M 0.25 Nozzle.json"
},
{
"name": "Generic ABS @Flashforge AD4",
"sub_path": "filament/Generic ABS @Flashforge AD4.json"
},
{
"name": "Generic ABS @Flashforge G3U",
"sub_path": "filament/Generic ABS @Flashforge G3U.json"
@@ -729,10 +733,6 @@
"name": "Generic HIPS @Flashforge G3U 0.6 Nozzle",
"sub_path": "filament/Generic HIPS @Flashforge G3U 0.6 Nozzle.json"
},
{
"name": "Generic ABS @Flashforge AD4",
"sub_path": "filament/Generic ABS @Flashforge AD4.json"
},
{
"name": "Flashforge ASA @FF AD5M 0.25 Nozzle",
"sub_path": "filament/Flashforge ASA @FF AD5M 0.25 Nozzle.json"
@@ -745,41 +745,13 @@
"name": "Generic ASA @FF AD5M 0.25 Nozzle",
"sub_path": "filament/Generic ASA @FF AD5M 0.25 Nozzle.json"
},
{
"name": "Generic ASA @Flashforge G3U 0.6 Nozzle",
"sub_path": "filament/Generic ASA @Flashforge G3U 0.6 Nozzle.json"
},
{
"name": "Generic ASA @Flashforge AD4",
"sub_path": "filament/Generic ASA @Flashforge AD4.json"
},
{
"name": "Generic PETG @FF AD5M 0.25 Nozzle",
"sub_path": "filament/Generic PETG @FF AD5M 0.25 Nozzle.json"
},
{
"name": "Generic PETG @Flashforge G3U",
"sub_path": "filament/Generic PETG @Flashforge G3U.json"
},
{
"name": "Generic PETG @Flashforge G3U 0.6 Nozzle",
"sub_path": "filament/Generic PETG @Flashforge G3U 0.6 Nozzle.json"
},
{
"name": "Generic PETG @Flashforge G3U 0.8 Nozzle",
"sub_path": "filament/Generic PETG @Flashforge G3U 0.8 Nozzle.json"
},
{
"name": "Generic PETG-CF @Flashforge G3U",
"sub_path": "filament/Generic PETG-CF @Flashforge G3U.json"
},
{
"name": "Generic PETG-CF @Flashforge G3U 0.6 Nozzle",
"sub_path": "filament/Generic PETG-CF @Flashforge G3U 0.6 Nozzle.json"
},
{
"name": "Generic PETG-CF @Flashforge G3U 0.8 Nozzle",
"sub_path": "filament/Generic PETG-CF @Flashforge G3U 0.8 Nozzle.json"
"name": "Generic ASA @Flashforge G3U 0.6 Nozzle",
"sub_path": "filament/Generic ASA @Flashforge G3U 0.6 Nozzle.json"
},
{
"name": "Flashforge HS PETG",
@@ -905,10 +877,38 @@
"name": "FusRock S-PAHT @G3U 0.6 Nozzle",
"sub_path": "filament/FusRock/FusRock S-PAHT @G3U 0.6 Nozzle.json"
},
{
"name": "Generic PETG @FF AD5M 0.25 Nozzle",
"sub_path": "filament/Generic PETG @FF AD5M 0.25 Nozzle.json"
},
{
"name": "Generic PETG @Flashforge AD4",
"sub_path": "filament/Generic PETG @Flashforge AD4.json"
},
{
"name": "Generic PETG @Flashforge G3U",
"sub_path": "filament/Generic PETG @Flashforge G3U.json"
},
{
"name": "Generic PETG @Flashforge G3U 0.6 Nozzle",
"sub_path": "filament/Generic PETG @Flashforge G3U 0.6 Nozzle.json"
},
{
"name": "Generic PETG @Flashforge G3U 0.8 Nozzle",
"sub_path": "filament/Generic PETG @Flashforge G3U 0.8 Nozzle.json"
},
{
"name": "Generic PETG-CF @Flashforge G3U",
"sub_path": "filament/Generic PETG-CF @Flashforge G3U.json"
},
{
"name": "Generic PETG-CF @Flashforge G3U 0.6 Nozzle",
"sub_path": "filament/Generic PETG-CF @Flashforge G3U 0.6 Nozzle.json"
},
{
"name": "Generic PETG-CF @Flashforge G3U 0.8 Nozzle",
"sub_path": "filament/Generic PETG-CF @Flashforge G3U 0.8 Nozzle.json"
},
{
"name": "Flashforge PETG-CF",
"sub_path": "filament/Flashforge PETG-CF.json"
@@ -945,10 +945,6 @@
"name": "SUNLU PETG @FF AD5M 0.8 Nozzle",
"sub_path": "filament/SUNLU/SUNLU PETG @FF AD5M 0.8 nozzle.json"
},
{
"name": "Generic HS PLA @FF AD5M 0.25 Nozzle",
"sub_path": "filament/Generic HS PLA @FF AD5M 0.25 Nozzle.json"
},
{
"name": "Flashforge HIPS @FF G4",
"sub_path": "filament/Flashforge HIPS @FF G4.json"
@@ -1049,42 +1045,14 @@
"name": "Flashforge PLA-CF @FF G4P",
"sub_path": "filament/Flashforge PLA-CF @FF G4P.json"
},
{
"name": "Generic HS PLA @FF AD5M 0.25 Nozzle",
"sub_path": "filament/Generic HS PLA @FF AD5M 0.25 Nozzle.json"
},
{
"name": "Generic PLA High Speed @Flashforge AD4",
"sub_path": "filament/Generic PLA High Speed @Flashforge AD4.json"
},
{
"name": "Generic PLA @FF AD5M 0.25 Nozzle",
"sub_path": "filament/Generic PLA @FF AD5M 0.25 Nozzle.json"
},
{
"name": "Generic PLA @Flashforge G3U",
"sub_path": "filament/Generic PLA @Flashforge G3U.json"
},
{
"name": "Generic PLA @Flashforge G3U 0.6 Nozzle",
"sub_path": "filament/Generic PLA @Flashforge G3U 0.6 Nozzle.json"
},
{
"name": "Generic PLA @Flashforge G3U 0.8 Nozzle",
"sub_path": "filament/Generic PLA @Flashforge G3U 0.8 Nozzle.json"
},
{
"name": "Generic PLA-CF @Flashforge G3U",
"sub_path": "filament/Generic PLA-CF @Flashforge G3U.json"
},
{
"name": "Generic PLA-CF @Flashforge G3U 0.6 Nozzle",
"sub_path": "filament/Generic PLA-CF @Flashforge G3U 0.6 Nozzle.json"
},
{
"name": "Generic PLA-CF @Flashforge G3U 0.8 Nozzle",
"sub_path": "filament/Generic PLA-CF @Flashforge G3U 0.8 Nozzle.json"
},
{
"name": "Generic PVA @Flashforge",
"sub_path": "filament/Generic PVA @Flashforge.json"
},
{
"name": "Flashforge HS PLA",
"sub_path": "filament/Flashforge HS PLA.json"
@@ -1233,10 +1201,42 @@
"name": "Flashforge PLA Sparkle @FF AD5X 0.8 nozzle",
"sub_path": "filament/Flashforge PLA Sparkle @FF AD5X 0.8 nozzle.json"
},
{
"name": "Generic PLA @FF AD5M 0.25 Nozzle",
"sub_path": "filament/Generic PLA @FF AD5M 0.25 Nozzle.json"
},
{
"name": "Generic PLA @Flashforge AD4",
"sub_path": "filament/Generic PLA @Flashforge AD4.json"
},
{
"name": "Generic PLA @Flashforge G3U",
"sub_path": "filament/Generic PLA @Flashforge G3U.json"
},
{
"name": "Generic PLA @Flashforge G3U 0.6 Nozzle",
"sub_path": "filament/Generic PLA @Flashforge G3U 0.6 Nozzle.json"
},
{
"name": "Generic PLA @Flashforge G3U 0.8 Nozzle",
"sub_path": "filament/Generic PLA @Flashforge G3U 0.8 Nozzle.json"
},
{
"name": "Generic PLA-CF @Flashforge G3U",
"sub_path": "filament/Generic PLA-CF @Flashforge G3U.json"
},
{
"name": "Generic PLA-CF @Flashforge G3U 0.6 Nozzle",
"sub_path": "filament/Generic PLA-CF @Flashforge G3U 0.6 Nozzle.json"
},
{
"name": "Generic PLA-CF @Flashforge G3U 0.8 Nozzle",
"sub_path": "filament/Generic PLA-CF @Flashforge G3U 0.8 Nozzle.json"
},
{
"name": "Generic PVA @Flashforge",
"sub_path": "filament/Generic PVA @Flashforge.json"
},
{
"name": "Polymaker CoPA",
"sub_path": "filament/Polymaker/Polymaker CoPA.json"
@@ -1297,10 +1297,6 @@
"name": "Generic PLA-CF10 @Flashforge AD4",
"sub_path": "filament/Generic PLA-CF10 @Flashforge AD4.json"
},
{
"name": "Generic PLA-SILK @FF AD5M 0.25 Nozzle",
"sub_path": "filament/Generic PLA-SILK @FF AD5M 0.25 Nozzle.json"
},
{
"name": "Flashforge PLA Silk",
"sub_path": "filament/Flashforge PLA Silk.json"
@@ -1325,6 +1321,10 @@
"name": "Generic PLA Silk @Flashforge AD4",
"sub_path": "filament/Generic PLA Silk @Flashforge AD4.json"
},
{
"name": "Generic PLA-SILK @FF AD5M 0.25 Nozzle",
"sub_path": "filament/Generic PLA-SILK @FF AD5M 0.25 Nozzle.json"
},
{
"name": "SUNLU PLA Marble @FF AD3",
"sub_path": "filament/SUNLU/SUNLU PLA Marble @FF AD3.json"
@@ -1709,102 +1709,6 @@
"name": "Flashforge ASA Basic @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge ASA Basic @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge HS PETG @FF G4 0.6 HF nozzle",
"sub_path": "filament/Flashforge HS PETG @FF G4 0.6 HF nozzle.json"
},
{
"name": "Flashforge HS PETG @FF G4 0.6 nozzle",
"sub_path": "filament/Flashforge HS PETG @FF G4 0.6 nozzle.json"
},
{
"name": "Flashforge HS PETG @FF G4 0.8 HF nozzle",
"sub_path": "filament/Flashforge HS PETG @FF G4 0.8 HF nozzle.json"
},
{
"name": "Flashforge HS PETG @FF G4P 0.6 HF nozzle",
"sub_path": "filament/Flashforge HS PETG @FF G4P 0.6 HF nozzle.json"
},
{
"name": "Flashforge HS PETG @FF G4P 0.6 nozzle",
"sub_path": "filament/Flashforge HS PETG @FF G4P 0.6 nozzle.json"
},
{
"name": "Flashforge HS PETG @FF G4P 0.8 HF nozzle",
"sub_path": "filament/Flashforge HS PETG @FF G4P 0.8 HF nozzle.json"
},
{
"name": "Flashforge PETG Pro @FF G4 0.6 HF nozzle",
"sub_path": "filament/Flashforge PETG Pro @FF G4 0.6 HF nozzle.json"
},
{
"name": "Flashforge PETG Pro @FF G4 0.6 nozzle",
"sub_path": "filament/Flashforge PETG Pro @FF G4 0.6 nozzle.json"
},
{
"name": "Flashforge PETG Pro @FF G4 0.8 HF nozzle",
"sub_path": "filament/Flashforge PETG Pro @FF G4 0.8 HF nozzle.json"
},
{
"name": "Flashforge PETG Pro @FF G4P 0.6 HF nozzle",
"sub_path": "filament/Flashforge PETG Pro @FF G4P 0.6 HF nozzle.json"
},
{
"name": "Flashforge PETG Pro @FF G4P 0.6 nozzle",
"sub_path": "filament/Flashforge PETG Pro @FF G4P 0.6 nozzle.json"
},
{
"name": "Flashforge PETG Pro @FF G4P 0.8 HF nozzle",
"sub_path": "filament/Flashforge PETG Pro @FF G4P 0.8 HF nozzle.json"
},
{
"name": "Flashforge PETG Transparent @FF G4 0.6 HF nozzle",
"sub_path": "filament/Flashforge PETG Transparent @FF G4 0.6 HF nozzle.json"
},
{
"name": "Flashforge PETG Transparent @FF G4 0.6 nozzle",
"sub_path": "filament/Flashforge PETG Transparent @FF G4 0.6 nozzle.json"
},
{
"name": "Flashforge PETG Transparent @FF G4 0.8 HF nozzle",
"sub_path": "filament/Flashforge PETG Transparent @FF G4 0.8 HF nozzle.json"
},
{
"name": "Flashforge PETG Transparent @FF G4P 0.6 HF nozzle",
"sub_path": "filament/Flashforge PETG Transparent @FF G4P 0.6 HF nozzle.json"
},
{
"name": "Flashforge PETG Transparent @FF G4P 0.6 nozzle",
"sub_path": "filament/Flashforge PETG Transparent @FF G4P 0.6 nozzle.json"
},
{
"name": "Flashforge PETG Transparent @FF G4P 0.8 HF nozzle",
"sub_path": "filament/Flashforge PETG Transparent @FF G4P 0.8 HF nozzle.json"
},
{
"name": "Flashforge TPU 65D @FF G4 0.6 HF nozzle",
"sub_path": "filament/Flashforge TPU 65D @FF G4 0.6 HF nozzle.json"
},
{
"name": "Flashforge TPU 65D @FF G4P 0.6 HF nozzle",
"sub_path": "filament/Flashforge TPU 65D @FF G4P 0.6 HF nozzle.json"
},
{
"name": "Flashforge TPU 95A @FF G4 0.6 HF nozzle",
"sub_path": "filament/Flashforge TPU 95A @FF G4 0.6 HF nozzle.json"
},
{
"name": "Flashforge TPU 95A @FF G4P 0.6 HF nozzle",
"sub_path": "filament/Flashforge TPU 95A @FF G4P 0.6 HF nozzle.json"
},
{
"name": "Flashforge PETG-CF @FF G4 0.6 nozzle",
"sub_path": "filament/Flashforge PETG-CF @FF G4 0.6 nozzle.json"
},
{
"name": "Flashforge PETG-CF @FF G4P 0.6 nozzle",
"sub_path": "filament/Flashforge PETG-CF @FF G4P 0.6 nozzle.json"
},
{
"name": "Flashforge HS PETG @FF AD5M 0.25 nozzle",
"sub_path": "filament/Flashforge HS PETG @FF AD5M 0.25 nozzle.json"
@@ -2045,6 +1949,254 @@
"name": "Polymaker CoPA @FF G4P 0.8 HF nozzle",
"sub_path": "filament/Polymaker CoPA @FF G4P 0.8 HF nozzle.json"
},
{
"name": "Flashforge HS PETG @FF G4 0.6 HF nozzle",
"sub_path": "filament/Flashforge HS PETG @FF G4 0.6 HF nozzle.json"
},
{
"name": "Flashforge HS PETG @FF G4 0.6 nozzle",
"sub_path": "filament/Flashforge HS PETG @FF G4 0.6 nozzle.json"
},
{
"name": "Flashforge HS PETG @FF G4 0.8 HF nozzle",
"sub_path": "filament/Flashforge HS PETG @FF G4 0.8 HF nozzle.json"
},
{
"name": "Flashforge HS PETG @FF G4P 0.6 HF nozzle",
"sub_path": "filament/Flashforge HS PETG @FF G4P 0.6 HF nozzle.json"
},
{
"name": "Flashforge HS PETG @FF G4P 0.6 nozzle",
"sub_path": "filament/Flashforge HS PETG @FF G4P 0.6 nozzle.json"
},
{
"name": "Flashforge HS PETG @FF G4P 0.8 HF nozzle",
"sub_path": "filament/Flashforge HS PETG @FF G4P 0.8 HF nozzle.json"
},
{
"name": "Flashforge PETG Pro @FF G4 0.6 HF nozzle",
"sub_path": "filament/Flashforge PETG Pro @FF G4 0.6 HF nozzle.json"
},
{
"name": "Flashforge PETG Pro @FF G4 0.6 nozzle",
"sub_path": "filament/Flashforge PETG Pro @FF G4 0.6 nozzle.json"
},
{
"name": "Flashforge PETG Pro @FF G4 0.8 HF nozzle",
"sub_path": "filament/Flashforge PETG Pro @FF G4 0.8 HF nozzle.json"
},
{
"name": "Flashforge PETG Pro @FF G4P 0.6 HF nozzle",
"sub_path": "filament/Flashforge PETG Pro @FF G4P 0.6 HF nozzle.json"
},
{
"name": "Flashforge PETG Pro @FF G4P 0.6 nozzle",
"sub_path": "filament/Flashforge PETG Pro @FF G4P 0.6 nozzle.json"
},
{
"name": "Flashforge PETG Pro @FF G4P 0.8 HF nozzle",
"sub_path": "filament/Flashforge PETG Pro @FF G4P 0.8 HF nozzle.json"
},
{
"name": "Flashforge PETG Transparent @FF G4 0.6 HF nozzle",
"sub_path": "filament/Flashforge PETG Transparent @FF G4 0.6 HF nozzle.json"
},
{
"name": "Flashforge PETG Transparent @FF G4 0.6 nozzle",
"sub_path": "filament/Flashforge PETG Transparent @FF G4 0.6 nozzle.json"
},
{
"name": "Flashforge PETG Transparent @FF G4 0.8 HF nozzle",
"sub_path": "filament/Flashforge PETG Transparent @FF G4 0.8 HF nozzle.json"
},
{
"name": "Flashforge PETG Transparent @FF G4P 0.6 HF nozzle",
"sub_path": "filament/Flashforge PETG Transparent @FF G4P 0.6 HF nozzle.json"
},
{
"name": "Flashforge PETG Transparent @FF G4P 0.6 nozzle",
"sub_path": "filament/Flashforge PETG Transparent @FF G4P 0.6 nozzle.json"
},
{
"name": "Flashforge PETG Transparent @FF G4P 0.8 HF nozzle",
"sub_path": "filament/Flashforge PETG Transparent @FF G4P 0.8 HF nozzle.json"
},
{
"name": "Flashforge TPU 65D @FF G4 0.6 HF nozzle",
"sub_path": "filament/Flashforge TPU 65D @FF G4 0.6 HF nozzle.json"
},
{
"name": "Flashforge TPU 65D @FF G4P 0.6 HF nozzle",
"sub_path": "filament/Flashforge TPU 65D @FF G4P 0.6 HF nozzle.json"
},
{
"name": "Flashforge TPU 95A @FF G4 0.6 HF nozzle",
"sub_path": "filament/Flashforge TPU 95A @FF G4 0.6 HF nozzle.json"
},
{
"name": "Flashforge TPU 95A @FF G4P 0.6 HF nozzle",
"sub_path": "filament/Flashforge TPU 95A @FF G4P 0.6 HF nozzle.json"
},
{
"name": "Flashforge PETG-CF @FF G4 0.6 nozzle",
"sub_path": "filament/Flashforge PETG-CF @FF G4 0.6 nozzle.json"
},
{
"name": "Flashforge PETG-CF @FF G4P 0.6 nozzle",
"sub_path": "filament/Flashforge PETG-CF @FF G4P 0.6 nozzle.json"
},
{
"name": "Flashforge HS PLA @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge HS PLA @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge HS PLA @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge HS PLA @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge HS PLA @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge HS PLA @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Basic @FF AD5M 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Basic @FF AD5M 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Basic @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Basic @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Basic @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Basic @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Basic @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Basic @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Color Change @FF AD5M 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Color Change @FF AD5M 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Color Change @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Color Change @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Color Change @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Color Change @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Color Change @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Color Change @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Galaxy @FF AD5M 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Galaxy @FF AD5M 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Galaxy @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Galaxy @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Galaxy @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Galaxy @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Galaxy @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Galaxy @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Luminous @FF AD5M 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Luminous @FF AD5M 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Luminous @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Luminous @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Luminous @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Luminous @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Luminous @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Luminous @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Matte @FF AD5M 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Matte @FF AD5M 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Matte @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Matte @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Matte @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Matte @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Matte @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Matte @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Metal @FF AD5M 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Metal @FF AD5M 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Metal @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Metal @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Metal @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Metal @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Metal @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Metal @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Pro @FF AD5M 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Pro @FF AD5M 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Pro @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Pro @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Pro @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Pro @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Pro @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Pro @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Silk @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Silk @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Silk @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Silk @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Silk @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Silk @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Sparkle @FF AD5M 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Sparkle @FF AD5M 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Sparkle @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Sparkle @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Sparkle @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Sparkle @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Sparkle @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Sparkle @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge HS PLA @FF G4 0.6 HF nozzle",
"sub_path": "filament/Flashforge HS PLA @FF G4 0.6 HF nozzle.json"
@@ -2341,158 +2493,6 @@
"name": "Flashforge PLA-CF @FF G4P 0.6 nozzle",
"sub_path": "filament/Flashforge PLA-CF @FF G4P 0.6 nozzle.json"
},
{
"name": "Flashforge HS PLA @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge HS PLA @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge HS PLA @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge HS PLA @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge HS PLA @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge HS PLA @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Basic @FF AD5M 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Basic @FF AD5M 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Basic @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Basic @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Basic @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Basic @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Basic @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Basic @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Color Change @FF AD5M 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Color Change @FF AD5M 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Color Change @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Color Change @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Color Change @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Color Change @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Color Change @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Color Change @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Galaxy @FF AD5M 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Galaxy @FF AD5M 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Galaxy @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Galaxy @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Galaxy @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Galaxy @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Galaxy @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Galaxy @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Luminous @FF AD5M 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Luminous @FF AD5M 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Luminous @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Luminous @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Luminous @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Luminous @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Luminous @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Luminous @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Matte @FF AD5M 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Matte @FF AD5M 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Matte @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Matte @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Matte @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Matte @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Matte @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Matte @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Metal @FF AD5M 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Metal @FF AD5M 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Metal @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Metal @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Metal @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Metal @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Metal @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Metal @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Pro @FF AD5M 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Pro @FF AD5M 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Pro @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Pro @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Pro @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Pro @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Pro @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Pro @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Silk @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Silk @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Silk @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Silk @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Silk @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Silk @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Sparkle @FF AD5M 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Sparkle @FF AD5M 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Sparkle @FF AD5X 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Sparkle @FF AD5X 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Sparkle @FF G4 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Sparkle @FF G4 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Sparkle @FF G4P 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Sparkle @FF G4P 0.25 nozzle.json"
},
{
"name": "Flashforge PLA Silk @FF AD5M 0.25 nozzle",
"sub_path": "filament/Flashforge PLA Silk @FF AD5M 0.25 nozzle.json"
@@ -2601,30 +2601,6 @@
"name": "Flashforge PETG-CF @FF C5P",
"sub_path": "filament/Flashforge PETG-CF @FF C5P.json"
},
{
"name": "Flashforge PLA Matte @FF C5",
"sub_path": "filament/Flashforge PLA Matte @FF C5.json"
},
{
"name": "Flashforge PLA Matte @FF C5P",
"sub_path": "filament/Flashforge PLA Matte @FF C5P.json"
},
{
"name": "Flashforge PLA Metal @FF C5",
"sub_path": "filament/Flashforge PLA Metal @FF C5.json"
},
{
"name": "Flashforge PLA Metal @FF C5P",
"sub_path": "filament/Flashforge PLA Metal @FF C5P.json"
},
{
"name": "Flashforge PLA Pro @FF C5",
"sub_path": "filament/Flashforge PLA Pro @FF C5.json"
},
{
"name": "Flashforge PLA Pro @FF C5P",
"sub_path": "filament/Flashforge PLA Pro @FF C5P.json"
},
{
"name": "Flashforge PLA Basic @FF C5",
"sub_path": "filament/Flashforge PLA Basic @FF C5.json"
@@ -2657,6 +2633,30 @@
"name": "Flashforge PLA Luminous @FF C5P",
"sub_path": "filament/Flashforge PLA Luminous @FF C5P.json"
},
{
"name": "Flashforge PLA Matte @FF C5",
"sub_path": "filament/Flashforge PLA Matte @FF C5.json"
},
{
"name": "Flashforge PLA Matte @FF C5P",
"sub_path": "filament/Flashforge PLA Matte @FF C5P.json"
},
{
"name": "Flashforge PLA Metal @FF C5",
"sub_path": "filament/Flashforge PLA Metal @FF C5.json"
},
{
"name": "Flashforge PLA Metal @FF C5P",
"sub_path": "filament/Flashforge PLA Metal @FF C5P.json"
},
{
"name": "Flashforge PLA Pro @FF C5",
"sub_path": "filament/Flashforge PLA Pro @FF C5.json"
},
{
"name": "Flashforge PLA Pro @FF C5P",
"sub_path": "filament/Flashforge PLA Pro @FF C5P.json"
},
{
"name": "Flashforge PLA Silk @FF C5",
"sub_path": "filament/Flashforge PLA Silk @FF C5.json"
-54
View File
@@ -1,54 +0,0 @@
{
"name": "IdeaFormer",
"version": "02.00.00.03",
"force_update": "0",
"description": "IdeaFormer belt printer configurations",
"machine_model_list": [
{
"name": "IdeaFormer IR3 V2",
"sub_path": "machine/IdeaFormer IR3 V2.json"
}
],
"process_list": [
{
"name": "fdm_process_common",
"sub_path": "process/fdm_process_common.json"
},
{
"name": "0.20mm Standard @IdeaFormer IR3 V2",
"sub_path": "process/0.20mm Standard @IdeaFormer IR3 V2.json"
}
],
"filament_list": [
{
"name": "Generic PLA @IdeaFormer IR3 V2",
"sub_path": "filament/Generic PLA @IdeaFormer IR3 V2.json"
},
{
"name": "eSUN PLA @IdeaFormer IR3 V2",
"sub_path": "filament/eSUN PLA @IdeaFormer IR3 V2.json"
},
{
"name": "Generic PETG @IdeaFormer IR3 V2",
"sub_path": "filament/Generic PETG @IdeaFormer IR3 V2.json"
}
],
"machine_list": [
{
"name": "fdm_machine_common",
"sub_path": "machine/fdm_machine_common.json"
},
{
"name": "fdm_klipper_common",
"sub_path": "machine/fdm_klipper_common.json"
},
{
"name": "fdm_belt_common",
"sub_path": "machine/fdm_belt_common.json"
},
{
"name": "IdeaFormer IR3 V2 0.4 nozzle",
"sub_path": "machine/IdeaFormer IR3 V2 0.4 nozzle.json"
}
]
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 183 KiB

@@ -1,113 +0,0 @@
{
"type": "filament",
"name": "Generic PETG @IdeaFormer IR3 V2",
"inherits": "Generic PETG @System",
"from": "system",
"setting_id": "n4zaXcUUzTqAxq5f",
"instantiation": "true",
"compatible_printers": [
"IdeaFormer IR3 V2 0.4 nozzle"
],
"filament_type": [
"PETG"
],
"filament_vendor": [
"Generic"
],
"filament_settings_id": [
"Generic PETG @IdeaFormer IR3 V2"
],
"filament_diameter": [
"1.75"
],
"filament_density": [
"1.27"
],
"filament_flow_ratio": [
"0.95"
],
"filament_cost": [
"25"
],
"filament_max_volumetric_speed": [
"10"
],
"nozzle_temperature": [
"240"
],
"nozzle_temperature_initial_layer": [
"245"
],
"nozzle_temperature_range_low": [
"220"
],
"nozzle_temperature_range_high": [
"260"
],
"temperature_vitrification": [
"70"
],
"hot_plate_temp": [
"80"
],
"hot_plate_temp_initial_layer": [
"80"
],
"cool_plate_temp": [
"80"
],
"cool_plate_temp_initial_layer": [
"80"
],
"textured_plate_temp": [
"80"
],
"textured_plate_temp_initial_layer": [
"80"
],
"fan_min_speed": [
"40"
],
"fan_max_speed": [
"60"
],
"overhang_fan_threshold": [
"25%"
],
"overhang_fan_speed": [
"80"
],
"close_fan_the_first_x_layers": [
"3"
],
"full_fan_speed_layer": [
"8"
],
"slow_down_min_speed": [
"20"
],
"slow_down_layer_time": [
"4"
],
"fan_cooling_layer_time": [
"100"
],
"reduce_fan_stop_start_freq": [
"1"
],
"filament_retraction_length": [
"2"
],
"filament_retraction_speed": [
"40"
],
"filament_deretraction_speed": [
"40"
],
"filament_z_hop": [
"0.4"
],
"filament_start_gcode": [
"; Generic PETG @IdeaFormer IR3 V2 — belt PETG, bed 80C"
]
}
@@ -1,113 +0,0 @@
{
"type": "filament",
"name": "Generic PLA @IdeaFormer IR3 V2",
"inherits": "Generic PLA @System",
"from": "system",
"setting_id": "1xjycsEAFh6KQIhp",
"instantiation": "true",
"compatible_printers": [
"IdeaFormer IR3 V2 0.4 nozzle"
],
"filament_type": [
"PLA"
],
"filament_vendor": [
"Generic"
],
"filament_settings_id": [
"Generic PLA @IdeaFormer IR3 V2"
],
"filament_diameter": [
"1.75"
],
"filament_density": [
"1.24"
],
"filament_flow_ratio": [
"0.98"
],
"filament_cost": [
"20"
],
"filament_max_volumetric_speed": [
"12"
],
"nozzle_temperature": [
"215"
],
"nozzle_temperature_initial_layer": [
"220"
],
"nozzle_temperature_range_low": [
"190"
],
"nozzle_temperature_range_high": [
"240"
],
"temperature_vitrification": [
"45"
],
"hot_plate_temp": [
"75"
],
"hot_plate_temp_initial_layer": [
"75"
],
"cool_plate_temp": [
"75"
],
"cool_plate_temp_initial_layer": [
"75"
],
"textured_plate_temp": [
"75"
],
"textured_plate_temp_initial_layer": [
"75"
],
"fan_min_speed": [
"100"
],
"fan_max_speed": [
"100"
],
"overhang_fan_threshold": [
"50%"
],
"overhang_fan_speed": [
"100"
],
"close_fan_the_first_x_layers": [
"3"
],
"full_fan_speed_layer": [
"8"
],
"slow_down_min_speed": [
"20"
],
"slow_down_layer_time": [
"4"
],
"fan_cooling_layer_time": [
"100"
],
"reduce_fan_stop_start_freq": [
"1"
],
"filament_retraction_length": [
"1.5"
],
"filament_retraction_speed": [
"35"
],
"filament_deretraction_speed": [
"30"
],
"filament_z_hop": [
"0.4"
],
"filament_start_gcode": [
"; Generic PLA @IdeaFormer IR3 V2 — belt PLA, bed 75C"
]
}
@@ -1,36 +0,0 @@
{
"type": "filament",
"name": "eSUN PLA @IdeaFormer IR3 V2",
"inherits": "Generic PLA @IdeaFormer IR3 V2",
"filament_id": "OFkrxQC4",
"from": "system",
"setting_id": "XqkviBmFHEglXueX",
"instantiation": "true",
"compatible_printers": [
"IdeaFormer IR3 V2 0.4 nozzle"
],
"filament_type": [
"PLA"
],
"filament_vendor": [
"eSUN"
],
"filament_settings_id": [
"eSUN PLA @IdeaFormer IR3 V2"
],
"nozzle_temperature_initial_layer": [
"200"
],
"nozzle_temperature": [
"200"
],
"enable_pressure_advance": [
"1"
],
"pressure_advance": [
"0.12"
],
"filament_max_volumetric_speed": [
"20"
]
}

Some files were not shown because too many files have changed in this diff Show More