Skip to main content

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 savingload() / save() for .gcode and .bgcode, from_text() / to_text(), line and word parsing
  • State trackingModalState, 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, and apply_xy_transform_by_layer raise ValueError if a move/arc with X/Y words is encountered while the modal state is in G91 mode. Use to_absolute_xy() to convert relative segments to absolute before transforming — see G91 and relative-mode handling.
  • Arc endpoint tracking only. advance_state updates position to the G2/G3 endpoint but does not interpolate intermediate arc positions. Use linearize_arcs if 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_moves for 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gcode_lib-1.1.3.tar.gz (1.8 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gcode_lib-1.1.3-py3-none-any.whl (71.5 kB view details)

Uploaded Python 3

File details

Details for the file gcode_lib-1.1.3.tar.gz.

File metadata

  • Download URL: gcode_lib-1.1.3.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

Hashes for gcode_lib-1.1.3.tar.gz
Algorithm Hash digest
SHA256 6eed085b9cf31f40c06f0639afc03ae3e71010737717cd0cb7d3f6a233039cbd
MD5 7f56fb52628cc2d9a4394c368ac54092
BLAKE2b-256 47d7444f58cff85ee9504bd53df6c9db6a0edea74b12021ee0ffb1ad80a3d898

See more details on using hashes here.

File details

Details for the file gcode_lib-1.1.3-py3-none-any.whl.

File metadata

  • Download URL: gcode_lib-1.1.3-py3-none-any.whl
  • Upload date:
  • Size: 71.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for gcode_lib-1.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 ef7292d7468f73c1f747df659fadf27bd24dc1766d72fa286824b75db00e4b72
MD5 e77d1a975e0110831e887b78dd28fe70
BLAKE2b-256 8fe546a943e0bd401fd3941e7bede4840f849a672b839bda7965bad699b10e10

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page