feat: preserve adaptive sketch profiles and curved modeling workflows

This commit is contained in:
bherbruck committed 2026-10-11 09:06:25 -04:00
1 parent 4c4a0449a4
commit 4e595deff2
62 files changed
+7114 -362

No files matched your search

+21 -1
View File
@@ -873,7 +873,7 @@ fn arc_center(s: &mut Session, p: &Value) -> Result<Value> {
let end = c.pos() + Vec2::from_angle((a.pos() - c.pos()).angle() + sw.to_radians()) * a.pos().dist(c.pos());
let cid = match &id {
Some(i) => i.clone(),
None => sk.fresh("a"),
None => sk.fresh("a")?,
};
let ai = match a.idx() {
Some(i) => i,
@@ -1748,6 +1748,26 @@ fn sketch_delete(s: &mut Session, p: &Value) -> Result<Value> {
return Err(bad(cmd, format!("unknown sketch entity `{id}`")));
}
}
let selected_curves = curves.iter().copied().collect::<std::collections::BTreeSet<_>>();
let selected_points = points.iter().copied().collect::<std::collections::BTreeSet<_>>();
let removed = sk
.curves
.iter()
.enumerate()
.filter(|(index, curve)| selected_curves.contains(index) || curve.kind.point_ids().iter().any(|point| selected_points.contains(point)))
.map(|(_, curve)| curve.id.as_str())
.collect::<std::collections::BTreeSet<_>>();
for offset in &sk.offsets {
let Some(topology) = &offset.topology else { continue };
if offset.outputs.iter().any(|id| removed.contains(id.as_str()))
&& topology
.roles
.iter()
.any(|role| !role.retired && role.kind == solvecraft_sketch::OffsetRoleKind::Arc && !removed.contains(role.output.as_str()))
{
return Err(bad(cmd, "break the offset association before deleting only part of its curved boundary"));
}
}
sk.constraints.retain(|c| !cons.contains(&c.id));
let pids: Vec<String> = points.iter().filter_map(|q| sk.points.get(*q).map(|x| x.id.clone())).collect();
sk.remove_curves(&curves);