Added support for dependency download to pcbdraw

This commit is contained in:
Salvador E. Tropea 2022-06-28 13:19:06 -03:00
parent 3440198cd7
commit 6a1372c574
3 changed files with 19 additions and 26 deletions

View File

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

View File

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

View File

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