From 1944521bb9c407039f2378b4e24784f2d4862b2e Mon Sep 17 00:00:00 2001 From: jaseg Date: Sat, 5 Feb 2022 13:27:08 +0100 Subject: Add outline highlight example --- examples/highlight_outline.py | 79 +++++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 37 deletions(-) (limited to 'examples') diff --git a/examples/highlight_outline.py b/examples/highlight_outline.py index a73b79b..f2e7f3e 100644 --- a/examples/highlight_outline.py +++ b/examples/highlight_outline.py @@ -7,44 +7,47 @@ from gerbonara import LayerStack from gerbonara.graphic_objects import Line, Arc from gerbonara.apertures import CircleAperture from gerbonara.utils import MM +from gerbonara.utils import rotate_point def highlight_outline(input_dir, output_dir): - #stack = LayerStack.from_directory(input_dir) + stack = LayerStack.from_directory(input_dir) - #outline = [] - #for obj in stack.outline.objects: - # if isinstance(obj, Line): - # outline.append(obj) -# -# elif isinstance(obj, Arc): -# outline += obj.approximate(0.1, 'mm') - - # FIXME test code - print('') - print('') - from gerbonara.utils import rotate_point outline = [] - for i in range(16): - for j in range(16): - cx, cy = i*3, j*3 - w = i/8 - angle = j*2*math.pi/16 - x1, y1 = cx-w/2, cy - x2, y2 = cx+w/2, cy - - x1, y1 = rotate_point(x1, y1, angle, cx, cy) - x2, y2 = rotate_point(x2, y2, angle, cx, cy) + for obj in stack.outline.objects: + if isinstance(obj, Line): + outline.append(obj.converted('mm')) - outline.append(Line(x1, y1, x2, y2, aperture=CircleAperture(1.0, unit=MM), unit=MM)) - print(f'') + elif isinstance(obj, Arc): + outline += obj.converted('mm').approximate(0.1, 'mm') - marker_angle = math.pi/4 - marker_spacing = 0.2 - marker_width = 0.01 + # FIXME test code + #print('') + #print('') + #outline = [] + #for i in range(16): + # for j in range(16): + # cx, cy = i*3, j*3 + # w = i/8 + # angle = j*2*math.pi/16 + # x1, y1 = cx-w/2, cy + # x2, y2 = cx+w/2, cy + # + # x1, y1 = rotate_point(x1, y1, angle, cx, cy) + # x2, y2 = rotate_point(x2, y2, angle, cx, cy) + # + # outline.append(Line(x1, y1, x2, y2, aperture=CircleAperture(1.0, unit=MM), unit=MM)) + # print(f'') + + marker_angle = math.pi/3 + marker_spacing = 2 + marker_width = 0.1 marker_dx, marker_dy = math.sin(marker_angle)*marker_spacing, -math.cos(marker_angle)*marker_spacing marker_nx, marker_ny = math.sin(marker_angle), math.cos(marker_angle) + ap = CircleAperture(0.1, unit=MM) + stack['top silk'].apertures.append(ap) + for line in outline: cx, cy = (line.x1 + line.x2)/2, (line.y1 + line.y2)/2 dx, dy = line.x1 - cx, line.y1 - cy @@ -55,7 +58,8 @@ def highlight_outline(input_dir, output_dir): continue cr = math.hypot(cx, cy) - w = line.aperture.equivalent_width('mm') + #w = line.aperture.equivalent_width('mm') + w = 10 tl_x, tl_y = line.x1 + math.sin(angle)*w/2, line.y1 - math.cos(angle)*w/2 tr_x, tr_y = line.x2 + math.sin(angle)*w/2, line.y2 - math.cos(angle)*w/2 @@ -64,13 +68,11 @@ def highlight_outline(input_dir, output_dir): tr = math.dist((tl_x, tl_y), (br_x, br_y))/2 - print(f'') + #print(f'') - rot_cx, rot_cy = rotate_point(cx, cy, -marker_angle) - offx = (rot_cy % marker_spacing) / marker_spacing n = math.ceil(tr/marker_spacing) for i in range(-n, n+1): - px, py = cx + (i+offx)*marker_dx, cy + (i+offx)*marker_dy + px, py = cx + i*marker_dx, cy + i*marker_dy lx1, ly1 = px + tr*marker_nx, py + tr*marker_ny lx2, ly2 = px - tr*marker_nx, py - tr*marker_ny @@ -80,7 +82,7 @@ def highlight_outline(input_dir, output_dir): #print(f'') def clip_line_point(x1, y1, x2, y2, xabs, yabs): - print(x1, y1, x2, y2, end=' -> ', file=sys.stderr) + #print(x1, y1, x2, y2, end=' -> ', file=sys.stderr) if x2 != x1: a = (y2 - y1) / (x2 - x1) x2 = min(xabs, max(-xabs, x2)) @@ -97,7 +99,7 @@ def highlight_outline(input_dir, output_dir): elif abs(y1) > yabs: return None - print(x1, y1, x2, y2, file=sys.stderr) + #print(x1, y1, x2, y2, file=sys.stderr) return x1, y1, x2, y2 if not (foo := clip_line_point(lx1-cx, ly1-cy, lx2-cx, ly2-cy, r, w/2)): @@ -113,7 +115,9 @@ def highlight_outline(input_dir, output_dir): lx1, ly1 = rotate_point(lx1, ly1, -angle, cx, cy) lx2, ly2 = rotate_point(lx2, ly2, -angle, cx, cy) - print(f'') + stack['top silk'].objects.append(Line(lx1, ly1, lx2, ly2, unit=MM, aperture=ap, polarity_dark=True)) + + #print(f'') #delta_a = marker_angle - angle #ex, ey = px, py @@ -121,7 +125,8 @@ def highlight_outline(input_dir, output_dir): #print(delta_a, file=sys.stderr) # delta_a + math.pi/2 - print('') + stack.save_to_directory(output_dir) + #print('') if __name__ == '__main__': import argparse -- cgit