.. index::
pair: notes; position files
pair: notes; pick and place
pair: position; rotate
Notes about the position file
-----------------------------
Position files are quite simple. You can generate them as plain text
(ASCII) or as a spreadsheet (CSV).
But some conventions can make them tricky. Some manufacturers, like
`JLCPCB `__, uses conventions that are incompatible
with KiCad.
The `following
blog `__
explains how to adapt the position files generated by KiCad to what
JLCPCB needs. To achieve it the author uses a script called
`JLCKicadTools `__.
You can achieve the same using KiBot. Here is a configuration example
that generates the BoM and position files in the same way JLCKicadTools
does:
.. code:: yaml
kibot:
version: 1
filters:
- name: only_jlc_parts
comment: 'Only parts with JLC code'
type: generic
include_only:
- column: 'LCSC#'
regex: '^C\d+'
variants:
- name: rotated
comment: 'Just a place holder for the rotation filter'
type: kibom
variant: rotated
pre_transform: _rot_footprint
outputs:
- name: 'position'
comment: "Pick and place file, JLC style"
type: position
options:
variant: rotated
output: '%f_cpl_jlc.%x'
format: CSV
units: millimeters
separate_files_for_front_and_back: false
only_smd: true
columns:
- id: Ref
name: Designator
- Val
- Package
- id: PosX
name: "Mid X"
- id: PosY
name: "Mid Y"
- id: Rot
name: Rotation
- id: Side
name: Layer
- name: 'bom'
comment: "BoM for JLC"
type: bom
options:
output: '%f_%i_jlc.%x'
exclude_filter: 'only_jlc_parts'
ref_separator: ','
columns:
- field: Value
name: Comment
- field: References
name: Designator
- Footprint
- field: 'LCSC#'
name: 'LCSC Part #'
csv:
hide_pcb_info: true
hide_stats_info: true
quote_all: true
The ``only_jlc_parts`` filter is used to generate the BoM and assumes
you put the JLC component code in a field named ``LCSC#`` (JLC uses
`LCSC `__ as supplier). Note that the author of the
blog simply used ``Field4`` for this and his script searches for any
field containing the ``^C\d+`` pattern. I think this isn’t a good idea
and I suggest using a defined name, like in this example.
The ``rotated`` variant is used only to apply the ``_rot_footprint``
transformation filter. This filter is an internal filter of type
``rot_footprint``. Here is the same configuration file making explicit
use of the rotation filter:
.. code:: yaml
kibot:
version: 1
filters:
- name: fix_rotation
comment: 'Adjust rotation for JLC'
type: rot_footprint
- name: only_jlc_parts
comment: 'Only parts with JLC code'
type: generic
include_only:
- column: 'LCSC#'
regex: '^C\d+'
variants:
- name: rotated
comment: 'Just a place holder for the rotation filter'
type: kibom
variant: rotated
pre_transform: fix_rotation
outputs:
- name: 'position'
comment: "Pick and place file, JLC style"
type: position
options:
variant: rotated
output: '%f_cpl_jlc.%x'
format: CSV
units: millimeters
separate_files_for_front_and_back: false
only_smd: true
columns:
- id: Ref
name: Designator
- Val
- Package
- id: PosX
name: "Mid X"
- id: PosY
name: "Mid Y"
- id: Rot
name: Rotation
- id: Side
name: Layer
- name: 'bom'
comment: "BoM for JLC"
type: bom
options:
output: '%f_%i_jlc.%x'
exclude_filter: 'only_jlc_parts'
ref_separator: ','
columns:
- field: Value
name: Comment
- field: References
name: Designator
- Footprint
- field: 'LCSC#'
name: 'LCSC Part #'
csv:
hide_pcb_info: true
hide_stats_info: true
quote_all: true
As you can see we now create a filter named ``fix_rotation`` of type
``rot_footprint``:
.. code:: yaml
- name: fix_rotation
comment: 'Adjust rotation for JLC'
type: rot_footprint
Using it, instead of the internal filter named ``_rot_footprint``, is
the same here. But you can then customize the filter.
The filter supports the following options:
- ``extend``: [boolean=true] Extends the internal list of rotations
with the one provided. Otherwise just use the provided list.
- ``negative_bottom``: [boolean=true] Rotation for bottom components is
computed via subtraction as ``(component rot - angle)``. Note that
this should be coherent with the ``bottom_negative_x`` of the
position output.
- ``invert_bottom``: [boolean=false] Rotation for bottom components is
negated, resulting in either: ``(- component rot - angle)`` or when
combined with ``negative_bottom``, ``(angle - component rot)``.
- ``rotations``: [list(list(string))] A list of pairs regular
expression/rotation. Components matching the regular expression will
be rotated the indicated angle. Special names ``_top`` and
``_bottom`` will match all components on that side of the board.
In order to add a new rotation or just change an existing one you just
need to use the ``rotations`` option. As an example: the internal list
of rotations rotates QFN packages by 270 degrees, no suppose you want to
rotate them just 90 degrees. The filter will look like this:
.. code:: yaml
- name: fix_rotation
comment: 'Adjust rotation for JLC'
type: rot_footprint
rotations:
- ["^QFN-", 90.0]
This regular expression will match any footprint starting with ``QFN-``
and rotate it 90 degrees.
The internal list of rotations is:
====================================================== ========
Footprint Rotation
====================================================== ========
``^Bosch_LGA-8_2x2.5mm_P0.65mm_ClockwisePinNumbering`` 90.0
``^R_Array_Convex_`` 90.0
``^R_Array_Concave_`` 90.0
``^SOT-223`` 180.0
``^SOT-23`` 180.0
``^TSOT-23`` 180.0
``^SOT-353`` 180.0
``^QFN-`` 270.0
``^LQFP-`` 270.0
``^TQFP-`` 270.0
``^SOP-(?!18_)`` 270.0
``^TSSOP-`` 270.0
``^DFN-`` 270.0
``^SOIC-`` 270.0
``^VSSOP-10_`` 270.0
``^CP_EIA-3216-18_`` 180.0
``^CP_EIA-3528-15_AVX-H`` 180.0
``^CP_EIA-3528-21_Kemet-B`` 180.0
``^CP_Elec_8x10.5`` 180.0
``^CP_Elec_6.3x7.7`` 180.0
``^CP_Elec_8x6.7`` 180.0
``^CP_Elec_8x10`` 180.0
``^(.*?_\|V)?QFN-(16\|20\|24\|28\|40)(-\|_\|$)`` 270.0
``^PowerPAK_SO-8_Single`` 270.0
``^HTSSOP-28-1EP_4.4x9.7mm*`` 270.0
====================================================== ========
.. index::
pair: position; XYRS files
pair: pick and place; XYRS files
XYRS files
~~~~~~~~~~
XYRS files are just BoM files in CSV format that includes pick and place
data (**X** position, **Y** position, **R**\ otation and **S**\ ide).
You can generate them using the internal BoM generator (``bom`` output).
The following fields contains the needed information:
- ``Footprint X``
- ``Footprint Y``
- ``Footprint Rot``
- ``Footprint Side``
Additionally we support:
- ``Footprint Type`` (SMD, THT, VIRTUAL)
- ``Footprint X-Size``
- ``Footprint Y-Size``
- ``Footprint Populate``
Important: These files doesn’t support manual panelization with repeated
reference names, you’ll get the coordinates for just one component
because this is a BoM.