mirror of
https://github.com/storytold/cadcraft.git
synced 2026-10-25 19:36:49 -06:00
Squash of PR #632 by @vangel76. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
77 lines
2.8 KiB
Rust
77 lines
2.8 KiB
Rust
//! PURGE removes multiline styles no multiline uses (#626): not STANDARD, not the current
|
|
//! style, not one used by a multiline in model space or in a block that is still inserted.
|
|
|
|
use std::sync::Arc;
|
|
|
|
use cadcraft_engine::Session;
|
|
use cadcraft_engine::doc::{Block, Common, Entity, EntityKind, Handle, Insert, MLine, MLineJust, MLineStyle, Space};
|
|
use cadcraft_engine::geom::{Vec2, Vec3};
|
|
use serde_json::json;
|
|
|
|
fn mline(style: &MLineStyle) -> EntityKind {
|
|
EntityKind::MLine(MLine::new(style, &[Vec2::new(0.0, 0.0), Vec2::new(10.0, 0.0)], false, MLineJust::Zero, 1.0))
|
|
}
|
|
|
|
fn block(name: &str, style: &MLineStyle, handle: u64) -> Arc<Block> {
|
|
let mut b = Block::new(name);
|
|
b.entities.push(Entity::new(Handle(handle), mline(style)));
|
|
Arc::new(b)
|
|
}
|
|
|
|
/// Styles: Model (used in model space), InBlock (used in the inserted block WALLS), Gone (used
|
|
/// only in the unreferenced block OLD), Spare (unused), Current (unused but current).
|
|
fn session() -> Session {
|
|
let mut s = Session::new();
|
|
let d = s.doc_mut().unwrap();
|
|
let style = |n: &str| MLineStyle { name: n.into(), ..MLineStyle::default() };
|
|
for n in ["Model", "InBlock", "Gone", "Spare", "Current"] {
|
|
d.mline_styles.push(style(n));
|
|
}
|
|
d.header.set_str("CMLSTYLE", "Current");
|
|
d.add(&Space::Model, Common::default(), mline(&style("Model"))).unwrap();
|
|
d.blocks.insert("WALLS".into(), block("WALLS", &style("InBlock"), 0x9000));
|
|
d.blocks.insert("OLD".into(), block("OLD", &style("Gone"), 0x9001));
|
|
let ins = Insert {
|
|
block: "WALLS".into(),
|
|
insert: Vec3::ZERO,
|
|
scale: Vec3::new(1.0, 1.0, 1.0),
|
|
rotation: 0.0,
|
|
attribs: Vec::new(),
|
|
cols: 1,
|
|
rows: 1,
|
|
col_spacing: 0.0,
|
|
row_spacing: 0.0,
|
|
};
|
|
d.add(&Space::Model, Common::default(), EntityKind::Insert(ins)).unwrap();
|
|
s
|
|
}
|
|
|
|
fn styles(s: &Session) -> Vec<String> {
|
|
s.doc().unwrap().mline_styles.iter().map(|m| m.name.clone()).collect()
|
|
}
|
|
|
|
#[test]
|
|
fn purge_mlinestyles_keeps_used_standard_and_current() {
|
|
let mut s = session();
|
|
let r = s.execute("purge", &json!({ "type": "mlinestyles" })).unwrap();
|
|
assert_eq!(styles(&s), ["STANDARD", "Model", "InBlock", "Gone", "Current"], "{r}");
|
|
assert_eq!(r["purged"]["mlinestyles"], json!(["Spare"]));
|
|
}
|
|
|
|
#[test]
|
|
fn purge_all_frees_styles_of_purged_blocks() {
|
|
let mut s = session();
|
|
s.script("-PURGE A * N\n").unwrap();
|
|
assert!(s.running.is_none(), "{}", s.prompt_text());
|
|
assert!(s.doc().unwrap().block("OLD").is_none());
|
|
assert_eq!(styles(&s), ["STANDARD", "Model", "InBlock", "Current"], "{:?}", s.log);
|
|
}
|
|
|
|
#[test]
|
|
fn purge_mlinestyles_at_the_command_line() {
|
|
let mut s = session();
|
|
s.script("-PURGE M Sp* N\n").unwrap();
|
|
assert!(s.running.is_none(), "{}", s.prompt_text());
|
|
assert_eq!(styles(&s), ["STANDARD", "Model", "InBlock", "Gone", "Current"]);
|
|
}
|