[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:
parent
fcdedad360
commit
553d47f533
|
|
@ -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)
|
||||||
|
|
|
||||||
46
README.md
46
README.md
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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'])()
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -415,6 +415,7 @@
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"text_variables": {
|
"text_variables": {
|
||||||
"text": "Test"
|
"text": "Test",
|
||||||
|
"VAL_C2": "1000 pF"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
kibom-variant_3.kicad_sch
|
|
||||||
|
|
@ -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")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
@ -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'
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue