Added variants support to the schematic SVG print.
This commit is contained in:
parent
64f50d2a07
commit
0e394b468b
|
|
@ -18,7 +18,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
- Marking components as "Do Not Fit"
|
||||
- Marking components as "Do Not Change"
|
||||
- The internal BoM format supports KiBoM and IBoM style variants
|
||||
- Schematic print to PDF support for variants. Not fitted components are crossed.
|
||||
- Schematic print to PDF/SVG support for variants. Not fitted components are
|
||||
crossed.
|
||||
- Position (Pick & Place) support for variants.
|
||||
- All plot formats (gerber, pdf, svg, etc.) support for variants:
|
||||
- Pads removed from *.Paste
|
||||
|
|
|
|||
3
Makefile
3
Makefile
|
|
@ -109,6 +109,9 @@ gen_ref:
|
|||
src/kibot -c tests/yaml_samples/print_pdf_no_inductors_1.kibot.yaml -e tests/board_samples/test_v5.sch -d $(REFDIR)
|
||||
mv "$(REFDIR)no_inductor/test_v5-schematic_(no_L).pdf" $(REFDIR)
|
||||
rmdir $(REFDIR)no_inductor/
|
||||
src/kibot -c tests/yaml_samples/print_svg_no_inductors_1.kibot.yaml -e tests/board_samples/test_v5.sch -d $(REFDIR)
|
||||
mv "$(REFDIR)no_inductor/test_v5-schematic_(no_L).svg" $(REFDIR)
|
||||
-@rm -rf $(REFDIR)no_inductor/
|
||||
src/kibot -b tests/board_samples/kibom-variant_4.kicad_pcb -c tests/yaml_samples/pdf_variant_1.kibot.yaml -d $(REFDIR)
|
||||
src/kibot -b tests/board_samples/kibom-variant_3.kicad_pcb -c tests/yaml_samples/pcbdraw_variant_1.kibot.yaml -d $(REFDIR)
|
||||
src/kibot -b tests/board_samples/kibom-variant_3.kicad_pcb -c tests/yaml_samples/pcbdraw_variant_2.kibot.yaml -d $(REFDIR)
|
||||
|
|
|
|||
|
|
@ -989,7 +989,11 @@ Next time you need this list just use an alias, like this:
|
|||
- `name`: [string=''] Used to identify this particular output definition.
|
||||
- `options`: [dict] Options for the `svg_sch_print` output.
|
||||
* Valid keys:
|
||||
- `dnf_filter`: [string|list(string)=''] Name of the filter to mark components as not fitted.
|
||||
A short-cut to use for simple cases where a variant is an overkill.
|
||||
- `output`: [string='%f-%i%v.%x'] filename for the output SVG (%i=schematic %x=svg). Affected by global options.
|
||||
- `variant`: [string=''] Board variant to apply.
|
||||
Not fitted components are crossed.
|
||||
|
||||
|
||||
## Using KiBot
|
||||
|
|
|
|||
|
|
@ -830,6 +830,12 @@ outputs:
|
|||
type: 'svg_sch_print'
|
||||
dir: 'Example/svg_sch_print_dir'
|
||||
options:
|
||||
# [string|list(string)=''] Name of the filter to mark components as not fitted.
|
||||
# A short-cut to use for simple cases where a variant is an overkill
|
||||
dnf_filter: ''
|
||||
# [string='%f-%i%v.%x'] filename for the output SVG (%i=schematic %x=svg). Affected by global options
|
||||
output: '%f-%i%v.%x'
|
||||
# [string=''] Board variant to apply.
|
||||
# Not fitted components are crossed
|
||||
variant: ''
|
||||
|
||||
|
|
|
|||
|
|
@ -5,26 +5,38 @@
|
|||
# License: GPL-3.0
|
||||
# Project: KiBot (formerly KiPlot)
|
||||
import os
|
||||
from tempfile import mkdtemp
|
||||
from shutil import rmtree
|
||||
from .gs import (GS)
|
||||
from .kiplot import check_eeschema_do, exec_with_retry
|
||||
from .misc import (CMD_EESCHEMA_DO, SVG_SCH_PRINT)
|
||||
from .optionable import BaseOptions
|
||||
from .out_base import VariantOptions
|
||||
from .macros import macros, document, output_class # noqa: F401
|
||||
from . import log
|
||||
|
||||
logger = log.get_logger(__name__)
|
||||
|
||||
|
||||
class SVG_Sch_PrintOptions(BaseOptions):
|
||||
class SVG_Sch_PrintOptions(VariantOptions):
|
||||
def __init__(self):
|
||||
with document:
|
||||
self.output = GS.def_global_output
|
||||
""" filename for the output SVG (%i=schematic %x=svg) """
|
||||
super().__init__()
|
||||
self.add_to_doc('variant', "Not fitted components are crossed")
|
||||
|
||||
def run(self, output_dir, board):
|
||||
super().run(output_dir, board)
|
||||
check_eeschema_do()
|
||||
cmd = [CMD_EESCHEMA_DO, 'export', '--all_pages', '--file_format', 'svg', GS.sch_file, output_dir]
|
||||
if self._comps:
|
||||
# Save it to a temporal dir
|
||||
sch_dir = mkdtemp(prefix='tmp-kibot-svg_sch_print-')
|
||||
fname = GS.sch.save_variant(sch_dir)
|
||||
sch_file = os.path.join(sch_dir, fname)
|
||||
else:
|
||||
sch_dir = None
|
||||
sch_file = GS.sch_file
|
||||
cmd = [CMD_EESCHEMA_DO, 'export', '--all_pages', '--file_format', 'svg', sch_file, output_dir]
|
||||
if GS.debug_enabled:
|
||||
cmd.insert(1, '-vv')
|
||||
cmd.insert(1, '-r')
|
||||
|
|
@ -39,6 +51,10 @@ class SVG_Sch_PrintOptions(BaseOptions):
|
|||
new = self.expand_filename_sch(output_dir, self.output, id, ext)
|
||||
logger.debug('Moving '+cur+' -> '+new)
|
||||
os.rename(cur, new)
|
||||
# Remove the temporal dir if needed
|
||||
if sch_dir:
|
||||
logger.debug('Removing temporal variant dir `{}`'.format(sch_dir))
|
||||
rmtree(sch_dir)
|
||||
|
||||
|
||||
@output_class
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 175 KiB |
|
|
@ -107,6 +107,18 @@ def test_print_sch_variant_ni_1():
|
|||
ctx.clean_up()
|
||||
|
||||
|
||||
def test_print_sch_svg_variant_ni_1():
|
||||
""" SVG using a variant """
|
||||
prj = 'test_v5' # Is the most complete, contains every KiCad object I know
|
||||
ctx = context.TestContextSCH('test_print_sch_svg_variant_ni_1', prj, 'print_svg_no_inductors_1', PDF_DIR)
|
||||
ctx.run()
|
||||
r_name = 'test_v5-schematic_(no_L).svg'
|
||||
o_name = os.path.join(NI_DIR, r_name)
|
||||
ctx.expect_out_file(o_name)
|
||||
ctx.compare_image(o_name, r_name)
|
||||
ctx.clean_up()
|
||||
|
||||
|
||||
def test_print_sch_variant_ni_2():
|
||||
""" Using a filter """
|
||||
prj = 'test_v5' # Is the most complete, contains every KiCad object I know
|
||||
|
|
|
|||
|
|
@ -318,12 +318,23 @@ class TestContext(object):
|
|||
reference = self.get_out_path(reference)
|
||||
else:
|
||||
reference = os.path.join(REF_DIR, reference)
|
||||
image = self.get_out_path(image)
|
||||
png_ref = None
|
||||
if reference[-3:] == 'svg':
|
||||
png_ref = reference[:-3]+'png'
|
||||
subprocess.check_call(['rsvg-convert', '-d', '300', '-p', '300', '-o', png_ref, reference])
|
||||
reference = png_ref
|
||||
png_image = None
|
||||
if image[-3:] == 'svg':
|
||||
png_image = image[:-3]+'png'
|
||||
subprocess.check_call(['rsvg-convert', '-d', '300', '-p', '300', '-o', png_image, image])
|
||||
image = png_image
|
||||
cmd = ['compare',
|
||||
# Tolerate 5 % error in color
|
||||
'-fuzz', fuzz,
|
||||
# Count how many pixels differ
|
||||
'-metric', 'AE',
|
||||
self.get_out_path(image),
|
||||
image,
|
||||
reference,
|
||||
# Avoid the part where KiCad version is printed
|
||||
'-crop', '100%x92%+0+0', '+repage',
|
||||
|
|
@ -336,6 +347,10 @@ class TestContext(object):
|
|||
# logging.debug('MSE={} ({})'.format(m.group(1), m.group(2)))
|
||||
ae = int(res.decode())
|
||||
logging.debug('AE=%d' % ae)
|
||||
if png_ref:
|
||||
os.remove(png_ref)
|
||||
if png_image:
|
||||
os.remove(png_image)
|
||||
assert ae == 0
|
||||
|
||||
def compare_pdf(self, gen, reference=None, diff='diff-{}.png'):
|
||||
|
|
|
|||
|
|
@ -0,0 +1,25 @@
|
|||
# Example KiBot config file
|
||||
kibot:
|
||||
version: 1
|
||||
|
||||
filters:
|
||||
- name: 'no_inductor'
|
||||
comment: 'Inductors removed'
|
||||
type: generic
|
||||
exclude_refs:
|
||||
- L*
|
||||
|
||||
variants:
|
||||
- name: 'no_inductor'
|
||||
comment: 'Inductors removed'
|
||||
type: kibom
|
||||
file_id: '_(no_L)'
|
||||
dnf_filter: 'no_inductor'
|
||||
|
||||
outputs:
|
||||
- name: 'no_inductor'
|
||||
comment: "Inductors removed"
|
||||
type: svg_sch_print
|
||||
dir: no_inductor
|
||||
options:
|
||||
variant: 'no_inductor'
|
||||
Loading…
Reference in New Issue