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])))