#!/usr/bin/env python
import os
import re
import sys
import pprint
import pcbnew
def extract_labels(fn_in, labels):
in_ = open(fn_in)
prev = None
fn = os.path.basename(fn_in)
for line in in_.readlines():
#print('R: {!r}'.format(line))
if prev is not None:
text = line[:-1]
if re.match('^[A-Z0-9_]+$', text):
m = re.match('^Text Label (\d+) +(\d+) +(\d+) +(\d+) +~', prev)
if m:
x, y, orient, dim = m.groups()
if text not in labels[fn]:
labels[fn][text] = []
labels[fn][text] += [{'t': 'GLabel',
'dir': 'UnSpc',
'x': x,
'y': y,
'ori': orient,
'dim': dim}]
#print("Label: {!r}".format(text))
else:
sys.stderr.write("Failed extracting data from previous line: {} - {}\n".format(text, prev))
return False
prev = None
elif line.startswith('Text Label '):
prev = line
return True
def main(schemas):
labels = {}
for this in schemas:
labels[os.path.basename(this)] = {}
if not extract_labels(this, labels):
return False
#print('{}'.format(pprint.pformat(labels)))
print('labels = {')
for this in sorted(schemas):
fn = os.path.basename(this)
if not len(labels[fn]):
continue
print(' {!r}: {{').format(fn)
for text in sorted(labels[fn].keys()):
sys.stdout.write(' {!r}: ['.format(text))
first = True
for v in labels[fn][text]:
#sys.stdout.write(" x{}x ".format(first))
if not first:
sys.stdout.write("\n{}".format(' ' * (len(text) + 16)))
first = False
if str(v['dim']) != '48':
sys.stdout.write("{{'t': {t!r}, 'dir': {dir!r}, 'x': {x!s}, 'y': {y!s}, 'ori': {ori!s}, 'dim': {dim!s}}},".format(**v))
else:
sys.stdout.write("{{'t': {t!r}, 'dir': {dir!r}, 'x': {x!s}, 'y': {y!s}, 'ori': {ori!s}}},".format(**v))
print('],')
print(' },')
print(' },')
return True
if __name__ == '__main__':
try:
if len(sys.argv) == 0:
sys.stderr.write('Syntax: fix-labels.py *.sch\n')
sys.exit(1)
schemas = [x for x in sys.argv if x.endswith('.sch') and not x.endswith('Cryptech Alpha.sch')]
res = main(schemas)
if res:
sys.exit(0)
sys.exit(1)
except KeyboardInterrupt:
pass