Compare commits

..
169 changed files with 1754 additions and 6483 deletions
+146
View File
@@ -0,0 +1,146 @@
name: Daily OFL OTA Update
# This workflow is intended for creating and publishing the OrcaFilamentLibrary (OFL) OPC package to
# https://github.com/OrcaSlicer/orcaslicer-profiles, which generates an OTA update.
# This cronjob runs daily at 00:00 UTC every day and scans main plus every release/vX.Y.Z branch for
# changes to resources/profiles/OrcaFilamentLibrary since that branch's own last successful run. Any
# branch with no changes is skipped; each changed branch gets its own post_merge_profiles.yml dispatch.
#
# OFL has no dedicated FOLDER_MERGERS grant (it isn't merged through the PR merge-bot delegation
# scheme), so post_merge_profiles.yml is dispatched with an explicit `vendor` input, which that
# workflow trusts and uses to bypass the FOLDER_MERGERS check for this trigger. That same explicit-
# vendor-dispatch path is also what makes post_merge_profiles.yml call the OTA auto-publish API after
# uploading - see post_merge_profiles.yml for both sides of that contract.
#
# If at least one branch was dispatched this run, a final step clears OFL's pending-publish
# table (POST /api/v1/ota/ofl/pending/clear) - the daily "published everything, reset" signal.
# That table is populated only by this pipeline's own auto-publish calls.
on:
schedule:
- cron: "0 0 * * *"
workflow_dispatch:
permissions:
actions: write # list this workflow's past runs and dispatch post_merge_profiles.yml
contents: read
env:
VENDOR: OrcaFilamentLibrary
jobs:
daily-job:
if: ${{ github.repository == 'OrcaSlicer/OrcaSlicer' }}
runs-on: ubuntu-24.04
steps:
- name: Checkout repository
uses: actions/checkout@v7
with:
# Full history: the per-branch "since last successful run" check below
# needs to look arbitrarily far back if a prior run failed or was skipped.
fetch-depth: 0
- name: Fetch all branches
shell: bash
run: git fetch origin '+refs/heads/*:refs/remotes/origin/*'
- name: Scan branches and publish changed OFL profiles
id: scan
shell: bash
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
published_any=false
mapfile -t branches < <(
gh api "repos/${{ github.repository }}/branches" --paginate --jq '.[].name' \
| grep -E '^(main|release/v[0-9]+\.[0-9]+\.[0-9]+)$' | sort -u
)
for branch in "${branches[@]}"; do
echo "::group::$branch"
# post_merge_profiles.yml's own run history, not this workflow's: this
# workflow only ever runs against main (schedule, or workflow_dispatch
# --ref main), so its head branch never varies - filtering ITS history
# by $branch would never match anything except main. post_merge_profiles.yml
# genuinely runs per-branch (this dispatch below sets --ref "$branch"),
# so its history is the real per-branch checkpoint. It also means a
# failed publish naturally gets retried tomorrow: the checkpoint only
# advances on a run that actually succeeded.
# --method GET is required, not cosmetic: gh api defaults to POST
# whenever -f fields are present unless a method is given
# explicitly, and POST on this list-runs endpoint 404s - confirmed
# on real Actions infrastructure, not just reasoned about.
since="$(gh api --method GET "repos/${{ github.repository }}/actions/workflows/post_merge_profiles.yml/runs" \
-f status=success -f branch="$branch" -f per_page=1 \
--jq '.workflow_runs[0].run_started_at // empty')"
if [ -z "$since" ]; then
echo "No prior successful run for $branch; treating OFL as changed."
changed=true
else
changed_files="$(git log --since="$since" --name-only --pretty=format: "origin/$branch" -- \
resources/profiles/OrcaFilamentLibrary resources/profiles/OrcaFilamentLibrary.json \
| sed '/^$/d')"
if [ -n "$changed_files" ]; then
echo "OFL changed on $branch since $since:"
echo "$changed_files"
changed=true
else
echo "No OFL changes on $branch since $since."
changed=false
fi
fi
if [ "$changed" = true ]; then
# Tolerate a per-branch failure (e.g. a pre-existing release branch
# whose post_merge_profiles.yml predates the vendor/auto_publish
# inputs) rather than aborting the whole scan under set -e.
if gh workflow run post_merge_profiles.yml \
--repo "${{ github.repository }}" \
--ref "$branch" \
-f vendor="$VENDOR" -f auto_publish=true; then
published_any=true
else
echo "::warning::failed to dispatch post_merge_profiles.yml for $branch - its post_merge_profiles.yml at this ref may predate the vendor/auto_publish inputs"
fi
fi
echo "::endgroup::"
done
echo "published_any=$published_any" >> "$GITHUB_OUTPUT"
- name: Clear OFL pending queue
# Only when this run actually kicked off at least one publish - the
# daily reset is scoped to today's real activity, not called on a day
# where every branch reported no changes. Note "published_any" reflects
# a successful DISPATCH, not a confirmed live publish: gh workflow run
# is fire-and-forget, so this workflow never learns whether the
# dispatched post_merge_profiles.yml run actually reached its own
# auto-publish call. Acceptable since the table is populated only by
# our own auto-publish calls, not by anything else.
if: steps.scan.outputs.published_any == 'true'
shell: bash
env:
OTA_API_BASE_URL: ${{ vars.OTA_API_BASE_URL }}
OTA_API_KEY: ${{ secrets.OFL_OTA_PUBLISH_KEY }}
run: |
set -euo pipefail
[ -n "$OTA_API_BASE_URL" ] || { echo "::error::vars.OTA_API_BASE_URL is not set"; exit 1; }
[ -n "$OTA_API_KEY" ] || { echo "::error::secrets.OFL_OTA_PUBLISH_KEY is not set"; exit 1; }
resp_file="$RUNNER_TEMP/ota-pending-clear-response.json"
status="$(curl -sS -o "$resp_file" -w '%{http_code}' -X POST \
"${OTA_API_BASE_URL%/}/api/v1/ota/ofl/pending/clear" \
-H "Authorization: Bearer $OTA_API_KEY")"
body="$(cat "$resp_file")"
echo "$body"
if [ "$status" != "200" ]; then
echo "::error::OTA pending-clear call failed with HTTP $status"
exit 1
fi
+215 -10
View File
@@ -8,6 +8,19 @@ name: Post-merge profiles
# only then does it become a live OTA update - this workflow does none of that
# last part (no changelog, no R2, no webhook).
#
# A workflow_dispatch carrying a `vendor` input (e.g. the daily OFL cron - OFL has
# no FOLDER_MERGERS grant, since it isn't merged through the PR merge-bot delegation
# scheme) publishes that vendor directly and skips the FOLDER_MERGERS check below.
# workflow_dispatch is already a trusted, explicit trigger, unlike the automatic
# push-diff path the FOLDER_MERGERS check exists to gate.
#
# Separately, an ordinary push whose diff touches an OrcaFilamentLibrary company
# folder (resources/profiles/OrcaFilamentLibrary/filament/<Company>/**) records
# that PR as pending via POST /api/v1/ota/ofl/pending, regardless of whether
# OrcaFilamentLibrary as a whole is authorized to publish in this same run - a
# partner's OTA Manager dashboard should see a merged PR immediately, well
# before the daily cron actually builds and publishes it.
#
# Asset contract expected by OrcaCloud's release scanner:
# ^(\d+\.\d+\.\d+)_([^_]+)_(\d+(?:\.\d+){3})_(\d{12})\.zip$
# <orca_ver>_<vendor>_<profile_version>_<UTC yyyymmddHHMM>.zip (zip root: <vendor>.opc)
@@ -17,16 +30,39 @@ name: Post-merge profiles
on:
push:
branches:
# once v2.5.0 stable is released, this will be removed, so nightly won't receive OTA updates.
- main
- release/*
# release/vX.Y.Z point-release branches only, not the release/vX.Y working
# branch profile PRs land on first - "v*.*.*" requires two literal dots,
# which release/vX.Y (one dot) doesn't have.
- release/v*.*.*
paths:
- 'resources/profiles/**'
- '.github/workflows/post_merge_profiles.yml'
workflow_dispatch:
inputs:
vendor:
description: >-
Publish only this vendor, bypassing the FOLDER_MERGERS grant check.
For trusted explicit dispatches only (e.g. the OFL nightly cron).
Leave empty to fall back to diffing the triggering commit.
required: false
type: string
auto_publish:
description: >-
After publishing, also call the OTA auto-publish API to go live
immediately, skipping the human changelog/Publish step. Separate
from `vendor` on purpose: a maintainer can dispatch with just
`vendor` set to rebuild/republish an asset without it going live.
Only the OFL nightly cron should set this to true.
required: false
type: boolean
default: false
permissions:
contents: read
pull-requests: read # commits/{sha}/pulls lookup in the OFL-pending step
# One run per branch; let a run finish rather than cancel it, since it publishes.
concurrency:
@@ -66,8 +102,38 @@ jobs:
shell: bash
env:
FOLDER_MERGERS: ${{ vars.FOLDER_MERGERS }}
DISPATCH_VENDOR: ${{ github.event_name == 'workflow_dispatch' && inputs.vendor || '' }}
run: |
set -euo pipefail
# A vendor has a manifest plus either a preset directory or a version
# field; this drops non-vendor files such as blacklist.json. Shared by
# both the explicit-dispatch path below and the push-diff path further
# down, so the definition of "valid vendor" can't drift between them.
is_valid_vendor() {
local v="$1"
local json="resources/profiles/$v.json"
[ -f "$json" ] && { [ -d "resources/profiles/$v" ] || jq -e '.version' "$json" >/dev/null 2>&1; }
}
# Explicit vendor dispatch (e.g. the OFL cron): trust the caller and
# skip both the git-diff detection and the FOLDER_MERGERS check below.
if [ -n "$DISPATCH_VENDOR" ]; then
v="$DISPATCH_VENDOR"
# Becomes part of the release asset filename and the OTA API's
# payload; keep it to the same charset every real vendor name uses.
if ! [[ "$v" =~ ^[A-Za-z0-9]+$ ]]; then
echo "::error::vendor '$v' must be alphanumeric"
exit 1
fi
if ! is_valid_vendor "$v"; then
echo "::error::vendor '$v' has no resources/profiles/$v.json with a profile directory or version field"
exit 1
fi
echo "vendors=$v" >> "$GITHUB_OUTPUT"
exit 0
fi
base='${{ github.event.before }}'
head='${{ github.sha }}'
# Zero SHA (branch created / force push) or manual dispatch: fall back
@@ -75,6 +141,10 @@ jobs:
if [ -z "$base" ] || [ "$base" = "0000000000000000000000000000000000000000" ] || ! git cat-file -e "$base^{commit}" 2>/dev/null; then
base="$head^"
fi
# Exposed so the OFL-pending step below can reuse this exact diff
# range instead of re-deriving it (and drifting from this logic).
echo "base=$base" >> "$GITHUB_OUTPUT"
echo "head=$head" >> "$GITHUB_OUTPUT"
mapfile -t candidates < <(
git diff --name-only "$base" "$head" -- resources/profiles \
| sed -nE 's#^resources/profiles/([^/]+)/.*#\1#p; s#^resources/profiles/([^/]+)\.json$#\1#p' \
@@ -84,10 +154,7 @@ jobs:
vendors=()
for v in "${candidates[@]:-}"; do
[ -n "$v" ] || continue
json="resources/profiles/$v.json"
# A vendor has a manifest plus either a preset directory or a version
# field; this drops non-vendor files such as blacklist.json.
if [ -f "$json" ] && { [ -d "resources/profiles/$v" ] || jq -e '.version' "$json" >/dev/null 2>&1; }; then
if is_valid_vendor "$v"; then
vendors+=("$v")
fi
done
@@ -101,6 +168,9 @@ jobs:
# sibling bundle JSON are covered by at least one FOLDER_MERGERS
# grant. The account part is intentionally ignored here: this is a
# post-merge safety check, not an authorization check for a command.
# An ineligible vendor (e.g. OrcaFilamentLibrary, which has no grant)
# is dropped on its own - it never blocks other vendors in the same
# push from publishing.
grants=()
while IFS= read -r raw_line; do
line="${raw_line#"${raw_line%%[![:space:]]*}"}"
@@ -127,23 +197,29 @@ jobs:
return 1
}
authorized=()
unauthorized=()
for v in "${vendors[@]}"; do
if ! is_granted "resources/profiles/$v" || ! is_granted "resources/profiles/$v.json"; then
if is_granted "resources/profiles/$v" && is_granted "resources/profiles/$v.json"; then
authorized+=("$v")
else
unauthorized+=("$v")
fi
done
if [ "${#unauthorized[@]}" -ne 0 ]; then
echo "vendors=" >> "$GITHUB_OUTPUT"
exit 0
echo "::warning::skipping vendor(s) with no FOLDER_MERGERS grant (no asset built or published for them this run): ${unauthorized[*]}"
fi
echo "vendors=${vendors[*]}" >> "$GITHUB_OUTPUT"
echo "vendors=${authorized[*]}" >> "$GITHUB_OUTPUT"
- name: Resolve Orca version
id: orca
if: steps.vendors.outputs.vendors != ''
# Unconditional: needed both by the vendor-publish pipeline below (only
# when vendors is non-empty) and by the OFL-pending step at the end
# (which runs whenever OFL itself changed, even if vendors ends up
# empty because OFL has no FOLDER_MERGERS grant). Cheap and harmless
# to always resolve - version.inc is present on every commit.
shell: bash
run: |
set -euo pipefail
@@ -242,3 +318,132 @@ jobs:
echo "### Published to \`$repo\` release \`$RELEASE_TAG\`"
for f in "$ASSET_DIR"/*.zip; do echo "- \`$(basename "$f")\`"; done
} >> "$GITHUB_STEP_SUMMARY"
- name: Notify OTA auto-publish
# Gated on auto_publish specifically, not just "vendor was dispatched":
# a maintainer manually dispatching with vendor=OrcaFilamentLibrary (e.g.
# to rebuild/republish an asset while debugging) must not silently go
# live. Only a caller that explicitly opts in with auto_publish=true
# (the OFL nightly cron) skips the human changelog/Publish step.
if: >-
steps.vendors.outputs.vendors != '' && github.event_name == 'workflow_dispatch'
&& (inputs.auto_publish == true || inputs.auto_publish == 'true')
shell: bash
env:
OTA_API_BASE_URL: ${{ vars.OTA_API_BASE_URL }}
OTA_API_KEY: ${{ secrets.OFL_OTA_PUBLISH_KEY }}
ASSET_DIR: ${{ steps.pkg.outputs.dir }}
run: |
set -euo pipefail
[ -n "$OTA_API_BASE_URL" ] || { echo "::error::vars.OTA_API_BASE_URL is not set"; exit 1; }
[ -n "$OTA_API_KEY" ] || { echo "::error::secrets.OFL_OTA_PUBLISH_KEY is not set"; exit 1; }
mapfile -t zip_files < <(cd "$ASSET_DIR" && ls -1 *.zip)
filenames_json="$(printf '%s\n' "${zip_files[@]}" | jq -R . | jq -s .)"
payload="$(jq -n --argjson filenames "$filenames_json" '{filenames: $filenames}')"
resp_file="$RUNNER_TEMP/ota-auto-publish-response.json"
status="$(curl -sS -o "$resp_file" -w '%{http_code}' -X POST \
"${OTA_API_BASE_URL%/}/api/v1/ota/auto-publish" \
-H "Authorization: Bearer $OTA_API_KEY" \
-H 'Content-Type: application/json' \
-d "$payload")"
body="$(cat "$resp_file")"
echo "$body"
if [ "$status" != "200" ]; then
echo "::error::OTA auto-publish call failed with HTTP $status"
exit 1
fi
# A 200 can still carry per-file "error" results (e.g. NOT_FOUND); the
# asset is already safely published to the profiles release above, but
# it never went live, so treat that as a failure worth surfacing loudly.
error_count="$(jq '[.results[] | select(.status == "error")] | length' <<< "$body")"
if [ "$error_count" != "0" ]; then
jq -r '.results[] | select(.status == "error") | "::error::\(.filename): \(.code) - \(.message)"' <<< "$body"
exit 1
fi
- name: Record OFL pending changes
# A real merge, never the cron's explicit-vendor dispatch (that's
# automation publishing, not a new merge to report). This covers two
# trigger shapes: an ordinary push, and a vendor-less workflow_dispatch
# - the latter is exactly what pr-merge-bot.yml's re-dispatch after a
# successful /bot merge looks like (a GITHUB_TOKEN-authored merge fires
# no push event at all, which is why that re-dispatch exists). Both
# land in the same diff-fallback path in "Resolve changed vendors", so
# base/head/orca_ver are already correctly populated either way - only
# this condition needs widening.
# Placed last in the job on purpose: a failure here must never block
# the vendor-publish pipeline above, which a step failing earlier in
# the job would do (subsequent steps without always() get skipped).
if: >-
github.event_name == 'push' ||
(github.event_name == 'workflow_dispatch' && !inputs.vendor)
shell: bash
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
OTA_API_BASE_URL: ${{ vars.OTA_API_BASE_URL }}
OTA_API_KEY: ${{ secrets.OFL_OTA_PUBLISH_KEY }}
run: |
set -euo pipefail
base='${{ steps.vendors.outputs.base }}'
head='${{ steps.vendors.outputs.head }}'
orca_ver='${{ steps.orca.outputs.orca_ver }}'
# Only real vendor subdirectories under filament/, e.g.
# .../filament/Qidi/x.json -> "Qidi". This naturally excludes loose
# top-level files (.../filament/Generic PLA @System.json - no further
# slash to match) and is further filtered below to drop "base", the
# shared @base/@System inheritance folder, not a partner company.
mapfile -t ofl_companies < <(
git diff --name-only "$base" "$head" -- resources/profiles/OrcaFilamentLibrary/filament \
| sed -nE 's#^resources/profiles/OrcaFilamentLibrary/filament/([^/]+)/.*#\1#p' \
| grep -vx 'base' \
| sort -u
)
if [ "${#ofl_companies[@]}" -eq 0 ]; then
echo "No OFL company folders changed in this push."
exit 0
fi
[ -n "$OTA_API_BASE_URL" ] || { echo "::error::vars.OTA_API_BASE_URL is not set"; exit 1; }
[ -n "$OTA_API_KEY" ] || { echo "::error::secrets.OFL_OTA_PUBLISH_KEY is not set"; exit 1; }
# The head commit's own merged PR, not a per-commit walk: this
# assumes the ordinary one-PR-per-push shape every other merge path
# in this repo already assumes (pr-merge-bot.yml's re-dispatch logic
# does the same). A merge commit's parents don't matter here - this
# API call works the same regardless of merge strategy.
pr_json="$(gh api "repos/${{ github.repository }}/commits/$head/pulls" \
--jq '[.[] | select(.merged_at != null)] | sort_by(.merged_at) | last // empty')"
if [ -z "$pr_json" ]; then
echo "::warning::push $head touches OFL compan(y/ies) (${ofl_companies[*]}) but has no associated merged PR; skipping pending record(s)"
exit 0
fi
pr_number="$(jq -r '.number' <<< "$pr_json")"
pr_url="$(jq -r '.html_url' <<< "$pr_json")"
pr_title="$(jq -r '.title' <<< "$pr_json")"
for company in "${ofl_companies[@]}"; do
payload="$(jq -n --arg vendor "$company" --arg ver "$orca_ver" --argjson pr "$pr_number" \
--arg url "$pr_url" --arg title "$pr_title" \
'{vendor: $vendor, orcaSlicerVersion: $ver, prNumber: $pr, prUrl: $url, prTitle: $title}')"
resp_file="$RUNNER_TEMP/ofl-pending-$company.json"
status="$(curl -sS -o "$resp_file" -w '%{http_code}' -X POST \
"${OTA_API_BASE_URL%/}/api/v1/ota/ofl/pending" \
-H "Authorization: Bearer $OTA_API_KEY" \
-H 'Content-Type: application/json' \
-d "$payload")"
body="$(cat "$resp_file")"
echo "$body"
if [ "$status" != "200" ]; then
echo "::error::OFL pending record failed for vendor=$company (PR #$pr_number): HTTP $status"
exit 1
fi
done
-220
View File
@@ -1,220 +0,0 @@
# Deferred Page Construction: High Level Design
## Why it exists
The main window is a notebook of tabs. When the first frame appears, one tab is on
screen and the others are not; some of them are opened later in the session, some
never, and some only exist for certain printers. Building a tab before the first frame
adds its cost to every startup, whether or not the tab is used.
This subsystem builds a tab's panel the first time the tab is shown. It also builds the
remaining tabs while the user is idle after startup, in units of tens of milliseconds,
so a click that lands in the middle of one waits for that unit and no longer. Startup
pays only for what the first frame shows, and the other tabs are usually built before
anyone opens them.
## The parts
`src/slic3r/GUI/Lazy.hpp`, `LazyPage.hpp`, `StagedBuild.hpp` and `IdleScheduler.hpp/.cpp`
(with its wx-free `PrebuildQueue.hpp`) are independent. A holder can hold anything a
factory makes, a page is a holder with a placeholder widget, a staged object can live
outside a holder, and the scheduler knows none of them; it runs tasks, which `MainFrame`
makes from the holders.
### Lazy<T>: the holder
Holds an object that a factory makes on first use, under a name for the log and a place
in the idle queue, both given by the owner. The header has no wx dependency; the busy
cursor for an on-demand build lives in `Lazy.cpp` and is skipped when there is no app,
so the holder is unit-tested.
- `get()` is null until the object is completely built; `built()` says the same.
- `ensure()` builds whatever is left now, under a busy cursor, and returns the object, or
null in the two cases below. A click on an unbuilt tab or a first open of a dialog goes
through this, and it logs the units and time it took.
- `build_step()` runs one unit of construction and returns true while more remain. The
first unit is the factory call, and each later unit is one `StagedBuild` step if the
type has them.
- `when_built(fn)` runs `fn(object)` now if it exists, otherwise once it is built.
- `pending()` says whether the idle prebuild has work here: not built, and the factory
has not returned null. A null factory result is logged and the holder stays unbuilt.
- A unit that pumps the event loop cannot re-enter the holder; a nested `build_step()`
does nothing and a nested `ensure()` returns null.
- After a unit throws, the holder and the scheduler still run the next one.
The holder does not own the object; its wx parent does, as for any window. A type with
one instance in the app derives from `LazyInstance<T>`, which points at that instance's
holder (the holder registers itself, and a recreated `MainFrame`'s holder replaces the
old frame's) and gives the type the static entry points the rest of the app uses,
`T::if_built()`, `T::ensure()` and `T::when_built(fn)`. They return null, or do
nothing, while no holder exists, so a caller needs no `mainframe` check.
`built()` is an atomic flag, since a job worker reads it through the statics
(`MainFrame::get_calibration_curr_tab()`); it is set after the object is complete.
`LazyBase` is the holder's type-free interface (`name()`, `built()`, `pending()`,
`build_step()`, `prebuild_order()`) and is what the scheduler side sees.
### LazyPage<Panel>: the placeholder
A `wxPanel` placed in the parent in place of the real panel, and a `Lazy<Panel>` whose
factory makes the panel inside it (by default `new Panel(parent)`). The notebook needs a
page object for the tab to exist and for `show_device()` to insert and remove tabs by
pointer, and the placeholder is that object. `MainFrame` creates every page once, named
after its `TAB_ID_*`, and keeps it for the frame's life; `show_device()` only moves
pages in and out of the book.
- `Show()` is forwarded to the panel, so a panel's own `Show()` override stays its
activation hook (refresh timers, machine sync) and `SelectPageByName()` works
unchanged. A show builds the panel unless the frame itself is still hidden, because
the book selects its first page as it is inserted; `MainFrame::Show()` shows the
current page again when the frame becomes visible, which builds it.
- `in_book()` says whether the parent notebook currently lists the page, and
`pending()` is that and not built, so a tab `show_device()` has taken out of the book
is not prebuilt.
- A panel built while its page is hidden stays hidden, and a completed panel gets the
dark-mode pass the frame ran before it existed.
The Compare presets dialog is a holder without a page. `MainFrame` keeps a
`Lazy<DiffPresetDialog>` whose factory constructs the dialog and binds its events, the
dialog derives from `LazyInstance`, and its callers use
`DiffPresetDialog::ensure()->show()` and `DiffPresetDialog::if_built()` like a tab's
callers do. Saving a preset refreshes the dialog only while it is shown, since `show()`
reloads the presets.
### StagedBuild: construction in units
A mixin for a panel whose constructor is too big to be one unit. The constructor builds
the skeleton (sizers, and the parts other code may touch) and queues the rest with
`add_build_step()`. `build_step()` runs one step, and `add_build_steps_of(child)`
forwards a child's steps so a nested panel is spread the same way; the parent is built
only once the child is, including steps the child queues later. Steps run in order, on
the main thread. A `Lazy<T>` recognises a staged type at compile time and runs its steps
one per unit.
Nothing may touch what a step builds before the last step has run. In practice:
- nothing paints the panel before it is complete, since a panel built at idle is hidden
with its page and one built on demand finishes inside `ensure()` before the event loop
runs again;
- members created in steps are initialised to null in the header, so a partially built
panel can be destroyed;
- timers and event handlers that use step content check `built()` first
(`MonitorPanel::update_all()`, `CalibrationPanel::update_all()`), and a child's steps
are queued before anything in the constructor can fire such a handler;
- a destructor that disconnects from step content checks `built()` first;
- a constructor or step does not take focus while the panel is off screen
(`IsShownOnScreen()` before `SetFocus()`), since it may run while the user is typing
elsewhere;
- where a step's widgets must keep their place in a sizer that later steps also fill, the
constructor adds an empty slot sizer in that position and the step fills the slot
(`StatusBasePanel`).
### IdleScheduler: when to build
A task is any `LazyBase`: a name for the log, `pending()`, `build_step()` and
`prebuild_order()`. `PrebuildQueue` holds the tasks by order (equal order in the order
added) and runs a slice, the units of the first pending task until it completes, the
budget is spent on the clock it is given, or the interrupt predicate says input arrived.
It has no wx dependency and is unit-tested with a fake clock. A task whose work is gone
is passed over and stays in the queue, so a tab that `show_device()` removes and later
re-inserts is pending again.
`IdleScheduler` drives the queue with the real clock, the app's input timestamp and the
Windows queue check, and logs each unit and slice. Each slice is a timer message: a
period of 250 ms while waiting for the user to go quiet, and a one-shot of zero after a
slice that left work, so the event loop dispatches whatever it has queued (paint,
timers, input) before the next slice runs. Chaining slices with `CallAfter` would not do
this: wx drains pending events fully before the next native message, on every platform.
On GTK the one-shot is 5 ms, because a due GLib timeout runs ahead of the redraw and
idle sources that paint and deliver posted events.
A slice runs only once the user has been idle for the quiet time, and the timer stops
itself once no task is pending. The tick period, quiet time and slice length are
constants in `IdleScheduler.cpp`. A unit cannot be interrupted once started, so the
largest unit bounds click latency on Windows; on the other platforms a click also waits
for the rest of the slice. A unit that pumps the event loop lets the timer fire inside
its own slice, and that tick does nothing.
The tasks are made by their owners. `MainFrame::prebuild_pages_when_idle()` registers
every `LazyPage` the frame created, in or out of the book (`pending()` is false for a
page out of the book), the Compare presets holder, and the Prepare sidebar's settings
page from `ParamsPanel::settings_page_prebuild()`, whose first unit selects the default
tab if none is selected yet and whose later units build one option group each.
`show_device()` only restarts the timer. `MainFrame` owns the scheduler because it owns
everything the tasks build, and clearing the queue with the frame is what keeps a task
from outliving its object.
Idle time comes from `GUI_App::FilterEvent`, which timestamps mouse and keyboard events
(`wxEVT_CATEGORY_USER_INPUT` minus command events, which all claim that category), and
`GUI_App::input_idle_ms()` reports it. On Windows a slice additionally refuses to start
when the message queue holds keyboard, button, touch or pen input. Mouse moves are
excluded because Windows synthesises one whenever a window appears under the cursor,
which every unit does. Other platforms use the timestamp alone.
Once every registered page is built the timer is stopped and the subsystem costs
nothing.
## Rules
**What builds before the first frame.** The Prepare tab's plater, because `post_init()`
needs its GL canvas on screen to initialise OpenGL in every startup state, and the start
page the user configured. Home is built by the first `MainFrame::Show()`, Prepare's
settings page by selecting the tab. `post_init()` passes through the Prepare tab for GL
init under `Freeze()` with `MainFrame::select_prepare_for_gl_init()`, which changes the
selection without the page-changed event, so nothing else is built for that pass.
**Reaching a lazy object.** A caller uses the type's own statics. `T::if_built()` may
return null and is for telling the object something it can live without (a rescale, a
colour change, a status update). `T::ensure()` builds the object and is for navigating
to it or for a caller that is about to show it. A caller that tells the object something
it would not fetch for itself on construction uses `T::when_built()`, which keeps the
message until the object exists. A panel that pulls its state when constructed (the Home
page requests the recent list on load, the Device tab reads the device manager on show)
is reached with `if_built()`; one that cannot pull gets `when_built()`.
**Unit size.** A unit cannot be interrupted, so it should stay within the slice length on
a fast machine. A constructor above that is staged. A single widget above it is the
floor unless the widget itself is split.
**Order.** Cheapest and most likely to be opened first, given where `MainFrame` creates
each holder. The settings page is 0 (the Prepare tab's own content), Home 10, Device 20
(a Bambu user's usual second stop), Calibration 30, Multi-device 40, the web Device
view 50, Project 60 (a second WebView2 instance) and the Compare presets dialog 100;
steps of ten so a new tab takes a value between its neighbours without renumbering
them. `MainFrame::prebuild_pages_when_idle()` registers the tasks once, from
`post_init()`.
**Never prebuilt.** A holder with a negative order, for a tab that few sessions open
and that costs more to build unasked than it saves (the Design tab), and plugin-provided
tabs, which are Python-side and not lazy pages.
## Adopting it
A lazy tab needs:
1. The panel derived from `LazyInstance<Panel>`, since a tab's panel has one instance.
2. A `LazyPage<Panel>*` member in `MainFrame`, created once in `init_tabpanel()` with
its `TAB_ID_*` as the name, its place by the order rule (and a factory if
`new Panel(parent)` is not enough), added to `m_lazy_pages`, and used wherever the
tab is added to or looked up in the notebook.
3. Every use of the panel outside `MainFrame` going through one of the panel's statics,
chosen by the rule above. When converting an existing member, `grep` for it; the
compiler finds the rest.
4. A constructor that copes with the frame already existing and the user being busy
elsewhere, since `wxGetApp().mainframe` is set, the frame may be shown, and the user
may be typing when a lazy panel is built: no `SetFocus()` while off screen, and
whatever the constructor did through a `MainFrame` accessor before (a mode update, a
deferred URL) done in the constructor itself.
To stage a heavy constructor, inherit `StagedBuild`, keep the skeleton in the constructor,
move the rest into `add_build_step()` lambdas in the original order, and follow the
staged-panel rules above. Measure the units. A step that is still one big widget has to
be split inside that widget or accepted as the floor.
Verification is by log. `MainFrame::prebuild_pages_when_idle` lists the queue it
registered, `IdleScheduler::tick` reports each completed task by name at info level and
each slice and unit at debug level, and `Lazy::ensure` reports an object a user built
on demand with the units and time it took. A run from the configured start
page shows every registered page complete, in order, with no unit longer than intended.
A click on a tab mid-prebuild shows the finished panel with an `ensure` line for what was
left, and the slices resume for the remaining tasks once the user is idle again.
+13 -17
View File
@@ -76,10 +76,9 @@ and the count of errors the original parse hit.
Each entry is one preset **in source form**: what its JSON sub-file states and nothing
that resolving it derives — the preset's own config diff, the name of the preset it
inherits, the names of the presets it includes, and the parse metadata (name, sub-path,
description, instantiation, setting and filament ids, renames). Non-instantiated base
presets are stored too; the children that inherit from or include them cannot resolve
without them.
inherits, and the parse metadata (name, sub-path, description, instantiation, setting
and filament ids, renames). Non-instantiated base presets are stored too; the children
that inherit from them cannot resolve without them.
**The payload names its own keys.** The dictionary holds the distinct `opt_key`s the
file uses, the `ConfigOptionType` each was written as, and the distinct enum *value
@@ -162,9 +161,9 @@ cache nothing can invalidate is worse than no cache.
Vendors load in a fixed order, because filament inheritance crosses exactly one
boundary: any vendor's filament may inherit from the shared Orca filament library,
and nothing else reaches across vendors — an `include` is always vendor-local. The
library therefore goes first, alone; every other vendor follows in parallel, resolving
against it; and the results are merged in a stable order:
and nothing else reaches across vendors. The library therefore goes first, alone;
every other vendor follows in parallel, resolving against it; and the results are
merged in a stable order:
```mermaid
flowchart LR
@@ -212,16 +211,13 @@ and its cache was never written back.
Serving from a cache is not a memory-image restore. The entries are deserialized and
then installed one by one — inheritance resolved against the presets installed before
them and the currently loaded filament library, includes layered in, configs flattened
onto the collection defaults, validated and registered — by the same function the JSON
path calls straight after parsing a sub-file. An `include` layers what the included
base states, between the parent and the preset's own keys: the base's diff against the
default, taken when the base itself was installed and before the per-variant padding
`inherits` sees, so only what a template sets reaches the presets including it. The two
paths share everything below the parse, which is what makes a cache-loaded bundle
indistinguishable from a JSON-loaded one by construction rather than by test coverage.
Installation also rebuilds each preset's file path from the local data directory, so a
shipped cache never carries the generating machine's paths.
them and the currently loaded filament library, configs flattened onto the collection
defaults, validated and registered — by the same function the JSON path calls straight
after parsing a sub-file. The two paths share everything below the parse, which is what
makes a cache-loaded bundle indistinguishable from a JSON-loaded one by construction
rather than by test coverage. Installation also rebuilds each preset's file path from
the local data directory, so a shipped cache never carries the generating machine's
paths.
App upgrades work because a cache normally survives one. Only a deliberate
`CACHE_VERSION` bump makes an installed cache unreadable, and that is handled at
+253 -253
View File
@@ -1,7 +1,7 @@
{
"name": "Bambulab",
"url": "http://www.bambulab.com/Parameters/vendor/BBL.json",
"version": "02.08.00.10",
"version": "02.08.00.09",
"force_update": "0",
"description": "the initial version of BBL configurations",
"machine_model_list": [
@@ -67,22 +67,6 @@
"name": "fdm_filament_common",
"sub_path": "filament/fdm_filament_common.json"
},
{
"name": "fdm_filament_template_direct_bowden",
"sub_path": "filament/fdm_filament_template_direct_bowden.json"
},
{
"name": "fdm_filament_template_direct_bowden_e3d",
"sub_path": "filament/fdm_filament_template_direct_bowden_e3d.json"
},
{
"name": "fdm_filament_template_direct_dual",
"sub_path": "filament/fdm_filament_template_direct_dual.json"
},
{
"name": "fdm_filament_template_direct_dual_e3d",
"sub_path": "filament/fdm_filament_template_direct_dual_e3d.json"
},
{
"name": "fdm_filament_abs",
"sub_path": "filament/fdm_filament_abs.json"
@@ -8262,9 +8246,261 @@
{
"name": "Generic TPU @BBL H2S",
"sub_path": "filament/Generic TPU @BBL H2S.json"
},
{
"name": "fdm_filament_template_direct_bowden",
"sub_path": "filament/fdm_filament_template_direct_bowden.json"
},
{
"name": "fdm_filament_template_direct_bowden_e3d",
"sub_path": "filament/fdm_filament_template_direct_bowden_e3d.json"
},
{
"name": "fdm_filament_template_direct_dual",
"sub_path": "filament/fdm_filament_template_direct_dual.json"
},
{
"name": "fdm_filament_template_direct_dual_e3d",
"sub_path": "filament/fdm_filament_template_direct_dual_e3d.json"
}
],
"machine_list": [
{
"name": "fdm_machine_common",
"sub_path": "machine/fdm_machine_common.json"
},
{
"name": "fdm_bbl_3dp_001_common",
"sub_path": "machine/fdm_bbl_3dp_001_common.json"
},
{
"name": "fdm_bbl_3dp_002_common",
"sub_path": "machine/fdm_bbl_3dp_002_common.json"
},
{
"name": "Bambu Lab A1 0.4 nozzle",
"sub_path": "machine/Bambu Lab A1 0.4 nozzle.json"
},
{
"name": "Bambu Lab A1 mini 0.4 nozzle",
"sub_path": "machine/Bambu Lab A1 mini 0.4 nozzle.json"
},
{
"name": "Bambu Lab A2L 0.4 nozzle",
"sub_path": "machine/Bambu Lab A2L 0.4 nozzle.json"
},
{
"name": "Bambu Lab H2S 0.4 nozzle",
"sub_path": "machine/Bambu Lab H2S 0.4 nozzle.json"
},
{
"name": "Bambu Lab P1P 0.4 nozzle",
"sub_path": "machine/Bambu Lab P1P 0.4 nozzle.json"
},
{
"name": "Bambu Lab P1S 0.4 nozzle",
"sub_path": "machine/Bambu Lab P1S 0.4 nozzle.json"
},
{
"name": "Bambu Lab P2S 0.4 nozzle",
"sub_path": "machine/Bambu Lab P2S 0.4 nozzle.json"
},
{
"name": "Bambu Lab X1 0.4 nozzle",
"sub_path": "machine/Bambu Lab X1 0.4 nozzle.json"
},
{
"name": "Bambu Lab X1 Carbon 0.4 nozzle",
"sub_path": "machine/Bambu Lab X1 Carbon 0.4 nozzle.json"
},
{
"name": "Bambu Lab X1E 0.4 nozzle",
"sub_path": "machine/Bambu Lab X1E 0.4 nozzle.json"
},
{
"name": "Bambu Lab H2C 0.4 nozzle",
"sub_path": "machine/Bambu Lab H2C 0.4 nozzle.json"
},
{
"name": "Bambu Lab H2D 0.4 nozzle",
"sub_path": "machine/Bambu Lab H2D 0.4 nozzle.json"
},
{
"name": "Bambu Lab H2D Pro 0.4 nozzle",
"sub_path": "machine/Bambu Lab H2D Pro 0.4 nozzle.json"
},
{
"name": "Bambu Lab X2D 0.4 nozzle",
"sub_path": "machine/Bambu Lab X2D 0.4 nozzle.json"
},
{
"name": "Bambu Lab A1 0.2 nozzle",
"sub_path": "machine/Bambu Lab A1 0.2 nozzle.json"
},
{
"name": "Bambu Lab A1 0.6 nozzle",
"sub_path": "machine/Bambu Lab A1 0.6 nozzle.json"
},
{
"name": "Bambu Lab A1 0.8 nozzle",
"sub_path": "machine/Bambu Lab A1 0.8 nozzle.json"
},
{
"name": "Bambu Lab A1 mini 0.2 nozzle",
"sub_path": "machine/Bambu Lab A1 mini 0.2 nozzle.json"
},
{
"name": "Bambu Lab A1 mini 0.6 nozzle",
"sub_path": "machine/Bambu Lab A1 mini 0.6 nozzle.json"
},
{
"name": "Bambu Lab A1 mini 0.8 nozzle",
"sub_path": "machine/Bambu Lab A1 mini 0.8 nozzle.json"
},
{
"name": "Bambu Lab A2L 0.2 nozzle",
"sub_path": "machine/Bambu Lab A2L 0.2 nozzle.json"
},
{
"name": "Bambu Lab A2L 0.6 nozzle",
"sub_path": "machine/Bambu Lab A2L 0.6 nozzle.json"
},
{
"name": "Bambu Lab A2L 0.8 nozzle",
"sub_path": "machine/Bambu Lab A2L 0.8 nozzle.json"
},
{
"name": "Bambu Lab H2S 0.2 nozzle",
"sub_path": "machine/Bambu Lab H2S 0.2 nozzle.json"
},
{
"name": "Bambu Lab H2S 0.6 nozzle",
"sub_path": "machine/Bambu Lab H2S 0.6 nozzle.json"
},
{
"name": "Bambu Lab H2S 0.8 nozzle",
"sub_path": "machine/Bambu Lab H2S 0.8 nozzle.json"
},
{
"name": "Bambu Lab P1P 0.2 nozzle",
"sub_path": "machine/Bambu Lab P1P 0.2 nozzle.json"
},
{
"name": "Bambu Lab P1P 0.6 nozzle",
"sub_path": "machine/Bambu Lab P1P 0.6 nozzle.json"
},
{
"name": "Bambu Lab P1P 0.8 nozzle",
"sub_path": "machine/Bambu Lab P1P 0.8 nozzle.json"
},
{
"name": "Bambu Lab P1S 0.2 nozzle",
"sub_path": "machine/Bambu Lab P1S 0.2 nozzle.json"
},
{
"name": "Bambu Lab P1S 0.6 nozzle",
"sub_path": "machine/Bambu Lab P1S 0.6 nozzle.json"
},
{
"name": "Bambu Lab P1S 0.8 nozzle",
"sub_path": "machine/Bambu Lab P1S 0.8 nozzle.json"
},
{
"name": "Bambu Lab P2S 0.2 nozzle",
"sub_path": "machine/Bambu Lab P2S 0.2 nozzle.json"
},
{
"name": "Bambu Lab P2S 0.6 nozzle",
"sub_path": "machine/Bambu Lab P2S 0.6 nozzle.json"
},
{
"name": "Bambu Lab P2S 0.8 nozzle",
"sub_path": "machine/Bambu Lab P2S 0.8 nozzle.json"
},
{
"name": "Bambu Lab X1 0.2 nozzle",
"sub_path": "machine/Bambu Lab X1 0.2 nozzle.json"
},
{
"name": "Bambu Lab X1 0.6 nozzle",
"sub_path": "machine/Bambu Lab X1 0.6 nozzle.json"
},
{
"name": "Bambu Lab X1 0.8 nozzle",
"sub_path": "machine/Bambu Lab X1 0.8 nozzle.json"
},
{
"name": "Bambu Lab X1 Carbon 0.2 nozzle",
"sub_path": "machine/Bambu Lab X1 Carbon 0.2 nozzle.json"
},
{
"name": "Bambu Lab X1 Carbon 0.6 nozzle",
"sub_path": "machine/Bambu Lab X1 Carbon 0.6 nozzle.json"
},
{
"name": "Bambu Lab X1 Carbon 0.8 nozzle",
"sub_path": "machine/Bambu Lab X1 Carbon 0.8 nozzle.json"
},
{
"name": "Bambu Lab X1E 0.2 nozzle",
"sub_path": "machine/Bambu Lab X1E 0.2 nozzle.json"
},
{
"name": "Bambu Lab X1E 0.6 nozzle",
"sub_path": "machine/Bambu Lab X1E 0.6 nozzle.json"
},
{
"name": "Bambu Lab X1E 0.8 nozzle",
"sub_path": "machine/Bambu Lab X1E 0.8 nozzle.json"
},
{
"name": "Bambu Lab H2C 0.2 nozzle",
"sub_path": "machine/Bambu Lab H2C 0.2 nozzle.json"
},
{
"name": "Bambu Lab H2C 0.6 nozzle",
"sub_path": "machine/Bambu Lab H2C 0.6 nozzle.json"
},
{
"name": "Bambu Lab H2C 0.8 nozzle",
"sub_path": "machine/Bambu Lab H2C 0.8 nozzle.json"
},
{
"name": "Bambu Lab H2D 0.2 nozzle",
"sub_path": "machine/Bambu Lab H2D 0.2 nozzle.json"
},
{
"name": "Bambu Lab H2D 0.6 nozzle",
"sub_path": "machine/Bambu Lab H2D 0.6 nozzle.json"
},
{
"name": "Bambu Lab H2D 0.8 nozzle",
"sub_path": "machine/Bambu Lab H2D 0.8 nozzle.json"
},
{
"name": "Bambu Lab H2D Pro 0.2 nozzle",
"sub_path": "machine/Bambu Lab H2D Pro 0.2 nozzle.json"
},
{
"name": "Bambu Lab H2D Pro 0.6 nozzle",
"sub_path": "machine/Bambu Lab H2D Pro 0.6 nozzle.json"
},
{
"name": "Bambu Lab H2D Pro 0.8 nozzle",
"sub_path": "machine/Bambu Lab H2D Pro 0.8 nozzle.json"
},
{
"name": "Bambu Lab X2D 0.2 nozzle",
"sub_path": "machine/Bambu Lab X2D 0.2 nozzle.json"
},
{
"name": "Bambu Lab X2D 0.6 nozzle",
"sub_path": "machine/Bambu Lab X2D 0.6 nozzle.json"
},
{
"name": "Bambu Lab X2D 0.8 nozzle",
"sub_path": "machine/Bambu Lab X2D 0.8 nozzle.json"
},
{
"name": "Bambu Lab A1 0.4 nozzle template change_filament_gcode",
"sub_path": "machine/Bambu Lab A1 0.4 nozzle template change_filament_gcode.json"
@@ -8620,242 +8856,6 @@
{
"name": "Bambu Lab X2D 0.4 nozzle template time_lapse_gcode",
"sub_path": "machine/Bambu Lab X2D 0.4 nozzle template time_lapse_gcode.json"
},
{
"name": "fdm_machine_common",
"sub_path": "machine/fdm_machine_common.json"
},
{
"name": "fdm_bbl_3dp_001_common",
"sub_path": "machine/fdm_bbl_3dp_001_common.json"
},
{
"name": "fdm_bbl_3dp_002_common",
"sub_path": "machine/fdm_bbl_3dp_002_common.json"
},
{
"name": "Bambu Lab A1 0.4 nozzle",
"sub_path": "machine/Bambu Lab A1 0.4 nozzle.json"
},
{
"name": "Bambu Lab A1 mini 0.4 nozzle",
"sub_path": "machine/Bambu Lab A1 mini 0.4 nozzle.json"
},
{
"name": "Bambu Lab A2L 0.4 nozzle",
"sub_path": "machine/Bambu Lab A2L 0.4 nozzle.json"
},
{
"name": "Bambu Lab H2S 0.4 nozzle",
"sub_path": "machine/Bambu Lab H2S 0.4 nozzle.json"
},
{
"name": "Bambu Lab P1P 0.4 nozzle",
"sub_path": "machine/Bambu Lab P1P 0.4 nozzle.json"
},
{
"name": "Bambu Lab P1S 0.4 nozzle",
"sub_path": "machine/Bambu Lab P1S 0.4 nozzle.json"
},
{
"name": "Bambu Lab P2S 0.4 nozzle",
"sub_path": "machine/Bambu Lab P2S 0.4 nozzle.json"
},
{
"name": "Bambu Lab X1 0.4 nozzle",
"sub_path": "machine/Bambu Lab X1 0.4 nozzle.json"
},
{
"name": "Bambu Lab X1 Carbon 0.4 nozzle",
"sub_path": "machine/Bambu Lab X1 Carbon 0.4 nozzle.json"
},
{
"name": "Bambu Lab X1E 0.4 nozzle",
"sub_path": "machine/Bambu Lab X1E 0.4 nozzle.json"
},
{
"name": "Bambu Lab H2C 0.4 nozzle",
"sub_path": "machine/Bambu Lab H2C 0.4 nozzle.json"
},
{
"name": "Bambu Lab H2D 0.4 nozzle",
"sub_path": "machine/Bambu Lab H2D 0.4 nozzle.json"
},
{
"name": "Bambu Lab H2D Pro 0.4 nozzle",
"sub_path": "machine/Bambu Lab H2D Pro 0.4 nozzle.json"
},
{
"name": "Bambu Lab X2D 0.4 nozzle",
"sub_path": "machine/Bambu Lab X2D 0.4 nozzle.json"
},
{
"name": "Bambu Lab A1 0.2 nozzle",
"sub_path": "machine/Bambu Lab A1 0.2 nozzle.json"
},
{
"name": "Bambu Lab A1 0.6 nozzle",
"sub_path": "machine/Bambu Lab A1 0.6 nozzle.json"
},
{
"name": "Bambu Lab A1 0.8 nozzle",
"sub_path": "machine/Bambu Lab A1 0.8 nozzle.json"
},
{
"name": "Bambu Lab A1 mini 0.2 nozzle",
"sub_path": "machine/Bambu Lab A1 mini 0.2 nozzle.json"
},
{
"name": "Bambu Lab A1 mini 0.6 nozzle",
"sub_path": "machine/Bambu Lab A1 mini 0.6 nozzle.json"
},
{
"name": "Bambu Lab A1 mini 0.8 nozzle",
"sub_path": "machine/Bambu Lab A1 mini 0.8 nozzle.json"
},
{
"name": "Bambu Lab A2L 0.2 nozzle",
"sub_path": "machine/Bambu Lab A2L 0.2 nozzle.json"
},
{
"name": "Bambu Lab A2L 0.6 nozzle",
"sub_path": "machine/Bambu Lab A2L 0.6 nozzle.json"
},
{
"name": "Bambu Lab A2L 0.8 nozzle",
"sub_path": "machine/Bambu Lab A2L 0.8 nozzle.json"
},
{
"name": "Bambu Lab H2S 0.2 nozzle",
"sub_path": "machine/Bambu Lab H2S 0.2 nozzle.json"
},
{
"name": "Bambu Lab H2S 0.6 nozzle",
"sub_path": "machine/Bambu Lab H2S 0.6 nozzle.json"
},
{
"name": "Bambu Lab H2S 0.8 nozzle",
"sub_path": "machine/Bambu Lab H2S 0.8 nozzle.json"
},
{
"name": "Bambu Lab P1P 0.2 nozzle",
"sub_path": "machine/Bambu Lab P1P 0.2 nozzle.json"
},
{
"name": "Bambu Lab P1P 0.6 nozzle",
"sub_path": "machine/Bambu Lab P1P 0.6 nozzle.json"
},
{
"name": "Bambu Lab P1P 0.8 nozzle",
"sub_path": "machine/Bambu Lab P1P 0.8 nozzle.json"
},
{
"name": "Bambu Lab P1S 0.2 nozzle",
"sub_path": "machine/Bambu Lab P1S 0.2 nozzle.json"
},
{
"name": "Bambu Lab P1S 0.6 nozzle",
"sub_path": "machine/Bambu Lab P1S 0.6 nozzle.json"
},
{
"name": "Bambu Lab P1S 0.8 nozzle",
"sub_path": "machine/Bambu Lab P1S 0.8 nozzle.json"
},
{
"name": "Bambu Lab P2S 0.2 nozzle",
"sub_path": "machine/Bambu Lab P2S 0.2 nozzle.json"
},
{
"name": "Bambu Lab P2S 0.6 nozzle",
"sub_path": "machine/Bambu Lab P2S 0.6 nozzle.json"
},
{
"name": "Bambu Lab P2S 0.8 nozzle",
"sub_path": "machine/Bambu Lab P2S 0.8 nozzle.json"
},
{
"name": "Bambu Lab X1 0.2 nozzle",
"sub_path": "machine/Bambu Lab X1 0.2 nozzle.json"
},
{
"name": "Bambu Lab X1 0.6 nozzle",
"sub_path": "machine/Bambu Lab X1 0.6 nozzle.json"
},
{
"name": "Bambu Lab X1 0.8 nozzle",
"sub_path": "machine/Bambu Lab X1 0.8 nozzle.json"
},
{
"name": "Bambu Lab X1 Carbon 0.2 nozzle",
"sub_path": "machine/Bambu Lab X1 Carbon 0.2 nozzle.json"
},
{
"name": "Bambu Lab X1 Carbon 0.6 nozzle",
"sub_path": "machine/Bambu Lab X1 Carbon 0.6 nozzle.json"
},
{
"name": "Bambu Lab X1 Carbon 0.8 nozzle",
"sub_path": "machine/Bambu Lab X1 Carbon 0.8 nozzle.json"
},
{
"name": "Bambu Lab X1E 0.2 nozzle",
"sub_path": "machine/Bambu Lab X1E 0.2 nozzle.json"
},
{
"name": "Bambu Lab X1E 0.6 nozzle",
"sub_path": "machine/Bambu Lab X1E 0.6 nozzle.json"
},
{
"name": "Bambu Lab X1E 0.8 nozzle",
"sub_path": "machine/Bambu Lab X1E 0.8 nozzle.json"
},
{
"name": "Bambu Lab H2C 0.2 nozzle",
"sub_path": "machine/Bambu Lab H2C 0.2 nozzle.json"
},
{
"name": "Bambu Lab H2C 0.6 nozzle",
"sub_path": "machine/Bambu Lab H2C 0.6 nozzle.json"
},
{
"name": "Bambu Lab H2C 0.8 nozzle",
"sub_path": "machine/Bambu Lab H2C 0.8 nozzle.json"
},
{
"name": "Bambu Lab H2D 0.2 nozzle",
"sub_path": "machine/Bambu Lab H2D 0.2 nozzle.json"
},
{
"name": "Bambu Lab H2D 0.6 nozzle",
"sub_path": "machine/Bambu Lab H2D 0.6 nozzle.json"
},
{
"name": "Bambu Lab H2D 0.8 nozzle",
"sub_path": "machine/Bambu Lab H2D 0.8 nozzle.json"
},
{
"name": "Bambu Lab H2D Pro 0.2 nozzle",
"sub_path": "machine/Bambu Lab H2D Pro 0.2 nozzle.json"
},
{
"name": "Bambu Lab H2D Pro 0.6 nozzle",
"sub_path": "machine/Bambu Lab H2D Pro 0.6 nozzle.json"
},
{
"name": "Bambu Lab H2D Pro 0.8 nozzle",
"sub_path": "machine/Bambu Lab H2D Pro 0.8 nozzle.json"
},
{
"name": "Bambu Lab X2D 0.2 nozzle",
"sub_path": "machine/Bambu Lab X2D 0.2 nozzle.json"
},
{
"name": "Bambu Lab X2D 0.6 nozzle",
"sub_path": "machine/Bambu Lab X2D 0.6 nozzle.json"
},
{
"name": "Bambu Lab X2D 0.8 nozzle",
"sub_path": "machine/Bambu Lab X2D 0.8 nozzle.json"
}
],
"process_list": [
Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 18 KiB

+17 -121
View File
@@ -1,7 +1,7 @@
{
"name": "Sovol",
"url": "",
"version": "02.04.00.07",
"version": "02.04.00.04",
"force_update": "0",
"description": "Sovol configurations",
"machine_model_list": [
@@ -167,6 +167,10 @@
"name": "0.20mm Standard @Sovol SV08 MAX 0.4 nozzle",
"sub_path": "process/0.20mm Standard @Sovol SV08 MAX 0.4 nozzle.json"
},
{
"name": "0.20mm Standard @Sovol Zero 0.4 nozzle",
"sub_path": "process/0.20mm Standard @Sovol Zero 0.4 nozzle.json"
},
{
"name": "0.28mm Fast @Sovol SV06 ACE",
"sub_path": "process/0.28mm Fast @Sovol SV06 ACE 0.4 nozzle.json"
@@ -194,74 +198,6 @@
{
"name": "0.40mm Standard @Sovol SV08 MAX 0.8 nozzle",
"sub_path": "process/0.40mm Standard @Sovol SV08 MAX 0.8 nozzle.json"
},
{
"name": "fdm_process_zero",
"sub_path": "process/fdm_process_zero.json"
},
{
"name": "0.06mm Quality @Sovol Zero 0.2 nozzle",
"sub_path": "process/0.06mm Quality @Sovol Zero 0.2 nozzle.json"
},
{
"name": "0.10mm Standard @Sovol Zero 0.2 nozzle",
"sub_path": "process/0.10mm Standard @Sovol Zero 0.2 nozzle.json"
},
{
"name": "0.12mm Quality @Sovol Zero 0.4 nozzle",
"sub_path": "process/0.12mm Quality @Sovol Zero 0.4 nozzle.json"
},
{
"name": "0.14mm Fast @Sovol Zero 0.2 nozzle",
"sub_path": "process/0.14mm Fast @Sovol Zero 0.2 nozzle.json"
},
{
"name": "0.15mm Quality @Sovol Zero 0.6 nozzle",
"sub_path": "process/0.15mm Quality @Sovol Zero 0.6 nozzle.json"
},
{
"name": "0.20mm Quality @Sovol Zero 0.8 nozzle",
"sub_path": "process/0.20mm Quality @Sovol Zero 0.8 nozzle.json"
},
{
"name": "0.20mm Standard @Sovol Zero 0.4 nozzle",
"sub_path": "process/0.20mm Standard @Sovol Zero 0.4 nozzle.json"
},
{
"name": "0.25mm Quality @Sovol Zero 1.0 nozzle",
"sub_path": "process/0.25mm Quality @Sovol Zero 1.0 nozzle.json"
},
{
"name": "0.25mm SPEEDBENCHY @Sovol Zero 0.4 nozzle",
"sub_path": "process/0.25mm SPEEDBENCHY @Sovol Zero 0.4 nozzle.json"
},
{
"name": "0.28mm Fast @Sovol Zero 0.4 nozzle",
"sub_path": "process/0.28mm Fast @Sovol Zero 0.4 nozzle.json"
},
{
"name": "0.30mm Standard @Sovol Zero 0.6 nozzle",
"sub_path": "process/0.30mm Standard @Sovol Zero 0.6 nozzle.json"
},
{
"name": "0.40mm Standard @Sovol Zero 0.8 nozzle",
"sub_path": "process/0.40mm Standard @Sovol Zero 0.8 nozzle.json"
},
{
"name": "0.42mm Fast @Sovol Zero 0.6 nozzle",
"sub_path": "process/0.42mm Fast @Sovol Zero 0.6 nozzle.json"
},
{
"name": "0.50mm Standard @Sovol Zero 1.0 nozzle",
"sub_path": "process/0.50mm Standard @Sovol Zero 1.0 nozzle.json"
},
{
"name": "0.56mm Fast @Sovol Zero 0.8 nozzle",
"sub_path": "process/0.56mm Fast @Sovol Zero 0.8 nozzle.json"
},
{
"name": "0.70mm Fast @Sovol Zero 1.0 nozzle",
"sub_path": "process/0.70mm Fast @Sovol Zero 1.0 nozzle.json"
}
],
"filament_list": [
@@ -313,10 +249,6 @@
"name": "Generic PETG @Sovol Zero",
"sub_path": "filament/Generic PETG @Sovol Zero.json"
},
{
"name": "Generic PETG @Sovol Zero Hardened Steel nozzle",
"sub_path": "filament/Generic PETG @Sovol Zero Hardened Steel nozzle.json"
},
{
"name": "Generic PLA @Sovol SV06 ACE",
"sub_path": "filament/Generic PLA @Sovol SV06 ACE.json"
@@ -345,14 +277,6 @@
"name": "Generic PLA @Sovol Zero",
"sub_path": "filament/Generic PLA @Sovol Zero.json"
},
{
"name": "Generic PLA @Sovol Zero Hardened Steel nozzle",
"sub_path": "filament/Generic PLA @Sovol Zero Hardened Steel nozzle.json"
},
{
"name": "Generic PLA SPEEDBENCHY @Sovol Zero",
"sub_path": "filament/Generic PLA SPEEDBENCHY @Sovol Zero.json"
},
{
"name": "Generic PLA Silk @Sovol SV08 MAX",
"sub_path": "filament/Generic PLA Silk @Sovol SV08 MAX.json"
@@ -361,10 +285,6 @@
"name": "Generic PLA Silk @Sovol Zero",
"sub_path": "filament/Generic PLA Silk @Sovol Zero.json"
},
{
"name": "Generic PLA Silk @Sovol Zero Hardened Steel nozzle",
"sub_path": "filament/Generic PLA Silk @Sovol Zero Hardened Steel nozzle.json"
},
{
"name": "Generic TPU @Sovol SV06 ACE",
"sub_path": "filament/Generic TPU @Sovol SV06 ACE.json"
@@ -392,6 +312,18 @@
{
"name": "SUNLU PETG @Sovol SV08 MAX",
"sub_path": "filament/SUNLU PETG @Sovol SV08 MAX.json"
},
{
"name": "Sovol Zero PETG HS Nozzle",
"sub_path": "filament/Sovol Zero PETG HS Nozzle.json"
},
{
"name": "Sovol Zero PLA Basic HS Nozzle",
"sub_path": "filament/Sovol Zero PLA Basic HS Nozzle.json"
},
{
"name": "Sovol Zero PLA Silk HS Nozzle",
"sub_path": "filament/Sovol Zero PLA Silk HS Nozzle.json"
}
],
"machine_list": [
@@ -483,45 +415,9 @@
"name": "Sovol SV08 MAX 0.8 nozzle",
"sub_path": "machine/Sovol SV08 MAX 0.8 nozzle.json"
},
{
"name": "Sovol Zero 0.2 nozzle",
"sub_path": "machine/Sovol Zero 0.2 nozzle.json"
},
{
"name": "Sovol Zero 0.4 nozzle",
"sub_path": "machine/Sovol Zero 0.4 nozzle.json"
},
{
"name": "Sovol Zero 0.6 nozzle",
"sub_path": "machine/Sovol Zero 0.6 nozzle.json"
},
{
"name": "Sovol Zero 0.8 nozzle",
"sub_path": "machine/Sovol Zero 0.8 nozzle.json"
},
{
"name": "Sovol Zero 1.0 nozzle",
"sub_path": "machine/Sovol Zero 1.0 nozzle.json"
},
{
"name": "Sovol Zero 0.2 Hardened Steel nozzle",
"sub_path": "machine/Sovol Zero 0.2 Hardened Steel nozzle.json"
},
{
"name": "Sovol Zero 0.4 Hardened Steel nozzle",
"sub_path": "machine/Sovol Zero 0.4 Hardened Steel nozzle.json"
},
{
"name": "Sovol Zero 0.6 Hardened Steel nozzle",
"sub_path": "machine/Sovol Zero 0.6 Hardened Steel nozzle.json"
},
{
"name": "Sovol Zero 0.8 Hardened Steel nozzle",
"sub_path": "machine/Sovol Zero 0.8 Hardened Steel nozzle.json"
},
{
"name": "Sovol Zero 1.0 Hardened Steel nozzle",
"sub_path": "machine/Sovol Zero 1.0 Hardened Steel nozzle.json"
}
]
}
@@ -1,11 +1,10 @@
{
"type": "filament",
"name": "Generic ABS @Sovol Zero",
"inherits": "Generic ABS @System",
"renamed_from": "Sovol Zero ABS",
"inherits": "fdm_filament_abs",
"from": "system",
"setting_id": "g6sSyyIFYJUzlXsp",
"filament_id": "OFY9muEs",
"instantiation": "true",
"filament_flow_ratio": [
"0.98"
@@ -74,39 +73,6 @@
"0"
],
"compatible_printers": [
"Sovol Zero 0.2 nozzle",
"Sovol Zero 0.4 nozzle",
"Sovol Zero 0.6 nozzle",
"Sovol Zero 0.8 nozzle",
"Sovol Zero 1.0 nozzle",
"Sovol Zero 0.2 Hardened Steel nozzle",
"Sovol Zero 0.4 Hardened Steel nozzle",
"Sovol Zero 0.6 Hardened Steel nozzle",
"Sovol Zero 0.8 Hardened Steel nozzle",
"Sovol Zero 1.0 Hardened Steel nozzle"
],
"cool_plate_temp": [
"80"
],
"eng_plate_temp": [
"80"
],
"textured_plate_temp": [
"80"
],
"cool_plate_temp_initial_layer": [
"80"
],
"eng_plate_temp_initial_layer": [
"80"
],
"textured_plate_temp_initial_layer": [
"80"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"filament_density": [
"1.10"
"Sovol Zero 0.4 nozzle"
]
}
@@ -1,12 +1,11 @@
{
"type": "filament",
"filament_id": "OFLakOUI",
"setting_id": "yRKCiPMN6fxibcyg",
"name": "Generic PC @Sovol Zero",
"inherits": "Generic PC @System",
"renamed_from": "Sovol Zero PC",
"from": "system",
"setting_id": "yRKCiPMN6fxibcyg",
"instantiation": "true",
"inherits": "fdm_filament_pc",
"filament_flow_ratio": [
"0.98"
],
@@ -14,16 +13,7 @@
"21"
],
"compatible_printers": [
"Sovol Zero 0.2 nozzle",
"Sovol Zero 0.4 nozzle",
"Sovol Zero 0.6 nozzle",
"Sovol Zero 0.8 nozzle",
"Sovol Zero 1.0 nozzle",
"Sovol Zero 0.2 Hardened Steel nozzle",
"Sovol Zero 0.4 Hardened Steel nozzle",
"Sovol Zero 0.6 Hardened Steel nozzle",
"Sovol Zero 0.8 Hardened Steel nozzle",
"Sovol Zero 1.0 Hardened Steel nozzle"
"Sovol Zero 0.4 nozzle"
],
"nozzle_temperature_initial_layer": [
"290"
@@ -61,9 +51,7 @@
"slow_down_min_speed": [
"10"
],
"dont_slow_down_outer_wall": [
"0"
],
"dont_slow_down_outer_wall": "0",
"overhang_fan_speed": [
"20"
],
@@ -73,19 +61,8 @@
"temperature_vitrification": [
"60"
],
"additional_cooling_fan_speed": [
"0"
],
"activate_air_filtration": [
"1"
],
"during_print_exhaust_fan_speed": [
"50"
],
"complete_print_exhaust_fan_speed": [
"50"
],
"filament_end_gcode": [
"; filament end gcode \n"
]
"additional_cooling_fan_speed": "0",
"activate_air_filtration": "1",
"during_print_exhaust_fan_speed": "50",
"complete_print_exhaust_fan_speed": "50"
}
@@ -1,116 +0,0 @@
{
"type": "filament",
"filament_id": "OFYPdQJh",
"setting_id": "d9QbCESNz3ZLU6eu",
"name": "Generic PETG @Sovol Zero Hardened Steel nozzle",
"renamed_from": "Sovol Zero PETG HS Nozzle",
"from": "system",
"instantiation": "true",
"inherits": "fdm_filament_pet",
"filament_flow_ratio": [
"0.98"
],
"enable_pressure_advance": [
"1"
],
"pressure_advance": [
"0.048"
],
"filament_max_volumetric_speed": [
"15"
],
"nozzle_temperature_initial_layer": [
"265"
],
"nozzle_temperature": [
"250"
],
"nozzle_temperature_range_low": [
"230"
],
"nozzle_temperature_range_high": [
"280"
],
"hot_plate_temp": [
"85"
],
"hot_plate_temp_initial_layer": [
"85"
],
"fan_min_speed": [
"10"
],
"fan_max_speed": [
"40"
],
"fan_cooling_layer_time": [
"50"
],
"full_fan_speed_layer": [
"3"
],
"slow_down_layer_time": [
"10"
],
"slow_down_min_speed": [
"10"
],
"overhang_fan_speed": [
"70"
],
"overhang_fan_threshold": [
"10%"
],
"temperature_vitrification": [
"60"
],
"close_fan_the_first_x_layers": [
"1"
],
"filament_retraction_length": [
"0.5"
],
"filament_z_hop": [
"0.4"
],
"activate_air_filtration": [
"1"
],
"during_print_exhaust_fan_speed": [
"50"
],
"complete_print_exhaust_fan_speed": [
"50"
],
"compatible_printers": [
"Sovol Zero 0.2 Hardened Steel nozzle",
"Sovol Zero 0.4 Hardened Steel nozzle",
"Sovol Zero 0.6 Hardened Steel nozzle",
"Sovol Zero 0.8 Hardened Steel nozzle",
"Sovol Zero 1.0 Hardened Steel nozzle"
],
"cool_plate_temp": [
"85"
],
"eng_plate_temp": [
"85"
],
"textured_plate_temp": [
"85"
],
"cool_plate_temp_initial_layer": [
"85"
],
"eng_plate_temp_initial_layer": [
"85"
],
"textured_plate_temp_initial_layer": [
"85"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"filament_start_gcode": [
"; filament start gcode\n"
]
}
@@ -1,21 +1,16 @@
{
"type": "filament",
"filament_id": "OFYPdQJh",
"setting_id": "i4OW2eAtXOKdtVNj",
"name": "Generic PETG @Sovol Zero",
"inherits": "Generic PETG @System",
"renamed_from": "Sovol Zero PETG",
"from": "system",
"setting_id": "i4OW2eAtXOKdtVNj",
"instantiation": "true",
"inherits": "fdm_filament_pet",
"filament_flow_ratio": [
"1.0348"
],
"enable_pressure_advance": [
"1"
],
"pressure_advance": [
"0.046"
],
"enable_pressure_advance": "1",
"pressure_advance": "0.046",
"filament_max_volumetric_speed": [
"15"
],
@@ -73,44 +68,10 @@
"filament_z_hop": [
"0.4"
],
"activate_air_filtration": [
"1"
],
"during_print_exhaust_fan_speed": [
"50"
],
"complete_print_exhaust_fan_speed": [
"50"
],
"activate_air_filtration": "1",
"during_print_exhaust_fan_speed": "50",
"complete_print_exhaust_fan_speed": "50",
"compatible_printers": [
"Sovol Zero 0.2 nozzle",
"Sovol Zero 0.4 nozzle",
"Sovol Zero 0.6 nozzle",
"Sovol Zero 0.8 nozzle",
"Sovol Zero 1.0 nozzle"
],
"cool_plate_temp": [
"85"
],
"eng_plate_temp": [
"85"
],
"textured_plate_temp": [
"85"
],
"cool_plate_temp_initial_layer": [
"85"
],
"eng_plate_temp_initial_layer": [
"85"
],
"textured_plate_temp_initial_layer": [
"85"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"filament_start_gcode": [
"; filament start gcode\n"
"Sovol Zero 0.4 nozzle"
]
}
@@ -1,110 +0,0 @@
{
"type": "filament",
"filament_id": "OFDSrzZ8",
"setting_id": "nZgETe4CTpicEjQX",
"name": "Generic PLA @Sovol Zero Hardened Steel nozzle",
"renamed_from": "Sovol Zero PLA Basic HS Nozzle",
"from": "system",
"instantiation": "true",
"inherits": "fdm_filament_pla",
"filament_flow_ratio": [
"1.0348"
],
"filament_max_volumetric_speed": [
"21"
],
"enable_pressure_advance": [
"1"
],
"pressure_advance": [
"0.03"
],
"compatible_printers": [
"Sovol Zero 0.2 Hardened Steel nozzle",
"Sovol Zero 0.4 Hardened Steel nozzle",
"Sovol Zero 0.6 Hardened Steel nozzle",
"Sovol Zero 0.8 Hardened Steel nozzle",
"Sovol Zero 1.0 Hardened Steel nozzle"
],
"nozzle_temperature_initial_layer": [
"245"
],
"nozzle_temperature": [
"230"
],
"nozzle_temperature_range_low": [
"190"
],
"nozzle_temperature_range_high": [
"250"
],
"hot_plate_temp": [
"65"
],
"hot_plate_temp_initial_layer": [
"65"
],
"fan_min_speed": [
"70"
],
"fan_max_speed": [
"100"
],
"fan_cooling_layer_time": [
"80"
],
"full_fan_speed_layer": [
"3"
],
"slow_down_layer_time": [
"5"
],
"slow_down_min_speed": [
"10"
],
"dont_slow_down_outer_wall": [
"0"
],
"overhang_fan_speed": [
"100"
],
"overhang_fan_threshold": [
"50%"
],
"temperature_vitrification": [
"60"
],
"additional_cooling_fan_speed": [
"75%"
],
"activate_air_filtration": [
"1"
],
"during_print_exhaust_fan_speed": [
"80%"
],
"complete_print_exhaust_fan_speed": [
"80%"
],
"cool_plate_temp": [
"60"
],
"eng_plate_temp": [
"60"
],
"textured_plate_temp": [
"60"
],
"cool_plate_temp_initial_layer": [
"55"
],
"eng_plate_temp_initial_layer": [
"55"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"filament_start_gcode": [
"; filament start gcode\n"
]
}
@@ -1,24 +1,21 @@
{
"type": "filament",
"filament_id": "OFDSrzZ8",
"setting_id": "NNDerIjh7qtuh1I3",
"name": "Generic PLA @Sovol Zero",
"inherits": "Generic PLA @System",
"renamed_from": "Sovol Zero PLA Basic",
"from": "system",
"setting_id": "NNDerIjh7qtuh1I3",
"instantiation": "true",
"inherits": "fdm_filament_pla",
"filament_flow_ratio": [
"0.98"
],
"filament_max_volumetric_speed": [
"25"
"21"
],
"enable_pressure_advance": "1",
"pressure_advance": "0.032",
"compatible_printers": [
"Sovol Zero 0.2 nozzle",
"Sovol Zero 0.4 nozzle",
"Sovol Zero 0.6 nozzle",
"Sovol Zero 0.8 nozzle",
"Sovol Zero 1.0 nozzle"
"Sovol Zero 0.4 nozzle"
],
"nozzle_temperature_initial_layer": [
"230"
@@ -27,28 +24,28 @@
"210"
],
"nozzle_temperature_range_low": [
"180"
"190"
],
"nozzle_temperature_range_high": [
"240"
"250"
],
"hot_plate_temp": [
"60"
"65"
],
"hot_plate_temp_initial_layer": [
"60"
"65"
],
"fan_min_speed": [
"100"
"70"
],
"fan_max_speed": [
"100"
],
"fan_cooling_layer_time": [
"60"
"80"
],
"full_fan_speed_layer": [
"2"
"3"
],
"slow_down_layer_time": [
"5"
@@ -56,43 +53,18 @@
"slow_down_min_speed": [
"10"
],
"dont_slow_down_outer_wall": "0",
"overhang_fan_speed": [
"100"
],
"overhang_fan_threshold": [
"10%"
"50%"
],
"temperature_vitrification": [
"50"
],
"filament_z_hop": [
"0.4"
],
"filament_retraction_length": [
"0.4"
],
"filament_diameter": [
"1.75"
],
"cool_plate_temp": [
"60"
],
"eng_plate_temp": [
"60"
],
"textured_plate_temp": [
"60"
],
"cool_plate_temp_initial_layer": [
"55"
],
"eng_plate_temp_initial_layer": [
"55"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"filament_start_gcode": [
"; filament start gcode\n"
]
"additional_cooling_fan_speed": "75%",
"activate_air_filtration": "1",
"during_print_exhaust_fan_speed": "80%",
"complete_print_exhaust_fan_speed": "80%"
}
@@ -1,118 +0,0 @@
{
"type": "filament",
"filament_id": "OFIUkWYN",
"setting_id": "MC2InZ7iKDjIGike",
"name": "Generic PLA SPEEDBENCHY @Sovol Zero",
"from": "system",
"instantiation": "true",
"inherits": "fdm_filament_pla",
"filament_flow_ratio": [
"1"
],
"filament_max_volumetric_speed": [
"50"
],
"compatible_printers": [
"Sovol Zero 0.4 nozzle",
"Sovol Zero 0.4 Hardened Steel nozzle"
],
"nozzle_temperature_initial_layer": [
"245"
],
"nozzle_temperature": [
"225"
],
"nozzle_temperature_range_low": [
"190"
],
"nozzle_temperature_range_high": [
"250"
],
"hot_plate_temp": [
"65"
],
"hot_plate_temp_initial_layer": [
"65"
],
"enable_pressure_advance": [
"1"
],
"pressure_advance": [
"0.032"
],
"fan_min_speed": [
"100"
],
"fan_max_speed": [
"100"
],
"fan_cooling_layer_time": [
"30"
],
"full_fan_speed_layer": [
"3"
],
"slow_down_layer_time": [
"1.7"
],
"slow_down_min_speed": [
"40"
],
"overhang_fan_speed": [
"100"
],
"overhang_fan_threshold": [
"75%"
],
"additional_cooling_fan_speed": [
"100"
],
"filament_z_hop": [
"0"
],
"filament_retraction_length": [
"0.35"
],
"filament_retraction_speed": [
"90"
],
"filament_deretraction_speed": [
"90"
],
"filament_retract_before_wipe": [
"0%"
],
"filament_wipe_distance": [
"2"
],
"filament_retract_when_changing_layer": [
"0"
],
"filament_diameter": [
"1.75"
],
"cool_plate_temp": [
"60"
],
"eng_plate_temp": [
"60"
],
"textured_plate_temp": [
"60"
],
"cool_plate_temp_initial_layer": [
"55"
],
"eng_plate_temp_initial_layer": [
"55"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"filament_start_gcode": [
"; filament start gcode\n"
],
"temperature_vitrification": [
"100"
]
}
@@ -1,110 +0,0 @@
{
"type": "filament",
"filament_id": "OFesA6rF",
"setting_id": "LA8X1RsMdV2xNT1o",
"name": "Generic PLA Silk @Sovol Zero Hardened Steel nozzle",
"renamed_from": "Sovol Zero PLA Silk HS Nozzle",
"from": "system",
"instantiation": "true",
"inherits": "fdm_filament_pla",
"filament_flow_ratio": [
"0.98"
],
"filament_max_volumetric_speed": [
"15"
],
"enable_pressure_advance": [
"1"
],
"pressure_advance": [
"0.027"
],
"compatible_printers": [
"Sovol Zero 0.2 Hardened Steel nozzle",
"Sovol Zero 0.4 Hardened Steel nozzle",
"Sovol Zero 0.6 Hardened Steel nozzle",
"Sovol Zero 0.8 Hardened Steel nozzle",
"Sovol Zero 1.0 Hardened Steel nozzle"
],
"nozzle_temperature_initial_layer": [
"245"
],
"nozzle_temperature": [
"230"
],
"nozzle_temperature_range_low": [
"190"
],
"nozzle_temperature_range_high": [
"250"
],
"hot_plate_temp": [
"65"
],
"hot_plate_temp_initial_layer": [
"65"
],
"fan_min_speed": [
"70"
],
"fan_max_speed": [
"100"
],
"fan_cooling_layer_time": [
"80"
],
"full_fan_speed_layer": [
"3"
],
"slow_down_layer_time": [
"5"
],
"slow_down_min_speed": [
"10"
],
"dont_slow_down_outer_wall": [
"0"
],
"overhang_fan_speed": [
"100"
],
"overhang_fan_threshold": [
"50%"
],
"temperature_vitrification": [
"60"
],
"additional_cooling_fan_speed": [
"75%"
],
"activate_air_filtration": [
"1"
],
"during_print_exhaust_fan_speed": [
"80%"
],
"complete_print_exhaust_fan_speed": [
"80%"
],
"cool_plate_temp": [
"60"
],
"eng_plate_temp": [
"60"
],
"textured_plate_temp": [
"60"
],
"cool_plate_temp_initial_layer": [
"55"
],
"eng_plate_temp_initial_layer": [
"55"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"filament_start_gcode": [
"; filament start gcode\n"
]
}
@@ -1,30 +1,27 @@
{
"type": "filament",
"filament_id": "OFesA6rF",
"setting_id": "Se2yKerHRStYtWf5",
"name": "Generic PLA Silk @Sovol Zero",
"inherits": "Generic PLA Silk @System",
"renamed_from": "Sovol Zero PLA Silk",
"from": "system",
"setting_id": "Se2yKerHRStYtWf5",
"instantiation": "true",
"inherits": "fdm_filament_pla",
"filament_multitool_ramming_flow": [
"20"
],
"filament_retraction_length": [
"nil"
],
"filament_flow_ratio": [
"0.98"
],
"filament_max_volumetric_speed": [
"15"
],
"enable_pressure_advance": [
"1"
],
"pressure_advance": [
"0.029"
],
"enable_pressure_advance": "1",
"pressure_advance": "0.029",
"compatible_printers": [
"Sovol Zero 0.2 nozzle",
"Sovol Zero 0.4 nozzle",
"Sovol Zero 0.6 nozzle",
"Sovol Zero 0.8 nozzle",
"Sovol Zero 1.0 nozzle"
"Sovol Zero 0.4 nozzle"
],
"nozzle_temperature_initial_layer": [
"245"
@@ -62,9 +59,7 @@
"slow_down_min_speed": [
"10"
],
"dont_slow_down_outer_wall": [
"0"
],
"dont_slow_down_outer_wall": "0",
"overhang_fan_speed": [
"100"
],
@@ -74,43 +69,8 @@
"temperature_vitrification": [
"60"
],
"additional_cooling_fan_speed": [
"75%"
],
"activate_air_filtration": [
"1"
],
"during_print_exhaust_fan_speed": [
"80%"
],
"complete_print_exhaust_fan_speed": [
"80%"
],
"filament_multitool_ramming_flow": [
"20"
],
"filament_retraction_length": [
"nil"
],
"cool_plate_temp": [
"60"
],
"eng_plate_temp": [
"60"
],
"textured_plate_temp": [
"60"
],
"cool_plate_temp_initial_layer": [
"55"
],
"eng_plate_temp_initial_layer": [
"55"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"filament_start_gcode": [
"; filament start gcode\n"
]
"additional_cooling_fan_speed": "75%",
"activate_air_filtration": "1",
"during_print_exhaust_fan_speed": "80%",
"complete_print_exhaust_fan_speed": "80%"
}
@@ -1,12 +1,11 @@
{
"type": "filament",
"filament_id": "OFgbpcy9",
"setting_id": "MlY6WQ41FE8zDPSV",
"name": "Generic TPU @Sovol Zero",
"inherits": "Generic TPU @System",
"renamed_from": "Sovol Zero TPU",
"from": "system",
"setting_id": "MlY6WQ41FE8zDPSV",
"instantiation": "true",
"inherits": "fdm_filament_tpu",
"filament_flow_ratio": [
"0.98"
],
@@ -61,55 +60,11 @@
"filament_z_hop": [
"0.4"
],
"additional_cooling_fan_speed": [
"50"
],
"activate_air_filtration": [
"1"
],
"during_print_exhaust_fan_speed": [
"100"
],
"complete_print_exhaust_fan_speed": [
"50"
],
"additional_cooling_fan_speed": "50",
"activate_air_filtration": "1",
"during_print_exhaust_fan_speed": "100",
"complete_print_exhaust_fan_speed": "50",
"compatible_printers": [
"Sovol Zero 0.2 nozzle",
"Sovol Zero 0.4 nozzle",
"Sovol Zero 0.6 nozzle",
"Sovol Zero 0.8 nozzle",
"Sovol Zero 1.0 nozzle",
"Sovol Zero 0.2 Hardened Steel nozzle",
"Sovol Zero 0.4 Hardened Steel nozzle",
"Sovol Zero 0.6 Hardened Steel nozzle",
"Sovol Zero 0.8 Hardened Steel nozzle",
"Sovol Zero 1.0 Hardened Steel nozzle"
],
"cool_plate_temp": [
"60"
],
"eng_plate_temp": [
"60"
],
"textured_plate_temp": [
"60"
],
"cool_plate_temp_initial_layer": [
"55"
],
"eng_plate_temp_initial_layer": [
"55"
],
"textured_plate_temp_initial_layer": [
"55"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"filament_retraction_length": [
"nil"
],
"filament_start_gcode": [
"; filament start gcode\n"
"Sovol Zero 0.4 nozzle"
]
}
@@ -0,0 +1,77 @@
{
"type": "filament",
"name": "Sovol Zero PETG HS Nozzle",
"inherits": "Generic PETG @System",
"from": "system",
"setting_id": "AfxHmpdOkMDJa2fk",
"filament_id": "OFymnal9",
"instantiation": "true",
"filament_flow_ratio": [
"0.98"
],
"enable_pressure_advance": "1",
"pressure_advance": "0.048",
"filament_max_volumetric_speed": [
"15"
],
"nozzle_temperature_initial_layer": [
"265"
],
"nozzle_temperature": [
"250"
],
"nozzle_temperature_range_low": [
"230"
],
"nozzle_temperature_range_high": [
"280"
],
"hot_plate_temp": [
"85"
],
"hot_plate_temp_initial_layer": [
"85"
],
"fan_min_speed": [
"10"
],
"fan_max_speed": [
"40"
],
"fan_cooling_layer_time": [
"50"
],
"full_fan_speed_layer": [
"3"
],
"slow_down_layer_time": [
"10"
],
"slow_down_min_speed": [
"10"
],
"overhang_fan_speed": [
"70"
],
"overhang_fan_threshold": [
"10%"
],
"temperature_vitrification": [
"60"
],
"close_fan_the_first_x_layers": [
"1"
],
"filament_retraction_length": [
"0.5"
],
"filament_z_hop": [
"0.4"
],
"activate_air_filtration": "1",
"during_print_exhaust_fan_speed": "50",
"complete_print_exhaust_fan_speed": "50",
"compatible_printers": [
"Sovol Zero 0.4 nozzle"
]
}
@@ -0,0 +1,70 @@
{
"type": "filament",
"name": "Sovol Zero PLA Basic HS Nozzle",
"inherits": "Generic PLA @System",
"from": "system",
"setting_id": "i9wDnSEIrOBPbOZl",
"filament_id": "OFzB4uOs",
"instantiation": "true",
"filament_flow_ratio": [
"1.0348"
],
"filament_max_volumetric_speed": [
"21"
],
"enable_pressure_advance": "1",
"pressure_advance": "0.03",
"compatible_printers": [
"Sovol Zero 0.4 nozzle"
],
"nozzle_temperature_initial_layer": [
"245"
],
"nozzle_temperature": [
"230"
],
"nozzle_temperature_range_low": [
"190"
],
"nozzle_temperature_range_high": [
"250"
],
"hot_plate_temp": [
"65"
],
"hot_plate_temp_initial_layer": [
"65"
],
"fan_min_speed": [
"70"
],
"fan_max_speed": [
"100"
],
"fan_cooling_layer_time": [
"80"
],
"full_fan_speed_layer": [
"3"
],
"slow_down_layer_time": [
"5"
],
"slow_down_min_speed": [
"10"
],
"dont_slow_down_outer_wall": "0",
"overhang_fan_speed": [
"100"
],
"overhang_fan_threshold": [
"50%"
],
"temperature_vitrification": [
"60"
],
"additional_cooling_fan_speed": "75%",
"activate_air_filtration": "1",
"during_print_exhaust_fan_speed": "80%",
"complete_print_exhaust_fan_speed": "80%"
}
@@ -0,0 +1,70 @@
{
"type": "filament",
"name": "Sovol Zero PLA Silk HS Nozzle",
"inherits": "Generic PLA @System",
"from": "system",
"setting_id": "XxEJBNFLRltR2Xwn",
"filament_id": "OFAO9A7J",
"instantiation": "true",
"filament_flow_ratio": [
"0.98"
],
"filament_max_volumetric_speed": [
"15"
],
"enable_pressure_advance": "1",
"pressure_advance": "0.027",
"compatible_printers": [
"Sovol Zero 0.4 nozzle"
],
"nozzle_temperature_initial_layer": [
"245"
],
"nozzle_temperature": [
"230"
],
"nozzle_temperature_range_low": [
"190"
],
"nozzle_temperature_range_high": [
"250"
],
"hot_plate_temp": [
"65"
],
"hot_plate_temp_initial_layer": [
"65"
],
"fan_min_speed": [
"70"
],
"fan_max_speed": [
"100"
],
"fan_cooling_layer_time": [
"80"
],
"full_fan_speed_layer": [
"3"
],
"slow_down_layer_time": [
"5"
],
"slow_down_min_speed": [
"10"
],
"dont_slow_down_outer_wall": "0",
"overhang_fan_speed": [
"100"
],
"overhang_fan_threshold": [
"50%"
],
"temperature_vitrification": [
"60"
],
"additional_cooling_fan_speed": "75%",
"activate_air_filtration": "1",
"during_print_exhaust_fan_speed": "80%",
"complete_print_exhaust_fan_speed": "80%"
}
@@ -1,19 +0,0 @@
{
"type": "machine",
"name": "Sovol Zero 0.2 Hardened Steel nozzle",
"inherits": "Sovol Zero 0.2 nozzle",
"from": "system",
"setting_id": "OkvEInEyzUUJzw9K",
"instantiation": "true",
"printer_model": "Sovol Zero",
"printer_variant": "0.2HS",
"nozzle_diameter": [
"0.2"
],
"default_filament_profile": [
"Generic PLA @Sovol Zero Hardened Steel nozzle"
],
"nozzle_type": [
"hardened_steel"
]
}
File diff suppressed because one or more lines are too long
@@ -1,19 +0,0 @@
{
"type": "machine",
"name": "Sovol Zero 0.4 Hardened Steel nozzle",
"inherits": "Sovol Zero 0.4 nozzle",
"from": "system",
"setting_id": "RqwHKS8MYRdoeJPi",
"instantiation": "true",
"printer_model": "Sovol Zero",
"printer_variant": "0.4HS",
"nozzle_diameter": [
"0.4"
],
"default_filament_profile": [
"Generic PLA @Sovol Zero Hardened Steel nozzle"
],
"nozzle_type": [
"hardened_steel"
]
}
File diff suppressed because one or more lines are too long
@@ -1,19 +0,0 @@
{
"type": "machine",
"name": "Sovol Zero 0.6 Hardened Steel nozzle",
"inherits": "Sovol Zero 0.6 nozzle",
"from": "system",
"setting_id": "s3N3FJkWrzOylFm8",
"instantiation": "true",
"printer_model": "Sovol Zero",
"printer_variant": "0.6HS",
"nozzle_diameter": [
"0.6"
],
"default_filament_profile": [
"Generic PLA @Sovol Zero Hardened Steel nozzle"
],
"nozzle_type": [
"hardened_steel"
]
}
File diff suppressed because one or more lines are too long
@@ -1,19 +0,0 @@
{
"type": "machine",
"name": "Sovol Zero 0.8 Hardened Steel nozzle",
"inherits": "Sovol Zero 0.8 nozzle",
"from": "system",
"setting_id": "houacf8sQ3bLozqD",
"instantiation": "true",
"printer_model": "Sovol Zero",
"printer_variant": "0.8HS",
"nozzle_diameter": [
"0.8"
],
"default_filament_profile": [
"Generic PLA @Sovol Zero Hardened Steel nozzle"
],
"nozzle_type": [
"hardened_steel"
]
}
File diff suppressed because one or more lines are too long
@@ -1,19 +0,0 @@
{
"type": "machine",
"name": "Sovol Zero 1.0 Hardened Steel nozzle",
"inherits": "Sovol Zero 1.0 nozzle",
"from": "system",
"setting_id": "sqlEiL0in8LSjmmn",
"instantiation": "true",
"printer_model": "Sovol Zero",
"printer_variant": "1.0HS",
"nozzle_diameter": [
"1.0"
],
"default_filament_profile": [
"Generic PLA @Sovol Zero Hardened Steel nozzle"
],
"nozzle_type": [
"hardened_steel"
]
}
File diff suppressed because one or more lines are too long
@@ -2,11 +2,11 @@
"type": "machine_model",
"name": "Sovol Zero",
"model_id": "Sovol-Zero",
"nozzle_diameter": "0.2;0.4;0.6;0.8;1.0;0.2HS;0.4HS;0.6HS;0.8HS;1.0HS",
"nozzle_diameter": "0.4",
"machine_tech": "FFF",
"family": "Sovol",
"bed_model": "sovol_zero_buildplate_model.stl",
"bed_texture": "sovol_zero_buildplate_texture.svg",
"hotend_model": "",
"default_materials": "Generic PLA @Sovol Zero;Generic PLA SPEEDBENCHY @Sovol Zero;Generic PLA @Sovol Zero Hardened Steel nozzle;Generic PLA Silk @Sovol Zero;Generic PLA Silk @Sovol Zero Hardened Steel nozzle;Generic ABS @Sovol Zero;Generic PETG @Sovol Zero;Generic PETG @Sovol Zero Hardened Steel nozzle;Generic TPU @Sovol Zero;Generic PC @Sovol Zero"
"default_materials": "Generic PLA @Sovol Zero;Sovol Zero PLA Basic HS Nozzle;Generic PLA Silk @Sovol Zero;Sovol Zero PLA Silk HS Nozzle;Generic ABS @Sovol Zero;Generic PETG @Sovol Zero;Sovol Zero PETG HS Nozzle;Generic TPU @Sovol Zero;Generic PC @Sovol Zero"
}
@@ -1,36 +0,0 @@
{
"type": "process",
"name": "0.06mm Quality @Sovol Zero 0.2 nozzle",
"inherits": "fdm_process_zero",
"from": "system",
"setting_id": "fWP7jaL7sJmmZ6QN",
"instantiation": "true",
"layer_height": "0.06",
"bottom_shell_layers": "8",
"bottom_shell_thickness": "0.8",
"bridge_speed": "30",
"outer_wall_acceleration": "10000",
"top_surface_acceleration": "5000",
"outer_wall_line_width": "0.21",
"line_width": "0.21",
"sparse_infill_density": "15%",
"inner_wall_acceleration": "12000",
"initial_layer_print_height": "0.06",
"initial_layer_line_width": "0.3",
"infill_wall_overlap": "18",
"inner_wall_line_width": "0.22",
"wall_loops": "3",
"internal_solid_infill_line_width": "0.21",
"sparse_infill_line_width": "0.21",
"support_top_z_distance": "0.10",
"support_line_width": "0.21",
"tree_support_tip_diameter": "0.21",
"support_speed": "100",
"top_surface_line_width": "0.21",
"top_shell_layers": "8",
"top_shell_thickness": "1",
"compatible_printers": [
"Sovol Zero 0.2 nozzle",
"Sovol Zero 0.2 Hardened Steel nozzle"
]
}
@@ -1,36 +0,0 @@
{
"type": "process",
"name": "0.10mm Standard @Sovol Zero 0.2 nozzle",
"inherits": "fdm_process_zero",
"from": "system",
"setting_id": "Gql3487jsaTXyuYZ",
"instantiation": "true",
"layer_height": "0.10",
"bottom_shell_layers": "4",
"bottom_shell_thickness": "0.8",
"bridge_speed": "50",
"outer_wall_acceleration": "10000",
"top_surface_acceleration": "5000",
"outer_wall_line_width": "0.22",
"line_width": "0.22",
"sparse_infill_density": "15%",
"inner_wall_acceleration": "12000",
"initial_layer_print_height": "0.12",
"initial_layer_line_width": "0.3",
"infill_wall_overlap": "20",
"inner_wall_line_width": "0.22",
"wall_loops": "2",
"internal_solid_infill_line_width": "0.22",
"sparse_infill_line_width": "0.22",
"support_top_z_distance": "0.20",
"support_line_width": "0.22",
"tree_support_tip_diameter": "0.22",
"support_speed": "100",
"top_surface_line_width": "0.22",
"top_shell_layers": "4",
"top_shell_thickness": "1",
"compatible_printers": [
"Sovol Zero 0.2 nozzle",
"Sovol Zero 0.2 Hardened Steel nozzle"
]
}
@@ -1,35 +0,0 @@
{
"type": "process",
"setting_id": "CaEopiv2Wg6pQJjH",
"name": "0.12mm Quality @Sovol Zero 0.4 nozzle",
"from": "system",
"inherits": "fdm_process_zero",
"instantiation": "true",
"layer_height": "0.12",
"bottom_shell_layers": "8",
"bottom_shell_thickness": "0.8",
"bridge_speed": "30",
"outer_wall_acceleration": "10000",
"top_surface_acceleration": "5000",
"outer_wall_line_width": "0.42",
"line_width": "0.42",
"sparse_infill_density": "15%",
"inner_wall_acceleration": "12000",
"initial_layer_print_height": "0.12",
"initial_layer_line_width": "0.6",
"sparse_infill_line_width": "0.42",
"infill_wall_overlap": "18",
"inner_wall_line_width": "0.44",
"wall_loops": "3",
"support_top_z_distance": "0.10",
"support_line_width": "0.42",
"tree_support_tip_diameter": "0.42",
"support_speed": "100",
"top_surface_line_width": "0.42",
"internal_solid_infill_line_width": "0.42",
"top_shell_layers": "8",
"compatible_printers": [
"Sovol Zero 0.4 nozzle",
"Sovol Zero 0.4 Hardened Steel nozzle"
]
}
@@ -1,36 +0,0 @@
{
"type": "process",
"name": "0.14mm Fast @Sovol Zero 0.2 nozzle",
"inherits": "fdm_process_zero",
"from": "system",
"setting_id": "I9yoyCcGGTRrDoKu",
"instantiation": "true",
"layer_height": "0.14",
"bottom_shell_layers": "3",
"bottom_shell_thickness": "0",
"bridge_speed": "60",
"outer_wall_acceleration": "22000",
"top_surface_acceleration": "22000",
"outer_wall_line_width": "0.24",
"line_width": "0.24",
"sparse_infill_density": "10%",
"inner_wall_acceleration": "28000",
"initial_layer_print_height": "0.14",
"initial_layer_line_width": "0.3",
"infill_wall_overlap": "20",
"inner_wall_line_width": "0.24",
"wall_loops": "2",
"internal_solid_infill_line_width": "0.24",
"sparse_infill_line_width": "0.24",
"support_top_z_distance": "0.30",
"support_line_width": "0.24",
"tree_support_tip_diameter": "0.24",
"support_speed": "120",
"top_surface_line_width": "0.24",
"top_shell_layers": "4",
"top_shell_thickness": "1",
"compatible_printers": [
"Sovol Zero 0.2 nozzle",
"Sovol Zero 0.2 Hardened Steel nozzle"
]
}
@@ -1,34 +0,0 @@
{
"type": "process",
"setting_id": "IfDpa3vM99D4ytny",
"name": "0.15mm Quality @Sovol Zero 0.6 nozzle",
"from": "system",
"inherits": "fdm_process_zero",
"instantiation": "true",
"layer_height": "0.15",
"bottom_shell_layers": "5",
"bottom_shell_thickness": "0.8",
"bridge_speed": "30",
"outer_wall_acceleration": "10000",
"top_surface_acceleration": "5000",
"outer_wall_line_width": "0.63",
"line_width": "0.63",
"sparse_infill_density": "15%",
"inner_wall_acceleration": "12000",
"initial_layer_line_width": "0.9",
"sparse_infill_line_width": "0.63",
"infill_wall_overlap": "18",
"inner_wall_line_width": "0.66",
"wall_loops": "3",
"support_top_z_distance": "0.15",
"support_line_width": "0.63",
"tree_support_tip_diameter": "0.63",
"support_speed": "100",
"top_surface_line_width": "0.63",
"top_shell_layers": "5",
"internal_solid_infill_line_width": "0.63",
"compatible_printers": [
"Sovol Zero 0.6 nozzle",
"Sovol Zero 0.6 Hardened Steel nozzle"
]
}
@@ -1,42 +0,0 @@
{
"type": "process",
"name": "0.20mm Quality @Sovol Zero 0.8 nozzle",
"inherits": "fdm_process_zero",
"from": "system",
"setting_id": "MSxikpQZNYdoBynZ",
"instantiation": "true",
"layer_height": "0.20",
"bottom_shell_layers": "4",
"bottom_shell_thickness": "0.8",
"bridge_speed": "30",
"outer_wall_acceleration": "10000",
"top_surface_acceleration": "5000",
"outer_wall_line_width": "0.84",
"line_width": "0.84",
"sparse_infill_density": "15%",
"inner_wall_acceleration": "12000",
"initial_layer_print_height": "0.36",
"initial_layer_line_width": "1.2",
"sparse_infill_line_width": "0.84",
"infill_wall_overlap": "18",
"inner_wall_line_width": "0.88",
"wall_loops": "3",
"support_top_z_distance": "0.20",
"support_line_width": "0.84",
"tree_support_tip_diameter": "0.84",
"support_speed": "100",
"top_surface_line_width": "0.84",
"top_shell_layers": "4",
"outer_wall_speed": "350",
"inner_wall_speed": "400",
"small_perimeter_speed": "50%",
"internal_solid_infill_speed": "200",
"internal_solid_infill_line_width": "0.84",
"top_surface_speed": "200",
"gap_infill_speed": "200",
"sparse_infill_speed": "500",
"compatible_printers": [
"Sovol Zero 0.8 nozzle",
"Sovol Zero 0.8 Hardened Steel nozzle"
]
}
@@ -1,36 +1,141 @@
{
"type": "process",
"setting_id": "ShJTVnJ492No1j2j",
"name": "0.20mm Standard @Sovol Zero 0.4 nozzle",
"inherits": "fdm_process_common",
"from": "system",
"inherits": "fdm_process_zero",
"setting_id": "ShJTVnJ492No1j2j",
"instantiation": "true",
"reduce_crossing_wall": "1",
"max_travel_detour_distance": "100%",
"layer_height": "0.20",
"bottom_shell_layers": "4",
"bottom_shell_thickness": "0.8",
"bottom_surface_pattern": "monotonic",
"bottom_shell_layers": "3",
"bottom_shell_thickness": "0",
"bridge_flow": "1.2",
"internal_bridge_flow": "1.2",
"bridge_speed": "50",
"internal_bridge_speed": "200",
"brim_type": "auto_brim",
"brim_width": "5",
"brim_object_gap": "0",
"compatible_printers_condition": "",
"print_sequence": "by layer",
"default_acceleration": "40000",
"outer_wall_acceleration": "10000",
"top_surface_acceleration": "5000",
"outer_wall_line_width": "0.44",
"line_width": "0.44",
"sparse_infill_density": "15%",
"bridge_no_support": "0",
"draft_shield": "disabled",
"elefant_foot_compensation": "0.1",
"enable_arc_fitting": "0",
"exclude_object": "1",
"outer_wall_line_width": "0.4",
"wall_infill_order": "inner wall/outer wall/infill",
"line_width": "0.4",
"infill_direction": "45",
"sparse_infill_density": "10%",
"sparse_infill_pattern": "grid",
"internal_solid_infill_acceleration": "50%",
"initial_layer_acceleration": "1000",
"initial_solid_infill_acceleration": "3000",
"travel_acceleration": "40000",
"inner_wall_acceleration": "12000",
"initial_layer_print_height": "0.24",
"initial_layer_line_width": "0.6",
"sparse_infill_line_width": "0.44",
"infill_wall_overlap": "20",
"ironing_speed": "100",
"inner_wall_line_width": "0.44",
"outer_wall_jerk": "5",
"inner_wall_jerk": "5",
"infill_jerk": "5",
"top_surface_jerk": "5",
"initial_layer_jerk": "5",
"travel_jerk": "5",
"initial_layer_line_width": "0.42",
"initial_layer_print_height": "0.25",
"infill_combination": "0",
"sparse_infill_line_width": "0.45",
"infill_wall_overlap": "15%",
"interface_shells": "0",
"ironing_flow": "15%",
"ironing_spacing": "0.25",
"ironing_speed": "15",
"ironing_type": "no ironing",
"reduce_infill_retraction": "1",
"filename_format": "{printer_model}_{input_filename_base}_{filament_type[0]}_{layer_height}_{print_time}.gcode",
"detect_overhang_wall": "1",
"overhang_1_4_speed": "0",
"overhang_2_4_speed": "50",
"overhang_3_4_speed": "30",
"overhang_4_4_speed": "20",
"inner_wall_line_width": "0.4",
"wall_loops": "2",
"support_top_z_distance": "0.20",
"support_line_width": "0.44",
"tree_support_tip_diameter": "0.44",
"support_speed": "60",
"top_surface_line_width": "0.44",
"print_settings_id": "",
"raft_layers": "0",
"seam_position": "aligned",
"skirt_distance": "0.8",
"skirt_height": "1",
"skirt_loops": "1",
"minimum_sparse_infill_area": "15",
"internal_solid_infill_line_width": "0.45",
"spiral_mode": "0",
"standby_temperature_delta": "-5",
"enable_support": "0",
"resolution": "0.012",
"support_type": "tree(auto)",
"support_style": "default",
"support_on_build_plate_only": "0",
"support_top_z_distance": "0.235",
"support_bottom_z_distance": "0.235",
"support_filament": "0",
"support_line_width": "0.45",
"support_interface_loop_pattern": "0",
"support_interface_filament": "0",
"support_interface_top_layers": "5",
"support_interface_bottom_layers": "-1",
"support_interface_spacing": "0.2",
"support_bottom_interface_spacing": "0.2",
"support_interface_speed": "100%",
"support_interface_pattern": "grid",
"support_base_pattern": "rectilinear",
"support_base_pattern_spacing": "3.5",
"support_speed": "100",
"support_threshold_angle": "20",
"support_object_xy_distance": "0.35",
"tree_support_branch_angle": "40",
"tree_support_wall_count": "0",
"detect_thin_wall": "1",
"top_surface_pattern": "monotonic",
"top_surface_line_width": "0.38",
"top_shell_layers": "4",
"internal_solid_infill_line_width": "0.44",
"top_shell_thickness": "1",
"initial_layer_speed": "55",
"initial_layer_infill_speed": "105",
"initial_layer_travel_speed": "60%",
"outer_wall_speed": "350",
"inner_wall_speed": "400",
"small_perimeter_speed": "50%",
"internal_solid_infill_speed": "200",
"top_surface_speed": "200",
"gap_infill_speed": "200",
"sparse_infill_speed": "500",
"accel_to_decel_enable": "1",
"accel_to_decel_factor": "25%",
"travel_speed": "1000",
"enable_prime_tower": "1",
"wipe_tower_no_sparse_layers": "0",
"prime_tower_width": "60",
"xy_hole_compensation": "0",
"xy_contour_compensation": "0",
"bridge_acceleration": "50%",
"seam_gap": "10%",
"precise_outer_wall": "1",
"wall_generator": "classic",
"gcode_label_objects": "1",
"slow_down_layers": "3",
"top_solid_infill_flow_ratio": "0.9",
"only_one_wall_top": "1",
"wall_loop_direction": "clockwise",
"top_bottom_infill_wall_overlap": "25%",
"filter_out_gap_fill": "0",
"detect_narrow_internal_solid_infill": "1",
"thick_bridges": "1",
"bridge_angle": "0",
"compatible_printers": [
"Sovol Zero 0.4 nozzle",
"Sovol Zero 0.4 Hardened Steel nozzle"
"Sovol Zero 0.4 nozzle"
]
}
@@ -1,79 +0,0 @@
{
"type": "process",
"name": "0.25mm Quality @Sovol Zero 1.0 nozzle",
"inherits": "fdm_process_zero",
"from": "system",
"setting_id": "JUmnFOoEMJrbWCN9",
"instantiation": "true",
"layer_height": "0.25",
"bottom_shell_layers": "4",
"bottom_shell_thickness": "0.8",
"bridge_speed": "30",
"internal_bridge_speed": "200",
"default_acceleration": "40000",
"outer_wall_acceleration": "10000",
"top_surface_acceleration": "5000",
"outer_wall_line_width": "1.05",
"line_width": "1.05",
"sparse_infill_density": "15%",
"inner_wall_acceleration": "12000",
"initial_layer_print_height": "0.45",
"initial_layer_line_width": "1.5",
"infill_combination": "0",
"sparse_infill_line_width": "1.05",
"infill_wall_overlap": "18",
"interface_shells": "0",
"ironing_flow": "15%",
"ironing_spacing": "0.25",
"ironing_speed": "15",
"ironing_type": "no ironing",
"filename_format": "{input_filename_base}_{nozzle_diameter[0]}n_{filament_type[0]}_{layer_height}_{print_time}.gcode",
"detect_overhang_wall": "1",
"overhang_1_4_speed": "0",
"overhang_2_4_speed": "50",
"overhang_3_4_speed": "30",
"overhang_4_4_speed": "20",
"inner_wall_line_width": "1.1",
"wall_loops": "3",
"print_settings_id": "",
"raft_layers": "0",
"seam_position": "aligned",
"skirt_distance": "0.8",
"skirt_height": "1",
"skirt_loops": "1",
"minimum_sparse_infill_area": "15",
"internal_solid_infill_line_width": "1.05",
"spiral_mode": "0",
"standby_temperature_delta": "-5",
"enable_support": "0",
"resolution": "0.012",
"support_type": "tree(auto)",
"support_style": "snug",
"support_on_build_plate_only": "0",
"support_top_z_distance": "0.25",
"support_bottom_z_distance": "0.235",
"support_filament": "0",
"support_line_width": "1.05",
"tree_support_tip_diameter": "1.05",
"support_interface_loop_pattern": "0",
"support_interface_filament": "0",
"support_interface_top_layers": "5",
"support_interface_bottom_layers": "-1",
"support_interface_spacing": "0.2",
"support_bottom_interface_spacing": "0.2",
"support_interface_speed": "100%",
"support_interface_pattern": "grid",
"support_base_pattern": "rectilinear",
"support_base_pattern_spacing": "3.5",
"support_speed": "100",
"support_threshold_angle": "50",
"support_object_xy_distance": "0.35",
"tree_support_branch_angle": "40",
"top_surface_line_width": "1.05",
"top_shell_layers": "4",
"top_shell_thickness": "1",
"compatible_printers": [
"Sovol Zero 1.0 nozzle",
"Sovol Zero 1.0 Hardened Steel nozzle"
]
}
@@ -1,85 +0,0 @@
{
"type": "process",
"setting_id": "oFrWcSxmad1b6sD4",
"name": "0.25mm SPEEDBENCHY @Sovol Zero 0.4 nozzle",
"from": "system",
"inherits": "fdm_process_zero",
"instantiation": "true",
"layer_height": "0.25",
"initial_layer_print_height": "0.25",
"line_width": "0.5",
"initial_layer_line_width": "0.5",
"outer_wall_line_width": "0.5",
"inner_wall_line_width": "0.5",
"top_surface_line_width": "0.55",
"internal_solid_infill_line_width": "0.55",
"sparse_infill_line_width": "0.55",
"support_line_width": "0.5",
"tree_support_tip_diameter": "0.5",
"wall_loops": "2",
"top_shell_layers": "3",
"bottom_shell_layers": "3",
"bottom_shell_thickness": "0",
"sparse_infill_density": "10%",
"sparse_infill_pattern": "grid",
"bottom_solid_infill_flow_ratio": "1.2",
"top_solid_infill_flow_ratio": "1.4",
"bridge_flow": "1",
"internal_bridge_flow": "1",
"bridge_speed": "250",
"internal_bridge_speed": "250",
"bridge_acceleration": "100%",
"thick_bridges": "0",
"thick_internal_bridges": "0",
"brim_type": "outer_only",
"brim_width": "1",
"brim_object_gap": "0",
"filter_out_gap_fill": "13",
"gap_fill_target": "nowhere",
"min_width_top_surface": "200%",
"minimum_sparse_infill_area": "0",
"infill_direction": "0",
"solid_infill_direction": "0",
"infill_wall_overlap": "15%",
"reduce_crossing_wall": "0",
"skirt_loops": "0",
"only_one_wall_top": "1",
"slow_down_layers": "1",
"wall_direction": "cw",
"initial_layer_speed": "300",
"initial_layer_infill_speed": "300",
"initial_layer_travel_speed": "100%",
"outer_wall_speed": "350",
"inner_wall_speed": "400",
"small_perimeter_speed": "100%",
"internal_solid_infill_speed": "400",
"top_surface_speed": "300",
"gap_infill_speed": "350",
"sparse_infill_speed": "500",
"support_speed": "100",
"travel_speed": "1200",
"default_acceleration": "40000",
"initial_layer_acceleration": "20000",
"outer_wall_acceleration": "40000",
"inner_wall_acceleration": "40000",
"top_surface_acceleration": "20000",
"internal_solid_infill_acceleration": "100%",
"travel_acceleration": "40000",
"accel_to_decel_factor": "50%",
"outer_wall_jerk": "20",
"inner_wall_jerk": "20",
"infill_jerk": "20",
"top_surface_jerk": "20",
"initial_layer_jerk": "20",
"travel_jerk": "20",
"overhang_1_4_speed": "160",
"overhang_2_4_speed": "100",
"overhang_3_4_speed": "60",
"overhang_4_4_speed": "40",
"support_top_z_distance": "0.235",
"support_bottom_z_distance": "0.235",
"compatible_printers": [
"Sovol Zero 0.4 nozzle",
"Sovol Zero 0.4 Hardened Steel nozzle"
]
}
@@ -1,39 +0,0 @@
{
"type": "process",
"name": "0.28mm Fast @Sovol Zero 0.4 nozzle",
"inherits": "fdm_process_zero",
"from": "system",
"setting_id": "1VoML2LGDk4TJgLI",
"instantiation": "true",
"layer_height": "0.28",
"bottom_shell_layers": "3",
"bottom_shell_thickness": "0",
"bridge_speed": "60",
"outer_wall_acceleration": "22000",
"top_surface_acceleration": "22000",
"outer_wall_line_width": "0.48",
"line_width": "0.48",
"sparse_infill_density": "10%",
"inner_wall_acceleration": "28000",
"initial_layer_print_height": "0.28",
"initial_layer_line_width": "0.6",
"sparse_infill_line_width": "0.48",
"inner_wall_line_width": "0.48",
"internal_solid_infill_line_width": "0.48",
"support_top_z_distance": "0.30",
"support_line_width": "0.48",
"tree_support_tip_diameter": "0.48",
"support_speed": "120",
"top_surface_line_width": "0.48",
"outer_wall_speed": "350",
"inner_wall_speed": "400",
"small_perimeter_speed": "50%",
"internal_solid_infill_speed": "200",
"top_surface_speed": "200",
"gap_infill_speed": "200",
"sparse_infill_speed": "500",
"compatible_printers": [
"Sovol Zero 0.4 nozzle",
"Sovol Zero 0.4 Hardened Steel nozzle"
]
}
@@ -1,35 +0,0 @@
{
"type": "process",
"setting_id": "lTAs2USEP8D749K7",
"name": "0.30mm Standard @Sovol Zero 0.6 nozzle",
"from": "system",
"inherits": "fdm_process_zero",
"instantiation": "true",
"layer_height": "0.30",
"bottom_shell_layers": "4",
"bottom_shell_thickness": "0.8",
"bridge_speed": "50",
"outer_wall_acceleration": "10000",
"top_surface_acceleration": "5000",
"outer_wall_line_width": "0.66",
"line_width": "0.66",
"sparse_infill_density": "15%",
"inner_wall_acceleration": "12000",
"initial_layer_print_height": "0.36",
"initial_layer_line_width": "0.9",
"sparse_infill_line_width": "0.66",
"infill_wall_overlap": "20",
"inner_wall_line_width": "0.66",
"wall_loops": "2",
"support_top_z_distance": "0.30",
"support_line_width": "0.66",
"tree_support_tip_diameter": "0.66",
"support_speed": "100",
"top_surface_line_width": "0.66",
"top_shell_layers": "4",
"internal_solid_infill_line_width": "0.66",
"compatible_printers": [
"Sovol Zero 0.6 nozzle",
"Sovol Zero 0.6 Hardened Steel nozzle"
]
}
@@ -1,42 +0,0 @@
{
"type": "process",
"name": "0.40mm Standard @Sovol Zero 0.8 nozzle",
"inherits": "fdm_process_zero",
"from": "system",
"setting_id": "8x4CsuqroC9HOdAN",
"instantiation": "true",
"layer_height": "0.40",
"bottom_shell_layers": "4",
"bottom_shell_thickness": "0.8",
"bridge_speed": "50",
"outer_wall_acceleration": "10000",
"top_surface_acceleration": "5000",
"outer_wall_line_width": "0.88",
"line_width": "0.88",
"sparse_infill_density": "15%",
"inner_wall_acceleration": "12000",
"initial_layer_print_height": "0.48",
"initial_layer_line_width": "1.2",
"sparse_infill_line_width": "0.88",
"infill_wall_overlap": "20",
"inner_wall_line_width": "0.88",
"wall_loops": "2",
"support_top_z_distance": "0.40",
"support_line_width": "0.88",
"tree_support_tip_diameter": "0.88",
"support_speed": "100",
"top_surface_line_width": "0.88",
"top_shell_layers": "4",
"outer_wall_speed": "350",
"inner_wall_speed": "400",
"small_perimeter_speed": "50%",
"internal_solid_infill_speed": "200",
"top_surface_speed": "200",
"gap_infill_speed": "200",
"sparse_infill_speed": "500",
"internal_solid_infill_line_width": "0.88",
"compatible_printers": [
"Sovol Zero 0.8 nozzle",
"Sovol Zero 0.8 Hardened Steel nozzle"
]
}
@@ -1,39 +0,0 @@
{
"type": "process",
"name": "0.42mm Fast @Sovol Zero 0.6 nozzle",
"inherits": "fdm_process_zero",
"from": "system",
"setting_id": "illqJAnGiA2pY0hw",
"instantiation": "true",
"layer_height": "0.42",
"bottom_shell_layers": "3",
"bottom_shell_thickness": "0",
"bridge_speed": "60",
"outer_wall_acceleration": "22000",
"top_surface_acceleration": "22000",
"outer_wall_line_width": "0.72",
"line_width": "0.72",
"sparse_infill_density": "10%",
"inner_wall_acceleration": "28000",
"initial_layer_print_height": "0.42",
"initial_layer_line_width": "0.9",
"sparse_infill_line_width": "0.72",
"inner_wall_line_width": "0.72",
"internal_solid_infill_line_width": "0.72",
"support_top_z_distance": "0.45",
"support_line_width": "0.72",
"tree_support_tip_diameter": "0.72",
"support_speed": "120",
"top_surface_line_width": "0.72",
"outer_wall_speed": "350",
"inner_wall_speed": "400",
"small_perimeter_speed": "50%",
"internal_solid_infill_speed": "200",
"top_surface_speed": "200",
"gap_infill_speed": "200",
"sparse_infill_speed": "500",
"compatible_printers": [
"Sovol Zero 0.6 nozzle",
"Sovol Zero 0.6 Hardened Steel nozzle"
]
}
@@ -1,87 +0,0 @@
{
"type": "process",
"name": "0.50mm Standard @Sovol Zero 1.0 nozzle",
"inherits": "fdm_process_zero",
"from": "system",
"setting_id": "E5K55O4RkMyYCAlt",
"instantiation": "true",
"layer_height": "0.50",
"bottom_shell_layers": "4",
"bottom_shell_thickness": "0.8",
"bridge_speed": "45",
"internal_bridge_speed": "200",
"default_acceleration": "22000",
"outer_wall_acceleration": "16000",
"top_surface_acceleration": "16000",
"outer_wall_line_width": "1.1",
"line_width": "1.1",
"sparse_infill_density": "15%",
"inner_wall_acceleration": "22000",
"initial_layer_print_height": "0.60",
"initial_layer_line_width": "1.5",
"infill_combination": "0",
"sparse_infill_line_width": "1.1",
"infill_wall_overlap": "20",
"interface_shells": "0",
"ironing_flow": "15%",
"ironing_spacing": "0.25",
"ironing_speed": "15",
"ironing_type": "no ironing",
"filename_format": "{input_filename_base}_{nozzle_diameter[0]}n_{filament_type[0]}_{layer_height}_{print_time}.gcode",
"detect_overhang_wall": "1",
"overhang_1_4_speed": "0",
"overhang_2_4_speed": "50",
"overhang_3_4_speed": "30",
"overhang_4_4_speed": "20",
"inner_wall_line_width": "1.1",
"wall_loops": "2",
"print_settings_id": "",
"raft_layers": "0",
"seam_position": "aligned",
"skirt_distance": "0.8",
"skirt_height": "1",
"skirt_loops": "1",
"minimum_sparse_infill_area": "15",
"internal_solid_infill_line_width": "1.1",
"spiral_mode": "0",
"standby_temperature_delta": "-5",
"enable_support": "0",
"resolution": "0.012",
"support_type": "tree(auto)",
"support_style": "snug",
"support_on_build_plate_only": "0",
"support_top_z_distance": "0.50",
"support_bottom_z_distance": "0.235",
"support_filament": "0",
"support_line_width": "1.1",
"tree_support_tip_diameter": "1.1",
"support_interface_loop_pattern": "0",
"support_interface_filament": "0",
"support_interface_top_layers": "5",
"support_interface_bottom_layers": "-1",
"support_interface_spacing": "0.2",
"support_bottom_interface_spacing": "0.2",
"support_interface_speed": "100%",
"support_interface_pattern": "grid",
"support_base_pattern": "rectilinear",
"support_base_pattern_spacing": "3.5",
"support_speed": "60",
"support_threshold_angle": "50",
"support_object_xy_distance": "0.35",
"tree_support_branch_angle": "40",
"top_surface_line_width": "1.1",
"top_shell_layers": "4",
"top_shell_thickness": "1",
"outer_wall_speed": "30",
"inner_wall_speed": "45",
"small_perimeter_speed": "45",
"internal_solid_infill_speed": "45",
"top_surface_speed": "35",
"gap_infill_speed": "35",
"sparse_infill_speed": "70",
"travel_acceleration": "38000",
"compatible_printers": [
"Sovol Zero 1.0 nozzle",
"Sovol Zero 1.0 Hardened Steel nozzle"
]
}
@@ -1,40 +0,0 @@
{
"type": "process",
"name": "0.56mm Fast @Sovol Zero 0.8 nozzle",
"inherits": "fdm_process_zero",
"from": "system",
"setting_id": "g9PPRM4FLMwjMUfy",
"instantiation": "true",
"layer_height": "0.56",
"bottom_shell_layers": "3",
"bottom_shell_thickness": "0",
"bridge_speed": "60",
"default_acceleration": "28000",
"outer_wall_acceleration": "22000",
"top_surface_acceleration": "22000",
"outer_wall_line_width": "0.96",
"line_width": "0.96",
"sparse_infill_density": "10%",
"inner_wall_acceleration": "28000",
"initial_layer_print_height": "0.56",
"initial_layer_line_width": "1.2",
"sparse_infill_line_width": "0.96",
"inner_wall_line_width": "0.96",
"internal_solid_infill_line_width": "0.96",
"support_top_z_distance": "0.60",
"support_line_width": "0.96",
"tree_support_tip_diameter": "0.96",
"top_surface_line_width": "0.96",
"top_shell_layers": "4",
"outer_wall_speed": "35",
"inner_wall_speed": "55",
"small_perimeter_speed": "60",
"internal_solid_infill_speed": "55",
"top_surface_speed": "40",
"gap_infill_speed": "40",
"sparse_infill_speed": "80",
"compatible_printers": [
"Sovol Zero 0.8 nozzle",
"Sovol Zero 0.8 Hardened Steel nozzle"
]
}
@@ -1,33 +0,0 @@
{
"type": "process",
"name": "0.70mm Fast @Sovol Zero 1.0 nozzle",
"inherits": "fdm_process_zero",
"from": "system",
"setting_id": "fW5KJBVndgQE868q",
"instantiation": "true",
"layer_height": "0.70",
"bottom_shell_layers": "3",
"bottom_shell_thickness": "0",
"bridge_speed": "60",
"outer_wall_acceleration": "22000",
"top_surface_acceleration": "22000",
"outer_wall_line_width": "1.2",
"line_width": "1.2",
"sparse_infill_density": "10%",
"inner_wall_acceleration": "28000",
"initial_layer_print_height": "0.70",
"initial_layer_line_width": "1.5",
"sparse_infill_line_width": "1.2",
"inner_wall_line_width": "1.2",
"internal_solid_infill_line_width": "1.2",
"support_top_z_distance": "0.75",
"support_line_width": "1.2",
"tree_support_tip_diameter": "1.2",
"support_speed": "120",
"top_surface_line_width": "1.2",
"top_shell_layers": "3",
"compatible_printers": [
"Sovol Zero 1.0 nozzle",
"Sovol Zero 1.0 Hardened Steel nozzle"
]
}
@@ -1,73 +0,0 @@
{
"type": "process",
"name": "fdm_process_zero",
"inherits": "fdm_process_common",
"from": "system",
"instantiation": "false",
"reduce_crossing_wall": "1",
"max_travel_detour_distance": "10",
"bottom_surface_pattern": "monotonic",
"bridge_flow": "1.2",
"internal_bridge_flow": "1.2",
"brim_type": "auto_brim",
"brim_width": "5",
"brim_object_gap": "0",
"print_sequence": "by layer",
"bridge_no_support": "0",
"draft_shield": "disabled",
"elefant_foot_compensation": "0.1",
"enable_arc_fitting": "0",
"exclude_object": "1",
"wall_infill_order": "inner wall/outer wall/infill",
"infill_direction": "45",
"sparse_infill_pattern": "grid",
"internal_solid_infill_acceleration": "50%",
"initial_layer_acceleration": "1000",
"travel_acceleration": "40000",
"outer_wall_jerk": "5",
"inner_wall_jerk": "5",
"infill_jerk": "5",
"top_surface_jerk": "5",
"initial_layer_jerk": "5",
"travel_jerk": "5",
"tree_support_wall_count": "0",
"reduce_infill_retraction": "1",
"detect_thin_wall": "1",
"top_surface_pattern": "monotonic",
"initial_layer_speed": "55",
"initial_layer_infill_speed": "105",
"initial_layer_travel_speed": "60%",
"outer_wall_speed": "350",
"inner_wall_speed": "400",
"small_perimeter_speed": "50%",
"internal_solid_infill_speed": "200",
"top_surface_speed": "200",
"gap_infill_speed": "200",
"sparse_infill_speed": "500",
"accel_to_decel_enable": "1",
"accel_to_decel_factor": "25%",
"travel_speed": "1000",
"enable_prime_tower": "0",
"wipe_tower_no_sparse_layers": "0",
"prime_tower_width": "60",
"xy_hole_compensation": "0",
"xy_contour_compensation": "0",
"bridge_acceleration": "50%",
"seam_gap": "10%",
"precise_outer_wall": "1",
"wall_generator": "classic",
"gcode_label_objects": "1",
"slow_down_layers": "3",
"top_solid_infill_flow_ratio": "0.9",
"only_one_wall_top": "1",
"top_bottom_infill_wall_overlap": "25%",
"filter_out_gap_fill": "0",
"detect_narrow_internal_solid_infill": "1",
"thick_bridges": "1",
"bridge_angle": "0",
"initial_layer_line_width": "150%",
"default_acceleration": "40000",
"compatible_printers": [],
"internal_bridge_speed": "150",
"filename_format": "{input_filename_base}_{nozzle_diameter[0]}n_{filament_type[0]}_{layer_height}_{print_time}.gcode"
}
+1 -137
View File
@@ -1,60 +1,12 @@
{
"name": "Wanhao",
"version": "02.04.00.03",
"version": "02.04.00.02",
"force_update": "0",
"description": "Wanhao configurations",
"machine_model_list": [
{
"name": "Wanhao D12-300",
"sub_path": "machine/Wanhao D12-300.json"
},
{
"name": "Wanhao D9-300 MK1",
"sub_path": "machine/Wanhao D9-300 MK1.json"
},
{
"name": "Wanhao D9-300 MK1 BLTouch kit",
"sub_path": "machine/Wanhao D9-300 MK1 BLTouch kit.json"
},
{
"name": "Wanhao D9-300 MK2",
"sub_path": "machine/Wanhao D9-300 MK2.json"
},
{
"name": "Wanhao D9-300 MK3",
"sub_path": "machine/Wanhao D9-300 MK3.json"
},
{
"name": "Wanhao D9-400 MK1",
"sub_path": "machine/Wanhao D9-400 MK1.json"
},
{
"name": "Wanhao D9-400 MK1 BLTouch kit",
"sub_path": "machine/Wanhao D9-400 MK1 BLTouch kit.json"
},
{
"name": "Wanhao D9-400 MK2",
"sub_path": "machine/Wanhao D9-400 MK2.json"
},
{
"name": "Wanhao D9-400 MK3",
"sub_path": "machine/Wanhao D9-400 MK3.json"
},
{
"name": "Wanhao D9-500 MK1",
"sub_path": "machine/Wanhao D9-500 MK1.json"
},
{
"name": "Wanhao D9-500 MK1 BLTouch kit",
"sub_path": "machine/Wanhao D9-500 MK1 BLTouch kit.json"
},
{
"name": "Wanhao D9-500 MK2",
"sub_path": "machine/Wanhao D9-500 MK2.json"
},
{
"name": "Wanhao D9-500 MK3",
"sub_path": "machine/Wanhao D9-500 MK3.json"
}
],
"process_list": [
@@ -81,38 +33,6 @@
{
"name": "0.24mm Draft @Wanhao D12-300",
"sub_path": "process/0.24mm Draft @Wanhao D12-300.json"
},
{
"name": "fdm_process_wanhao_d9_common",
"sub_path": "process/fdm_process_wanhao_d9_common.json"
},
{
"name": "0.12mm Fine @Wanhao D9",
"sub_path": "process/0.12mm Fine @Wanhao D9.json"
},
{
"name": "0.20mm Standard @Wanhao D9",
"sub_path": "process/0.20mm Standard @Wanhao D9.json"
},
{
"name": "0.28mm Draft @Wanhao D9",
"sub_path": "process/0.28mm Draft @Wanhao D9.json"
},
{
"name": "fdm_process_wanhao_d9_mk1_common",
"sub_path": "process/fdm_process_wanhao_d9_mk1_common.json"
},
{
"name": "0.12mm Fine @Wanhao D9 MK1",
"sub_path": "process/0.12mm Fine @Wanhao D9 MK1.json"
},
{
"name": "0.20mm Standard @Wanhao D9 MK1",
"sub_path": "process/0.20mm Standard @Wanhao D9 MK1.json"
},
{
"name": "0.28mm Draft @Wanhao D9 MK1",
"sub_path": "process/0.28mm Draft @Wanhao D9 MK1.json"
}
],
"filament_list": [],
@@ -128,62 +48,6 @@
{
"name": "Wanhao D12-300 0.4 nozzle",
"sub_path": "machine/Wanhao D12-300 0.4 nozzle.json"
},
{
"name": "fdm_wanhao_d9_common",
"sub_path": "machine/fdm_wanhao_d9_common.json"
},
{
"name": "Wanhao D9-300 MK1 BLTouch kit 0.4 nozzle",
"sub_path": "machine/Wanhao D9-300 MK1 BLTouch kit 0.4 nozzle.json"
},
{
"name": "Wanhao D9-300 MK2 0.4 nozzle",
"sub_path": "machine/Wanhao D9-300 MK2 0.4 nozzle.json"
},
{
"name": "Wanhao D9-300 MK3 0.4 nozzle",
"sub_path": "machine/Wanhao D9-300 MK3 0.4 nozzle.json"
},
{
"name": "Wanhao D9-400 MK1 BLTouch kit 0.4 nozzle",
"sub_path": "machine/Wanhao D9-400 MK1 BLTouch kit 0.4 nozzle.json"
},
{
"name": "Wanhao D9-400 MK2 0.4 nozzle",
"sub_path": "machine/Wanhao D9-400 MK2 0.4 nozzle.json"
},
{
"name": "Wanhao D9-400 MK3 0.4 nozzle",
"sub_path": "machine/Wanhao D9-400 MK3 0.4 nozzle.json"
},
{
"name": "Wanhao D9-500 MK1 BLTouch kit 0.4 nozzle",
"sub_path": "machine/Wanhao D9-500 MK1 BLTouch kit 0.4 nozzle.json"
},
{
"name": "Wanhao D9-500 MK2 0.4 nozzle",
"sub_path": "machine/Wanhao D9-500 MK2 0.4 nozzle.json"
},
{
"name": "Wanhao D9-500 MK3 0.4 nozzle",
"sub_path": "machine/Wanhao D9-500 MK3 0.4 nozzle.json"
},
{
"name": "fdm_wanhao_d9_mk1_common",
"sub_path": "machine/fdm_wanhao_d9_mk1_common.json"
},
{
"name": "Wanhao D9-300 MK1 0.4 nozzle",
"sub_path": "machine/Wanhao D9-300 MK1 0.4 nozzle.json"
},
{
"name": "Wanhao D9-400 MK1 0.4 nozzle",
"sub_path": "machine/Wanhao D9-400 MK1 0.4 nozzle.json"
},
{
"name": "Wanhao D9-500 MK1 0.4 nozzle",
"sub_path": "machine/Wanhao D9-500 MK1 0.4 nozzle.json"
}
]
}
@@ -1,20 +0,0 @@
{
"type": "machine",
"name": "Wanhao D9-300 MK1 0.4 nozzle",
"inherits": "fdm_wanhao_d9_mk1_common",
"from": "system",
"setting_id": "MXNRpMDaVXj2xUx0",
"instantiation": "true",
"printer_model": "Wanhao D9-300 MK1",
"nozzle_diameter": [
"0.4"
],
"printable_area": [
"0x0",
"300x0",
"300x300",
"0x300"
],
"printable_height": "400",
"default_print_profile": "0.20mm Standard @Wanhao D9 MK1"
}
@@ -1,20 +0,0 @@
{
"type": "machine",
"name": "Wanhao D9-300 MK1 BLTouch kit 0.4 nozzle",
"inherits": "fdm_wanhao_d9_common",
"from": "system",
"setting_id": "rq6cPs92KgrUyZrn",
"instantiation": "true",
"printer_model": "Wanhao D9-300 MK1 BLTouch kit",
"nozzle_diameter": [
"0.4"
],
"printable_area": [
"0x0",
"300x0",
"300x300",
"0x300"
],
"printable_height": "400",
"default_print_profile": "0.20mm Standard @Wanhao D9"
}
@@ -1,9 +0,0 @@
{
"type": "machine_model",
"name": "Wanhao D9-300 MK1 BLTouch kit",
"model_id": "Wanhao-D9-300-MK1u2",
"nozzle_diameter": "0.4",
"machine_tech": "FFF",
"family": "Wanhao",
"default_materials": "Generic PLA @System;Generic PETG @System;Generic ABS @System"
}
@@ -1,9 +0,0 @@
{
"type": "machine_model",
"name": "Wanhao D9-300 MK1",
"model_id": "Wanhao-D9-300-MK1",
"nozzle_diameter": "0.4",
"machine_tech": "FFF",
"family": "Wanhao",
"default_materials": "Generic PLA @System;Generic PETG @System;Generic ABS @System"
}
@@ -1,20 +0,0 @@
{
"type": "machine",
"name": "Wanhao D9-300 MK2 0.4 nozzle",
"inherits": "fdm_wanhao_d9_common",
"from": "system",
"setting_id": "w3Cin9es1Jfx0dmR",
"instantiation": "true",
"printer_model": "Wanhao D9-300 MK2",
"nozzle_diameter": [
"0.4"
],
"printable_area": [
"0x0",
"300x0",
"300x300",
"0x300"
],
"printable_height": "400",
"default_print_profile": "0.20mm Standard @Wanhao D9"
}
@@ -1,9 +0,0 @@
{
"type": "machine_model",
"name": "Wanhao D9-300 MK2",
"model_id": "Wanhao-D9-300-MK2",
"nozzle_diameter": "0.4",
"machine_tech": "FFF",
"family": "Wanhao",
"default_materials": "Generic PLA @System;Generic PETG @System;Generic ABS @System"
}
@@ -1,20 +0,0 @@
{
"type": "machine",
"name": "Wanhao D9-300 MK3 0.4 nozzle",
"inherits": "fdm_wanhao_d9_common",
"from": "system",
"setting_id": "acFQWZqlt4QSgBPv",
"instantiation": "true",
"printer_model": "Wanhao D9-300 MK3",
"nozzle_diameter": [
"0.4"
],
"printable_area": [
"0x0",
"300x0",
"300x300",
"0x300"
],
"printable_height": "400",
"default_print_profile": "0.20mm Standard @Wanhao D9"
}
@@ -1,9 +0,0 @@
{
"type": "machine_model",
"name": "Wanhao D9-300 MK3",
"model_id": "Wanhao-D9-300-MK3",
"nozzle_diameter": "0.4",
"machine_tech": "FFF",
"family": "Wanhao",
"default_materials": "Generic PLA @System;Generic PETG @System;Generic ABS @System"
}
@@ -1,20 +0,0 @@
{
"type": "machine",
"name": "Wanhao D9-400 MK1 0.4 nozzle",
"inherits": "fdm_wanhao_d9_mk1_common",
"from": "system",
"setting_id": "DGSNE3AbmlBBG5PY",
"instantiation": "true",
"printer_model": "Wanhao D9-400 MK1",
"nozzle_diameter": [
"0.4"
],
"printable_area": [
"0x0",
"400x0",
"400x400",
"0x400"
],
"printable_height": "400",
"default_print_profile": "0.20mm Standard @Wanhao D9 MK1"
}
@@ -1,20 +0,0 @@
{
"type": "machine",
"name": "Wanhao D9-400 MK1 BLTouch kit 0.4 nozzle",
"inherits": "fdm_wanhao_d9_common",
"from": "system",
"setting_id": "WcKY7v24ewtzPfnU",
"instantiation": "true",
"printer_model": "Wanhao D9-400 MK1 BLTouch kit",
"nozzle_diameter": [
"0.4"
],
"printable_area": [
"0x0",
"400x0",
"400x400",
"0x400"
],
"printable_height": "400",
"default_print_profile": "0.20mm Standard @Wanhao D9"
}
@@ -1,9 +0,0 @@
{
"type": "machine_model",
"name": "Wanhao D9-400 MK1 BLTouch kit",
"model_id": "Wanhao-D9-400-MK1u2",
"nozzle_diameter": "0.4",
"machine_tech": "FFF",
"family": "Wanhao",
"default_materials": "Generic PLA @System;Generic PETG @System;Generic ABS @System"
}
@@ -1,9 +0,0 @@
{
"type": "machine_model",
"name": "Wanhao D9-400 MK1",
"model_id": "Wanhao-D9-400-MK1",
"nozzle_diameter": "0.4",
"machine_tech": "FFF",
"family": "Wanhao",
"default_materials": "Generic PLA @System;Generic PETG @System;Generic ABS @System"
}
@@ -1,20 +0,0 @@
{
"type": "machine",
"name": "Wanhao D9-400 MK2 0.4 nozzle",
"inherits": "fdm_wanhao_d9_common",
"from": "system",
"setting_id": "jn1FEJFeN7S2gEbD",
"instantiation": "true",
"printer_model": "Wanhao D9-400 MK2",
"nozzle_diameter": [
"0.4"
],
"printable_area": [
"0x0",
"400x0",
"400x400",
"0x400"
],
"printable_height": "400",
"default_print_profile": "0.20mm Standard @Wanhao D9"
}
@@ -1,9 +0,0 @@
{
"type": "machine_model",
"name": "Wanhao D9-400 MK2",
"model_id": "Wanhao-D9-400-MK2",
"nozzle_diameter": "0.4",
"machine_tech": "FFF",
"family": "Wanhao",
"default_materials": "Generic PLA @System;Generic PETG @System;Generic ABS @System"
}
@@ -1,20 +0,0 @@
{
"type": "machine",
"name": "Wanhao D9-400 MK3 0.4 nozzle",
"inherits": "fdm_wanhao_d9_common",
"from": "system",
"setting_id": "2kFyH1E3tqMWtDmG",
"instantiation": "true",
"printer_model": "Wanhao D9-400 MK3",
"nozzle_diameter": [
"0.4"
],
"printable_area": [
"0x0",
"400x0",
"400x400",
"0x400"
],
"printable_height": "400",
"default_print_profile": "0.20mm Standard @Wanhao D9"
}
@@ -1,9 +0,0 @@
{
"type": "machine_model",
"name": "Wanhao D9-400 MK3",
"model_id": "Wanhao-D9-400-MK3",
"nozzle_diameter": "0.4",
"machine_tech": "FFF",
"family": "Wanhao",
"default_materials": "Generic PLA @System;Generic PETG @System;Generic ABS @System"
}
@@ -1,20 +0,0 @@
{
"type": "machine",
"name": "Wanhao D9-500 MK1 0.4 nozzle",
"inherits": "fdm_wanhao_d9_mk1_common",
"from": "system",
"setting_id": "nj0TfnDKHb4wFX1R",
"instantiation": "true",
"printer_model": "Wanhao D9-500 MK1",
"nozzle_diameter": [
"0.4"
],
"printable_area": [
"0x0",
"500x0",
"500x500",
"0x500"
],
"printable_height": "500",
"default_print_profile": "0.20mm Standard @Wanhao D9 MK1"
}
@@ -1,20 +0,0 @@
{
"type": "machine",
"name": "Wanhao D9-500 MK1 BLTouch kit 0.4 nozzle",
"inherits": "fdm_wanhao_d9_common",
"from": "system",
"setting_id": "Hmrnlh6pJzdO2dIJ",
"instantiation": "true",
"printer_model": "Wanhao D9-500 MK1 BLTouch kit",
"nozzle_diameter": [
"0.4"
],
"printable_area": [
"0x0",
"500x0",
"500x500",
"0x500"
],
"printable_height": "500",
"default_print_profile": "0.20mm Standard @Wanhao D9"
}
@@ -1,9 +0,0 @@
{
"type": "machine_model",
"name": "Wanhao D9-500 MK1 BLTouch kit",
"model_id": "Wanhao-D9-500-MK1u2",
"nozzle_diameter": "0.4",
"machine_tech": "FFF",
"family": "Wanhao",
"default_materials": "Generic PLA @System;Generic PETG @System;Generic ABS @System"
}
@@ -1,9 +0,0 @@
{
"type": "machine_model",
"name": "Wanhao D9-500 MK1",
"model_id": "Wanhao-D9-500-MK1",
"nozzle_diameter": "0.4",
"machine_tech": "FFF",
"family": "Wanhao",
"default_materials": "Generic PLA @System;Generic PETG @System;Generic ABS @System"
}
@@ -1,20 +0,0 @@
{
"type": "machine",
"name": "Wanhao D9-500 MK2 0.4 nozzle",
"inherits": "fdm_wanhao_d9_common",
"from": "system",
"setting_id": "g2GSmhWJLFDwqzFI",
"instantiation": "true",
"printer_model": "Wanhao D9-500 MK2",
"nozzle_diameter": [
"0.4"
],
"printable_area": [
"0x0",
"500x0",
"500x500",
"0x500"
],
"printable_height": "500",
"default_print_profile": "0.20mm Standard @Wanhao D9"
}
@@ -1,9 +0,0 @@
{
"type": "machine_model",
"name": "Wanhao D9-500 MK2",
"model_id": "Wanhao-D9-500-MK2",
"nozzle_diameter": "0.4",
"machine_tech": "FFF",
"family": "Wanhao",
"default_materials": "Generic PLA @System;Generic PETG @System;Generic ABS @System"
}
@@ -1,20 +0,0 @@
{
"type": "machine",
"name": "Wanhao D9-500 MK3 0.4 nozzle",
"inherits": "fdm_wanhao_d9_common",
"from": "system",
"setting_id": "F7l90Rgr8Ni0sQva",
"instantiation": "true",
"printer_model": "Wanhao D9-500 MK3",
"nozzle_diameter": [
"0.4"
],
"printable_area": [
"0x0",
"500x0",
"500x500",
"0x500"
],
"printable_height": "500",
"default_print_profile": "0.20mm Standard @Wanhao D9"
}
@@ -1,9 +0,0 @@
{
"type": "machine_model",
"name": "Wanhao D9-500 MK3",
"model_id": "Wanhao-D9-500-MK3",
"nozzle_diameter": "0.4",
"machine_tech": "FFF",
"family": "Wanhao",
"default_materials": "Generic PLA @System;Generic PETG @System;Generic ABS @System"
}
@@ -1,108 +0,0 @@
{
"type": "machine",
"name": "fdm_wanhao_d9_common",
"inherits": "fdm_wanhao_common",
"from": "system",
"instantiation": "false",
"gcode_flavor": "marlin2",
"use_relative_e_distances": "1",
"emit_machine_limits_to_gcode": "0",
"nozzle_diameter": [
"0.4"
],
"printer_variant": "0.4",
"max_layer_height": [
"0.32"
],
"min_layer_height": [
"0.08"
],
"machine_max_speed_x": [
"300",
"300"
],
"machine_max_speed_y": [
"300",
"300"
],
"machine_max_speed_z": [
"5",
"5"
],
"machine_max_speed_e": [
"25",
"25"
],
"machine_max_acceleration_x": [
"3000",
"3000"
],
"machine_max_acceleration_y": [
"3000",
"3000"
],
"machine_max_acceleration_z": [
"100",
"100"
],
"machine_max_acceleration_e": [
"3000",
"3000"
],
"machine_max_acceleration_extruding": [
"1000",
"1000"
],
"machine_max_acceleration_travel": [
"1000",
"1000"
],
"machine_max_acceleration_retracting": [
"800",
"800"
],
"machine_max_jerk_x": [
"10",
"10"
],
"machine_max_jerk_y": [
"10",
"10"
],
"machine_max_jerk_z": [
"0.4",
"0.4"
],
"machine_max_jerk_e": [
"1",
"1"
],
"retraction_length": [
"2.0"
],
"retraction_speed": [
"25"
],
"deretraction_speed": [
"25"
],
"retraction_minimum_travel": [
"1"
],
"z_hop": [
"0"
],
"wipe": [
"0"
],
"retract_when_changing_layer": [
"1"
],
"machine_start_gcode": "; Wanhao Duplicator 9 start G-code, for the Marlin 2.1 firmwares at github.com/Le-Syl21/WANHAO-Duplicator-9\nG21 ; millimetres\nG90 ; absolute coordinates\nM83 ; relative extrusion\nM140 S[bed_temperature_initial_layer_single] ; heat the bed\nM104 S150 ; warm the nozzle without letting it ooze\nG91 ; a print stopped by hand can leave the nozzle down on the bed\nG1 Z10 F300 ; so raise it before homing: a BLTouch needs 10 mm to deploy\nG90\nM280 P0 S160 ; BLTouch: clear an alarm and stow the pin\nG28 ; home all axes (this turns bed levelling off)\nM420 S1 ; turn the bed mesh saved from the screen back on\nG1 Z10 F300\nM104 S[nozzle_temperature_initial_layer] ; start the nozzle now, the bed is still heating\nM190 S[bed_temperature_initial_layer_single] ; wait for the bed\nM109 S[nozzle_temperature_initial_layer] ; and confirm the nozzle\nG92 E0\nG1 X15 Y20 Z0.3 F3000 ; start of the priming line\nG1 Y140 E9.0 F1200 ; draw a line of filament\nG1 X15.5 F3000\nG1 Y20 E9.0 F1200 ; and back, next to it\nG92 E0\nG1 X22 F6000 ; wipe sideways to snap the string\nG1 Z2 F300 ; lift, so the line does not stick to the nozzle",
"machine_end_gcode": "; Wanhao Duplicator 9 end G-code\nM104 S0 ; nozzle heater off\nM140 S0 ; bed heater off\nM107 ; fan off\nG91 ; relative moves\nG1 E-2 F1500 ; release the pressure in the nozzle\nG1 Z10 F300 ; lift the nozzle\nG90 ; absolute moves\nG1 X5 Y{print_bed_max[1] - 10} F3000 ; bring the bed to the front\nM84 X Y E ; motors off, Z keeps its position",
"layer_change_gcode": "G92 E0",
"machine_pause_gcode": "M600",
"default_filament_profile": [
"Generic PLA @System"
]
}
@@ -1,28 +0,0 @@
{
"type": "machine",
"name": "fdm_wanhao_d9_mk1_common",
"inherits": "fdm_wanhao_d9_common",
"from": "system",
"instantiation": "false",
"machine_start_gcode": "; Wanhao Duplicator 9 start G-code, for the Marlin 2.1 firmwares at github.com/Le-Syl21/WANHAO-Duplicator-9\nG21 ; millimetres\nG90 ; absolute coordinates\nM83 ; relative extrusion\nM140 S[bed_temperature_initial_layer_single] ; heat the bed\nM104 S150 ; warm the nozzle without letting it ooze\nG91 ; a print stopped by hand can leave the nozzle down on the bed\nG1 Z10 F300 ; clear the bed before homing\nG90\nG28 ; home all axes (this turns bed levelling off)\nM420 S1 ; turn the bed mesh saved from the screen back on\nG1 Z10 F300\nM104 S[nozzle_temperature_initial_layer] ; start the nozzle now, the bed is still heating\nM190 S[bed_temperature_initial_layer_single] ; wait for the bed\nM109 S[nozzle_temperature_initial_layer] ; and confirm the nozzle\nG92 E0\nG1 X15 Y20 Z0.3 F3000 ; start of the priming line\nG1 Y140 E9.0 F1200 ; draw a line of filament\nG1 X15.5 F3000\nG1 Y20 E9.0 F1200 ; and back, next to it\nG92 E0\nG1 X22 F6000 ; wipe sideways to snap the string\nG1 Z2 F300 ; lift, so the line does not stick to the nozzle",
"machine_max_acceleration_x": [
"500",
"500"
],
"machine_max_acceleration_y": [
"500",
"500"
],
"machine_max_acceleration_e": [
"500",
"500"
],
"machine_max_acceleration_extruding": [
"500",
"500"
],
"machine_max_acceleration_travel": [
"500",
"500"
]
}
@@ -1,17 +0,0 @@
{
"type": "process",
"name": "0.12mm Fine @Wanhao D9 MK1",
"inherits": "fdm_process_wanhao_d9_mk1_common",
"from": "system",
"setting_id": "EClNN5UDWbLACTuz",
"instantiation": "true",
"layer_height": "0.12",
"initial_layer_print_height": "0.14",
"top_shell_layers": "4",
"bottom_shell_layers": "4",
"compatible_printers": [
"Wanhao D9-300 MK1 0.4 nozzle",
"Wanhao D9-400 MK1 0.4 nozzle",
"Wanhao D9-500 MK1 0.4 nozzle"
]
}
@@ -1,23 +0,0 @@
{
"type": "process",
"name": "0.12mm Fine @Wanhao D9",
"inherits": "fdm_process_wanhao_d9_common",
"from": "system",
"setting_id": "0hvsKsPO55TlduZR",
"instantiation": "true",
"layer_height": "0.12",
"initial_layer_print_height": "0.14",
"top_shell_layers": "4",
"bottom_shell_layers": "4",
"compatible_printers": [
"Wanhao D9-300 MK1 BLTouch kit 0.4 nozzle",
"Wanhao D9-400 MK1 BLTouch kit 0.4 nozzle",
"Wanhao D9-500 MK1 BLTouch kit 0.4 nozzle",
"Wanhao D9-300 MK2 0.4 nozzle",
"Wanhao D9-400 MK2 0.4 nozzle",
"Wanhao D9-500 MK2 0.4 nozzle",
"Wanhao D9-300 MK3 0.4 nozzle",
"Wanhao D9-400 MK3 0.4 nozzle",
"Wanhao D9-500 MK3 0.4 nozzle"
]
}
@@ -1,17 +0,0 @@
{
"type": "process",
"name": "0.20mm Standard @Wanhao D9 MK1",
"inherits": "fdm_process_wanhao_d9_mk1_common",
"from": "system",
"setting_id": "CXNOj3tPeTUXx81B",
"instantiation": "true",
"layer_height": "0.20",
"initial_layer_print_height": "0.24",
"top_shell_layers": "3",
"bottom_shell_layers": "3",
"compatible_printers": [
"Wanhao D9-300 MK1 0.4 nozzle",
"Wanhao D9-400 MK1 0.4 nozzle",
"Wanhao D9-500 MK1 0.4 nozzle"
]
}
@@ -1,23 +0,0 @@
{
"type": "process",
"name": "0.20mm Standard @Wanhao D9",
"inherits": "fdm_process_wanhao_d9_common",
"from": "system",
"setting_id": "UVXxknNxJswqaURQ",
"instantiation": "true",
"layer_height": "0.20",
"initial_layer_print_height": "0.24",
"top_shell_layers": "3",
"bottom_shell_layers": "3",
"compatible_printers": [
"Wanhao D9-300 MK1 BLTouch kit 0.4 nozzle",
"Wanhao D9-400 MK1 BLTouch kit 0.4 nozzle",
"Wanhao D9-500 MK1 BLTouch kit 0.4 nozzle",
"Wanhao D9-300 MK2 0.4 nozzle",
"Wanhao D9-400 MK2 0.4 nozzle",
"Wanhao D9-500 MK2 0.4 nozzle",
"Wanhao D9-300 MK3 0.4 nozzle",
"Wanhao D9-400 MK3 0.4 nozzle",
"Wanhao D9-500 MK3 0.4 nozzle"
]
}
@@ -1,17 +0,0 @@
{
"type": "process",
"name": "0.28mm Draft @Wanhao D9 MK1",
"inherits": "fdm_process_wanhao_d9_mk1_common",
"from": "system",
"setting_id": "omfIWwVnQVVxPrtb",
"instantiation": "true",
"layer_height": "0.28",
"initial_layer_print_height": "0.34",
"top_shell_layers": "3",
"bottom_shell_layers": "3",
"compatible_printers": [
"Wanhao D9-300 MK1 0.4 nozzle",
"Wanhao D9-400 MK1 0.4 nozzle",
"Wanhao D9-500 MK1 0.4 nozzle"
]
}
@@ -1,23 +0,0 @@
{
"type": "process",
"name": "0.28mm Draft @Wanhao D9",
"inherits": "fdm_process_wanhao_d9_common",
"from": "system",
"setting_id": "FEJqq1ylXWqaBPR6",
"instantiation": "true",
"layer_height": "0.28",
"initial_layer_print_height": "0.34",
"top_shell_layers": "3",
"bottom_shell_layers": "3",
"compatible_printers": [
"Wanhao D9-300 MK1 BLTouch kit 0.4 nozzle",
"Wanhao D9-400 MK1 BLTouch kit 0.4 nozzle",
"Wanhao D9-500 MK1 BLTouch kit 0.4 nozzle",
"Wanhao D9-300 MK2 0.4 nozzle",
"Wanhao D9-400 MK2 0.4 nozzle",
"Wanhao D9-500 MK2 0.4 nozzle",
"Wanhao D9-300 MK3 0.4 nozzle",
"Wanhao D9-400 MK3 0.4 nozzle",
"Wanhao D9-500 MK3 0.4 nozzle"
]
}
@@ -1,38 +0,0 @@
{
"type": "process",
"name": "fdm_process_wanhao_d9_common",
"inherits": "fdm_process_wanhao_common",
"from": "system",
"instantiation": "false",
"line_width": "0.4",
"initial_layer_line_width": "0.6",
"wall_loops": "2",
"infill_wall_overlap": "15%",
"sparse_infill_density": "15%",
"sparse_infill_pattern": "gyroid",
"outer_wall_speed": "25",
"inner_wall_speed": "40",
"sparse_infill_speed": "50",
"internal_solid_infill_speed": "50",
"top_surface_speed": "40",
"gap_infill_speed": "40",
"bridge_speed": "50",
"support_speed": "35",
"initial_layer_speed": "25",
"initial_layer_infill_speed": "25",
"travel_speed": "100",
"default_acceleration": "1000",
"outer_wall_acceleration": "1000",
"inner_wall_acceleration": "1000",
"top_surface_acceleration": "1000",
"sparse_infill_acceleration": "1000",
"initial_layer_acceleration": "1000",
"bridge_acceleration": "1000",
"travel_acceleration": "1000",
"default_jerk": "0",
"skirt_loops": "2",
"skirt_distance": "4",
"brim_type": "no_brim",
"enable_support": "0",
"enable_arc_fitting": "0"
}
@@ -1,15 +0,0 @@
{
"type": "process",
"name": "fdm_process_wanhao_d9_mk1_common",
"inherits": "fdm_process_wanhao_d9_common",
"from": "system",
"instantiation": "false",
"default_acceleration": "500",
"outer_wall_acceleration": "500",
"inner_wall_acceleration": "500",
"top_surface_acceleration": "500",
"sparse_infill_acceleration": "500",
"initial_layer_acceleration": "500",
"bridge_acceleration": "500",
"travel_acceleration": "500"
}
+35 -43
View File
@@ -437,7 +437,6 @@ def resolve_filament_field(name, field, filaments, ofl_filaments, seen=None, in_
the same hop semantics as resolve_filament_id: own value, else walk
`inherits` in the vendor map with OFL base-bundle fallback. Values are list
options — the first element counts; "" when the chain never defines one.
Templates pulled in by `include` are not consulted: none states either field.
"""
if seen is None:
seen = set()
@@ -888,8 +887,8 @@ def _vendor_json_files(vendor_path):
def check_preset_name_uniqueness(profiles_dir, vendor):
"""No two profiles in a bundle may share a type and a name, indexed or not.
The loader resolves "inherits" and "include" through per-type maps of the bundle's
profiles (PresetBundle.cpp load_subfiles), and std::map::emplace keeps the first
The loader resolves "inherits" through a per-type map of the bundle's profiles
(PresetBundle.cpp load_subfiles), and std::map::emplace keeps the first
insertion: a second file claiming the name is silently dropped, and which one
wins is nothing but index order. An unindexed twin counts too - it is one
sub_path edit away from deciding that silently.
@@ -1288,11 +1287,11 @@ def check_normalized(profiles_dir, vendor):
Those two commands define a profile file's canonical shape - identifying keys
first, keys the slicer no longer reads gone, filament options that are vectors
written as vectors - and a <vendor>.json's canonical lists, ordered
dependencies-first so the loader resolves every "inherits" and "include" in one
pass. Running them over a contributed bundle has to be a no-op; where it would
not be, the file that was reviewed is not the file that ships, and the next
maintainer to run normalize carries an unrelated diff into their own change.
written as vectors - and a <vendor>.json's canonical lists, ordered parents-first
so the loader resolves every "inherits" in one pass. Running them over a
contributed bundle has to be a no-op; where it would not be, the file that was
reviewed is not the file that ships, and the next maintainer to run normalize
carries an unrelated diff into their own change.
It asks the normalize and update-index sections below rather than restating what
they do, because a second definition of normal is free to drift from the one that
@@ -2035,9 +2034,9 @@ def trim_profiles(profiles_dir=PROFILES_DIR, vendors=None, profile_types=None,
cli_config.json carry no "type" - all of them stay. A file that cannot be parsed
is reported and kept: never delete what could not be read.
An unindexed file that some surviving profile names in "inherits" or "include" is
kept too, and reported, UNLESS an indexed profile already carries that name: both
are resolved by preset name, so the indexed one is the parent every child actually
An unindexed file that some surviving profile names in "inherits" is kept too,
and reported, UNLESS an indexed profile already carries that name: "inherits" is
resolved by preset name, so the indexed one is the parent every child actually
gets, and the unindexed file is a stale copy the loader never reaches. Where no
indexed profile provides the name the inheriting preset really is broken, and
deleting the file would destroy the only record of the settings it was written
@@ -2070,7 +2069,7 @@ def trim_profiles(profiles_dir=PROFILES_DIR, vendors=None, profile_types=None,
listed.add(posixpath.normpath(sub_path.replace("\\", "/")))
candidates = {} # path -> profile, for every unindexed preset
inherited = set() # every name the files that stay claim as a parent or include
inherited = set() # every name the files that stay claim as a parent
provided = {} # name -> sub_path, for the profiles the loader can see
for sub in subs:
for path in _walk_json(os.path.join(vendor_dir, sub)):
@@ -2085,7 +2084,8 @@ def trim_profiles(profiles_dir=PROFILES_DIR, vendors=None, profile_types=None,
if not isinstance(profile, dict):
continue
if sub_path in listed or profile.get("type") not in PROFILE_TYPES:
inherited.update(profile_dependencies(profile))
if profile.get("inherits"):
inherited.add(profile["inherits"])
if sub_path in listed and profile.get("name"):
provided[profile["name"]] = sub_path
continue
@@ -2104,7 +2104,8 @@ def trim_profiles(profiles_dir=PROFILES_DIR, vendors=None, profile_types=None,
for path, profile in rescued.items():
del candidates[path]
kept[path] = profile
inherited.update(profile_dependencies(profile))
if profile.get("inherits"):
inherited.add(profile["inherits"])
for path in sorted(kept):
print_warning(f"{_rel(path, profiles_dir)}: not indexed by {vendor}.json but "
@@ -2141,48 +2142,40 @@ def trim_profiles(profiles_dir=PROFILES_DIR, vendors=None, profile_types=None,
# update-index
# ---------------------------------------------------------------------------
def profile_dependencies(profile):
"""The names a profile needs loaded before it: its parent and every include."""
include = profile.get("include") or []
if isinstance(include, str):
include = [include]
return [name for name in [profile.get("inherits"), *include] if name]
def topological_sort(profiles):
"""Order index entries dependencies-first, so the loader resolves every
"inherits" and "include" in one pass.
"""Order index entries parents-first, so the loader resolves inherits in one pass.
Entries that neither depend on nor are depended on by another in the same section
go at the end in name order; the loader finds their parents, if any, through the
base bundle instead. Every entry on a dependency cycle, which no order can satisfy,
goes there too.
Entries whose parent is not in the same section keep their own (sorted) order at
the end; the loader finds those parents through the base bundle instead.
"""
graph = defaultdict(list)
in_degree = defaultdict(int)
by_name = {p["name"]: p for p in profiles}
all_names = set(by_name)
placed = set()
for profile in profiles:
parent = profile.get("inherits")
child = profile["name"]
for parent in profile_dependencies(profile):
if parent in all_names:
graph[parent].append(child)
in_degree[child] += 1
in_degree.setdefault(parent, 0)
if parent in all_names:
graph[parent].append(child)
in_degree[child] += 1
in_degree.setdefault(parent, 0)
placed.add(child)
placed.add(parent)
queue = sorted(name for name, degree in in_degree.items() if degree == 0)
result = []
while queue:
current = queue.pop(0)
result.append(by_name[current])
placed.add(current)
for child in sorted(graph[current]):
in_degree[child] -= 1
if in_degree[child] == 0:
queue.append(child)
ordered = {p["name"] for p in result}
result.extend(by_name[name] for name in sorted(all_names - ordered))
result.extend(by_name[name] for name in sorted(all_names - placed))
return result
@@ -2232,15 +2225,15 @@ def build_index_sections(profiles_dir, vendor, profile_types=None):
"name": name,
"sub_path": os.path.relpath(path, vendor_dir).replace(os.sep, "/"),
}
for key in ("inherits", "include"):
if profile.get(key):
entry[key] = profile[key]
if profile.get("inherits"):
entry["inherits"] = profile["inherits"]
by_name[name].append(entry["sub_path"])
entries.append(entry)
# inherits/include were ordering input only; the index holds name and sub_path
sections[profile_type + "_list"] = [{"name": e["name"], "sub_path": e["sub_path"]}
for e in topological_sort(entries)]
sorted_entries = topological_sort(entries)
for entry in sorted_entries:
entry.pop("inherits", None) # ordering input only, not part of the index
sections[profile_type + "_list"] = sorted_entries
for rel, found in sorted(unplaceable.items()):
problems.append(f'{rel}: type {found!r} is not one of {list(PROFILE_TYPES)}, so it '
@@ -2425,8 +2418,7 @@ def build_parser():
add("update-index", [vendor_opt, type_opt, dry_run_opt, profiles_opt],
"regenerate the *_list sections of <vendor>.json",
"Rebuild the *_list sections of each <vendor>.json from the files on disk,\n"
"ordered dependencies-first so the loader resolves inherits and include\n"
"in one pass.\n"
"ordered parents-first so the loader resolves inherits in one pass.\n"
"\n"
"A profile is indexed under the section its own \"type\" names, so run\n"
"normalize first: it is what writes a missing type. Two files claiming one\n"
-45
View File
@@ -405,20 +405,6 @@ class TestTripleResolution(unittest.TestCase):
self.assertEqual(afi.resolve_triple("MyPLA @P1", fmap, {}),
("MyVendor", "PLA", "MyPLA"))
def test_split_vendor_and_type_bases_resolve(self):
# A partial base is normal, not an error: vendor and type may live on
# different ancestors, with an intermediate supplying neither (the
# Snapmaker shape). The pair is complete at the instantiated preset.
recs = [
self.rec("APLA @P1", inherits="mid"),
self.rec("mid", inherits="typebase"),
self.rec("typebase", filament_type=["PLA"], inherits="vendorbase"),
self.rec("vendorbase", filament_vendor=["AV"]),
]
fmap = {r["name"]: r for r in recs}
self.assertEqual(afi.resolve_triple("APLA @P1", fmap, {}),
("AV", "PLA", "APLA"))
# ---------------------------------------------------------------------------
# checks on synthetic trees
@@ -431,24 +417,6 @@ class TestChecks(OfCleanTreeCase):
self.assertNotIn("[ERROR]", out)
self.assertNotIn("[WARNING]", out)
def test_instantiated_preset_over_partial_bases_is_silent(self):
# Vendor and type split across two non-instantiated bases, an
# intermediate base with neither: base profiles are allowed to be
# partial. Only the instantiated preset must resolve both.
self.t.write_preset("VendorA", preset("XPLA vendorbase", instantiation=False,
filament_vendor="XV"))
self.t.write_preset("VendorA", preset("XPLA typebase", instantiation=False,
filament_type="PLA",
inherits="XPLA vendorbase"))
self.t.write_preset("VendorA", preset("XPLA mid", instantiation=False,
inherits="XPLA typebase"))
self.t.write_preset("VendorA", preset(
"XPLA @P1", inherits="XPLA mid",
filament_id=afi.generate_filament_id("XV", "PLA", "XPLA"),
compatible_printers=["P1"]))
errors, out = self.t.check()
self.assertEqual(errors, 0, out)
def test_check1_unknown_non_of_id(self):
self.t.write_preset("VendorA", preset("BPLA @base", filament_id="BOGUS_9",
instantiation=False,
@@ -1555,19 +1523,6 @@ class TestRealTree(unittest.TestCase):
self.assertEqual(analysis["missing_effective"], [])
self.assertEqual(analysis["read_errors"], [])
def test_every_instantiated_filament_resolves_vendor_and_type(self):
# The property the web guide resolves at load: a partial base is fine as
# long as the instantiated preset ends up with both fields. Guards the
# split-base bundles (Snapmaker, Anker, SeeMeCNC).
analysis = afi.analyze_tree(REAL_PROFILES)
unresolved = [
(vendor, rec["name"], rec["triple"][0], rec["triple"][1])
for vendor, filaments in analysis["vendors"].items()
for rec in filaments.values()
if rec["instantiation"] and not (rec["triple"][0] and rec["triple"][1])
]
self.assertEqual(unresolved, [])
# ---------------------------------------------------------------------------
# review-fix regressions
# ---------------------------------------------------------------------------
-20
View File
@@ -411,26 +411,6 @@ class TestUpdateIndex(TreeCase):
for entry in self.t.read_index("V")["filament_list"]:
self.assertEqual(sorted(entry), ["name", "sub_path"])
def test_include_targets_are_listed_before_their_users(self):
# The loader resolves include like inherits: in one pass over the list, so
# a template must be listed before every preset that includes it - even
# though a template has no parent of its own to order it by.
self.t.write("V", "machine/P.json", {"type": "machine", "name": "P",
"include": ["T start", "T end"]})
self.t.write("V", "machine/T start.json", {"type": "machine", "name": "T start"})
self.t.write("V", "machine/T end.json", {"type": "machine", "name": "T end"})
self.t.write("V", "filament/F.json", {"type": "filament", "name": "F",
"inherits": "B", "include": "S"})
self.t.write("V", "filament/B.json", {"type": "filament", "name": "B"})
self.t.write("V", "filament/S.json", {"type": "filament", "name": "S"})
rc, out = self.run_command("update-index")
self.assertEqual(rc, 0, out)
machines = [e["name"] for e in self.t.read_index("V")["machine_list"]]
self.assertEqual(machines, ["T end", "T start", "P"])
filaments = [e["name"] for e in self.t.read_index("V")["filament_list"]]
self.assertLess(filaments.index("B"), filaments.index("F"))
self.assertLess(filaments.index("S"), filaments.index("F"))
def test_a_profile_with_no_usable_type_is_reported_not_dropped(self):
self.t.write("V", "filament/A.json", {"type": "filament", "name": "A"})
self.t.write("V", "filament/B.json", {"name": "B"})
-6
View File
@@ -28,12 +28,6 @@ if (ORCA_TOOLS)
target_link_libraries(generate_system_cache libslic3r boost_headeronly)
target_compile_definitions(generate_system_cache PRIVATE ${_DEV_DEFS})
# profile_include_dump: prints what included templates contribute to a vendor's presets,
# to diff against the same tool built in BambuStudio. Built only on request.
add_executable(profile_include_dump EXCLUDE_FROM_ALL profile_include_dump.cpp)
target_link_libraries(profile_include_dump libslic3r boost_headeronly)
target_compile_definitions(profile_include_dump PRIVATE ${_DEV_DEFS})
endif()
# Function that adds source file encoding check to a target
-215
View File
@@ -1,215 +0,0 @@
// Prints what the profile `include` key contributes to one vendor's system
// presets, so that the dump from OrcaSlicer and the one from BambuStudio can be
// diffed: the two copies of this file differ only in how they load the vendor.
// For every preset whose values pass through an included template, from its
// own file or an ancestor's, it prints the templates those files name, in the
// order they apply, then the loaded value of each key the templates set. Every
// line starts with the preset, so a plain diff names the preset of each
// difference.
#include "libslic3r/PresetBundle.hpp"
#include "libslic3r/Preset.hpp"
#include "libslic3r/Utils.hpp"
#include <boost/filesystem.hpp>
#include <boost/nowide/fstream.hpp>
#include "nlohmann/json.hpp"
#include <algorithm>
#include <iostream>
#include <map>
#include <set>
#include <string>
#include <vector>
using namespace Slic3r;
namespace fs = boost::filesystem;
using nlohmann::json;
namespace {
// What a sub-file states about where its values come from, and what it sets.
struct Entry
{
std::string inherits;
std::vector<std::string> includes;
std::vector<std::string> keys;
};
// Sub-files by name, per section of the vendor index: `inherits` and `include`
// both resolve within a section.
using Sections = std::map<std::string, std::map<std::string, Entry>>;
json read_json(const fs::path &path)
{
boost::nowide::ifstream in(path.string());
if (!in)
throw std::runtime_error("Cannot read " + path.string());
return json::parse(in);
}
Sections read_vendor(const fs::path &dir, const std::string &vendor)
{
// Keys that name and place a sub-file rather than set a value.
static const std::set<std::string> metadata = {"name", "type", "from", "instantiation", "inherits", "include"};
Sections sections;
const json index = read_json(dir / (vendor + ".json"));
for (const char *section : {"process_list", "filament_list", "machine_list"}) {
const auto list = index.find(section);
if (list == index.end())
continue;
for (const json &item : *list) {
const json file = read_json(dir / vendor / item.at("sub_path").get<std::string>());
// A file without a name goes by its name in the index.
Entry &entry = sections[section][file.value("name", item.at("name").get<std::string>())];
entry.inherits = file.value("inherits", "");
if (const auto include = file.find("include"); include != file.end()) {
if (include->is_string())
entry.includes.push_back(include->get<std::string>());
else
for (const json &name : *include)
entry.includes.push_back(name.get<std::string>());
}
for (auto it = file.begin(); it != file.end(); ++it)
if (metadata.count(it.key()) == 0)
entry.keys.push_back(it.key());
}
}
return sections;
}
const PresetCollection &presets_of(const PresetBundle &bundle, const std::string &section)
{
if (section == "process_list")
return bundle.prints;
if (section == "filament_list")
return bundle.filaments;
return bundle.printers;
}
size_t dump(const PresetBundle &bundle, const Sections &sections, std::ostream &out)
{
size_t dumped = 0;
for (const auto &[section, entries] : sections) {
std::vector<const Preset *> presets;
for (const Preset &preset : presets_of(bundle, section).get_presets())
if (preset.is_system)
presets.push_back(&preset);
std::sort(presets.begin(), presets.end(), [](const Preset *a, const Preset *b) { return a->name < b->name; });
for (const Preset *preset : presets) {
// The preset and its ancestors, root first: the order their includes apply in.
std::vector<const Entry *> lineage;
for (auto it = entries.find(preset->name); it != entries.end() && lineage.size() <= entries.size();
it = entries.find(it->second.inherits))
lineage.insert(lineage.begin(), &it->second);
std::string templates;
std::set<std::string> keys;
for (const Entry *entry : lineage)
for (const std::string &name : entry->includes) {
templates += (templates.empty() ? "" : "; ") + name;
if (const auto it = entries.find(name); it != entries.end())
keys.insert(it->second.keys.begin(), it->second.keys.end());
}
if (templates.empty())
continue;
const std::string prefix = section.substr(0, section.find('_')) + " | " + preset->name + " | ";
out << prefix << "include = " << templates << "\n";
for (const std::string &key : keys)
out << prefix << key << " = " << (preset->config.has(key) ? preset->config.opt_serialize(key) : "<absent>") << "\n";
++dumped;
}
}
return dumped;
}
// Orca: load the vendor as the app does, against the filament library when the
// directory has one: parsed from its JSON files or, with from_cache, from the
// preset cache the app reads on every launch after the first.
void load_vendor(PresetBundle &bundle, const std::string &dir, const std::string &vendor, bool from_cache)
{
const auto rule = ForwardCompatibilitySubstitutionRule::EnableSilent;
PresetBundle library;
const PresetBundle *base = nullptr;
if (fs::is_regular_file(fs::path(dir) / (std::string(PresetBundle::ORCA_FILAMENT_LIBRARY) + ".json"))) {
library.load_vendor_configs_from_json(dir, PresetBundle::ORCA_FILAMENT_LIBRARY, PresetBundle::LoadSystem, rule, nullptr, false);
base = &library;
}
if (!from_cache) {
bundle.load_vendor_configs_from_json(dir, vendor, PresetBundle::LoadSystem, rule, base, false);
return;
}
// Parse once to write <vendor>.opc beside the profile, then load that
// cache into a clean bundle. Any cache already there goes first, so that a
// failed write cannot leave it to be loaded; one that was not there before
// goes again afterwards.
const fs::path cache = fs::path(dir) / (vendor + ".opc");
const bool had_cache = fs::exists(cache);
fs::remove(cache);
PresetBundle parsed;
parsed.set_is_validation_mode(true); // parse the JSON: validation never serves a cache
parsed.set_generate_vendor_caches(true);
parsed.load_vendor_configs_from_json(dir, vendor, PresetBundle::LoadSystem, rule, base);
const bool loaded = bundle.load_vendor_cache(cache.string(), vendor, parsed.vendors.at(vendor).config_version, base);
if (!had_cache)
fs::remove(cache);
if (!loaded)
throw std::runtime_error("The preset cache " + cache.string() + " was not written or was rejected");
}
} // namespace
int main(int argc, char *argv[])
{
const char *usage = "Usage: profile_include_dump -p <profiles dir> -o <dump file> [-v <vendor>] [-l <log level>] [-c]\n"
" -v vendor to dump, BBL if omitted\n"
" -l log level, 0 (fatal) to 5 (trace); 1 if omitted\n"
" -c load the presets from the vendor's preset cache, generated first, not the JSON\n";
std::string dir, output, vendor = "BBL";
unsigned log_level = 1;
bool from_cache = false;
for (int i = 1; i < argc; ++i) {
const std::string arg = argv[i];
if (arg == "-c") {
from_cache = true;
continue;
}
if (i + 1 == argc) {
std::cerr << usage;
return 1;
}
const std::string value = argv[++i];
if (arg == "-p")
dir = value;
else if (arg == "-o")
output = value;
else if (arg == "-v")
vendor = value;
else if (arg == "-l" && value.size() == 1 && value[0] >= '0' && value[0] <= '5')
log_level = unsigned(value[0] - '0');
else {
std::cerr << usage;
return 1;
}
}
if (dir.empty() || output.empty() || !fs::is_directory(dir)) {
std::cerr << usage;
return 1;
}
set_logging_level(log_level);
try {
PresetBundle bundle;
load_vendor(bundle, dir, vendor, from_cache);
boost::nowide::ofstream out(output);
if (!out)
throw std::runtime_error("Cannot write " + output);
const size_t dumped = dump(bundle, read_vendor(dir, vendor), out);
out.close();
if (!out)
throw std::runtime_error("Failed writing " + output);
std::cerr << "Dumped " << dumped << " " << vendor << " presets that include a template\n";
} catch (const std::exception &ex) {
std::cerr << ex.what() << "\n";
return 1;
}
return 0;
}
-3
View File
@@ -950,9 +950,6 @@ int ConfigBase::load_from_json(const std::string &file, ConfigSubstitutionContex
}
else if (!load_inherits_to_config && boost::iequals(it.key(), BBL_JSON_KEY_INHERITS)) {
key_values.emplace(BBL_JSON_KEY_INHERITS, it.value());
}
else if (!load_inherits_to_config && boost::iequals(it.key(), BBL_JSON_KEY_INCLUDES)) {
key_values.emplace(BBL_JSON_KEY_INCLUDES, it.value().dump());
} else if (boost::iequals(it.key(), ORCA_JSON_KEY_RENAMED_FROM)) {
key_values.emplace(ORCA_JSON_KEY_RENAMED_FROM, it.value());
} else {
+1 -1
View File
@@ -8084,7 +8084,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
_mm3_per_mm *= filament_flow_ratio;
if (path.role() == erTopSolidInfill) {
_mm3_per_mm *= NOZZLE_CONFIG(top_solid_infill_flow_ratio);
_mm3_per_mm *= m_config.top_solid_infill_flow_ratio;
} else if (path.role() == erBottomSurface) {
_mm3_per_mm *= m_config.bottom_solid_infill_flow_ratio;
} else if (path.role() == erInternalBridgeInfill) {
-1
View File
@@ -62,7 +62,6 @@
#define ORCA_JSON_KEY_UPDATE_TIME "updated_time"
#define ORCA_JSON_KEY_CREATED_TIME "created_time"
#define BBL_JSON_KEY_INHERITS "inherits"
#define BBL_JSON_KEY_INCLUDES "include"
#define BBL_JSON_KEY_INSTANTIATION "instantiation"
#define BBL_JSON_KEY_NOZZLE_DIAMETER "nozzle_diameter"
#define BBL_JSON_KEY_PRINTER_TECH "machine_tech"
+20 -65
View File
@@ -6598,8 +6598,7 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool
// now, or deserialized from the vendor's cache; the code is shared so a
// cache-loaded bundle cannot come out different from a JSON-loaded one.
// Resolves `inherits` against the presets loaded before this one
// (config_maps) or against base_bundle's filament library, layers each
// `include` (include_maps) under the preset's own keys, flattens, validates
// (config_maps) or against base_bundle's filament library, flattens, validates
// and registers the preset. Returns the reason loading failed, empty on
// success.
std::string PresetBundle::load_vendor_preset(
@@ -6608,10 +6607,9 @@ std::string PresetBundle::load_vendor_preset(
const PresetBundle* base_bundle,
LoadConfigBundleAttributes flags,
ConfigSubstitutionContext& substitution_context, PresetsConfigSubstitutions& substitutions,
std::map<std::string, DynamicPrintConfig>& config_maps, std::map<std::string, DynamicPrintConfig>& include_maps,
std::map<std::string, std::string>& filament_id_maps,
std::map<std::string, DynamicPrintConfig>& config_maps, std::map<std::string, std::string>& filament_id_maps,
PresetCollection* presets_collection, size_t& count, bool is_from_lib,
const std::set<std::string>* retain_configs, const std::set<std::string>* retain_includes)
const std::set<std::string>* retain_configs)
{
const VendorProfile* current_vendor_profile = &this->vendors.at(vendor_name);
const std::string subfile = path + "/" + vendor_name + "/" + entry.sub_path;
@@ -6654,30 +6652,14 @@ std::string PresetBundle::load_vendor_preset(
return reason;
}
}
else
default_config = &presets_collection->default_preset_for(entry.config_src).config;
else {
if (presets_collection->type() == Preset::TYPE_PRINTER)
default_config = &presets_collection->default_preset_for(entry.config_src).config;
else
default_config = &presets_collection->default_preset().config;
}
config = *default_config;
// Layer each included preset's own keys over the parent, in the order listed;
// this preset's own keys go on top.
for (const std::string& name : entry.includes) {
auto it = include_maps.find(name);
if (it == include_maps.end()) {
++m_errors;
BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": can not find include " << name << " for " << preset_name;
continue;
}
config.apply(it->second);
}
config.apply(entry.config_src);
// Record what a base states, its diff against the default, for the presets
// that include it. It is taken before extend_default_config_length pads every
// per-variant key to the base's variant count: the padded defaults would
// otherwise override the values each includer inherits.
if (entry.instantiation == "false" && (retain_includes == nullptr || retain_includes->count(preset_name) != 0)) {
DynamicPrintConfig included;
included.apply_only(config, config.diff(presets_collection->default_preset_for(config).config));
include_maps.emplace(preset_name, std::move(included));
}
extend_default_config_length(config, true, *default_config);
if (entry.instantiation == "false" && "Template" != vendor_name) {
// Report configuration fields, which are misplaced into a wrong group.
@@ -7136,15 +7118,6 @@ std::pair<PresetsConfigSubstitutions, size_t> PresetBundle::load_vendor_configs_
}
entry.name = key_values[BBL_JSON_KEY_NAME];
entry.description = key_values[BBL_JSON_KEY_DESCRIPTION];
// A file that states no instantiation and is named as G-code, or has no
// name, is a template that is only there to be included. A nameless one
// goes by its name in the vendor index.
if (auto it = key_values.find(BBL_JSON_KEY_INSTANTIATION);
(it == key_values.end() || it->second.empty()) && (entry.name.empty() || entry.name.find("gcode") != std::string::npos)) {
key_values[BBL_JSON_KEY_INSTANTIATION] = "false";
if (entry.name.empty())
entry.name = subfile_iter.first;
}
if(key_values.find(BBL_JSON_KEY_INSTANTIATION) == key_values.end())
{
BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": Missing instantiation attribute for " << entry.name;
@@ -7173,20 +7146,6 @@ std::pair<PresetsConfigSubstitutions, size_t> PresetBundle::load_vendor_configs_
return reason;
}
}
if (auto it = key_values.find(BBL_JSON_KEY_INCLUDES); it != key_values.end()) {
// An array of names, or one bare name; load_from_json kept the JSON text.
nlohmann::json includes = nlohmann::json::parse(it->second);
if (!includes.is_array())
includes = nlohmann::json::array({std::move(includes)});
for (const auto& name : includes) {
if (name.is_string())
entry.includes.push_back(name.get<std::string>());
else {
++m_errors;
BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": invalid include " << name.dump() << " for " << entry.name;
}
}
}
if (key_values.find(ORCA_JSON_KEY_RENAMED_FROM) != key_values.end()) {
if (!unescape_strings_cstyle(key_values[ORCA_JSON_KEY_RENAMED_FROM], entry.renamed_from)) {
BOOST_LOG_TRIVIAL(error) << "Error in a Config \"" << dir << "\": The preset \"" << entry.name
@@ -7203,7 +7162,7 @@ std::pair<PresetsConfigSubstitutions, size_t> PresetBundle::load_vendor_configs_
return reason;
};
std::map<std::string, DynamicPrintConfig> configs, include_maps;
std::map<std::string, DynamicPrintConfig> configs;
std::map<std::string, std::string> filament_id_maps;
// Orca: whether to (re)write the vendor's cache after this parse, leaving it
// in step with the profile so the next run reads it instead. It is written
@@ -7220,7 +7179,6 @@ std::pair<PresetsConfigSubstitutions, size_t> PresetBundle::load_vendor_configs_
auto load_subfiles = [&](std::vector<std::pair<std::string, std::string>>& subfiles,
std::vector<CachedPreset>& entries, const char* kind, bool is_from_lib = false) {
configs.clear();
include_maps.clear();
filament_id_maps.clear();
for (auto& subfile : subfiles) {
CachedPreset entry;
@@ -7228,8 +7186,8 @@ std::pair<PresetsConfigSubstitutions, size_t> PresetBundle::load_vendor_configs_
if (reason.empty()) {
const int errors_before_install = m_errors;
reason = load_vendor_preset(entry, dir, vendor_name, base_bundle, flags,
substitution_context, substitutions, configs, include_maps, filament_id_maps,
presets, presets_loaded, is_from_lib);
substitution_context, substitutions, configs, filament_id_maps, presets,
presets_loaded, is_from_lib);
install_errors += m_errors - errors_before_install;
}
if (!reason.empty()) {
@@ -8024,29 +7982,26 @@ bool PresetBundle::load_vendor_cache(const std::string& cache_path, const std::s
// parsed), so no substitutions are reported, as before.
ConfigSubstitutionContext substitution_context { ForwardCompatibilitySubstitutionRule::EnableSilent };
PresetsConfigSubstitutions substitutions;
std::map<std::string, DynamicPrintConfig> configs, include_maps;
std::map<std::string, DynamicPrintConfig> configs;
std::map<std::string, std::string> filament_id_maps;
const std::string path = boost::filesystem::path(cache_path).parent_path().string();
size_t count = 0;
auto install_entries = [&](const std::vector<CachedPreset>& entries, PresetCollection* presets, bool is_from_lib) {
configs.clear();
include_maps.clear();
filament_id_maps.clear();
// Only configs of presets that other entries inherit or include are
// ever looked up again; registering just those skips one full config
// copy for every leaf preset. The library's filaments are all retained
// — they become the m_config_maps other vendors resolve against.
std::set<std::string> inherited, included;
for (const CachedPreset& entry : entries) {
// Only configs of presets that other entries inherit are ever looked
// up again; registering just those skips one full config copy for
// every leaf preset. The library's filaments are all retained — they
// become the m_config_maps other vendors resolve against.
std::set<std::string> inherited;
for (const CachedPreset& entry : entries)
if (! entry.inherits.empty())
inherited.insert(entry.inherits);
included.insert(entry.includes.begin(), entry.includes.end());
}
const std::set<std::string>* retain_configs = is_from_lib ? nullptr : &inherited;
for (const CachedPreset& entry : entries) {
const std::string reason = load_vendor_preset(entry, path, vendor_name,
base_bundle, LoadConfigBundleAttribute::LoadSystem, substitution_context, substitutions,
configs, include_maps, filament_id_maps, presets, count, is_from_lib, retain_configs, &included);
configs, filament_id_maps, presets, count, is_from_lib, retain_configs);
if (! reason.empty())
throw std::runtime_error("entry " + entry.name + " failed to install: " + reason);
}
+10 -12
View File
@@ -634,24 +634,22 @@ private:
// load_vendor_configs_from_json reads a cache.
bool load_vendor_cache(const boost::filesystem::path& dir, const std::string& vendor_name, const PresetBundle* base_bundle);
// Load one source-form preset entry into this bundle: resolve `inherits`
// and `include`, flatten, validate and register the preset. Returns the
// reason loading failed, empty on success. See the definition for the
// sharing contract between the JSON parse and the cache load.
// retain_configs / retain_includes, when non-null, name the only presets
// registered into config_maps / include_maps (a config copy each). The
// cache load passes the names its entries inherit / include — the only
// ones ever looked up again; the JSON parse retains all, not knowing what
// later subfiles name.
// Load one source-form preset entry into this bundle: resolve `inherits`,
// flatten, validate and register the preset. Returns the reason loading
// failed, empty on success. See the definition for the sharing contract
// between the JSON parse and the cache load.
// retain_configs, when non-null, names the only presets registered into
// config_maps (a full config copy each). The cache load passes the names its
// entries inherit — the only ones ever looked up again; the JSON parse
// retains all, not knowing what later subfiles inherit.
std::string load_vendor_preset(const CachedPreset& entry,
const std::string& path, const std::string& vendor_name,
const PresetBundle* base_bundle,
LoadConfigBundleAttributes flags,
ConfigSubstitutionContext& substitution_context, PresetsConfigSubstitutions& substitutions,
std::map<std::string, DynamicPrintConfig>& config_maps, std::map<std::string, DynamicPrintConfig>& include_maps,
std::map<std::string, std::string>& filament_id_maps,
std::map<std::string, DynamicPrintConfig>& config_maps, std::map<std::string, std::string>& filament_id_maps,
PresetCollection* presets_collection, size_t& count, bool is_from_lib,
const std::set<std::string>* retain_configs = nullptr, const std::set<std::string>* retain_includes = nullptr);
const std::set<std::string>* retain_configs = nullptr);
// Clear every collection's m_printer_hold_alias, which reset() leaves alone.
void clear_printer_hold_aliases();

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