Skip to content

feat: add Cool Steel Plate bed type for Snapmaker U1 with per-plate compatibility gating - #627

Merged
LiuLikeQian merged 29 commits into
mainfrom
feature_cold_board
Aug 3, 2026
Merged

feat: add Cool Steel Plate bed type for Snapmaker U1 with per-plate compatibility gating#627
LiuLikeQian merged 29 commits into
mainfrom
feature_cold_board

Conversation

@iesteem

@iesteem iesteem commented Jul 27, 2026

Copy link
Copy Markdown

Summary

Introduce a fourth bed type, Cool Steel Plate (CSP), for the Snapmaker U1, with full per-plate compatibility gating (block slicing + notification + greyed-out slice button), aligned with the existing filament-temperature-mixing / flow_ratio_zero systems.

Reuses the existing btSuperTack enum (whose config-key string is "Supertack Plate"); no new BedType enum value is introduced, avoiding wider churn in the type system.

Core changes

Bed-type UI / config

  • PrintConfig.cpp: U1's enum_values_u1 gets "Supertack Plate", enum_labels_u1 gets "Cool Steel Plate"; enum_labels_ex and the global labels rename Cool Plate (SuperTack)Cool Steel Plate.
  • Tab.cpp: under !support_multi_bed_types, U1 now shows the supertack_plate_temp(_initial_layer) rows so users can edit CSP bed temps.
  • Plater.cpp Sidebar: the legal set for curr_bed_type adds btSuperTack alongside btPTE/btPEI/btGESP (otherwise it would be reset).

CSP compatibility core logic (Plater.cpp / Plater.hpp)

  • New ColdPlateCompatState { Compatible, SeriousWarning, BlockedError } and ColdPlateCompatResult { state, unsupported_slots_1based, tpu_slots_1based, uses_tpu }.
  • get_cold_plate_compat_state(plate_index): only computed when curr_bed_type == btSuperTack; single pass over the plate's actually-used filament slots, classifying as unsupported via supertack_plate_temp / supertack_plate_temp_initial_layer <= 0, and as serious-warning via filament_type == "TPU"; BlockedError wins over SeriousWarning.
  • is_plate_blocked_by_cold_plate(): exposed to MainFrame / GLCanvas3D for slice-button and plate-toolbar state.
  • sync_cold_plate_notification(): close-then-push pattern; caches the last-pushed text to match close_validate_error_notification / close_slicing_serious_warning_notification's exact-text matching.

Slice-path integration

  • Every existing sync_filament_temp_mixing_notification() sync site now also calls sync_cold_plate_notification() side-by-side (update_background_process(), start_next_slice(), find_next_sliceable_plate_for_slice_all(), guard_before_slice_plate(), validate_current_plate(), select_plate(), etc.).
  • validate_current_plate() adds a gate around close_notification_of_type(ValidateError): skip it when mixing / cold-plate blockers are active, so GUI-layer blocker notifications survive.
  • EVT_FILAMENT_USAGE_CHANGED now also syncs CSP.
  • PrintBase.hpp: added STRING_EXCEPT_COLD_PLATE_INCOMPATIBLE = 6.
  • Snapmaker_Orca.cpp CLI: STRING_EXCEPT_FILAMENTS_DIFFERENT_TEMP renamed to STRING_EXCEPT_FILAMENTS_MIXING_TEMP (mirroring the enum).

Refactor: shared slot collector

  • New collect_used_filament_slots_on_plate() (covering plate / object / volume / Plater working config / global default extruder resolution); cold-plate and filament_temp_mixing now share a single definition of "actually-used slot", preventing the two from drifting.
  • New tr_u8() / filament_display_label() / format_filament_slot_list() unify the [n] PresetName rendering across all three notification types.

Profiles (resources/profiles/Snapmaker)

  • Snapmaker.json: version 02.02.50.0202.02.55.02; adds 0.10 Color Mixing @Snapmaker U1 (0.4 Nozzle) process and Snapmaker Support @base filament; many U1 filament presets renamed/split by nozzle size (ABS/ASA/PETG-CF/Support For PLA/TPU 95A HF, etc.); filaments_colours.json removed.
  • Multiple filament presets gain supertack_plate_temp entries to declare CSP (in)compatibility.

Localization

  • Updated .pot and all 21 language .po files with CSP error / serious-warning copy.

Reviewer Focus

Please prioritize the following (ordered by risk):

1. CSP compatibility-classification semantics (most important)

  • get_cold_plate_compat_state() requires both supertack_plate_temp and supertack_plate_temp_initial_layer to be > 0 to be compatible; either being 0 means unsupported. Please confirm this matches the product's definition of "CSP support" (and matches the actual temperature values shipped in the PR's filament profiles).
  • TPU goes to SeriousWarning (non-blocking); other unsupported filaments go to BlockedError. Confirm this grading — especially whether TPU should really be allowed to slice.
  • Single-pass merge logic where BlockedError wins over SeriousWarning: when a plate has both unsupported-non-TPU and TPU, only the error is shown and the serious warning is dropped — is that the intended behavior?

2. Slot-collection parity with filament_temp_mixing

  • collect_used_filament_slots_on_plate() was extracted from the inline block inside check_filament_temp_mixing(); both call sites now share it. Please confirm the refactored check_filament_temp_mixing() is behaviorally identical to main — particularly the uses_default_extruder branch, global extruder resolution, and the boundaries between always_collect and default_keys.
  • Behavioral difference: after the refactor, check_filament_temp_mixing() also uses bundle->filaments.find_preset(...) (same source as cold plate) — please confirm there's no regression from preset-lookup failures.

3. Correctness of close-then-push notifications

  • sync_cold_plate_notification() relies on cold_plate_last_error_text / cold_plate_last_serious_warning_text for exact-text close. Please check:
    • Whether any early-return path (e.g. curr_plate == nullptr) fails to clear the cache and leaves a stale notification.
    • Across the three triggers (plate switch, bed-type switch, filament switch), the previous notification is always cleared correctly.
  • Does the new validate_current_plate() gate around close_notification_of_type(ValidateError) cover every scenario where a GUI blocker should survive — and conversely, does it ever let a stale ValidateError linger that should have been closed?

4. Impact surface of renames / enum additions

  • STRING_EXCEPT_FILAMENTS_DIFFERENT_TEMPSTRING_EXCEPT_FILAMENTS_MIXING_TEMP: search the whole repo to confirm no missed call sites (CLI, 3MF serialization, Sentry reporting, etc.).
  • New STRING_EXCEPT_COLD_PLATE_INCOMPATIBLE = 6: does it conflict with any serialization / persistence (3MF StringExceptionType writes); is opening an old project file safe?
  • Cool Plate (SuperTack)Cool Steel Plate rename across all labels: does it affect the enum-string mapping of curr_bed_type in saved projects? (Critically, the btSuperTack enum-key string must not have changed.)

5. Slice-path coverage

  • Every site that previously called only sync_filament_temp_mixing_notification() now also calls sync_cold_plate_notification(). Please confirm no slicing entry point was missed (especially reslice, slice_all, send-to-printer, 3MF reload, etc.).
  • MainFrame::get_enable_slice_status() now also checks is_plate_blocked_by_cold_plate; GLCanvas3D::_render_imgui_select_plate_toolbar shows SLICE_FAILED on the plate toolbar — confirm refresh timing is correct across plate-state switches.

6. Profile changes

  • Is the Snapmaker.json version bump 02.02.50.0202.02.55.02 consistent with the force_update strategy; will preset migration be smooth for upgrading users (many U1 filament presets were renamed/split)?
  • filaments_colours.json was deleted entirely (−1802 lines): confirm nothing else references it and that the color mapping has been migrated to the right place.

7. i18n

  • All 21 language .po files are synced; runtime .mo files are generated automatically by CI (run_gettext.{sh,bat} is wired into all three platform build scripts), so no need to review .mo.

Test Plan

  • U1 + Cool Steel Plate: place a filament with supertack_plate_temp=0 → expect ValidateError, slice button greyed out
  • Same setup but TPU only → expect SeriousWarning, slicing not blocked
  • Mixed unsupported + TPU → only the error shows, slicing blocked
  • Switch back to another bed type (btPTE/btPEI/btGESP) → CSP notification clears immediately
  • Cross-plate switch: plate A blocked / plate B compatible — notification follows the selected plate correctly
  • Reslice / Slice All: blocked plates are skipped (find_next_sliceable_plate_for_slice_all)
  • Filament temp mixing and CSP triggered together: both notifications coexist and neither is wrongly closed
  • Opening an old .3mf project (using the legacy Cool Plate (SuperTack) label) does not error; bed type restores correctly
  • Non-U1 machines (X1/P1/A1, etc.) are unaffected; the renamed Cool Steel Plate label still shows

🤖 Generated with Claude Code

iesteem and others added 14 commits July 15, 2026 19:11
- Remove has_sliceable_plate_for_slice_all() hijack in Preview tab switch
  that triggered unintended "slice all" instead of switching to preview
- Add m_filament_temp_blocked flag to PartPlate so can_slice() reflects
  filament temp mixing state, consistent with m_apply_invalid for
  object-outside errors
- Let sync_filament_temp_mixing_notification() manage its own flag,
  independent of the background validation system
- Simplify EVT_GLVIEWTOOLBAR_PREVIEW to use can_slice() as unified gate
  for both error types

Downstream effects: red exclamation icon on plate thumbnails, disabled
slice/export buttons, and blocked auto-slice on preview switch now work
uniformly for both object-outside and filament-temp-mixing errors.
…xing

Replace the per-plate cached m_filament_temp_blocked flag with on-demand
is_plate_blocked_by_filament_temp_mixing() checks in the rendering and
preview-switch paths. This eliminates staleness risks identified during
code review where non-current plates could retain stale blocked state
after filament changes, undo/redo, or plate switching during slicing.

Changes:
- GLCanvas3D: add on-demand check for red exclamation on plate thumbnails
- Plater: add on-demand check in EVT_GLVIEWTOOLBAR_PREVIEW alongside
  can_slice(), keep sync_filament_temp_mixing_notification() for
  notification freshness
- PartPlate: revert cached flag; can_slice() unchanged

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…xing

Merge duplicate key lists, rename used_slots for clarity, and group logic
into scoped blocks. No semantic change.
…EPT_FILAMENTS_MIXING_TEMP

Better reflects that the check is about high/low temperature material mixing,
not just "different" temperatures.
Introduce a new bed plate type for the upcoming low-temperature
cold-pressed steel plate (SKU 24047).

Changes:
- Add BedType::btCPSP enum and "Cold Pressed Steel Plate" enum mapping
- Add cold_pressed_steel_plate_temp / _initial_layer filament options
- Route bed temp keys for the new plate type
- Register new options in filament preset whitelist and
  invalidate_state_by_config_options
- Expose the new plate in U1 bed type dropdown (4-plate default,
  8-plate extended) and Filament tab temperature grid
- Add zh_CN translations

Note: default bed temperatures are 0 (unsupported) until the process
team provides values per filament.
* [Feat]- Render_Optimize: CPU Frustum culling GLVolume

* [Feat]: render optimize, glToolBar refactor

* add some Comments in function extract Frustum from vp-matrix

* delete unnecessary tex_coord assignment

---------

Co-authored-by: xiejiajun <413189257@qq.com>
Introduce a new bed plate type for the upcoming low-temperature
cold-pressed steel plate (SKU 24047).

Changes:
- Add BedType::btCPSP enum and "Cold Pressed Steel Plate" enum mapping
- Add cold_pressed_steel_plate_temp / _initial_layer filament options
- Route bed temp keys for the new plate type
- Register new options in filament preset whitelist and
  invalidate_state_by_config_options
- Expose the new plate in U1 bed type dropdown (4-plate default,
  8-plate extended) and Filament tab temperature grid
- Add zh_CN translations

Note: default bed temperatures are 0 (unsupported) until the process
team provides values per filament.
…-plate compatibility checks

Rename the bed type from "Cold Pressed Steel Plate" (btCPSP) to "Cool Steel
Plate" (btCSP) across config keys, enum values, labels, and translations.
Introduce per-plate cold-plate compatibility gating: block slicing when any
used filament has zero cold-plate bed temperature, and surface a non-blocking
serious warning when TPU is in use. Sync notifications across plate select,
file load, slice start, and background-process update paths.
Collapse get_cold_plate_unsupported_filaments / plate_uses_tpu /
get_cold_plate_compat_state into one function returning
ColdPlateCompatResult { state, unsupported, uses_tpu }.

sync_cold_plate_notification now reuses compat.unsupported instead of
re-querying, dropping per-sync slot collection from 3 passes to 1.
is_plate_blocked_by_cold_plate's external signature is unchanged, so
all call sites (MainFrame, find_next_sliceable_plate_for_slice_all,
validate_current_plate) need no changes.
…aSlicer into feature_cold_board

#	localization/i18n/zh_CN/Snapmaker_Orca_zh_CN.po
#	src/libslic3r/Preset.cpp
#	src/libslic3r/Print.cpp
#	src/libslic3r/PrintConfig.cpp
#	src/libslic3r/PrintConfig.hpp
#	src/slic3r/GUI/Plater.cpp
#	src/slic3r/GUI/Tab.cpp
…cation format

After the revert of the standalone btCSP bed type, Cool Steel Plate now
reuses the existing btSuperTack enumerator and supertack_plate_temp*
fields, surfacing only as a UI label change on Snapmaker U1.

Key changes:
- PrintConfig.cpp: enum_values_u1 / enum_labels_u1 extended from 3 to 4
  entries (adds Supertack Plate / Cool Steel Plate); enum_labels and
  enum_labels_ex relabeled from "Cool Plate (SuperTack)" to
  "Cool Steel Plate".
- Tab.cpp: U1 default (support_multi_bed_types off) now shows the
  supertack_plate_temp* rows; Cool Plate (SuperTack) label/tooltip
  renamed to Cool Steel Plate.
- Plater.cpp detection chain repaired to match the enum reuse:
  * early-exit compares curr_bed == btSuperTack (string-key match
    against "Cool Steel Plate" no longer works since the enum key is
    "Supertack Plate")
  * s_cold_plate_bed_type_key = "Supertack Plate" for combobox lookup
  * bed temp reads switch from cool_steel_plate_temp* to
    supertack_plate_temp*
  * U1 default bed-type allowlist adds btSuperTack so the user's
    selection is not silently overwritten
- Notification format unified with fix_top_cover / fix_flow_ratio:
  shared filament_display_label() + format_filament_slot_list()
  helpers render each filament as "[n] PresetName" using the full
  preset name (not the filament_type short string). ColdPlateCompatResult
  now carries std::vector<int> unsupported_slots_1based /
  tpu_slots_1based, mirroring FlowRatioZeroDetail.
- All 20 .po files + .pot: msgid/msgstr migrated from
  "Cool Plate (SuperTack)" to "Cool Steel Plate" (zh_CN: 低温冷打钢板);
  zh_CN.po cold-plate error/serious-warning text split into 4 sub-clauses
  to match the new helper-driven layout.
- docs/Cool_Steel_Plate_Design.md: full rewrite reflecting the v2 design
  (enum reuse, single-pass scan, shared display helpers, migration
  pitfalls from v1).
@github-actions

Copy link
Copy Markdown

Documentation validation failed

🔗 Link Validation Errors

📄 doc/developer-reference\Built-in-placeholders-variables.md:

  • Line 93: home#process-settings - Fragment does not exist
  • Line 93: home#material-settings - Fragment does not exist

📄 doc/developer-reference\How-to-wiki.md:

  • Line 44: home#material-settings - Fragment does not exist
  • Line 45: home#process-settings - Fragment does not exist
  • Line 46: home#prepare - Fragment does not exist
  • Line 47: home#calibrations - Fragment does not exist
  • Line 50: home#process-settings - Fragment does not exist
  • Line 50: home#support-settings - Fragment does not exist
  • Line 50: home#others-settings - Fragment does not exist

📄 doc/Home.md:

  • Line 14: Precise-wall.md - File does not exist
  • Line 17: extrusion-rate-smoothing.md - File does not exist
  • Line 33: adaptive-pressure-advance.md - File does not exist

📄 doc/Tab.cpp:

  • Line 2373: fill-patterns - File does not exist
  • Line 2376: fill-patterns - File does not exist
  • Line 2557: multimaterial_settings_prime_tower#brim-chamfer - Fragment does not exist
  • Line 2558: multimaterial_settings_prime_tower#brim-chamfer-max-width - Fragment does not exist
  • Line 2570: multimaterial_settings_prime_tower#wall-gap - Fragment does not exist
  • Line 2584: multimaterial_settings_ooze_prevention#delta-temperature - Fragment does not exist

🖼️ Image Validation Errors

📄 doc/developer-reference\How-to-create-profiles.md:

  • Line 142: [Markdown] Alt text "Help menu" ≠ filename "go-to-configuration-folder"
  • Line 144: [Markdown] Alt text "Delete system folder" ≠ filename "profile-delete-system-folder"

@iesteem iesteem changed the title Feature cold board feat: add Cool Steel Plate bed type for Snapmaker U1 with per-plate compatibility gating Jul 27, 2026
…ack) for other models

The btSuperTack enumerator was relabeled to "Cool Steel Plate" everywhere,
which leaked the U1-specific name into non-U1 printers' bed-type combos and
filament temperature rows. Restore the original split:
- enum_labels (non-U1 default) shows "Cool Plate (SuperTack)"; _u1 / _ex
  keep "Cool Steel Plate" for Snapmaker U1.
- Filament temperature panel builds with the right label per current
  printer and re-applies it in toggle_options() on printer switch, so the
  row tracks the bed-type combo instead of going stale.
- Re-add the "Cool Plate (SuperTack)" i18n entries across all languages;
  for the 9 locales that had translated "Cool Steel Plate" with SuperTack
  semantics, switch that msgid to a steel-plate translation and move the
  SuperTack wording into the new entry.
@github-actions

Copy link
Copy Markdown

Documentation validation failed

🔗 Link Validation Errors

📄 doc/developer-reference\Built-in-placeholders-variables.md:

  • Line 93: home#process-settings - Fragment does not exist
  • Line 93: home#material-settings - Fragment does not exist

📄 doc/developer-reference\How-to-wiki.md:

  • Line 44: home#material-settings - Fragment does not exist
  • Line 45: home#process-settings - Fragment does not exist
  • Line 46: home#prepare - Fragment does not exist
  • Line 47: home#calibrations - Fragment does not exist
  • Line 50: home#process-settings - Fragment does not exist
  • Line 50: home#support-settings - Fragment does not exist
  • Line 50: home#others-settings - Fragment does not exist

📄 doc/Home.md:

  • Line 14: Precise-wall.md - File does not exist
  • Line 17: extrusion-rate-smoothing.md - File does not exist
  • Line 33: adaptive-pressure-advance.md - File does not exist

📄 doc/Tab.cpp:

  • Line 2373: fill-patterns - File does not exist
  • Line 2376: fill-patterns - File does not exist
  • Line 2557: multimaterial_settings_prime_tower#brim-chamfer - Fragment does not exist
  • Line 2558: multimaterial_settings_prime_tower#brim-chamfer-max-width - Fragment does not exist
  • Line 2570: multimaterial_settings_prime_tower#wall-gap - Fragment does not exist
  • Line 2584: multimaterial_settings_ooze_prevention#delta-temperature - Fragment does not exist

🖼️ Image Validation Errors

📄 doc/developer-reference\How-to-create-profiles.md:

  • Line 142: [Markdown] Alt text "Help menu" ≠ filename "go-to-configuration-folder"
  • Line 144: [Markdown] Alt text "Delete system folder" ≠ filename "profile-delete-system-folder"

iesteem added 2 commits July 28, 2026 15:05
The tooltips on supertack_plate_temp / supertack_plate_temp_initial_layer
hard-coded "Cool Plate SuperTack", which doesn't match either of the two
labels that enum uses today ("Cool Steel Plate" on U1, "Cool Plate
(SuperTack)" elsewhere) and never updates when the user switches printers.
Rephrase them to refer to "this plate" — the row label already tells the
user which plate it is — and add the new tooltip msgstr entries for zh_CN
and en.
The previous commit added Cool Plate (SuperTack) entries to 18 non-zh/en
.pos and rewrote the Cool Steel Plate msgstr in 9 of them to a steel-plate
semantic. Per the product rule that only Simplified Chinese and English
translations are guaranteed, roll those 18 files back to their pre-e76eb8c0c6
state. Non-zh/en locales now fall back to English for Cool Plate (SuperTack)
on non-U1 printers, while U1 keeps whatever local translation of Cool Steel
Plate the upstream translators had.
@github-actions

Copy link
Copy Markdown

Documentation validation failed

🔗 Link Validation Errors

📄 doc/developer-reference\Built-in-placeholders-variables.md:

  • Line 93: home#process-settings - Fragment does not exist
  • Line 93: home#material-settings - Fragment does not exist

📄 doc/developer-reference\How-to-wiki.md:

  • Line 44: home#material-settings - Fragment does not exist
  • Line 45: home#process-settings - Fragment does not exist
  • Line 46: home#prepare - Fragment does not exist
  • Line 47: home#calibrations - Fragment does not exist
  • Line 50: home#process-settings - Fragment does not exist
  • Line 50: home#support-settings - Fragment does not exist
  • Line 50: home#others-settings - Fragment does not exist

📄 doc/Home.md:

  • Line 14: Precise-wall.md - File does not exist
  • Line 17: extrusion-rate-smoothing.md - File does not exist
  • Line 33: adaptive-pressure-advance.md - File does not exist

📄 doc/Tab.cpp:

  • Line 2373: fill-patterns - File does not exist
  • Line 2376: fill-patterns - File does not exist
  • Line 2557: multimaterial_settings_prime_tower#brim-chamfer - Fragment does not exist
  • Line 2558: multimaterial_settings_prime_tower#brim-chamfer-max-width - Fragment does not exist
  • Line 2570: multimaterial_settings_prime_tower#wall-gap - Fragment does not exist
  • Line 2584: multimaterial_settings_ooze_prevention#delta-temperature - Fragment does not exist

🖼️ Image Validation Errors

📄 doc/developer-reference\How-to-create-profiles.md:

  • Line 142: [Markdown] Alt text "Help menu" ≠ filename "go-to-configuration-folder"
  • Line 144: [Markdown] Alt text "Delete system folder" ≠ filename "profile-delete-system-folder"

Reverts the all-language .po migration introduced in a458eb1
("feat: rework Cool Steel Plate - reuse Supertack enum and unify
notification format") for the 18 non-zh_CN/non-en locales.

Per product rule, only zh_CN and en translations are guaranteed for
the model-specific Cool Steel Plate / Cool Plate (SuperTack) split.
Other locales revert to the upstream "Cool Plate (SuperTack)" msgid
and their original msgstr, leaving them in sync with main.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Documentation validation failed

🔗 Link Validation Errors

📄 doc/developer-reference\Built-in-placeholders-variables.md:

  • Line 93: home#process-settings - Fragment does not exist
  • Line 93: home#material-settings - Fragment does not exist

📄 doc/developer-reference\How-to-wiki.md:

  • Line 44: home#material-settings - Fragment does not exist
  • Line 45: home#process-settings - Fragment does not exist
  • Line 46: home#prepare - Fragment does not exist
  • Line 47: home#calibrations - Fragment does not exist
  • Line 50: home#process-settings - Fragment does not exist
  • Line 50: home#support-settings - Fragment does not exist
  • Line 50: home#others-settings - Fragment does not exist

📄 doc/Home.md:

  • Line 14: Precise-wall.md - File does not exist
  • Line 17: extrusion-rate-smoothing.md - File does not exist
  • Line 33: adaptive-pressure-advance.md - File does not exist

📄 doc/Tab.cpp:

  • Line 2373: fill-patterns - File does not exist
  • Line 2376: fill-patterns - File does not exist
  • Line 2557: multimaterial_settings_prime_tower#brim-chamfer - Fragment does not exist
  • Line 2558: multimaterial_settings_prime_tower#brim-chamfer-max-width - Fragment does not exist
  • Line 2570: multimaterial_settings_prime_tower#wall-gap - Fragment does not exist
  • Line 2584: multimaterial_settings_ooze_prevention#delta-temperature - Fragment does not exist

🖼️ Image Validation Errors

📄 doc/developer-reference\How-to-create-profiles.md:

  • Line 142: [Markdown] Alt text "Help menu" ≠ filename "go-to-configuration-folder"
  • Line 144: [Markdown] Alt text "Delete system folder" ≠ filename "profile-delete-system-folder"

Removes two stale msgids that no longer match any L() call in code:
- "Bed temperature for layers except the initial one. ... Cool Steel Plate."
- "Bed temperature of the initial layer. ... Cool Steel Plate."

These were left behind when supertack_plate_temp[_initial_layer]
tooltips in PrintConfig.cpp were rewritten to use the generic
"this plate" wording. The .pot and en.po never had these entries;
only zh_CN.po carried the orphans.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Documentation validation failed

🔗 Link Validation Errors

📄 doc/developer-reference\Built-in-placeholders-variables.md:

  • Line 93: home#process-settings - Fragment does not exist
  • Line 93: home#material-settings - Fragment does not exist

📄 doc/developer-reference\How-to-wiki.md:

  • Line 44: home#material-settings - Fragment does not exist
  • Line 45: home#process-settings - Fragment does not exist
  • Line 46: home#prepare - Fragment does not exist
  • Line 47: home#calibrations - Fragment does not exist
  • Line 50: home#process-settings - Fragment does not exist
  • Line 50: home#support-settings - Fragment does not exist
  • Line 50: home#others-settings - Fragment does not exist

📄 doc/Home.md:

  • Line 14: Precise-wall.md - File does not exist
  • Line 17: extrusion-rate-smoothing.md - File does not exist
  • Line 33: adaptive-pressure-advance.md - File does not exist

📄 doc/Tab.cpp:

  • Line 2373: fill-patterns - File does not exist
  • Line 2376: fill-patterns - File does not exist
  • Line 2557: multimaterial_settings_prime_tower#brim-chamfer - Fragment does not exist
  • Line 2558: multimaterial_settings_prime_tower#brim-chamfer-max-width - Fragment does not exist
  • Line 2570: multimaterial_settings_prime_tower#wall-gap - Fragment does not exist
  • Line 2584: multimaterial_settings_ooze_prevention#delta-temperature - Fragment does not exist

🖼️ Image Validation Errors

📄 doc/developer-reference\How-to-create-profiles.md:

  • Line 142: [Markdown] Alt text "Help menu" ≠ filename "go-to-configuration-folder"
  • Line 144: [Markdown] Alt text "Delete system folder" ≠ filename "profile-delete-system-folder"

Drop the "Heatbed %1%:" prefix and merge the two-segment message into
a single line, as requested by product:

  Before:
    Heatbed N: The following filaments are not compatible with the
    Cool Steel Plate: [1] X. Set the corresponding bed temperature to
    a non-zero value to enable printing.

  After:
    Cool Steel Plate is not recommended for printing [1] X filaments.
    To continue, set the corresponding bed temperature to a non-zero
    value.

Same treatment applied to the TPU serious-warning variant. The
filament placeholder still uses the shared format_filament_slot_list
helper, so multi-slot output stays "[1] X, [2] Y".

Code changes (Plater.cpp):
- cold_plate_error_text / cold_plate_serious_warning_text: drop the
  bed_index_1_based parameter; build the message via a single
  Slic3r::GUI::format(_u8L(...), slot_list) call.
- sync_cold_plate_notification: remove the now-unused bed_idx locals
  in both the SeriousWarning and BlockedError branches.

i18n (zh_CN.po only, per product rule guaranteeing zh/en):
- remove 4 obsolete Heatbed-prefix msgids.
- add 2 new msgids with zh_CN translations.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Documentation validation failed

🔗 Link Validation Errors

📄 doc/developer-reference\Built-in-placeholders-variables.md:

  • Line 93: home#process-settings - Fragment does not exist
  • Line 93: home#material-settings - Fragment does not exist

📄 doc/developer-reference\How-to-wiki.md:

  • Line 44: home#material-settings - Fragment does not exist
  • Line 45: home#process-settings - Fragment does not exist
  • Line 46: home#prepare - Fragment does not exist
  • Line 47: home#calibrations - Fragment does not exist
  • Line 50: home#process-settings - Fragment does not exist
  • Line 50: home#support-settings - Fragment does not exist
  • Line 50: home#others-settings - Fragment does not exist

📄 doc/Home.md:

  • Line 14: Precise-wall.md - File does not exist
  • Line 17: extrusion-rate-smoothing.md - File does not exist
  • Line 33: adaptive-pressure-advance.md - File does not exist

📄 doc/Tab.cpp:

  • Line 2373: fill-patterns - File does not exist
  • Line 2376: fill-patterns - File does not exist
  • Line 2557: multimaterial_settings_prime_tower#brim-chamfer - Fragment does not exist
  • Line 2558: multimaterial_settings_prime_tower#brim-chamfer-max-width - Fragment does not exist
  • Line 2570: multimaterial_settings_prime_tower#wall-gap - Fragment does not exist
  • Line 2584: multimaterial_settings_ooze_prevention#delta-temperature - Fragment does not exist

🖼️ Image Validation Errors

📄 doc/developer-reference\How-to-create-profiles.md:

  • Line 142: [Markdown] Alt text "Help menu" ≠ filename "go-to-configuration-folder"
  • Line 144: [Markdown] Alt text "Delete system folder" ≠ filename "profile-delete-system-folder"

Refine the Cool Steel Plate notification text to match the agreed
product wording:

  Before: "Cool Steel Plate is not recommended for printing %1%
           filaments. To continue, set the corresponding bed
           temperature to a non-zero value."
  After:  "The Cool Steel Plate is not recommended for %1%. To
           continue printing, set the bed temperature above 0°C
           for this filament."

Same shape applied to the TPU serious-warning variant. zh_CN
translations follow the new wording.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Documentation validation failed

🔗 Link Validation Errors

📄 doc/developer-reference\Built-in-placeholders-variables.md:

  • Line 93: home#process-settings - Fragment does not exist
  • Line 93: home#material-settings - Fragment does not exist

📄 doc/developer-reference\How-to-wiki.md:

  • Line 44: home#material-settings - Fragment does not exist
  • Line 45: home#process-settings - Fragment does not exist
  • Line 46: home#prepare - Fragment does not exist
  • Line 47: home#calibrations - Fragment does not exist
  • Line 50: home#process-settings - Fragment does not exist
  • Line 50: home#support-settings - Fragment does not exist
  • Line 50: home#others-settings - Fragment does not exist

📄 doc/Home.md:

  • Line 14: Precise-wall.md - File does not exist
  • Line 17: extrusion-rate-smoothing.md - File does not exist
  • Line 33: adaptive-pressure-advance.md - File does not exist

📄 doc/Tab.cpp:

  • Line 2373: fill-patterns - File does not exist
  • Line 2376: fill-patterns - File does not exist
  • Line 2557: multimaterial_settings_prime_tower#brim-chamfer - Fragment does not exist
  • Line 2558: multimaterial_settings_prime_tower#brim-chamfer-max-width - Fragment does not exist
  • Line 2570: multimaterial_settings_prime_tower#wall-gap - Fragment does not exist
  • Line 2584: multimaterial_settings_ooze_prevention#delta-temperature - Fragment does not exist

🖼️ Image Validation Errors

📄 doc/developer-reference\How-to-create-profiles.md:

  • Line 142: [Markdown] Alt text "Help menu" ≠ filename "go-to-configuration-folder"
  • Line 144: [Markdown] Alt text "Delete system folder" ≠ filename "profile-delete-system-folder"

The TPU warning most commonly fires for a single filament, where
"They may be hard to remove" is grammatically off. Switch to the
singular "It" — slightly imprecise when multiple slots trigger at
once, but the common single-filament case reads correctly.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Documentation validation failed

🔗 Link Validation Errors

📄 doc/developer-reference\Built-in-placeholders-variables.md:

  • Line 93: home#process-settings - Fragment does not exist
  • Line 93: home#material-settings - Fragment does not exist

📄 doc/developer-reference\How-to-wiki.md:

  • Line 44: home#material-settings - Fragment does not exist
  • Line 45: home#process-settings - Fragment does not exist
  • Line 46: home#prepare - Fragment does not exist
  • Line 47: home#calibrations - Fragment does not exist
  • Line 50: home#process-settings - Fragment does not exist
  • Line 50: home#support-settings - Fragment does not exist
  • Line 50: home#others-settings - Fragment does not exist

📄 doc/Home.md:

  • Line 14: Precise-wall.md - File does not exist
  • Line 17: extrusion-rate-smoothing.md - File does not exist
  • Line 33: adaptive-pressure-advance.md - File does not exist

📄 doc/Tab.cpp:

  • Line 2373: fill-patterns - File does not exist
  • Line 2376: fill-patterns - File does not exist
  • Line 2557: multimaterial_settings_prime_tower#brim-chamfer - Fragment does not exist
  • Line 2558: multimaterial_settings_prime_tower#brim-chamfer-max-width - Fragment does not exist
  • Line 2570: multimaterial_settings_prime_tower#wall-gap - Fragment does not exist
  • Line 2584: multimaterial_settings_ooze_prevention#delta-temperature - Fragment does not exist

🖼️ Image Validation Errors

📄 doc/developer-reference\How-to-create-profiles.md:

  • Line 142: [Markdown] Alt text "Help menu" ≠ filename "go-to-configuration-folder"
  • Line 144: [Markdown] Alt text "Delete system folder" ≠ filename "profile-delete-system-folder"

All bed-temperature rows in the filament settings panel used to spell
out the plate name in their tooltip ("Bed temperature when the Cool
Plate is installed...", "...the Engineering Plate is installed...",
etc.), which (a) duplicates the row label right next to it and (b)
forces the supertack row to keep a model-specific tooltip branch.

Replace every per-plate tooltip with a single generic wording:

  "Bed temperature when this plate is installed. A value of 0 means
   the filament does not support printing on this plate."

Tab.cpp changes:
- TabFilament::build(): all 7 plate rows (supertack / cool / textured
  cool / engineering / hot / textured PEI / graphic effect) use the
  generic tooltip; the supertack row keeps its model-specific label
  but drops the model-specific tooltip.
- TabFilament::toggle_options(): the supertack label_tooltip update
  collapses from a U1/non-U1 ternary to the same generic string.

i18n (zh_CN.po only): drop 8 now-orphaned per-plate msgids; add 1
new generic msgid. en.po/.pot unchanged (no entry existed before,
English UI falls back to the msgid).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Documentation validation failed

🔗 Link Validation Errors

📄 doc/developer-reference\Built-in-placeholders-variables.md:

  • Line 93: home#process-settings - Fragment does not exist
  • Line 93: home#material-settings - Fragment does not exist

📄 doc/developer-reference\How-to-wiki.md:

  • Line 44: home#material-settings - Fragment does not exist
  • Line 45: home#process-settings - Fragment does not exist
  • Line 46: home#prepare - Fragment does not exist
  • Line 47: home#calibrations - Fragment does not exist
  • Line 50: home#process-settings - Fragment does not exist
  • Line 50: home#support-settings - Fragment does not exist
  • Line 50: home#others-settings - Fragment does not exist

📄 doc/Home.md:

  • Line 14: Precise-wall.md - File does not exist
  • Line 17: extrusion-rate-smoothing.md - File does not exist
  • Line 33: adaptive-pressure-advance.md - File does not exist

📄 doc/Tab.cpp:

  • Line 2373: fill-patterns - File does not exist
  • Line 2376: fill-patterns - File does not exist
  • Line 2557: multimaterial_settings_prime_tower#brim-chamfer - Fragment does not exist
  • Line 2558: multimaterial_settings_prime_tower#brim-chamfer-max-width - Fragment does not exist
  • Line 2570: multimaterial_settings_prime_tower#wall-gap - Fragment does not exist
  • Line 2584: multimaterial_settings_ooze_prevention#delta-temperature - Fragment does not exist

🖼️ Image Validation Errors

📄 doc/developer-reference\How-to-create-profiles.md:

  • Line 142: [Markdown] Alt text "Help menu" ≠ filename "go-to-configuration-folder"
  • Line 144: [Markdown] Alt text "Delete system folder" ≠ filename "profile-delete-system-folder"

Follow-up to 93c8e52 (which unified Tab.cpp tooltips). The
underlying PrintConfig.cpp options for each bed-temperature slot
(cool_plate_temp, textured_cool_plate_temp, eng_plate_temp,
hot_plate_temp, textured_plate_temp, graphic_effect_plate_temp, and
their _initial_layer counterparts) still named the plate in their
tooltip, so the sidebar/advanced view kept showing plate-specific
text while the filament panel read "this plate".

Replace all 12 per-plate tooltips in PrintConfig.cpp with the same
generic wording already used by supertack:

  "Bed temperature for layers except the initial one. A value of 0
   means the filament does not support printing on this plate."
  "Bed temperature of the initial layer. A value of 0 means the
   filament does not support printing on this plate."

i18n (zh_CN.po): drop 10 now-orphaned per-plate msgids; the two
generic msgids (already present for Other layers / Initial layer)
are reused.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Documentation validation failed

🔗 Link Validation Errors

📄 doc/developer-reference\Built-in-placeholders-variables.md:

  • Line 93: home#process-settings - Fragment does not exist
  • Line 93: home#material-settings - Fragment does not exist

📄 doc/developer-reference\How-to-wiki.md:

  • Line 44: home#material-settings - Fragment does not exist
  • Line 45: home#process-settings - Fragment does not exist
  • Line 46: home#prepare - Fragment does not exist
  • Line 47: home#calibrations - Fragment does not exist
  • Line 50: home#process-settings - Fragment does not exist
  • Line 50: home#support-settings - Fragment does not exist
  • Line 50: home#others-settings - Fragment does not exist

📄 doc/Home.md:

  • Line 14: Precise-wall.md - File does not exist
  • Line 17: extrusion-rate-smoothing.md - File does not exist
  • Line 33: adaptive-pressure-advance.md - File does not exist

📄 doc/Tab.cpp:

  • Line 2373: fill-patterns - File does not exist
  • Line 2376: fill-patterns - File does not exist
  • Line 2557: multimaterial_settings_prime_tower#brim-chamfer - Fragment does not exist
  • Line 2558: multimaterial_settings_prime_tower#brim-chamfer-max-width - Fragment does not exist
  • Line 2570: multimaterial_settings_prime_tower#wall-gap - Fragment does not exist
  • Line 2584: multimaterial_settings_ooze_prevention#delta-temperature - Fragment does not exist

🖼️ Image Validation Errors

📄 doc/developer-reference\How-to-create-profiles.md:

  • Line 142: [Markdown] Alt text "Help menu" ≠ filename "go-to-configuration-folder"
  • Line 144: [Markdown] Alt text "Delete system folder" ≠ filename "profile-delete-system-folder"

iesteem added 2 commits July 29, 2026 10:37
Follow-up to 93c8e52 (which unified Tab.cpp tooltips). The
underlying PrintConfig.cpp options for each bed-temperature slot
(cool_plate_temp, textured_cool_plate_temp, eng_plate_temp,
hot_plate_temp, textured_plate_temp, graphic_effect_plate_temp, and
their _initial_layer counterparts) still named the plate in their
tooltip, so the sidebar/advanced view kept showing plate-specific
text while the filament panel read "this plate".

Replace all 12 per-plate tooltips in PrintConfig.cpp with the same
generic wording already used by supertack:

  "Bed temperature for layers except the initial one. A value of 0
   means the filament does not support printing on this plate."
  "Bed temperature of the initial layer. A value of 0 means the
   filament does not support printing on this plate."

i18n (zh_CN.po): drop 10 now-orphaned per-plate msgids; the two
generic msgids (already present for Other layers / Initial layer)
are reused.
@github-actions

Copy link
Copy Markdown

Documentation validation failed

🔗 Link Validation Errors

📄 doc/developer-reference\Built-in-placeholders-variables.md:

  • Line 93: home#process-settings - Fragment does not exist
  • Line 93: home#material-settings - Fragment does not exist

📄 doc/developer-reference\How-to-wiki.md:

  • Line 44: home#material-settings - Fragment does not exist
  • Line 45: home#process-settings - Fragment does not exist
  • Line 46: home#prepare - Fragment does not exist
  • Line 47: home#calibrations - Fragment does not exist
  • Line 50: home#process-settings - Fragment does not exist
  • Line 50: home#support-settings - Fragment does not exist
  • Line 50: home#others-settings - Fragment does not exist

📄 doc/Home.md:

  • Line 14: Precise-wall.md - File does not exist
  • Line 17: extrusion-rate-smoothing.md - File does not exist
  • Line 33: adaptive-pressure-advance.md - File does not exist

📄 doc/Tab.cpp:

  • Line 2373: fill-patterns - File does not exist
  • Line 2376: fill-patterns - File does not exist
  • Line 2557: multimaterial_settings_prime_tower#brim-chamfer - Fragment does not exist
  • Line 2558: multimaterial_settings_prime_tower#brim-chamfer-max-width - Fragment does not exist
  • Line 2570: multimaterial_settings_prime_tower#wall-gap - Fragment does not exist
  • Line 2584: multimaterial_settings_ooze_prevention#delta-temperature - Fragment does not exist

🖼️ Image Validation Errors

📄 doc/developer-reference\How-to-create-profiles.md:

  • Line 142: [Markdown] Alt text "Help menu" ≠ filename "go-to-configuration-folder"
  • Line 144: [Markdown] Alt text "Delete system folder" ≠ filename "profile-delete-system-folder"

The plate-toolbar SLICE_FAILED condition in GLCanvas3D only checked
filament_temp_mixing and forgot cold-plate incompatibility, so a cold-
plate-blocked plate rendered as UNSLICED instead of SLICE_FAILED. Fix
by introducing Plater::is_plate_sliceable(int) that combines
PartPlate::can_slice() with both GUI-layer blockers, and delegate both
the toolbar rendering and find_next_sliceable_plate_for_slice_all to
it so the three call sites cannot drift again.

Also addresses harness-review findings on the cold-plate query API:
- const-correctness: mark get_cold_plate_compat_state /
  is_plate_blocked_by_cold_plate as const; add a const get_plate(int)
  overload to PartPlateList so the const query can resolve plates.
- dead code: remove unused s_cold_plate_bed_type_key constant and
  get_cold_plate_bed_index_1_based helper (no callers).
@github-actions

Copy link
Copy Markdown

Documentation validation failed

🔗 Link Validation Errors

📄 doc/developer-reference\Built-in-placeholders-variables.md:

  • Line 93: home#process-settings - Fragment does not exist
  • Line 93: home#material-settings - Fragment does not exist

📄 doc/developer-reference\How-to-wiki.md:

  • Line 44: home#material-settings - Fragment does not exist
  • Line 45: home#process-settings - Fragment does not exist
  • Line 46: home#prepare - Fragment does not exist
  • Line 47: home#calibrations - Fragment does not exist
  • Line 50: home#process-settings - Fragment does not exist
  • Line 50: home#support-settings - Fragment does not exist
  • Line 50: home#others-settings - Fragment does not exist

📄 doc/Home.md:

  • Line 14: Precise-wall.md - File does not exist
  • Line 17: extrusion-rate-smoothing.md - File does not exist
  • Line 33: adaptive-pressure-advance.md - File does not exist

📄 doc/Tab.cpp:

  • Line 2373: fill-patterns - File does not exist
  • Line 2376: fill-patterns - File does not exist
  • Line 2557: multimaterial_settings_prime_tower#brim-chamfer - Fragment does not exist
  • Line 2558: multimaterial_settings_prime_tower#brim-chamfer-max-width - Fragment does not exist
  • Line 2570: multimaterial_settings_prime_tower#wall-gap - Fragment does not exist
  • Line 2584: multimaterial_settings_ooze_prevention#delta-temperature - Fragment does not exist

🖼️ Image Validation Errors

📄 doc/developer-reference\How-to-create-profiles.md:

  • Line 142: [Markdown] Alt text "Help menu" ≠ filename "go-to-configuration-folder"
  • Line 144: [Markdown] Alt text "Delete system folder" ≠ filename "profile-delete-system-folder"

Annotate is_plate_sliceable() as the single point where GUI-layer
blockers converge, so follow-on PRs (#626 flow_ratio_zero, #589
mixing_cached) know to plug their predicate in here instead of
branching again at GLCanvas3D / MainFrame call sites. No behavior
change; just a comment/contract update so the three concurrent PRs
that all rewrite the same toolbar line can converge without
conflict.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Documentation validation failed

🔗 Link Validation Errors

📄 doc/developer-reference\Built-in-placeholders-variables.md:

  • Line 93: home#process-settings - Fragment does not exist
  • Line 93: home#material-settings - Fragment does not exist

📄 doc/developer-reference\How-to-wiki.md:

  • Line 44: home#material-settings - Fragment does not exist
  • Line 45: home#process-settings - Fragment does not exist
  • Line 46: home#prepare - Fragment does not exist
  • Line 47: home#calibrations - Fragment does not exist
  • Line 50: home#process-settings - Fragment does not exist
  • Line 50: home#support-settings - Fragment does not exist
  • Line 50: home#others-settings - Fragment does not exist

📄 doc/Home.md:

  • Line 14: Precise-wall.md - File does not exist
  • Line 17: extrusion-rate-smoothing.md - File does not exist
  • Line 33: adaptive-pressure-advance.md - File does not exist

📄 doc/Tab.cpp:

  • Line 2373: fill-patterns - File does not exist
  • Line 2376: fill-patterns - File does not exist
  • Line 2557: multimaterial_settings_prime_tower#brim-chamfer - Fragment does not exist
  • Line 2558: multimaterial_settings_prime_tower#brim-chamfer-max-width - Fragment does not exist
  • Line 2570: multimaterial_settings_prime_tower#wall-gap - Fragment does not exist
  • Line 2584: multimaterial_settings_ooze_prevention#delta-temperature - Fragment does not exist

🖼️ Image Validation Errors

📄 doc/developer-reference\How-to-create-profiles.md:

  • Line 142: [Markdown] Alt text "Help menu" ≠ filename "go-to-configuration-folder"
  • Line 144: [Markdown] Alt text "Delete system folder" ≠ filename "profile-delete-system-folder"

Rename *_slots_1based to *_slots_1_based to match snake_case style.
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown

Documentation validation failed

🔗 Link Validation Errors

📄 doc/developer-reference\Built-in-placeholders-variables.md:

  • Line 93: home#process-settings - Fragment does not exist
  • Line 93: home#material-settings - Fragment does not exist

📄 doc/developer-reference\How-to-wiki.md:

  • Line 44: home#material-settings - Fragment does not exist
  • Line 45: home#process-settings - Fragment does not exist
  • Line 46: home#prepare - Fragment does not exist
  • Line 47: home#calibrations - Fragment does not exist
  • Line 50: home#process-settings - Fragment does not exist
  • Line 50: home#support-settings - Fragment does not exist
  • Line 50: home#others-settings - Fragment does not exist

📄 doc/Home.md:

  • Line 14: Precise-wall.md - File does not exist
  • Line 17: extrusion-rate-smoothing.md - File does not exist
  • Line 33: adaptive-pressure-advance.md - File does not exist

📄 doc/Tab.cpp:

  • Line 2373: fill-patterns - File does not exist
  • Line 2376: fill-patterns - File does not exist
  • Line 2557: multimaterial_settings_prime_tower#brim-chamfer - Fragment does not exist
  • Line 2558: multimaterial_settings_prime_tower#brim-chamfer-max-width - Fragment does not exist
  • Line 2570: multimaterial_settings_prime_tower#wall-gap - Fragment does not exist
  • Line 2584: multimaterial_settings_ooze_prevention#delta-temperature - Fragment does not exist

🖼️ Image Validation Errors

📄 doc/developer-reference\How-to-create-profiles.md:

  • Line 142: [Markdown] Alt text "Help menu" ≠ filename "go-to-configuration-folder"
  • Line 144: [Markdown] Alt text "Delete system folder" ≠ filename "profile-delete-system-folder"

@LiuLikeQian
LiuLikeQian merged commit 7eec657 into main Aug 3, 2026
2 of 4 checks passed
iesteem added a commit that referenced this pull request Aug 3, 2026
Integrates PR #627 (cold-plate gating) with the flow_ratio_zero blocker
and the mixing-cached notification work (PR #589 path). All three
per-plate blockers now coexist behind the unified `is_plate_sliceable()`
gate introduced on main.

Conflict resolutions:
- PrintBase.hpp: StringExceptionType enum — assign unique ids
  (COLD_PLATE_INCOMPATIBLE = 6, FLOW_RATIO_ZERO = 7). Enum is in-memory
  only, not serialized, safe to renumber.
- Plater.hpp/.cpp: kept both HEAD's flow_ratio_zero family and main's
  cold_plate family; merged the update_apply_to_background_process
  validation chain to OR-in both INVALID bits and AND-in the RESTART bit
  only when all three blockers are clean.
- is_plate_sliceable(): consolidated gate runs all three blockers
  (mixing / cold-plate / flow_ratio_zero).
- GLCanvas3D.cpp: adopted main's unified `is_plate_sliceable(i)` call.
- MainFrame.cpp: kept main's cold-plate guard plus HEAD's flow_ratio_zero
  guard (call-site collapse deferred to a follow-up cleanup PR).
- zh_CN.po: merged both message sets.

Compile-verified: libslic3r, libslic3r_gui, Snapmaker_Orca.dll all link.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants