Created
January 6, 2020 15:36
-
-
Save urish/9c5b4aea6362da086541be14acdf0f72 to your computer and use it in GitHub Desktop.
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
#!/usr/bin/env python3 | |
# coding=utf8 | |
# | |
# Simple script to scale a KiCad footprint | |
# Usage: | |
# python kicad-resize-footprint.py <input.kicad_mod> <output.kicad_mod> <scale> | |
# | |
# Where scale is how much to scale (1 = 100%) | |
# | |
# Copyright (C) 2020, Uri Shaked. | |
import sys | |
import re | |
scale = float(sys.argv[3]) | |
def scalexy(val): | |
x = float(val.group(1)) * scale | |
y = float(val.group(2)) * scale | |
return '(xy {} {})'.format(x, y) | |
with open(sys.argv[1], 'r') as in_file, open(sys.argv[2], 'w', newline='') as out_file: | |
for line in in_file: | |
line = re.sub(r'\(xy ([0-9-.]+) ([0-9-.]+)\)', scalexy, line) | |
out_file.write(line) |
I looked into the .kicad_mod files. Apparently the script provided above can only resize footprints generated by the image converter tool in KiCAD. I did not notice it till now since I mostly used this tool only for custom image footprints generated by the latter mentioned tool.
The following script will most likely rescale all footprints
import sys
import re
def scale_start(val):
x = float(val.group(1)) * scale
y = float(val.group(2)) * scale
return f'(start {x} {y})'
def scale_mid(val):
x = float(val.group(1)) * scale
y = float(val.group(2)) * scale
return f'(mid {x} {y})'
def scale_center(val):
x = float(val.group(1)) * scale
y = float(val.group(2)) * scale
return f'(center {x} {y})'
def scale_end(val):
x = float(val.group(1)) * scale
y = float(val.group(2)) * scale
return f'(end {x} {y})'
def scale_width(val):
x = float(val.group(1)) * scale
y = float(val.group(2)) * scale
return f'(width {x} {y})'
def scale_size(val):
x = float(val.group(1)) * scale
y = float(val.group(2)) * scale
return f'(size {x} {y})'
def scale_xy(val):
x = float(val.group(1)) * scale
y = float(val.group(2)) * scale
return f'(xy {x} {y})'
def scale_at(val):
x = float(val.group(1)) * scale
y = float(val.group(2)) * scale
return f'(at {x} {y}'
def scale_drill(val):
x = float(val.group(1)) * scale
return f'(drill {x})'
def scale_width(val):
x = float(val.group(1)) * scale
return f'(width {x})'
def scale_thickness(val):
x = float(val.group(1)) * scale
return f'(thickness {x})'
def process_line(line):
line = re.sub(r'\(start ([0-9-.]+) ([0-9-.]+)\)', scale_start, line)
line = re.sub(r'\(mid ([0-9-.]+) ([0-9-.]+)\)', scale_mid, line)
line = re.sub(r'\(center ([0-9-.]+) ([0-9-.]+)\)', scale_center, line)
line = re.sub(r'\(end ([0-9-.]+) ([0-9-.]+)\)', scale_end, line)
line = re.sub(r'\(width ([0-9-.]+) ([0-9-.]+)\)', scale_width, line)
line = re.sub(r'\(size ([0-9-.]+) ([0-9-.]+)\)', scale_size, line)
line = re.sub(r'\(xy ([0-9-.]+) ([0-9-.]+)\)', scale_xy, line)
line = re.sub(r'\(at ([0-9-.]+) ([0-9-.]+)', scale_at, line)
line = re.sub(r'\(drill ([0-9-.]+)\)', scale_drill, line)
line = re.sub(r'\(width ([0-9-.]+)\)', scale_width, line)
line = re.sub(r'\(thickness ([0-9-.]+)\)', scale_thickness, line)
return line
if __name__ == "__main__":
scale = float(sys.argv[3])
with open(sys.argv[1], 'r') as in_file, open(sys.argv[2], 'w', newline='') as out_file:
for line in in_file:
out_file.write(process_line(line))
PS: Thanks @ThisIsRobokitty for finding out the issue and recommending the solution
I have also modified the Streamlit web application hosted at the following URL:
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
the kicad files don't seem to use "xy" before the coords, so I made some light changes that worked for me (start, end, width, size). Wasn't elegant, but it did the trick for me.