[CLI][Added] Options to list rotation and offset adjusts

Mainly oriented for JLCPCB
This commit is contained in:
Salvador E. Tropea 2023-11-22 12:47:48 -03:00
parent 2611358432
commit cbc196f37a
6 changed files with 128 additions and 83 deletions

View File

@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [1.6.4] - UNRELEASED
### Added
- Command line:
- `--help-list-offsets` to list footprint offsets (JLCPCB)
- `--help-list-rotations` to list footprint rotations (JLCPCB)
- Global options:
- `remove_solder_mask_for_dnp` similar to `remove_solder_paste_for_dnp` but
applied to the solder mask apertures. (#476)

View File

@ -15,7 +15,9 @@ Usage:
kibot [-v...] [--rst] --help-filters
kibot [-v...] [--markdown|--json|--rst] --help-dependencies
kibot [-v...] [--rst] --help-global-options
kibot [-v...] --help-list-offsets
kibot [-v...] [--rst] --help-list-outputs
kibot [-v...] --help-list-rotations
kibot [-v...] --help-output=HELP_OUTPUT
kibot [-v...] [--rst] [-d OUT_DIR] --help-outputs
kibot [-v...] [--rst] --help-preflights
@ -79,6 +81,7 @@ Help options:
--help-filters List supported filters and details
--help-global-options List supported global variables
--help-list-outputs List supported outputs
--help-list-rotations List footprint rotations (JLCPCB)
--help-output HELP_OUTPUT Help for this particular output
--help-outputs List supported outputs and details
--help-preflights List supported preflights and details

View File

@ -22,7 +22,9 @@ Usage:
kibot [-v...] [--rst] --help-filters
kibot [-v...] [--markdown|--json|--rst] --help-dependencies
kibot [-v...] [--rst] --help-global-options
kibot [-v...] --help-list-offsets
kibot [-v...] [--rst] --help-list-outputs
kibot [-v...] --help-list-rotations
kibot [-v...] --help-output=HELP_OUTPUT
kibot [-v...] [--rst] [-d OUT_DIR] --help-outputs
kibot [-v...] [--rst] --help-preflights
@ -85,7 +87,9 @@ Help options:
--help-errors List of error levels
--help-filters List supported filters and details
--help-global-options List supported global variables
--help-list-offsets List footprint offsets (JLCPCB)
--help-list-outputs List supported outputs
--help-list-rotations List footprint rotations (JLCPCB)
--help-output HELP_OUTPUT Help for this particular output
--help-outputs List supported outputs and details
--help-preflights List supported preflights and details
@ -128,7 +132,7 @@ from .pre_base import BasePreFlight
from .error import KiPlotConfigurationError, config_error
from .config_reader import (CfgYamlReader, print_outputs_help, print_output_help, print_preflights_help, create_example,
print_filters_help, print_global_options_help, print_dependencies, print_variants_help,
print_errors)
print_errors, print_list_rotations, print_list_offsets)
from .kiplot import (generate_outputs, load_actions, config_output, generate_makefile, generate_examples, solve_schematic,
solve_board_file, solve_project_file, check_board_file)
from .registrable import RegOutput
@ -456,6 +460,12 @@ def main():
if args.help_dependencies:
print_dependencies(args.markdown, args.json, args.rst)
sys.exit(0)
if args.help_list_rotations:
print_list_rotations()
sys.exit(0)
if args.help_list_offsets:
print_list_offsets()
sys.exit(0)
if args.help_banners:
for c, b in enumerate(BANNERS):
logger.info('Banner '+str(c))

View File

@ -23,7 +23,8 @@ import textwrap
from .error import KiPlotConfigurationError, config_error
from .misc import (NO_YAML_MODULE, EXIT_BAD_ARGS, EXAMPLE_CFG, WONT_OVERWRITE, W_NOOUTPUTS, W_UNKOUT, W_NOFILTERS,
W_NOVARIANTS, W_NOGLOBALS, TRY_INSTALL_CHECK, W_NOPREFLIGHTS, W_NOGROUPS, W_NEWGROUP, error_level_to_name)
W_NOVARIANTS, W_NOGLOBALS, TRY_INSTALL_CHECK, W_NOPREFLIGHTS, W_NOGROUPS, W_NEWGROUP, error_level_to_name,
DEFAULT_ROTATIONS, DEFAULT_OFFSETS)
from .gs import GS
from .registrable import RegOutput, RegVariant, RegFilter, RegDependency
from .pre_base import BasePreFlight
@ -1363,3 +1364,31 @@ def print_errors(rst):
make_title(rst, 'error levels', len(error_level_to_name), '~')
for c, n in enumerate(error_level_to_name):
print(f'- {c}: {n}')
def print_list_rotations():
rots = sorted(DEFAULT_ROTATIONS, key=lambda x: x[0])
w = len(max(rots, key=lambda x: len(x[0]))[0])+4
sep = '='*w + ' ========'
f1 = f'%-{w}s'
print(sep)
print((f1+' Rotation') % 'Footprint')
print(sep)
fmt = f'{f1} %6d'
for v in rots:
print(fmt % ('``'+v[0]+'``', v[1]))
print(sep)
def print_list_offsets():
offs = sorted(DEFAULT_OFFSETS, key=lambda x: x[0])
w = len(max(offs, key=lambda x: len(x[0]))[0])+4
sep = '='*w + ' ======== ========'
f1 = f'%-{w}s'
print(sep)
print((f1+' Offset X Offset Y') % 'Footprint')
print(sep)
fmt = f'{f1} %8.2f %8.2f'
for v in offs:
print(fmt % ('``'+v[0]+'``', v[1][0], v[1][1]))
print(sep)

View File

@ -13,92 +13,12 @@ from .gs import GS
from .optionable import Optionable
from .error import KiPlotConfigurationError
from .macros import macros, document, filter_class # noqa: F401
from .misc import W_BADANGLE, W_BADOFFSET
from .misc import W_BADANGLE, W_BADOFFSET, DEFAULT_ROTATIONS, DEFAULT_ROT_FIELDS, DEFAULT_OFFSETS, DEFAULT_OFFSET_FIELDS
from . import log
logger = log.get_logger()
# Known rotations for JLC
# Notes:
# - Rotations are CC (counter clock)
# - Most components has pin 1 at the top-right angle, while KiCad uses the top-left
# This is why most of the ICs has a rotation of 270 (-90)
# - The same applies to things like SOT-23-3, so here you get 180.
# - Most polarized components has pin 1 on the positive pin, becoming it the right one.
# On KiCad this is not the case, diodes follows it, but capacitors don't. So they get 180.
# - There are exceptions, like SOP-18 or SOP-4 which doesn't follow the JLC rules.
# - KiCad mirrors components on the bottom layer, but JLC doesn't. So you need to "un-mirror" them.
# - The JLC mechanism to interpret rotations changed with time
DEFAULT_ROTATIONS = [["^R_Array_Convex_", 90.0],
["^R_Array_Concave_", 90.0],
# *SOT* seems to need 180
["^SOT-143", 180.0],
["^SOT-223", 180.0],
["^SOT-23", 180.0],
["^SOT-353", 180.0],
["^SOT-363", 180.0],
["^SOT-89", 180.0],
["^D_SOT-23", 180.0],
["^TSOT-23", 180.0],
# Polarized capacitors
["^CP_EIA-", 180.0],
["^CP_Elec_", 180.0],
["^C_Elec_", 180.0],
# Most four side components needs -90 (270)
["^QFN-", 270.0],
["^(.*?_|V)?QFN-(16|20|24|28|40)(-|_|$)", 270.0],
["^DFN-", 270.0],
["^LQFP-", 270.0],
["^TQFP-", 270.0],
# SMD DIL packages mostly needs -90 (270)
["^SOP-(?!(18_|4_))", 270.0], # SOP 18 and 4 excluded, wrong at JLCPCB
["^MSOP-", 270.0],
["^TSSOP-", 270.0],
["^HTSSOP-", 270.0],
["^SSOP-", 270.0],
["^SOIC-", 270.0],
["^SO-", 270.0],
["^SOIC127P798X216-8N", 270.0],
["^VSSOP-8_3.0x3.0mm_P0.65mm", 270.0],
["^VSSOP-8_", 180.0],
["^VSSOP-10_", 270.0],
["^VSON-8_", 270.0],
["^TSOP-6", 270.0],
["^UDFN-10", 270.0],
["^USON-10", 270.0],
["^TDSON-8-1", 270.0],
# Misc.
["^LED_WS2812B_PLCC4", 180.0],
["^LED_WS2812B-2020_PLCC4_2.0x2.0mm", 90.0],
["^Bosch_LGA-", 90.0],
["^PowerPAK_SO-8_Single", 270.0],
["^PUIAudio_SMT_0825_S_4_R*", 270.0],
["^USB_C_Receptacle_HRO_TYPE-C-31-M-12*", 180.0],
["^ESP32-W", 270.0],
["^SW_DIP_SPSTx01_Slide_Copal_CHS-01B_W7.62mm_P1.27mm", -180.0],
["^BatteryHolder_Keystone_1060_1x2032", -180.0],
["^Relay_DPDT_Omron_G6K-2F-Y", 270.0],
["^RP2040-QFN-56", 270.0],
["^TO-277", 90.0],
["^SW_SPST_B3", 90.0],
["^Transformer_Ethernet_Pulse_HX0068ANL", 270.0],
["^JST_GH_SM", 180.0],
["^JST_PH_S", 180.0],
["^Diodes_PowerDI3333-8", 270.0],
["^Quectel_L80-R", 270.0],
["^SC-74-6", 180.0],
[r"^PinHeader_2x05_P1\.27mm_Vertical", 90.0],
[r"^PinHeader_2x03_P1\.27mm_Vertical", 90.0],
]
DEFAULT_ROT_FIELDS = ['JLCPCB Rotation Offset', 'JLCRotOffset']
DEFAULT_OFFSETS = [["^USB_C_Receptacle_XKB_U262-16XN-4BVC11", (0.0, -1.44)],
[r"^PinHeader_2x05_P1\.27mm_Vertical", (2.54, 0.635)],
[r"^PinHeader_2x03_P1\.27mm_Vertical", (1.27, 0.635)],
]
DEFAULT_OFFSET_FIELDS = ['JLCPCB Position Offset', 'JLCPosOffset']
def get_field_value(comp, field):
""" Helper to process the footprint field in a special way """
field = field.lower()

View File

@ -314,6 +314,86 @@ KIKIT_UNIT_ALIASES = {'millimeters': 'mm', 'inches': 'inch', 'mils': 'mil'}
FONT_HELP_TEXT = '\n If you use custom fonts and/or colors please consult the `resources_dir` global variable.'
# Known rotations for JLC
# Notes:
# - Rotations are CC (counter clock)
# - Most components has pin 1 at the top-right angle, while KiCad uses the top-left
# This is why most of the ICs has a rotation of 270 (-90)
# - The same applies to things like SOT-23-3, so here you get 180.
# - Most polarized components has pin 1 on the positive pin, becoming it the right one.
# On KiCad this is not the case, diodes follows it, but capacitors don't. So they get 180.
# - There are exceptions, like SOP-18 or SOP-4 which doesn't follow the JLC rules.
# - KiCad mirrors components on the bottom layer, but JLC doesn't. So you need to "un-mirror" them.
# - The JLC mechanism to interpret rotations changed with time
DEFAULT_ROTATIONS = [["^R_Array_Convex_", 90.0],
["^R_Array_Concave_", 90.0],
# *SOT* seems to need 180
["^SOT-143", 180.0],
["^SOT-223", 180.0],
["^SOT-23", 180.0],
["^SOT-353", 180.0],
["^SOT-363", 180.0],
["^SOT-89", 180.0],
["^D_SOT-23", 180.0],
["^TSOT-23", 180.0],
# Polarized capacitors
["^CP_EIA-", 180.0],
["^CP_Elec_", 180.0],
["^C_Elec_", 180.0],
# Most four side components needs -90 (270)
["^QFN-", 270.0],
["^(.*?_|V)?QFN-(16|20|24|28|40)(-|_|$)", 270.0],
["^DFN-", 270.0],
["^LQFP-", 270.0],
["^TQFP-", 270.0],
# SMD DIL packages mostly needs -90 (270)
["^SOP-(?!(18_|4_))", 270.0], # SOP 18 and 4 excluded, wrong at JLCPCB
["^MSOP-", 270.0],
["^TSSOP-", 270.0],
["^HTSSOP-", 270.0],
["^SSOP-", 270.0],
["^SOIC-", 270.0],
["^SO-", 270.0],
["^SOIC127P798X216-8N", 270.0],
["^VSSOP-8_3.0x3.0mm_P0.65mm", 270.0],
["^VSSOP-8_", 180.0],
["^VSSOP-10_", 270.0],
["^VSON-8_", 270.0],
["^TSOP-6", 270.0],
["^UDFN-10", 270.0],
["^USON-10", 270.0],
["^TDSON-8-1", 270.0],
# Misc.
["^LED_WS2812B_PLCC4", 180.0],
["^LED_WS2812B-2020_PLCC4_2.0x2.0mm", 90.0],
["^Bosch_LGA-", 90.0],
["^PowerPAK_SO-8_Single", 270.0],
["^PUIAudio_SMT_0825_S_4_R*", 270.0],
["^USB_C_Receptacle_HRO_TYPE-C-31-M-12*", 180.0],
["^ESP32-W", 270.0],
["^SW_DIP_SPSTx01_Slide_Copal_CHS-01B_W7.62mm_P1.27mm", -180.0],
["^BatteryHolder_Keystone_1060_1x2032", -180.0],
["^Relay_DPDT_Omron_G6K-2F-Y", 270.0],
["^RP2040-QFN-56", 270.0],
["^TO-277", 90.0],
["^SW_SPST_B3", 90.0],
["^Transformer_Ethernet_Pulse_HX0068ANL", 270.0],
["^JST_GH_SM", 180.0],
["^JST_PH_S", 180.0],
["^Diodes_PowerDI3333-8", 270.0],
["^Quectel_L80-R", 270.0],
["^SC-74-6", 180.0],
[r"^PinHeader_2x05_P1\.27mm_Vertical", 90.0],
[r"^PinHeader_2x03_P1\.27mm_Vertical", 90.0],
]
DEFAULT_ROT_FIELDS = ['JLCPCB Rotation Offset', 'JLCRotOffset']
DEFAULT_OFFSETS = [["^USB_C_Receptacle_XKB_U262-16XN-4BVC11", (0.0, -1.44)],
[r"^PinHeader_2x05_P1\.27mm_Vertical", (2.54, 0.635)],
[r"^PinHeader_2x03_P1\.27mm_Vertical", (1.27, 0.635)],
]
DEFAULT_OFFSET_FIELDS = ['JLCPCB Position Offset', 'JLCPosOffset']
class Rect(object):
""" What KiCad returns isn't a real wxWidget's wxRect.
Here I add what I really need """