Added support for kicad-automation-tools v1.4.0 DRC/ERC filters

This commit is contained in:
Salvador E. Tropea 2020-06-09 13:49:04 -03:00
parent 9e3865d881
commit c390ec3cb8
3 changed files with 55 additions and 8 deletions

View File

@ -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

View File

@ -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')

View File

@ -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: