diff --git a/kiplot/config_reader.py b/kiplot/config_reader.py index f464288f..1c529840 100644 --- a/kiplot/config_reader.py +++ b/kiplot/config_reader.py @@ -537,6 +537,26 @@ class CfgYamlReader(CfgReader): return o_cfg + def _parse_filters(self, filters, cfg): + for filter in filters: + if 'filter' in filter: + comment = filter['filter'] + if 'number' in filter: + number = filter['number'] + if number is None: + config_error("empty 'number' in 'filter' definition ("+str(filter)+")") + else: + config_error("missing 'number' for 'filter' definition ("+str(filter)+")") + if 'regex' in filter: + regex = filter['regex'] + if regex is None: + config_error("empty 'regex' in 'filter' definition ("+str(filter)+")") + else: + config_error("missing 'regex' for 'filter' definition ("+str(filter)+")") + cfg.add_filter(comment, number, regex) + else: + config_error("'filters' section of 'preflight' must contain 'filter' definitions (not "+str(filter)+")") + def _parse_preflight(self, pf, cfg): logger.debug("Parsing preflight options: {}".format(pf)) @@ -556,6 +576,9 @@ class CfgYamlReader(CfgReader): if 'ignore_unconnected' in pf: cfg.ignore_unconnected = pf['ignore_unconnected'] + if 'filters' in pf: + self._parse_filters(pf['filters'], cfg) + def read(self, fstream): """ Read a file object into a config object diff --git a/kiplot/kiplot.py b/kiplot/kiplot.py index 03a7ccb6..d668ffaa 100644 --- a/kiplot/kiplot.py +++ b/kiplot/kiplot.py @@ -68,7 +68,7 @@ def check_script(cmd, url, version=None): def check_eeschema_do(file): - check_script(misc.CMD_EESCHEMA_DO, misc.URL_EESCHEMA_DO, '1.1.1') + check_script(misc.CMD_EESCHEMA_DO, misc.URL_EESCHEMA_DO, '1.4.0') sch_file = os.path.splitext(file)[0] + '.sch' if not os.path.isfile(sch_file): logger.error('Missing schematic file: ' + sch_file) @@ -157,17 +157,26 @@ class Plotter(object): else: logger.error('Unknown action to skip: '+skip) exit(misc.EXIT_BAD_ARGS) + # Create the filters file + filter_file = None + if (self.cfg.run_erc or self.cfg.run_drc) and self.cfg.filters: + filter_file = os.path.join(self.cfg.outdir, 'kiplot_errors.filter') + with open(filter_file, 'w') as f: + f.write(self.cfg.filters) if self.cfg.run_erc: - self._run_erc(brd_file) + self._run_erc(brd_file, filter_file) if self.cfg.update_xml: self._update_xml(brd_file) if self.cfg.run_drc: self._run_drc(brd_file, self.cfg.ignore_unconnected, - self.cfg.check_zone_fills) + self.cfg.check_zone_fills, filter_file) - def _run_erc(self, brd_file): + def _run_erc(self, brd_file, filter_file): sch_file = check_eeschema_do(brd_file) - cmd = [misc.CMD_EESCHEMA_DO, 'run_erc', sch_file, self.cfg.outdir] + cmd = [misc.CMD_EESCHEMA_DO, 'run_erc'] + if filter_file: + cmd.extend(['-f', filter_file]) + cmd.extend([sch_file, self.cfg.outdir]) # If we are in verbose mode enable debug in the child if logger.getEffectiveLevel() <= logging.DEBUG: cmd.insert(1, '-vv') @@ -196,9 +205,12 @@ class Plotter(object): logger.error('Failed to update the BoM, error %d', ret) exit(misc.BOM_ERROR) - def _run_drc(self, brd_file, ignore_unconnected, check_zone_fills): - check_script(misc.CMD_PCBNEW_RUN_DRC, misc.URL_PCBNEW_RUN_DRC, '1.3.1') - cmd = [misc.CMD_PCBNEW_RUN_DRC, 'run_drc', brd_file, self.cfg.outdir] + def _run_drc(self, brd_file, ignore_unconnected, check_zone_fills, filter_file): + check_script(misc.CMD_PCBNEW_RUN_DRC, misc.URL_PCBNEW_RUN_DRC, '1.4.0') + cmd = [misc.CMD_PCBNEW_RUN_DRC, 'run_drc'] + if filter_file: + cmd.extend(['-f', filter_file]) + cmd.extend([brd_file, self.cfg.outdir]) # If we are in verbose mode enable debug in the child if logger.getEffectiveLevel() <= logging.DEBUG: cmd.insert(1, '-vv') diff --git a/kiplot/plot_config.py b/kiplot/plot_config.py index da3909aa..0bb39e5d 100644 --- a/kiplot/plot_config.py +++ b/kiplot/plot_config.py @@ -1,6 +1,9 @@ import pcbnew from . import error +from . import log + +logger = log.get_logger(__name__) class KiPlotConfigurationError(error.KiPlotError): @@ -504,10 +507,19 @@ class PlotConfig(object): self.update_xml = False self.ignore_unconnected = False self.run_erc = False + self.filters = None def add_output(self, new_op): self._outputs.append(new_op) + def add_filter(self, comment, number, regex): + logger.debug("Adding DRC/ERC filter '{}','{}','{}'".format(comment, number, regex)) + if self.filters is None: + self.filters = '' + if comment: + self.filters += '# '+comment+'\n' + self.filters += '{},{}\n'.format(number, regex) + def validate(self): errs = [] for o in self._outputs: