-
-
Save JoanTheSpark/e3fab5a8af44f7f8779c to your computer and use it in GitHub Desktop.
import sys, os | |
import shutil | |
import math | |
import itertools | |
from copy import deepcopy | |
# 0 1 2 3 4 5 6 | |
LIST_elmt = [" ("," (start ",") (end ",") "," (layer ",") ","))"] | |
#LIST_elmt = [" (gr_line (start 131.571908 182.314571) (end 112.874456 120.68499) (angle 90) (layer Dwgs.User) (width 0.1))"] | |
#LIST_elmt = [" (segment (start 118.7 106.7) (end 119.4 106.7) (width 0.25) (layer B.Cu) (net 0))"] | |
DICT_elmt = {"seg" : ["segment", "(width ", "(net "], | |
"arc" : ["gr_arc", "(angle ", "(width "], | |
"lne" : ["gr_line", "(angle ", "(width "], | |
} | |
DICT_lyr = { "dwg" : "Dwgs.User", | |
"cmt" : "Cmts.User", | |
"cut" : "Edge.Cuts", | |
"fcu" : "F.Cu", | |
"bcu" : "B.Cu", | |
} | |
def FNC_string (element, | |
STR_start, #1 | |
STR_end, #2 | |
Angle, #4 | |
layer, #5 | |
width, | |
): | |
STR_line = "" | |
""" | |
0 1 2 3 4 5 | |
LIST_elmt = [" ("," (start ",") (end ",") "," (layer ",") (width ","))"] | |
""" | |
for i in range(len(LIST_elmt)): | |
STR_line += LIST_elmt[i] | |
if i == 0: | |
STR_line += DICT_elmt[element][0] | |
if i == 1: | |
STR_line += STR_start | |
if i == 2: | |
STR_line += STR_end | |
if i == 3: | |
if element == "seg": | |
STR_line += DICT_elmt[element][1] | |
STR_angle = "{:.1f}".format(width) | |
else: | |
STR_line += DICT_elmt[element][1] | |
if element == "lne": | |
STR_angle = "90" | |
else: | |
STR_angle = str(Angle) | |
STR_line += STR_angle + ")" | |
if i == 4: | |
STR_line += DICT_lyr[layer] | |
if i == 5: | |
if element == "seg": | |
STR_line += DICT_elmt[element][2] | |
STR_line += str(Angle) | |
else: | |
STR_line += DICT_elmt[element][2] | |
STR_line += "{:.2f}".format(width) | |
STR_line += "\n" | |
return STR_line | |
def FNC_polygon (element, | |
STR_start, #1 | |
STR_end, #2 | |
Angle, #4 | |
layer, #5 | |
width, | |
): | |
STR_line = "" | |
""" | |
0 1 2 3 4 5 | |
LIST_elmt = [" ("," (start ",") (end ",") "," (layer ",") (width ","))"] | |
""" | |
for i in range(len(LIST_elmt)): | |
STR_line += LIST_elmt[i] | |
if i == 0: | |
STR_line += DICT_elmt[element][0] | |
if i == 1: | |
STR_line += STR_start | |
if i == 2: | |
STR_line += STR_end | |
if i == 3: | |
if element == "seg": | |
STR_line += DICT_elmt[element][1] | |
STR_angle = "{:.1f}".format(width) | |
else: | |
STR_line += DICT_elmt[element][1] | |
if element == "lne": | |
STR_angle = "90" | |
else: | |
STR_angle = str(Angle) | |
STR_line += STR_angle + ")" | |
if i == 4: | |
STR_line += DICT_lyr[layer] | |
if i == 5: | |
if element == "seg": | |
STR_line += DICT_elmt[element][2] | |
STR_line += str(Angle) | |
else: | |
STR_line += DICT_elmt[element][2] | |
STR_line += "{:.2f}".format(width) | |
STR_line += "\n" | |
return STR_line | |
def FNC_spiral (cntr, # (x,y) | |
radius, | |
segs, | |
startangle, | |
tw, # track width | |
td, # track distance | |
turns, | |
spin, # cw or ccw, +1 or -1 | |
layer, | |
net, | |
): | |
STR_data = "" | |
baseX = cntr[0] | |
baseY = cntr[1] | |
for j in range(turns): | |
segs += 4.0 | |
segangle = 360.0 / segs | |
segradius = td / segs | |
for i in range(int(segs)): | |
# central rings for HV and SNS | |
startX = baseX + (radius + segradius * i + td * (j+1)) * math.sin(math.radians(segangle*spin*i + startangle)) | |
startY = baseY + (radius + segradius * i + td * (j+1)) * math.cos(math.radians(segangle*spin*i + startangle)) | |
endX = baseX + (radius + segradius * (i + 1.0) + td * (j+1)) * math.sin(math.radians(segangle*spin*(i + 1.0) + startangle)) | |
endY = baseY + (radius + segradius * (i + 1.0) + td * (j+1)) * math.cos(math.radians(segangle*spin*(i + 1.0) + startangle)) | |
STR_data += FNC_string ("seg", #type of line | |
"{:.6f}".format(startX) + " " + "{:.6f}".format(startY), # start point | |
"{:.6f}".format(endX) + " " + "{:.6f}".format(endY), # end point | |
net, # angle or net value | |
layer, # layer on pcb | |
tw, # track width | |
) | |
return STR_data | |
if __name__ == '__main__': | |
Center = [115.0,105.0] # x/y coordinates of the centre of the pcb sheet | |
Radius = 0.5 # start radius in mm | |
Sides = 20.0 | |
StartAngle = 0.0 # degrees | |
TrackWidth = 0.4 | |
TrackDistance = 0.6 | |
Turns = 8 | |
Spin = -1 # ccw = +1, cw = -1 | |
Layer = "fcu" | |
Net = "1" | |
print FNC_spiral (Center, | |
Radius, | |
Sides, | |
StartAngle, | |
TrackWidth, | |
TrackDistance, | |
Turns, | |
Spin, | |
Layer, | |
Net, | |
) |
Excellent Job, a good addition would be
calculation of the coil inductance.
Nice job
super! calculation of coil resistance would be nice as well!
Thank you for this code!!
Thank You! @JoanTheSpark for the script, It's help me lot in PCB coil designing. Now, I have to design ### Rogowaski Coil - Can I devlop coil by this script ? & What changes are needed in script ?
I actually used your code in my masters thesis.
I generated a CITATION.cff file to cite your code. I attached it here if you want to add it to your code repo.
cff-version: 1.0.0
title: KiCAD_CopperSpiral_v2
message: >-
If you use this software, please cite it using the
metadata from this file.
type: software
authors:
- given-names: JoanTheSpark
identifiers: - type: url
value: >-
https://gist.github.com/JoanTheSpark/e3fab5a8af44f7f8779c
description: The GitHub URL of version 2
repository-code: >-
https://gist.github.com/JoanTheSpark/e3fab5a8af44f7f8779c
abstract: >-
KiCad tool to calculate and output copper coil path
coordinates.
commit: created
version: '2'
date-released: '2015-11-27'
Thank you very much,
best
Ramon
kicad 6.0.9 python 3.914 support? @JoanTheSpark
Está genial el código y muy útil!. ¡Gracias!.
Hallo, I'd like to know your license policy on this python code if you don't mind