From 35f24607fe65385370cd6e267ea5afffbfbd1e34 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sat, 29 Jan 2022 02:42:29 +0100 Subject: Layer matcher WIP --- gerbonara/gerber/tests/test_layers.py | 76 +++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 34 deletions(-) (limited to 'gerbonara/gerber/tests') diff --git a/gerbonara/gerber/tests/test_layers.py b/gerbonara/gerber/tests/test_layers.py index 62ef522..482d340 100644 --- a/gerbonara/gerber/tests/test_layers.py +++ b/gerbonara/gerber/tests/test_layers.py @@ -31,11 +31,11 @@ REFERENCE_DIRS = { 'IRNASIoTbank1.2.Bot': 'bottom copper', 'IRNASIoTbank1.2.Drill': 'drill plated', 'IRNASIoTbank1.2.Info': None, - 'IRNASIoTbank1.2.Outline': 'drill outline', + 'IRNASIoTbank1.2.Outline': 'mechanical outline', 'IRNASIoTbank1.2.PasteBot': 'bottom paste', 'IRNASIoTbank1.2.PasteTop': 'top paste', - 'IRNASIoTbank1.2.PosiBot': 'bottom silkscreen', - 'IRNASIoTbank1.2.PosiTop': 'top silkscreen', + 'IRNASIoTbank1.2.PosiBot': 'bottom silk', + 'IRNASIoTbank1.2.PosiTop': 'top silk', 'IRNASIoTbank1.2.StopBot': 'bottom mask', 'IRNASIoTbank1.2.StopTop': 'top mask', 'IRNASIoTbank1.2.Tool': None, @@ -45,7 +45,7 @@ REFERENCE_DIRS = { 'allegro': { '08_057494d-ipc356.ipc': None, - '08_057494d.rou': 'drill outline', + '08_057494d.rou': 'mechanical outline', 'Read_Me.1': None, 'art_param.txt': None, 'assy1.art': None, @@ -73,7 +73,7 @@ REFERENCE_DIRS = { 'MINNOWMAX_REVA2_PUBLIC_TOPSIDE.pdf': None, 'MinnowMax_RevA1_IPC356A.ipc': None, 'MinnowMax_RevA1_DRILL/MinnowMax_RevA1_NCDRILL.drl': 'drill unknown', - 'MinnowMax_RevA1_DRILL/MinnowMax_RevA1_NCROUTE.rou': 'drill outline', + 'MinnowMax_RevA1_DRILL/MinnowMax_RevA1_NCROUTE.rou': 'drill unknown', 'MinnowMax_RevA1_DRILL/nc_param.txt': None, 'MinnowMax_RevA1_DRILL/ncdrill.log': None, 'MinnowMax_RevA1_DRILL/ncroute.log': None, @@ -116,15 +116,15 @@ REFERENCE_DIRS = { 'Gerber/LimeSDR-QPCIe_1v2.GBO': 'bottom silk', 'Gerber/LimeSDR-QPCIe_1v2.GBP': 'bottom paste', 'Gerber/LimeSDR-QPCIe_1v2.GBS': 'bottom mask', - 'Gerber/LimeSDR-QPCIe_1v2.GM1': 'dirll outlinej', + 'Gerber/LimeSDR-QPCIe_1v2.GM1': 'mechanical outline', 'Gerber/LimeSDR-QPCIe_1v2.GM14': None, 'Gerber/LimeSDR-QPCIe_1v2.GM15': None, 'Gerber/LimeSDR-QPCIe_1v2.GPB': None, 'Gerber/LimeSDR-QPCIe_1v2.GPT': None, - 'Gerber/LimeSDR-QPCIe_1v2.GTL': 'bottom copper', - 'Gerber/LimeSDR-QPCIe_1v2.GTO': 'bottom silk', - 'Gerber/LimeSDR-QPCIe_1v2.GTP': 'bottom paste', - 'Gerber/LimeSDR-QPCIe_1v2.GTS': 'bottom mask', + 'Gerber/LimeSDR-QPCIe_1v2.GTL': 'top copper', + 'Gerber/LimeSDR-QPCIe_1v2.GTO': 'top silk', + 'Gerber/LimeSDR-QPCIe_1v2.GTP': 'top paste', + 'Gerber/LimeSDR-QPCIe_1v2.GTS': 'top mask', 'Gerber/LimeSDR-QPCIe_1v2.REP': None, 'Gerber/LimeSDR-QPCIe_1v2.RUL': None, 'Gerber/LimeSDR-QPCIe_1v2.apr': None, @@ -134,22 +134,23 @@ REFERENCE_DIRS = { 'NC Drill/LimeSDR-QPCIe_1v2.LDP': None, }, - 'diptrace': { - 'mainboard.drl': 'drill plated', - 'mainboard_BoardOutline.gbr': 'drill outline', - 'mainboard_Bottom.gbr': 'bottom copper', - 'mainboard_BottomMask.gbr': 'bottom mask', - 'mainboard_Top.gbr': 'top copper', - 'mainboard_TopMask.gbr': 'top mask', - 'mainboard_TopSilk.gbr': 'top silk', - }, +# TODO there are three designs in this folder. make test work with that. +# 'diptrace': { +# 'mainboard.drl': 'drill plated', +# 'mainboard_BoardOutline.gbr': 'mechanical outline', +# 'mainboard_Bottom.gbr': 'bottom copper', +# 'mainboard_BottomMask.gbr': 'bottom mask', +# 'mainboard_Top.gbr': 'top copper', +# 'mainboard_TopMask.gbr': 'top mask', +# 'mainboard_TopSilk.gbr': 'top silk', +# }, 'eagle-newer': { 'copper_bottom.gbr': 'bottom copper', 'copper_top.gbr': 'top copper', 'drills.xln': 'drill unknown', 'gerber_job.gbrjob': None, - 'profile.gbr': 'drill outline', + 'profile.gbr': 'mechanical outline', 'silkscreen_bottom.gbr': 'bottom silk', 'silkscreen_top.gbr': 'top silk', 'soldermask_bottom.gbr': 'bottom mask', @@ -163,7 +164,7 @@ REFERENCE_DIRS = { 'copper_inner_l2.gbr': 'inner_2 copper', 'copper_inner_l3.gbr': 'inner_3 copper', 'copper_top_l1.gbr': 'top copper', - 'profile.gbr': 'drill outline', + 'profile.gbr': 'mechanical outline', 'silkscreen_bottom.gbr': 'bottom silk', 'silkscreen_top.gbr': 'top silk', 'soldermask_bottom.gbr': 'bottom mask', @@ -173,7 +174,7 @@ REFERENCE_DIRS = { }, 'easyeda': { - 'Gerber_BoardOutline.GKO': 'drill outline', + 'Gerber_BoardOutline.GKO': 'mechanical outline', 'Gerber_BottomLayer.GBL': 'bottom copper', 'Gerber_BottomSolderMaskLayer.GBS': 'bottom mask', 'Gerber_Drill_NPTH.DRL': 'drill nonplated', @@ -190,7 +191,7 @@ REFERENCE_DIRS = { }, 'fritzing': { - 'combined.GKO': 'drill outline', + 'combined.GKO': 'mechanical outline', 'combined.gbl': 'bottom copper', 'combined.gbo': 'bottom silk', 'combined.gbs': 'bottom mask', @@ -222,7 +223,7 @@ REFERENCE_DIRS = { 'power-art.gbo': 'bottom silk', 'power-art.gbp': 'bottom paste', 'power-art.gbs': 'bottom mask', - 'power-art.gko': 'drill outline', + 'power-art.gko': 'mechanical outline', 'power-art.gtl': 'top copper', 'power-art.gto': 'top silk', 'power-art.gtp': 'top paste', @@ -232,7 +233,7 @@ REFERENCE_DIRS = { }, 'siemens': { - '80101_0125_F200_ContourPlated.ncd': 'drill outline', + '80101_0125_F200_ContourPlated.ncd': 'mechanical outline', '80101_0125_F200_DrillDrawingThrough.gdo': None, '80101_0125_F200_L01_Top.gdo': 'top copper', '80101_0125_F200_L02.gdo': 'inner_2 copper', @@ -257,7 +258,7 @@ REFERENCE_DIRS = { }, 'siemens-2': { - 'Gerber/BoardOutlline.gdo': 'drill outline', + 'Gerber/BoardOutlline.gdo': 'mechanical outline', 'Gerber/DrillDrawingThrough.gdo': None, 'Gerber/EtchLayerBottom.gdo': 'bottom copper', 'Gerber/EtchLayerTop.gdo': 'top copper', @@ -267,7 +268,7 @@ REFERENCE_DIRS = { 'Gerber/SolderPasteTop.gdo': 'top paste', 'Gerber/SoldermaskBottom.gdo': 'bottom mask', 'Gerber/SoldermaskTop.gdo': 'top mask', - 'NCDrill/ContourPlated.ncd': 'drill outline', + 'NCDrill/ContourPlated.ncd': 'mechanical outline', 'NCDrill/ThruHoleNonPlated.ncd': 'drill nonplated', 'NCDrill/ThruHolePlated.ncd': 'drill plated', }, @@ -278,7 +279,7 @@ REFERENCE_DIRS = { 'design_export.gbo': 'bottom silk', 'design_export.gbp': 'bottom paste', 'design_export.gbs': 'bottom mask', - 'design_export.gko': 'drill outline', + 'design_export.gko': 'mechanical outline', 'design_export.gtl': 'top copper', 'design_export.gto': 'top silk', 'design_export.gtp': 'top paste', @@ -295,27 +296,34 @@ def test_layer_classifier(ref_dir): path = reference_path(ref_dir) print('Reference path is', path) file_map = { filename: role for filename, role in file_map.items() if role is not None } - rev_file_map = { value: key for key, value in file_map.items() } + rev_file_map = { tuple(value.split()): key for key, value in file_map.items() } drill_files = { filename: role for filename, role in file_map.items() if role.startswith('drill') } stack = LayerStack.from_directory(path) + print('loaded layers:', ', '.join(f'{side} {use}' for side, use in stack.graphic_layers)) for side in 'top', 'bottom': for layer in 'copper', 'silk', 'mask', 'paste': + if 'allegro-2' in ref_dir and layer in ('silk', 'mask', 'paste'): + # This particular example has very poorly named files + continue if (side, layer) in rev_file_map: assert (side, layer) in stack found = stack[side, layer] assert isinstance(found, GerberFile) - assert found.filename == Path(rev_file_map[side, layer]).name + assert found.original_path.name == Path(rev_file_map[side, layer]).name else: # not in file_map assert (side, layer) not in stack - for filename, role in drill_files: - assert any(layer.filename == Path(filename).name for layer in stack.drill_layers) - assert len(stack.drill_layers) == len(drill_files) + assert len(stack.drill_layers) == len(drill_files) + + for filename, role in drill_files.items(): + print('drill:', filename, role) + print([(layer.original_path, layer.original_path == Path(filename).name) for layer in stack.drill_layers]) + assert any(layer.original_path.name == Path(filename).name for layer in stack.drill_layers) - for layer in stack.drill_files: + for layer in stack.drill_layers: assert isinstance(layer, ExcellonFile) -- cgit