Added MacroFab XYRS support
- Internal BoM options: - `angle_positive` - `csv.hide_header` - `footprint_populate_values` - `footprint_type_values` - `units` mils - Columns: - `Footprint Type` - `Footprint Populate` - `Footprint X-Size` - `Footprint Y-Size`
This commit is contained in:
parent
d7430499d2
commit
5d2d0a4195
|
|
@ -24,6 +24,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
space. This helps for cases like "10K 1%".
|
space. This helps for cases like "10K 1%".
|
||||||
- `count_smd_tht` option to compute SMD/THT stats. (#113)
|
- `count_smd_tht` option to compute SMD/THT stats. (#113)
|
||||||
- option to add text to the `join` list. (#108)
|
- option to add text to the `join` list. (#108)
|
||||||
|
- two other options for the sorting criteria.
|
||||||
|
- XYRS support (you can generate position files using it)
|
||||||
|
- CSV `hide_header` option
|
||||||
- Generic filter: options to match if a field is/isn't defined.
|
- Generic filter: options to match if a field is/isn't defined.
|
||||||
- Excellon drill: added `route_mode_for_oval_holes` option.
|
- Excellon drill: added `route_mode_for_oval_holes` option.
|
||||||
- Default global `dir` option.
|
- Default global `dir` option.
|
||||||
|
|
@ -61,8 +64,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
- Added global options to define the PCB details (`pcb_material`,
|
- Added global options to define the PCB details (`pcb_material`,
|
||||||
`solder_mask_color`, `silk_screen_color` and `pcb_finish`)
|
`solder_mask_color`, `silk_screen_color` and `pcb_finish`)
|
||||||
- Report generation (for design house) (#93)
|
- Report generation (for design house) (#93)
|
||||||
- Internal BoM: two other options for the sorting criteria.
|
|
||||||
- Internal BoM: XYRS support (you can generate position files using it)
|
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- Internal BoM: now components with different Tolerance, Voltage, Current
|
- Internal BoM: now components with different Tolerance, Voltage, Current
|
||||||
|
|
|
||||||
13
README.md
13
README.md
|
|
@ -795,6 +795,7 @@ Next time you need this list just use an alias, like this:
|
||||||
- `name`: [string=''] Name to identify this source. If empty we use the name of the schematic.
|
- `name`: [string=''] Name to identify this source. If empty we use the name of the schematic.
|
||||||
- `number`: [number=1] Number of boards to build (components multiplier). Use negative to substract.
|
- `number`: [number=1] Number of boards to build (components multiplier). Use negative to substract.
|
||||||
- `ref_id`: [string=''] A prefix to add to all the references from this project.
|
- `ref_id`: [string=''] A prefix to add to all the references from this project.
|
||||||
|
- `angle_positive`: [boolean=true] Always use positive values for the footprint rotation.
|
||||||
- `bottom_negative_x`: [boolean=false] Use negative X coordinates for footprints on bottom layer (for XYRS).
|
- `bottom_negative_x`: [boolean=false] Use negative X coordinates for footprints on bottom layer (for XYRS).
|
||||||
- `columns`: [list(dict)|list(string)] List of columns to display.
|
- `columns`: [list(dict)|list(string)] List of columns to display.
|
||||||
Can be just the name of the field.
|
Can be just the name of the field.
|
||||||
|
|
@ -847,6 +848,7 @@ Next time you need this list just use an alias, like this:
|
||||||
- `count_smd_tht`: [boolean=false] Show the stats about how many of the components are SMD/THT. You must provide the PCB.
|
- `count_smd_tht`: [boolean=false] Show the stats about how many of the components are SMD/THT. You must provide the PCB.
|
||||||
- `csv`: [dict] Options for the CSV, TXT and TSV formats.
|
- `csv`: [dict] Options for the CSV, TXT and TSV formats.
|
||||||
* Valid keys:
|
* Valid keys:
|
||||||
|
- `hide_header`: [boolean=false] Hide the header line (names of the columns).
|
||||||
- `hide_pcb_info`: [boolean=false] Hide project information.
|
- `hide_pcb_info`: [boolean=false] Hide project information.
|
||||||
- `hide_stats_info`: [boolean=false] Hide statistics information.
|
- `hide_stats_info`: [boolean=false] Hide statistics information.
|
||||||
- `quote_all`: [boolean=false] Enclose all values using double quotes.
|
- `quote_all`: [boolean=false] Enclose all values using double quotes.
|
||||||
|
|
@ -859,6 +861,8 @@ Next time you need this list just use an alias, like this:
|
||||||
- `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.
|
||||||
- `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_type_values`: [string|list(string)='SMD,THT,VIRTUAL'] Values for the `Footprint Type` column.
|
||||||
- `format`: [string=''] [HTML,CSV,TXT,TSV,XML,XLSX] format for the BoM.
|
- `format`: [string=''] [HTML,CSV,TXT,TSV,XML,XLSX] format for the BoM.
|
||||||
Defaults to CSV or a guess according to the options..
|
Defaults to CSV or a guess according to the options..
|
||||||
- `group_connectors`: [boolean=true] Connectors with the same footprints will be grouped together, independent of the name of the connector.
|
- `group_connectors`: [boolean=true] Connectors with the same footprints will be grouped together, independent of the name of the connector.
|
||||||
|
|
@ -899,7 +903,7 @@ Next time you need this list just use an alias, like this:
|
||||||
- `ref_separator`: [string=' '] Separator used for the list of references.
|
- `ref_separator`: [string=' '] Separator used for the list of references.
|
||||||
- `sort_style`: [string='type_value'] [type_value,type_value_ref,ref] Sorting criteria.
|
- `sort_style`: [string='type_value'] [type_value,type_value_ref,ref] Sorting criteria.
|
||||||
- `source_by_id`: [boolean=false] Generate the `Source BoM` column using the reference ID instead of the project name.
|
- `source_by_id`: [boolean=false] Generate the `Source BoM` column using the reference ID instead of the project name.
|
||||||
- `units`: [string='millimeters'] [millimeters,inches] Units used for the positions ('Footprint X' and 'Footprint Y' columns).
|
- `units`: [string='millimeters'] [millimeters,inches,mils] Units used for the positions ('Footprint X' and 'Footprint Y' columns).
|
||||||
- `use_alt`: [boolean=false] Print grouped references in the alternate compressed style eg: R1-R7,R18.
|
- `use_alt`: [boolean=false] Print grouped references in the alternate compressed style eg: R1-R7,R18.
|
||||||
- `use_aux_axis_as_origin`: [boolean=true] Use the auxiliary axis as origin for coordinates (KiCad default) (for XYRS).
|
- `use_aux_axis_as_origin`: [boolean=true] Use the auxiliary axis as origin for coordinates (KiCad default) (for XYRS).
|
||||||
- `variant`: [string=''] Board variant, used to determine which components
|
- `variant`: [string=''] Board variant, used to determine which components
|
||||||
|
|
@ -2786,6 +2790,13 @@ The following fields contains the needed information:
|
||||||
- `Footprint Rot`
|
- `Footprint Rot`
|
||||||
- `Footprint Side`
|
- `Footprint Side`
|
||||||
|
|
||||||
|
Additionally we support:
|
||||||
|
|
||||||
|
- `Footprint Type` (SMD, THT, VIRTUAL)
|
||||||
|
- `Footprint X-Size`
|
||||||
|
- `Footprint Y-Size`
|
||||||
|
- `Footprint Populate`
|
||||||
|
|
||||||
## Credits
|
## Credits
|
||||||
|
|
||||||
- **KiBot project**: Salvador E. Tropea (@set-soft)
|
- **KiBot project**: Salvador E. Tropea (@set-soft)
|
||||||
|
|
|
||||||
|
|
@ -1391,6 +1391,13 @@ The following fields contains the needed information:
|
||||||
- `Footprint Rot`
|
- `Footprint Rot`
|
||||||
- `Footprint Side`
|
- `Footprint Side`
|
||||||
|
|
||||||
|
Additionally we support:
|
||||||
|
|
||||||
|
- `Footprint Type` (SMD, THT, VIRTUAL)
|
||||||
|
- `Footprint X-Size`
|
||||||
|
- `Footprint Y-Size`
|
||||||
|
- `Footprint Populate`
|
||||||
|
|
||||||
## Credits
|
## Credits
|
||||||
|
|
||||||
- **KiBot project**: Salvador E. Tropea (@set-soft)
|
- **KiBot project**: Salvador E. Tropea (@set-soft)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
# MacroFab compatible XYRS
|
||||||
|
# https://help.macrofab.com/knowledge/macrofab-required-design-files
|
||||||
|
kibot:
|
||||||
|
version: 1
|
||||||
|
|
||||||
|
filters:
|
||||||
|
- name: fix_rotation
|
||||||
|
comment: 'Adjust rotation for JLC'
|
||||||
|
type: rot_footprint
|
||||||
|
|
||||||
|
- name: only_smd
|
||||||
|
comment: 'Only SMD parts'
|
||||||
|
type: generic
|
||||||
|
exclude_virtual: true
|
||||||
|
exclude_tht: true
|
||||||
|
|
||||||
|
variants:
|
||||||
|
- name: rotated
|
||||||
|
comment: 'Just a place holder for the rotation filter'
|
||||||
|
type: kibom
|
||||||
|
variant: rotated
|
||||||
|
pre_transform: fix_rotation
|
||||||
|
dnf_filter: only_smd
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- name: 'position'
|
||||||
|
comment: "Pick and place file, XYRS style"
|
||||||
|
type: bom
|
||||||
|
options:
|
||||||
|
variant: rotated
|
||||||
|
output: '%f.XYRS'
|
||||||
|
units: mils
|
||||||
|
group_fields: []
|
||||||
|
sort_style: ref
|
||||||
|
use_aux_axis_as_origin: true
|
||||||
|
ignore_dnf: false
|
||||||
|
footprint_populate_values: '0,1'
|
||||||
|
footprint_type_values: '1,2,0'
|
||||||
|
csv:
|
||||||
|
separator: ' '
|
||||||
|
hide_pcb_info: true
|
||||||
|
hide_stats_info: true
|
||||||
|
hide_header: true
|
||||||
|
columns:
|
||||||
|
- field: References
|
||||||
|
name: Designator
|
||||||
|
- field: Footprint X
|
||||||
|
name: X-Loc
|
||||||
|
- field: Footprint Y
|
||||||
|
name: Y-Loc
|
||||||
|
- field: Footprint Rot
|
||||||
|
name: Rotation
|
||||||
|
- field: Footprint Side
|
||||||
|
name: Side
|
||||||
|
- field: Footprint Type
|
||||||
|
name: Type
|
||||||
|
- field: Footprint X-Size
|
||||||
|
name: X-Size
|
||||||
|
- field: Footprint Y-Size
|
||||||
|
name: Y-Size
|
||||||
|
- field: Value
|
||||||
|
- field: Footprint
|
||||||
|
- field: Footprint Populate
|
||||||
|
name: Populate
|
||||||
|
- field: MPN
|
||||||
|
|
@ -87,6 +87,8 @@ outputs:
|
||||||
number: 1
|
number: 1
|
||||||
# [string=''] A prefix to add to all the references from this project
|
# [string=''] A prefix to add to all the references from this project
|
||||||
ref_id: ''
|
ref_id: ''
|
||||||
|
# [boolean=true] Always use positive values for the footprint rotation
|
||||||
|
angle_positive: true
|
||||||
# [boolean=false] Use negative X coordinates for footprints on bottom layer (for XYRS)
|
# [boolean=false] Use negative X coordinates for footprints on bottom layer (for XYRS)
|
||||||
bottom_negative_x: false
|
bottom_negative_x: false
|
||||||
# [list(dict)|list(string)] List of columns to display.
|
# [list(dict)|list(string)] List of columns to display.
|
||||||
|
|
@ -158,6 +160,8 @@ outputs:
|
||||||
count_smd_tht: false
|
count_smd_tht: false
|
||||||
# [dict] Options for the CSV, TXT and TSV formats
|
# [dict] Options for the CSV, TXT and TSV formats
|
||||||
csv:
|
csv:
|
||||||
|
# [boolean=false] Hide the header line (names of the columns)
|
||||||
|
hide_header: false
|
||||||
# [boolean=false] Hide project information
|
# [boolean=false] Hide project information
|
||||||
hide_pcb_info: false
|
hide_pcb_info: false
|
||||||
# [boolean=false] Hide statistics information
|
# [boolean=false] Hide statistics information
|
||||||
|
|
@ -179,6 +183,10 @@ outputs:
|
||||||
exclude_filter: '_mechanical'
|
exclude_filter: '_mechanical'
|
||||||
# [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
|
||||||
|
footprint_populate_values: 'no,yes'
|
||||||
|
# [string|list(string)='SMD,THT,VIRTUAL'] Values for the `Footprint Type` column
|
||||||
|
footprint_type_values: 'SMD,THT,VIRTUAL'
|
||||||
# [string=''] [HTML,CSV,TXT,TSV,XML,XLSX] format for the BoM.
|
# [string=''] [HTML,CSV,TXT,TSV,XML,XLSX] format for the BoM.
|
||||||
# Defaults to CSV or a guess according to the options.
|
# Defaults to CSV or a guess according to the options.
|
||||||
format: 'CSV'
|
format: 'CSV'
|
||||||
|
|
@ -247,7 +255,7 @@ outputs:
|
||||||
sort_style: 'type_value'
|
sort_style: 'type_value'
|
||||||
# [boolean=false] Generate the `Source BoM` column using the reference ID instead of the project name
|
# [boolean=false] Generate the `Source BoM` column using the reference ID instead of the project name
|
||||||
source_by_id: false
|
source_by_id: false
|
||||||
# [string='millimeters'] [millimeters,inches] Units used for the positions ('Footprint X' and 'Footprint Y' columns)
|
# [string='millimeters'] [millimeters,inches,mils] Units used for the positions ('Footprint X' and 'Footprint Y' columns)
|
||||||
units: 'millimeters'
|
units: 'millimeters'
|
||||||
# [boolean=false] Print grouped references in the alternate compressed style eg: R1-R7,R18
|
# [boolean=false] Print grouped references in the alternate compressed style eg: R1-R7,R18
|
||||||
use_alt: false
|
use_alt: false
|
||||||
|
|
|
||||||
|
|
@ -303,7 +303,8 @@ class ComponentGroup(object):
|
||||||
fld=value, ref=ref))
|
fld=value, ref=ref))
|
||||||
self.fields[field] += " " + value
|
self.fields[field] += " " + value
|
||||||
|
|
||||||
def update_fields(self, conv, bottom_negative_x, x_origin, y_origin, usealt=False):
|
def update_fields(self, conv, bottom_negative_x, x_origin, y_origin, angle_positive, footprint_populate_values,
|
||||||
|
footprint_type_values, usealt=False):
|
||||||
for c in self.components:
|
for c in self.components:
|
||||||
for f, v in c.get_user_fields():
|
for f, v in c.get_user_fields():
|
||||||
self.update_field(f, v, c.ref)
|
self.update_field(f, v, c.ref)
|
||||||
|
|
@ -336,8 +337,20 @@ class ComponentGroup(object):
|
||||||
pos_x = -pos_x
|
pos_x = -pos_x
|
||||||
self.fields[ColumnList.COL_FP_X_L] = "{:.4f}".format(pos_x)
|
self.fields[ColumnList.COL_FP_X_L] = "{:.4f}".format(pos_x)
|
||||||
self.fields[ColumnList.COL_FP_Y_L] = "{:.4f}".format(-(comp.footprint_y - y_origin) * conv)
|
self.fields[ColumnList.COL_FP_Y_L] = "{:.4f}".format(-(comp.footprint_y - y_origin) * conv)
|
||||||
self.fields[ColumnList.COL_FP_ROT_L] = "{:.4f}".format(comp.footprint_rot)
|
rot = comp.footprint_rot
|
||||||
|
if angle_positive:
|
||||||
|
rot = rot % 360
|
||||||
|
self.fields[ColumnList.COL_FP_ROT_L] = "{:.4f}".format(rot)
|
||||||
self.fields[ColumnList.COL_FP_SIDE_L] = "bottom" if comp.bottom else "top"
|
self.fields[ColumnList.COL_FP_SIDE_L] = "bottom" if comp.bottom else "top"
|
||||||
|
type = 0
|
||||||
|
if comp.tht:
|
||||||
|
type = 1
|
||||||
|
if comp.virtual:
|
||||||
|
type = 2
|
||||||
|
self.fields[ColumnList.COL_FP_TYPE_L] = footprint_type_values[type]
|
||||||
|
self.fields[ColumnList.COL_FP_FIT_L] = footprint_populate_values[comp.fitted]
|
||||||
|
self.fields[ColumnList.COL_FP_XS_L] = "{:.4f}".format(comp.footprint_w * conv)
|
||||||
|
self.fields[ColumnList.COL_FP_YS_L] = "{:.4f}".format(comp.footprint_h * conv)
|
||||||
self.fields[ColumnList.COL_FP_LIB_L] = comp.footprint_lib
|
self.fields[ColumnList.COL_FP_LIB_L] = comp.footprint_lib
|
||||||
self.fields[ColumnList.COL_SHEETPATH_L] = comp.sheet_path_h
|
self.fields[ColumnList.COL_SHEETPATH_L] = comp.sheet_path_h
|
||||||
if not self.fields[ColumnList.COL_DESCRIPTION_L]:
|
if not self.fields[ColumnList.COL_DESCRIPTION_L]:
|
||||||
|
|
@ -466,7 +479,8 @@ def group_components(cfg, components):
|
||||||
# Sort the references within each group
|
# Sort the references within each group
|
||||||
g.sort_components()
|
g.sort_components()
|
||||||
# Fill the columns
|
# Fill the columns
|
||||||
g.update_fields(cfg.conv_units, cfg.bottom_negative_x, x_origin, y_origin, cfg.use_alt )
|
g.update_fields(cfg.conv_units, cfg.bottom_negative_x, x_origin, y_origin, cfg.angle_positive,
|
||||||
|
cfg.footprint_populate_values, cfg.footprint_type_values, cfg.use_alt)
|
||||||
if cfg.normalize_values:
|
if cfg.normalize_values:
|
||||||
g.fields[ColumnList.COL_VALUE_L] = normalize_value(g.components[0], decimal_point)
|
g.fields[ColumnList.COL_VALUE_L] = normalize_value(g.components[0], decimal_point)
|
||||||
# Sort the groups
|
# Sort the groups
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,14 @@ class ColumnList:
|
||||||
COL_FP_ROT_L = COL_FP_ROT.lower()
|
COL_FP_ROT_L = COL_FP_ROT.lower()
|
||||||
COL_FP_SIDE = 'Footprint Side'
|
COL_FP_SIDE = 'Footprint Side'
|
||||||
COL_FP_SIDE_L = COL_FP_SIDE.lower()
|
COL_FP_SIDE_L = COL_FP_SIDE.lower()
|
||||||
|
COL_FP_TYPE = 'Footprint Type'
|
||||||
|
COL_FP_TYPE_L = COL_FP_TYPE.lower()
|
||||||
|
COL_FP_FIT = 'Footprint Populate'
|
||||||
|
COL_FP_FIT_L = COL_FP_FIT.lower()
|
||||||
|
COL_FP_XS = 'Footprint X-Size'
|
||||||
|
COL_FP_XS_L = COL_FP_XS.lower()
|
||||||
|
COL_FP_YS = 'Footprint Y-Size'
|
||||||
|
COL_FP_YS_L = COL_FP_YS.lower()
|
||||||
COL_PART = 'Part'
|
COL_PART = 'Part'
|
||||||
COL_PART_L = COL_PART.lower()
|
COL_PART_L = COL_PART.lower()
|
||||||
COL_PART_LIB = 'Part Lib'
|
COL_PART_LIB = 'Part Lib'
|
||||||
|
|
@ -87,6 +95,18 @@ class ColumnList:
|
||||||
COL_SOURCE_BOM,
|
COL_SOURCE_BOM,
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# Not included by default
|
||||||
|
COLUMNS_EXTRA = [
|
||||||
|
COL_FP_X,
|
||||||
|
COL_FP_Y,
|
||||||
|
COL_FP_ROT,
|
||||||
|
COL_FP_SIDE,
|
||||||
|
COL_FP_TYPE,
|
||||||
|
COL_FP_FIT,
|
||||||
|
COL_FP_XS,
|
||||||
|
COL_FP_YS,
|
||||||
|
]
|
||||||
|
|
||||||
# Default columns
|
# Default columns
|
||||||
# These columns are 'immutable'
|
# These columns are 'immutable'
|
||||||
COLUMNS_PROTECTED_L = {
|
COLUMNS_PROTECTED_L = {
|
||||||
|
|
@ -104,6 +124,10 @@ class ColumnList:
|
||||||
COL_FP_Y_L,
|
COL_FP_Y_L,
|
||||||
COL_FP_ROT_L,
|
COL_FP_ROT_L,
|
||||||
COL_FP_SIDE_L,
|
COL_FP_SIDE_L,
|
||||||
|
COL_FP_TYPE_L,
|
||||||
|
COL_FP_FIT_L,
|
||||||
|
COL_FP_XS_L,
|
||||||
|
COL_FP_YS_L,
|
||||||
COL_FP_LIB_L
|
COL_FP_LIB_L
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# -*- 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
|
||||||
# Copyright (c) 2016-2020 Oliver Henry Walters (@SchrodingersGat)
|
# Copyright (c) 2016-2020 Oliver Henry Walters (@SchrodingersGat)
|
||||||
# License: MIT
|
# License: MIT
|
||||||
# Project: KiBot (formerly KiPlot)
|
# Project: KiBot (formerly KiPlot)
|
||||||
|
|
@ -89,7 +89,8 @@ def write_csv(filename, ext, groups, headings, head_names, cfg):
|
||||||
with open(filename, "wt") as f:
|
with open(filename, "wt") as f:
|
||||||
writer = csv.writer(f, delimiter=delimiter, lineterminator="\n", quoting=quoting)
|
writer = csv.writer(f, delimiter=delimiter, lineterminator="\n", quoting=quoting)
|
||||||
# Headers
|
# Headers
|
||||||
writer.writerow(head_names)
|
if not cfg.csv.hide_header:
|
||||||
|
writer.writerow(head_names)
|
||||||
# Body
|
# Body
|
||||||
for group in groups:
|
for group in groups:
|
||||||
if cfg.ignore_dnf and not group.is_fitted():
|
if cfg.ignore_dnf and not group.is_fitted():
|
||||||
|
|
|
||||||
16
kibot/gs.py
16
kibot/gs.py
|
|
@ -4,6 +4,7 @@
|
||||||
# License: GPL-3.0
|
# License: GPL-3.0
|
||||||
# Project: KiBot (formerly KiPlot)
|
# Project: KiBot (formerly KiPlot)
|
||||||
import os
|
import os
|
||||||
|
import pcbnew
|
||||||
from datetime import datetime, date
|
from datetime import datetime, date
|
||||||
from sys import exit
|
from sys import exit
|
||||||
from .misc import EXIT_BAD_ARGS, W_DATEFORMAT, KICAD_VERSION_5_99
|
from .misc import EXIT_BAD_ARGS, W_DATEFORMAT, KICAD_VERSION_5_99
|
||||||
|
|
@ -188,6 +189,21 @@ class GS(object):
|
||||||
return m.GetCenter()
|
return m.GetCenter()
|
||||||
return m.GetPosition()
|
return m.GetPosition()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_fp_size(m):
|
||||||
|
if GS.ki5():
|
||||||
|
pads = m.Pads()
|
||||||
|
r = pcbnew.EDA_RECT()
|
||||||
|
for pad in pads:
|
||||||
|
r.Merge(pad.GetBoundingBox())
|
||||||
|
rot = m.GetOrientationDegrees()
|
||||||
|
if rot == 270 or rot == 90:
|
||||||
|
return (r.GetHeight(), r.GetWidth())
|
||||||
|
return (r.GetWidth(), r.GetHeight())
|
||||||
|
# KiCad 6
|
||||||
|
r = m.GetFpPadsLocalBbox()
|
||||||
|
return (r.GetWidth(), r.GetHeight())
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def ki6():
|
def ki6():
|
||||||
return GS.kicad_version_n >= KICAD_VERSION_5_99
|
return GS.kicad_version_n >= KICAD_VERSION_5_99
|
||||||
|
|
|
||||||
|
|
@ -871,6 +871,8 @@ class SchematicComponent(object):
|
||||||
- footprint_rot: angle to rotate the part in the pick & place.
|
- footprint_rot: angle to rotate the part in the pick & place.
|
||||||
- footprint_x: x position of the part in the pick & place.
|
- footprint_x: x position of the part in the pick & place.
|
||||||
- footprint_y: y position of the part in the pick & place.
|
- footprint_y: y position of the part in the pick & place.
|
||||||
|
- footprint_w: width of the footprint (pads only).
|
||||||
|
- footprint_h: height of the footprint (pads only)
|
||||||
- qty: ammount of this part used.
|
- qty: ammount of this part used.
|
||||||
"""
|
"""
|
||||||
ref_re = re.compile(r'([^\d]+)([\?\d]+)')
|
ref_re = re.compile(r'([^\d]+)([\?\d]+)')
|
||||||
|
|
@ -892,8 +894,8 @@ class SchematicComponent(object):
|
||||||
self.fixed = False
|
self.fixed = False
|
||||||
self.bottom = False
|
self.bottom = False
|
||||||
self.footprint_rot = 0.0
|
self.footprint_rot = 0.0
|
||||||
self.footprint_x = 0
|
self.footprint_x = self.footprint_y = 0
|
||||||
self.footprint_y = 0
|
self.footprint_w = self.footprint_h = 0
|
||||||
self.qty = 1
|
self.qty = 1
|
||||||
self.annotation_error = False
|
self.annotation_error = False
|
||||||
# KiCad 5 PCB flags (mutually exclusive)
|
# KiCad 5 PCB flags (mutually exclusive)
|
||||||
|
|
|
||||||
|
|
@ -280,6 +280,7 @@ def get_board_comps_data(comps):
|
||||||
center = GS.get_center(m)
|
center = GS.get_center(m)
|
||||||
c.footprint_x = center.x
|
c.footprint_x = center.x
|
||||||
c.footprint_y = center.y
|
c.footprint_y = center.y
|
||||||
|
(c.footprint_w, c.footprint_h) = GS.get_fp_size(m)
|
||||||
attrs = m.GetAttributes()
|
attrs = m.GetAttributes()
|
||||||
if GS.ki5():
|
if GS.ki5():
|
||||||
# KiCad 5
|
# KiCad 5
|
||||||
|
|
|
||||||
|
|
@ -217,6 +217,8 @@ class BoMCSV(Optionable):
|
||||||
with document:
|
with document:
|
||||||
self.separator = ','
|
self.separator = ','
|
||||||
""" CSV Separator. TXT and TSV always use tab as delimiter """
|
""" CSV Separator. TXT and TSV always use tab as delimiter """
|
||||||
|
self.hide_header = False
|
||||||
|
""" Hide the header line (names of the columns) """
|
||||||
self.hide_pcb_info = False
|
self.hide_pcb_info = False
|
||||||
""" Hide project information """
|
""" Hide project information """
|
||||||
self.hide_stats_info = False
|
self.hide_stats_info = False
|
||||||
|
|
@ -385,22 +387,31 @@ class BoMOptions(BaseOptions):
|
||||||
self.count_smd_tht = False
|
self.count_smd_tht = False
|
||||||
""" Show the stats about how many of the components are SMD/THT. You must provide the PCB """
|
""" Show the stats about how many of the components are SMD/THT. You must provide the PCB """
|
||||||
self.units = 'millimeters'
|
self.units = 'millimeters'
|
||||||
""" [millimeters,inches] Units used for the positions ('Footprint X' and 'Footprint Y' columns) """
|
""" [millimeters,inches,mils] Units used for the positions ('Footprint X' and 'Footprint Y' columns) """
|
||||||
self.bottom_negative_x = False
|
self.bottom_negative_x = False
|
||||||
""" Use negative X coordinates for footprints on bottom layer (for XYRS) """
|
""" Use negative X coordinates for footprints on bottom layer (for XYRS) """
|
||||||
self.use_aux_axis_as_origin = True
|
self.use_aux_axis_as_origin = True
|
||||||
""" Use the auxiliary axis as origin for coordinates (KiCad default) (for XYRS) """
|
""" Use the auxiliary axis as origin for coordinates (KiCad default) (for XYRS) """
|
||||||
|
self.angle_positive = True
|
||||||
|
""" Always use positive values for the footprint rotation """
|
||||||
self.sort_style = 'type_value'
|
self.sort_style = 'type_value'
|
||||||
""" [type_value,type_value_ref,ref] Sorting criteria """
|
""" [type_value,type_value_ref,ref] Sorting criteria """
|
||||||
|
self.footprint_populate_values = Optionable
|
||||||
|
""" [string|list(string)='no,yes'] Values for the `Footprint Populate` column """
|
||||||
|
self.footprint_type_values = Optionable
|
||||||
|
""" [string|list(string)='SMD,THT,VIRTUAL'] Values for the `Footprint Type` column """
|
||||||
self._format_example = 'CSV'
|
self._format_example = 'CSV'
|
||||||
|
self._footprint_populate_values_example = 'no,yes'
|
||||||
|
self._footprint_type_values_example = 'SMD,THT,VIRTUAL'
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _get_columns():
|
def _get_columns():
|
||||||
""" Create a list of valid columns """
|
""" Create a list of valid columns """
|
||||||
|
cols = ColumnList.COLUMNS_DEFAULT + ColumnList.COLUMNS_EXTRA
|
||||||
if GS.sch:
|
if GS.sch:
|
||||||
return GS.sch.get_field_names(ColumnList.COLUMNS_DEFAULT)
|
return GS.sch.get_field_names(cols)
|
||||||
return ColumnList.COLUMNS_DEFAULT
|
return cols
|
||||||
|
|
||||||
def _guess_format(self):
|
def _guess_format(self):
|
||||||
""" Figure out the format """
|
""" Figure out the format """
|
||||||
|
|
@ -556,6 +567,19 @@ class BoMOptions(BaseOptions):
|
||||||
# List of distributors
|
# List of distributors
|
||||||
self.distributors = Optionable.force_list(self.distributors)
|
self.distributors = Optionable.force_list(self.distributors)
|
||||||
self.no_distributors = Optionable.force_list(self.no_distributors)
|
self.no_distributors = Optionable.force_list(self.no_distributors)
|
||||||
|
# Column values
|
||||||
|
self.footprint_populate_values = Optionable.force_list(self.footprint_populate_values)
|
||||||
|
if not self.footprint_populate_values:
|
||||||
|
self.footprint_populate_values = ['no', 'yes']
|
||||||
|
if len(self.footprint_populate_values) != 2:
|
||||||
|
raise KiPlotConfigurationError("The `footprint_populate_values` must contain two values ({})".
|
||||||
|
format(self.footprint_populate_values))
|
||||||
|
self.footprint_type_values = Optionable.force_list(self.footprint_type_values)
|
||||||
|
if not self.footprint_type_values:
|
||||||
|
self.footprint_type_values = ['SMD', 'THT', 'VIRTUAL']
|
||||||
|
if len(self.footprint_type_values) != 3:
|
||||||
|
raise KiPlotConfigurationError("The `footprint_type_values` must contain three values ({})".
|
||||||
|
format(self.footprint_type_values))
|
||||||
# Columns
|
# Columns
|
||||||
valid_columns = self._get_columns()
|
valid_columns = self._get_columns()
|
||||||
(self.columns, self.column_levels, self.column_comments, self.column_rename,
|
(self.columns, self.column_levels, self.column_comments, self.column_rename,
|
||||||
|
|
@ -588,7 +612,12 @@ class BoMOptions(BaseOptions):
|
||||||
self.revision = GS.sch_rev
|
self.revision = GS.sch_rev
|
||||||
self.debug_level = GS.debug_level
|
self.debug_level = GS.debug_level
|
||||||
self.kicad_version = GS.kicad_version
|
self.kicad_version = GS.kicad_version
|
||||||
self.conv_units = 1.0/IU_PER_MM if self.units == 'millimeters' else 0.001/IU_PER_MILS
|
if self.units == 'millimeters':
|
||||||
|
self.conv_units = 1.0/IU_PER_MM
|
||||||
|
elif self.units == 'mils':
|
||||||
|
self.conv_units = 1.0/IU_PER_MILS
|
||||||
|
else: # Inches
|
||||||
|
self.conv_units = 0.001/IU_PER_MILS
|
||||||
# Get the components list from the schematic
|
# Get the components list from the schematic
|
||||||
comps = GS.sch.get_components()
|
comps = GS.sch.get_components()
|
||||||
get_board_comps_data(comps)
|
get_board_comps_data(comps)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
C1 362.2047 1265.7480 270.0000 top 1 61.4173 25.1969 1uF R_0402_1005Metric 1 CL05A105KA5NQNC
|
||||||
|
C2 401.5748 1265.7480 270.0000 top 1 61.4173 25.1969 0.1uF R_0402_1005Metric 1 CL05B104KO5NNNC
|
||||||
|
C3 614.2520 1406.7520 270.0000 top 1 96.4567 37.4016 4.7uF R_0603_1608Metric 1 CL10A475KO8NNNC
|
||||||
|
C4 653.5433 814.9606 270.0000 top 1 96.4567 37.4016 1uF R_0603_1608Metric 1 CL10A105KB8NNNC
|
||||||
|
C5 614.1732 1208.6614 180.0000 top 1 96.4567 37.4016 22uF R_0603_1608Metric 1 CL10A226MQ8NRNC
|
||||||
|
C6 374.2520 1575.7480 270.0000 top 1 61.4173 25.1969 4.7uF R_0402_1005Metric 1 CL05A475MP5NRNC
|
||||||
|
C7 774.2520 1545.7480 90.0000 top 1 61.4173 25.1969 10uF R_0402_1005Metric 1 CL05A106MQ5NUNC
|
||||||
|
C8 824.2520 1545.7480 90.0000 top 1 61.4173 25.1969 0.1uF R_0402_1005Metric 1 CL05B104KO5NNNC
|
||||||
|
D1 523.6220 826.7717 180.0000 top 1 165.3543 47.2441 D_Schottky D_SOD-123 1 B5819W SL
|
||||||
|
D2 291.3386 1307.0866 90.0000 top 1 165.3543 47.2441 D_Schottky D_SOD-123 1 B5819W SL
|
||||||
|
D3 661.4173 516.3780 270.0000 top 1 165.3543 47.2441 D_Schottky D_SOD-123 1 B5819W SL
|
||||||
|
D4 1161.4173 476.3780 270.0000 top 1 165.3543 47.2441 D_Schottky D_SOD-123 1 B5819W SL
|
||||||
|
D5 1704.2520 555.7480 270.0000 top 1 165.3543 47.2441 D_Schottky D_SOD-123 1 B5819W SL
|
||||||
|
D6 1862.2047 889.7638 0.0000 top 1 165.3543 47.2441 D_Schottky D_SOD-123 1 B5819W SL
|
||||||
|
D7 913.3858 516.3780 270.0000 top 1 165.3543 47.2441 D_Schottky D_SOD-123 1 B5819W SL
|
||||||
|
D8 1452.7559 472.4409 270.0000 top 1 165.3543 47.2441 D_Schottky D_SOD-123 1 B5819W SL
|
||||||
|
D9 1858.2677 649.6063 0.0000 top 1 165.3543 47.2441 D_Schottky D_SOD-123 1 B5819W SL
|
||||||
|
D10 1858.2677 1129.9213 0.0000 top 1 165.3543 47.2441 D_Schottky D_SOD-123 1 B5819W SL
|
||||||
|
D11 1885.8268 1503.9370 0.0000 top 1 96.4567 37.4016 Green LED_0603_1608Metric 1 19-217/GHC-YR1S2/3T
|
||||||
|
D12 2015.7480 1503.9370 0.0000 top 1 96.4567 37.4016 Green LED_0603_1608Metric 1 19-217/GHC-YR1S2/3T
|
||||||
|
D13 2145.6693 1503.9370 0.0000 top 1 96.4567 37.4016 Red LED_0603_1608Metric 1
|
||||||
|
D14 2271.6535 1503.9370 0.0000 top 1 96.4567 37.4016 Red LED_0603_1608Metric 1
|
||||||
|
J1 275.5906 1125.9843 270.0000 top 2 232.2835 94.4882 Screw_Terminal_01x02 TerminalBlock_Phoenix_PT-1,5-2-3.5-H_1x02_P3.50mm_Horizontal 0
|
||||||
|
J2 134.2520 1415.7480 270.0000 top 1 322.8346 172.2441 USB_B_Micro USB_Micro-B_Molex-105017-0001 1
|
||||||
|
J3 578.7402 236.2205 0.0000 top 2 232.2835 94.4882 Screw_Terminal_01x02 TerminalBlock_Phoenix_PT-1,5-2-3.5-H_1x02_P3.50mm_Horizontal 0
|
||||||
|
J4 1219.6063 236.2205 0.0000 top 2 232.2835 94.4882 Screw_Terminal_01x02 TerminalBlock_Phoenix_PT-1,5-2-3.5-H_1x02_P3.50mm_Horizontal 0
|
||||||
|
J5 1864.1732 236.2205 0.0000 top 2 232.2835 94.4882 Screw_Terminal_01x02 TerminalBlock_Phoenix_PT-1,5-2-3.5-H_1x02_P3.50mm_Horizontal 0
|
||||||
|
J6 2104.2520 822.8346 90.0000 top 2 232.2835 94.4882 Screw_Terminal_01x02 TerminalBlock_Phoenix_PT-1,5-2-3.5-H_1x02_P3.50mm_Horizontal 0
|
||||||
|
J7 899.6063 236.2205 0.0000 top 2 232.2835 94.4882 Screw_Terminal_01x02 TerminalBlock_Phoenix_PT-1,5-2-3.5-H_1x02_P3.50mm_Horizontal 0
|
||||||
|
J8 1541.3386 236.2205 0.0000 top 2 232.2835 94.4882 Screw_Terminal_01x02 TerminalBlock_Phoenix_PT-1,5-2-3.5-H_1x02_P3.50mm_Horizontal 0
|
||||||
|
J9 2104.2520 492.1260 90.0000 top 2 232.2835 94.4882 Screw_Terminal_01x02 TerminalBlock_Phoenix_PT-1,5-2-3.5-H_1x02_P3.50mm_Horizontal 0
|
||||||
|
J10 2104.2520 1149.6063 90.0000 top 2 232.2835 94.4882 Screw_Terminal_01x02 TerminalBlock_Phoenix_PT-1,5-2-3.5-H_1x02_P3.50mm_Horizontal 0
|
||||||
|
J11 275.5906 807.0866 270.0000 top 2 232.2835 94.4882 Screw_Terminal_01x02 TerminalBlock_Phoenix_PT-1,5-2-3.5-H_1x02_P3.50mm_Horizontal 0
|
||||||
|
J12 354.3307 415.3543 180.0000 top 2 263.7795 76.7717 Conn_01x03 JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical 0
|
||||||
|
Q1 754.2520 1415.7480 180.0000 top 1 114.1732 106.2992 Q_NPN_BEC SOT-23 1 SS8050
|
||||||
|
Q2 754.2520 1265.7480 180.0000 top 1 114.1732 106.2992 Q_NPN_BEC SOT-23 1 SS8050
|
||||||
|
Q3 779.5276 495.7480 90.0000 top 1 114.1732 106.2992 Q_NMOS_GSD SOT-23 1 AO3400A
|
||||||
|
Q4 1283.4646 452.7559 90.0000 top 1 114.1732 106.2992 Q_NMOS_GDS SOT-23 1 AO3400A
|
||||||
|
Q5 1834.2520 475.7480 90.0000 top 1 114.1732 106.2992 Q_NMOS_GDS SOT-23 1 AO3400A
|
||||||
|
Q6 1881.8898 1007.8740 180.0000 top 1 114.1732 106.2992 Q_NMOS_GDS SOT-23 1 AO3400A
|
||||||
|
Q7 1031.4961 445.7480 90.0000 top 1 114.1732 106.2992 Q_NMOS_GDS SOT-23 1 AO3400A
|
||||||
|
Q8 1570.8661 485.7480 90.0000 top 1 114.1732 106.2992 Q_NMOS_GDS SOT-23 1 AO3400A
|
||||||
|
Q9 1881.8898 767.7165 180.0000 top 1 114.1732 106.2992 Q_NMOS_GDS SOT-23 1 AO3400A
|
||||||
|
Q10 1881.8898 1248.0315 180.0000 top 1 114.1732 106.2992 Q_NMOS_GDS SOT-23 1 AO3400A
|
||||||
|
R1 614.2520 1565.7480 180.0000 top 1 61.4173 25.1969 10kR R_0402_1005Metric 1 0402WGF1002TCE
|
||||||
|
R2 614.2520 1515.7480 180.0000 top 1 61.4173 25.1969 10kR R_0402_1005Metric 1 0402WGF1002TCE
|
||||||
|
R3 324.2520 1575.7480 270.0000 top 1 61.4173 25.1969 10kR R_0402_1005Metric 1 0402WGF1002TCE
|
||||||
|
R4 814.2520 605.7480 90.0000 top 1 61.4173 25.1969 100R R_0402_1005Metric 1 0402WGF1000TCE
|
||||||
|
R5 1267.7165 543.3071 0.0000 top 1 61.4173 25.1969 100R R_0402_1005Metric 1 0402WGF1000TCE
|
||||||
|
R6 1704.7244 673.2283 180.0000 top 1 61.4173 25.1969 100R R_0402_1005Metric 1 0402WGF1000TCE
|
||||||
|
R7 1787.4016 979.7244 90.0000 top 1 61.4173 25.1969 100R R_0402_1005Metric 1 0402WGF1000TCE
|
||||||
|
R8 1074.2520 540.7480 180.0000 top 1 61.4173 25.1969 100R R_0402_1005Metric 1 0402WGF1000TCE
|
||||||
|
R9 1540.8661 596.3780 0.0000 top 1 61.4173 25.1969 100R R_0402_1005Metric 1 0402WGF1000TCE
|
||||||
|
R10 1789.2520 765.7480 270.0000 top 1 61.4173 25.1969 100R R_0402_1005Metric 1 0402WGF1000TCE
|
||||||
|
R11 1784.2520 1224.4094 270.0000 top 1 61.4173 25.1969 100R R_0402_1005Metric 1 0402WGF1000TCE
|
||||||
|
R12 1897.6378 1444.8819 0.0000 top 1 61.4173 25.1969 47R R_0402_1005Metric 1 19-217/GHC-YR1S2/3T
|
||||||
|
R13 2007.8740 1444.8819 0.0000 top 1 61.4173 25.1969 47R R_0402_1005Metric 1 0402WGF470JTCE
|
||||||
|
R14 2122.0472 1444.8819 0.0000 top 1 61.4173 25.1969 150R R_0402_1005Metric 1 0402WGF1500TCE
|
||||||
|
R15 2244.0945 1444.8819 0.0000 top 1 61.4173 25.1969 150R R_0402_1005Metric 1 0402WGF1500TCE
|
||||||
|
R16 952.7559 724.4094 180.0000 top 1 61.4173 25.1969 10kR R_0402_1005Metric 1 0402WGF1002TCE
|
||||||
|
R17 754.2520 615.7480 0.0000 top 1 61.4173 25.1969 10kR R_0402_1005Metric 1 0402WGF1002TCE
|
||||||
|
R18 1349.2520 545.7480 180.0000 top 1 61.4173 25.1969 10kR R_0402_1005Metric 1 0402WGF1002TCE
|
||||||
|
R19 1669.2520 730.7480 0.0000 top 1 61.4173 25.1969 10kR R_0402_1005Metric 1 0402WGF1002TCE
|
||||||
|
R20 1729.2520 965.7480 90.0000 top 1 61.4173 25.1969 10kR R_0402_1005Metric 1 0402WGF1002TCE
|
||||||
|
R21 999.2520 540.7480 0.0000 top 1 61.4173 25.1969 10kR R_0402_1005Metric 1 0402WGF1002TCE
|
||||||
|
R22 1604.2520 595.7480 270.0000 top 1 61.4173 25.1969 10kR R_0402_1005Metric 1 0402WGF1002TCE
|
||||||
|
R23 1669.2520 785.7480 0.0000 top 1 61.4173 25.1969 10kR R_0402_1005Metric 1 0402WGF1002TCE
|
||||||
|
R24 1784.2520 1304.8425 270.0000 top 1 61.4173 25.1969 10kR R_0402_1005Metric 1 0402WGF1002TCE
|
||||||
|
SW1 472.4409 1725.7480 0.0000 top 1 275.5906 177.1654 SW_Push TS-1187A 1 TS-1187A-C-D-B
|
||||||
|
U1 602.3622 1031.4961 180.0000 top 1 326.7717 240.1575 AZ1117-3.3 SOT-223-3_TabPin2 1 AZ1117CH-3.3TRG1
|
||||||
|
U2 468.6614 1415.7480 270.0000 top 1 185.0394 185.0394 CP2104 QFN-24-1EP_4x4mm_P0.5mm_EP2.6x2.6mm 1 CP2104-F03-GMR
|
||||||
|
U3 1274.2520 1245.7480 0.0000 top 1 748.0315 746.4567 ESP32-WROOM-32 ESP32-WROOM-32 1
|
||||||
|
U4 1098.4252 704.7244 90.0000 top 2 59.0551 359.0551 DHT11 Aosong_DHT11_5.5x12.0_P2.54mm 0
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
../5_1_6/light_control.XYRS
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
../5_1_6/light_control.XYRS
|
||||||
|
|
@ -1,62 +0,0 @@
|
||||||
Designator,Val,Package,Mid X,Mid Y,Rotation,Layer
|
|
||||||
C1,1uF,R_0402_1005Metric,111.2000,-69.8500,-90.0000,top
|
|
||||||
C2,0.1uF,R_0402_1005Metric,112.2000,-69.8500,-90.0000,top
|
|
||||||
C3,4.7uF,R_0603_1608Metric,117.6020,-66.2685,-90.0000,top
|
|
||||||
C4,1uF,R_0603_1608Metric,118.6000,-81.3000,-90.0000,top
|
|
||||||
C5,22uF,R_0603_1608Metric,117.6000,-71.3000,180.0000,top
|
|
||||||
C6,4.7uF,R_0402_1005Metric,111.5060,-61.9760,-90.0000,top
|
|
||||||
C7,10uF,R_0402_1005Metric,121.6660,-62.7380,90.0000,top
|
|
||||||
C8,0.1uF,R_0402_1005Metric,122.9360,-62.7380,90.0000,top
|
|
||||||
D1,D_Schottky,D_SOD-123,115.3000,-81.0000,180.0000,top
|
|
||||||
D2,D_Schottky,D_SOD-123,109.4000,-68.8000,90.0000,top
|
|
||||||
D3,D_Schottky,D_SOD-123,118.8000,-88.8840,-90.0000,top
|
|
||||||
D4,D_Schottky,D_SOD-123,131.5000,-89.9000,-90.0000,top
|
|
||||||
D5,D_Schottky,D_SOD-123,145.2880,-87.8840,-90.0000,top
|
|
||||||
D6,D_Schottky,D_SOD-123,149.3000,-79.4000,0.0000,top
|
|
||||||
D7,D_Schottky,D_SOD-123,125.2000,-88.8840,-90.0000,top
|
|
||||||
D8,D_Schottky,D_SOD-123,138.9000,-90.0000,-90.0000,top
|
|
||||||
D9,D_Schottky,D_SOD-123,149.2000,-85.5000,0.0000,top
|
|
||||||
D10,D_Schottky,D_SOD-123,149.2000,-73.3000,0.0000,top
|
|
||||||
D11,Green,LED_0603_1608Metric,149.9000,-63.8000,0.0000,top
|
|
||||||
D12,Green,LED_0603_1608Metric,153.2000,-63.8000,0.0000,top
|
|
||||||
D13,Red,LED_0603_1608Metric,156.5000,-63.8000,0.0000,top
|
|
||||||
D14,Red,LED_0603_1608Metric,159.7000,-63.8000,0.0000,top
|
|
||||||
J2,USB_B_Micro,USB_Micro-B_Molex-105017-0001,105.4100,-66.0400,-90.0000,top
|
|
||||||
Q1,Q_NPN_BEC,SOT-23,121.1580,-66.0400,180.0000,top
|
|
||||||
Q2,Q_NPN_BEC,SOT-23,121.1580,-69.8500,180.0000,top
|
|
||||||
Q3,Q_NMOS_GSD,SOT-23,121.8000,-89.4080,90.0000,top
|
|
||||||
Q4,Q_NMOS_GDS,SOT-23,134.6000,-90.5000,90.0000,top
|
|
||||||
Q5,Q_NMOS_GDS,SOT-23,148.5900,-89.9160,90.0000,top
|
|
||||||
Q6,Q_NMOS_GDS,SOT-23,149.8000,-76.4000,180.0000,top
|
|
||||||
Q7,Q_NMOS_GDS,SOT-23,128.2000,-90.6780,90.0000,top
|
|
||||||
Q8,Q_NMOS_GDS,SOT-23,141.9000,-89.6620,90.0000,top
|
|
||||||
Q9,Q_NMOS_GDS,SOT-23,149.8000,-82.5000,180.0000,top
|
|
||||||
Q10,Q_NMOS_GDS,SOT-23,149.8000,-70.3000,180.0000,top
|
|
||||||
R1,10kR,R_0402_1005Metric,117.6020,-62.2300,180.0000,top
|
|
||||||
R2,10kR,R_0402_1005Metric,117.6020,-63.5000,180.0000,top
|
|
||||||
R3,10kR,R_0402_1005Metric,110.2360,-61.9760,-90.0000,top
|
|
||||||
R4,100R,R_0402_1005Metric,122.6820,-86.6140,90.0000,top
|
|
||||||
R5,100R,R_0402_1005Metric,134.2000,-88.2000,0.0000,top
|
|
||||||
R6,100R,R_0402_1005Metric,145.3000,-84.9000,180.0000,top
|
|
||||||
R7,100R,R_0402_1005Metric,147.4000,-77.1150,90.0000,top
|
|
||||||
R8,100R,R_0402_1005Metric,129.2860,-88.2650,180.0000,top
|
|
||||||
R9,100R,R_0402_1005Metric,141.1380,-86.8520,0.0000,top
|
|
||||||
R10,100R,R_0402_1005Metric,147.4470,-82.5500,-90.0000,top
|
|
||||||
R11,100R,R_0402_1005Metric,147.3200,-70.9000,-90.0000,top
|
|
||||||
R12,47R,R_0402_1005Metric,150.2000,-65.3000,0.0000,top
|
|
||||||
R13,47R,R_0402_1005Metric,153.0000,-65.3000,0.0000,top
|
|
||||||
R14,150R,R_0402_1005Metric,155.9000,-65.3000,0.0000,top
|
|
||||||
R15,150R,R_0402_1005Metric,159.0000,-65.3000,0.0000,top
|
|
||||||
R16,10kR,R_0402_1005Metric,126.2000,-83.6000,180.0000,top
|
|
||||||
R17,10kR,R_0402_1005Metric,121.1580,-86.3600,0.0000,top
|
|
||||||
R18,10kR,R_0402_1005Metric,136.2710,-88.1380,180.0000,top
|
|
||||||
R19,10kR,R_0402_1005Metric,144.3990,-83.4390,0.0000,top
|
|
||||||
R20,10kR,R_0402_1005Metric,145.9230,-77.4700,90.0000,top
|
|
||||||
R21,10kR,R_0402_1005Metric,127.3810,-88.2650,0.0000,top
|
|
||||||
R22,10kR,R_0402_1005Metric,142.7480,-86.8680,-90.0000,top
|
|
||||||
R23,10kR,R_0402_1005Metric,144.3990,-82.0420,0.0000,top
|
|
||||||
R24,10kR,R_0402_1005Metric,147.3200,-68.8570,-90.0000,top
|
|
||||||
SW1,SW_Push,TS-1187A,114.0000,-58.1660,0.0000,top
|
|
||||||
U1,AZ1117-3.3,SOT-223-3_TabPin2,117.3000,-75.8000,180.0000,top
|
|
||||||
U2,CP2104,QFN-24-1EP_4x4mm_P0.5mm_EP2.6x2.6mm,113.9040,-66.0400,270.0000,top
|
|
||||||
U3,ESP32-WROOM-32,ESP32-WROOM-32,134.3660,-70.3580,0.0000,top
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
../5_1_6/light_control_cpl_jlc_nc.csv
|
||||||
|
|
|
@ -250,6 +250,7 @@ def test_position_rot_4(test_dir):
|
||||||
|
|
||||||
|
|
||||||
def test_position_rot_5(test_dir):
|
def test_position_rot_5(test_dir):
|
||||||
|
""" Generate a JLC compatible position file using the Internal BoM """
|
||||||
prj = 'light_control'
|
prj = 'light_control'
|
||||||
ctx = context.TestContext(test_dir, 'test_position_rot_5', prj, 'simple_position_rot_5', POS_DIR)
|
ctx = context.TestContext(test_dir, 'test_position_rot_5', prj, 'simple_position_rot_5', POS_DIR)
|
||||||
ctx.run()
|
ctx.run()
|
||||||
|
|
@ -259,6 +260,17 @@ def test_position_rot_5(test_dir):
|
||||||
ctx.clean_up(keep_project=True)
|
ctx.clean_up(keep_project=True)
|
||||||
|
|
||||||
|
|
||||||
|
def test_position_rot_6(test_dir):
|
||||||
|
""" Generate a MacroFab XYRS compatible position file using the Internal BoM """
|
||||||
|
prj = 'light_control'
|
||||||
|
ctx = context.TestContext(test_dir, 'test_position_rot_6', prj, 'simple_position_rot_6', POS_DIR)
|
||||||
|
ctx.run()
|
||||||
|
output = prj+'.XYRS'
|
||||||
|
ctx.expect_out_file(output)
|
||||||
|
ctx.compare_txt(output)
|
||||||
|
ctx.clean_up(keep_project=True)
|
||||||
|
|
||||||
|
|
||||||
def test_rot_bottom(test_dir):
|
def test_rot_bottom(test_dir):
|
||||||
ctx = context.TestContext(test_dir, 'test_rot_bottom', 'comp_bottom', 'simple_position_rot_bottom', POS_DIR)
|
ctx = context.TestContext(test_dir, 'test_rot_bottom', 'comp_bottom', 'simple_position_rot_bottom', POS_DIR)
|
||||||
ctx.run()
|
ctx.run()
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
# MacroFab compatible XYRS
|
||||||
|
kibot:
|
||||||
|
version: 1
|
||||||
|
|
||||||
|
filters:
|
||||||
|
- name: fix_rotation
|
||||||
|
comment: 'Adjust rotation for JLC'
|
||||||
|
type: rot_footprint
|
||||||
|
|
||||||
|
- name: only_smd
|
||||||
|
comment: 'Only SMD parts'
|
||||||
|
type: generic
|
||||||
|
exclude_virtual: true
|
||||||
|
exclude_tht: true
|
||||||
|
|
||||||
|
variants:
|
||||||
|
- name: rotated
|
||||||
|
comment: 'Just a place holder for the rotation filter'
|
||||||
|
type: kibom
|
||||||
|
variant: rotated
|
||||||
|
pre_transform: fix_rotation
|
||||||
|
dnf_filter: only_smd
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- name: 'position'
|
||||||
|
comment: "Pick and place file, XYRS style"
|
||||||
|
type: bom
|
||||||
|
options:
|
||||||
|
variant: rotated
|
||||||
|
output: '%f.XYRS'
|
||||||
|
units: mils
|
||||||
|
group_fields: []
|
||||||
|
sort_style: ref
|
||||||
|
use_aux_axis_as_origin: true
|
||||||
|
ignore_dnf: false
|
||||||
|
footprint_populate_values: '0,1'
|
||||||
|
footprint_type_values: '1,2,0'
|
||||||
|
csv:
|
||||||
|
separator: ' '
|
||||||
|
hide_pcb_info: true
|
||||||
|
hide_stats_info: true
|
||||||
|
hide_header: true
|
||||||
|
columns:
|
||||||
|
- field: References
|
||||||
|
name: Designator
|
||||||
|
- field: Footprint X
|
||||||
|
name: X-Loc
|
||||||
|
- field: Footprint Y
|
||||||
|
name: Y-Loc
|
||||||
|
- field: Footprint Rot
|
||||||
|
name: Rotation
|
||||||
|
- field: Footprint Side
|
||||||
|
name: Side
|
||||||
|
- field: Footprint Type
|
||||||
|
name: Type
|
||||||
|
- field: Footprint X-Size
|
||||||
|
name: X-Size
|
||||||
|
- field: Footprint Y-Size
|
||||||
|
name: Y-Size
|
||||||
|
- field: Value
|
||||||
|
- field: Footprint
|
||||||
|
- field: Footprint Populate
|
||||||
|
name: Populate
|
||||||
|
- field: MPN
|
||||||
Loading…
Reference in New Issue