Advertisement
Guest User

Untitled

a guest
Sep 1st, 2015
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.93 KB | None | 0 0
  1. # tested in python 2.7.2
  2. # works for KiCAD 5978 by parsing output of this script into a xyz.kicad_pcb at the right place
  3.  
  4. import sys, os
  5. import shutil
  6. import math
  7.  
  8. # 0 1 2 3 4 5 6
  9. LIST_elmt = [" ("," (start ",") (end ",") "," (layer ",") ","))"]
  10. #LIST_elmt = [" (gr_line (start 131.571908 182.314571) (end 112.874456 120.68499) (angle 90) (layer Dwgs.User) (width 0.1))"]
  11. #LIST_elmt = [" (segment (start 118.7 106.7) (end 119.4 106.7) (width 0.25) (layer B.Cu) (net 0))"]
  12. DICT_elmt = {"seg" : ["segment", "(width ", "(net "], # this works for Copper only
  13. "arc" : ["gr_arc", "(angle ", "(width "], # those work on all Non-Copper layers
  14. "lne" : ["gr_line", "(angle ", "(width "],
  15. }
  16. DICT_lyr = { "dwg" : "Dwgs.User",
  17. "cmt" : "Cmts.User",
  18. "cut" : "Edge.Cuts",
  19. "fcu" : "F.Cu",
  20. "bcu" : "B.Cu",
  21. }
  22.  
  23. def FNC_string (element,
  24. STR_start, #1
  25. STR_end, #2
  26. Angle, #4
  27. layer, #5
  28. width,
  29. ):
  30. STR_line = ""
  31. """
  32. 0 1 2 3 4 5
  33. LIST_elmt = [" ("," (start ",") (end ",") "," (layer ",") (width ","))"]
  34. """
  35. for i in range(len(LIST_elmt)):
  36. STR_line += LIST_elmt[i]
  37. if i == 0:
  38. STR_line += DICT_elmt[element][0]
  39. if i == 1:
  40. STR_line += STR_start
  41. if i == 2:
  42. STR_line += STR_end
  43. if i == 3:
  44. if element == "seg":
  45. STR_line += DICT_elmt[element][1]
  46. STR_angle = "{:.1f}".format(width)
  47. else:
  48. STR_line += DICT_elmt[element][1]
  49. if element == "lne":
  50. STR_angle = "90"
  51. else:
  52. STR_angle = str(Angle)
  53. STR_line += STR_angle + ")"
  54. if i == 4:
  55. STR_line += DICT_lyr[layer]
  56. if i == 5:
  57. if element == "seg":
  58. STR_line += DICT_elmt[element][2]
  59. STR_line += str(Angle)
  60. else:
  61. STR_line += DICT_elmt[element][2]
  62. STR_line += "{:.2f}".format(width)
  63. STR_line += "\n"
  64. return STR_line
  65.  
  66. def FNC_arc (cntr, # (x,y)
  67. radius,
  68. sides,
  69. startangle,
  70. angle,
  71. tw, # track width
  72. layer,
  73. net,
  74. ):
  75.  
  76. STR_data = ""
  77. baseX = cntr[0]
  78. baseY = cntr[1]
  79. sideangle = angle / sides
  80.  
  81. for i in range(sides):
  82. startX = baseX + radius * math.sin(math.radians(sideangle*(i+0.5) + startangle))
  83. startY = baseY + radius * math.cos(math.radians(sideangle*(i+0.5) + startangle))
  84. endX = baseX + radius * math.sin(math.radians(sideangle*(i+1.5) + startangle))
  85. endY = baseY + radius * math.cos(math.radians(sideangle*(i+1.5) + startangle))
  86. STR_data += FNC_string ("seg", #type of line, change if not used for copper layer
  87. "{:.6f}".format(startX) + " " + "{:.6f}".format(startY), # start point
  88. "{:.6f}".format(endX) + " " + "{:.6f}".format(endY), # end point
  89. net, # angle or net value
  90. layer, # layer on pcb
  91. tw, # track width
  92. )
  93. return STR_data
  94.  
  95.  
  96. if __name__ == '__main__':
  97.  
  98. #adjust parameters to your liking here
  99. Center = [105.0,105.0] # x/y coordinates of the centre of the pcb sheet
  100. Radius = 20 # mm
  101. Sides = 36
  102. StartAngle = 45.0 # degrees
  103. Angle = 135.0 # degrees
  104. TrackWidth = 0.4
  105. Layer = "fcu"
  106. Net = "0"
  107.  
  108. print FNC_arc (Center,
  109. Radius,
  110. Sides,
  111. StartAngle,
  112. Angle,
  113. TrackWidth,
  114. Layer,
  115. Net,
  116. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement