[BoM] Added support for text variables expansion

- Is done using a filter, the expansion is done at the end, but
  the filter can be applied at any point in the filter/variant
  chain.
Fixes #247
This commit is contained in:
Salvador E. Tropea 2022-08-12 09:09:09 -03:00
parent fcdedad360
commit 553d47f533
11 changed files with 428 additions and 43 deletions

View File

@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Workaround for problems with DRC exclusions (See INTI-CMNB/KiAuto#26) - Workaround for problems with DRC exclusions (See INTI-CMNB/KiAuto#26)
Global option: `drc_exclusions_workaround` Global option: `drc_exclusions_workaround`
KiCad bug [11562](https://gitlab.com/kicad/code/kicad/-/issues/11562) KiCad bug [11562](https://gitlab.com/kicad/code/kicad/-/issues/11562)
- Internal BoM: KiCad 6 text variables expansion in the fields (#247)
### Fixed ### Fixed
- OAR computation (Report) (#225) - OAR computation (Report) (#225)

View File

@ -738,6 +738,13 @@ filters:
#### Supported filters: #### Supported filters:
- expand_text_vars: Expand_Text_Vars
This filter expands KiCad 6 text variables (${VARIABLE}).
* Valid keys:
- `comment`: [string=''] A comment for documentation purposes.
- `include_kicad_env`: [boolean=true] Also expand KiCad environment variables.
- `include_os_env`: [boolean=false] Also expand system environment variables.
- `name`: [string=''] Used to identify this particular filter definition.
- field_rename: Field_Rename - field_rename: Field_Rename
This filter implements a field renamer. This filter implements a field renamer.
The internal `_kicost_rename` filter emulates the KiCost behavior. The internal `_kicost_rename` filter emulates the KiCost behavior.
@ -872,14 +879,15 @@ The [tests/yaml_samples](https://github.com/INTI-CMNB/KiBot/tree/master/tests/ya
#### Built-in filters #### Built-in filters
- **_mechanical** is used to exclude: - **_expand_text_vars** is a default `expand_text_vars` filter
- References that start with # - **_kibom_dnc_Config** it uses the internal `dnc_list` to exclude components with
- Virtual components - Value matching any of the keys
- References that match: '^TP[0-9]*' or '^FID' - Any of the keys in the `Config` field (comma or space separated)
- Part names that match: 'regex': 'mount.*hole' or 'solder.*bridge' or 'solder.*jump' or 'test.*point' - **_kibom_dnf_Config** it uses the internal `dnf_list` to exclude components with
- Footprints that match: 'test.*point' or 'mount.*hole' or 'fiducial' - Value matching any of the keys
- **_var_rename** is a default `var_rename` filter - Any of the keys in the `Config` field (comma or space separated)
- **_var_rename_kicost** is a default `var_rename_kicost` filter - **_kicost_dnp** used emulate the way KiCost handles the `dnp` field.
- If the field is 0 the component is included, otherwise excluded.
- **_kicost_rename** is a `field_rename` filter that applies KiCost renamings. - **_kicost_rename** is a `field_rename` filter that applies KiCost renamings.
- Includes all `manf#` and `manf` variations supported by KiCost - Includes all `manf#` and `manf` variations supported by KiCost
- Includes all distributor part number variations supported by KiCost - Includes all distributor part number variations supported by KiCost
@ -887,17 +895,17 @@ The [tests/yaml_samples](https://github.com/INTI-CMNB/KiBot/tree/master/tests/ya
- 'nopop' -> 'dnp' - 'nopop' -> 'dnp'
- 'description' -> 'desc' - 'description' -> 'desc'
- 'pdf' -> 'datasheet' - 'pdf' -> 'datasheet'
- **_kicost_dnp** used emulate the way KiCost handles the `dnp` field. - **_mechanical** is used to exclude:
- If the field is 0 the component is included, otherwise excluded. - References that start with #
- Virtual components
- References that match: '^TP[0-9]*' or '^FID'
- Part names that match: 'regex': 'mount.*hole' or 'solder.*bridge' or 'solder.*jump' or 'test.*point'
- Footprints that match: 'test.*point' or 'mount.*hole' or 'fiducial'
- **_rot_footprint** is a default `rot_footprint` filter - **_rot_footprint** is a default `rot_footprint` filter
- **_kibom_dnf_Config** it uses the internal `dnf_list` to exclude components with - **_var_rename** is a default `var_rename` filter
- Value matching any of the keys - **_var_rename_kicost** is a default `var_rename_kicost` filter
- Any of the keys in the `Config` field (comma or space separated)
- **_kibom_dnc_Config** it uses the internal `dnc_list` to exclude components with
- Value matching any of the keys
- Any of the keys in the `Config` field (comma or space separated)
Note that the last two uses a field named `Config`, but you can customise them invoking **_kibom_dnf_FIELD**. This will create an equivalent filter, but using the indicated **FIELD**. Note that the **_kibom_...** filters uses a field named `Config`, but you can customise them invoking **_kibom_dnf_FIELD**. This will create an equivalent filter, but using the indicated **FIELD**.
#### Changing the 3D model, simple mechanism #### Changing the 3D model, simple mechanism
@ -1388,6 +1396,10 @@ Notes:
The default filter marks components with a DNF value or DNF in the Config field. The default filter marks components with a DNF value or DNF in the Config field.
- `exclude_filter`: [string|list(string)='_mechanical'] Name of the filter to exclude components from BoM processing. - `exclude_filter`: [string|list(string)='_mechanical'] Name of the filter to exclude components from BoM processing.
The default filter excludes test points, fiducial marks, mounting holes, etc. The default filter excludes test points, fiducial marks, mounting holes, etc.
- `expand_text_vars`: [boolean=true] Expand KiCad 6 text variables after applying all filters and variants.
This is done using a **_expand_text_vars** filter.
If you need to customize the filter, or apply it before, you can disable this option and
add a custom filter to the filter chain.
- `fit_field`: [string='Config'] Field name used for internal filters. - `fit_field`: [string='Config'] Field name used for internal filters.
- `footprint_populate_values`: [string|list(string)='no,yes'] Values for the `Footprint Populate` column. - `footprint_populate_values`: [string|list(string)='no,yes'] Values for the `Footprint Populate` column.
- `footprint_type_values`: [string|list(string)='SMD,THT,VIRTUAL'] Values for the `Footprint Type` column. - `footprint_type_values`: [string|list(string)='SMD,THT,VIRTUAL'] Values for the `Footprint Type` column.

View File

@ -517,14 +517,15 @@ The [tests/yaml_samples](https://github.com/INTI-CMNB/KiBot/tree/master/tests/ya
#### Built-in filters #### Built-in filters
- **_mechanical** is used to exclude: - **_expand_text_vars** is a default `expand_text_vars` filter
- References that start with # - **_kibom_dnc_Config** it uses the internal `dnc_list` to exclude components with
- Virtual components - Value matching any of the keys
- References that match: '^TP[0-9]*' or '^FID' - Any of the keys in the `Config` field (comma or space separated)
- Part names that match: 'regex': 'mount.*hole' or 'solder.*bridge' or 'solder.*jump' or 'test.*point' - **_kibom_dnf_Config** it uses the internal `dnf_list` to exclude components with
- Footprints that match: 'test.*point' or 'mount.*hole' or 'fiducial' - Value matching any of the keys
- **_var_rename** is a default `var_rename` filter - Any of the keys in the `Config` field (comma or space separated)
- **_var_rename_kicost** is a default `var_rename_kicost` filter - **_kicost_dnp** used emulate the way KiCost handles the `dnp` field.
- If the field is 0 the component is included, otherwise excluded.
- **_kicost_rename** is a `field_rename` filter that applies KiCost renamings. - **_kicost_rename** is a `field_rename` filter that applies KiCost renamings.
- Includes all `manf#` and `manf` variations supported by KiCost - Includes all `manf#` and `manf` variations supported by KiCost
- Includes all distributor part number variations supported by KiCost - Includes all distributor part number variations supported by KiCost
@ -532,17 +533,17 @@ The [tests/yaml_samples](https://github.com/INTI-CMNB/KiBot/tree/master/tests/ya
- 'nopop' -> 'dnp' - 'nopop' -> 'dnp'
- 'description' -> 'desc' - 'description' -> 'desc'
- 'pdf' -> 'datasheet' - 'pdf' -> 'datasheet'
- **_kicost_dnp** used emulate the way KiCost handles the `dnp` field. - **_mechanical** is used to exclude:
- If the field is 0 the component is included, otherwise excluded. - References that start with #
- Virtual components
- References that match: '^TP[0-9]*' or '^FID'
- Part names that match: 'regex': 'mount.*hole' or 'solder.*bridge' or 'solder.*jump' or 'test.*point'
- Footprints that match: 'test.*point' or 'mount.*hole' or 'fiducial'
- **_rot_footprint** is a default `rot_footprint` filter - **_rot_footprint** is a default `rot_footprint` filter
- **_kibom_dnf_Config** it uses the internal `dnf_list` to exclude components with - **_var_rename** is a default `var_rename` filter
- Value matching any of the keys - **_var_rename_kicost** is a default `var_rename_kicost` filter
- Any of the keys in the `Config` field (comma or space separated)
- **_kibom_dnc_Config** it uses the internal `dnc_list` to exclude components with
- Value matching any of the keys
- Any of the keys in the `Config` field (comma or space separated)
Note that the last two uses a field named `Config`, but you can customise them invoking **_kibom_dnf_FIELD**. This will create an equivalent filter, but using the indicated **FIELD**. Note that the **_kibom_...** filters uses a field named `Config`, but you can customise them invoking **_kibom_dnf_FIELD**. This will create an equivalent filter, but using the indicated **FIELD**.
#### Changing the 3D model, simple mechanism #### Changing the 3D model, simple mechanism

View File

@ -211,6 +211,11 @@ outputs:
# [string|list(string)='_mechanical'] Name of the filter to exclude components from BoM processing. # [string|list(string)='_mechanical'] Name of the filter to exclude components from BoM processing.
# The default filter excludes test points, fiducial marks, mounting holes, etc # The default filter excludes test points, fiducial marks, mounting holes, etc
exclude_filter: '_mechanical' exclude_filter: '_mechanical'
# [boolean=true] Expand KiCad 6 text variables after applying all filters and variants.
# This is done using a **_expand_text_vars** filter.
# If you need to customize the filter, or apply it before, you can disable this option and
# add a custom filter to the filter chain
expand_text_vars: true
# [string='Config'] Field name used for internal filters # [string='Config'] Field name used for internal filters
fit_field: 'Config' fit_field: 'Config'
# [string|list(string)='no,yes'] Values for the `Footprint Populate` column # [string|list(string)='no,yes'] Values for the `Footprint Populate` column

View File

@ -1,13 +1,13 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2020-2021 Salvador E. Tropea # Copyright (c) 2020-2022 Salvador E. Tropea
# Copyright (c) 2020-2021 Instituto Nacional de Tecnología Industrial # Copyright (c) 2020-2022 Instituto Nacional de Tecnología Industrial
# License: GPL-3.0 # License: GPL-3.0
# Project: KiBot (formerly KiPlot) # Project: KiBot (formerly KiPlot)
from .registrable import RegFilter, Registrable, RegOutput from .registrable import RegFilter, Registrable, RegOutput
from .optionable import Optionable from .optionable import Optionable
from .gs import GS from .gs import GS
from .misc import (IFILT_MECHANICAL, IFILT_VAR_RENAME, IFILT_ROT_FOOTPRINT, IFILT_KICOST_RENAME, DISTRIBUTORS, from .misc import (IFILT_MECHANICAL, IFILT_VAR_RENAME, IFILT_ROT_FOOTPRINT, IFILT_KICOST_RENAME, DISTRIBUTORS,
IFILT_VAR_RENAME_KICOST, IFILT_KICOST_DNP) IFILT_VAR_RENAME_KICOST, IFILT_KICOST_DNP, IFILT_EXPAND_TEXT_VARS)
from .error import KiPlotConfigurationError from .error import KiPlotConfigurationError
from .bom.columnlist import ColumnList from .bom.columnlist import ColumnList
from .macros import macros, document # noqa: F401 from .macros import macros, document # noqa: F401
@ -243,6 +243,14 @@ class BaseFilter(RegFilter):
logger.debug('Creating internal filter: '+str(o_tree)) logger.debug('Creating internal filter: '+str(o_tree))
return o_tree return o_tree
@staticmethod
def _create_expand_text_vars(name):
o_tree = {'name': name}
o_tree['type'] = 'expand_text_vars'
o_tree['comment'] = 'Internal default text variables expander'
logger.debug('Creating internal filter: '+str(o_tree))
return o_tree
@staticmethod @staticmethod
def _create_kibom_dnx(name): def _create_kibom_dnx(name):
type = name[7:10] type = name[7:10]
@ -308,6 +316,8 @@ class BaseFilter(RegFilter):
tree = BaseFilter._create_var_rename_kicost(name) tree = BaseFilter._create_var_rename_kicost(name)
elif name == IFILT_KICOST_DNP: elif name == IFILT_KICOST_DNP:
tree = BaseFilter._create_kicost_dnp(name) tree = BaseFilter._create_kicost_dnp(name)
elif name == IFILT_EXPAND_TEXT_VARS:
tree = BaseFilter._create_expand_text_vars(name)
else: else:
return None return None
filter = RegFilter.get_class_for(tree['type'])() filter = RegFilter.get_class_for(tree['type'])()

View File

@ -0,0 +1,49 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2022 Salvador E. Tropea
# Copyright (c) 2022 Instituto Nacional de Tecnología Industrial
# License: GPL-3.0
# Project: KiBot (formerly KiPlot)
# Description: Expands KiCad 6 text variables
import os
from .gs import GS
from .kicad.config import KiConf, expand_env
from .macros import macros, document, filter_class # noqa: F401
from . import log
logger = log.get_logger()
@filter_class
class Expand_Text_Vars(BaseFilter): # noqa: F821
""" Expand_Text_Vars
This filter expands KiCad 6 text variables (${VARIABLE}) """
def __init__(self):
super().__init__()
with document:
self.include_os_env = False
""" Also expand system environment variables """
self.include_kicad_env = True
""" Also expand KiCad environment variables """
self._first_pass = True
self._is_transform = True
def filter(self, comp):
if self._first_pass:
# Ensure we initialized the KiCad environment variables
KiConf.init(GS.sch_file)
# Collect the "extra" variables
self.extra_env = {}
if self.include_os_env:
self.extra_env.update(os.environ)
if self.include_kicad_env:
self.extra_env.update(KiConf.kicad_env)
# Get the text variables from the project
self.text_vars = GS.load_pro_variables()
self._first_pass = False
# Expand text variables in all fields
for f in comp.fields:
new_value = expand_env(f.value, self.text_vars, self.extra_env)
if new_value != f.value:
comp.set_field(f.name, new_value)
if GS.debug_level > 2:
logger.debug('ref: {} {}: {} -> {}'.format(comp.ref, f.name, f.value, new_value))

View File

@ -83,6 +83,7 @@ IFILT_VAR_RENAME_KICOST = '_var_rename_kicost'
IFILT_ROT_FOOTPRINT = '_rot_footprint' IFILT_ROT_FOOTPRINT = '_rot_footprint'
IFILT_KICOST_RENAME = '_kicost_rename' IFILT_KICOST_RENAME = '_kicost_rename'
IFILT_KICOST_DNP = '_kicost_dnp' IFILT_KICOST_DNP = '_kicost_dnp'
IFILT_EXPAND_TEXT_VARS = '_expand_text_vars'
# KiCad 5 GUI values for the attribute # KiCad 5 GUI values for the attribute
UI_THT = 0 # 1 for KiCad 6 UI_THT = 0 # 1 for KiCad 6
UI_SMD = 1 # 2 for KiCad 6 UI_SMD = 1 # 2 for KiCad 6

View File

@ -20,7 +20,7 @@ import os
import re import re
from copy import deepcopy from copy import deepcopy
from .gs import GS from .gs import GS
from .misc import W_BADFIELD, W_NEEDSPCB, DISTRIBUTORS from .misc import W_BADFIELD, W_NEEDSPCB, DISTRIBUTORS, IFILT_EXPAND_TEXT_VARS
from .optionable import Optionable, BaseOptions from .optionable import Optionable, BaseOptions
from .registrable import RegOutput from .registrable import RegOutput
from .error import KiPlotConfigurationError from .error import KiPlotConfigurationError
@ -29,7 +29,7 @@ from .bom.columnlist import ColumnList, BoMError
from .bom.bom import do_bom from .bom.bom import do_bom
from .var_kibom import KiBoM from .var_kibom import KiBoM
from .fil_base import (BaseFilter, apply_exclude_filter, apply_fitted_filter, apply_fixed_filter, reset_filters, from .fil_base import (BaseFilter, apply_exclude_filter, apply_fitted_filter, apply_fixed_filter, reset_filters,
KICOST_NAME_TRANSLATIONS) KICOST_NAME_TRANSLATIONS, apply_pre_transform)
from .macros import macros, document, output_class # noqa: F401 from .macros import macros, document, output_class # noqa: F401
from . import log from . import log
# To debug the `with document` we can use: # To debug the `with document` we can use:
@ -479,6 +479,11 @@ class BoMOptions(BaseOptions):
""" [string|list(string)='no,yes'] Values for the `Footprint Populate` column """ """ [string|list(string)='no,yes'] Values for the `Footprint Populate` column """
self.footprint_type_values = Optionable self.footprint_type_values = Optionable
""" [string|list(string)='SMD,THT,VIRTUAL'] Values for the `Footprint Type` column """ """ [string|list(string)='SMD,THT,VIRTUAL'] Values for the `Footprint Type` column """
self.expand_text_vars = True
""" Expand KiCad 6 text variables after applying all filters and variants.
This is done using a **_expand_text_vars** filter.
If you need to customize the filter, or apply it before, you can disable this option and
add a custom filter to the filter chain """
self._format_example = 'CSV' self._format_example = 'CSV'
self._footprint_populate_values_example = 'no,yes' self._footprint_populate_values_example = 'no,yes'
self._footprint_type_values_example = 'SMD,THT,VIRTUAL' self._footprint_type_values_example = 'SMD,THT,VIRTUAL'
@ -724,6 +729,11 @@ class BoMOptions(BaseOptions):
apply_fixed_filter(comps, self.dnc_filter) apply_fixed_filter(comps, self.dnc_filter)
# Apply the variant # Apply the variant
comps = self.variant.filter(comps) comps = self.variant.filter(comps)
# Now expand the text variables, the user can disable it and insert a customized filter
# in the variant or even before.
if self.expand_text_vars:
comps = apply_pre_transform(comps, BaseFilter.solve_filter(IFILT_EXPAND_TEXT_VARS, 'KiCad 6 text vars',
is_transform=True))
# We add the main project to the aggregate list so do_bom sees a complete list # We add the main project to the aggregate list so do_bom sees a complete list
base_sch = Aggregate() base_sch = Aggregate()
base_sch.file = GS.sch_file base_sch.file = GS.sch_file

View File

@ -415,6 +415,7 @@
] ]
], ],
"text_variables": { "text_variables": {
"text": "Test" "text": "Test",
"VAL_C2": "1000 pF"
} }
} }

View File

@ -1 +0,0 @@
kibom-variant_3.kicad_sch

View File

@ -0,0 +1,277 @@
(kicad_sch (version 20211123) (generator eeschema)
(uuid e6521bef-4109-48f7-8b88-4121b0468927)
(paper "A4")
(title_block
(title "KiBom Test Schematic")
(date "2020-03-12")
(rev "A")
(company "https://github.com/SchrodingersGat/KiBom")
)
(lib_symbols
(symbol "Device:C" (pin_numbers hide) (pin_names (offset 0.254)) (in_bom yes) (on_board yes)
(property "Reference" "C" (id 0) (at 0.635 2.54 0)
(effects (font (size 1.27 1.27)) (justify left))
)
(property "Value" "C" (id 1) (at 0.635 -2.54 0)
(effects (font (size 1.27 1.27)) (justify left))
)
(property "Footprint" "" (id 2) (at 0.9652 -3.81 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "~" (id 3) (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_keywords" "cap capacitor" (id 4) (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_description" "Unpolarized capacitor" (id 5) (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_fp_filters" "C_*" (id 6) (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "C_0_1"
(polyline
(pts
(xy -2.032 -0.762)
(xy 2.032 -0.762)
)
(stroke (width 0.508) (type default) (color 0 0 0 0))
(fill (type none))
)
(polyline
(pts
(xy -2.032 0.762)
(xy 2.032 0.762)
)
(stroke (width 0.508) (type default) (color 0 0 0 0))
(fill (type none))
)
)
(symbol "C_1_1"
(pin passive line (at 0 3.81 270) (length 2.794)
(name "~" (effects (font (size 1.27 1.27))))
(number "1" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 0 -3.81 90) (length 2.794)
(name "~" (effects (font (size 1.27 1.27))))
(number "2" (effects (font (size 1.27 1.27))))
)
)
)
(symbol "Device:R" (pin_numbers hide) (pin_names (offset 0)) (in_bom yes) (on_board yes)
(property "Reference" "R" (id 0) (at 2.032 0 90)
(effects (font (size 1.27 1.27)))
)
(property "Value" "R" (id 1) (at 0 0 90)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "" (id 2) (at -1.778 0 90)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "~" (id 3) (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_keywords" "R res resistor" (id 4) (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_description" "Resistor" (id 5) (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_fp_filters" "R_*" (id 6) (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "R_0_1"
(rectangle (start -1.016 -2.54) (end 1.016 2.54)
(stroke (width 0.254) (type default) (color 0 0 0 0))
(fill (type none))
)
)
(symbol "R_1_1"
(pin passive line (at 0 3.81 270) (length 1.27)
(name "~" (effects (font (size 1.27 1.27))))
(number "1" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 0 -3.81 90) (length 1.27)
(name "~" (effects (font (size 1.27 1.27))))
(number "2" (effects (font (size 1.27 1.27))))
)
)
)
(symbol "Mechanical:Fiducial" (in_bom yes) (on_board yes)
(property "Reference" "FID" (id 0) (at 0 5.08 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "Fiducial" (id 1) (at 0 3.175 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "" (id 2) (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "~" (id 3) (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_keywords" "fiducial marker" (id 4) (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_description" "Fiducial Marker" (id 5) (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_fp_filters" "Fiducial*" (id 6) (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "Fiducial_0_1"
(circle (center 0 0) (radius 1.27)
(stroke (width 0.508) (type default) (color 0 0 0 0))
(fill (type background))
)
)
)
)
(text "This schematic serves as a test-file for the KiBot export script.\nHere we implement the IBoM variants style."
(at 12.7 19.05 0)
(effects (font (size 2.0066 2.0066)) (justify left bottom))
(uuid 9a9f2d82-f64d-4264-8bec-c182528fc4de)
)
(text "The test tests the following \nvariants matrix:\n production test default\nC1 X\nC2 X X\nR1 X X X\nR2 X X\n\nproduction: blacklist T2\ntest: blacklist T1\ndefault: whitelist T1,default \n blacklist T2,T3"
(at 151.13 81.28 0)
(effects (font (size 2.9972 2.9972)) (justify left bottom))
(uuid b60c50d1-225e-415c-8712-7acb5e3dc8ea)
)
(symbol (lib_id "Device:C") (at 25.4 43.18 0) (unit 1)
(in_bom yes) (on_board yes)
(uuid 00000000-0000-0000-0000-00005f43bec2)
(property "Reference" "C1" (id 0) (at 28.321 42.0116 0)
(effects (font (size 1.27 1.27)) (justify left))
)
(property "Value" "1nF" (id 1) (at 28.321 44.323 0)
(effects (font (size 1.27 1.27)) (justify left))
)
(property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (id 2) (at 26.3652 46.99 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "~" (id 3) (at 25.4 43.18 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Config" "T2" (id 4) (at 25.4 43.18 0)
(effects (font (size 1.27 1.27)) hide)
)
(pin "1" (uuid d22e95aa-f3db-4fbc-a331-048a2523233e))
(pin "2" (uuid 0d0bb7b2-a6e5-46d2-9492-a1aa6e5a7b2f))
)
(symbol (lib_id "Device:C") (at 36.83 43.18 0) (unit 1)
(in_bom yes) (on_board yes)
(uuid 00000000-0000-0000-0000-00005f43ce1c)
(property "Reference" "C2" (id 0) (at 39.751 42.0116 0)
(effects (font (size 1.27 1.27)) (justify left))
)
(property "Value" "${VAL_C2}" (id 1) (at 39.751 44.323 0)
(effects (font (size 1.27 1.27)) (justify left))
)
(property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (id 2) (at 37.7952 46.99 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "~" (id 3) (at 36.83 43.18 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Config" "T3" (id 4) (at 36.83 43.18 0)
(effects (font (size 1.27 1.27)) hide)
)
(pin "1" (uuid 0a3cc030-c9dd-4d74-9d50-715ed2b361a2))
(pin "2" (uuid 8322f275-268c-4e87-a69f-4cfbf05e747f))
)
(symbol (lib_id "Device:R") (at 53.34 43.18 0) (unit 1)
(in_bom yes) (on_board yes)
(uuid 00000000-0000-0000-0000-00005f43d144)
(property "Reference" "R1" (id 0) (at 55.118 42.0116 0)
(effects (font (size 1.27 1.27)) (justify left))
)
(property "Value" "1k" (id 1) (at 55.118 44.323 0)
(effects (font (size 1.27 1.27)) (justify left))
)
(property "Footprint" "Resistor_SMD:R_0805_2012Metric" (id 2) (at 51.562 43.18 90)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "~" (id 3) (at 53.34 43.18 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Config" "default" (id 4) (at 53.34 43.18 0)
(effects (font (size 1.27 1.27)) hide)
)
(pin "1" (uuid 48f827a8-6e22-4a2e-abdc-c2a03098d883))
(pin "2" (uuid e877bf4a-4210-4bd3-b7b0-806eb4affc5b))
)
(symbol (lib_id "Device:R") (at 63.5 43.18 0) (unit 1)
(in_bom yes) (on_board yes)
(uuid 00000000-0000-0000-0000-00005f43d4bb)
(property "Reference" "R2" (id 0) (at 65.278 42.0116 0)
(effects (font (size 1.27 1.27)) (justify left))
)
(property "Value" "1000" (id 1) (at 65.278 44.323 0)
(effects (font (size 1.27 1.27)) (justify left))
)
(property "Footprint" "Resistor_SMD:R_0805_2012Metric" (id 2) (at 61.722 43.18 90)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "~" (id 3) (at 63.5 43.18 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Config" "T1" (id 4) (at 63.5 43.18 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "default:_3D_model" "${KICAD6_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_2010_5025Metric.wrl" (id 5) (at 63.5 43.18 0)
(effects (font (size 1.27 1.27)) hide)
)
(pin "1" (uuid c70d9ef3-bfeb-47e0-a1e1-9aeba3da7864))
(pin "2" (uuid 4e3d7c0d-12e3-42f2-b944-e4bcdbbcac2a))
)
(symbol (lib_id "Mechanical:Fiducial") (at 44.45 57.15 0) (unit 1)
(in_bom yes) (on_board yes)
(uuid 00000000-0000-0000-0000-00005f57eddb)
(property "Reference" "FID1" (id 0) (at 46.609 55.9816 0)
(effects (font (size 1.27 1.27)) (justify left))
)
(property "Value" "Fiducial" (id 1) (at 46.609 58.293 0)
(effects (font (size 1.27 1.27)) (justify left))
)
(property "Footprint" "Fiducial:Fiducial_0.5mm_Mask1mm" (id 2) (at 44.45 57.15 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "~" (id 3) (at 44.45 57.15 0)
(effects (font (size 1.27 1.27)) hide)
)
)
(sheet_instances
(path "/" (page "1"))
)
(symbol_instances
(path "/00000000-0000-0000-0000-00005f43bec2"
(reference "C1") (unit 1) (value "1nF") (footprint "Capacitor_SMD:C_0805_2012Metric")
)
(path "/00000000-0000-0000-0000-00005f43ce1c"
(reference "C2") (unit 1) (value "${VAL_C2}") (footprint "Capacitor_SMD:C_0805_2012Metric")
)
(path "/00000000-0000-0000-0000-00005f57eddb"
(reference "FID1") (unit 1) (value "Fiducial") (footprint "Fiducial:Fiducial_0.5mm_Mask1mm")
)
(path "/00000000-0000-0000-0000-00005f43d144"
(reference "R1") (unit 1) (value "1k") (footprint "Resistor_SMD:R_0805_2012Metric")
)
(path "/00000000-0000-0000-0000-00005f43d4bb"
(reference "R2") (unit 1) (value "1000") (footprint "Resistor_SMD:R_0805_2012Metric")
)
)
)

View File

@ -48,9 +48,10 @@ pytest-3 --log-cli-level debug
""" """
import os
import logging
from base64 import b64decode from base64 import b64decode
import logging
import os
import pytest
from . import context from . import context
from kibot.misc import EXIT_BAD_CONFIG from kibot.misc import EXIT_BAD_CONFIG
@ -1349,6 +1350,24 @@ def test_int_bom_variant_t2if(test_dir):
ctx.clean_up(keep_project=True) ctx.clean_up(keep_project=True)
@pytest.mark.skipif(context.ki5(), reason="needs KiCad 6 text variables")
def test_int_bom_variant_t2it(test_dir):
""" IBoM variants test full, here we expand KiCad 6 variables """
prj = 'kibom-variant_3_txt'
ctx = context.TestContextSCH(test_dir, prj, 'int_bom_var_t2i_csv', BOM_DIR)
ctx.run()
rows, header, info = ctx.load_csv(prj+'-bom.csv')
ref_column = header.index(REF_COLUMN_NAME)
check_kibom_test_netlist(rows, ref_column, 1, ['C1', 'C2'], ['R1', 'R2'])
rows, header, info = ctx.load_csv(prj+'-bom_[2].csv')
check_kibom_test_netlist(rows, ref_column, 1, ['C1', 'C2'], ['R1', 'R2'])
rows, header, info = ctx.load_csv(prj+'-bom_(production).csv')
check_kibom_test_netlist(rows, ref_column, 2, ['C1'], ['R1', 'R2', 'C2'])
rows, header, info = ctx.load_csv(prj+'-bom_(test).csv')
check_kibom_test_netlist(rows, ref_column, 2, ['R2'], ['R1', 'C1', 'C2'])
ctx.clean_up(keep_project=True)
def test_int_bom_variant_t2is(test_dir): def test_int_bom_variant_t2is(test_dir):
""" IBoM variants test simple """ """ IBoM variants test simple """
prj = 'kibom-variant_3' prj = 'kibom-variant_3'