[GenCAD] Added support for sub-PCBs.

This commit is contained in:
Salvador E. Tropea 2022-12-26 10:38:19 -03:00
parent c2924ed503
commit 2282334986
5 changed files with 56 additions and 7 deletions

View File

@ -2060,10 +2060,16 @@ Notes:
* Valid keys:
- **`output`**: [string='%f-%i%I%v.%x'] Filename for the output (%i=gencad, %x=cad). Affected by global options.
- `aux_origin`: [boolean=false] Use auxiliary axis as origin.
- `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.
- `flip_bottom_padstacks`: [boolean=false] Flip bottom footprint padstacks.
- `no_reuse_shapes`: [boolean=false] Generate a new shape for each footprint instance (Do not reuse shapes).
- `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.
- `save_origin`: [boolean=false] Save the origin coordinates in the file.
- `unique_pin_names`: [boolean=false] Generate unique pin names.
- `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.
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.

View File

@ -735,16 +735,25 @@ outputs:
options:
# [boolean=false] Use auxiliary axis as origin
aux_origin: false
# [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'
# [boolean=false] Flip bottom footprint padstacks
flip_bottom_padstacks: false
# [boolean=false] Generate a new shape for each footprint instance (Do not reuse shapes)
no_reuse_shapes: false
# [string='%f-%i%I%v.%x'] Filename for the output (%i=gencad, %x=cad). Affected by global options
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=false] Save the origin coordinates in the file
save_origin: false
# [boolean=false] Generate unique pin names
unique_pin_names: false
# [string=''] Board variant to apply.
# Used for sub-PCBs
variant: ''
# Gerber drill format:
# You can create a map file for documentation purposes.
# This output is what you get from the 'File/Fabrication output/Drill Files' menu in pcbnew.

View File

@ -861,6 +861,20 @@ class VariantOptions(BaseOptions):
GS.copy_project(fname)
return fname
def save_tmp_board_if_variant(self, to_remove, new_title='', dir=None, do_3D=False):
""" If we have a variant apply it and save the PCB to a file """
if not self.will_filter_pcb_components() and not new_title:
return GS.pcb_file
logger.debug('Creating modified PCB')
self.filter_pcb_components(GS.board, do_3D=do_3D)
self.set_title(new_title)
fname = self.save_tmp_board()
self.restore_title()
self.unfilter_pcb_components(GS.board, do_3D=do_3D)
to_remove.extend(GS.get_pcb_and_pro_names(fname))
logger.debug('- Modified PCB: '+fname)
return fname
@staticmethod
def save_tmp_dir_board(id, force_dir=None):
""" Save the PCB to a temporal dir.

View File

@ -11,7 +11,7 @@ Dependencies:
"""
import os
from .gs import GS
from .optionable import BaseOptions
from .out_base import VariantOptions
from .misc import FAILED_EXECUTE
from .kiplot import exec_with_retry, add_extra_options
from .macros import macros, document, output_class # noqa: F401
@ -20,7 +20,7 @@ from . import log
logger = log.get_logger()
class GenCADOptions(BaseOptions):
class GenCADOptions(VariantOptions):
def __init__(self):
with document:
self.output = GS.def_global_output
@ -38,12 +38,16 @@ class GenCADOptions(BaseOptions):
super().__init__()
self._expand_id = 'gencad'
self._expand_ext = 'cad'
self.help_only_sub_pcbs()
def get_targets(self, out_dir):
return [self._parent.expand_filename(out_dir, self.output)]
def run(self, name):
command = self.ensure_tool('KiAuto')
super().run(name)
to_remove = []
board_name = self.save_tmp_board_if_variant(to_remove)
# Output file name
cmd = [command, 'export_gencad', '--output_name', os.path.basename(name)]
if self.flip_bottom_padstacks:
@ -56,17 +60,18 @@ class GenCADOptions(BaseOptions):
cmd.append('--aux_origin')
if self.save_origin:
cmd.append('--save_origin')
cmd.extend([GS.pcb_file, os.path.dirname(name)])
cmd.extend([board_name, os.path.dirname(name)])
cmd, video_remove = add_extra_options(cmd)
if video_remove:
to_remove.append(os.path.join(self.expand_filename_pcb(GS.out_dir), 'pcbnew_export_gencad_screencast.ogv'))
# Execute it
ret = exec_with_retry(cmd)
if ret:
logger.error(command+' returned %d', ret)
exit(FAILED_EXECUTE)
if video_remove:
video_name = os.path.join(self.expand_filename_pcb(GS.out_dir), 'pcbnew_export_gencad_screencast.ogv')
if os.path.isfile(video_name):
os.remove(video_name)
for f in to_remove:
if os.path.isfile(f):
os.remove(f)
@output_class

View File

@ -0,0 +1,15 @@
# Example KiBot config file
kibot:
version: 1
import:
- file: battery_pack_sub_pcbs.kibot.yaml
outputs:
- name: 'GENCAD export Test'
comment: "Example of GENCAD export"
type: gencad
options:
flip_bottom_padstacks: true
no_reuse_shapes: true
save_origin: true