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
913 changed files with 8234 additions and 15414 deletions
+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 }})
+1 -42
View File
@@ -826,37 +826,6 @@ find_package(OpenSSL REQUIRED)
find_package(CURL REQUIRED)
find_package(Freetype REQUIRED)
if (SLIC3R_GUI)
# LibDataChannel's installed export references its bundled dependencies,
# but does not install their CMake targets. Recreate those targets from
# the same dependency prefix before loading the LibDataChannel config.
if (NOT TARGET Usrsctp::usrsctp)
find_library(_ORCA_USRSCTP_LIBRARY NAMES usrsctp
PATHS "${CMAKE_PREFIX_PATH}/lib" NO_DEFAULT_PATH)
if (_ORCA_USRSCTP_LIBRARY)
add_library(Usrsctp::usrsctp UNKNOWN IMPORTED GLOBAL)
set_target_properties(Usrsctp::usrsctp PROPERTIES
IMPORTED_LOCATION "${_ORCA_USRSCTP_LIBRARY}"
IMPORTED_LINK_INTERFACE_LANGUAGES C
INTERFACE_LINK_LIBRARIES "Threads::Threads")
endif()
endif()
if (NOT TARGET LibJuice::LibJuice)
find_library(_ORCA_LIBJUICE_LIBRARY NAMES juice
PATHS "${CMAKE_PREFIX_PATH}/lib" NO_DEFAULT_PATH)
if (_ORCA_LIBJUICE_LIBRARY)
add_library(LibJuice::LibJuice UNKNOWN IMPORTED GLOBAL)
set_target_properties(LibJuice::LibJuice PROPERTIES
IMPORTED_LOCATION "${_ORCA_LIBJUICE_LIBRARY}"
IMPORTED_LINK_INTERFACE_LANGUAGES C
INTERFACE_LINK_LIBRARIES "Threads::Threads")
endif()
endif()
find_package(LibDataChannel CONFIG REQUIRED)
endif()
add_library(libcurl INTERFACE)
target_link_libraries(libcurl INTERFACE CURL::libcurl)
@@ -1137,7 +1106,6 @@ function(orcaslicer_copy_dlls target config postfix output_dlls)
endif ()
file(COPY ${_occt_dlls}
${CMAKE_PREFIX_PATH}/bin/freetype.dll
${CMAKE_PREFIX_PATH}/bin/avformat-61.dll
${CMAKE_PREFIX_PATH}/bin/avcodec-61.dll
${CMAKE_PREFIX_PATH}/bin/swresample-5.dll
${CMAKE_PREFIX_PATH}/bin/swscale-8.dll
@@ -1150,7 +1118,6 @@ function(orcaslicer_copy_dlls target config postfix output_dlls)
${_out_dir}/WebView2Loader.dll
${_out_dir}/freetype.dll
${_out_dir}/avformat-61.dll
${_out_dir}/avcodec-61.dll
${_out_dir}/swresample-5.dll
${_out_dir}/swscale-8.dll
@@ -1174,10 +1141,7 @@ function(orcaslicer_copy_sos target config postfix output_sos)
set(_out_dir "${CMAKE_CURRENT_BINARY_DIR}")
endif ()
file(COPY ${CMAKE_PREFIX_PATH}/lib/libavformat.so
${CMAKE_PREFIX_PATH}/lib/libavformat.so.61
${CMAKE_PREFIX_PATH}/lib/libavformat.so.61.1.100
${CMAKE_PREFIX_PATH}/lib/libavcodec.so
file(COPY ${CMAKE_PREFIX_PATH}/lib/libavcodec.so
${CMAKE_PREFIX_PATH}/lib/libavcodec.so.61
${CMAKE_PREFIX_PATH}/lib/libavcodec.so.61.3.100
${CMAKE_PREFIX_PATH}/lib/libavutil.so
@@ -1192,9 +1156,6 @@ function(orcaslicer_copy_sos target config postfix output_sos)
DESTINATION ${_out_dir})
set(${output_sos}
${_out_dir}/libavformat.so
${_out_dir}/libavformat.so.61
${_out_dir}/libavformat.so.61.1.100
${_out_dir}/libavcodec.so
${_out_dir}/libavcodec.so.61
${_out_dir}/libavcodec.so.61.3.100
@@ -1324,8 +1285,6 @@ endif ()
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(LIBRARY_FILES
${LIBDIR_BIN}/libavformat.so.61
${LIBDIR_BIN}/libavformat.so.61.1.100
${LIBDIR_BIN}/libavcodec.so.61
${LIBDIR_BIN}/libavcodec.so.61.3.100
${LIBDIR_BIN}/libavutil.so.59
+11 -23
View File
@@ -156,7 +156,7 @@ if (NOT _is_multi AND NOT CMAKE_BUILD_TYPE)
endif ()
function(orcaslicer_add_cmake_project projectname)
cmake_parse_arguments(P_ARGS "FORWARD_CONFIG" "INSTALL_DIR;BUILD_COMMAND;INSTALL_COMMAND;SOURCE_DIR" "CMAKE_ARGS" ${ARGN})
cmake_parse_arguments(P_ARGS "FORWARD_CONFIG" "INSTALL_DIR;BUILD_COMMAND;INSTALL_COMMAND" "CMAKE_ARGS" ${ARGN})
# MSVC is true for clang-cl as well, so the sub-build toolchain has to key on the
# generator. A non-Visual-Studio superbuild passes its own generator down, and with
@@ -202,18 +202,12 @@ function(orcaslicer_add_cmake_project projectname)
set(_build_j "-j${NPROC}")
endif ()
set(_source_dir_arg "")
if (P_ARGS_SOURCE_DIR)
set(_source_dir_arg SOURCE_DIR ${P_ARGS_SOURCE_DIR})
endif ()
if (NOT IS_CROSS_COMPILE OR NOT APPLE)
ExternalProject_Add(
dep_${projectname}
EXCLUDE_FROM_ALL ON
INSTALL_DIR ${DESTDIR}
DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/${projectname}
${_source_dir_arg}
${_gen}
CMAKE_ARGS
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
@@ -246,14 +240,12 @@ if (NOT IS_CROSS_COMPILE OR NOT APPLE)
# note for future devs: shared libs may actually create a size reduction
# but orcaslicer_deps tends to get really funny regarding linking after that (notably boost)
# so, as much as I would like to use that, it's not happening
if (NOT P_ARGS_SOURCE_DIR)
ExternalProject_Add_Step(dep_${projectname} free_download_space
DEPENDEES download # do after download
COMMENT "Freeing Space: Removing source archive"
WORKING_DIRECTORY ${DEP_DOWNLOAD_DIR}
COMMAND ${CMAKE_COMMAND} -E rm -rf ${projectname}
)
endif ()
ExternalProject_Add_Step(dep_${projectname} free_download_space
DEPENDEES download # do after download
COMMENT "Freeing Space: Removing source archive"
WORKING_DIRECTORY ${DEP_DOWNLOAD_DIR}
COMMAND ${CMAKE_COMMAND} -E rm -r ${projectname}
)
ExternalProject_Add_Step(dep_${projectname} free_build_space
DEPENDEES install # do after install
COMMENT "Freeing Space: Removing source and build files"
@@ -267,7 +259,6 @@ else()
EXCLUDE_FROM_ALL ON
INSTALL_DIR ${DESTDIR}
DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/${projectname}
${_source_dir_arg}
${_gen}
CMAKE_ARGS
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
@@ -395,6 +386,10 @@ include(libnoise/libnoise.cmake)
include(Draco/Draco.cmake)
include(FFMPEG/FFMPEG.cmake)
include(Assimp/Assimp.cmake)
# I *think* 1.1 is used for *just* md5 hashing?
# 3.1 has everything in the right place, but the md5 funcs used are deprecated
# a grep across the repo shows it is used for other things
@@ -405,12 +400,6 @@ if(NOT OPENSSL_FOUND)
set(OPENSSL_PKG dep_OpenSSL)
endif()
include(FFMPEG/FFMPEG.cmake)
include(Assimp/Assimp.cmake)
include(DataChannel/DataChannel.cmake)
set(DATACHANNEL_PKG dep_DataChannel)
# we don't want to load a "wrong" openssl when loading curl
# so, just don't even bother
# ...i think this is how it works? change if wrong
@@ -484,7 +473,6 @@ set(_dep_list
dep_wxInspector
dep_FFMPEG
dep_Assimp
${DATACHANNEL_PKG}
)
if (MSVC)
-37
View File
@@ -1,37 +0,0 @@
# libdatachannel is the native ICE/DTLS/SCTP implementation used by the
# GUI WebRTC camera controller. Keep the source revision fixed: the signaling
# protocol is evolving independently of this transport dependency.
#
# It vendors plog, usrsctp and libjuice as git submodules, which a plain
# GitHub tag tarball does not include. The flatpak sandbox has no network
# access during the build, so there the manifest itself clones the repo
# (submodules and all) into the dependency download directory before the
# sandbox closes. ExternalProject_Add is pointed at that existing checkout
# instead of being given its own network-dependent download method.
if (FLATPAK)
set(_datachannel_source
SOURCE_DIR ${DEP_DOWNLOAD_DIR}/DataChannel
)
else()
set(_datachannel_source
GIT_REPOSITORY https://github.com/paullouisageneau/libdatachannel.git
GIT_TAG v0.24.5
GIT_SHALLOW ON
GIT_SUBMODULES_RECURSE ON
)
endif()
orcaslicer_add_cmake_project(DataChannel
DEPENDS ${OPENSSL_PKG}
CMAKE_ARGS
-DNO_EXAMPLES=ON
-DNO_TESTS=ON
-DNO_WEBSOCKET=ON
-DNO_MEDIA=ON
-DUSE_NICE=OFF
-DUSE_SYSTEM_JUICE=OFF
-DUSE_SYSTEM_USRSCTP=OFF
-DOPENSSL_ROOT_DIR:PATH=${DESTDIR}
-DOPENSSL_USE_STATIC_LIBS=ON
${_datachannel_source}
)
+7 -23
View File
@@ -1,26 +1,14 @@
set(_conf_cmd ./configure)
set(_ffmpeg_depends)
set(_ffmpeg_configure_command ${_conf_cmd})
if (TARGET dep_OpenSSL)
set(_ffmpeg_depends DEPENDS dep_OpenSSL)
set(_ffmpeg_configure_command
${CMAKE_COMMAND} -E env
"PKG_CONFIG_PATH=${DESTDIR}/lib/pkgconfig:$ENV{PKG_CONFIG_PATH}"
${_conf_cmd}
)
endif()
if (MSVC)
set(_source_dir "${CMAKE_BINARY_DIR}/dep_FFMPEG-prefix/src/dep_FFMPEG")
set(PREBUILD_URL_arm64 "https://github.com/Noisyfox/FFmpeg-Builds-Orca/releases/download/autobuild-2026-09-18-16-50/ffmpeg-n7.0.3-33-g887d4b4919-winarm64-orca-shared-7.0.zip")
set(PREBUILD_HASH_arm64 "da480cbb39680056de824c57ec4dc3bd577b479ebbc310ff1f9dc55cf014b4c1")
set(PREBUILD_URL_x64 "https://github.com/Noisyfox/FFmpeg-Builds-Orca/releases/download/autobuild-2026-09-18-16-50/ffmpeg-n7.0.3-33-g887d4b4919-win64-orca-shared-7.0.zip")
set(PREBUILD_HASH_x64 "85da19daf198f5548259d8aabb349db84997a3f6e6886d8d7764114add9c6dae")
set(PREBUILD_URL_arm64 "https://github.com/Noisyfox/FFmpeg-Builds-Orca/releases/download/autobuild-2026-07-17-14-28/ffmpeg-n7.0.3-31-g9b6ffd74b5-winarm64-orca-shared-7.0.zip")
set(PREBUILD_HASH_arm64 "12f4140279f2f8469885e1b5b2e8be9d788882914c21523cacd56989f3548054")
set(PREBUILD_URL_x64 "https://github.com/Noisyfox/FFmpeg-Builds-Orca/releases/download/autobuild-2026-07-17-14-28/ffmpeg-n7.0.3-31-g9b6ffd74b5-win64-orca-shared-7.0.zip")
set(PREBUILD_HASH_x64 "e65916020ddb9ef84b2666dfbcbfc9b1d67f69d15b4a66db53754637bf2d498c")
ExternalProject_Add(dep_FFMPEG
${_ffmpeg_depends}
URL ${PREBUILD_URL_${DEPS_ARCH}}
URL_HASH SHA256=${PREBUILD_HASH_${DEPS_ARCH}}
DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/FFMPEG
@@ -33,8 +21,6 @@ if (MSVC)
)
else ()
set(_openssl_cmd --enable-openssl)
if (APPLE)
set(_minos_cmd
"--extra-cflags=-mmacosx-version-min=${DEP_OSX_TARGET}"
@@ -66,11 +52,10 @@ else ()
endif()
ExternalProject_Add(dep_FFMPEG
${_ffmpeg_depends}
URL https://github.com/FFmpeg/FFmpeg/archive/refs/tags/n7.0.3.tar.gz
URL_HASH SHA256=DEEDCABE339165214A3637DF4C86A507AEF0D793CF8774FF68735F4737E8DDBC
DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/FFMPEG
CONFIGURE_COMMAND ${_ffmpeg_configure_command}
CONFIGURE_COMMAND ${_conf_cmd}
${_cross_cmd}
${_pic_cmd}
${_arch_cmd}
@@ -78,21 +63,20 @@ else ()
"--prefix=${DESTDIR}"
${_link_cmd}
${_minos_cmd}
${_openssl_cmd}
--disable-doc
--enable-small
--disable-outdevs
--disable-filters
--enable-filter=*null*,afade,*fifo,*format,*resample,aeval,allrgb,allyuv,atempo,pan,*bars,color,*key,crop,draw*,eq*,framerate,*_qsv,*_vaapi,*v4l2*,hw*,scale,volume,test*
--disable-protocols
--enable-protocol=file,fd,pipe,http,https,rtp,tcp,udp
--enable-protocol=file,fd,pipe,rtp,udp
--disable-muxers
--enable-muxer=rtp
--disable-encoders
--disable-decoders
--enable-decoder=*aac*,h264*,mp3*,mjpeg,rv*
--disable-demuxers
--enable-demuxer=h264,mp3,mov,mpjpeg,rtsp,sdp
--enable-demuxer=h264,mp3,mov
--disable-zlib
--disable-avdevice
BUILD_IN_SOURCE ON
+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.
-240
View File
@@ -1,240 +0,0 @@
# Printer agents
Printer agents isolate printer-specific communication from the rest of OrcaSlicer. The GUI and
`DeviceManager` operate on a shared set of printer operations and device state; a selected printer
agent implements those operations for a particular printer ecosystem. The agent boundary allows
Bambu, Moonraker-based printers, built-in integrations, and Python-provided integrations to use the
same application workflow without making the GUI understand every printer protocol.
The current boundary is an adapter boundary around the existing application contract. In particular,
some request fields and message payloads still use the Bambu-shaped representation that existing
`MachineObject` and `DeviceManager` code consumes. The printer agent is responsible for translating
that representation into the protocol spoken by its printer. This is an intentional compatibility
constraint of the current design; the interface is not yet a neutral printer protocol.
The v1 dialect migration path is deliberately narrow. `DeviceManager` currently speaks the Bambu JSON
dialect because that is the payload shape already used throughout the command and state workflow. The
v1 `OrcaPrinterAgent` also accepts that Bambu dialect. Its transport path places the small translation
needed for the target printer at `deliver_to_sink`, keeping the compatibility code at the edge rather
than spreading it through `DeviceManager` or the agent interface.
The eventual direction is for `DeviceManager` to produce an Orca JSON dialect. The Bambu agent will then
own the translation from Orca JSON to Bambu's protocol, while `OrcaPrinterAgent` can forward the Orca
payload directly to its sink. The v1 translation at `deliver_to_sink` can then be removed without
changing `DeviceManager`, the command callers, or the rest of the agent workflow.
## Components
The system has four relevant layers:
```text
GUI / DeviceManager / MachineObject
|
NetworkAgent
/ \
IPrinterAgent ICloudServiceAgent
| |
printer protocol authentication and cloud services
```
### `DeviceManager` and `MachineObject`
`DeviceManager` owns the application-facing printer workflow. It maintains `MachineObject` instances,
updates their state, filters devices for the active printer agent, and initiates operations such as
homing, temperature changes, printing, subscriptions, and camera playback.
`MachineObject` remains the shared state model used by the GUI. It does not contain the implementation
of a printer protocol. When a device is discovered or returned by a cloud query, the device is tagged
with the active `printer_agent_id`. Device lists and selected-machine operations use that tag to avoid
sending an operation through an agent that does not own the device.
### `NetworkAgent`
`NetworkAgent` is the façade used by the GUI and `DeviceManager`. It owns:
- the currently selected `IPrinterAgent`;
- the registered cloud-service instances, indexed by provider;
- callbacks shared by the active printer agent and the application;
- the forwarding methods for printer commands and cloud operations.
There is one active printer agent for the currently selected printer preset. Switching the preset
increments the machine-list generation, disconnects the old printer agent, removes its callbacks, and
installs the newly selected agent. The façade then forwards printer operations to that agent.
Cloud operations are selected separately using a provider key. `NetworkAgent` forwards a cloud request
to the matching `ICloudServiceAgent`, and forwards cloud camera operations with a device ID. The
printer agent receives a cloud-agent pointer through `set_cloud_agent()` when it is created, allowing
printer communication to obtain cloud tokens without depending on a concrete cloud implementation.
### `IPrinterAgent`
`IPrinterAgent` is the printer-facing contract. It covers:
- cloud-relay and direct-LAN message delivery;
- LAN connection, discovery, binding, and certificates;
- printer subscriptions and callbacks;
- print operations;
- filament synchronization;
- camera capability and local camera URL reporting;
- printer command methods.
Concrete built-in implementations include the Bambu wrapper, the native Orca/Moonraker path, and
other printer-agent implementations registered by the application. A printer agent may use either
the cloud agent, a direct LAN connection, or both.
### `ICloudServiceAgent`
`ICloudServiceAgent` owns authentication and services provided by a cloud backend. It covers login
state, tokens, user and printer lists, settings synchronization, model services, cloud messages, and
cloud camera operations.
Cloud camera operations are device-scoped:
- `get_camera_url(dev_id, callback)` obtains a stream URL for one device;
- `create_camera_signaling_channel(dev_id)` creates signaling for one device where the provider
supports it.
This is separate from the local camera URL exposed by `IPrinterAgent`, which is currently scoped to
the active printer agent because a normal LAN agent represents one physical printer connection.
## Agent registration and selection
`NetworkAgentFactory` maintains the printer-agent registry. Each registry entry contains an agent ID,
a display name, and a factory function. Built-in agents register during application initialization.
Python printer-agent capabilities register dynamically and contribute an agent ID and factory entry.
The selected printer preset contains the printer-agent choice. If no explicit choice is stored, the
application preserves the existing default behavior: Bambu presets select the Bambu agent and other
presets select the native Orca agent. When a preset is changed, `GUI_App` resolves the effective agent
ID, obtains the corresponding cloud agent, creates the printer agent through the registry, and installs
it in `NetworkAgent`.
The registry rejects conflicting agent IDs. This matters for Python plugins because an agent ID is the
stable identity used by presets and device ownership; two enabled plugin capabilities must not claim
the same ID.
## Message and command flow
There are two low-level message paths:
- `send_message()` publishes a command through the printer's cloud relay;
- `send_message_to_printer()` sends a command directly to the printer over the LAN path.
Both paths accept a JSON string, quality-of-service and flag values, and return the existing network
status code domain. The agent owns the conversion from that JSON contract to its native transport.
The typed `command_*` methods are the application-facing convenience layer. The five generic defaults
currently implemented by `IPrinterAgent` construct the existing JSON dialect and route through the
same message path:
| Method | Default operation |
| --- | --- |
| `command_xyz_abs()` | Send `G90` for absolute positioning |
| `command_auto_leveling()` | Send `G29` for bed leveling |
| `command_go_home()` | Use the supported homing operation or send `G28` |
| `command_set_bed()` | Use the supported bed control or send `M140` |
| `command_set_nozzle()` | Send `M104` for nozzle temperature |
These are compatibility defaults for common printer workflows, not a guarantee that every firmware
implements every command identically. An agent can override a method when its protocol needs another
operation. For example, a Klipper configuration may use `BED_MESH_CALIBRATE` instead of `G29`.
The remaining common command methods default to `ORCA_NETWORK_ERR_CMD_NOT_SUPPORTED` because their
existing behavior is vendor-specific or has no portable implementation:
- AMS RFID refresh;
- AMS calibration;
- AMS tray selection;
- camera start;
- axis control.
The methods remain on the common interface so an agent that supports them can override them explicitly.
`sequence_id` remains part of the command contract because `DeviceManager` creates and tracks it as
the command ID.
## Device ownership and stale responses
Printer-agent ownership is represented by `printer_agent_id` on device records and `MachineObject`
instances. The active agent ID is attached when a device is discovered, returned by a cloud list, or
reused after a preset switch. Local-machine configuration also persists the agent ID so a saved LAN
device is not silently reused by an unrelated agent.
Cloud printer-list responses carry three pieces of request context added by `NetworkAgent`:
```text
provider cloud provider used for the request
agent_id active printer agent when the request was made
generation machine-list generation when the request was made
```
`DeviceManager` accepts the response only when those values still match the current provider, active
agent, and generation. This prevents a slow response from the previous preset or provider from
repopulating the current device list.
The provider mapping is currently selected by `GUI_App`: the Bambu agent maps to the Bambu cloud
provider and other agents map to the Orca cloud provider. The generation check protects that existing
selection from races; it does not make cloud-provider ownership intrinsic to an agent. Cloud-printer
ownership and the broader Orca cloud services are therefore still separate architectural concerns.
## Python printer agents
`PrinterAgentPluginCapability` implements `IPrinterAgent` directly. The live capability object is
registered with `NetworkAgentFactory` and handed out as the printer agent when its agent ID is selected.
The plugin receives the selected `ICloudServiceAgent` through `set_cloud_agent()` just like a built-in
printer agent.
Python plugins must implement the core communication and lifecycle methods required by the interface,
including agent metadata, printer connection, discovery callbacks, and the two message-send methods.
Methods that are meaningful only to a particular printer are optional overrides where the C++ base
class provides a default.
All ten `command_*` methods are available in the Python binding and in the trampoline. Their override
status is intentionally optional:
- the five generic commands use the C++ default when Python does not override them;
- the five vendor-specific commands return `NOT_SUPPORTED` unless Python supplies an implementation;
- a Python implementation can replace either behavior for its own protocol.
The Python camera binding exposes HTTP, HTTPS, RTSP, and HTTP-snapshot modes. WebRTC remains a
built-in C++ camera mode, but is not exposed as a Python mode because the current Python capability
does not provide the corresponding cloud signaling-channel contract.
## Camera playback boundary
The camera stream mode describes how a stream is obtained; it does not by itself define ownership of
the wxWidgets view that renders it. `MediaPlayCtrl` selects and tears down the active backend, while
the wx parent owns the child window or renderer. This is important because a web view, native media
control, and frame-based/WebRTC renderer have different wx window-lifetime requirements.
Cloud URL and signaling requests are routed through `NetworkAgent` to the cloud provider selected for
the device. Local URL requests are routed to the active printer agent. The distinction keeps cloud
account services device-scoped while preserving the current one-LAN-agent/one-printer model.
## Compatibility constraints
The printer-agent boundary intentionally preserves several existing application contracts:
- Bambu-shaped JSON is still the shared command representation;
- existing network status codes are reused, with Orca-specific unsupported/capability errors added
in the Orca-reserved range;
- `MachineObject` remains the shared device-state model;
- preset and local-machine data retain compatibility with the existing agent-selection behavior;
- Python plugins use the existing capability and pybind11 registration system.
The agent abstraction is therefore responsible for containing vendor differences, not for pretending
that all vendor protocols are identical. The planned Orca JSON dialect is the protocol-neutral command
model for the `DeviceManager`/agent boundary. Once it is introduced, Bambu-specific translation remains
inside the Bambu agent and the Orca agent's v1 sink adapter can be removed as a self-contained cleanup.
## Main implementation locations
- [`IPrinterAgent`](../../src/slic3r/Utils/IPrinterAgent.hpp) — printer-agent contract and generic command defaults
- [`ICloudServiceAgent`](../../src/slic3r/Utils/ICloudServiceAgent.hpp) — cloud service and per-device
cloud camera contract
- [`NetworkAgent`](../../src/slic3r/Utils/NetworkAgent.hpp) — façade and dispatch between active agents
- [`NetworkAgentFactory`](../../src/slic3r/Utils/NetworkAgentFactory.hpp) — built-in and Python agent registry
- [`DeviceManager`](../../src/slic3r/GUI/DeviceCore/DevManager.cpp) — device ownership, filtering, and
stale-response checks
- [`PrinterAgentPluginCapability`](../../src/slic3r/plugin/pluginTypes/printerAgent/PrinterAgentPluginCapability.cpp)
— Python bindings
- [`MediaPlayCtrl`](../../src/slic3r/GUI/MediaPlayCtrl.cpp) — camera backend selection and playback lifecycle
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"
@@ -3,7 +3,7 @@
"name": "BETA PETG Metallic @BBL H2D 0.4 nozzle",
"inherits": "BETA PETG Metallic @base",
"from": "system",
"setting_id": "giq8BW6qcwz91e4C",
"setting_id": "BPGB09_09",
"instantiation": "true",
"fan_max_speed": [
"30"
@@ -3,7 +3,7 @@
"name": "BETA PETG Metallic @BBL X1C",
"inherits": "BETA PETG Metallic @base",
"from": "system",
"setting_id": "tZzoc2LdgWkpEiox",
"setting_id": "BPGB09_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 Transparent @BBL A1",
"inherits": "BETA PETG Transparent @base",
"from": "system",
"setting_id": "86loYV5S4bgO2FOx",
"setting_id": "BPGB10_05",
"instantiation": "true",
"filament_long_retractions_when_cut": [
"1"
@@ -3,7 +3,7 @@
"name": "BETA PETG Transparent @BBL A1M",
"inherits": "BETA PETG Transparent @base",
"from": "system",
"setting_id": "c2xTYO07RC2G2xsv",
"setting_id": "BPGB10_02",
"instantiation": "true",
"filament_long_retractions_when_cut": [
"1"
@@ -3,7 +3,7 @@
"name": "BETA PETG Transparent @BBL H2D 0.4 nozzle",
"inherits": "BETA PETG Transparent @base",
"from": "system",
"setting_id": "GkC5T0RX0meiLVKg",
"setting_id": "BPGB10_06",
"instantiation": "true",
"filament_deretraction_speed": [
"nil",
@@ -3,7 +3,7 @@
"name": "BETA PETG Transparent @BBL X1C",
"inherits": "BETA PETG Transparent @base",
"from": "system",
"setting_id": "doyjzbrEn9akgjvG",
"setting_id": "BPGB10_00",
"instantiation": "true",
"filament_long_retractions_when_cut": [
"1",
@@ -80,48 +80,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 UV Color Change @BBL A1",
"inherits": "BETA PETG UV Color Change @base",
"from": "system",
"setting_id": "CeepF0rRLZ5fzBwm",
"setting_id": "BPGB11_06",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG UV Color Change @BBL A1M 0.4 nozzle",
"inherits": "BETA PETG UV Color Change @base",
"from": "system",
"setting_id": "Atb1esrVdoWBK97e",
"setting_id": "BPGB11_03",
"instantiation": "true",
"fan_max_speed": [
"50"
@@ -3,7 +3,7 @@
"name": "BETA PETG UV Color Change @BBL H2D 0.4 nozzle",
"inherits": "BETA PETG UV Color Change @base",
"from": "system",
"setting_id": "Ic0NUfwLmR0NSh5q",
"setting_id": "BPGB11_09",
"instantiation": "true",
"fan_max_speed": [
"30"
@@ -3,7 +3,7 @@
"name": "BETA PETG UV Color Change @BBL X1C",
"inherits": "BETA PETG UV Color Change @base",
"from": "system",
"setting_id": "BUKCpukEUmocfz3v",
"setting_id": "BPGB11_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-CF @BBL A1 0.4 nozzle",
"inherits": "BETA PETG-CF @base",
"from": "system",
"setting_id": "2ysJdw1MuW8VLmny",
"setting_id": "BPGB12_05",
"instantiation": "true",
"fan_cooling_layer_time": [
"30"
@@ -3,7 +3,7 @@
"name": "BETA PETG-CF @BBL A1M 0.4 nozzle",
"inherits": "BETA PETG-CF @base",
"from": "system",
"setting_id": "eZsa6noZZUahQeBp",
"setting_id": "BPGB12_04",
"instantiation": "true",
"filament_max_volumetric_speed": [
"9"
@@ -3,7 +3,7 @@
"name": "BETA PETG-CF @BBL H2D 0.4 nozzle",
"inherits": "BETA PETG-CF @base",
"from": "system",
"setting_id": "YRUDQs5jE1d1BGTY",
"setting_id": "BPGB12_08",
"instantiation": "true",
"counter_coef_2": [
"0.00565"
@@ -3,7 +3,7 @@
"name": "BETA PETG-CF @BBL P1P 0.4 nozzle",
"inherits": "BETA PETG-CF @base",
"from": "system",
"setting_id": "i1OjgC3I96a1Trb8",
"setting_id": "BPGB12_03",
"instantiation": "true",
"fan_cooling_layer_time": [
"30"
@@ -3,7 +3,7 @@
"name": "BETA PETG-CF @BBL X1C 0.4 nozzle",
"inherits": "BETA PETG-CF @base",
"from": "system",
"setting_id": "0p4213iz0b9fbeKO",
"setting_id": "BPGB12_02",
"instantiation": "true",
"fan_cooling_layer_time": [
"30"

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