partsdb-labelgen/label_gen/uuid_gen.py

151 lines
4.3 KiB
Python

#!/usr/bin/python3
import uuid
import math
import xml.etree.ElementTree as ET
import xml.dom.minidom as minidom
from . import datamatrix
def encode_base256(b):
be = bytes()
if len(b) > 249:
raise Exception("data longer than 249 not yet supported")
f = bytes([len(b),])
be += f
be += b
out = bytes([231])
n = 2
for byte in be:
rn = (149 * n) % 255 + 1
out += bytes([(byte + rn) % 256])
n += 1
return out
# u = uuid.UUID('076c635f-3477-404c-bf05-1d98a947b6f8')
# creates svg etree object with 1x1 uuid datamatrix (18 x 18 squere)
def get_uuid(u=None, anchor_middle=False):
if u is not None:
u = uuid.UUID(uuid)
else:
u = uuid.uuid4()
dmc = datamatrix.encode(
list(encode_base256(u.bytes)), datamatrix.symbols["sq18"], ascii=False
)
dmg = ET.Element("g")
if anchor_middle:
dmg.set("transform", "translate({:f} {:f})".format(-0.5, -0.5))
datamatrix.render_data_matrix(dmc, 1 / 18, 0, dmg)
return dmg
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser()
parser.add_argument(
"format", choice={"a4", "stickers", "single"}, help="output format"
)
args = parser.parse_args()
ET.register_namespace("", "http://www.w3.org/2000/svg")
montage = ET.ElementTree(element=ET.Element("svg"))
if args.format in {"a4", "stickers"}:
width = 210
height = 297
xoffset = 0
yoffset = 0
mr = montage.getroot()
mr.set("width", "{:d}mm".format(width))
mr.set("height", "{:d}mm".format(height))
mr.set(
"viewBox",
"{:f} {:f} {:f} {:f}".format(
0 + xoffset, 0 + yoffset, width + xoffset, height + yoffset
),
)
if args.format == "a4":
margin = 20
yn = 0
dist = 8 + 1.7
while (yn + 1) * dist + 40 < height:
xn = 0
while (xn + 1) * dist + 40 < width:
g = ET.Element("g")
tr = []
tr.append("translate({:f} {:f})".format(20 + dist * xn, 20 + dist * yn))
tr.append("scale({:f} {:f})".format(8, 8))
g.set("transform", " ".join(tr))
g.append(get_uuid(anchor_middle=False))
mr.append(g)
xn += 1
yn += 1
elif args.format == "stickers":
x_no = 3
y_no = 8
el_x = width / x_no
el_y = height / y_no
field_no = 0
for yn in range(y_no):
for xn in range(x_no):
for ux in range(6):
for uy in range(3):
if yn + 1 == y_no and uy + 1 == 3:
continue
if xn + 1 == x_no and ux + 1 == 6:
continue
if yn == 0 and uy == 0:
continue
if xn == 0 and ux == 0:
continue
el = ET.Element("g")
el.set(
"transform",
"translate({:f} {:f}) scale(8 8)".format(
xn * el_x + 10 * ux + 5 + 1,
yn * el_y + 10 * uy + (el_y - 30) / 2,
),
)
el.append(get_uuid())
mr.append(el)
elif args.format == "single":
width = 10
height = 10
xoffset = 0
yoffset = 0
mr = montage.getroot()
mr.set("width", "{:d}mm".format(width))
mr.set("height", "{:d}mm".format(height))
mr.set(
"viewBox",
"{:f} {:f} {:f} {:f}".format(
0 + xoffset, 0 + yoffset, width + xoffset, height + yoffset
),
)
el = ET.Element("g")
el.set("transform", "translate(1 1) scale(8 8)")
el.append(get_uuid())
mr.append(el)
xmlstr = minidom.parseString(ET.tostring(mr)).toprettyxml(indent=" ")
s = open("{:s}.svg".format(args.format), "w")
s.write(xmlstr)
s.close()
import subprocess
subprocess.call(
"inkscape -f {format:s}.svg -A {format:s}.pdf".format(format=args.format).split(
" "
)
)