mohan-bee/stm32-midi-keys

Clips rectangular ground-region geometry to fit within the board’s scaled rounded-edge outline using polygon intersection.

Version
1.0.2
License
unset
Stars
0

scripts/import.ts

import { KicadToCircuitJsonConverter } from 'kicad-to-circuit-json'
import { readFileSync, writeFileSync } from 'node:fs'
const converter = new KicadToCircuitJsonConverter()
// KiCad stores non-drilled SMD pad metadata as an offset-only drill clause.
const original = readFileSync('source/stm32_midi_keys.kicad_pcb','utf8')
let normalized = original.replace(/\(drill\s+\(offset\s+[-\d.]+\s+[-\d.]+\)\)/g, '')
normalized = normalized.replace(/\((?:mode|hatch_thickness|hatch_gap|hatch_orientation|hatch_border_algorithm|hatch_min_hole_area)\s+[^()]+\)/g, "")
converter.addFile('stm32_midi_keys.kicad_pcb', normalized)
converter.runUntilFinished()
let data=converter.getOutput()
const corrections=JSON.parse(readFileSync('source/pad-shapes.json','utf8'))
for (const correction of corrections) {
  const sc=data.find(e=>e.type==='source_component' && e.name===correction.component)!
  const pc=data.find(e=>e.type==='pcb_component' && e.source_component_id===sc.source_component_id)!
  const pads=data.filter(e=>e.type==='pcb_smtpad' && e.pcb_component_id===pc.pcb_component_id && e.port_hints?.includes(correction.pin))
  if(correction.points) {
    const first=pads[0]
    data=data.filter(e=>!pads.includes(e))
    data.push({type:'pcb_smtpad',pcb_smtpad_id:first.pcb_smtpad_id,pcb_component_id:pc.pcb_component_id,pcb_port_id:first.pcb_port_id,port_hints:[correction.pin],layer:'top',shape:'polygon',points:correction.points} as any)
  } else {
    for(const pad of pads) { pad.x=correction.center.x;pad.y=correction.center.y;pad.is_covered_with_solder_mask=true }
  }
  for(const pad of pads) {
    const port=data.find(e=>e.type==='pcb_port' && e.pcb_port_id===pad.pcb_port_id)
    if(port) {port.x=correction.center.x;port.y=correction.center.y}
  }
}
writeFileSync('board.circuit.json',JSON.stringify(data,null,2))
writeFileSync('import-diagnostics.json',JSON.stringify({warnings:converter.getWarnings(),stats:converter.getStats()},null,2))
console.log(converter.getStats(),converter.getWarnings())
console.log(Object.fromEntries([...new Set(data.map(x=>x.type))].map(t=>[t,data.filter(x=>x.type===t).length])))