If you own an OrangeStorm Giga, you already know the joke: the printer is enormous, the auto bed leveling is optimistic, and the interpolation step turns your first layer into modern art. This project is the antidote—three GUI editors (Standard, Enhanced, Pro) that let you wrangle the 10×10 mesh manually so you can actually get plastic to stick.
TL;DR: Elegoo gave us four heater tiles and a firmware that thinks averages solve everything. This repo gives you a heatmap, sliders, batch tools, and a native macOS app to fix the mess.
- Interpolation gremlins – Klipper smooths the mesh, but the Giga’s 700 mm bed happily drifts between probe points. The default auto-level can’t see the sag.
- Four-bed reality – Each quadrant behaves differently; you need visibility per tile, not a single “it’s fine” number.
- First-layer despair – Watching a 1 kg spool air-print is expensive therapy. These editors let you nudge every point, flatten, offset, or surgically tweak hot spots before slicing again.
| Edition | Command | Best For |
|---|---|---|
| Pro (recommended) | python3 bed_level_editor_pro.py |
Full-featured dark UI, stats, live status, keyboard shortcuts, quadrant overlay, and native macOS build option. |
| Enhanced | python3 bed_level_editor_enhanced.py |
Adds 3D previews and region tools if you like surface plots. |
| Standard | python3 bed_level_editor.py |
Lightweight Tkinter window for quick edits without bells or whistles. |
Each edition reads printer.cfg, draws a heatmap of the 100 mesh points, and saves back with an automatic .backup so you can undo Elegoo’s “assistance.”
- Visual heatmap with per-cell values, stats panel, and quadrant labels (Pro/Enhanced).
- Point editing via text box, sliders, and quick ± buttons.
- Batch operations: “Level All,” offsets, flattening.
- Mesh statistics: min/max/range/mean/std dev.
- Targeted test squares: Pro edition exports two-layer 3MF/STL tests for only the tiles you touched and tracks which ones still need printing.
- Region selection (Enhanced/Pro) with averaging or smoothing.
- Backup on save:
printer.cfg.backupappears before any overwrite. - File browser, undo stack (Pro), and working-cell tracker for test squares.
The Pro editor remembers every point you nudge. Untested cells stay orange, and a one-click 🖨️ Generate Test Print button (under Modification Tracking) creates 2-layer squares strictly for those cells so you can validate the real bed without wasting filament.
- Edit the mesh like normal; modified cells are tracked automatically.
- Click 🖨️ Generate Test Print, pick 3MF (recommended) or STL, enter layer height/layers, and optionally split large batches (>10 cells) into multiple files.
- The exported 3MF already contains the correct XY transforms, so Elegoo Slicer drops each square on the exact tile. STL exports include a reference frame to align manually. A JSON placement guide sits alongside the file for quick Move-tool coordinates and troubleshooting tips.
Sample outputs live in Examples/BedLevel_Test_23cells.3mf (and the accompanying _positions.json guide) if you want to preview the workflow. Implementation details and slicer behavior research are documented in Research/printTestSquares.md and Research/objectPlacementonBed.md for anyone extending the generator.
- Install dependencies (once per machine):
pip install -r requirements.txt
- Launch the editor you want:
python3 bed_level_editor_pro.py # Pro edition python3 bed_level_editor_enhanced.py # Enhanced edition python3 bed_level_editor.py # Standard edition
- Select your
printer.cfgwhen prompted, click any point, adjust, and press Save. Restart Klipper afterward so the mesh reloads, then finally enjoy a sane first layer.
You can ship the Pro editor as a .app for teammates who don’t want Python.
./build_pyinstaller_app.sh
open "dist/Bed Level Editor Pro.app"- Creates
.venv-pyinstaller, installs PyInstaller, and emits a universal bundle. - Set
PYTHON_BIN=/Library/Frameworks/Python.framework/Versions/3.10/bin/python3if you want to force the system Framework build (handy for Tk compatibility).
./build_macos_app.sh
open "dist/Bed Level Editor Pro.app"- Keeps the original py2app pipeline for anyone who still needs it.
- Both scripts wipe
build/anddist/automatically; delete the matching virtualenv folder when switching between methods.
Gatekeeper tip: right-click → Open the first time if macOS complains about unsigned apps. Keep printer.cfg accessible; the GUI will prompt for it on launch.
BedLevel/
├── bed_level_editor.py # Standard Tkinter heatmap
├── bed_level_editor_enhanced.py # Adds 3D/surface tools
├── bed_level_editor_pro.py # Modern UI + macOS build hooks
├── build_macos_app.sh # py2app pipeline
├── build_pyinstaller_app.sh # PyInstaller pipeline
├── printer.cfg / printer.cfg.backup
├── requirements.txt
├── README.md (this file)
└── Examples/, Research/ # Print experiments & notes
- Stop Klipper before saving, otherwise the firmware rewrites over you.
- After edits, restart Klipper, load the mesh, and run a small test print (remember the four-bed heaters heat independently).
- The
.backupfile sticks around—don’t delete it until you’ve confirmed the new mesh behaves. - If you upgrade firmware or swap beds, re-probe from scratch and then fine-tune via the editor.
Pull requests are welcome. Follow PEP 8, keep comments concise, and document UI changes with screenshots or GIFs. If you devise a better way to shame Elegoo into fixing interpolation, include it in the README so the rest of us can celebrate.
Happy printing, and may your giga-scale first layer finally stay put.