Preserve authored sizes during identity placement transfer
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user