From 6a1372c574c8744880aa7f9bc84fa3806cf7cc12 Mon Sep 17 00:00:00 2001 From: "Salvador E. Tropea" Date: Tue, 28 Jun 2022 13:19:06 -0300 Subject: [PATCH] Added support for dependency download to pcbdraw --- kibot/misc.py | 2 ++ kibot/out_pcb_print.py | 19 ++++++++----------- kibot/out_pcbdraw.py | 24 +++++++++--------------- 3 files changed, 19 insertions(+), 26 deletions(-) diff --git a/kibot/misc.py b/kibot/misc.py index ce1ac5e9..d5fc7172 100644 --- a/kibot/misc.py +++ b/kibot/misc.py @@ -90,6 +90,8 @@ KICOST_SUBMODULE = '../submodules/KiCost/src/kicost' KICAD2STEP = 'kicad2step_do' PCBDRAW = 'pcbdraw' URL_PCBDRAW = 'https://github.com/INTI-CMNB/pcbdraw' +# 0.9.0 implements KiCad 6 support +PCBDRAW_MIN_VERSION = (0, 9, 0) EXAMPLE_CFG = 'example_template.kibot.yaml' AUTO_SCALE = 0 PANDOC = 'pandoc' diff --git a/kibot/out_pcb_print.py b/kibot/out_pcb_print.py index fe3754a2..8404f6eb 100644 --- a/kibot/out_pcb_print.py +++ b/kibot/out_pcb_print.py @@ -9,7 +9,7 @@ import re import os import subprocess from pcbnew import B_Cu, F_Cu, FromMM, IsCopperLayer, PLOT_CONTROLLER, PLOT_FORMAT_SVG, wxSize, F_Mask, B_Mask, ZONE_FILLER -from shutil import rmtree, which +from shutil import rmtree from tempfile import NamedTemporaryFile, mkdtemp from .svgutils.transform import fromstring, RectElement, fromfile from .error import KiPlotConfigurationError @@ -22,9 +22,9 @@ from .kicad.worksheet import Worksheet, WksError from .kicad.config import KiConf from .kicad.v5_sch import SchError from .kicad.pcb import PCB -from .misc import (CMD_PCBNEW_PRINT_LAYERS, URL_PCBNEW_PRINT_LAYERS, PDF_PCB_PRINT, MISSING_TOOL, W_PDMASKFAIL, - KICAD5_SVG_SCALE, W_MISSTOOL, ToolDependency, ToolDependencyRole, TRY_INSTALL_CHECK, rsvg_dependency, - gs_dependency, convert_dependency, pcbdraw_dependency) +from .misc import (CMD_PCBNEW_PRINT_LAYERS, URL_PCBNEW_PRINT_LAYERS, PDF_PCB_PRINT, W_PDMASKFAIL, KICAD5_SVG_SCALE, + W_MISSTOOL, ToolDependency, ToolDependencyRole, rsvg_dependency, gs_dependency, convert_dependency, + pcbdraw_dependency, PCBDRAW_MIN_VERSION) from .kiplot import check_script, exec_with_retry, add_extra_options from .registrable import RegDependency from .create_pdf import create_pdf_from_pages @@ -47,7 +47,7 @@ rsvg_dep = rsvg_dependency('pcb_print', rsvg_downloader, roles=ToolDependencyRol gs_dep = gs_dependency('pcb_print', gs_downloader, roles=ToolDependencyRole(desc='Create PS files')) convert_dep = convert_dependency('pcb_print', convert_downloader, roles=ToolDependencyRole(desc='Create monochrome prints')) pcbdraw_dep = pcbdraw_dependency('pcb_print', None, roles=ToolDependencyRole(desc='Create realistic solder masks', - version=(0, 9, 0))) + version=PCBDRAW_MIN_VERSION)) RegDependency.register(rsvg_dep) RegDependency.register(gs_dep) RegDependency.register(convert_dep) @@ -726,13 +726,10 @@ class PCB_PrintOptions(VariantOptions): return logger.debug('- Plotting realistic solder mask using PcbDraw') # Check PcbDraw is available - if which('pcbdraw') is None: - logger.error('`pcbdraw` not installed, needed for `realistic_solder_mask`') - logger.error(TRY_INSTALL_CHECK) - exit(MISSING_TOOL) + pcbdraw_command = check_tool(pcbdraw_dep, fatal=True) # Run PcbDraw to make the heavy work (find the Edge.Cuts path and create masks) pcbdraw_file = os.path.join(temp_dir, out_file.replace('.svg', '-pcbdraw.svg')) - cmd = ['pcbdraw', '--no-warn-back', '-f', ''] + cmd = [pcbdraw_command, '--no-warn-back', '-f', ''] if id == B_Mask: cmd.append('-b') cmd.extend([GS.pcb_file, pcbdraw_file]) @@ -995,7 +992,7 @@ class PCB_Print(BaseOutput): # noqa: F821 extra = {la._id for la in Layer.solve(EXTRA_LAYERS)} disabled = set() # Check we can use PcbDraw - realistic_solder_mask = which('pcbdraw') is not None + realistic_solder_mask = check_tool(pcbdraw_dep) is not None if not realistic_solder_mask: logger.warning(W_MISSTOOL+'Missing PcbDraw tool, disabling `realistic_solder_mask`') # Check we can convert SVGs diff --git a/kibot/out_pcbdraw.py b/kibot/out_pcbdraw.py index 185955fd..9a8861e2 100644 --- a/kibot/out_pcbdraw.py +++ b/kibot/out_pcbdraw.py @@ -7,24 +7,21 @@ import os from tempfile import NamedTemporaryFile # Here we import the whole module to make monkeypatch work import subprocess -from .misc import (PCBDRAW, PCBDRAW_ERR, URL_PCBDRAW, W_AMBLIST, W_UNRETOOL, W_USESVG2, W_USEIMAGICK, PCB_MAT_COLORS, +from .misc import (PCBDRAW_ERR, W_AMBLIST, W_UNRETOOL, W_USESVG2, W_USEIMAGICK, PCB_MAT_COLORS, PCBDRAW_MIN_VERSION, PCB_FINISH_COLORS, SOLDER_COLORS, SILK_COLORS, ToolDependencyRole, rsvg_dependency, convert_dependency, pcbdraw_dependency) -from .kiplot import check_script from .registrable import RegDependency from .gs import GS from .optionable import Optionable from .out_base import VariantOptions -from .dep_downloader import check_tool, rsvg_downloader, convert_downloader +from .dep_downloader import check_tool, rsvg_downloader, convert_downloader, pytool_downloader from .macros import macros, document, output_class # noqa: F401 from . import log logger = log.get_logger() -# 0.9.0 implements KiCad 6 support -MIN_VERSION = '0.9.0' rsvg_dep = rsvg_dependency('pcbdraw', rsvg_downloader, roles=ToolDependencyRole(desc='Create PNG and JPG images')) convert_dep = convert_dependency('pcbdraw', convert_downloader, roles=ToolDependencyRole(desc='Create JPG images')) -pcbdraw_dep = pcbdraw_dependency('pcbdraw', None, roles=ToolDependencyRole(version=(0, 9, 0))) +pcbdraw_dep = pcbdraw_dependency('pcbdraw', pytool_downloader, roles=ToolDependencyRole(version=PCBDRAW_MIN_VERSION)) RegDependency.register(rsvg_dep) RegDependency.register(convert_dep) RegDependency.register(pcbdraw_dep) @@ -124,7 +121,9 @@ def _run_command(cmd, tmp_remap=False, tmp_style=False): os.remove(tmp_remap) if tmp_style: os.remove(tmp_style) - logger.debug('Output from command:\n'+cmd_output.decode()) + out = cmd_output.decode() + if out.strip(): + logger.debug('Output from command:\n'+out) class PcbDrawOptions(VariantOptions): @@ -268,9 +267,9 @@ class PcbDrawOptions(VariantOptions): def run(self, name): super().run(name) - check_script(PCBDRAW, URL_PCBDRAW, MIN_VERSION) + pcbdraw_command = check_tool(pcbdraw_dep, fatal=True) # Base command with overwrite - cmd = [PCBDRAW] + cmd = [pcbdraw_command] # Add user options tmp_style = None if self.style: @@ -347,12 +346,7 @@ class PcbDraw(BaseOutput): # noqa: F821 @staticmethod def get_conf_examples(name, layers, templates): - enabled = True - try: - check_script(PCBDRAW, URL_PCBDRAW, MIN_VERSION) - except SystemExit: - enabled = False - if not enabled: + if check_tool(pcbdraw_dep) is None: return None outs = [] for la in layers: