From c1880cfbb3c1e606d80e0f6cf8552691652d0400 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Sat, 25 Oct 2025 00:32:28 +0200 Subject: [PATCH] fix(board/edit): Record changes to pin nodes too, which was something I forgot --- src/bimapset.rs | 2 +- src/board/edit.rs | 8 ++++- src/board/mod.rs | 79 +++++++++++++++++++++++++++++++++++++---------- 3 files changed, 71 insertions(+), 18 deletions(-) diff --git a/src/bimapset.rs b/src/bimapset.rs index 3de9dfb..25a3693 100644 --- a/src/bimapset.rs +++ b/src/bimapset.rs @@ -11,7 +11,7 @@ use std::{ /// /// - Each key can have multiple associated values (`BTreeSet`). /// - Each value maps to exactly one key (i.e., it's unique across keys). -#[derive(Debug)] +#[derive(Clone, Debug, Default)] pub struct BiBTreeMapSet { key_to_values: BTreeMap>, // Forward mapping: key -> set of values. value_to_key: BTreeMap, // Reverse mapping: value -> key. diff --git a/src/board/edit.rs b/src/board/edit.rs index b56c6c2..abb4093 100644 --- a/src/board/edit.rs +++ b/src/board/edit.rs @@ -5,12 +5,16 @@ use std::collections::BTreeMap; use crate::{ - board::BandName, drawing::band::BandUid, geometry::edit::Edit, layout::LayoutEdit, + board::BandName, + drawing::band::BandUid, + geometry::edit::Edit, + layout::{LayoutEdit, NodeIndex}, router::ng::EtchedPath, }; #[derive(Debug, Clone, Default)] pub struct BoardDataEdit { + pub(super) pinname_nodes: BTreeMap, Option)>, pub(super) bands_by_id: BTreeMap, Option)>, pub(super) bands_by_name: BTreeMap, Option)>, } @@ -23,11 +27,13 @@ impl BoardDataEdit { impl Edit for BoardDataEdit { fn reverse_inplace(&mut self) { + self.pinname_nodes.reverse_inplace(); self.bands_by_id.reverse_inplace(); self.bands_by_name.reverse_inplace(); } fn merge(&mut self, edit: Self) { + self.pinname_nodes.merge(edit.pinname_nodes); self.bands_by_id.merge(edit.bands_by_id); self.bands_by_name.merge(edit.bands_by_name); } diff --git a/src/board/mod.rs b/src/board/mod.rs index 37ebb56..942a0f5 100644 --- a/src/board/mod.rs +++ b/src/board/mod.rs @@ -81,10 +81,10 @@ impl<'a> ResolvedSelector<'a> { #[derive(Debug, Getters)] pub struct Board { layout: Layout, - bands_by_id: BiBTreeMap, - // TODO: Simplify access logic to these members so that `#[getter(skip)]`s can be removed. #[getter(skip)] pinname_nodes: BiBTreeMapSet, + bands_by_id: BiBTreeMap, + // TODO: Simplify access logic to these members so that `#[getter(skip)]`s can be removed. #[getter(skip)] band_bandname: BiBTreeMap, } @@ -117,8 +117,11 @@ impl Board { if let Some(pin) = maybe_pin { for dot in dots.clone() { - self.pinname_nodes - .insert(pin.clone(), GenericNode::Primitive(dot.into())); + self.insert_pinname_node( + &mut recorder.board_data_edit, + pin.clone(), + GenericNode::Primitive(dot.into()), + ); } } @@ -132,8 +135,10 @@ impl Board { dots: Vec, ) { for dot in dots.clone() { - self.pinname_nodes - .remove_by_value(&GenericNode::Primitive(dot.into())); + self.remove_pinname_node( + &mut recorder.board_data_edit, + GenericNode::Primitive(dot.into()), + ); } self.layout.remove_via(&mut recorder.layout_edit, via, dots); @@ -153,8 +158,11 @@ impl Board { .add_fixed_dot_infringably(&mut recorder.layout_edit, weight); if let Some(pin) = maybe_pin { - self.pinname_nodes - .insert(pin, GenericNode::Primitive(dot.into())); + self.insert_pinname_node( + &mut recorder.board_data_edit, + pin, + GenericNode::Primitive(dot.into()), + ); } dot @@ -176,8 +184,11 @@ impl Board { .add_fixed_seg_infringably(&mut recorder.layout_edit, from, to, weight); if let Some(pin) = maybe_pin { - self.pinname_nodes - .insert(pin, GenericNode::Primitive(seg.into())); + self.insert_pinname_node( + &mut recorder.board_data_edit, + pin, + GenericNode::Primitive(seg.into()), + ); } seg @@ -200,15 +211,24 @@ impl Board { if let Some(pin) = maybe_pin { for i in nodes { - self.pinname_nodes - .insert(pin.clone(), GenericNode::Primitive(*i)); + self.insert_pinname_node( + &mut recorder.board_data_edit, + pin.clone(), + GenericNode::Primitive(*i), + ); } - self.pinname_nodes - .insert(pin.clone(), GenericNode::Primitive(apex.into())); + self.insert_pinname_node( + &mut recorder.board_data_edit, + pin.clone(), + GenericNode::Primitive(apex.into()), + ); - self.pinname_nodes - .insert(pin, GenericNode::Compound(poly.into())); + self.insert_pinname_node( + &mut recorder.board_data_edit, + pin, + GenericNode::Compound(poly.into()), + ); } poly @@ -371,7 +391,28 @@ impl Board { .copied() } + fn insert_pinname_node( + &mut self, + recorder: &mut BoardDataEdit, + pinname: String, + node: NodeIndex, + ) { + self.pinname_nodes.insert(pinname.clone(), node); + recorder.pinname_nodes.insert(node, (None, Some(pinname))); + } + + fn remove_pinname_node(&mut self, recorder: &mut BoardDataEdit, node: NodeIndex) { + let prev = self.pinname_nodes.remove_by_value(&node); + recorder.pinname_nodes.insert(node, (prev, None)); + } + pub fn apply_edit(&mut self, edit: &BoardEdit) { + for (node, (maybe_old_pinname, _)) in &edit.board_data_edit.pinname_nodes { + if maybe_old_pinname.is_some() { + self.pinname_nodes.remove_by_value(node); + } + } + for (bandname, (maybe_old_band_uid, _)) in &edit.board_data_edit.bands_by_name { if maybe_old_band_uid.is_some() { self.band_bandname.remove_by_right(bandname); @@ -397,6 +438,12 @@ impl Board { self.bands_by_id.insert(*ep, *band_uid); } } + + for (node, (_, maybe_new_pinname)) in &edit.board_data_edit.pinname_nodes { + if let Some(pinname) = maybe_new_pinname { + self.pinname_nodes.insert(pinname.clone(), *node); + } + } } /// Returns the mesadata associated with the layout's drawing rules.