Layer delete and purge keep layers used by block definitions (#72) (#189)

This commit is contained in:
MarekSpodBiedry authored and GitHub committed 2026-10-10 14:39:28 -04:00
1 parent 9441dad29f
commit e13de2c2f1
2 files changed
+18 -2

No files matched your search

+2 -1
View File
@@ -268,7 +268,8 @@ fn run_purge(s: &mut Session, _p: &Value) -> Result<Value> {
let before_b = d.blocks.len();
d.blocks.retain(|k, _| used.contains(&k.to_ascii_uppercase()));
let blocks = before_b - d.blocks.len();
let used_layers: std::collections::HashSet<String> = all.iter().map(|e| e.common.layer.to_ascii_lowercase()).collect();
// Layers used by the model, layouts and the block definitions that survived above.
let used_layers = super::layer::used_layers(d);
let cur = d.header.str("CLAYER", "0").to_ascii_lowercase();
let before_l = d.layers.len();
d.layers.retain(|l| {
+16 -1
View File
@@ -238,7 +238,8 @@ fn run_delete(s: &mut Session, p: &Value) -> Result<Value> {
return Err(bad("layer.delete", "cannot delete layer 0, Defpoints or the current layer"));
}
let used = d.model.iter().any(|e| e.common.layer.eq_ignore_ascii_case(&name))
|| d.layouts.iter().any(|l| l.entities.iter().any(|e| e.common.layer.eq_ignore_ascii_case(&name)));
|| d.layouts.iter().any(|l| l.entities.iter().any(|e| e.common.layer.eq_ignore_ascii_case(&name)))
|| d.blocks.values().any(|b| b.entities.iter().any(|e| e.common.layer.eq_ignore_ascii_case(&name)));
if used {
return Err(bad("layer.delete", "layer has objects on it"));
}
@@ -438,4 +439,18 @@ mod tests {
s.execute("layer.set", &json!({ "name": "0", "color": 3 })).unwrap();
assert_ne!(s.doc().unwrap().layer("0").unwrap(), &before);
}
#[test]
fn delete_and_purge_keep_layers_used_by_block_definitions() {
let mut s = Session::new();
s.execute("layer.new", &json!({ "name": "A", "color": 1 })).unwrap();
s.execute("layer.current", &json!({ "name": "A" })).unwrap();
let l = s.execute("line", &json!({ "points": [[0, 0], [1, 1]] })).unwrap()["handles"][0].as_str().unwrap().to_string();
s.execute("block", &json!({ "name": "B", "base": [0, 0], "handles": [l], "keep": "delete" })).unwrap();
s.execute("layer.current", &json!({ "name": "0" })).unwrap();
s.execute("insert", &json!({ "name": "B", "at": [5, 5] })).unwrap();
assert!(s.execute("layer.delete", &json!({ "name": "A" })).is_err());
s.execute("purge", &json!({})).unwrap();
assert!(s.doc().unwrap().layer("A").is_some());
}
}