255 lines
7.9 KiB
Markdown
255 lines
7.9 KiB
Markdown
# Generate BOM for E-CAD Projects
|
|
|
|
Generate a BOM output file for Altium, OrCAD or System Capture projects on
|
|
AllSpice Hub using
|
|
[AllSpice Actions](https://learn.allspice.io/docs/actions-cicd).
|
|
|
|
## Usage
|
|
|
|
Add the following steps to your actions:
|
|
|
|
```yaml
|
|
# Checkout is only needed if columns.yml is committed in your Altium project repo.
|
|
- name: Checkout
|
|
uses: actions/checkout@v3
|
|
|
|
- name: Generate BOM
|
|
uses: https://hub.allspice.io/Actions/generate-bom@v0.5
|
|
with:
|
|
# The path to the project file in your repo.
|
|
# .PrjPcb for Altium, .DSN for OrCad, .SDAX for System Capture.
|
|
source_path: Archimajor.PrjPcb
|
|
# [optional] A path to a YAML file mapping columns to the component
|
|
# attributes they are from.
|
|
# Default: 'columns.yml'
|
|
columns: .allspice/columns.yml
|
|
# [optional] The path to the output file that will be generated.
|
|
# Default: 'bom.csv'
|
|
output_file_name: bom.csv
|
|
# [optional] A comma-separated list of columns to group the BOM by. If empty
|
|
# or not present, the BOM will be flat.
|
|
# Default: ''
|
|
group_by: "Part ID"
|
|
# [optional] The variant of the project to generate the BOM for. If empty
|
|
# or not present, the BOM will be generated for the default variant.
|
|
# Default: ''
|
|
variant: ""
|
|
```
|
|
|
|
### Customizing the Attributes Extracted by the BOM Script
|
|
|
|
This script relies on a YAML file to specify the columns in the BOM and which
|
|
attributes or properties of the components they are populated from. This file is
|
|
typically called `columns.yml` and can be checked into your repo. To learn more
|
|
about YAML, [check out the AllSpice Knowledge Base.](https://learn.allspice.io/docs/yaml)
|
|
|
|
The format of this YAML file is as follows:
|
|
|
|
```yml
|
|
columns:
|
|
- name: "Manufacturer"
|
|
part_attributes:
|
|
- "Manufacturer"
|
|
- "MANUFACTURER"
|
|
- name: "Part Number"
|
|
part_attributes:
|
|
- "PART"
|
|
- "MANUFACTURER #"
|
|
- "_part_id"
|
|
- name: "Designator"
|
|
part_attributes: "Designator"
|
|
- name: "Description"
|
|
part_attributes:
|
|
- "PART DESCRIPTION"
|
|
- "_description"
|
|
```
|
|
|
|
First, you have the key `columns:` which is mapped to a list. Each element of
|
|
the list has two key/value pairs. The first is `name`, which will be the column
|
|
name in the output file. Next, you have `part_attributes`. This can either be
|
|
just a string (like in the case of the `Designator` column) or a list of strings
|
|
(like in the other cases).
|
|
|
|
If `part_attributes` is a string, that property or attribute of the component
|
|
is used as the value for that column. If that property is not present
|
|
in a particular part, that column will be blank for that part. If
|
|
`part_attributes` is a list, those properties will be checked in the order they
|
|
are defined for each part. The _first_ property found is used as the value for
|
|
that column in the row for that part. So if both `PART` and `MANUFACTURER #` are
|
|
defined, it will use `PART`.
|
|
|
|
An example for OrCad `columns.yml` file content is:
|
|
|
|
```yml
|
|
columns:
|
|
- name: "Part Number"
|
|
part_attributes:
|
|
- "Part Number"
|
|
- "_name"
|
|
- name: "Designator"
|
|
part_attributes: "Part Reference"
|
|
- name: "Type"
|
|
part_attributes: "Part Type"
|
|
- name: "Value"
|
|
part_attributes: "Value"
|
|
```
|
|
|
|
By default, the action will pick up a `columns.yml` file from the working
|
|
directory. If you want to keep it in a different place or rename it, you can
|
|
pass the `--columns` argument to the step in the workflow to specify where it
|
|
is.
|
|
|
|
### Py-allspice injected attributes
|
|
|
|
Note that py-allspice also adds a few static attributes, which are taken from
|
|
the part itself, and not from the properties or attributes. For Altium projects,
|
|
`_part_id` and `_description` are available, which correspond to the Library
|
|
Reference and Description fields of the component. For OrCAD and System Capture
|
|
projects, `_name` is available, which corresponds to the name of the component.
|
|
|
|
The underscore is added ahead of the name to prevent these additional attributes
|
|
from overriding any of your own.
|
|
|
|
### Customizing sorting, filtering and grouping
|
|
|
|
If you need more control over the BOM, you can configure each column with the
|
|
following attributes. You can mix and match as many of these configuration
|
|
options as you want.
|
|
|
|
#### Sorting
|
|
|
|
Add the `sort` attribute to a column to sort the BOM by that column. The value
|
|
of the attribute should be `asc` or `desc`.
|
|
|
|
```yaml
|
|
columns:
|
|
- name: "Part Number"
|
|
part_attributes:
|
|
# - "Part Number"
|
|
- "_name"
|
|
sort: "asc"
|
|
```
|
|
|
|
If multiple columns have the `sort` attribute, the BOM will be sorted by the
|
|
columns in the order they are defined.
|
|
|
|
The default is no sorting. In that case, the order of the BOM is not specified.
|
|
|
|
#### Filtering
|
|
|
|
To filter the BOM based on a column, add a Regular Expression pattern to the
|
|
`remove_rows_matching` attribute of a column. As the name indicates, every row
|
|
where the value of the specified column matches this regex will be removed from
|
|
the BOM.
|
|
|
|
```yaml
|
|
columns:
|
|
- name: "Part Number"
|
|
part_attributes:
|
|
- "Part Number"
|
|
- "_name"
|
|
# This will remove all rows where the part number has either "TP", "MTG" or
|
|
# "FID" anywhere in it, i.e. will remove all the test points, mounting
|
|
# holes and fiducials.
|
|
remove_rows_matching: "TP|MTG|FID"
|
|
```
|
|
|
|
Since this is a regular expression, you can make fairly complex filters. You
|
|
can read more about regular expressions
|
|
[here](https://docs.python.org/3/library/re.html#regular-expression-syntax).
|
|
|
|
By default, there is no filtering.
|
|
|
|
#### Grouped Values Configuration
|
|
|
|
You can use the `grouped_values_sort`, `grouped_values_separator` and
|
|
`grouped_values_allow_duplicates` attributes to configure the grouped values of
|
|
a column. To understand these better, consider the case of a BOM which is grouped
|
|
by Part Number, and you want to have a column that lists all the Designators of
|
|
a part with the same Part Number. You want the designators to be separated by
|
|
a space, and you want them sorted in ascending order. You also want repeated
|
|
designators to appear in the list.
|
|
|
|
```yaml
|
|
columns:
|
|
- name: "Part Number"
|
|
part_attributes:
|
|
- "Part Number"
|
|
- "_name"
|
|
- name: "Designators"
|
|
part_attributes: "Designator"
|
|
grouped_values_sort: "asc"
|
|
grouped_values_separator: " "
|
|
grouped_values_allow_duplicates: true
|
|
```
|
|
|
|
By default:
|
|
|
|
- Grouped values are not sorted, and the order is not specified.
|
|
- Grouped values are separated by a comma.
|
|
- Grouped values do not allow duplicates.
|
|
|
|
#### Skip in output
|
|
|
|
If you need an attribute to just filter, sort or group by, but not show in the
|
|
BOM output, you can use the `skip_in_output` attribute.
|
|
|
|
```yaml
|
|
columns:
|
|
- name: "BOM Ignore"
|
|
part_attributes:
|
|
- "BOM_IGNORE"
|
|
remove_rows_matching: ".*"
|
|
skip_in_output: true
|
|
```
|
|
|
|
## Group By
|
|
|
|
You can also group lines by a column value. The most common is `_part_id`. You
|
|
can combine this with the columns YAML example above, like so:
|
|
|
|
```yaml
|
|
- name: Generate BOM
|
|
uses: https://hub.allspice.io/Actions/generate-bom@v0.5
|
|
with:
|
|
project_path: Archimajor.PrjPcb
|
|
columns: .allspice/columns.yml
|
|
group_by: "Part ID"
|
|
```
|
|
|
|
Which will generate a BOM squashed by components with matching Part IDs.
|
|
|
|
## Variants
|
|
|
|
To generate the BOM for a variant of the project, pass the `--variant` argument
|
|
to the script. For example:
|
|
|
|
```yaml
|
|
- name: Generate BOM
|
|
uses: https://hub.allspice.io/Actions/generate-bom@v0.5
|
|
with:
|
|
project_path: Archimajor.PrjPcb
|
|
columns: .allspice/columns.yml
|
|
output_file_name: bom-lite.csv
|
|
variant: "LITE"
|
|
```
|
|
|
|
When no variant is given, the BOM is generated without considering any variants.
|
|
|
|
## SSL
|
|
|
|
If your instance is running on a self-signed certificate, you can tell the action
|
|
to use your certificate by setting the `REQUESTS_CA_BUNDLE` environment variable.
|
|
|
|
```yaml
|
|
- name: Generate BOM
|
|
uses: https://hub.allspice.io/Actions/generate-bom@v0.5
|
|
with:
|
|
project_path: Archimajor.PrjPcb
|
|
columns: .allspice/columns.yml
|
|
output_file_name: bom.csv
|
|
variant: "LITE"
|
|
env:
|
|
REQUESTS_CA_BUNDLE: /path/to/your/certificate.cert
|
|
```
|