cli: Add JSON output

This commit is contained in:
jaseg 2025-12-15 16:39:09 +01:00
parent 6157ce4983
commit a47466016f

View file

@ -17,14 +17,17 @@ import logging
import subprocess import subprocess
import webbrowser import webbrowser
import tempfile import tempfile
import json
import os import os
import sys import sys
from pathlib import Path from pathlib import Path
from collections import defaultdict
import warnings import warnings
import math import math
import click import click
from gerbonara.layers import LayerStack from gerbonara.layers import LayerStack
from gerbonara.cad.kicad.primitives import kicad_mid_to_center_arc
from .geometry import PlanarInductor, divisors, CircleShape, SectorShape, StarShape, SVGShape, RectangleShape, RegularPolygonShape from .geometry import PlanarInductor, divisors, CircleShape, SectorShape, StarShape, SVGShape, RectangleShape, RegularPolygonShape
from .kicad import footprint_to_board from .kicad import footprint_to_board
@ -61,7 +64,7 @@ def print_valid_twists(ctx, param, value):
@click.option('--circle-segments', type=int, default=64, help='When not using arcs, the number of points to use for arc interpolation per 360 degrees.') @click.option('--circle-segments', type=int, default=64, help='When not using arcs, the number of points to use for arc interpolation per 360 degrees.')
@click.option('--arc-tolerance', type=float, default=0.02) @click.option('--arc-tolerance', type=float, default=0.02)
@click.option('--approximate-arcs/--no-approximate-arcs', default=True, help='Use circular arcs to smoothen output shape (default: on)') @click.option('--approximate-arcs/--no-approximate-arcs', default=True, help='Use circular arcs to smoothen output shape (default: on)')
@click.option('--format', type=click.Choice(['svg', 'gerber', 'kicad-footprint', 'kicad-pcb', 'show']), default='kicad-footprint') @click.option('--format', type=click.Choice(['svg', 'gerber', 'kicad-footprint', 'kicad-pcb', 'json', 'show']), default='kicad-footprint')
@click.option('--clipboard/--no-clipboard', help='Use clipboard integration (requires wl-clipboard)') @click.option('--clipboard/--no-clipboard', help='Use clipboard integration (requires wl-clipboard)')
@click.option('--footprint-name', help="Name for the generated footprint. Default: Output file name sans extension.") @click.option('--footprint-name', help="Name for the generated footprint. Default: Output file name sans extension.")
@click.option('--layer-pair', default='F.Cu,B.Cu', help="Target KiCad layer pair for the generated footprint, comma-separated. Default: F.Cu/B.Cu.") @click.option('--layer-pair', default='F.Cu,B.Cu', help="Target KiCad layer pair for the generated footprint, comma-separated. Default: F.Cu/B.Cu.")
@ -113,6 +116,49 @@ def cli(ctx, footprint_name, clipboard, single_layer, arc_tolerance, circle_segm
f = Path(f.name) f = Path(f.name)
stack.save_to_zipfile(f) stack.save_to_zipfile(f)
data = f.read_bytes() data = f.read_bytes()
elif format == 'json':
lines = defaultdict(lambda: [])
for l in footprint.lines:
lines[l.layer].append({
'x1': l.start.x,
'y1': l.start.y,
'x2': l.end.x,
'y2': l.end.y})
arcs = defaultdict(lambda: [])
for a in footprint.arcs:
center, r, direction = kicad_mid_to_center_arc(a.mid, a.start, a.end)
arcs[a.layer].append({
'x1': a.start.x,
'y1': a.start.y,
'x2': a.end.x,
'y2': a.end.y,
'cx': center.x,
'cy': center.y,
})
vias = [{
'x': p.at.x,
'y': p.at.y,
'pad': p.size.x,
'drill': p.drill.diameter,
} for p in footprint.pads if p.number == 'NC']
pads = [{
'x': p.at.x,
'y': p.at.y,
'pad': p.size.x,
} for p in footprint.pads if p.number != 'NC']
d = {
'lines': dict(lines),
'arcs': dict(arcs),
'vias': vias,
'pads': pads
}
data = json.dumps(d, indent=4)
elif format in ('svg', 'show'): elif format in ('svg', 'show'):
data = str(make_transparent_svg(footprint)) data = str(make_transparent_svg(footprint))