Commit Graph
17115 Commits
Author SHA1 Message Date
Rodrigo Faselli 208ebfc703 Combine brims option (Prusa style brims) (#12343)
* Union ex brims

Revert "Union ex brims"

This reverts commit bbc9a39faf318dc2df093eb2bdcebf19a4162fe9.

Update Brim.cpp

* dont repeat paths

* Update Brim.cpp

* multimaterial brim independiente

* Normal brim if is by object

* fix print order

* cleaning 1

* cleaning 2

* Normal brim if multimaterial on first layer

* fix artifact

* combine_brim optional

refactoring

* refactoring gcode.cpp

* refactoring brim.cpp

Update Brim.cpp

* Remove multimaterial first-layer check for brims

Stop detecting extruders used on the first layer and remove the is_multimaterial_first_layer guard. Simplify can_combine_brims to only consider combine_brims and whether printing is ByObject, allowing brims to be combined across extruders unless printing by object or combine_brims is disabled. Cleans up unused code and simplifies brim-generation conditions.

* Remove material specification from unified brim comment

* Update PrintConfig.cpp
2026-04-07 22:24:46 +08:00
Rodrigo Faselli 9478af93e4 💥Fix Crash with painted Line in some corrupted models (#12806)
Safeguard EdgeGrid.hpp
2026-04-07 22:22:43 +08:00
Vovodroid 9282d2de1d Fix arc fitting time progress with firmware retraction. (#12888) 2026-04-07 22:20:33 +08:00
Clifford GarwoodandClaude Sonnet 4.6 167211c85c refactor: rename ixex_carriage_width → ixex_nozzle_clearance; fix strip math and carriage box visualization
Config key rename (breaking for saved profiles — call out in PR):
  ixex_carriage_width_x/y → ixex_nozzle_clearance_x/y
  Labels updated to "Nozzle Clearance X/Y" with consistent tooltips
  describing the measurement as nozzle-to-collision-side-edge distance.

Strip math fix:
  Previously halved the clearance value (× 0.5) under the assumption
  the nozzle was centered in the carriage. The measurement is now the
  literal nozzle-to-edge distance, so the × 0.5 factor is removed.
  The collision strip width now equals the configured value directly.

Carriage box visualization (GCodeViewer):
  - Add per-carriage box_offset_x/y so the nozzle marker sits at the
    physically correct edge of the footprint box rather than centered.
  - X: zone-based by default (nozzle at inner edge facing bed center).
    Copy secondaries inherit the primary's X orientation (same movement
    direction). Mirror secondaries use the collision-side edge.
  - Y: always row-based regardless of copy/mirror mode. Gantry is always
    behind the nozzle (high-Y); front-row primaries with a back-row
    secondary override to place nozzle at the low-Y edge.
  - Fix stale mesh bug: GLModel::init_from() is a no-op when already
    initialized. Call reset() before init_from() so mesh rebuilds
    correctly when nozzle clearance values change in config.
  - Remove m_ixex_toolhead_box_dims (was the now-unnecessary cache key).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:57 -04:00
Clifford GarwoodandClaude Sonnet 4.6 a9ad17cea2 fix: route iXex collision zones through m_unselected for effective exclusion
params.excluded_regions flows into libnest2d PlacementConfig.m_excluded_regions
which is declared but never consumed by the NFP placer — the field is dead code.
m_unselected is the working path: it becomes fixeditems that are preloaded as
physical fixed obstacles in the NFP computation, same as the wipe tower.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:57 -04:00
Clifford GarwoodandClaude Sonnet 4.6 1cacc6d02d fix: exclude iXex collision strips from auto-arrange placement
Auto-arrange now injects the carriage collision zones as hard excluded
regions (is_virt_object) when an iXex parallel mode is active, using the
same BoundingBoxf3 data already stored for rendering and violation checks.
Objects will no longer be placed in the mirror-edge danger strips.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:57 -04:00
Clifford GarwoodandClaude Sonnet 4.6 b9f7148080 fix: constrain auto-arrange to iXex primary zone when parallel mode is active
Adds std::optional<BoundingBoxf> m_ixex_primary_zone_box to PartPlate,
populated by calc_ixex_zones() alongside the existing secondary/collision
zone geometry. The new ixex_primary_zone() getter calls ensure_ixex_zones()
so callers always get fresh data. ArrangeJob::process() replaces the
full-bed bedpts with the primary zone corners when the getter returns a
value, so auto-arrange no longer drops objects into the bed center.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:56 -04:00
Clifford GarwoodandClaude Sonnet 4.6 a3cac6c139 fix: remove iXex zone outline borders to eliminate aliasing flicker
The thin rectangular outlines around copy/mirror zones caused visible
aliasing and appeared to flash during interaction. Removed the border
GLModel, its build code in calc_ixex_zones(), the render block, and
the unused border field from IXexTheme.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:40 -04:00
Clifford GarwoodandClaude Sonnet 4.6 185b7084d2 fix: null m_ixex_mode_combo in TabPrint::clear_pages() to prevent dangling pointer crash
Same class of bug as the TabPrinter fix: clear_pages() destroys all
page widgets but didn't null m_ixex_mode_combo, causing a SIGSEGV in
refresh_ixex_mode_combo() when load_current_preset() ran after a
page rebuild (e.g. triggered by Plater::reset()).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:39 -04:00
Clifford GarwoodandClaude Sonnet 4.6 f4808ae7ba fix: avoid capturing C array in lambda for ixex_tool_layout combo
Arrays cannot be captured by value in C++ lambdas; replaced with a
static local declared inside the event handler.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:39 -04:00
Clifford GarwoodandClaude Sonnet 4.6 5297417518 fix: remove phantom phys_row variable reference from iXex button layout comment
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:39 -04:00
Clifford GarwoodandClaude Sonnet 4.6 a03d2cd566 fix: restore info log level in two commented-out PartPlate log lines
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:39 -04:00
Clifford GarwoodandClaude Sonnet 4.6 c75231ec03 fix: remove spurious blank lines in PrintConfig.hpp
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:39 -04:00
Clifford GarwoodandClaude Sonnet 4.6 e786fabb6a fix: restore info log levels in PartPlate accidentally raised to warning
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:39 -04:00
Clifford Garwood 1e56b65146 feat: Add iXex parallel printing support for IDEX and IQEX printers
Introduces first-class parallel printing (copy/mirror modes) for printers
with multiple independent X-axis carriages. Branded iXex (independent X
extruder), targeting Klipper firmware with a firmware-agnostic design.

- PrintConfig: new printer options declaring iXex capability and geometry
  (is_ixex, ixex_gantry_count, ixex_tools_per_gantry, carriage dims,
  tool layout, and per-mode name/role/gcode arrays)
- Preset: iXex keys registered in printer and process preset option lists
- Tab: IXexModesCtrl visual grid editor in Printer preset tab; mode
  dropdown in Process → Others tab; clear_pages() nulls iXex pointers to
  prevent dangling-pointer crash on preset save
- PartPlate: 2D zone visualization (active/dimmed/dividers) and
  placement-violation detection (has_ixex_placement_violations) that
  blocks slicing when objects fall outside the primary zone
- Plater: violation detection wired into update_background_process so
  the Slice button is disabled with an error notification on violation
- GCode: mode-activation G-code injected before machine_start_gcode
- GCodeViewer: multi-carriage toolhead markers in sequential preview,
  filament legend annotated with active carriage count and mode name
2026-04-06 14:57:39 -04:00
Rodrigo FaselliandIan Bassi d27889eb0f Fix fuzzy skin regresion classic wall generator (#12920)
Co-authored-by: Ian Bassi <12130714+ianalexis@users.noreply.github.com>
2026-04-06 15:29:23 -03:00
Eldenroot 7bec6c2d6b unix: Add model/step to the list of supported mime-types (#13000)
Cherry picked:

https://github.com/bambulab/BambuStudio/commit/64d360523d8007b3a4c988d2dbef2402ad42110f#diff-cc4863f0a9f2b1f46d3b0e04611772075d67ba61b6bdcfdc3a746b265668f8f4
2026-04-06 15:51:52 +03:00
Sabriel-Koh b79d3e1701 Fix: generic filaments not showing on list (#13037) 2026-04-06 14:27:49 +08:00
Rodrigo Faselli 7d21cf78c7 💥Fix crash when return from assembly mode linux (#13091)
* Fix return from assembly linux

* Tie deferred callback to canvas lifetime and add shutdown guards

Use m_canvas->CallAfter instead of wxGetApp().CallAfter to ensure the callback is only executed if the canvas is still alive.
Add early returns if wxGetApp().is_closing() is true before accessing plater or the 3D canvas, reducing the risk of use-after-free during application shutdown.
Addresses feedback regarding potential UI teardown race conditions.

* copilot suggestion

* Use local reference to wxGetApp() in Return button callback

Replace multiple calls to wxGetApp() with a single local reference
to improve readability and avoid redundant function calls.
2026-04-06 14:06:48 +08:00
Kevin LynaghandSoftFever 5ba71e1198 Allow printing even if nozzle info isn't reported by firmware. (#12814)
* Don't assume 0.4mm nozzle; format as "unknown" if not defined.

* Skip nozzle diameter and hardness checks if nozzle info unknown.

---------

Co-authored-by: SoftFever <softfeverever@gmail.com>
2026-04-06 12:40:36 +08:00
Derrick 5308fb5961 Add fallback for Qidi series ID matching (#13065)
# Description

The Qidi Max 4 and Q2 don't report what they are via /server/info like
the other Qidi printers apparently do. This means that filament matching
is a fool's erand because you'll never actually match anything. this
adds a fallback where we just use the configured machine type. I'm not
sure why we wouldn't just do that all the time, but I wanted to change
as little as possible.

Here's the entirety of the `/server/info` output from a Qidi Max 4:
```
{
  "result": {
    "klippy_connected": true,
    "klippy_state": "ready",
    "components": [
      "secrets",
      "template",
      "klippy_connection",
      "jsonrpc",
      "internal_transport",
      "application",
      "websockets",
      "database",
      "dbus_manager",
      "file_manager",
      "authorization",
      "klippy_apis",
      "shell_command",
      "machine",
      "data_store",
      "proc_stats",
      "job_state",
      "job_queue",
      "history",
      "http_client",
      "announcements",
      "webcam",
      "extensions",
      "octoprint_compat",
      "timelapse",
      "frp_manager",
      "mqtt"
    ],
    "failed_components": [],
    "registered_directories": [
      "config",
      "logs",
      "gcodes",
      "timelapse",
      "timelapse_frames",
      "config_examples",
      "docs"
    ],
    "warnings": [],
    "websocket_count": 3,
    "moonraker_version": "?",
    "missing_klippy_requirements": [],
    "api_version": [
      1,
      4,
      0
    ],
    "api_version_string": "1.4.0"
  }
}
```

There's no machine name or hostname. This is also what the response
looks like from a Q2, including the exact same API version numbers, so
we cannot match on that either.
2026-04-06 11:44:03 +08:00
Rodrigo Faselli 05e397f98d Fix save custom machine profiles with different extruder count (#13035)
* fix save profiles

* clean 1

* copilot suggestions
2026-04-06 10:01:58 +08:00
Rodrigo FaselliandKiss Lorand cfc2e9b62a Fix "Access Violation" (#12704) (#12856)
Co-authored-by: Kiss Lorand <50251547+kisslorand@users.noreply.github.com>
2026-04-05 15:10:09 -03:00
aa51d1965f Don't steal focus from text inputs on mouse (#12834)
In GLCanvas3D::on_mouse, avoid calling SetFocus when the currently focused window is a text input control (wxTextCtrl, wxComboBox or wxSpinCtrl). This prevents deselection bugs when the mouse leaves the window while a text control is focused. Also commented out explicit wx text-control includes near the top of the file.

Only TextCtrl needed

cleaning

Removed unused wxWidgets header includes.

Update GLCanvas3D.cpp

Co-authored-by: yw4z <yw4z@outlook.com>
Co-authored-by: yw4z <ywsyildiz@gmail.com>
2026-04-05 13:53:41 +03:00
Kiss Lorand 362ddec743 Fix overhang reverse threshold being ignored (#13061) 2026-04-04 16:56:42 -03:00
TheLegendTubaGuy 6682f9a94c Merge branch 'main' into fix_max_4_sync 2026-04-04 03:02:48 -05:00
Eldenrootandyw4z d7dbe6a0ed UX: Convert 'Change type' to submenu with checkmarks (#12205)
* UX: Convert 'Change type' to submenu with checkmarks

* Update GUI_ObjectList.cpp

* Update GUI_ObjectList.hpp

---------

Co-authored-by: yw4z <ywsyildiz@gmail.com>
2026-04-04 04:31:26 +03:00
TheLegendTubaGuy e0e714d22a Add fallback for Max 4 series ID matching
The Qidi Max 4 doesn't report that it's a Qidi Max 4 via /server/info
like the other Qidi printers apparently do.  This means that filament
matching is a fool's erand because you'll never actually match anything.
this adds a fallback where we just use the configured machine type.  I'm
not sure why we wouldn't just do that all the time, but I wanted to
change as little as possible.
2026-04-01 03:07:24 -05:00
SoftFever c948d87102 Fix flush_multiplier type mismatch: use ConfigOptionFloats instead of ConfigOptionFloat (#13062) 2026-04-01 14:43:12 +08:00
Eyal LevinandSoftFever 44faf142f9 Fix: generic locale fallback on all platforms when language is unavai… (#12948)
Fix: generic locale fallback on all platforms when language is unavailable

  Move the locale fallback chain out of the #ifdef __linux__ block so it
  applies on macOS and Windows too. Add a base-language fallback step that
  strips the region code (e.g. en_IL -> en) before trying the full
  fallback chain (current locale, system, best, en_US, en_UK).

  Previously, if wxLocale::IsAvailable() failed on non-Linux, the app
  would show an error and exit. Now it gracefully falls back to a working
  locale.

Co-authored-by: SoftFever <softfeverever@gmail.com>
2026-03-30 19:26:00 +08:00
Noisyfox 239253ecb1 Fix title bar resize grabber on Windows (#13020)
Make sure the title control passes all mouse events to its parent
2026-03-30 19:18:56 +08:00
SoftFever a475e35730 Fix non-ASCII path corruption on Windows using from_path() helper (#13036) 2026-03-30 14:51:45 +08:00
SoftFever b9952b39ad Fix slice/print panel background to use theme-transformed color 2026-03-30 12:29:14 +08:00
SoftFever 094dfc14bd Fix missing commas in vendor string arrays causing silent concatenation 2026-03-30 12:29:14 +08:00
SoftFever d62aa42e61 Fix macOS WebView script-handler cleanup after wxWidgets 3.3 upgrade
Commit ed88cbe removed `new WebViewWebKit` on macOS because wx 3.3
dropped the no-arg wxWebViewWebKit constructor, falling through to
wxWebView::New(). That bypassed the WebViewWebKit destructor that calls
RemoveScriptMessageHandler("wx"), reintroducing the WebKit teardown bug
the subclass was added to fix.

Restore the macOS-specific subclass path by adding a constructor that
forwards to the wx 3.3 wxWebViewConfiguration-based ctor.
2026-03-30 11:53:48 +08:00
Mitchell Mashburn c036ce059a Add re:3D printer profiles (#12935)
# Description

* Add re:3D printer profiles.

# Screenshots/Recordings/Graphs

<img width="404" height="275" alt="image" src="https://github.com/user-attachments/assets/b7a747a8-4d1a-440f-a214-4a98619e6723" />


## Tests

* Tested build on Linux Ubuntu.
* Ran profile validation script:

<img width="439" height="74" alt="image" src="https://github.com/user-attachments/assets/ad10e0a0-de9b-45c6-a40e-6cacb6e7b779" />
2026-03-30 10:36:28 +08:00
SoftFever 7d7f26ed69 fix a bug that switching from dark mode to light mode didn't work on Windows 2026-03-29 23:51:17 +08:00
SoftFever eefdabcd98 Fix maximized window not filling desktop after wxWidgets 3.3.2 upgrade
wxWidgets 3.3.2 changed MSWGetStyle to add WS_CAPTION when
wxMINIMIZE_BOX/wxMAXIMIZE_BOX/wxCLOSE_BOX is set. This caused
DefWindowProc to subtract the caption height in WM_NCCALCSIZE for
maximized windows, shrinking the client area and creating a gap
above the taskbar.

Fix by handling WM_NCCALCSIZE for the maximized case explicitly
(strip only border overshoot, not caption) and removing the now
unnecessary wxEVT_MAXIMIZE workaround.
2026-03-29 01:08:06 +08:00
SoftFever c06a0223a7 Fix 3D canvas blank area during window resize after wxWidgets 3.3.2 upgrade 2026-03-28 15:46:34 +08:00
SoftFever 779a36bf8b fix a regresion that the "search in preset" popup dialog will dismiss itself when move the cursor out of the dialog.
The regression is casued by 382cf57166 ("Fix hotkeys blocked in Prepare view when notification is shown")
2026-03-28 13:04:20 +08:00
SoftFever bf397a0632 fix an issue that white boarder is visible for context/file menu on Windows when dark mode is enabled 2026-03-28 00:54:59 +08:00
SoftFever c8a53a219a fix split button separator color in light mode on macOS 2026-03-27 17:23:44 +08:00
SoftFever 88eb2ab8df reapply wxALIGN_CENTER_VERTICAL 2026-03-27 14:53:56 +08:00
SoftFever c443129f34 fix build errors on latest xcode 2026-03-27 14:32:40 +08:00
SoftFever b6184a540e reduce the sidebar's width a bit 2026-03-27 00:27:39 +08:00
SoftFever fe55b260b4 suppress: gtk_style_context_add_provider: assertion 'GTK_IS_STYLE_CONTEXT (context)' failed 2026-03-26 16:22:07 +08:00
SoftFever 6148ba16b3 Fix GTK negative content width warnings for bitmap toggle buttons
On Linux/GTK, CheckBox, RadioBox, and SwitchButton set their size to
exactly the bitmap size (18x18 or 16x16), but GTK's internal CSS padding
requires additional space, resulting in negative content width warnings.
Use GetBestSize() on GTK to account for theme padding.
2026-03-26 16:05:58 +08:00
SoftFever e70fe6c1df fix Windows build errors 2026-03-26 14:10:10 +08:00
SoftFever fd47370c5c fix Windows build errors - wip 2026-03-26 10:17:19 +08:00
SoftFever 80c958d98b Remove macOS text position fudge factors (no longer needed with wx 3.3) 2026-03-25 15:58:39 +08:00