mirror of https://codeberg.org/topola/topola.git
fix(geometry/recording_with_rtree): Some more fixes against bend bbox invalidation
1f8ace9c77 did not fix all the bbox
invalidation problems, hopefully this gets this right now.
This commit is contained in:
parent
f75bae0666
commit
5a0fec9618
|
|
@ -196,8 +196,26 @@ impl<
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn remove_bend(&mut self, bend: BI) {
|
pub fn remove_bend(&mut self, bend: BI) {
|
||||||
|
// Note how we can't use `.modify_bend(...)` to update the envelopes
|
||||||
|
// here because it starts iteration from the bend we currently operate
|
||||||
|
// on, which obviously does not exist after deletion.
|
||||||
|
|
||||||
|
let mut rail = bend;
|
||||||
|
|
||||||
|
while let Some(outer) = self.geometry.outer(rail) {
|
||||||
|
Self::rtree_remove_must_be_successful(self.rtree.remove(&self.make_bend_bbox(outer)));
|
||||||
|
rail = outer;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut maybe_rail = self.geometry.outer(bend);
|
||||||
|
|
||||||
Self::rtree_remove_must_be_successful(self.rtree.remove(&self.make_bend_bbox(bend)));
|
Self::rtree_remove_must_be_successful(self.rtree.remove(&self.make_bend_bbox(bend)));
|
||||||
self.geometry.remove_primitive(bend.into());
|
self.geometry.remove_primitive(bend.into());
|
||||||
|
|
||||||
|
while let Some(outer) = maybe_rail {
|
||||||
|
self.rtree.insert(self.make_bend_bbox(outer));
|
||||||
|
maybe_rail = Some(outer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn remove_compound(&mut self, compound: GenericIndex<CW>) {
|
pub fn remove_compound(&mut self, compound: GenericIndex<CW>) {
|
||||||
|
|
@ -230,23 +248,9 @@ impl<
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn shift_bend(&mut self, bend: BI, offset: f64) {
|
pub fn shift_bend(&mut self, bend: BI, offset: f64) {
|
||||||
let mut rail = bend;
|
self.modify_bend(bend, |geometry, bend| {
|
||||||
|
geometry.shift_bend(bend, offset);
|
||||||
while let Some(outer) = self.geometry.outer(rail) {
|
});
|
||||||
Self::rtree_remove_must_be_successful(self.rtree.remove(&self.make_bend_bbox(outer)));
|
|
||||||
rail = outer;
|
|
||||||
}
|
|
||||||
|
|
||||||
Self::rtree_remove_must_be_successful(self.rtree.remove(&self.make_bend_bbox(bend)));
|
|
||||||
self.geometry.shift_bend(bend, offset);
|
|
||||||
self.rtree.insert(self.make_bend_bbox(bend));
|
|
||||||
|
|
||||||
rail = bend;
|
|
||||||
|
|
||||||
while let Some(outer) = self.geometry.outer(rail) {
|
|
||||||
self.rtree.insert(self.make_bend_bbox(outer));
|
|
||||||
rail = outer;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn flip_bend(&mut self, bend: BI) {
|
pub fn flip_bend(&mut self, bend: BI) {
|
||||||
|
|
@ -255,6 +259,15 @@ impl<
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn reattach_bend(&mut self, bend: BI, maybe_new_inner: Option<BI>) {
|
pub fn reattach_bend(&mut self, bend: BI, maybe_new_inner: Option<BI>) {
|
||||||
|
self.modify_bend(bend, |geometry, bend| {
|
||||||
|
geometry.reattach_bend(bend, maybe_new_inner);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fn modify_bend<F>(&mut self, bend: BI, f: F)
|
||||||
|
where
|
||||||
|
F: FnOnce(&mut Geometry<PW, DW, SW, BW, CW, Cel, PI, DI, SI, BI>, BI),
|
||||||
|
{
|
||||||
let mut rail = bend;
|
let mut rail = bend;
|
||||||
|
|
||||||
while let Some(outer) = self.geometry.outer(rail) {
|
while let Some(outer) = self.geometry.outer(rail) {
|
||||||
|
|
@ -263,7 +276,9 @@ impl<
|
||||||
}
|
}
|
||||||
|
|
||||||
Self::rtree_remove_must_be_successful(self.rtree.remove(&self.make_bend_bbox(bend)));
|
Self::rtree_remove_must_be_successful(self.rtree.remove(&self.make_bend_bbox(bend)));
|
||||||
self.geometry.reattach_bend(bend, maybe_new_inner);
|
|
||||||
|
f(&mut self.geometry, bend);
|
||||||
|
|
||||||
self.rtree.insert(self.make_bend_bbox(bend));
|
self.rtree.insert(self.make_bend_bbox(bend));
|
||||||
|
|
||||||
rail = bend;
|
rail = bend;
|
||||||
|
|
@ -506,8 +521,8 @@ impl<
|
||||||
}
|
}
|
||||||
|
|
||||||
// Because removal of a bend will invalidate bboxes of the bends wrapped
|
// Because removal of a bend will invalidate bboxes of the bends wrapped
|
||||||
// around it, we first remove the bends from the R-tree, and their nodes
|
// around it, we first remove all the edited bends from the R-tree, and
|
||||||
// from the graph only afterwards.
|
// their nodes from the graph only afterwards.
|
||||||
for (bend, (maybe_old_data, ..)) in &edit.bends {
|
for (bend, (maybe_old_data, ..)) in &edit.bends {
|
||||||
if maybe_old_data.is_some() {
|
if maybe_old_data.is_some() {
|
||||||
Self::rtree_remove_must_be_successful(
|
Self::rtree_remove_must_be_successful(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue