Remove filtered components from the *.Adhes layer.
All shapes in the *.Adhes are removed.
This commit is contained in:
parent
8c34d96ccf
commit
8bf0a13210
|
|
@ -69,21 +69,7 @@ class AnyLayerOptions(BaseOptions):
|
||||||
# We'll come back to this on a per-layer basis
|
# We'll come back to this on a per-layer basis
|
||||||
po.SetSkipPlotNPTH_Pads(False)
|
po.SetSkipPlotNPTH_Pads(False)
|
||||||
|
|
||||||
def run(self, output_dir, board, layers):
|
def filter_components(self, board):
|
||||||
# fresh plot controller
|
|
||||||
plot_ctrl = PLOT_CONTROLLER(board)
|
|
||||||
# set up plot options for the whole output
|
|
||||||
po = plot_ctrl.GetPlotOptions()
|
|
||||||
self._configure_plot_ctrl(po, output_dir)
|
|
||||||
|
|
||||||
# Gerber Job files aren't automagically created
|
|
||||||
# We need to assist KiCad
|
|
||||||
create_job = po.GetCreateGerberJobFile()
|
|
||||||
if create_job:
|
|
||||||
jobfile_writer = GERBER_JOBFILE_WRITER(board)
|
|
||||||
|
|
||||||
plot_ctrl.SetColorMode(True)
|
|
||||||
|
|
||||||
# Apply the variants and filters
|
# Apply the variants and filters
|
||||||
exclude = None
|
exclude = None
|
||||||
if hasattr(self, 'variant') and (self.dnf_filter or self.variant):
|
if hasattr(self, 'variant') and (self.dnf_filter or self.variant):
|
||||||
|
|
@ -102,13 +88,15 @@ class AnyLayerOptions(BaseOptions):
|
||||||
exclude.addLayer(board.GetLayerID('F.Paste'))
|
exclude.addLayer(board.GetLayerID('F.Paste'))
|
||||||
exclude.addLayer(board.GetLayerID('B.Paste'))
|
exclude.addLayer(board.GetLayerID('B.Paste'))
|
||||||
old_layers = []
|
old_layers = []
|
||||||
|
fadhes = board.GetLayerID('F.Adhes')
|
||||||
|
badhes = board.GetLayerID('B.Adhes')
|
||||||
|
old_fadhes = []
|
||||||
|
old_badhes = []
|
||||||
for m in board.GetModules():
|
for m in board.GetModules():
|
||||||
ref = m.GetReference()
|
ref = m.GetReference()
|
||||||
# logger.debug('Ref {}'.format(ref))
|
|
||||||
c = comps_hash.get(ref, None)
|
c = comps_hash.get(ref, None)
|
||||||
# logger.debug('Component {}'.format(c))
|
|
||||||
if (c and not c.fitted) or m.GetAttributes() == UI_VIRTUAL:
|
if (c and not c.fitted) or m.GetAttributes() == UI_VIRTUAL:
|
||||||
# logger.debug('Removing')
|
# Remove all pads from *.Paste
|
||||||
old_c_layers = []
|
old_c_layers = []
|
||||||
for p in m.Pads():
|
for p in m.Pads():
|
||||||
pad_layers = p.GetLayerSet()
|
pad_layers = p.GetLayerSet()
|
||||||
|
|
@ -116,9 +104,57 @@ class AnyLayerOptions(BaseOptions):
|
||||||
pad_layers.removeLayerSet(exclude)
|
pad_layers.removeLayerSet(exclude)
|
||||||
p.SetLayerSet(pad_layers)
|
p.SetLayerSet(pad_layers)
|
||||||
old_layers.append(old_c_layers)
|
old_layers.append(old_c_layers)
|
||||||
|
# Remove any graphical item in the *.Adhes layers
|
||||||
|
for gi in m.GraphicalItems():
|
||||||
|
l_gi = gi.GetLayer()
|
||||||
|
if l_gi == fadhes:
|
||||||
|
gi.SetLayer(-1)
|
||||||
|
old_fadhes.append(gi)
|
||||||
|
if l_gi == badhes:
|
||||||
|
gi.SetLayer(-1)
|
||||||
|
old_badhes.append(gi)
|
||||||
|
# if gi.GetClass() == 'MGRAPHIC':
|
||||||
|
# logger.debug(gi.GetShapeStr())
|
||||||
|
self.comps_hash = comps_hash
|
||||||
|
self.old_layers = old_layers
|
||||||
|
self.old_fadhes = old_fadhes
|
||||||
|
self.old_badhes = old_badhes
|
||||||
|
return exclude
|
||||||
|
|
||||||
|
def unfilter_components(self, board):
|
||||||
|
for m in board.GetModules():
|
||||||
|
ref = m.GetReference()
|
||||||
|
c = self.comps_hash.get(ref, None)
|
||||||
|
if (c and not c.fitted) or m.GetAttributes() == UI_VIRTUAL:
|
||||||
|
restore = self.old_layers.pop(0)
|
||||||
|
for p in m.Pads():
|
||||||
|
pad_layers = p.GetLayerSet()
|
||||||
|
res = restore.pop(0)
|
||||||
|
pad_layers.ParseHex(res, len(res))
|
||||||
|
p.SetLayerSet(pad_layers)
|
||||||
|
fadhes = board.GetLayerID('F.Adhes')
|
||||||
|
for gi in self.old_fadhes:
|
||||||
|
gi.SetLayer(fadhes)
|
||||||
|
badhes = board.GetLayerID('B.Adhes')
|
||||||
|
for gi in self.old_badhes:
|
||||||
|
gi.SetLayer(badhes)
|
||||||
|
|
||||||
|
def run(self, output_dir, board, layers):
|
||||||
|
# fresh plot controller
|
||||||
|
plot_ctrl = PLOT_CONTROLLER(board)
|
||||||
|
# set up plot options for the whole output
|
||||||
|
po = plot_ctrl.GetPlotOptions()
|
||||||
|
self._configure_plot_ctrl(po, output_dir)
|
||||||
|
# Gerber Job files aren't automagically created
|
||||||
|
# We need to assist KiCad
|
||||||
|
create_job = po.GetCreateGerberJobFile()
|
||||||
|
if create_job:
|
||||||
|
jobfile_writer = GERBER_JOBFILE_WRITER(board)
|
||||||
|
plot_ctrl.SetColorMode(True)
|
||||||
|
# Apply the variants and filters
|
||||||
|
exclude = self.filter_components(board)
|
||||||
|
# Plot every layer in the output
|
||||||
layers = Layer.solve(layers)
|
layers = Layer.solve(layers)
|
||||||
# plot every layer in the output
|
|
||||||
for la in layers:
|
for la in layers:
|
||||||
suffix = la.suffix
|
suffix = la.suffix
|
||||||
desc = la.description
|
desc = la.description
|
||||||
|
|
@ -129,13 +165,12 @@ class AnyLayerOptions(BaseOptions):
|
||||||
# a copper layer
|
# a copper layer
|
||||||
is_cu = IsCopperLayer(id)
|
is_cu = IsCopperLayer(id)
|
||||||
po.SetSkipPlotNPTH_Pads(is_cu)
|
po.SetSkipPlotNPTH_Pads(is_cu)
|
||||||
|
|
||||||
# Plot single layer to file
|
# Plot single layer to file
|
||||||
logger.debug("Opening plot file for layer `{}` format `{}`".format(la, self._plot_format))
|
logger.debug("Opening plot file for layer `{}` format `{}`".format(la, self._plot_format))
|
||||||
if not plot_ctrl.OpenPlotfile(suffix, self._plot_format, desc):
|
if not plot_ctrl.OpenPlotfile(suffix, self._plot_format, desc):
|
||||||
# Shouldn't happen
|
# Shouldn't happen
|
||||||
raise PlotError("OpenPlotfile failed!") # pragma: no cover
|
raise PlotError("OpenPlotfile failed!") # pragma: no cover
|
||||||
|
# Compute the current file name and the one we want
|
||||||
k_filename = plot_ctrl.GetPlotFileName()
|
k_filename = plot_ctrl.GetPlotFileName()
|
||||||
if self.output:
|
if self.output:
|
||||||
filename = self.expand_filename(output_dir, self.output, suffix, os.path.splitext(k_filename)[1][1:])
|
filename = self.expand_filename(output_dir, self.output, suffix, os.path.splitext(k_filename)[1][1:])
|
||||||
|
|
@ -148,21 +183,12 @@ class AnyLayerOptions(BaseOptions):
|
||||||
os.rename(k_filename, filename)
|
os.rename(k_filename, filename)
|
||||||
if create_job:
|
if create_job:
|
||||||
jobfile_writer.AddGbrFile(id, os.path.basename(filename))
|
jobfile_writer.AddGbrFile(id, os.path.basename(filename))
|
||||||
|
# Create the job file
|
||||||
if create_job:
|
if create_job:
|
||||||
jobfile_writer.CreateJobFile(self.expand_filename(output_dir, po.gerber_job_file, 'job', 'gbrjob'))
|
jobfile_writer.CreateJobFile(self.expand_filename(output_dir, po.gerber_job_file, 'job', 'gbrjob'))
|
||||||
# Restore the eliminated layers
|
# Restore the eliminated layers
|
||||||
if exclude:
|
if exclude:
|
||||||
for m in board.GetModules():
|
self.unfilter_components(board)
|
||||||
ref = m.GetReference()
|
|
||||||
c = comps_hash.get(ref, None)
|
|
||||||
if (c and not c.fitted) or m.GetAttributes() == UI_VIRTUAL:
|
|
||||||
restore = old_layers.pop(0)
|
|
||||||
for p in m.Pads():
|
|
||||||
pad_layers = p.GetLayerSet()
|
|
||||||
res = restore.pop(0)
|
|
||||||
pad_layers.ParseHex(res, len(res))
|
|
||||||
p.SetLayerSet(pad_layers)
|
|
||||||
|
|
||||||
def read_vals_from_po(self, po):
|
def read_vals_from_po(self, po):
|
||||||
# excludeedgelayer
|
# excludeedgelayer
|
||||||
|
|
|
||||||
|
|
@ -172,6 +172,7 @@
|
||||||
(fp_line (start -1.68 -0.95) (end 1.68 -0.95) (layer F.CrtYd) (width 0.05))
|
(fp_line (start -1.68 -0.95) (end 1.68 -0.95) (layer F.CrtYd) (width 0.05))
|
||||||
(fp_line (start 1.68 -0.95) (end 1.68 0.95) (layer F.CrtYd) (width 0.05))
|
(fp_line (start 1.68 -0.95) (end 1.68 0.95) (layer F.CrtYd) (width 0.05))
|
||||||
(fp_line (start 1.68 0.95) (end -1.68 0.95) (layer F.CrtYd) (width 0.05))
|
(fp_line (start 1.68 0.95) (end -1.68 0.95) (layer F.CrtYd) (width 0.05))
|
||||||
|
(fp_circle (center 0 0) (end 0.4 0) (layer F.Adhes) (width 0.1))
|
||||||
(fp_text user %R (at 0 0) (layer F.Fab)
|
(fp_text user %R (at 0 0) (layer F.Fab)
|
||||||
(effects (font (size 0.5 0.5) (thickness 0.08)))
|
(effects (font (size 0.5 0.5) (thickness 0.08)))
|
||||||
)
|
)
|
||||||
|
|
@ -208,6 +209,7 @@
|
||||||
(fp_line (start -1.68 -0.95) (end 1.68 -0.95) (layer F.CrtYd) (width 0.05))
|
(fp_line (start -1.68 -0.95) (end 1.68 -0.95) (layer F.CrtYd) (width 0.05))
|
||||||
(fp_line (start 1.68 -0.95) (end 1.68 0.95) (layer F.CrtYd) (width 0.05))
|
(fp_line (start 1.68 -0.95) (end 1.68 0.95) (layer F.CrtYd) (width 0.05))
|
||||||
(fp_line (start 1.68 0.95) (end -1.68 0.95) (layer F.CrtYd) (width 0.05))
|
(fp_line (start 1.68 0.95) (end -1.68 0.95) (layer F.CrtYd) (width 0.05))
|
||||||
|
(fp_circle (center 0 0) (end 0.4 0) (layer F.Adhes) (width 0.1))
|
||||||
(fp_text user %R (at 0 0) (layer F.Fab)
|
(fp_text user %R (at 0 0) (layer F.Fab)
|
||||||
(effects (font (size 0.5 0.5) (thickness 0.08)))
|
(effects (font (size 0.5 0.5) (thickness 0.08)))
|
||||||
)
|
)
|
||||||
|
|
@ -243,6 +245,7 @@
|
||||||
(fp_line (start -1.68 -0.95) (end 1.68 -0.95) (layer F.CrtYd) (width 0.05))
|
(fp_line (start -1.68 -0.95) (end 1.68 -0.95) (layer F.CrtYd) (width 0.05))
|
||||||
(fp_line (start 1.68 -0.95) (end 1.68 0.95) (layer F.CrtYd) (width 0.05))
|
(fp_line (start 1.68 -0.95) (end 1.68 0.95) (layer F.CrtYd) (width 0.05))
|
||||||
(fp_line (start 1.68 0.95) (end -1.68 0.95) (layer F.CrtYd) (width 0.05))
|
(fp_line (start 1.68 0.95) (end -1.68 0.95) (layer F.CrtYd) (width 0.05))
|
||||||
|
(fp_circle (center 0 0) (end 0.4 0) (layer F.Adhes) (width 0.1))
|
||||||
(fp_text user %R (at 0 0) (layer F.Fab)
|
(fp_text user %R (at 0 0) (layer F.Fab)
|
||||||
(effects (font (size 0.5 0.5) (thickness 0.08)))
|
(effects (font (size 0.5 0.5) (thickness 0.08)))
|
||||||
)
|
)
|
||||||
|
|
@ -279,6 +282,7 @@
|
||||||
(fp_line (start -1.68 -0.95) (end 1.68 -0.95) (layer F.CrtYd) (width 0.05))
|
(fp_line (start -1.68 -0.95) (end 1.68 -0.95) (layer F.CrtYd) (width 0.05))
|
||||||
(fp_line (start 1.68 -0.95) (end 1.68 0.95) (layer F.CrtYd) (width 0.05))
|
(fp_line (start 1.68 -0.95) (end 1.68 0.95) (layer F.CrtYd) (width 0.05))
|
||||||
(fp_line (start 1.68 0.95) (end -1.68 0.95) (layer F.CrtYd) (width 0.05))
|
(fp_line (start 1.68 0.95) (end -1.68 0.95) (layer F.CrtYd) (width 0.05))
|
||||||
|
(fp_circle (center 0 0) (end 0.4 0) (layer F.Adhes) (width 0.1))
|
||||||
(fp_text user %R (at 0 0) (layer F.Fab)
|
(fp_text user %R (at 0 0) (layer F.Fab)
|
||||||
(effects (font (size 0.5 0.5) (thickness 0.08)))
|
(effects (font (size 0.5 0.5) (thickness 0.08)))
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -91,12 +91,13 @@ def check_layers_exist(ctx, dir, prefix, layers, suffix):
|
||||||
ctx.expect_out_file(compose_fname(dir, prefix, 'job', suffix, 'gbrjob'))
|
ctx.expect_out_file(compose_fname(dir, prefix, 'job', suffix, 'gbrjob'))
|
||||||
|
|
||||||
|
|
||||||
def check_components(ctx, dir, prefix, layer, suffix, exclude, include):
|
def check_components(ctx, dir, prefix, layers, suffix, exclude, include):
|
||||||
fname = compose_fname(dir, prefix, layer, suffix)
|
for layer in layers:
|
||||||
inc = [r'%TO\.C,{}\*%'.format(v) for v in include]
|
fname = compose_fname(dir, prefix, layer, suffix)
|
||||||
ctx.search_in_file(fname, inc)
|
inc = [r'%TO\.C,{}\*%'.format(v) for v in include]
|
||||||
exc = [r'%TO\.C,{}\*%'.format(v) for v in exclude]
|
ctx.search_in_file(fname, inc)
|
||||||
ctx.search_not_in_file(fname, exc)
|
exc = [r'%TO\.C,{}\*%'.format(v) for v in exclude]
|
||||||
|
ctx.search_not_in_file(fname, exc)
|
||||||
|
|
||||||
|
|
||||||
def test_gerber_variant_1():
|
def test_gerber_variant_1():
|
||||||
|
|
@ -108,11 +109,11 @@ def test_gerber_variant_1():
|
||||||
# R3 is a component added to the PCB, included in all cases
|
# R3 is a component added to the PCB, included in all cases
|
||||||
# variant: default directory: gerber components: R1, R2 and R3
|
# variant: default directory: gerber components: R1, R2 and R3
|
||||||
check_layers_exist(ctx, 'gerber', prj, ALL_LAYERS, '')
|
check_layers_exist(ctx, 'gerber', prj, ALL_LAYERS, '')
|
||||||
check_components(ctx, 'gerber', prj, 'F_Paste', '', ['C1', 'C2'], ['R1', 'R2', 'R3'])
|
check_components(ctx, 'gerber', prj, ['F_Paste', 'F_Adhes'], '', ['C1', 'C2'], ['R1', 'R2', 'R3'])
|
||||||
# variant: production directory: production components: R1, R2, R3 and C2
|
# variant: production directory: production components: R1, R2, R3 and C2
|
||||||
check_layers_exist(ctx, 'production', prj, ALL_LAYERS, '_(production)')
|
check_layers_exist(ctx, 'production', prj, ALL_LAYERS, '_(production)')
|
||||||
check_components(ctx, 'production', prj, 'F_Paste', '_(production)', ['C1'], ['R1', 'R2', 'R3', 'C2'])
|
check_components(ctx, 'production', prj, ['F_Paste', 'F_Adhes'], '_(production)', ['C1'], ['R1', 'R2', 'R3', 'C2'])
|
||||||
# variant: test directory: test components: R1, R3 and C2
|
# variant: test directory: test components: R1, R3 and C2
|
||||||
check_layers_exist(ctx, 'test', prj, ALL_LAYERS, '_(test)')
|
check_layers_exist(ctx, 'test', prj, ALL_LAYERS, '_(test)')
|
||||||
check_components(ctx, 'test', prj, 'F_Paste', '_(test)', ['C1', 'R2'], ['R1', 'R3', 'C2'])
|
check_components(ctx, 'test', prj, ['F_Paste', 'F_Adhes'], '_(test)', ['C1', 'R2'], ['R1', 'R3', 'C2'])
|
||||||
ctx.clean_up()
|
ctx.clean_up()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue