Compare commits

..
Author SHA1 Message Date
Hanif Koh 8b2ae48e4a Keep the Exposed Band of a Sub-Cell Step Beside the Neighbouring Layer's Outer Wall
On a shallow surface the band of a layer that the layer above leaves exposed is
narrower than a grid cell, so whether the layer is the topmost occupant of any
cell flickers from layer to layer and the band's segments, inner walls and solid
infill hidden by role, came and went in a dashed ring.

That band is always in the same place: the strip just outside the outer wall of
the layer above, or of the layer below for the underside of an overhang. The
classifier now keeps the outer-wall cell map of the previous and next layers as
well as the current one, rotating like the footprints, and keeps any segment
whose midpoint lies within a line and a half, or a cell if larger, of a
neighbouring layer's outer wall. It can only add segments, so no hole is opened
by it; what it over-keeps is the covered strip under the neighbour's wall.
2026-09-23 12:53:58 +08:00
Hanif Koh 8095904bc2 Catch Only Allocation and Thread Failures Around the Shell Classification
The fallback that marks every segment as shell caught everything, which would
also have hidden a logic error. It now catches what the classification can
really throw on a huge print: std::bad_alloc from its grids and std::system_error
from a worker thread that cannot be launched.
2026-09-23 12:34:56 +08:00
Hanif Koh b7c86befe1 Keep the Surfaces the Roles Name in the Shell-Only Drag Mode
The shell test asks whether at least half of the cells a segment crosses lie on
the footprint's boundary. On a curved wall the boundary is a staircase of cells,
and an outer-wall segment that runs past an inside corner of that staircase
crosses cells whose four neighbours are all filled, so a short segment there
failed the test and vanished, leaving a hole with the inner wall showing through
it. A shallow dome does the same to its top skin: one layer's ring lies within
the same cells as the next layer's, so it is neither a boundary nor the topmost
occupant, and the bridges under it showed through.

Outer walls and the top and bottom skins are the surface by definition, so the
mode now keeps them whatever the grid says, and the grid decides only for the
roles that can be either: inner walls, the prime tower, supports, skirt and brim.
2026-09-23 12:34:56 +08:00
Hanif Koh 526a91d323 Add a Shell-Only Drag Mode That Keeps the Visible Surface of the Print
Outer walls is a role filter, which loses the prime tower, whose every segment
shares one role, and every top and bottom surface between the range's ends. A
fifth mode, Shell only, keeps what a geometric classification marks as the
visible surface of the print, of one layer in every N, plus whatever a view from
straight above or below sees of the layers it skips, so that a step does not
vanish.

The classification runs once per load, the first time the mode is needed, and
is purely geometric: each layer is rasterized into a half-millimetre occupancy
grid and closed so that sparse infill reads as solid, a cell is on the shell
when any of its six neighbours is empty, and a segment is kept when at least
half of the cells it crosses are. The closing dilates each connected component
on its own and leaves a cell two components reach empty, so the gap between two
close objects is never bridged. The first inner wall beside an outer wall is
kept as well, since the step of a sloped surface is narrower than a cell, and
the interior infill roles and gap fill are never taken, whatever the geometry
says. The layers are split across up to eight workers, and an allocation
failure on a huge print falls back to keeping everything but the hidden infill.

Separate from the other modes so that it can be dropped on its own.
2026-09-23 12:14:16 +08:00
Hanif Koh 493896260e Let the User Choose What the Preview Draws While Dragging
The solid model is one answer to a preview that cannot keep up with a drag; a
reviewer asked for the two that keep the drag view made of toolpaths. The
checkbox is now a combobox, "Simplify preview while dragging", with Off, Solid
model, Skip layers and Outer walls, and a spin, "Draw one layer in every N",
for the toolpath modes. Off is the default, and with it nothing is built.

Skip layers keeps one layer in every N. Outer walls keeps the outer and overhang
perimeters of those layers, so the prime tower and supports, whose segments have
other roles, drop out of it. Both keep the bottom and top layers of the visible
range whole, as the solid model does, so the faces the range cuts open stay what
was printed there.

libvgcode takes the choice as EReducedDetailMode and a stride; the sets are
rebuilt when either changes, and drawing from the reduced one is still a buffer
binding. A mode change reaches the loaded preview at once, as the checkbox did.
2026-09-23 12:14:16 +08:00
Hanif Koh ca83497bb6 Release the Reduced Set When Unused and Share the Drag Check With the Scene Cache
The reduced index buffers were only re-uploaded while the preference was on, so
the last set stayed allocated until the next load once it was switched off, and
their size was missing from get_used_gpu_memory(). They are now uploaded on every
rebuild, empty when nothing was built, and counted.

The scene cache and the solid model both asked whether the user was dragging,
with different lists: the cache knew about gizmos and the rectangle selection,
the solid model about the navigator and the sliders. One is_user_interacting()
now answers both.

The tooltip says that negative volumes are not cut out of the solid model, since
load_shells() drops every non-model-part volume, and the preferences handler
keeps the dimming comment with the branch it documents.
2026-09-23 12:13:49 +08:00
Hanif Koh 6a985744c4 Offer the Sliced Objects as a Solid Model While Dragging
The G-code preview draws every toolpath segment as an instanced box, and its frame cost is
linear in the number of segments drawn. On a plate of large objects that is enough that
dragging the camera or a preview slider cannot keep up, and no amount of per-segment work
changes that; only drawing fewer segments does.

The objects themselves are cheaper: a mesh costs its triangles once, however many layers it
has, and the preview already loads the objects as shells for its translucent ghost. A new
preference, "Only render solid model when dragging" (off by default), draws those shells
opaque in their filament colours instead of the toolpaths while the user drags.

The visible layer range still holds. The shells are cut at the range's top and bottom through
the gouraud shader's z range, and libvgcode keeps a second index buffer holding just the
range's bottom and top layers, filled in the same walk as the full one, which is drawn
afterwards so that it caps the cut with what was really printed there. Switching between the
two sets is a buffer binding, never a rebuild. The prime tower is added to the shells from its
sliced mesh while the preference is on, positioned as the print placed it; it keeps its opaque
colour and so stays out of the translucent ghost. Supports have no mesh and are not shown.

Dragging is the camera, the navigator or either slider being held; a slider reports it from
ImGui's active id, since its dirty flag is raised and consumed inside one frame. A wheel step
holds the solid model for a 150 ms settle time, with the frame that restores the toolpaths
scheduled for when it runs out. The switch is decided at the top of the frame, before the
cached scene is consulted, and a frame that switches redraws the scene. A drag cut short by
focus or capture loss is ended explicitly, and a button release wakes the idle loop, since on
some platforms no idle event follows it until the next input.

With the preference off, nothing is built and the preview is unchanged.
2026-09-23 12:13:49 +08:00
3433 changed files with 271815 additions and 209930 deletions
-88
View File
@@ -1,88 +0,0 @@
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.
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
shell: bash
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
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"
since="$(gh api "repos/${{ github.repository }}/actions/workflows/ofl-ota-cronjob.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
gh workflow run post_merge_profiles.yml \
--repo "${{ github.repository }}" \
--ref "$branch" \
-f vendor="$VENDOR"
fi
echo "::endgroup::"
done
+8 -52
View File
@@ -5,9 +5,8 @@
# re-sliced on its own to see whether it changes the G-code
# harness - the GUI-vs-CLI parity harness (metrics only, never fails)
# Both test the latest successful build_all.yml Linux AppImage from main, with
# sources checked out at the commit that build was made from; a manual run can
# name another branch, or pin one build by its run id. Nothing here gates a
# build or a PR.
# sources checked out at the commit that build was made from. Nothing here
# gates a build or a PR.
name: Parity Nightly
on:
@@ -21,13 +20,9 @@ on:
required: false
default: "main"
build_branch:
description: "branch whose newest successful build_all artifact to test (a PR build is the PR merged into its base; sources are checked out at the PR head)"
description: "branch whose latest successful build_all artifact to test"
required: false
default: "main"
build_run_id:
description: "build_all run id to test instead of build_branch's newest (same PR caveat)"
required: false
default: ""
fixtures:
description: "harness fixture ids, space-separated (empty = all)"
required: false
@@ -55,53 +50,14 @@ jobs:
env:
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}
BRANCH: ${{ inputs.build_branch || 'main' }}
RUN_ID: ${{ inputs.build_run_id }}
SCHEDULED: ${{ github.event_name == 'schedule' }}
run: |
set -euo pipefail
if [ -n "$RUN_ID" ]; then
[[ $RUN_ID =~ ^[0-9]+$ ]] || { echo "build_run_id must be a numeric run id, got '$RUN_ID'" >&2; exit 1; }
# a pinned build is read directly, not through a search; it must come
# from this repository, because the later jobs check out its commit here
found=$(gh api "repos/$GH_REPO/actions/runs/$RUN_ID" --jq \
'select(.path == ".github/workflows/build_all.yml" and .conclusion == "success"
and .head_repository.full_name == env.GH_REPO)
| "\(.id) \(.head_sha) \(.created_at)"')
[ -n "$found" ] || { echo "run $RUN_ID is not a successful build_all run of $GH_REPO" >&2; exit 1; }
else
# GitHub serves filtered run listings (branch=, status=, head_sha=, ...)
# from a search index that has returned weeks-old results, while the
# unfiltered listing stays current, so list unfiltered and filter here.
# The repository check keeps out fork PRs whose branch has the same
# name. A feature branch is normally built only for its PR, and a PR
# build compiles the PR merged into its base rather than head_sha, so
# a build of the branch itself (push or dispatch) is preferred when
# the same page has one.
pick='([.workflow_runs[] | select(.head_branch == env.BRANCH and .conclusion == "success"
and .head_repository.full_name == env.GH_REPO)]
| map(select(.event != "pull_request"))[0] // .[0])
| select(.) | "\(.id) \(.head_sha) \(.created_at)"'
# a page of 100 runs spans about a day and a half; a manual run may
# target a branch that last built weeks ago
pages=3
if [ "$SCHEDULED" != true ]; then pages=20; fi
found=""
for page in $(seq "$pages"); do
found=$(gh api "repos/$GH_REPO/actions/workflows/build_all.yml/runs?per_page=100&page=$page" --jq "$pick")
if [ -n "$found" ]; then break; fi
done
[ -n "$found" ] || { echo "no successful $BRANCH build among the last $((pages * 100)) build_all runs; pass build_run_id to test an older one" >&2; exit 1; }
fi
read -r run_id head_sha created <<< "$found"
# the nightly fails rather than report on a stale build
if [ "$SCHEDULED" = true ] && [ $(( $(date +%s) - $(date -d "$created" +%s) )) -gt 172800 ]; then
echo "newest $BRANCH build $run_id is from $created, over 48 hours old" >&2
exit 1
fi
printf 'run_id=%s\nhead_sha=%s\n' "$run_id" "$head_sha" >> "$GITHUB_OUTPUT"
gh run list --workflow build_all.yml \
--branch "${{ inputs.build_branch || 'main' }}" \
--status success --limit 1 --json databaseId,headSha \
--jq '"run_id=\(.[0].databaseId)\nhead_sha=\(.[0].headSha)"' \
>> "$GITHUB_OUTPUT"
cat "$GITHUB_OUTPUT"
echo "Testing build [$run_id](https://github.com/$GH_REPO/actions/runs/$run_id) of \`$head_sha\`, built $created" >> "$GITHUB_STEP_SUMMARY"
effect:
name: Override sweep effect stage (shard ${{ matrix.shard }})
+5 -86
View File
@@ -8,12 +8,6 @@ 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.
#
# 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)
@@ -23,25 +17,13 @@ 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/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*.*.*
- release/*
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
permissions:
contents: read
@@ -84,23 +66,8 @@ jobs:
shell: bash
env:
FOLDER_MERGERS: ${{ vars.FOLDER_MERGERS }}
DISPATCH_VENDOR: ${{ github.event_name == 'workflow_dispatch' && inputs.vendor || '' }}
run: |
set -euo pipefail
# 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"
json="resources/profiles/$v.json"
if [ ! -f "$json" ] || { [ ! -d "resources/profiles/$v" ] && ! jq -e '.version' "$json" >/dev/null 2>&1; }; 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
@@ -134,9 +101,6 @@ 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:]]*}"}"
@@ -163,21 +127,19 @@ jobs:
return 1
}
authorized=()
unauthorized=()
for v in "${vendors[@]}"; do
if is_granted "resources/profiles/$v" && is_granted "resources/profiles/$v.json"; then
authorized+=("$v")
else
if ! is_granted "resources/profiles/$v" || ! is_granted "resources/profiles/$v.json"; then
unauthorized+=("$v")
fi
done
if [ "${#unauthorized[@]}" -ne 0 ]; then
echo "::warning::skipping vendor(s) with no FOLDER_MERGERS grant (no asset built or published for them this run): ${unauthorized[*]}"
echo "vendors=" >> "$GITHUB_OUTPUT"
exit 0
fi
echo "vendors=${authorized[*]}" >> "$GITHUB_OUTPUT"
echo "vendors=${vendors[*]}" >> "$GITHUB_OUTPUT"
- name: Resolve Orca version
id: orca
@@ -280,46 +242,3 @@ 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
# Only the explicit-vendor-dispatch path (e.g. the OFL cron) goes live
# automatically. The ordinary push path stays human-gated: assets land on
# the profiles release above, and a maintainer still has to attach a
# changelog and hit Publish in OrcaCloud's OTA Manager for those.
if: steps.vendors.outputs.vendors != '' && github.event_name == 'workflow_dispatch' && inputs.vendor != ''
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
+119
View File
@@ -0,0 +1,119 @@
# G-code preview while dragging
The sliced preview draws every toolpath segment of the plate as an instanced box. On a large
plate that is tens of millions of segments, and the frame is GPU-bound: the cost is the number of
instances drawn, not anything the CPU does per frame. Dragging the camera over such a plate cannot
keep up. The `preview_reduced_detail_mode` preference (*Graphics > G-code Preview*, off by
default) lets the preview draw less while the user drags and put the full toolpaths back when they
let go.
| Preference | Values | Effect |
|---|---|---|
| `preview_reduced_detail_mode` | `off`, `solid`, `layers`, `outer_walls`, `shell` | what is drawn while dragging |
| `preview_reduced_detail_layer_stride` | 120 | one layer in every N is kept by the toolpath modes |
libvgcode (`src/libvgcode`) builds and binds the reduced toolpath set, `GCodeViewer` maps the
preferences onto it and draws the solid model, and `GLCanvas3D` decides when the user is dragging.
The OpenGL ES path keeps a single set and ignores the preference.
## Two sets, one walk
`ViewerImpl::update_enabled_entities()` walks the visible vertex range once and fills two segment
index buffers side by side: the **full** set and the **reduced** set (segments and options).
Building them together is what makes switching free: starting or ending a drag is a buffer
binding, never a rebuild. A change of mode or stride does rebuild. Nothing is built while the mode
is off, and the reduced buffers are then uploaded empty so that the last set does not stay
allocated.
Whatever the mode leaves out, the bottom and top layers of the visible range are kept whole: they
are the faces the range cuts open, and the top is what the user is looking at.
### Modes
- `EndLayersOnly` (`solid` in the preference) keeps only the two end layers. `GCodeViewer` then
draws the sliced objects and the prime tower as opaque solids, see below.
- `LayersOnly` (`layers`) keeps every role of one layer in every stride.
- `OuterWallsOnly` (`outer_walls`) keeps the outer and overhang perimeters of one layer in every
stride. The prime tower and supports have other roles and are left out.
- `ShellOnly` (`shell`) keeps what the shell extraction below marks as visible surface, of one
layer in every stride, plus whatever a view from above or below sees of the skipped layers, so
that a step does not vanish. It is the only mode that knows the prime tower's outside from its
inside.
## The solid model
The preview already loads the sliced objects as shells for its translucent ghost.
`GCodeViewer::render_solid_model()` draws those shells opaque, in their filament colors, with the
`gouraud` shader, whose z range cuts them to the visible layer range. The two toolpath layers of
the reduced set are drawn afterwards and cap the cut with what was really printed there. The
shells hold only the objects, so while this mode is on the prime tower is added from its sliced
mesh, positioned as the print placed it. It is added or removed on its own when the mode changes,
without reloading the objects, keeps its opaque color so that it never appears among the
translucent shells, and stays out of their bounding box. Supports have no mesh and are not shown,
and `load_shells()` drops every non-model-part volume, so a negative volume is not cut out.
A plate whose shells are not loaded keeps drawing toolpaths, since the solid model would leave
only the end layers.
## Shell extraction
`ViewerImpl::update_shell_bitset()` classifies every extrusion segment once per load, on demand
the first time the shell mode needs it, and records the result in four bit sets. It is purely
geometric so that the wipe tower, whose every segment shares one role, works as well as the
objects.
Each layer is rasterized into a coarse 2D **occupancy grid** over the print's footprint: cells
are 0.5 mm, or coarser so that the grid is at most 1024 cells across. The footprint is then
**closed** with a radius of 2.5 mm so that sparse infill and support read as the solid area they
belong to, while holes wider than 5 mm stay open. The closing dilates each 8-connected component
separately and leaves a cell that two components both reach empty, so the gap between two objects
standing close together is never bridged and both of their facing walls stay on the shell;
fragments under eight cells do not spread and are absorbed by whatever reaches them. A separable
erosion shrinks the result back, and the raw cells are OR-ed in again so that a closing never
loses one.
A cell is a **shell cell** when it is filled and any of its six neighbours, four in the layer,
one below, one above, is not. A segment is on the shell when at least half of the cells it
crosses are shell cells: walls run along the shell, infill only touches it at the ends. The
interior infill roles and gap fill are excluded regardless, since short infill segments hugging a
wall would otherwise pass by the thousand.
Two refinements keep sloped surfaces closed:
- **Near-wall segments.** The step between one layer's outer wall and the next is often
narrower than a cell. An inner wall (`Perimeter`) segment whose midpoint lies within a line and
a half of an outer or overhang perimeter of the same layer is kept as well. So is any segment,
whatever its role, whose midpoint lies within that reach, or a cell if larger, of an outer wall
of the layer above or below: that strip is the exposed band of the step, which the cell tests
cannot see when it is narrower than a cell.
- **Top and bottom visibility.** The same pass records the highest and lowest layer occupying
each cell over the whole print. A segment whose layer is the topmost occupant of any cell it
crosses is visible from above, and likewise from below with the lowest. These segments are kept
even when their layer is skipped by the stride.
The layer range is split across up to eight `std::async` workers, each owning its grids. An
allocation failure on a huge print falls back to marking every segment as shell, which leaves out
only the hidden infill roles.
## Deciding that the user is dragging
`GLCanvas3D::_update_preview_interaction()` runs at the top of every preview frame, before the
canvas decides whether to reuse its cached scene, so that the switch lands in that frame. Dragging
is `GLCanvas3D::is_user_interacting()`, the same answer the scene cache reads: the camera, the
navigator, a gizmo, the rectangle selection or either slider being held. A slider reports this from
ImGui's active id rather than its dirty flag, which is raised and consumed inside one frame. A
wheel step has no duration, so it holds the reduced set for a 150 ms settle time instead, and the
frame that restores the toolpaths is scheduled for when that time runs out, since the render timer
only wakes the idle loop. A drag cut short by focus or capture loss is ended explicitly, and a
button release wakes the idle loop, because on some platforms nothing else would until the next
input.
## Reused scene frames
`GLCanvas3D` keeps its last scene pass for frames that only rebuild the overlay (`SceneCache`). Its
key covers the canvas size, the camera and hover state, not what the toolpath sets draw, so a frame
that reuses the scene must never be one on which the set is switched.
`_update_preview_interaction()` therefore reports whether the bound set changed, and a frame on
which it did redraws the scene. The canvas neither captures nor reuses the scene while the user
drags, so no reduced frame outlives a drag, and the frame that ends a wheel's settle time is
requested as a full frame.
+10354 -8806
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 279 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large Load Diff
@@ -3,7 +3,7 @@
"name": "AliZ PA-CF @P1-X1",
"inherits": "AliZ PA-CF @base",
"from": "system",
"setting_id": "cN0uesF0mZf3KSkj",
"setting_id": "AliZ003_00",
"instantiation": "true",
"enable_pressure_advance": [
"1"
@@ -3,7 +3,7 @@
"name": "AliZ PETG @P1-X1",
"inherits": "AliZ PETG @base",
"from": "system",
"setting_id": "cZp23cC4ong9q6dn",
"setting_id": "AliZ001_00",
"instantiation": "true",
"enable_pressure_advance": [
"1"
@@ -3,7 +3,7 @@
"name": "AliZ PETG-CF @P1-X1",
"inherits": "AliZ PETG-CF @base",
"from": "system",
"setting_id": "HWW5mejsB0SfEfWw",
"setting_id": "AZ01-1_00",
"instantiation": "true",
"enable_pressure_advance": [
"1"
@@ -3,7 +3,7 @@
"name": "AliZ PETG-Metal @P1-X1",
"inherits": "AliZ PETG-Metal @base",
"from": "system",
"setting_id": "JqD0blE4fxaNfXqB",
"setting_id": "AZ01-2_00",
"instantiation": "true",
"enable_pressure_advance": [
"1"
@@ -3,7 +3,7 @@
"name": "AliZ PLA @P1-X1",
"inherits": "AliZ PLA @base",
"from": "system",
"setting_id": "fRELapY8YiP4qrBW",
"setting_id": "AliZ002_00",
"instantiation": "true",
"enable_pressure_advance": [
"1"
@@ -3,7 +3,7 @@
"name": "BETA ABS @BBL A1",
"inherits": "BETA ABS @base",
"from": "system",
"setting_id": "dUGRrmxU89pRaJ2Z",
"setting_id": "BABB00_07",
"instantiation": "true",
"fan_max_speed": [
"20"
@@ -3,7 +3,7 @@
"name": "BETA ABS @BBL H2D",
"inherits": "BETA ABS @base",
"from": "system",
"setting_id": "oxZKTEMd8TpyoH39",
"setting_id": "BABB00_11",
"instantiation": "true",
"chamber_temperatures": [
"65"
@@ -3,7 +3,7 @@
"name": "BETA ABS @BBL P1P",
"inherits": "BETA ABS @base",
"from": "system",
"setting_id": "MPYyfCKMsJZy8GaY",
"setting_id": "BABB00_03",
"instantiation": "true",
"fan_max_speed": [
"20"
@@ -3,7 +3,7 @@
"name": "BETA ABS @BBL X1C",
"inherits": "BETA ABS @base",
"from": "system",
"setting_id": "vMA7EhgNDT4MwMRr",
"setting_id": "BABB00",
"instantiation": "true",
"fan_max_speed": [
"60"
@@ -0,0 +1,21 @@
{
"type": "filament",
"name": "BETA ABS @base",
"inherits": "fdm_filament_abs",
"from": "system",
"filament_id": "OFjUXn67",
"instantiation": "false",
"description": "When printing this filament, there's a risk of warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials.",
"filament_cost": [
"24.99"
],
"filament_flow_ratio": [
"0.95"
],
"filament_vendor": [
"BETA"
],
"impact_strength_z": [
"7.4"
]
}
@@ -3,7 +3,7 @@
"name": "BETA ASA @BBL A1 0.4 nozzle",
"inherits": "BETA ASA @base",
"from": "system",
"setting_id": "LevRG7t9mTlEseaB",
"setting_id": "BASB00_09",
"instantiation": "true",
"chamber_temperatures": [
"60"
@@ -3,7 +3,7 @@
"name": "BETA ASA @BBL H2D 0.4 nozzle",
"inherits": "BETA ASA @base",
"from": "system",
"setting_id": "3NBkWTXmqi8eRUhi",
"setting_id": "BASB00_13",
"instantiation": "true",
"chamber_temperatures": [
"65"
@@ -3,7 +3,7 @@
"name": "BETA ASA @BBL X1C 0.4 nozzle",
"inherits": "BETA ASA @base",
"from": "system",
"setting_id": "0nWTEZkH7NKXgCib",
"setting_id": "BASB00_02",
"instantiation": "true",
"chamber_temperatures": [
"60"
@@ -53,53 +53,5 @@
],
"textured_plate_temp_initial_layer": [
"100"
],
"activate_air_filtration": [
"1"
],
"close_additional_fan_first_x_layers": [
"3"
],
"retraction_distances_when_ec": [
"0"
],
"slow_down_min_speed": [
"20"
],
"temperature_vitrification": [
"100"
],
"filament_start_gcode": [
"; Filament gcode\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}"
],
"filament_end_gcode": [
"; filament end gcode \n\n"
],
"volumetric_speed_coefficients": [
"0 0 0 0 0 0"
],
"filament_adhesiveness_category": [
"200"
],
"filament_dev_ams_drying_time": [
"12",
"8.0",
"12",
"8.0"
],
"filament_dev_ams_drying_heat_distortion_temperature": [
"100"
],
"filament_dev_drying_cooling_temperature": [
"85"
],
"filament_dev_ams_drying_temperature": [
"65",
"80",
"65",
"80"
],
"filament_dev_drying_softening_temperature": [
"85"
]
}
@@ -3,7 +3,7 @@
"name": "BETA HIPS @BBL H2D",
"inherits": "BETA HIPS @base",
"from": "system",
"setting_id": "9nN2uWxlYH1c507A",
"setting_id": "BHIB00_06",
"instantiation": "true",
"filament_deretraction_speed": [
"nil",
@@ -3,7 +3,7 @@
"name": "BETA HIPS @BBL X1C",
"inherits": "BETA HIPS @base",
"from": "system",
"setting_id": "mTcT8sCciWyX5enc",
"setting_id": "BHIB00_00",
"instantiation": "true",
"filament_max_volumetric_speed": [
"8",
@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "BETA HIPS @base",
"inherits": "fdm_filament_hips",
"from": "system",
"filament_id": "OFlmxlDG",
"instantiation": "false",
"filament_is_support": [
"1"
],
"filament_vendor": [
"BETA"
]
}
@@ -3,7 +3,7 @@
"name": "BETA PAHT-CF @BBL H2D",
"inherits": "BETA PAHT-CF @base",
"from": "system",
"setting_id": "YbYCVQd5IR0sQR8S",
"setting_id": "BPAB00_01",
"instantiation": "true",
"chamber_temperatures": [
"60"
@@ -3,7 +3,7 @@
"name": "BETA PAHT-CF @BBL P1P",
"inherits": "BETA PAHT-CF @base",
"from": "system",
"setting_id": "5O5fzmFrT3O1k1H0",
"setting_id": "BPAB00_10",
"instantiation": "true",
"filament_flow_ratio": [
"0.96",
@@ -3,7 +3,7 @@
"name": "BETA PAHT-CF @BBL X1C",
"inherits": "BETA PAHT-CF @base",
"from": "system",
"setting_id": "gB5HLYTDCooFy2W5",
"setting_id": "BPAB00",
"instantiation": "true",
"chamber_temperatures": [
"60"
@@ -0,0 +1,48 @@
{
"type": "filament",
"name": "BETA PAHT-CF @base",
"inherits": "fdm_filament_pa",
"from": "system",
"filament_id": "OF6qw3Wb",
"instantiation": "false",
"description": "When printing this filament, there's a risk of nozzle clogging, oozing, warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials.",
"fan_cooling_layer_time": [
"5"
],
"fan_max_speed": [
"30"
],
"fan_min_speed": [
"10"
],
"filament_cost": [
"94.99"
],
"filament_density": [
"1.06"
],
"filament_flow_ratio": [
"0.96"
],
"filament_type": [
"PA-CF"
],
"filament_vendor": [
"BETA"
],
"full_fan_speed_layer": [
"2"
],
"impact_strength_z": [
"13.3"
],
"overhang_fan_speed": [
"40"
],
"overhang_fan_threshold": [
"0%"
],
"temperature_vitrification": [
"180"
]
}
@@ -3,7 +3,7 @@
"name": "BETA PEBA 90A @BBL A1",
"inherits": "BETA PEBA 90A @base",
"from": "system",
"setting_id": "A57Sbar56Ah1NiU7",
"setting_id": "BPBB00_04",
"instantiation": "true",
"filament_density": [
"1.22"
@@ -3,7 +3,7 @@
"name": "BETA PEBA 90A @BBL A1M",
"inherits": "BETA PEBA 90A @base",
"from": "system",
"setting_id": "OoLkWS147R0AasZc",
"setting_id": "BPBB00_05",
"instantiation": "true",
"filament_density": [
"1.22"
@@ -3,7 +3,7 @@
"name": "BETA PEBA 90A @BBL H2D",
"inherits": "BETA PEBA 90A @base",
"from": "system",
"setting_id": "91b8WTzvOky9wAVK",
"setting_id": "BPBB00_02",
"instantiation": "true",
"additional_cooling_fan_speed": [
"100"
@@ -3,7 +3,7 @@
"name": "BETA PEBA 90A @BBL P1P",
"inherits": "BETA PEBA 90A @base",
"from": "system",
"setting_id": "ydudEBLRmj1WSXqB",
"setting_id": "BPBB00_01",
"instantiation": "true",
"filament_max_volumetric_speed": [
"2.8",
@@ -3,7 +3,7 @@
"name": "BETA PEBA 90A @BBL X1C",
"inherits": "BETA PEBA 90A @base",
"from": "system",
"setting_id": "F1hTal3M92tBjv2N",
"setting_id": "BPBB00_00",
"instantiation": "true",
"filament_max_volumetric_speed": [
"2.8",
@@ -0,0 +1,33 @@
{
"type": "filament",
"name": "BETA PEBA 90A @base",
"inherits": "fdm_filament_tpu",
"from": "system",
"filament_id": "OFI2MKy7",
"instantiation": "false",
"description": "This filament is too soft and not compatible with the AMS. Printing it is of many requirements, and to get better printing quality, please refer to this wiki: TPU printing guide.",
"filament_cost": [
"59.99"
],
"filament_max_volumetric_speed": [
"2.8"
],
"filament_vendor": [
"BETA"
],
"impact_strength_z": [
"87.3"
],
"nozzle_temperature": [
"225"
],
"nozzle_temperature_initial_layer": [
"225"
],
"nozzle_temperature_range_high": [
"240"
],
"slow_down_layer_time": [
"14"
]
}
@@ -3,7 +3,7 @@
"name": "BETA PETG @BBL A1",
"inherits": "BETA PETG @base",
"from": "system",
"setting_id": "EpYzxZwVHvLaseku",
"setting_id": "BPGB00_06",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG @BBL A1M 0.4 nozzle",
"inherits": "BETA PETG @base",
"from": "system",
"setting_id": "5V0hyhzFoDU8Tfwm",
"setting_id": "BPGB00_03",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG @BBL H2D 0.4 nozzle",
"inherits": "BETA PETG @base",
"from": "system",
"setting_id": "KnKvUsD4rSpQU413",
"setting_id": "BPGB00_09",
"instantiation": "true",
"fan_max_speed": [
"30"
@@ -3,7 +3,7 @@
"name": "BETA PETG @BBL X1C",
"inherits": "BETA PETG @base",
"from": "system",
"setting_id": "uM6wHdt0N5ftZRge",
"setting_id": "BPGB00_01",
"instantiation": "true",
"fan_min_speed": [
"20"
@@ -92,48 +92,5 @@
],
"filament_start_gcode": [
"; filament start gcode\n{if (bed_temperature[current_extruder] >80)||(bed_temperature_initial_layer[current_extruder] >80)}M106 P3 S255\n{elsif (bed_temperature[current_extruder] >60)||(bed_temperature_initial_layer[current_extruder] >60)}M106 P3 S180\n{endif}\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}"
],
"close_additional_fan_first_x_layers": [
"3"
],
"retraction_distances_when_ec": [
"0"
],
"filament_end_gcode": [
"; filament end gcode \n\n"
],
"volumetric_speed_coefficients": [
"0 0 0 0 0 0"
],
"filament_adhesiveness_category": [
"300"
],
"filament_dev_chamber_drying_bed_temperature": [
"80"
],
"filament_dev_ams_drying_time": [
"12",
"12",
"12",
"12"
],
"filament_dev_ams_drying_ams_limitations": [
"1",
"0"
],
"filament_dev_ams_drying_heat_distortion_temperature": [
"75"
],
"filament_dev_drying_cooling_temperature": [
"55"
],
"filament_dev_ams_drying_temperature": [
"65",
"65",
"55",
"55"
],
"filament_dev_drying_softening_temperature": [
"60"
]
}
@@ -3,7 +3,7 @@
"name": "BETA PETG Fluorescence @BBL A1",
"inherits": "BETA PETG Fluorescence @base",
"from": "system",
"setting_id": "ZtyTtAWsZnLGsM0O",
"setting_id": "BPGB02_06",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG Fluorescence @BBL A1M 0.4 nozzle",
"inherits": "BETA PETG Fluorescence @base",
"from": "system",
"setting_id": "VUSunTT0OJa7iOSd",
"setting_id": "BPGB02_03",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG Fluorescence @BBL H2D 0.4 nozzle",
"inherits": "BETA PETG Fluorescence @base",
"from": "system",
"setting_id": "JHg4y0pxAOtoJSuw",
"setting_id": "BPGB02_09",
"instantiation": "true",
"fan_max_speed": [
"30"
@@ -3,7 +3,7 @@
"name": "BETA PETG Fluorescence @BBL X1C",
"inherits": "BETA PETG Fluorescence @base",
"from": "system",
"setting_id": "pCetfFvyLLw3vS2j",
"setting_id": "BPGB02_01",
"instantiation": "true",
"fan_min_speed": [
"20"
@@ -92,48 +92,5 @@
],
"filament_start_gcode": [
"; filament start gcode\n{if (bed_temperature[current_extruder] >80)||(bed_temperature_initial_layer[current_extruder] >80)}M106 P3 S255\n{elsif (bed_temperature[current_extruder] >60)||(bed_temperature_initial_layer[current_extruder] >60)}M106 P3 S180\n{endif}\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}"
],
"close_additional_fan_first_x_layers": [
"3"
],
"retraction_distances_when_ec": [
"0"
],
"filament_end_gcode": [
"; filament end gcode \n\n"
],
"volumetric_speed_coefficients": [
"0 0 0 0 0 0"
],
"filament_adhesiveness_category": [
"300"
],
"filament_dev_chamber_drying_bed_temperature": [
"80"
],
"filament_dev_ams_drying_time": [
"12",
"12",
"12",
"12"
],
"filament_dev_ams_drying_ams_limitations": [
"1",
"0"
],
"filament_dev_ams_drying_heat_distortion_temperature": [
"75"
],
"filament_dev_drying_cooling_temperature": [
"55"
],
"filament_dev_ams_drying_temperature": [
"65",
"65",
"55",
"55"
],
"filament_dev_drying_softening_temperature": [
"60"
]
}
@@ -3,7 +3,7 @@
"name": "BETA PETG Glitter @BBL A1",
"inherits": "BETA PETG Glitter @base",
"from": "system",
"setting_id": "cz5dC7OrXDlX1Ctj",
"setting_id": "BPGB03_06",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG Glitter @BBL A1M 0.4 nozzle",
"inherits": "BETA PETG Glitter @base",
"from": "system",
"setting_id": "PozWnOfZ2l7HqTpx",
"setting_id": "BPGB03_03",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG Glitter @BBL H2D 0.4 nozzle",
"inherits": "BETA PETG Glitter @base",
"from": "system",
"setting_id": "ijW4zvNAQ3DIK984",
"setting_id": "BPGB03_09",
"instantiation": "true",
"fan_max_speed": [
"30"
@@ -3,7 +3,7 @@
"name": "BETA PETG Glitter @BBL X1C",
"inherits": "BETA PETG Glitter @base",
"from": "system",
"setting_id": "UI220qldPoLY8VZN",
"setting_id": "BPGB03_01",
"instantiation": "true",
"fan_min_speed": [
"20"
@@ -92,48 +92,5 @@
],
"filament_start_gcode": [
"; filament start gcode\n{if (bed_temperature[current_extruder] >80)||(bed_temperature_initial_layer[current_extruder] >80)}M106 P3 S255\n{elsif (bed_temperature[current_extruder] >60)||(bed_temperature_initial_layer[current_extruder] >60)}M106 P3 S180\n{endif}\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}"
],
"close_additional_fan_first_x_layers": [
"3"
],
"retraction_distances_when_ec": [
"0"
],
"filament_end_gcode": [
"; filament end gcode \n\n"
],
"volumetric_speed_coefficients": [
"0 0 0 0 0 0"
],
"filament_adhesiveness_category": [
"300"
],
"filament_dev_chamber_drying_bed_temperature": [
"80"
],
"filament_dev_ams_drying_time": [
"12",
"12",
"12",
"12"
],
"filament_dev_ams_drying_ams_limitations": [
"1",
"0"
],
"filament_dev_ams_drying_heat_distortion_temperature": [
"75"
],
"filament_dev_drying_cooling_temperature": [
"55"
],
"filament_dev_ams_drying_temperature": [
"65",
"65",
"55",
"55"
],
"filament_dev_drying_softening_temperature": [
"60"
]
}
@@ -3,7 +3,7 @@
"name": "BETA PETG Glow @BBL A1",
"inherits": "BETA PETG Glow @base",
"from": "system",
"setting_id": "LudMQeiSJOLw0Aoy",
"setting_id": "BPGB04_06",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG Glow @BBL A1M 0.4 nozzle",
"inherits": "BETA PETG Glow @base",
"from": "system",
"setting_id": "cl1Rl9hgrahhhSd3",
"setting_id": "BPGB04_03",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG Glow @BBL H2D 0.4 nozzle",
"inherits": "BETA PETG Glow @base",
"from": "system",
"setting_id": "3s9w3mH6M4OdbrUV",
"setting_id": "BPGB04_09",
"instantiation": "true",
"fan_max_speed": [
"30"
@@ -3,7 +3,7 @@
"name": "BETA PETG Glow @BBL X1C",
"inherits": "BETA PETG Glow @base",
"from": "system",
"setting_id": "wv5FRKdnsHaIFA7L",
"setting_id": "BPGB04_01",
"instantiation": "true",
"fan_min_speed": [
"20"
@@ -92,48 +92,5 @@
],
"filament_start_gcode": [
"; filament start gcode\n{if (bed_temperature[current_extruder] >80)||(bed_temperature_initial_layer[current_extruder] >80)}M106 P3 S255\n{elsif (bed_temperature[current_extruder] >60)||(bed_temperature_initial_layer[current_extruder] >60)}M106 P3 S180\n{endif}\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}"
],
"close_additional_fan_first_x_layers": [
"3"
],
"retraction_distances_when_ec": [
"0"
],
"filament_end_gcode": [
"; filament end gcode \n\n"
],
"volumetric_speed_coefficients": [
"0 0 0 0 0 0"
],
"filament_adhesiveness_category": [
"300"
],
"filament_dev_chamber_drying_bed_temperature": [
"80"
],
"filament_dev_ams_drying_time": [
"12",
"12",
"12",
"12"
],
"filament_dev_ams_drying_ams_limitations": [
"1",
"0"
],
"filament_dev_ams_drying_heat_distortion_temperature": [
"75"
],
"filament_dev_drying_cooling_temperature": [
"55"
],
"filament_dev_ams_drying_temperature": [
"65",
"65",
"55",
"55"
],
"filament_dev_drying_softening_temperature": [
"60"
]
}
@@ -3,7 +3,7 @@
"name": "BETA PETG Gradient @BBL A1",
"inherits": "BETA PETG Gradient @base",
"from": "system",
"setting_id": "L3hZggzEZUgUv0Qv",
"setting_id": "BPGB05_06",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG Gradient @BBL A1M 0.4 nozzle",
"inherits": "BETA PETG Gradient @base",
"from": "system",
"setting_id": "zsITnsNFRG7IE6sR",
"setting_id": "BPGB05_03",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG Gradient @BBL H2D 0.4 nozzle",
"inherits": "BETA PETG Gradient @base",
"from": "system",
"setting_id": "GqmCuPg6baUxeoYS",
"setting_id": "BPGB05_09",
"instantiation": "true",
"fan_max_speed": [
"30"
@@ -3,7 +3,7 @@
"name": "BETA PETG Gradient @BBL X1C",
"inherits": "BETA PETG Gradient @base",
"from": "system",
"setting_id": "oYJjUiaCI4UBZ0ur",
"setting_id": "BPGB05_01",
"instantiation": "true",
"fan_min_speed": [
"20"
@@ -92,48 +92,5 @@
],
"filament_start_gcode": [
"; filament start gcode\n{if (bed_temperature[current_extruder] >80)||(bed_temperature_initial_layer[current_extruder] >80)}M106 P3 S255\n{elsif (bed_temperature[current_extruder] >60)||(bed_temperature_initial_layer[current_extruder] >60)}M106 P3 S180\n{endif}\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}"
],
"close_additional_fan_first_x_layers": [
"3"
],
"retraction_distances_when_ec": [
"0"
],
"filament_end_gcode": [
"; filament end gcode \n\n"
],
"volumetric_speed_coefficients": [
"0 0 0 0 0 0"
],
"filament_adhesiveness_category": [
"300"
],
"filament_dev_chamber_drying_bed_temperature": [
"80"
],
"filament_dev_ams_drying_time": [
"12",
"12",
"12",
"12"
],
"filament_dev_ams_drying_ams_limitations": [
"1",
"0"
],
"filament_dev_ams_drying_heat_distortion_temperature": [
"75"
],
"filament_dev_drying_cooling_temperature": [
"55"
],
"filament_dev_ams_drying_temperature": [
"65",
"65",
"55",
"55"
],
"filament_dev_drying_softening_temperature": [
"60"
]
}
@@ -3,7 +3,7 @@
"name": "BETA PETG HF @BBL A1",
"inherits": "BETA PETG HF @base",
"from": "system",
"setting_id": "T2Ea25pM2u9BM7Oa",
"setting_id": "BPGB06_03",
"instantiation": "true",
"fan_cooling_layer_time": [
"15"
@@ -3,7 +3,7 @@
"name": "BETA PETG HF @BBL A1M",
"inherits": "BETA PETG HF @base",
"from": "system",
"setting_id": "nO5R86dkDle1m5Pq",
"setting_id": "BPGB06_06",
"instantiation": "true",
"fan_cooling_layer_time": [
"15"
@@ -3,7 +3,7 @@
"name": "BETA PETG HF @BBL H2D 0.4 nozzle",
"inherits": "BETA PETG HF @base",
"from": "system",
"setting_id": "YOBguayM9PiwkpfT",
"setting_id": "BPGB06_09",
"instantiation": "true",
"counter_coef_2": [
"0.007"
@@ -3,7 +3,7 @@
"name": "BETA PETG HF @BBL X1C",
"inherits": "BETA PETG HF @base",
"from": "system",
"setting_id": "EG3h0IHVO1yyVNMs",
"setting_id": "BPGB06_00",
"instantiation": "true",
"fan_cooling_layer_time": [
"20"
@@ -85,48 +85,5 @@
],
"filament_start_gcode": [
"; filament start gcode\n{if (bed_temperature[current_extruder] >80)||(bed_temperature_initial_layer[current_extruder] >80)}M106 P3 S255\n{elsif (bed_temperature[current_extruder] >60)||(bed_temperature_initial_layer[current_extruder] >60)}M106 P3 S180\n{endif}\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}"
],
"close_additional_fan_first_x_layers": [
"3"
],
"retraction_distances_when_ec": [
"0"
],
"filament_end_gcode": [
"; filament end gcode \n\n"
],
"volumetric_speed_coefficients": [
"0 0 0 0 0 0"
],
"filament_adhesiveness_category": [
"300"
],
"filament_dev_chamber_drying_bed_temperature": [
"80"
],
"filament_dev_ams_drying_time": [
"12",
"12",
"12",
"12"
],
"filament_dev_ams_drying_ams_limitations": [
"1",
"0"
],
"filament_dev_ams_drying_heat_distortion_temperature": [
"75"
],
"filament_dev_drying_cooling_temperature": [
"55"
],
"filament_dev_ams_drying_temperature": [
"65",
"65",
"55",
"55"
],
"filament_dev_drying_softening_temperature": [
"60"
]
}
@@ -3,7 +3,7 @@
"name": "BETA PETG Heat Color Change @BBL A1",
"inherits": "BETA PETG Heat Color Change @base",
"from": "system",
"setting_id": "ZhHASdXFywqbRuBf",
"setting_id": "BPGB01_06",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG Heat Color Change @BBL A1M 0.4 nozzle",
"inherits": "BETA PETG Heat Color Change @base",
"from": "system",
"setting_id": "YiFgzCJDAOW9YSjZ",
"setting_id": "BPGB01_03",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG Heat Color Change @BBL H2D 0.4 nozzle",
"inherits": "BETA PETG Heat Color Change @base",
"from": "system",
"setting_id": "DpWgpTiKdm70Xt1i",
"setting_id": "BPGB01_09",
"instantiation": "true",
"fan_max_speed": [
"30"
@@ -3,7 +3,7 @@
"name": "BETA PETG Heat Color Change @BBL X1C",
"inherits": "BETA PETG Heat Color Change @base",
"from": "system",
"setting_id": "3lJe6ftSHQDkQZ1S",
"setting_id": "BPGB01_01",
"instantiation": "true",
"fan_min_speed": [
"20"
@@ -92,48 +92,5 @@
],
"filament_start_gcode": [
"; filament start gcode\n{if (bed_temperature[current_extruder] >80)||(bed_temperature_initial_layer[current_extruder] >80)}M106 P3 S255\n{elsif (bed_temperature[current_extruder] >60)||(bed_temperature_initial_layer[current_extruder] >60)}M106 P3 S180\n{endif}\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}"
],
"close_additional_fan_first_x_layers": [
"3"
],
"retraction_distances_when_ec": [
"0"
],
"filament_end_gcode": [
"; filament end gcode \n\n"
],
"volumetric_speed_coefficients": [
"0 0 0 0 0 0"
],
"filament_adhesiveness_category": [
"300"
],
"filament_dev_chamber_drying_bed_temperature": [
"80"
],
"filament_dev_ams_drying_time": [
"12",
"12",
"12",
"12"
],
"filament_dev_ams_drying_ams_limitations": [
"1",
"0"
],
"filament_dev_ams_drying_heat_distortion_temperature": [
"75"
],
"filament_dev_drying_cooling_temperature": [
"55"
],
"filament_dev_ams_drying_temperature": [
"65",
"65",
"55",
"55"
],
"filament_dev_drying_softening_temperature": [
"60"
]
}
@@ -3,7 +3,7 @@
"name": "BETA PETG Marble @BBL A1",
"inherits": "BETA PETG Marble @base",
"from": "system",
"setting_id": "tSCDuE4dE44PyIwb",
"setting_id": "BPGB07_06",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG Marble @BBL A1M 0.4 nozzle",
"inherits": "BETA PETG Marble @base",
"from": "system",
"setting_id": "n6dguOo5ZleD6Ec4",
"setting_id": "BPGB07_03",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG Marble @BBL H2D 0.4 nozzle",
"inherits": "BETA PETG Marble @base",
"from": "system",
"setting_id": "RxCTxdvym4iNOB5j",
"setting_id": "BPGB07_09",
"instantiation": "true",
"fan_max_speed": [
"30"
@@ -3,7 +3,7 @@
"name": "BETA PETG Marble @BBL X1C",
"inherits": "BETA PETG Marble @base",
"from": "system",
"setting_id": "3BgsPAgilo1MgtOV",
"setting_id": "BPGB07_01",
"instantiation": "true",
"fan_min_speed": [
"20"
@@ -92,48 +92,5 @@
],
"filament_start_gcode": [
"; filament start gcode\n{if (bed_temperature[current_extruder] >80)||(bed_temperature_initial_layer[current_extruder] >80)}M106 P3 S255\n{elsif (bed_temperature[current_extruder] >60)||(bed_temperature_initial_layer[current_extruder] >60)}M106 P3 S180\n{endif}\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}"
],
"close_additional_fan_first_x_layers": [
"3"
],
"retraction_distances_when_ec": [
"0"
],
"filament_end_gcode": [
"; filament end gcode \n\n"
],
"volumetric_speed_coefficients": [
"0 0 0 0 0 0"
],
"filament_adhesiveness_category": [
"300"
],
"filament_dev_chamber_drying_bed_temperature": [
"80"
],
"filament_dev_ams_drying_time": [
"12",
"12",
"12",
"12"
],
"filament_dev_ams_drying_ams_limitations": [
"1",
"0"
],
"filament_dev_ams_drying_heat_distortion_temperature": [
"75"
],
"filament_dev_drying_cooling_temperature": [
"55"
],
"filament_dev_ams_drying_temperature": [
"65",
"65",
"55",
"55"
],
"filament_dev_drying_softening_temperature": [
"60"
]
}
@@ -3,7 +3,7 @@
"name": "BETA PETG Matte @BBL A1",
"inherits": "BETA PETG Matte @base",
"from": "system",
"setting_id": "zYkrzQk11C98R31F",
"setting_id": "BPGB08_06",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG Matte @BBL A1M 0.4 nozzle",
"inherits": "BETA PETG Matte @base",
"from": "system",
"setting_id": "rzX5oP4037Ex5Chh",
"setting_id": "BPGB08_03",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG Matte @BBL H2D 0.4 nozzle",
"inherits": "BETA PETG Matte @base",
"from": "system",
"setting_id": "sqz8Vluq7GMd3siv",
"setting_id": "BPGB08_09",
"instantiation": "true",
"fan_max_speed": [
"30"
@@ -3,7 +3,7 @@
"name": "BETA PETG Matte @BBL X1C",
"inherits": "BETA PETG Matte @base",
"from": "system",
"setting_id": "NXgqYCqHeVCgFF3I",
"setting_id": "BPGB08_01",
"instantiation": "true",
"fan_min_speed": [
"20"
@@ -92,48 +92,5 @@
],
"filament_start_gcode": [
"; filament start gcode\n{if (bed_temperature[current_extruder] >80)||(bed_temperature_initial_layer[current_extruder] >80)}M106 P3 S255\n{elsif (bed_temperature[current_extruder] >60)||(bed_temperature_initial_layer[current_extruder] >60)}M106 P3 S180\n{endif}\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}"
],
"close_additional_fan_first_x_layers": [
"3"
],
"retraction_distances_when_ec": [
"0"
],
"filament_end_gcode": [
"; filament end gcode \n\n"
],
"volumetric_speed_coefficients": [
"0 0 0 0 0 0"
],
"filament_adhesiveness_category": [
"300"
],
"filament_dev_chamber_drying_bed_temperature": [
"80"
],
"filament_dev_ams_drying_time": [
"12",
"12",
"12",
"12"
],
"filament_dev_ams_drying_ams_limitations": [
"1",
"0"
],
"filament_dev_ams_drying_heat_distortion_temperature": [
"75"
],
"filament_dev_drying_cooling_temperature": [
"55"
],
"filament_dev_ams_drying_temperature": [
"65",
"65",
"55",
"55"
],
"filament_dev_drying_softening_temperature": [
"60"
]
}
@@ -3,7 +3,7 @@
"name": "BETA PETG Metallic @BBL A1",
"inherits": "BETA PETG Metallic @base",
"from": "system",
"setting_id": "1baUIJ3P8n6DcyRc",
"setting_id": "BPGB09_06",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG Metallic @BBL A1M 0.4 nozzle",
"inherits": "BETA PETG Metallic @base",
"from": "system",
"setting_id": "LMsVDqsChBksLNqL",
"setting_id": "BPGB09_03",
"instantiation": "true",
"fan_max_speed": [
"50"

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