pcb-stator-coil-generator/pcb_json.py
2022-10-12 17:10:13 +01:00

225 lines
5.5 KiB
Python

import json
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def create_pin(radius, angle, name):
return {
"x": radius * np.cos(np.deg2rad(angle)),
"y": radius * np.sin(np.deg2rad(angle)),
"name": name,
}
def create_pad(point, width, height, layer):
return {
"x": point[0],
"y": point[1],
"width": width,
"height": height,
"layer": layer,
}
def create_silk(point, text, layer="f", size=5, angle=0):
return {
"x": point[0],
"y": point[1],
"text": text,
"layer": layer,
"size": size,
"angle": angle,
}
def create_via(point):
return {"x": point[0], "y": point[1]}
def create_track(points):
return [{"x": x, "y": y} for x, y in points]
def create_mounting_hole(point, diameter):
return {
"x": point[0],
"y": point[1],
"diameter": diameter,
}
def create_track_json(points):
return [{"x": x, "y": y} for x, y in points]
def dump_json(
filename,
stator_radius,
stator_hole_radius,
track_width,
pin_diam,
pin_drill,
via_diam,
via_drill,
vias,
pins,
pads,
silk,
tracks_f,
tracks_b,
mounting_holes,
):
# dump out the results to json
json_result = {
"parameters": {
"trackWidth": track_width,
"statorHoleRadius": stator_hole_radius,
"statorRadius": stator_radius,
"viaDiameter": via_diam,
"viaDrillDiameter": via_drill,
"pinDiameter": pin_diam,
"pinDrillDiameter": pin_drill,
},
"vias": vias,
"pins": pins,
"pads": pads,
"silk": silk,
"tracks": {
"f": [create_track_json(points) for points in tracks_f],
"b": [create_track_json(points) for points in tracks_b],
},
"mountingHoles": mounting_holes,
}
json.dump(json_result, open(filename, "w"))
return json_result
def plot_json(json_result):
stator_radius = json_result["parameters"]["statorRadius"]
stator_hole_radius = json_result["parameters"]["statorHoleRadius"]
pin_diam = json_result["parameters"]["pinDiameter"]
pin_drill = json_result["parameters"]["pinDrillDiameter"]
# track_width = json_result["parameters"]["trackWidth"]
via_dim = json_result["parameters"]["viaDiameter"]
via_drill = json_result["parameters"]["viaDrillDiameter"]
# plot the back tracks
ax = None
for track in json_result["tracks"]["b"]:
df = pd.DataFrame(track, columns=["x", "y"])
ax = df.plot.line(x="x", y="y", color="blue", ax=ax)
ax.axis("equal")
# plot the front tracks
for track in json_result["tracks"]["f"]:
df = pd.DataFrame(track, columns=["x", "y"])
ax = df.plot.line(x="x", y="y", color="red", ax=ax)
ax.axis("equal")
# hide the legend
ax.legend().set_visible(False)
# make the plot bigger
ax.figure.set_size_inches(11, 11)
# set the axis range
ax.set_xlim(-stator_radius - 1, stator_radius + 1)
ax.set_ylim(-stator_radius - 1, stator_radius + 1)
# plot the pads
for pad in json_result["pads"]:
color = "red"
if pad["layer"] == "b":
color = "blue"
ax.add_patch(
plt.Rectangle(
(pad["x"] - pad["width"] / 2, pad["y"] - pad["height"] / 2),
pad["width"],
pad["height"],
fill=True,
color=color,
)
)
# plot the pins
for pin in json_result["pins"]:
ax.add_patch(
plt.Circle(
(pin["x"], pin["y"]),
radius=pin_diam / 2,
fill=True,
color="orange",
)
)
ax.add_patch(
plt.Circle(
(pin["x"], pin["y"]),
radius=pin_drill / 2,
fill=True,
color="white",
)
)
# plot the silk
for silk in json_result["silk"]:
color = "cyan"
if silk["layer"] == "b":
color = "magenta"
ax.text(
silk["x"],
silk["y"],
silk["text"],
horizontalalignment="center",
verticalalignment="center",
color=color,
fontsize=silk["size"] * 10,
)
# plot the vias
for via in json_result["vias"]:
ax.add_patch(
plt.Circle(
(via["x"], via["y"]),
radius=via_dim / 2,
fill=True,
color="black",
)
)
ax.add_patch(
plt.Circle(
(via["x"], via["y"]),
radius=via_drill / 2,
fill=True,
color="white",
)
)
# plot the mounting holes
for hole in json_result["mountingHoles"]:
ax.add_patch(
plt.Circle(
(hole["x"], hole["y"]),
radius=hole["diameter"] / 2,
fill=False,
color="orange",
)
)
# plot the edge cuts
ax.add_patch(
plt.Circle(
(0, 0),
radius=stator_radius,
fill=False,
color="orange",
)
)
ax.add_patch(
plt.Circle(
(0, 0),
radius=stator_hole_radius,
fill=False,
color="orange",
)
)
# save to file
ax.figure.savefig("coils.png")