app
KiCad - the KiCad Bridge
Public Made by Adomby adom
Drive your own KiCad from an AI, in the background: open every editor, read the whole board as data (the EDA Bridge Standard board model), stack-up, part heights, netlists, place, route, pour, DRC and exports.
master
Colby Knox
1.0.59: EDA Bridge Standard board model (routing_state model:standard), layer_stack, pour_state, bodies, netlist, seven…
a0caf33
15d ago
//! Print the standard board model of a .kicad_pcb file (a development aid):
//! cargo run -p kicad-core --no-default-features --example board_model -- board.kicad_pcb [--kicad] [--full]
fn main() {
let args: Vec<String> = std::env::args().skip(1).collect();
if let Some(i) = args.iter().position(|a| a == "--model") {
let b = kicad_core::bodies::file_bounds(std::path::Path::new(&args[i + 1])).unwrap();
println!("{}: min {:?} max {:?}", args[i + 1], b.min, b.max);
return;
}
let path = args.iter().find(|a| !a.starts_with("--")).expect("a .kicad_pcb path");
let text = std::fs::read_to_string(path).expect("readable board");
let opts = kicad_core::board_model::Opts { y_up: !args.iter().any(|a| a == "--kicad") };
let t = std::time::Instant::now();
let v = kicad_core::board_model::build(&text, Some(path), &opts).expect("a board");
let ms = t.elapsed().as_millis();
if args.iter().any(|a| a == "--stack") {
println!("{}", serde_json::to_string_pretty(&kicad_core::board_model::stackup(&text).unwrap()).unwrap());
return;
}
if args.iter().any(|a| a == "--pours") {
let p = kicad_core::board_model::pours(&text, &opts, false).unwrap();
println!("{}", serde_json::to_string_pretty(&p).unwrap());
return;
}
if args.iter().any(|a| a == "--full") {
println!("{}", serde_json::to_string_pretty(&v).unwrap());
return;
}
println!("{path}: {ms} ms, revision {}, counts {}, unconnected {}, split {}, outline edges {} ({} arcs), cutouts {}, open edges {}, unfilled {}, keepouts {}",
v["revision"], v["counts"], v["unconnected"], v["splitNets"], v["outlineEdges"].as_array().map(|a| a.len()).unwrap_or(0),
v["outlineEdges"].as_array().map(|a| a.iter().filter(|e| e["kind"] == "arc").count()).unwrap_or(0),
v["cutouts"].as_array().map(|a| a.len()).unwrap_or(0), v["outlineOpenEdges"], v["unfilledZones"].as_array().map(|a| a.len()).unwrap_or(0),
v["keepouts"].as_array().map(|a| a.len()).unwrap_or(0));
}