Preserve authored sizes during identity placement transfer

This commit is contained in:
2026-09-24 20:18:39 -07:00
parent 8a2010d8a6
commit fc5c22c903
2 changed files with 28 additions and 3 deletions
+21 -3
View File
@@ -899,19 +899,26 @@ fn import_placement(
}
let mut after = original.clone();
let ad = after.diagrams.get_mut(&diagram).unwrap();
let intended: BTreeMap<_, _> = plan
.nodes
.iter()
.map(|node| (node.id, (node.position, node.size)))
.collect();
for node in plan.nodes {
let placed = ad
.nodes
.get_mut(&node.id)
.ok_or_else(|| fail("Projected node is not stored"))?;
let projected_size = view.nodes.iter().find(|n| n.id == node.id).unwrap().size;
if placed.collapsed {
let compact = view.nodes.iter().find(|n| n.id == node.id).unwrap().size;
if node.size != compact {
if node.size != projected_size {
return Err(fail(
"Collapsed placement plan must retain exact projected compact size; stored expanded size is preserved",
));
}
} else {
} else if node.size != projected_size {
// Unchanged effective size must not bake derived projection minima
// into authored geometry during an identity transfer.
placed.size = node.size;
}
placed.position = node.position;
@@ -956,6 +963,17 @@ fn import_placement(
}
}
validate_candidate(&after)?;
let final_view = projection::project_view(&after, diagram);
if final_view.nodes.len() != intended.len()
|| final_view
.nodes
.iter()
.any(|node| intended.get(&node.id) != Some(&(node.position, node.size)))
{
return Err(fail(
"Final Rust projection differs from intended node geometry",
));
}
Ok(after)
}
fn import_placement_cli(