Created
November 27, 2015 08:54
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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, | |
) |
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!.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
super! calculation of coil resistance would be nice as well!