Parse, analyse, and transform G-code files — plain-text .gcode and Prusa .bgcode
Project description
gcode-lib
A general-purpose Python library for parsing, analysing, and transforming G-code files.
Supports both plain-text .gcode and Prusa binary .bgcode formats, with a full planar
post-processing toolkit optimised for PrusaSlicer FDM workflows.
Requirements: Python 3.10+ (core uses stdlib only; VTK is optional for STL thumbnail rendering)
Installation
Install from this repository:
python -m pip install .
For editable development:
python -m pip install -e .
Optional STL thumbnail rendering support (VTK):
python -m pip install ".[thumbnails]"
Quick start
import gcode_lib as gl
# Load any .gcode or .bgcode file
gf = gl.load("benchy.gcode")
# Inspect basic statistics
stats = gl.compute_stats(gf.lines)
print(f"Moves: {stats.move_count}")
print(f"Layers: {stats.layer_count}")
print(f"Total extrusion: {stats.total_extrusion:.2f} mm")
bounds = stats.bounds
print(f"Print size: {bounds.width:.1f} x {bounds.height:.1f} mm")
print(f"Centred at: ({bounds.center_x:.1f}, {bounds.center_y:.1f})")
# Shift the print 10 mm to the right, 5 mm forward (arc-safe, no linearization needed)
lines = gl.translate_xy_allow_arcs(gf.lines, dx=10.0, dy=5.0)
gf.lines = lines
gl.save(gf, "benchy_shifted.gcode")
Features
- Loading and saving —
load()/save()for.gcodeand.bgcode,from_text()/to_text(), line and word parsing - State tracking —
ModalState,advance_state(), iterators for moves, arcs, and extruding segments - Transforms — arc linearization, translate, rotate, skew, arbitrary XY transform, layer-selective transforms, G91→G90 conversion, transform analysis
- Bed placement — out-of-bounds detection, recenter/fit to bed
- Statistics — bounding box, move/arc/travel counts, layer iteration
- Presets — printer bed dimensions and filament parameters for Prusa printers, auto-detection from G-code
- Utilities — template rendering, thumbnail encoding
- Binary .bgcode — full BGCode read support (None/DEFLATE/Heatshrink + MeatPack) and BGCode v2 writing
- PrusaSlicer CLI — executable discovery, capability probing, single and batch slicing, slicer compatibility notes
- API reference — complete function signatures, data classes, and constants
Concepts
GCodeLine
Every line of text becomes a GCodeLine:
line = gl.parse_line("G1 X10.5 Y20.0 E0.12345 F3600 ; perimeter")
print(line.command) # "G1"
print(line.words) # {"X": 10.5, "Y": 20.0, "E": 0.12345, "F": 3600.0}
print(line.comment) # "; perimeter"
print(line.raw) # "G1 X10.5 Y20.0 E0.12345 F3600 ; perimeter"
print(line.is_move) # True (G0 or G1)
print(line.is_arc) # False
print(line.is_blank) # False
ModalState
G-code is stateful. ModalState tracks the printer's current mode and position:
state = gl.ModalState()
print(state.abs_xy) # True (G90 absolute XY by default)
print(state.abs_e) # True (M82 absolute E by default)
print(state.x, state.y, state.z) # 0.0, 0.0, 0.0
GCodeFile
The top-level container returned by load() or from_text():
gf = gl.load("print.gcode")
print(gf.source_format) # "text" or "bgcode"
print(len(gf.lines)) # number of GCodeLine objects
print(len(gf.thumbnails)) # populated for .bgcode and plain-text files with embedded thumbnails
Limitations
- G91 relative XY in transforms:
apply_xy_transform,apply_skew,translate_xy,translate_xy_allow_arcs,rotate_xy, andapply_xy_transform_by_layerraiseValueErrorif a move/arc with X/Y words is encountered while the modal state is in G91 mode. Useto_absolute_xy()to convert relative segments to absolute before transforming — see G91 and relative-mode handling. - Arc endpoint tracking only.
advance_stateupdates position to the G2/G3 endpoint but does not interpolate intermediate arc positions. Uselinearize_arcsif you need full path coverage. - No helical arc support. G2/G3 with a simultaneous Z move (helical arcs) are not supported. All arcs are treated as planar (XY only).
- No G-code validation. The library parses and transforms; it does not validate that the
resulting G-code is printable or within machine limits. Use
find_oob_movesfor basic bed boundary checking.
Running the tests
python -m pytest tests/ -v
Tests cover I/O, parsing, state tracking, statistics, all transform functions, bed placement, layer iteration, presets, preset detection, template rendering, thumbnail encoding, BGCode round-trips (including Heatshrink decompression and MeatPack decoding), and PrusaSlicer CLI helpers — using only stdlib and pytest.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gcode_lib-1.1.7.tar.gz.
File metadata
- Download URL: gcode_lib-1.1.7.tar.gz
- Upload date:
- Size: 1.8 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8661a8a2c85ed528e72fbb101dc39fd22d2c8e1fdd818482e49ff6b90a018e29
|
|
| MD5 |
c23e57dcff7710f57fbe23254d4861c4
|
|
| BLAKE2b-256 |
d3e3022d58108af1a32c3e33faafa8de76ac7399dcfde9f80c320ed8256c5b3f
|
File details
Details for the file gcode_lib-1.1.7-py3-none-any.whl.
File metadata
- Download URL: gcode_lib-1.1.7-py3-none-any.whl
- Upload date:
- Size: 72.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7bd1b90a84276bc61fec1c6d6247cb64dee367a44781486ac1cdc6bd5a21e7e2
|
|
| MD5 |
da128650cfe811c096a3ea220aed3f0f
|
|
| BLAKE2b-256 |
766fafddd0eabb0b933e055003437575292f90b904d0f4b9ef213ccdd4549e74
|