From 47bdc2615417dc46d643c71161fce18c51ed504e Mon Sep 17 00:00:00 2001 From: "Salvador E. Tropea" Date: Thu, 19 Jan 2023 21:05:32 -0300 Subject: [PATCH] [Report][Added] Expansion for KiCad text variables and environment variables --- CHANGELOG.md | 2 ++ README.md | 4 ++- docs/samples/generic_plot.kibot.yaml | 12 ++++--- kibot/out_report.py | 36 ++++++++++++++++++--- kibot/pre_any_replace.py | 8 ++--- tests/data/report_vars.txt | 16 +++++++++ tests/yaml_samples/report_vars_1.kibot.yaml | 27 ++++++++++++++++ 7 files changed, 90 insertions(+), 15 deletions(-) create mode 100644 tests/data/report_vars.txt create mode 100644 tests/yaml_samples/report_vars_1.kibot.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index 91edb041..1a2ae5b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added a mechanism to create a page for each copper layer. (#365) - Plot related outputs and PCB_Print: - Added support for the KiCad 6 "sketch_pads_on_fab_layers" option. (#356) +- Report: + - Expansion for KiCad text variables and environment variables (See #368) - *SCH_Print: - Added options to select the color theme and enable background color. (#362) - SVG: diff --git a/README.md b/README.md index e1fb0f9f..214dd7b0 100644 --- a/README.md +++ b/README.md @@ -1608,7 +1608,7 @@ Notes: format, 'ply' is Polygon File Format (Stanford). Note that some formats includes the light and camera and others are just the 3D model (i.e. STL and PLY). - - `output`: [string='%f-%i%I%v.%x'] Name for the generated file (%i='blender' %x=VARIABLE). + - `output`: [string='%f-%i%I%v.%x'] Name for the generated file (%i='3D_blender_$VIEW' %x=VARIABLE). The extension is selected from the type. Affected by global options. - `pcb_import`: Options to configure how Blender imports the PCB. The default values are good for most cases. @@ -4189,6 +4189,8 @@ Notes: * Type: `report` * Description: Generates a report about the design. Mainly oriented to be sent to the manufacturer or check PCB details. + You can expand internal values, KiCad text variables and environment + variables using `${VARIABLE}` * Valid keys: - **`comment`**: [string=''] A comment for documentation purposes. It helps to identify the output. - **`dir`**: [string='./'] Output directory for the generated files. diff --git a/docs/samples/generic_plot.kibot.yaml b/docs/samples/generic_plot.kibot.yaml index 818dbdc0..b3603d0f 100644 --- a/docs/samples/generic_plot.kibot.yaml +++ b/docs/samples/generic_plot.kibot.yaml @@ -45,10 +45,10 @@ preflight: # This is useful for KiCad 5, use `set_text_variables` when using KiCad 6. # This preflight modifies the PCB. Even when a back-up is done use it carefully. pcb_replace: - date_command: "git log -1 --format='%as' -- $KIBOT_PCB_NAME" + date_command: 'git log -1 --format="%as" -- "$KIBOT_PCB_NAME"' replace_tags: - tag: '@git_hash@' - command: 'git log -1 --format="%h" $KIBOT_PCB_NAME' + command: 'git log -1 --format="%h" "$KIBOT_PCB_NAME"' before: 'Git hash: <' after: '>' # [boolean=false] Runs the DRC (Distance Rules Check). To ensure we have a valid PCB. @@ -63,10 +63,10 @@ preflight: # This is useful for KiCad 5, use `set_text_variables` when using KiCad 6. # This preflight modifies the schematics. Even when a back-up is done use it carefully. sch_replace: - date_command: "git log -1 --format='%as' -- $KIBOT_SCH_NAME" + date_command: 'git log -1 --format="%as" -- "$KIBOT_SCH_NAME"' replace_tags: - tag: '@git_hash@' - command: 'git log -1 --format="%h" $KIBOT_SCH_NAME' + command: 'git log -1 --format="%h" "$KIBOT_SCH_NAME"' before: 'Git hash: <' after: '>' # [dict|list(dict)] Defines KiCad 6 variables. @@ -135,7 +135,7 @@ outputs: no_virtual: false # [dict|list(dict)] Outputs to generate in the same run outputs: - # [string='%f-%i%I%v.%x'] Name for the generated file (%i='blender' %x=VARIABLE). + # [string='%f-%i%I%v.%x'] Name for the generated file (%i='3D_blender_$VIEW' %x=VARIABLE). # The extension is selected from the type. Affected by global options - output: '%f-%i%I%v.%x' # [string='render'] [fbx,obj,x3d,gltf,stl,ply,blender,render] The format for the output. @@ -2886,6 +2886,8 @@ outputs: zoom: 0 # Design report: # Mainly oriented to be sent to the manufacturer or check PCB details. + # You can expand internal values, KiCad text variables and environment + # variables using `${VARIABLE}` - name: 'report_example' comment: 'Generates a report about the design.' type: 'report' diff --git a/kibot/out_report.py b/kibot/out_report.py index af063f19..016a0b66 100644 --- a/kibot/out_report.py +++ b/kibot/out_report.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2022 Salvador E. Tropea -# Copyright (c) 2022 Instituto Nacional de Tecnología Industrial +# Copyright (c) 2022-2023 Salvador E. Tropea +# Copyright (c) 2022-2023 Instituto Nacional de Tecnología Industrial # License: GPL-3.0 # Project: KiBot (formerly KiPlot) """ @@ -31,6 +31,7 @@ from .kiplot import config_output from .dep_downloader import get_dep_data from .macros import macros, document, output_class # noqa: F401 from . import log +from . import __version__ logger = log.get_logger() INF = float('inf') @@ -214,6 +215,7 @@ class ReportOptions(BaseOptions): dep = get_dep_data('report', 'PanDoc') deb_text = 'In Debian/Ubuntu environments: install '+list_nice([dep.deb_package]+dep.extra_deb) self._help_do_convert += ".\n"+'\n'.join(dep.comments)+'\n'+deb_text + self._shown_defined = False def config(self, parent): super().config(parent) @@ -284,7 +286,10 @@ class ReportOptions(BaseOptions): rep = str(val) line = line.replace('${'+var_ori+'}', rep) else: - print('Error: Unable to expand `{}`'.format(var)) + logger.error('Unable to expand `{}`'.format(var)) + if not self._shown_defined: + self._shown_defined = True + logger.error('Defined values: {}'.format([v for v in defined.keys() if v[0] != '_'])) return line def context_defined_tracks(self, line): @@ -747,9 +752,28 @@ class ReportOptions(BaseOptions): logger.debug('- Result `{}`'.format(res)) return res + def get_kicad_vars(self): + vars = {} + vars['KICAD_VERSION'] = 'KiCad E.D.A. '+GS.kicad_version+' + KiBot v'+__version__ + GS.load_pcb_title_block() + for num in range(9): + vars['COMMENT'+str(num+1)] = GS.pcb_com[num] + vars['COMPANY'] = GS.pcb_comp + vars['ISSUE_DATE'] = GS.pcb_date + vars['REVISION'] = GS.pcb_rev + vars['TITLE'] = GS.pcb_title + vars['FILENAME'] = GS.pcb_basename+'.kicad_pcb' + return vars + def do_template(self, template_file, output_file): text = '' logger.debug("Report template: `{}`".format(template_file)) + # Collect the thing we could expand + defined = {} + defined.update(os.environ) + defined.update(self.get_kicad_vars()) + defined.update(GS.load_pro_variables()) + defined.update(self.__dict__) with open(template_file, "rt") as f: skip_next = False for line in f: @@ -774,7 +798,7 @@ class ReportOptions(BaseOptions): raise KiPlotConfigurationError("Unknown context: `{}`".format(context)) if not done: # Just replace using any data member (_* excluded) - line = self.do_replacements(line, self.__dict__) + line = self.do_replacements(line, defined) text += line logger.debug("Report output: `{}`".format(output_file)) if self.to_ascii: @@ -880,7 +904,9 @@ class ReportOptions(BaseOptions): class Report(BaseOutput): # noqa: F821 """ Design report Generates a report about the design. - Mainly oriented to be sent to the manufacturer or check PCB details. """ + Mainly oriented to be sent to the manufacturer or check PCB details. + You can expand internal values, KiCad text variables and environment + variables using `${VARIABLE}` """ def __init__(self): super().__init__() with document: diff --git a/kibot/pre_any_replace.py b/kibot/pre_any_replace.py index 6e73ae46..dc6ca2aa 100644 --- a/kibot/pre_any_replace.py +++ b/kibot/pre_any_replace.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021 Salvador E. Tropea -# Copyright (c) 2021 Instituto Nacional de Tecnología Industrial +# Copyright (c) 2021-2023 Salvador E. Tropea +# Copyright (c) 2021-2023 Instituto Nacional de Tecnología Industrial # License: GPL-3.0 # Project: KiBot (formerly KiPlot) import os @@ -80,10 +80,10 @@ class Base_Replace(BasePreFlight): # noqa: F821 @classmethod def get_example(cls): """ Returns a YAML value for the example config """ - return ("\n date_command: \"git log -1 --format='%as' -- $KIBOT_{}_NAME\"" + return ("\n date_command: 'git log -1 --format=\"%as\" -- \"$KIBOT_{}_NAME\"'" "\n replace_tags:" "\n - tag: '@git_hash@'" - "\n command: 'git log -1 --format=\"%h\" $KIBOT_{}_NAME'" + "\n command: 'git log -1 --format=\"%h\" \"$KIBOT_{}_NAME\"'" "\n before: 'Git hash: <'" "\n after: '>'".format(cls._context, cls._context)) diff --git a/tests/data/report_vars.txt b/tests/data/report_vars.txt new file mode 100644 index 00000000..0b0dd56d --- /dev/null +++ b/tests/data/report_vars.txt @@ -0,0 +1,16 @@ +--- +title: | + | ACME GmbH + | PCB Specifications +subtitle: | + | Project ${PROJECT} Rev ${REVISION} + | ${SAP} +author: ${AUTHOR} +date: ${ISSUE_DATE} +footer: ${git_hash} +geometry: "left=2cm, right=2cm, top=3cm, bottom=3cm" +--- + + +Git hash: ${git_hash} +\newpage diff --git a/tests/yaml_samples/report_vars_1.kibot.yaml b/tests/yaml_samples/report_vars_1.kibot.yaml new file mode 100644 index 00000000..b79df0e6 --- /dev/null +++ b/tests/yaml_samples/report_vars_1.kibot.yaml @@ -0,0 +1,27 @@ +# Example KiBot config file +kibot: + version: 1 + +preflight: + set_text_variables: + - name: PROJECT + text: Test project + - name: SAP + text: XYZ + - name: AUTHOR + text: Juan de los palotes + - name: date + command: 'git log -1 --format="%as" -- "$KIBOT_PCB_NAME"' + - name: git_hash + command: 'git log -1 --format="%h" "$KIBOT_PCB_NAME"' + before: 'Git hash: <' + after: '>' + - name: gh + command: 'git log -1 --format="%h" "$KIBOT_PCB_NAME"' + +outputs: + - name: 'report_vars' + comment: "Various variables" + type: report + options: + template: tests/data/report_vars.txt