diff options
author | jaseg <git@jaseg.de> | 2023-04-15 17:09:20 +0200 |
---|---|---|
committer | jaseg <git@jaseg.de> | 2023-04-15 17:09:20 +0200 |
commit | 2400ff8e5fea41c1f8c6251d37a02209ec253f93 (patch) | |
tree | 395968d05156c094709fda605a9fe572aed32b1d /gerbonara/tests/test_kicad_symbols.py | |
parent | b43e4e2eec99b92a1e87f6388703db1ca33518d1 (diff) | |
download | gerbonara-2400ff8e5fea41c1f8c6251d37a02209ec253f93.tar.gz gerbonara-2400ff8e5fea41c1f8c6251d37a02209ec253f93.tar.bz2 gerbonara-2400ff8e5fea41c1f8c6251d37a02209ec253f93.zip |
cad: Add KiCad symbol/footprint parser
Diffstat (limited to 'gerbonara/tests/test_kicad_symbols.py')
-rw-r--r-- | gerbonara/tests/test_kicad_symbols.py | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/gerbonara/tests/test_kicad_symbols.py b/gerbonara/tests/test_kicad_symbols.py new file mode 100644 index 0000000..0a6c595 --- /dev/null +++ b/gerbonara/tests/test_kicad_symbols.py @@ -0,0 +1,59 @@ + +from itertools import zip_longest +import re + +from ..cad.kicad.sexp import build_sexp +from ..cad.kicad.sexp_mapper import sexp +from ..cad.kicad.symbols import Library + + +def test_parse(kicad_library_file): + Library.open(kicad_library_file) + + +def test_round_trip(kicad_library_file): + print('========== Stage 1 load ==========') + orig_lib = Library.open(kicad_library_file) + print('========== Stage 1 save ==========') + stage1_sexp = build_sexp(orig_lib.sexp()) + + print('========== Stage 2 load ==========') + reparsed_lib = Library.parse(stage1_sexp) + print('========== Stage 2 save ==========') + stage2_sexp = build_sexp(reparsed_lib.sexp()) + print('========== Checks ==========') + + for stage1, stage2 in zip_longest(stage1_sexp.splitlines(), stage2_sexp.splitlines()): + assert stage1 == stage2 + + original = re.sub(r'\(', '\n(', re.sub(r'\s+', ' ', kicad_library_file.read_text())) + original = re.sub(r'\) \)', '))', original) + original = re.sub(r'\) \)', '))', original) + original = re.sub(r'\) \)', '))', original) + original = re.sub(r'\) \)', '))', original) + stage1 = re.sub(r'\(', '\n(', re.sub(r'\s+', ' ', stage1_sexp)) + for original, stage1 in zip_longest(original.splitlines(), stage1.splitlines()): + if original.startswith('(version'): + continue + + original, stage1 = original.strip(), stage1.strip() + if original != stage1: + if any(original.startswith(f'({foo}') for foo in ['arc', 'circle', 'rectangle', 'polyline', 'text']): + # These files have symbols with graphic primitives in non-standard order + return + + if original.startswith('(offset') and stage1.startswith('(offset'): + # Some symbol files contain ints where floats should be. + return + + if original.startswith('(symbol') and stage1.startswith('(symbol'): + # Re-export can change symbol order. This is ok. + return + + if original.startswith('(at') and stage1.startswith('(at'): + # There is some disagreement as to whether rotation angles are ints or floats, and the spec doesn't say. + return + + assert original == stage1 + + |