Skip to content

Instantly share code, notes, and snippets.

@kotatsuyaki
Created June 13, 2022 02:29
Show Gist options
  • Save kotatsuyaki/81a09070f3610ea0ea284ca4cc294646 to your computer and use it in GitHub Desktop.
Save kotatsuyaki/81a09070f3610ea0ea284ca4cc294646 to your computer and use it in GitHub Desktop.
Plotting program for ICCAD 2022 problem E (TW)
import sys
from typing import Literal, Union
from matplotlib import axes, pyplot as plt
from matplotlib import collections as mc
import numpy as np
import math
infile = open(sys.argv[1])
outfile = open(sys.argv[2])
asm_gap = 0.0
cop_gap = 0.0
silk_len = 0.0
xs = []
ys = []
draw_mode: Union[Literal['asm'], Literal['cop']] = 'asm'
asm_lines = []
asm_arcs = []
cop_lines = []
cop_arcs = []
silk_lines = []
for line in infile:
tokens = line.strip().split(',')
tag = tokens[0]
if tag == 'assemblygap':
asm_gap = float(tokens[1])
elif tag == 'coppergap':
cop_gap = float(tokens[1])
elif tag == 'silkscreenlen':
silk_len = float(tokens[1])
elif tag == 'assembly':
draw_mode = 'asm'
elif tag == 'copper':
draw_mode = 'cop'
elif tag == 'line':
if draw_mode == 'asm':
asm_lines.append([
(float(tokens[1]), float(tokens[2])),
(float(tokens[3]), float(tokens[4]))])
xs.append(float(tokens[1]))
xs.append(float(tokens[3]))
ys.append(float(tokens[2]))
ys.append(float(tokens[4]))
else:
cop_lines.append([
(float(tokens[1]), float(tokens[2])),
(float(tokens[3]), float(tokens[4]))])
xs.append(float(tokens[1]))
xs.append(float(tokens[3]))
ys.append(float(tokens[2]))
ys.append(float(tokens[4]))
elif tag == 'arc':
if draw_mode == 'asm':
sx, sy = float(tokens[1]), float(tokens[2])
ex, ey = float(tokens[3]), float(tokens[4])
cx, cy = float(tokens[5]), float(tokens[6])
radius = math.sqrt((sx - cx)**2 + (sy - cy)**2)
xs.append(cx + radius)
xs.append(cx - radius)
ys.append(cy + radius)
ys.append(cy - radius)
asm_arcs.append(plt.Circle((cx, cy), radius, fill=False, edgecolor='C0', linewidth=1.5))
else:
sx, sy = float(tokens[1]), float(tokens[2])
ex, ey = float(tokens[3]), float(tokens[4])
cx, cy = float(tokens[5]), float(tokens[6])
radius = math.sqrt((sx - cx)**2 + (sy - cy)**2)
xs.append(cx + radius)
xs.append(cx - radius)
ys.append(cy + radius)
ys.append(cy - radius)
cop_arcs.append(plt.Circle((cx, cy), radius, fill=False, edgecolor='C2', linewidth=1.5))
else:
raise RuntimeError(f'Unknown tag {tag}')
print(f'Max gap: {max(cop_gap, asm_gap)}')
print(f'X range: {np.array(xs).min()} - {np.array(xs).max()}')
print(f'Y range: {np.array(ys).min()} - {np.array(ys).max()}')
for line in outfile:
tokens = line.strip().split(',')
tag = tokens[0]
if tag == 'silkscreen':
pass
elif tag == 'line':
sx, sy = float(tokens[1]), float(tokens[2])
ex, ey = float(tokens[3]), float(tokens[4])
xs.append(sx)
xs.append(ex)
ys.append(sy)
ys.append(ey)
silk_lines.append([(sx, sy), (ex, ey)])
else:
raise RuntimeError(f'Unknown tag {tag}')
print(asm_lines)
asm_line_collection = mc.LineCollection(asm_lines)
cop_line_collection = mc.LineCollection(cop_lines, colors='C2')
silk_line_collection = mc.LineCollection(silk_lines, colors='C1')
subplot = plt.subplots()
fig = subplot[0]
ax: axes.Axes = subplot[1]
ax.add_collection(asm_line_collection)
ax.add_collection(cop_line_collection)
ax.add_collection(silk_line_collection)
for arc in asm_arcs:
ax.add_patch(arc)
for arc in cop_arcs:
ax.add_patch(arc)
xs = np.array(xs)
ys = np.array(ys)
ax.set_xlim(xs.min(), xs.max())
ax.set_ylim(ys.min(), ys.max())
ax.axis('equal')
plt.savefig('out.png')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment