pcb-stator-coil-generator/pcb_json.py

141 lines
3.5 KiB
Python
Raw Normal View History

import json
import pandas as pd
import matplotlib.pyplot as plt
def create_track(points):
return [{"x": x, "y": y} for x, y in points]
def dump_json(
filename,
stator_radius,
stator_hole_radius,
track_width,
pad_diam,
pad_drill,
via_diam,
via_drill,
vias,
pads,
silk,
tracks_f,
tracks_b,
):
# 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,
"padDiameter": pad_diam,
"padDrillDiameter": pad_drill,
},
"vias": vias,
"pads": pads,
"silk": silk,
"tracks": {
"f": [create_track(points) for points in tracks_f],
"b": [create_track(points) for points in tracks_b],
},
}
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"]
pad_diam = json_result["parameters"]["padDiameter"]
pad_drill = json_result["parameters"]["padDrillDiameter"]
# 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(10, 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 edge cuts
ax.add_patch(
plt.Circle(
(0, 0),
radius=stator_radius,
fill=False,
color="yellow",
)
)
ax.add_patch(
plt.Circle(
(0, 0),
radius=stator_hole_radius,
fill=False,
color="yellow",
)
)
# plot the pads
for pad in json_result["pads"]:
ax.add_patch(
plt.Circle(
(pad["x"], pad["y"]),
radius=pad_diam / 2,
fill=True,
color="yellow",
)
)
ax.add_patch(
plt.Circle(
(pad["x"], pad["y"]),
radius=pad_drill / 2,
fill=True,
color="white",
)
)
# plot the silk
for silk in json_result["silk"]:
ax.text(
silk["x"],
silk["y"],
silk["text"],
horizontalalignment="center",
verticalalignment="center",
color="black",
fontsize=50,
)