cli: Straighten out zip handling
This commit is contained in:
parent
13ae96092f
commit
6b6f13d2ab
1 changed files with 15 additions and 28 deletions
|
|
@ -23,61 +23,50 @@ def cli():
|
|||
pass
|
||||
|
||||
@cli.command()
|
||||
@click.argument('input_gerbers', type=click.Path(exists=True))
|
||||
@click.argument('input_svg', type=click.Path(exists=True, dir_okay=False, file_okay=True, allow_dash=True))
|
||||
@click.argument('output_gerbers')
|
||||
@click.argument('input_gerbers', type=click.Path(exists=True, path_type=Path))
|
||||
@click.argument('input_svg', type=click.Path(exists=True, dir_okay=False, file_okay=True, allow_dash=True, path_type=Path))
|
||||
@click.argument('output_gerbers', type=click.Path(allow_dash=True, path_type=Path))
|
||||
@click.option('--dilate', default=0.1, type=float, help='Default dilation for subtraction operations in mm')
|
||||
@click.option('--zip/--no-zip', 'is_zip', default=None, help='zip output files. Default: zip if output path ends with ".zip" or when outputting to stdout.')
|
||||
@click.option('--curve-tolerance', type=float, help='Tolerance for curve flattening in mm')
|
||||
@click.option('--no-subtract', 'no_subtract', flag_value=True, help='Disable subtraction')
|
||||
@click.option('--subtract', help='Use user subtraction script from argument (see description above)')
|
||||
@click.option('--subtract', help='Use user subtraction script from argument')
|
||||
@click.option('--trace-space', type=float, default=0.1, help='passed through to svg-flatten')
|
||||
@click.option('--vectorizer', help='passed through to svg-flatten')
|
||||
@click.option('--vectorizer-map', help='passed through to svg-flatten')
|
||||
@click.option('--preserve-aspect-ratio', help='PNG/JPG files only: passed through to svg-flatten')
|
||||
@click.option('--exclude-groups', help='passed through to svg-flatten')
|
||||
def paste(input_gerbers, input_svg, output_gerbers,
|
||||
def paste(input_gerbers, input_svg, output_gerbers, is_zip,
|
||||
dilate, curve_tolerance, no_subtract, subtract,
|
||||
preserve_aspect_ratio,
|
||||
trace_space, vectorizer, vectorizer_map, exclude_groups):
|
||||
""" Render vector data and raster images from SVG file into gerbers. """
|
||||
|
||||
if no_subtract:
|
||||
subtract_map = {}
|
||||
else:
|
||||
subtract_map = parse_subtract_script(subtract, dilate)
|
||||
subtract_map = parse_subtract_script('' if no_subtract else subtract, dilate)
|
||||
|
||||
output_gerbers = Path(output_gerbers)
|
||||
input_gerbers = Path(input_gerbers)
|
||||
stack = gn.LayerStack.open(input_gerbers, lazy=True)
|
||||
(bb_min_x, bb_min_y), (bb_max_x, bb_max_y) = bounds = stack.board_bounds()
|
||||
|
||||
output_is_zip = output_gerbers.lower().endswith('.zip') if is_zip is None else is_zip
|
||||
|
||||
# Create output dir if it does not exist yet. Do this now so we fail early
|
||||
if input_gerbers.is_dir():
|
||||
if not output_is_zip:
|
||||
output_gerbers.mkdir(exist_ok=True)
|
||||
|
||||
# In case output dir already existed, remove files we will overwrite
|
||||
for in_file in input_gerbers.iterdir():
|
||||
out_cand = output_gerbers / in_file.name
|
||||
out_cand.unlink(missing_ok=True)
|
||||
|
||||
else: # We are working on a zip file
|
||||
tempdir = tempfile.NamedTemporaryDirectory()
|
||||
|
||||
@functools.lru_cache()
|
||||
def do_dilate(layer, amount):
|
||||
return dilate_gerber(layer, bounds, amount, curve_tolerance)
|
||||
|
||||
for (side, use), layer in stack.graphic_layers.items():
|
||||
print('processing', side, use, 'layer')
|
||||
overlay_grb = svg_to_gerber(input_svg,
|
||||
trace_space=trace_space, vectorizer=vectorizer, vectorizer_map=vectorizer_map,
|
||||
exclude_groups=exclude_groups, curve_tolerance=curve_tolerance,
|
||||
preserve_aspect_ratio=preserve_aspect_ratio,
|
||||
outline_mode=(use == 'outline'),
|
||||
only_groups=f'g-{side}-{use}')
|
||||
# FIXME outline mode, also process outline layer
|
||||
|
||||
if not overlay_grb:
|
||||
print(f'Overlay {side} {use} layer is empty. Skipping.', file=sys.stderr)
|
||||
print(f'Overlay {side} {use} layer is empty. Skipping.')
|
||||
continue
|
||||
|
||||
# only open lazily loaded layer if we need it. Replace lazy wrapper in stack with loaded layer.
|
||||
|
|
@ -86,22 +75,20 @@ def paste(input_gerbers, input_svg, output_gerbers,
|
|||
# move overlay from svg origin to gerber origin
|
||||
overlay_grb.offset(bb_min_x, bb_min_y)
|
||||
|
||||
print('compositing')
|
||||
# dilated subtract layers on top of overlay
|
||||
if side in ('top', 'bottom'): # do not process subtraction scripts for inner layers
|
||||
dilations = subtract_map.get(use, [])
|
||||
for d_layer, amount in dilations:
|
||||
print('processing dilation', d_layer, amount)
|
||||
dilated = do_dilate(stack[(side, d_layer)], amount)
|
||||
layer.merge(dilated, mode='below', keep_settings=True)
|
||||
|
||||
# overlay on bottom
|
||||
layer.merge(overlay_grb, mode='below', keep_settings=True)
|
||||
|
||||
if input_gerbers.is_dir():
|
||||
stack.save_to_directory(output_gerbers)
|
||||
else:
|
||||
if output_is_zip:
|
||||
stack.save_to_zipfile(output_gerbers)
|
||||
else:
|
||||
stack.save_to_directory(output_gerbers)
|
||||
|
||||
@cli.command()
|
||||
@click.argument('input_gerbers', type=click.Path(exists=True))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue