- 
      
- 
        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