The 10 CR-PETG profiles added in 5612e120 (also from hamham999s PR
13581) inherit from fdm_filament_petg, but that base template did
not exist in the Creality profile set - only fdm_filament_pet. Result:
OrcaSlicer logged
can not find inherits fdm_filament_petg for CR-PETG @Creality K2...
and aborted the rest of the Creality filament load, leaving the
filament dropdown empty for K2 users.
Adds the base template (originally added in hamham999s PR 13581) and
registers it in Creality.json filament_list after fdm_filament_pet.
Reported-by: local testing on Hark Tech 2026-05-21 test build.
Co-Authored-By: hamham999 <hamham999@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two follow-ups from #13744 review:
1. K2 firmware payloads reference "CR-PETG" by name (per DaviBe92's
reverse-engineering work in k2-websocket-re, and a real Creality spool
seen by @swilsonnc), but the profile was missing from the Creality
filament set. Adds 10 K2-family variants:
- K2: 0.4, 0.6, 0.8 nozzles
- K2 Plus: 0.2, 0.4, 0.6, 0.8 nozzles
- K2 Pro: 0.4, 0.6, 0.8 nozzles
Profile values come from CrealityPrint v7.1.0 via @hamham999's
parallel work in OrcaSlicer/OrcaSlicer#13581. Files re-indented with
tabs and BOM stripped to match repo convention.
2. Creality HF Generic PLA and Creality HF Generic Speed PLA were missing
filament_vendor: ["Creality"] so they appeared under "General" rather
than "Creality" in the filament selector.
Reported-by: swilsonnc, DaviBe92 (CR-PETG missing)
Co-Authored-By: hamham999 <hamham999@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
fix: OK/Cancel buttons clipped in Flushing Volume dialog (#13511)
The WipingDialog renders its UI inside a wxWebView. When the dialog
was clamped to screen size (many filaments, small displays, high DPI),
the HTML content exceeded the WebView bounds and the OK/Cancel buttons
fell below the visible area.
HTML fix:
- Convert .container to flexbox column with overflow-y: auto
- Pin .button-container with flex-shrink: 0 so it stays visible
- Allow .scroll-container to flex-grow for the table area
C++ fix:
- Replace heuristic extra_size with accurate fixed_overhead estimate
- Use correct cell height (25 DIP) matching HTML table row height
- Add screen margin for window decorations
- Enforce minimum dialog size when clamped
Co-authored-by: SoftFever <softfeverever@gmail.com>
* Add Optimized Gyroid infill (auto-tuned wavelength + amplitude)
New infill geometry derived from FillGyroid. Two parameters are
auto-computed per-region from density, line spacing, and layer height
(no user inputs):
omega = sqrt(density_adj) / sqrt(1 + layer_height/spacing)
clamped to [0.5, 2.0]
-- Euler-Bernoulli buckling: critical load ~ 1/L^2,
so shorter wavelength under higher load (denser infill)
raises buckling resistance.
amplitude = 0.55 / omega^2, clamped to [0.20, 0.65]
-- Curved-beam bending stress: peak stress ~ A * omega^2,
so amplitude is reduced as omega rises to keep peak
fiber stress bounded while preserving stiffness.
Files:
- src/libslic3r/Fill/FillOptimizedGyroid.{hpp,cpp} (new)
- src/libslic3r/Fill/FillBase.cpp (factory case)
- src/libslic3r/Fill/Fill.cpp (switch case)
- src/libslic3r/Layer.cpp (switch case)
- src/libslic3r/PrintConfig.{hpp,cpp} (enum + label)
- src/libslic3r/CMakeLists.txt (build sources)
User-facing: appears as "Optimized Gyroid" in the Fill Pattern dropdown.
Density still chosen by user; omega/amplitude are internal.
* Fix build: layer_height is in FillParams, not Fill base
* Add ipOptimizedGyroid to multiline infill list in ConfigManipulation
* Refactor: replace ipOptimizedGyroid enum with gyroid_optimized boolean
Per @RF47's review feedback, fold the optimized wave math into FillGyroid
itself behind a per-region boolean instead of a separate infill enum.
What changes:
- New ConfigOptionBool "gyroid_optimized" on PrintRegionConfig (default
false). When unchecked, gyroid behavior is byte-identical to before.
- Optimized wave math (compute_omega_factor, compute_amplitude_factor,
f_opt, make_*_opt, make_optimized_gyroid_waves) lives inside
FillGyroid.cpp. _fill_surface_single branches on params.gyroid_optimized.
- FillParams gains a bool gyroid_optimized field, populated in Fill.cpp
from region_config alongside fill_multiline.
- UI checkbox added under Strength > Infill in Tab.cpp, label
"Optimize gyroid wave (experimental)". Toggle is hidden by
ConfigManipulation when sparse_infill_pattern != ipGyroid.
- "gyroid_optimized" added to s_Preset_print_options for preset I/O.
What goes away:
- ipOptimizedGyroid enum value, factory case, switch cases, dropdown
label, string key.
- FillOptimizedGyroid.cpp / FillOptimizedGyroid.hpp (math moved into
FillGyroid.cpp).
- Net diff drops by ~250 lines.
Existing profiles using gyroid are unaffected.
* Wire gyroid_optimized through SurfaceFillParams to FillParams
Linux build failed because line 921 in Fill.cpp populates a
SurfaceFillParams (the dedup struct), not FillParams directly.
Add the field there, in operator< / operator==, and copy it to
FillParams at both conversion sites.
* Use toggle_line for gyroid_optimized: hide row when pattern != gyroid
* Account for multiline wall thickness in omega correction (per @RF47)
When fill_multiline = N, each gyroid wall is N lines thick, so the
geometric scale fed into the buckling correction term should be
spacing * N rather than spacing. Increases omega (tighter wavelength)
when multiline is enabled, consistent with the thicker wall being
more buckling-resistant.
* Optimized gyroid via marching squares on the implicit scalar field
Per @RF47 review: replace the analytical f_opt / make_one_period_opt
wave generator (which had visible kinks at vertical-horizontal
transitions) with a marching-squares iso-extraction on the gyroid
scalar field, modeled on FillTpmsFK.cpp.
- New marchsq::GyroidField in FillGyroid.cpp evaluates
F(x,y,z) = sin(fx*x)cos(fy*y) + sin(fy*y)cos(fz*z) + sin(fz*z)cos(fx*x)
where fx = omega * baseline (anisotropic in x), fy = fz = baseline.
- get_gyroid_polylines() runs marching squares at iso=0 and converts
rings to polylines.
- _fill_surface_single() optimized branch now builds GyroidField,
runs marching squares, and skips the bb.min translate (field
output is already in absolute coords).
- Dropped: f_opt, make_one_period_opt, make_wave_opt,
make_optimized_gyroid_waves, compute_amplitude_factor. Amplitude
has no clean analog in iso-zero extraction.
- Standard (non-optimized) gyroid path unchanged.
* Mass calibration: compensate period by cbrt(omega) for x-anisotropic field
Per @RF47: optimized vs standard gyroid had different masses at the
same sparse_infill_density setting. Cause: scaling fx by omega while
leaving fy=fz at the baseline raised the surface-area-to-volume ratio
by approximately omega^(1/3) (the geometric mean of the three
frequencies).
Fix: multiply the base period by cbrt(omega) so the geometric mean of
(fx, fy, fz) returns to the standard baseline. Net effect:
fx = omega^(2/3) * baseline_orig
fy = fz = omega^(-1/3) * baseline_orig
which preserves total mass at the same density setting while
preserving the load-direction anisotropy this PR introduces.
* Switch optimized gyroid anisotropy from X to Z (per @RF47)
Z is the typical compression-load axis for FFF parts and is not at
delamination risk under compression — so the dominant failure mode
is column buckling of the vertical strands themselves. Tightening
fz directly shortens the effective vertical strand length, which
improves Z-axis buckling resistance.
Mass calibration via cbrt(omega) period compensation still applies
(scaling exactly one of three frequencies by omega; the geometric-
mean preservation argument is symmetric across axes).
* Update src/slic3r/GUI/Tab.cpp
Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com>
* Address review feedback (Copilot + @RF47)
- Fill.cpp: gate params.gyroid_optimized on (params.pattern == ipGyroid)
so non-gyroid surfaces don't differ in SurfaceFillParams by an
irrelevant flag (would unnecessarily split fill batching).
[Copilot suggestion, RF47 confirmed correct]
- PrintConfig.cpp: drop "amplitude" from the tooltip; only wavelength
is parameterized (the marching-squares iso=0 extraction is invariant
to a uniform field scale, so amplitude has no effect).
- FillBase.hpp: shorten gyroid_optimized comment to match the actual
carried state (no amplitude term).
- FillGyroid.cpp: shorten the marchsq namespace comment block; the
ODR concern was overstated (FillTpmsFK uses the same pattern fine).
* Drop redundant marchsq bb expansion (Copilot)
bb is already offset by 10 * scale_(spacing) above for edge-artifact
margin; the second offset on bb_field doubled the raster area for no
geometric benefit and hurt CPU time on large parts.
* Update src/slic3r/GUI/Tab.cpp
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
* Fix density mismatch + rename to Z-buckling bias optimization
Issue (per @ianalexis): at the same sparse_infill_density setting,
the optimized branch produced denser fill than standard. Verified via
Python sim (sim_gyroid_compare.py) using marching squares on the
implicit field across multiple z slices.
Root cause: the omega formula was inverted from the buckling-physics
intent. The naive sqrt(density_adj) factor produced omega < 1 at
typical print densities (10-30%), which LENGTHENED the Z wavelength
instead of shortening it -- net loss in both mass and strength.
Fix:
- compute_omega_factor: invert to sqrt(1 / density_adj), clamp to
[1.0, 2.0]. Now omega = 2.0 at low density (long strands need
most help) and clamps to 1.0 above ~30% density (no-op, since
standard gyroid is already short enough).
- Remove the cbrt(omega) period compensation. Empirically (sim
table embedded in FillGyroid.cpp comment) the inverted formula
keeps line length per area at ~1.000 of standard across all
densities with no period scaling needed.
Predicted gains (sim, Z-axis Euler buckling proxy):
density line/std strength/std
10% 1.000 2.84x
15% 1.000 1.89x
20% 1.000 1.42x
30%+ 1.000 1.00x (no-op)
Rename per @ianalexis: "Optimize gyroid wave" oversells (now no-op
above 30% density and Z-only). Renamed user-facing label to
"Z-buckling bias optimization (experimental)" with updated tooltip
that scopes to vertical compression and discloses the density cutoff.
Internal config key (gyroid_optimized) unchanged for diff size.
Real-world Instron compression tests at Brown's Prince Lab to follow.
---------
Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com>
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
Co-authored-by: SoftFever <softfeverever@gmail.com>
Root-cause + fix for the K2 Plus sparse-slot / wrong-slot-mapping bug
reported by multiple testers on Reddit and PR #13744 (DaviBe92, Psych0SW,
swilsonnc, TrainAss, Gullible-Price-4257).
DaviBe92 supplied a raw /box/getRealBoxesInfo payload from a K2 Plus
running printer FW 1.1.5.2 / CFS 1.2.2 that shows the K2 Plus uses
THREE state values for slots:
state: 0 → empty
state: 1 → loaded AND currently selected as the active spool
state: 2 → loaded but not currently selected
K2 (base) and K2 Pro firmwares — confirmed against the maintainer's
test printer — only use 0/1. Our parser had assumed the 0/1 form and
filtered with `if (state != 1) continue`, dropping every state=2 slot.
Symptoms this explains:
* DaviBe92: 3 spools loaded, only 1 displayed (the state=1 slot).
* Psych0SW / swilsonnc: 2 of 4 slots returned, "2nd shows 3rd's data"
— the parser dropped slots with state=2, leaving a sparse map that
PresetBundle::sync_ams_list then packs into consecutive UI trays.
* TrainAss / Gullible-Price-4257: "No loaded slots detected" — likely
the same root cause when zero slots happen to be state=1.
Fix: treat any non-zero state as loaded. Belt-and-braces: also skip
entries that are blanked-out (vendor and type both empty) regardless of
state, in case a future firmware uses yet another encoding for empty.
No change required for K2 / K2 Pro behaviour — they already only emit
state=0 (empty) or state=1 (loaded), and the new filter accepts both.
CI flagged ~150 K2 profile files for using space indentation; repo convention
is tab indentation. Ran the upstream-provided fixer:
python3 scripts/orca_filament_lib.py -v Creality -p filament -f --force
Mechanical normalization:
- Spaces → tabs (1 tab per indent level)
- Field ordering normalized (name + type first)
- Single-value scalar fields converted to single-element arrays where the
schema expects arrays (filament_cost, filament_density,
temperature_vitrification, filament_max_volumetric_speed)
No semantic content changes. Pre-existing issue from the original K2
profile import; touching these files in the multicolor_method strip
brought them into the validator's PR-diff scope.
Per @SoftFever review on #13752, printer-specific filament sync logic
belongs in the agent rather than in Sidebar. This consolidates the
previously-duplicated code so all CFS-specific work lives in
CrealityPrintAgent.
Changes:
- New: CrealityPrintAgent::sync_filaments_into_ams_list() — static method
that builds a CrealityPrint host from a printer_cfg, queries CFS slots,
populates PresetBundle::filament_ams_list, and triggers sync_ams_list().
GUI-free; returns a result struct (Status + counts + detail) so the
caller decides what dialog to show.
- New: nested CFSAmsListResult struct describing the five possible
outcomes (Success / NotCfsCapable / QueryFailed / EmptySlots / NoMatches).
- Removed: Sidebar::sync_filaments_from_creality_cfs() entirely (its body
is now the agent method).
- Plater.hpp loses the declaration; Plater.cpp dispatches to the agent
inline within sync_ams_list() and owns only the dialog + post-sync UI
refresh (combo updates, layout, preset selection, persistence).
Two CFS-related entry points on the agent now coexist:
- fetch_filament_info() — agent-driven path; publishes via AmsTrayData
and build_ams_payload(). Active when a MachineObject is bound (BBL
concept, not currently created for Creality LAN hosts).
- sync_filaments_into_ams_list() — explicit-pull path used today by the
Sidebar's "Sync filaments" button until the K-series MachineObject
work catches up.
No user-visible behaviour change — same end-to-end flow, the data work
just lives in the agent now.
Per @SoftFever review on #13752, third-party vendored libraries belong in
deps_src/ alongside expat, imgui, hidapi, etc.
- All 5 files (mdns.{h,c}, cxmdns.{h,cpp}, NOTICE.md) move from
src/slic3r/Utils/mdns/ to deps_src/mdns/.
- deps_src/mdns/CMakeLists.txt builds mdns as a STATIC library and scopes
the MSVC Iphlpapi/Ws2_32 link requirement to that target instead of
libslic3r_gui's global MSVC block.
- deps_src/CMakeLists.txt gains add_subdirectory(mdns).
- src/slic3r/CMakeLists.txt drops the inline source listings and links
libslic3r_gui against the new mdns target; MSVC block keeps only
Setupapi.lib.
- src/slic3r/Utils/CrealityHostDiscovery.cpp #include updated to use the
include dir exposed by the new mdns target.
Verified by a clean Linux build (orca-slicer links successfully).
Two data-only fixes:
#1 Strip undefined {if !multicolor_method} wrapper from filament_start_gcode on 110 K2-Plus profiles. The placeholder is a CrealityPrint-ism that survived the profile port; Orca has no such variable, so slicing failed with a hard parser error (reported on Hyper PLA by u/Gullible-Price-4257). Inner per-layer temp logic now runs unconditionally, which is the correct default.
#4 Add filament_vendor: [Creality] to 50 Creality Generic profiles missing the field. Without it the UI grouped them under Generic instead of Creality (reported by u/mharrop94).
* Added UI force-sync button and fixed bug that didn't sync in one case and caused orange highlight
* Fix sync preset race: join old thread before starting new one
---------
Co-authored-by: Mykola Nahirnyi <mnahirnyi@amcbridge.com>
Co-authored-by: SoftFever <softfeverever@gmail.com>
When a user adds a Creality K-series printer (host_type=crealityprint)
and clicks the existing "Browse" button in the Physical Printer dialog,
dispatch to a new CrealityDiscoveryDialog that finds K2 / K2 Plus /
K2 Pro printers on the LAN automatically. For other host types the
button keeps its existing BonjourDialog behaviour.
CrealityHostDiscovery (src/slic3r/Utils/CrealityHostDiscovery.{hpp,cpp})
Wraps the vendored cxmdns wrapper from the previous commit:
static std::vector<CrealityHost> scan(bool probe_info = true);
Calls cxnet::syncDiscoveryService({"Creality", "creality"}) to find
K-series printers via DNS-SD, dedupes by IP, then optionally HTTP
GETs http://<ip>/info on each match to fetch the model code
(F008 = K2 Plus, F012 = K2 Pro, F021 = K2) and MAC. Returns enriched
{ip, hostname, model_code, model_name, mac, cfs_capable} entries.
CrealityDiscoveryDialog (src/slic3r/GUI/CrealityDiscoveryDialog.{hpp,cpp})
Modal dialog with a wxListView showing Model / Hostname / IP per
discovered host. Runs CrealityHostDiscovery::scan() synchronously
with wxBusyCursor + wxWindowDisabler (5-10s total wait). User picks
one, dialog returns the IP via selected_ip().
PhysicalPrinterDialog (src/slic3r/GUI/PhysicalPrinterDialog.cpp)
The "Browse" button's click handler now reads host_type from the
edited config. If htCrealityPrint, opens CrealityDiscoveryDialog
and writes "http://<ip>" into the print_host field. Otherwise the
existing BonjourDialog path runs unchanged -- no behaviour change
for OctoPrint / Moonraker / Klipper users.
No new UI surface: one existing button now does the right thing per
host_type, mirroring how Creality Print discovers its own printers.
Drop a public-domain mDNS / DNS-SD lookup library into the tree at
src/slic3r/Utils/mdns/. Two pieces:
mdns.{h,c} -- public-domain library by Mattias Jansson from
https://github.com/mjansson/mdns
cxmdns.{h,cpp} -- C++ wrapper from CrealityOfficial/CrealityPrint
v7.1.1 (AGPL-3.0, compatible with OrcaSlicer's
AGPL-3.0)
cxmdns exposes one function:
std::vector<machine_info> cxnet::syncDiscoveryService(
const std::vector<std::string>& prefix);
It sends a DNS-SD meta-discovery query (_services._dns-sd._udp.local.),
listens ~5 seconds, and returns {ip, service_name} for every service
announcement whose name contains any of the given prefixes.
Motivation: Creality K-series firmware announces each printer under a
per-device-unique service type _Creality-<MAC-derived-hex>._udp.local.,
so OrcaSlicer's existing Bonjour code (which queries fixed service
names like _octoprint._tcp) cannot find them. The DNS-SD meta-browser
approach implemented here is the standard way to discover services
when you do not know their exact names in advance.
mdns.c calls GetAdaptersAddresses (iphlpapi) and Winsock2 functions,
neither of which were on libslic3r_gui's MSVC link line; both are
added here so the vendored sources compile and link standalone.
Attribution captured in src/slic3r/Utils/mdns/NOTICE.md. No callers
yet; the K-series discovery class + UI lands in the next commit.
The matcher tiebreaker previously preferred user-edited filament
presets over system bases on a tied score. For a K2 owner who has
a custom copy of Creality Generic PLA @K2-all called eg
Creality Hyper PLA @K2 (mine), the matcher scored both that copy
and the shipped brand-specific Hyper PLA @Creality K2 0.4 nozzle
at 30, then tiebreak picked the user copy. User copies inherit
filament_id from their parent -- in this case the generic PLA
GFL99 -- so the returned id pointed at Generic PLA, not at
Hyper PLA brand-specific id (01001). PresetBundle::sync_ams_list
then resolved by id back to Creality Generic PLA @K2-all, visibly
losing the brand on every sync.
Flip the tiebreaker to prefer system over user. The shipped
brand-specific preset always wins now and sync_ams_list lands on
the right slot label.
Drop the post-sync user-override step from the sidebar path that
was layered on to compensate -- silently substituting the user
local tuning is the wrong default for an upstream-shipped
feature; users who want their local tuning on a synced slot still
get to it via the existing combo dropdown.
Import 191 brand-specific filament presets for the K2 family of
printers (K2, K2 Plus, K2 Pro), lifted from
CrealityOfficial/CrealityPrint v7.1.1 under AGPL-3.0 (compatible
with OrcaSlicer AGPL-3.0).
Brand coverage:
CR-series: CR-PLA, CR-PLA Matte, CR-PLA Fluo, CR-Silk,
CR-TPU, CR-ABS, CR-Nylon
Hyper-series: Hyper PLA, Hyper PLA-CF, Hyper ABS, Hyper PA-CF,
Hyper PA6-CF, Hyper PAHT-CF, Hyper PA612-CF,
Hyper PC, Hyper Marble, Hyper Stardust,
Hyper L-W PLA, Hyper PPA-CF
Third-party: eSUN PLA+ / PLA-HS / PLA-Matte / PLA-Silk /
PLA-CF / PLA-LW / PLA-Lite, PolySonic PLA /
PLA Pro, Panchroma PLA Matte / Satin, Soleyin
Ultra PLA, HP Ultra PLA, HP-ASA, HP-TPU
Ender PLA variants and CrealityPrint per-K2 Generic versions of
PLA, ABS, ASA, PA, PA-CF, PAHT-CF, PET, etc.
This closes the matching gap exposed by the CFS filament-sync
work. When the K2 reports spool brand Hyper PLA or CR-PLA, the
existing Creality vendor only had a generic Creality Generic PLA
@K2-all preset to fall back to, so per-brand temps / PA / cooling
tuning was lost on every sync.
Schema and naming are drop-in compatible -- CrealityPrint
references the K2/K2 Plus/K2 Pro machine names already present in
OrcaSlicer Creality vendor (Creality K2 0.4 nozzle, etc), so no
machine-side changes or compatible_printers rewrites are required.
K2 SE filaments and the PETG/PP/PPS/HIPS family are deferred. K2
SE machine profile is not yet in OrcaSlicer Creality vendor, and
the PETG/PP/PPS/HIPS family relies on fdm_filament_* base
templates that do not exist in Orca Creality vendor -- importing
those bases from CrealityPrint did not make them register as valid
parents at preset-load time. Coverage for the missing families
will land in a follow-up once the loader requirements for new
bases are understood.
Vendor version bumped to 02.03.02.75 to trigger the per-user
profile refresh on next launch. Source attribution captured in
resources/profiles/Creality/NOTICE.md.
The agent fetch_filament_info() path does not fire for Creality
K-series hosts because Sidebar::build_filament_ams_list()
short-circuits when no MachineObject is bound. MachineObject is a
BBL cloud-connected-printer concept that does not apply to LAN
Moonraker-style hosts like the K2 -- the AMS-sync icon click was a
no-op for them.
Mirror what Creality Print own slicer does (explicit Auto Mapping
button bypassing the BBL plumbing): when the user clicks the
existing AMS-sync icon and host_type=crealityprint, dispatch to a
new Sidebar::sync_filaments_from_creality_cfs() that reads the
active printer host config, confirms the printer is a CFS-capable
K-series board, queries boxsInfo over the printer WS on port 9999,
scores each loaded slot against the user filament presets and
builds a filament_ams_list entry with the matched filament_id,
colour and slot indices, then routes through
PresetBundle::sync_ams_list so the filament combo widgets get the
same rebuild as BBL printers and runs the BBL post-sync refresh
sequence (on_filament_count_change + combo update + select_preset
+ export_selections + update_dynamic_filament_list).
No new UI surface -- the existing AMS-sync icon does the right
thing per host_type. Match-and-resolve logic is hoisted out of the
agent anonymous namespace into public statics so the sidebar can
call it without duplicating scoring rules.
K-series printers (K2, K2 Plus, K2 Pro) ship with Mainsail on port
4408. Port 80 hosts only the Creality control/upload API, which
returns 404 for unknown paths and renders as a blank/404 page in
Orca Device tab.
Override CrealityPrint::get_print_host_webui() to default to
http://<host>:4408/ when the user has not explicitly set
print_host_webui, giving K-series owners a complete printer
dashboard in the Device tab out of the box.
Score visible compatible filament presets against the CFS spool
(vendor, brand_name, type) tuple to pick the right preset:
+20 preset name contains the brand_name as a substring
(eg Hyper PLA in Hyper PLA @Creality K2 0.4 nozzle)
+10 preset name contains the vendor substring (eg Creality)
Requires preset.filament_type to equal the spool base type so a
PETG preset is never auto-picked for a PLA spool. Falls back to
filaments.filament_id_by_type(base_type) when nothing scores.
Considers both base/system presets and user-derived copies -- K2
owners frequently keep tweaked copies of system presets (per-spool
PA, temps), so filtering to bases-only would skip exactly the
presets users care about most.
Subclass of MoonrakerPrinterAgent for K-series Creality printers
(K2, K2 Plus, K2 Pro) with CFS support. Registers in
NetworkAgentFactory under host_type=crealityprint. Overrides
fetch_filament_info() to defer to base when the host is not a
CFS-capable K-series board, otherwise query the boxsInfo WebSocket
on port 9999, parse the box hierarchy into CFSSlot[], and publish
each loaded slot as an AmsTrayData entry via build_ams_payload()
so they surface in Orca filament UI.
boxsInfo schema reference (verified against K2 Combo F021 firmware
v1.1.260206):
materialBoxs[].materials[] fields: id, state, vendor, type, name,
color, pressure, rfid, percent. state=1 means loaded; box.type=0
is a CFS unit, type=1 is the external spool holder (handled by
the upload dialog).
Accepted CFS boxes are renumbered sequentially since the K2 raw
box.id has gaps for the external spool holder. Model detection is
delegated to CrealityPrint::supports_multi_color_print() added in
PR #13291.
* feat: add UI feedback on http error and some logs
* spelling fix
* show error dialog only once per session
* show errors with plater notification when on developer mode
* remove return
* remove irrelevant logs
GridCellSupportEditor::DoActivate dereferenced
grid->GetSelectedBlocks().begin() without checking against end(). In
wxWidgets 3.1.5 that range always contained at least one block; in 3.3.2
it is empty after the user deselects, and the dereference crashes inside
wxGridBlockCoords::GetLeftCol().
Fall back to the (row, col) that triggered activation when the selection
is empty, so the existing single-cell branch handles it. While here,
drop a dead local_table cast that was never read.
Fix macOS orcaslicer:// deep links after wxWidgets 3.3.2 upgrade
Install an OrcaSlicer-owned kAEGetURL Apple Event handler from
on_init_inner(). The wxWidgets 3.3.2 handler registered in
applicationWillFinishLaunching: stopped delivering URL events to
GUI_App::MacOpenURL on macOS (#13119), so links from Printables /
Thingiverse opened a blank project instead of importing the model.
Registering our own handler late in startup is last-writer-wins on
NSAppleEventManager and routes back to the existing MacOpenURL ->
start_download path, restoring the pre-upgrade behavior without
touching wxWidgets.
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Use glBlendFuncSeparate in GLTexture::render_sub_texture so destination
alpha stays at 1.0. The Wayland compositor honors framebuffer alpha for window compositing; the previous straight-alpha blend reduced dst alpha
at anti-aliased icon edges, making them semi-transparent against the
desktop. RGB blending is unchanged, so X11/Windows/macOS are unaffected.
Delay opening the object-list filament dropdown on wxGTK until the editor
window is mapped, avoiding popup creation without a valid native toplevel.
Also set the GTK transient parent for dropdown popups created from data-view
cell editors.
# Description
Currently, there is some suspicious behavior going on with the logout
flow, adding some logs to potentially catch any unwanted logouts or
unintentional behaviors.
[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)