Skip to content

Instantly share code, notes, and snippets.

@JoanTheSpark
Created November 27, 2015 08:54
Show Gist options
  • Star 57 You must be signed in to star a gist
  • Fork 14 You must be signed in to fork a gist
  • Save JoanTheSpark/e3fab5a8af44f7f8779c to your computer and use it in GitHub Desktop.
Save JoanTheSpark/e3fab5a8af44f7f8779c to your computer and use it in GitHub Desktop.
v2 with spin direction and increasing amount of segments per turn for smoother result in outer circles
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,
)
@titojff
Copy link

titojff commented Oct 20, 2020

Excellent Job, a good addition would be
calculation of the coil inductance.

Nice job

@karelv
Copy link

karelv commented Dec 21, 2020

super! calculation of coil resistance would be nice as well!

@thomadan01
Copy link

Thank you for this code!!

@omkar37777
Copy link

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 ?

@TheB4ssPl4y3r
Copy link

TheB4ssPl4y3r commented Sep 30, 2022

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:

Thank you very much,
best
Ramon

@QGB
Copy link

QGB commented Nov 7, 2022

@QGB
Copy link

QGB commented Nov 7, 2022

kicad 6.0.9 python 3.914 support? @JoanTheSpark

@miprochip
Copy link

Está genial el código y muy útil!. ¡Gracias!.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment