python svg to Gcode

技术 · 2023-03-16 · 1312 人浏览

python svg to Gcode

  1. 安装

​ pip3 install svgpathtools

  1. 代码样例
import os
from svgpathtools import Path, Line, QuadraticBezier, CubicBezier, Arc
from svgpathtools import svg2paths, wsvg
import numpy as np

HOME = "G28\n"
UNITS_MILLIMETRES = "G21\n"


def svg_to_gcode(lg, width=10, z_offset=5, n=0, num=0):
    # lg,n:组成文件 z_offset 落笔的深度 num:第几次不拼接多个文字的话不需要考虑
    FEEDRATE = 1500
    Z_OFFSET = 0
    START_X = num * width
    START_Y = 0
    WIDTH = width  # mm

    paths, attributes = svg2paths("./image/" + lg + ".svg")
    gcode = open("./image/" + lg + n + ".gcode", "w")

    # Add boilerplate code
    if num == 0:
        gcode.write(HOME)
    gcode.write(UNITS_MILLIMETRES)
    gcode.write("G1 F" + str(FEEDRATE) + "\n")
    gcode.write("G1 Z" + str(Z_OFFSET) + "\n")

    X = np.linspace(0, 1, 100)
    X_coords = []
    Y_coords = []

    for path in paths:
        for curve in path:
            p = curve.poly()
            X_coords.extend(p(X).real)
            Y_coords.extend(-p(X).imag)

    SCALE = WIDTH / (max(X_coords) - min(X_coords))
    Y_OFFSET = START_Y - min(np.array(Y_coords) * SCALE)
    X_OFFSET = START_X - min(np.array(X_coords) * SCALE)

    for path in paths:
        for subpath in path.continuous_subpaths():
            X_coords = []
            Y_coords = []
            if subpath:
                for curve in subpath:
                    p = curve.poly()
                    if (p.order == 1):
                        x = [p(0).real, p(1).real]
                        y = [-p(0).imag, -p(1).imag]
                    else:
                        x = p(X).real
                        y = -p(X).imag
                    x = np.array(x) * SCALE + X_OFFSET
                    y = np.array(y) * SCALE + Y_OFFSET
                    X_coords.extend(x)
                    Y_coords.extend(y)
                gcode.write("G1 X" + str(X_coords[0]) + " Y" + str(Y_coords[0]) + "\n")
                gcode.write("G1 Z" + str(Z_OFFSET + z_offset) + "\n")
                for x_coord, y_coord in zip(X_coords, Y_coords):
                    gcode.write("G1 X" + str(x_coord) + " Y" + str(y_coord) + "\n")
                gcode.write("G1 Z" + str(Z_OFFSET) + "\n")

            gcode.write("G1 X" + str((num + 1) * width) + " Y0" + "\n")
            gcode.write("G1 Z" + str(Z_OFFSET) + "\n")

配合python 解析ttf转svg

python svg Gcode
Theme Jasmine by Kent Liao