From f68855f4d818f56040627dd083c67e64e8d555d6 Mon Sep 17 00:00:00 2001 From: "Salvador E. Tropea" Date: Thu, 1 Dec 2022 13:59:24 -0300 Subject: [PATCH] [Stencil*] Added get_targets implementation --- kibot/misc.py | 1 + kibot/out_any_stencil.py | 47 ++++++++++++++++++++++++------------ kibot/out_stencil_3d.py | 34 +++++++++++++++++++------- kibot/out_stencil_for_jig.py | 19 +++++++++++++-- 4 files changed, 75 insertions(+), 26 deletions(-) diff --git a/kibot/misc.py b/kibot/misc.py index a67b9d59..7140fe3f 100644 --- a/kibot/misc.py +++ b/kibot/misc.py @@ -243,6 +243,7 @@ W_NOCRTYD = '(W104) ' W_PANELEMPTY = '(W105) ' W_ONWIN = '(W106) ' W_AUTONONE = '(W106) ' +W_AUTOPROB = '(W107) ' # Somehow arbitrary, the colors are real, but can be different PCB_MAT_COLORS = {'fr1': "937042", 'fr2': "949d70", 'fr3': "adacb4", 'fr4': "332B16", 'fr5': "6cc290"} PCB_FINISH_COLORS = {'hal': "8b898c", 'hasl': "8b898c", 'imag': "8b898c", 'enig': "cfb96e", 'enepig': "cfb96e", diff --git a/kibot/out_any_stencil.py b/kibot/out_any_stencil.py index f7e95ccf..8951de89 100644 --- a/kibot/out_any_stencil.py +++ b/kibot/out_any_stencil.py @@ -10,7 +10,7 @@ from .error import PlotError from .gs import GS from .kiplot import run_command from .out_base import VariantOptions -from .misc import W_AUTONONE +from .misc import W_AUTONONE, W_AUTOPROB from .macros import macros, document, output_class # noqa: F401 from . import log @@ -39,10 +39,13 @@ class Stencil_Options(VariantOptions): super().config(parent) self.cutout = ','.join(self.force_list(self.cutout)) - def move_output(self, src_dir, src_file, id, ext, replacement=None, patch=False, relative=False): + def expand_name(self, id, ext, out_dir): self._expand_id = id self._expand_ext = ext - dst_name = self._parent.expand_filename(self._parent.output_dir, self.output) + return self._parent.expand_filename(out_dir, self.output) + + def move_output(self, src_dir, src_file, id, ext, replacement=None, patch=False, relative=False): + dst_name = self.expand_name(id, ext, self._parent.output_dir) src_name = os.path.join(src_dir, src_file) if not os.path.isfile(src_name): raise PlotError('Missing output file {}'.format(src_name)) @@ -61,6 +64,29 @@ class Stencil_Options(VariantOptions): src_name = os.path.basename(src_name) replacement[src_name] = os.path.basename(dst_name) + def find_sides(self, detected_top, detected_bottom, warn=False): + do_top = do_bottom = False + if self.side == 'top': + do_top = True + elif self.side == 'bottom': + do_bottom = True + elif self.side == 'both': + do_top = True + do_bottom = True + else: # auto + do_top = detected_top + do_bottom = detected_bottom + if warn: + logger.warning(W_AUTOPROB+'Using the `stencil.side` option could create a wrong list of files.') + return do_top, do_bottom + + def solve_sides(self): + if self.side == 'auto': + detected_top, detected_bottom = self.detect_solder_paste(GS.board) + else: + detected_top = detected_bottom = False + return self.find_sides(detected_top, detected_bottom, warn=True) + def run(self, output): cmd_kikit = self.ensure_tool('KiKit') self.ensure_tool('OpenSCAD') @@ -69,6 +95,8 @@ class Stencil_Options(VariantOptions): filtered = self.filter_pcb_components(GS.board) if self.side == 'auto': detected_top, detected_bottom = self.detect_solder_paste(GS.board) + else: + detected_top = detected_bottom = False fname = self.save_tmp_board() if filtered else GS.pcb_file if filtered: self.unfilter_pcb_components(GS.board) @@ -93,17 +121,6 @@ class Stencil_Options(VariantOptions): if filtered: GS.remove_pcb_and_pro(fname) # Now copy the files we want - # - Which side? - do_top = do_bottom = False - if self.side == 'top': - do_top = True - elif self.side == 'bottom': - do_bottom = True - elif self.side == 'both': - do_top = True - do_bottom = True - else: # auto - do_top = detected_top - do_bottom = detected_bottom + do_top, do_bottom = self.find_sides(detected_top, detected_bottom) prj_name = os.path.splitext(os.path.basename(fname))[0] self.move_outputs(tmp, prj_name, do_top, do_bottom) diff --git a/kibot/out_stencil_3d.py b/kibot/out_stencil_3d.py index 1c22b136..c43dc4f4 100644 --- a/kibot/out_stencil_3d.py +++ b/kibot/out_stencil_3d.py @@ -47,8 +47,24 @@ class Stencil_3D_Options(Stencil_Options): self.add_to_doc('include_scad', 'Note that this also includes the DXF files') def get_targets(self, out_dir): - # TODO: auto side is tricky, needs variants applied - return [self._parent.expand_filename(out_dir, self.output)] + do_top, do_bottom = self.solve_sides() + files = [] + # The edge is needed by any of the OpenSCAD files + if (do_top or do_bottom) and self.include_scad: + files.append(self.expand_name('stencil_3d_edge', 'dxf', out_dir)) + # Top side + if do_top: + files.append(self.expand_name('stencil_3d_top', 'stl', out_dir)) + if self.include_scad: + files.append(self.expand_name('stencil_3d_top', 'dxf', out_dir)) + files.append(self.expand_name('stencil_3d_top', 'scad', out_dir)) + # Bottom side + if do_bottom: + files.append(self.expand_name('stencil_3d_bottom', 'stl', out_dir)) + if self.include_scad: + files.append(self.expand_name('stencil_3d_bottom', 'dxf', out_dir)) + files.append(self.expand_name('stencil_3d_bottom', 'scad', out_dir)) + return files def create_cmd(self, cmd_kikit): cmd = [cmd_kikit, 'stencil', 'createprinted', @@ -67,19 +83,19 @@ class Stencil_3D_Options(Stencil_Options): replacements = {} # The edge is needed by any of the OpenSCAD files if (do_top or do_bottom) and self.include_scad: - self.move_output(tmp, prj_name+'-EdgeCuts.dxf', 'Stencil_For_Jig_edge', 'dxf', replacements) + self.move_output(tmp, prj_name+'-EdgeCuts.dxf', 'stencil_3d_edge', 'dxf', replacements) # Top side if do_top: - self.move_output(tmp, 'topStencil.stl', 'Stencil_For_Jig_top', 'stl') + self.move_output(tmp, 'topStencil.stl', 'stencil_3d_top', 'stl') if self.include_scad: - self.move_output(tmp, prj_name+'-PasteTop.dxf', 'Stencil_For_Jig_top', 'dxf', replacements) - self.move_output(tmp, 'topStencil.scad', 'Stencil_For_Jig_top', 'scad', replacements, patch=True) + self.move_output(tmp, prj_name+'-PasteTop.dxf', 'stencil_3d_top', 'dxf', replacements) + self.move_output(tmp, 'topStencil.scad', 'stencil_3d_top', 'scad', replacements, patch=True) # Bottom side if do_bottom: - self.move_output(tmp, 'bottomStencil.stl', 'Stencil_For_Jig_bottom', 'stl') + self.move_output(tmp, 'bottomStencil.stl', 'stencil_3d_bottom', 'stl') if self.include_scad: - self.move_output(tmp, prj_name+'-PasteBottom.dxf', 'Stencil_For_Jig_bottom', 'dxf', replacements) - self.move_output(tmp, 'bottomStencil.scad', 'Stencil_For_Jig_bottom', 'scad', replacements, patch=True) + self.move_output(tmp, prj_name+'-PasteBottom.dxf', 'stencil_3d_bottom', 'dxf', replacements) + self.move_output(tmp, 'bottomStencil.scad', 'stencil_3d_bottom', 'scad', replacements, patch=True) @output_class diff --git a/kibot/out_stencil_for_jig.py b/kibot/out_stencil_for_jig.py index 99d8edc4..8be4ced0 100644 --- a/kibot/out_stencil_for_jig.py +++ b/kibot/out_stencil_for_jig.py @@ -54,8 +54,23 @@ class Stencil_For_Jig_Options(Stencil_Options): super().__init__() def get_targets(self, out_dir): - # TODO: auto side is tricky, needs variants applied - return [self._parent.expand_filename(out_dir, self.output)] + do_top, do_bottom = self.solve_sides() + files = [] + # Top side + if do_top: + files.append(self.expand_name('stencil_for_jig_top', 'gtp', out_dir)) + files.append(self.expand_name('stencil_for_jig_top', 'stl', out_dir)) + if self.include_scad: + files.append(self.expand_name('stencil_for_jig_top', 'scad', out_dir)) + # Bottom side + if do_bottom: + files.append(self.expand_name('stencil_for_jig_bottom', 'gtp', out_dir)) + files.append(self.expand_name('stencil_for_jig_bottom', 'stl', out_dir)) + if self.include_scad: + files.append(self.expand_name('stencil_for_jig_bottom', 'scad', out_dir)) + if do_top and do_bottom: + files.append(self.expand_name('stencil_for_jig', 'gbrjob', out_dir)) + return files def create_cmd(self, cmd_kikit): cmd = [cmd_kikit, 'stencil', 'create',