151 lines
4.3 KiB
Python
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(
|
|
" "
|
|
)
|
|
)
|