diff --git a/src/kiplot/__main__.py b/src/kiplot/__main__.py index f2f99dd91..de6569a28 100644 --- a/src/kiplot/__main__.py +++ b/src/kiplot/__main__.py @@ -2,6 +2,7 @@ import argparse import logging +import pcbnew import os import sys @@ -38,10 +39,13 @@ def main(): .format(args.plot_config)) sys.exit(EXIT_BAD_ARGS) + board = pcbnew.LoadBoard(args.board_file) + logging.debug("Board loaded") + cr = config_reader.CfgYamlReader() with open(args.plot_config) as cf_file: - cfg = cr.read(cf_file) + cfg = cr.read(cf_file, board) # relative to CWD (absolute path overrides) outdir = os.path.join(os.getcwd(), args.out_dir) diff --git a/src/kiplot/config_reader.py b/src/kiplot/config_reader.py index b21c1a5f4..ec29f9343 100644 --- a/src/kiplot/config_reader.py +++ b/src/kiplot/config_reader.py @@ -337,55 +337,20 @@ def _parse_out_opts(self, otype, options): return po - def _get_layer_from_str(self, s): + def _get_layer_from_str(self, s, b): """ Get the pcbnew layer from a string in the config """ + n = b.GetLayerID( s ) - D = { - 'F.Cu': pcbnew.F_Cu, - 'B.Cu': pcbnew.B_Cu, - 'F.Adhes': pcbnew.F_Adhes, - 'B.Adhes': pcbnew.B_Adhes, - 'F.Paste': pcbnew.F_Paste, - 'B.Paste': pcbnew.B_Paste, - 'F.SilkS': pcbnew.F_SilkS, - 'B.SilkS': pcbnew.B_SilkS, - 'F.Mask': pcbnew.F_Mask, - 'B.Mask': pcbnew.B_Mask, - 'Dwgs.User': pcbnew.Dwgs_User, - 'Cmts.User': pcbnew.Cmts_User, - 'Eco1.User': pcbnew.Eco1_User, - 'Eco2.User': pcbnew.Eco2_User, - 'Edge.Cuts': pcbnew.Edge_Cuts, - 'Margin': pcbnew.Margin, - 'F.CrtYd': pcbnew.F_CrtYd, - 'B.CrtYd': pcbnew.B_CrtYd, - 'F.Fab': pcbnew.F_Fab, - 'B.Fab': pcbnew.B_Fab, - } - - layer = None - - if s in D: - layer = PC.LayerInfo(D[s], False) - elif s.startswith("Inner"): - m = re.match(r"^Inner\.([0-9]+)$", s) - - if not m: - raise YamlError("Malformed inner layer name: {}" - .format(s)) - - layer = PC.LayerInfo(int(m.group(1)), True) - else: + if n == -1: raise YamlError("Unknown layer name: {}".format(s)) + return n - return layer - - def _parse_layer(self, l_obj): + def _parse_layer(self, l_obj, b): l_str = self._get_required(l_obj, 'layer') - layer_id = self._get_layer_from_str(l_str) + layer_id = self._get_layer_from_str(l_str, b) layer = PC.LayerConfig(layer_id) layer.desc = l_obj['description'] if 'description' in l_obj else None @@ -393,7 +358,7 @@ def _parse_layer(self, l_obj): return layer - def _parse_output(self, o_obj): + def _parse_output(self, o_obj, b): try: name = o_obj['name'] @@ -434,7 +399,7 @@ def _parse_output(self, o_obj): layers = [] for l in layers: - o_cfg.layers.append(self._parse_layer(l)) + o_cfg.layers.append(self._parse_layer(l, b)) return o_cfg @@ -448,11 +413,12 @@ def _parse_preflight(self, pf, cfg): if 'run_drc' in pf: cfg.run_drc = pf['run_drc'] - def read(self, fstream): + def read(self, fstream, b): """ Read a file object into a config object :param fstream: file stream of a config YAML file + :param b: board object """ try: @@ -470,7 +436,7 @@ def read(self, fstream): for o in data['outputs']: - op_cfg = self._parse_output(o) + op_cfg = self._parse_output(o, b) cfg.add_output(op_cfg) return cfg diff --git a/src/kiplot/kiplot.py b/src/kiplot/kiplot.py index a8f4bb4b3..2e210664b 100644 --- a/src/kiplot/kiplot.py +++ b/src/kiplot/kiplot.py @@ -121,32 +121,23 @@ def _do_layer_plot(self, board, plot_ctrl, output): layer = l.layer suffix = l.suffix desc = l.desc - - # for inner layers, we can now check if the layer exists - if layer.is_inner: - - if layer.layer < 1 or layer.layer >= layer_cnt - 1: - raise PlotError( - "Inner layer {} is not valid for this board" - .format(layer.layer)) - # Set current layer - plot_ctrl.SetLayer(layer.layer) + plot_ctrl.SetLayer(layer) # Skipping NPTH is controlled by whether or not this is # a copper layer - is_cu = pcbnew.IsCopperLayer(layer.layer) + is_cu = pcbnew.IsCopperLayer(layer) po.SetSkipPlotNPTH_Pads(is_cu) plot_format = self._get_layer_plot_format(output) # Plot single layer to file logging.debug("Opening plot file for layer {} ({})" - .format(layer.layer, suffix)) + .format(layer, suffix)) plot_ctrl.OpenPlotfile(suffix, plot_format, desc) logging.debug("Plotting layer {} to {}".format( - layer.layer, plot_ctrl.GetPlotFileName())) + layer, plot_ctrl.GetPlotFileName())) plot_ctrl.PlotLayer() def _configure_excellon_drill_writer(self, board, offset, options):