mirror of
https://github.com/atomic14/kicad-coil-plugins.git
synced 2024-10-18 09:06:57 +00:00
225 lines
5.5 KiB
Python
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")
|