Skip to main content

Python G-Code Tools library with complete G-Code Reader and Writer

Project description

Python G-Code Tools library with complete* G-Code Reader and Writer

*as per 3D-Printing needs

This library is under development - method names, workflow and logic will differ between releases!

Ensure your printer software can catch illegal g-code moves, as this library has still very large amount of bugs! Also keep an eye on your print.

Installation

pip install GcodeTools

Available G-Code Tools

Feature Status command
Translate Gcode Tools.translate(gcode, Vector)
Rotate Gcode Tools.rotate(gcode, int)
Scale Gcode Tools.scale(gcode, Vector|float)
subdivide Gcode move.subdivide(step)
Get move's flowrate move.get_flowrate()
Set flowrate
(in mm^2, use scale to set in %)
move.set_flowrate(float)
Detect Gcode features block.layer, block.object, block.move_type
Split layers Gcode.layers[n]
Split bodies 🔜 Tools.split(gcode)
Insert custom Gcode Gcode.(insert, append, extend, __add__)
Read Thumbnails (raw PNG data) Tools.read_thumbnails(gcode)
Write Thumbnails (raw PNG data) Tools.write_thumbnail(gcode, data, width, height, textwidth)
Generate configuration files for slicer Tools.generate_config_files(gcode)
Convert from/to Arc Moves currently auto-translation to G1 in GcodeParser
Find body bounds Tools.get_bounding_box(gcode)
Trim unused Gcode 🔜 Tools.trim(gcode)
Offset Gcodes in time
Create custom travel movement
convert to firmware retraction 🔜 Tools.regenerate_travels(gcode)

Legend:

  • ✅ Fully supported
  • ❌ Not yet supported, to be implemented
  • 🔜 Partially supported, to be implemented

More features soon! Feel free to open feature request

G-Code

Current G-Code object relation:

Gcode (list[Block])
│
├─ slicing config (precision, speed): Config
│
├─ single Gcode instruction: Block
│  │
│  ├─ Position: Vector
│  │
│  ├─ Other Gcode related properties
│  │
│  └─ Original command and if it's to be emitted: command, emit_command
└─ ...

In each block, every G-Code variable is contained. That means, blocks can be taken out of Gcode, rearranged, etc.

That however does not take move origin (move starting position) in count! That will be adressed in future.

Gcode structure and its components will be changing heavily during beta!

  • Current target is to get rid of original command (work on trimmed Gcode) to decrease RAM usage and computation time
  • Gcode is in the first tests of linked-list approach for simplification of iterating methods

G-Code Parser

from GcodeTools import Gcode

gcode = Gcode('file.gcode')

Progress Callback example implementation

my_tqdm = tqdm(unit="lines", desc="Reading Gcode")
update = lambda i, length: (setattr(my_tqdm, 'total', length), my_tqdm.update(1))
gcode = Gcode().from_file('file.gcode', update)

Example usage

Example to move objects that have benchy in their name, by translation vector. It will also trim gcode (minify).

from GcodeTools import Gcode, Tools, Vector, Config

verbose = False

config = Config(speed=1200) # initial speed before first Gcode's `F` parameter

gcode = Gcode('file.gcode', config=config)

out_gcode: Gcode = Tools.trim(gcode)

translation = Vector(-200, -100, 0)

for x in out_gcode:
    if 'benchy' in x.object.lower():
        x.move.translate(translation)

out_gcode.write_file('out.gcode', verbose)

Change tool to T1 when printing sparse infill, otherwise change to T0. For bridges set fan speed to 100%.

from GcodeTools import *

gcode = Gcode('file.gcode')

for block in gcode:
    if block.move_type == MoveTypes.SPARSE_INFILL:
        block.T = 1
    else:
        block.T = 0
    
    if block.move_type == MoveTypes.BRIDGE:
        block.fan = 255

gcode.write_file('out.gcode')

Plot histogram of flow ratios. Useful for checking arachne settings.

from GcodeTools import Gcode
import matplotlib.pyplot as plt

gcode = Gcode('file.gcode')

flowrates = []
for block in gcode:
    if flowrate := block.move.get_flowrate():
        flowrates.append(flowrate)

plt.figure(figsize=(12, 6))
plt.hist(flowrates, bins=100)
plt.xlabel("Flowrate (mm E / mm XYZ)")
plt.ylabel("Frequency")
plt.title(f"Flowrate Distribution")
plt.grid(axis='y', alpha=0.75)
plt.show()
plt.close()

Generate configuration files for slicer

gcode = Gcode('gcode.gcode')

config = Tools.generate_config_files(gcode, './config')

Generate thumbnails (experimental, and in current version slow)

# For this feature you need to install additional package:
# pip install GcodeTools[thumbnails]

# If this code fails, try setting `backend` to one of: ['openGL3_glfw', 'openGL3_egl', 'openGL_mock']

backend = 'auto'

import GcodeTools
from GcodeTools.Thumbnails import gcode_thumbnails

gcode = Gcode('gcode.gcode')

img = gcode_thumbnails.Thumbnails.generate_thumbnail(gcode, backend=backend)
thumb_gcode = gcode_thumbnails.Thumbnails.set_thumbnail(gcode, img)

img.save('thumb.png')
thumb_gcode.write_file('out.gcode')

# gcode_thumbnails.Thumbnails.interactive(gcode, color_moves = True, backend=backend) # to open gcode viewer

Supported Slicers

Tested with:

  • Prusa Slicer 2.8.1, 2.9.3
  • Orca Slicer 2.1.1
  • Super Slicer 2.5.59.12, 2.7.61.10
  • Slic3r 1.3.0
  • Cura 5.8.1
  • Simplify3D 4.0.0
  • Bambu Studio 2.0.3.54
Any slicer Cura Prusa Slicer Orca Slicer Slic3r Super Slicer Simplify3D Bambu Studio
Reading Gcode
Keep track of coordinates
Temperature control
Fan control
Spliting Objects ✅1
Extracting features
Arc Moves 🔜2

Legend:

1: Turn on LABEL_OBJECTS
2: Arc moves currently automatically translate to G1 moves

  • ✅ Fully supported
  • ❌ Not supported, limited by slicer
  • 🔜 To be implemented
  • ➖ Partially supported, limited by slicer

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

gcodetools-0.3.1.tar.gz (26.0 kB view details)

Uploaded Source

Built Distribution

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

gcodetools-0.3.1-py3-none-any.whl (23.3 kB view details)

Uploaded Python 3

File details

Details for the file gcodetools-0.3.1.tar.gz.

File metadata

  • Download URL: gcodetools-0.3.1.tar.gz
  • Upload date:
  • Size: 26.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for gcodetools-0.3.1.tar.gz
Algorithm Hash digest
SHA256 8de118197b6754ebf6a25f3791c850f8c9ac31e6fd07fe2178786753f96df5fc
MD5 cc53c1b18592b37d1ab49b726aea6123
BLAKE2b-256 ad8cf77dd2fd758c2f6f0d64b84fe4926fe04bac48d901e10b474b73a18e43a0

See more details on using hashes here.

Provenance

The following attestation bundles were made for gcodetools-0.3.1.tar.gz:

Publisher: python-publish.yml on Matszwe02/GcodeTools

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file gcodetools-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: gcodetools-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 23.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for gcodetools-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ef228dc5edb337980621d35fcdf9d1dcc62f29eadefbea78d358ad4eaeea76ae
MD5 b9daca592431dc9bd9792c4c7e77090f
BLAKE2b-256 0d9ce1b5051e4e578d712ff022039a2a9ecc7093e4d07e383108602c59031c94

See more details on using hashes here.

Provenance

The following attestation bundles were made for gcodetools-0.3.1-py3-none-any.whl:

Publisher: python-publish.yml on Matszwe02/GcodeTools

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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