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));
}