[Added] Sub-PCB support to drill outputs

This commit is contained in:
Salvador E. Tropea 2022-12-22 12:42:21 -03:00
parent b2b528e4ec
commit 421dcf34b7
5 changed files with 89 additions and 2 deletions

View File

@ -2006,6 +2006,8 @@ Notes:
- **`mirror_y_axis`**: [boolean=false] Invert the Y axis. - **`mirror_y_axis`**: [boolean=false] Invert the Y axis.
- **`output`**: [string='%f-%i%I%v.%x'] name for the drill file, KiCad defaults if empty (%i='PTH_drill'). Affected by global options. - **`output`**: [string='%f-%i%I%v.%x'] name for the drill file, KiCad defaults if empty (%i='PTH_drill'). Affected by global options.
- **`pth_and_npth_single_file`**: [boolean=true] Generate one file for both, plated holes and non-plated holes, instead of two separated files. - **`pth_and_npth_single_file`**: [boolean=true] Generate one file for both, plated holes and non-plated holes, instead of two separated files.
- `dnf_filter`: [string|list(string)='_none'] Name of the filter to mark components as not fitted.
A short-cut to use for simple cases where a variant is an overkill.
- `left_digits`: [number=0] number of digits for integer part of coordinates (0 is auto). - `left_digits`: [number=0] number of digits for integer part of coordinates (0 is auto).
- `map`: [dict|string] [hpgl,ps,gerber,dxf,svg,pdf] Format for a graphical drill map. - `map`: [dict|string] [hpgl,ps,gerber,dxf,svg,pdf] Format for a graphical drill map.
Not generated unless a format is specified. Not generated unless a format is specified.
@ -2014,6 +2016,8 @@ Notes:
- `type`: [string='pdf'] [hpgl,ps,gerber,dxf,svg,pdf] Format for a graphical drill map. - `type`: [string='pdf'] [hpgl,ps,gerber,dxf,svg,pdf] Format for a graphical drill map.
- `minimal_header`: [boolean=false] Use a minimal header in the file. - `minimal_header`: [boolean=false] Use a minimal header in the file.
- `npth_id`: [string] Force this replacement for %i when generating NPTH files. - `npth_id`: [string] Force this replacement for %i when generating NPTH files.
- `pre_transform`: [string|list(string)='_none'] Name of the filter to transform fields before applying other filters.
A short-cut to use for simple cases where a variant is an overkill.
- `pth_id`: [string] Force this replacement for %i when generating PTH and unified files. - `pth_id`: [string] Force this replacement for %i when generating PTH and unified files.
- `report`: [dict|string] Name of the drill report. Not generated unless a name is specified. - `report`: [dict|string] Name of the drill report. Not generated unless a name is specified.
* Valid keys: * Valid keys:
@ -2022,6 +2026,8 @@ Notes:
- `right_digits`: [number=0] number of digits for mantissa part of coordinates (0 is auto). - `right_digits`: [number=0] number of digits for mantissa part of coordinates (0 is auto).
- `route_mode_for_oval_holes`: [boolean=true] Use route command for oval holes (G00), otherwise use G85. - `route_mode_for_oval_holes`: [boolean=true] Use route command for oval holes (G00), otherwise use G85.
- `use_aux_axis_as_origin`: [boolean=false] Use the auxiliary axis as origin for coordinates. - `use_aux_axis_as_origin`: [boolean=false] Use the auxiliary axis as origin for coordinates.
- `variant`: [string=''] Board variant to apply.
Used for sub-PCBs.
- `zeros_format`: [string='DECIMAL_FORMAT'] [DECIMAL_FORMAT,SUPPRESS_LEADING,SUPPRESS_TRAILING,KEEP_ZEROS] How to handle the zeros. - `zeros_format`: [string='DECIMAL_FORMAT'] [DECIMAL_FORMAT,SUPPRESS_LEADING,SUPPRESS_TRAILING,KEEP_ZEROS] How to handle the zeros.
- `category`: [string|list(string)=''] The category for this output. If not specified an internally defined category is used. - `category`: [string|list(string)=''] The category for this output. If not specified an internally defined category is used.
Categories looks like file system paths, i.e. PCB/fabrication/gerber. Categories looks like file system paths, i.e. PCB/fabrication/gerber.
@ -2076,18 +2082,24 @@ Notes:
- **`options`**: [dict] Options for the `gerb_drill` output. - **`options`**: [dict] Options for the `gerb_drill` output.
* Valid keys: * Valid keys:
- **`output`**: [string='%f-%i%I%v.%x'] name for the drill file, KiCad defaults if empty (%i='PTH_drill'). Affected by global options. - **`output`**: [string='%f-%i%I%v.%x'] name for the drill file, KiCad defaults if empty (%i='PTH_drill'). Affected by global options.
- `dnf_filter`: [string|list(string)='_none'] Name of the filter to mark components as not fitted.
A short-cut to use for simple cases where a variant is an overkill.
- `map`: [dict|string] [hpgl,ps,gerber,dxf,svg,pdf] Format for a graphical drill map. - `map`: [dict|string] [hpgl,ps,gerber,dxf,svg,pdf] Format for a graphical drill map.
Not generated unless a format is specified. Not generated unless a format is specified.
* Valid keys: * Valid keys:
- **`output`**: [string='%f-%i%I%v.%x'] Name for the map file, KiCad defaults if empty (%i='PTH_drill_map'). Affected by global options. - **`output`**: [string='%f-%i%I%v.%x'] Name for the map file, KiCad defaults if empty (%i='PTH_drill_map'). Affected by global options.
- `type`: [string='pdf'] [hpgl,ps,gerber,dxf,svg,pdf] Format for a graphical drill map. - `type`: [string='pdf'] [hpgl,ps,gerber,dxf,svg,pdf] Format for a graphical drill map.
- `npth_id`: [string] Force this replacement for %i when generating NPTH files. - `npth_id`: [string] Force this replacement for %i when generating NPTH files.
- `pre_transform`: [string|list(string)='_none'] Name of the filter to transform fields before applying other filters.
A short-cut to use for simple cases where a variant is an overkill.
- `pth_id`: [string] Force this replacement for %i when generating PTH and unified files. - `pth_id`: [string] Force this replacement for %i when generating PTH and unified files.
- `report`: [dict|string] Name of the drill report. Not generated unless a name is specified. - `report`: [dict|string] Name of the drill report. Not generated unless a name is specified.
* Valid keys: * Valid keys:
- `filename`: [string=''] Name of the drill report. Not generated unless a name is specified. - `filename`: [string=''] Name of the drill report. Not generated unless a name is specified.
(%i='drill_report' %x='txt'). (%i='drill_report' %x='txt').
- `use_aux_axis_as_origin`: [boolean=false] Use the auxiliary axis as origin for coordinates. - `use_aux_axis_as_origin`: [boolean=false] Use the auxiliary axis as origin for coordinates.
- `variant`: [string=''] Board variant to apply.
Used for sub-PCBs.
- `category`: [string|list(string)=''] The category for this output. If not specified an internally defined category is used. - `category`: [string|list(string)=''] The category for this output. If not specified an internally defined category is used.
Categories looks like file system paths, i.e. PCB/fabrication/gerber. Categories looks like file system paths, i.e. PCB/fabrication/gerber.
- `disable_run_by_default`: [string|boolean] Use it to disable the `run_by_default` status of other output. - `disable_run_by_default`: [string|boolean] Use it to disable the `run_by_default` status of other output.

View File

@ -671,6 +671,9 @@ outputs:
type: 'excellon' type: 'excellon'
dir: 'Example/excellon_dir' dir: 'Example/excellon_dir'
options: options:
# [string|list(string)='_none'] Name of the filter to mark components as not fitted.
# A short-cut to use for simple cases where a variant is an overkill
dnf_filter: '_none'
# [number=0] number of digits for integer part of coordinates (0 is auto) # [number=0] number of digits for integer part of coordinates (0 is auto)
left_digits: 0 left_digits: 0
# [dict|string] [hpgl,ps,gerber,dxf,svg,pdf] Format for a graphical drill map. # [dict|string] [hpgl,ps,gerber,dxf,svg,pdf] Format for a graphical drill map.
@ -690,6 +693,9 @@ outputs:
npth_id: null npth_id: null
# [string='%f-%i%I%v.%x'] name for the drill file, KiCad defaults if empty (%i='PTH_drill'). Affected by global options # [string='%f-%i%I%v.%x'] name for the drill file, KiCad defaults if empty (%i='PTH_drill'). Affected by global options
output: '%f-%i%I%v.%x' output: '%f-%i%I%v.%x'
# [string|list(string)='_none'] Name of the filter to transform fields before applying other filters.
# A short-cut to use for simple cases where a variant is an overkill
pre_transform: '_none'
# [boolean=true] Generate one file for both, plated holes and non-plated holes, instead of two separated files # [boolean=true] Generate one file for both, plated holes and non-plated holes, instead of two separated files
pth_and_npth_single_file: true pth_and_npth_single_file: true
# [string] Force this replacement for %i when generating PTH and unified files # [string] Force this replacement for %i when generating PTH and unified files
@ -705,6 +711,9 @@ outputs:
route_mode_for_oval_holes: true route_mode_for_oval_holes: true
# [boolean=false] Use the auxiliary axis as origin for coordinates # [boolean=false] Use the auxiliary axis as origin for coordinates
use_aux_axis_as_origin: false use_aux_axis_as_origin: false
# [string=''] Board variant to apply.
# Used for sub-PCBs
variant: ''
# [string='DECIMAL_FORMAT'] [DECIMAL_FORMAT,SUPPRESS_LEADING,SUPPRESS_TRAILING,KEEP_ZEROS] How to handle the zeros # [string='DECIMAL_FORMAT'] [DECIMAL_FORMAT,SUPPRESS_LEADING,SUPPRESS_TRAILING,KEEP_ZEROS] How to handle the zeros
zeros_format: 'DECIMAL_FORMAT' zeros_format: 'DECIMAL_FORMAT'
# GenCAD: # GenCAD:
@ -735,6 +744,9 @@ outputs:
type: 'gerb_drill' type: 'gerb_drill'
dir: 'Example/gerb_drill_dir' dir: 'Example/gerb_drill_dir'
options: options:
# [string|list(string)='_none'] Name of the filter to mark components as not fitted.
# A short-cut to use for simple cases where a variant is an overkill
dnf_filter: '_none'
# [dict|string] [hpgl,ps,gerber,dxf,svg,pdf] Format for a graphical drill map. # [dict|string] [hpgl,ps,gerber,dxf,svg,pdf] Format for a graphical drill map.
# Not generated unless a format is specified # Not generated unless a format is specified
map: map:
@ -746,6 +758,9 @@ outputs:
npth_id: null npth_id: null
# [string='%f-%i%I%v.%x'] name for the drill file, KiCad defaults if empty (%i='PTH_drill'). Affected by global options # [string='%f-%i%I%v.%x'] name for the drill file, KiCad defaults if empty (%i='PTH_drill'). Affected by global options
output: '%f-%i%I%v.%x' output: '%f-%i%I%v.%x'
# [string|list(string)='_none'] Name of the filter to transform fields before applying other filters.
# A short-cut to use for simple cases where a variant is an overkill
pre_transform: '_none'
# [string] Force this replacement for %i when generating PTH and unified files # [string] Force this replacement for %i when generating PTH and unified files
pth_id: null pth_id: null
# [dict|string] Name of the drill report. Not generated unless a name is specified # [dict|string] Name of the drill report. Not generated unless a name is specified
@ -755,6 +770,9 @@ outputs:
filename: '' filename: ''
# [boolean=false] Use the auxiliary axis as origin for coordinates # [boolean=false] Use the auxiliary axis as origin for coordinates
use_aux_axis_as_origin: false use_aux_axis_as_origin: false
# [string=''] Board variant to apply.
# Used for sub-PCBs
variant: ''
# Gerber format: # Gerber format:
# This output is what you get from the File/Plot menu in pcbnew. # This output is what you get from the File/Plot menu in pcbnew.
- name: 'gerber_example' - name: 'gerber_example'

View File

@ -7,7 +7,8 @@ import os
import re import re
from pcbnew import (PLOT_FORMAT_HPGL, PLOT_FORMAT_POST, PLOT_FORMAT_GERBER, PLOT_FORMAT_DXF, PLOT_FORMAT_SVG, from pcbnew import (PLOT_FORMAT_HPGL, PLOT_FORMAT_POST, PLOT_FORMAT_GERBER, PLOT_FORMAT_DXF, PLOT_FORMAT_SVG,
PLOT_FORMAT_PDF, wxPoint) PLOT_FORMAT_PDF, wxPoint)
from .optionable import (Optionable, BaseOptions) from .optionable import Optionable
from .out_base import VariantOptions
from .gs import GS from .gs import GS
from .layer import Layer from .layer import Layer
from .macros import macros, document # noqa: F401 from .macros import macros, document # noqa: F401
@ -37,7 +38,7 @@ class DrillReport(Optionable):
self._unkown_is_error = True self._unkown_is_error = True
class AnyDrill(BaseOptions): class AnyDrill(VariantOptions):
def __init__(self): def __init__(self):
# Options # Options
with document: with document:
@ -66,6 +67,7 @@ class AnyDrill(BaseOptions):
} }
self._map_ext = {'hpgl': 'plt', 'ps': 'ps', 'gerber': 'gbr', 'dxf': 'dxf', 'svg': 'svg', 'pdf': 'pdf'} self._map_ext = {'hpgl': 'plt', 'ps': 'ps', 'gerber': 'gbr', 'dxf': 'dxf', 'svg': 'svg', 'pdf': 'pdf'}
self._unified_output = False self._unified_output = False
self.add_to_doc('variant', 'Used for sub-PCBs')
def config(self, parent): def config(self, parent):
super().config(parent) super().config(parent)
@ -156,6 +158,8 @@ class AnyDrill(BaseOptions):
return filenames return filenames
def run(self, output_dir): def run(self, output_dir):
super().run(output_dir)
self.filter_pcb_components(GS.board)
if self.output: if self.output:
output_dir = os.path.dirname(output_dir) output_dir = os.path.dirname(output_dir)
# dialog_gendrill.cpp:357 # dialog_gendrill.cpp:357
@ -183,6 +187,7 @@ class AnyDrill(BaseOptions):
drill_report_file = self.expand_filename(output_dir, self.report, 'drill_report', 'txt') drill_report_file = self.expand_filename(output_dir, self.report, 'drill_report', 'txt')
logger.debug("Generating drill report: "+drill_report_file) logger.debug("Generating drill report: "+drill_report_file)
drill_writer.GenDrillReportFile(drill_report_file) drill_writer.GenDrillReportFile(drill_report_file)
self.unfilter_pcb_components(GS.board)
def get_targets(self, out_dir): def get_targets(self, out_dir):
targets = [] targets = []

View File

@ -10,6 +10,7 @@ pytest-3 --log-cli-level debug
""" """
import pytest
import os import os
import sys import sys
from . import context from . import context
@ -99,3 +100,16 @@ def test_drill_legacy_3Rs(test_dir):
def test_drill_legacy_s_3Rs(test_dir): def test_drill_legacy_s_3Rs(test_dir):
do_3Rs(test_dir, 'drill_legacy_s', False, True) do_3Rs(test_dir, 'drill_legacy_s', False, True)
@pytest.mark.skipif(context.ki5(), reason="KiKit currently supports KiCad 6 only")
def test_drill_sub_pcb_bp(test_dir):
""" Test a multiboard example """
prj = 'batteryPack'
ctx = context.TestContext(test_dir, prj, 'drill_sub_pcb', 'Drill')
ctx.run()
# Check all outputs are there
fname = prj+'-drill_connector.drl'
ctx.search_in_file_d(fname, ['X29.75Y-28.09', 'T3C3.200'])
ctx.search_not_in_file_d(fname, ['X189.0Y-59.0', 'T1C0.400'])
ctx.clean_up(keep_project=True)

View File

@ -0,0 +1,38 @@
# Drills and Gerber drills
kibot:
version: 1
variants:
- name: 'default'
comment: 'Default variant'
type: ibom
sub_pcbs:
- name: charger
tlx: 175
tly: 50
brx: 245
bry: 90
- name: battery
tlx: 20
tly: 20
brx: 90
bry: 118
- name: connector
tlx: 116
tly: 52
brx: 146
bry: 88
outputs:
- name: excellon_drill
comment: "Excellon drill files"
type: excellon
dir: Drill
options:
variant: default[connector]
metric_units: true
use_aux_axis_as_origin: false
minimal_header: false
mirror_y_axis: false
report: '%f-%i.%x'
map: 'pdf'