Skip to content

Let pcbnew check for layer names #14

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/kiplot/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import argparse
import logging
import pcbnew
import os
import sys

Expand Down Expand Up @@ -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)
Expand Down
56 changes: 11 additions & 45 deletions src/kiplot/config_reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -337,63 +337,28 @@ 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
layer.suffix = l_obj['suffix'] if 'suffix' in l_obj else ""

return layer

def _parse_output(self, o_obj):
def _parse_output(self, o_obj, b):

try:
name = o_obj['name']
Expand Down Expand Up @@ -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

Expand All @@ -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:
Expand All @@ -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
17 changes: 4 additions & 13 deletions src/kiplot/kiplot.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down