← Commit history

Fusion lane: read pad key (REF.PAD) and copper-computed unconnected from fusion-bridge 1.12+ (EDA Bridge Standard board model); older bridges unchanged

Colby Knox ·b3351ddf38 · ·parent 29b161b
1 file changed +20−2
crates/aiflow-bridge/src/fusion.rs+20−2
@@ -54,10 +54,15 @@ pub fn to_kicad_state(f: &Value) -> Value {         "layer": layer_name(s["layer"].as_i64().unwrap_or(1)), "net_name": s["net"], "width": s["width"], "uuid": item_id(&s["net"], 's', i)})).collect();     let vias: Vec<Value> = f["vias"].as_array().cloned().unwrap_or_default().iter().enumerate().map(|(i, v)| json!({         "position": {"x": v["at"][0], "y": -v["at"][1].as_f64().unwrap_or(0.0)}, "net_name": v["net"], "size": v["diameter"], "drill": v["drill"], "uuid": item_id(&v["net"], 'v', i)})).collect();+    // fusion-bridge 1.12+ returns the EDA Bridge Standard's pads (name is the pad's own name, ref the+    // part) with the planner's "REF.PAD" under key; older bridges put "REF.PAD" in name     let pads: Vec<Value> = f["pads"].as_array().cloned().unwrap_or_default().iter().map(|p| json!({-        "name": p["name"], "netName": p["net"].as_str().unwrap_or(""), "x": p["at"][0], "y": -p["at"][1].as_f64().unwrap_or(0.0)})).collect();+        "name": if p["key"].is_string() { p["key"].clone() } else { p["name"].clone() }, "netName": p["net"].as_str().unwrap_or(""), "x": p["at"][0], "y": -p["at"][1].as_f64().unwrap_or(0.0)})).collect();+    // unconnected from the copper itself (1.12+) is right even before Fusion recomputes its ratsnest;+    // airwireCount is Fusion's ratsnest as exported+    let unconnected = if f["unconnected"].is_u64() { f["unconnected"].clone() } else { f["airwireCount"].clone() };     json!({"success": true, "revision": f["revision"], "boardId": f["boardId"], "segments": segs, "vias": vias, "pads": pads,-           "unconnected": f["airwireCount"], "remainingNets": f["remainingNets"], "elements": f["elements"], "source": "fusion"})+           "unconnected": unconnected, "remainingNets": f["remainingNets"], "elements": f["elements"], "source": "fusion"}) }  /// Answer a kicad_* verb for a Fusion board through the Fusion bridge. `call` sends one verb.@@ -266,4 +271,17 @@ mod tests {         let r = translate("kicad_move_footprint", &json!({"expectedRevision": "old", "refs": []}), "Doc-brd", &call);         assert_eq!(r["errorCode"], "stale_board"); assert_eq!(sent.borrow().len(), n + 1, "only the state read went out");     }+    #[test]+    fn standard_board_model_pads_keep_their_ref_pad_name() {+        // fusion-bridge 1.12+: name is the pad's own, key is REF.PAD, unconnected comes from the copper+        let f = json!({"success": true, "boardId": "B", "revision": "r1", "segments": [], "vias": [], "airwireCount": 0, "unconnected": 7,+                       "pads": [{"ref": "R1", "name": "1", "key": "R1.1", "net": "A", "at": [5.0, 4.5], "x": 5.0, "y": 4.5}]});+        let st = to_kicad_state(&f);+        assert_eq!(st["pads"][0]["name"], "R1.1");+        assert_eq!(st["unconnected"], 7);+        // an older bridge: REF.PAD in name, unconnected from Fusion's airwires+        let st = to_kicad_state(&json!({"success": true, "segments": [], "vias": [], "airwireCount": 3, "pads": [{"name": "R1.1", "net": "A", "at": [5.0, 4.5]}]}));+        assert_eq!(st["pads"][0]["name"], "R1.1");+        assert_eq!(st["unconnected"], 3);+    } }