diff --git a/fourcell/calibrate.py b/fourcell/calibrate.py new file mode 100644 index 0000000..abc4bd5 --- /dev/null +++ b/fourcell/calibrate.py @@ -0,0 +1,109 @@ +import argparse +import sys +import cv2 +import numpy as np +from os.path import exists, basename +from json import dumps +from common import display, draw_text + +IN=25.4 +DPI=600 +W=215.9 +H=279.4 + +ACTIONS=['generate', 'calibrate', 'scale'] + +MEASUREMENTS={ + 'A' : { 'x' : 10.0 }, # X 10mm + 'B' : { 'x' : 50.0 }, # X 50mm + 'C' : { 'x' : 100.0 }, # X 100mm + 'D' : { 'y' : 10.0 }, # Y 10mm + 'E' : { 'y' : 50.0 }, # Y 50mm + 'F' : { 'y' : 100.0 } # Y 100mm +} + +def create_blank(width, height): + rgb_color=(255,255,255) + image = np.zeros((height, width, 3), np.uint8) + color = tuple(reversed(rgb_color)) + image[:] = color + return image + +def generate (args) : + print('generate') + print('--------') + dpi = DPI + if args.dpi is not None : + dpi = args.dpi + dpmm = dpi / IN + print(f'DPI:{dpi}') + print(f'DPMM:{dpmm}') + w = int(W * dpmm) + h = int(H * dpmm) + blank = create_blank(w, h) + print(f'Created {w},{h}') + topLeftX = int(round(w * 0.2)) + topLeftY = int(round(h * 0.2)) + bottomRightX = int(round(w * 0.8)) + bottomRightY = int(round(h * 0.8)) + hundred = int(round(100.0 * dpmm)) + five = int(round(2.5 * dpmm)) + cv2.line(blank, (topLeftX, topLeftY,), (topLeftX + hundred, topLeftY,), [0, 0, 0], 1) + cv2.line(blank, (topLeftX, topLeftY,), (topLeftX, topLeftY + hundred,), [0, 0, 0], 1) + + for i in MEASUREMENTS.keys() : + print(i) + if 'x' in MEASUREMENTS[i] is not None: + print(MEASUREMENTS[i]['x']) + x = int(round(MEASUREMENTS[i]['x'] * dpmm)) + cv2.line(blank, (topLeftX + x, topLeftY + five,), (topLeftX + x, topLeftY - five,), [0, 0, 0], 1) + draw_text(blank, (topLeftX + x, topLeftY - five - int(2 * dpmm),), f'{i}', dpi) + elif 'y' in MEASUREMENTS[i] is not None: + print(MEASUREMENTS[i]['y']) + y = int(round(MEASUREMENTS[i]['y'] * dpmm)) + cv2.line(blank, (topLeftX + five, topLeftY + y,), (topLeftX - five, topLeftY + y,), [0, 0, 0], 1) + draw_text(blank, (topLeftX + five + int(2 * dpmm), topLeftY + y,), f'{i}', dpi) + + #display(blank) + + cv2.imwrite('test.jpg', blank) + +def calibrate (args) : + print('calibrate') + print('---------') + + json = {} + + name = input('Printer name: ') + json['name'] = name + + for m in MEASUREMENTS.keys(): + val = input(f'{m}: ') + json[m] = float(val) + + txt=dumps(json, sort_keys = True, indent = 4) + if args.output is None : + print(f'{txt}') + else : + print(f'Wrote file to {args.output}') + +def scale (args) : + print('scale') + print('-----') + +def main () : + parser = argparse.ArgumentParser() + parser.add_argument('action', help='The action to perform', choices=ACTIONS) + parser.add_argument('--dpi', '-d', help='DPI to generate', required=False, type=int) + parser.add_argument('--input', '-i', help='Input file', required=False) + parser.add_argument('--output', '-o', help='Output file', required=False) + args = parser.parse_args() + + if args.action == 'generate' : + generate(args) + elif args.action == 'calibrate' : + calibrate(args) + elif args.action == 'scale' : + scale(args) + +main() \ No newline at end of file diff --git a/fourcell/common.py b/fourcell/common.py index 8a074e2..23af267 100644 --- a/fourcell/common.py +++ b/fourcell/common.py @@ -126,4 +126,20 @@ def read_json (textPath) : jsonOut = {} with open(textPath) as json: jsonOut = load(json) - return jsonOut \ No newline at end of file + return jsonOut + +def draw_text (original, bl, text, dpi) : + font = cv2.FONT_HERSHEY_SIMPLEX + bottomLeftCornerOfText = bl + fontScale = dpi / 96 + fontColor = (0, 0, 0) + thickness = 2 + lineType = 2 + + cv2.putText(original, text, + bottomLeftCornerOfText, + font, + fontScale, + fontColor, + thickness, + lineType) \ No newline at end of file