Sweep spatial profiles as surfaces, keep swept surfaces linked to expressions

A closed 3D polyline profile that does not lie in one plane sweeps a
surface with the reference's refusals. Swept surfaces made with an
Expression scale or twist follow the named parameters, and reference
surfaces linked through their associative action are picked up on open.
Saving keeps the associative actions the constraint graph does not
rebuild and stores each scope network through its own dictionary.
Kernel 23138fc, codec 64fe2a6.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ramox81andClaude Opus 5.5 committed 2026-10-07 16:47:30 +03:00
1 parent 0c3ca96822
commit 07499968d8
11 files changed
+444 -24

No files matched your search

+1
View File
@@ -448,6 +448,7 @@ impl OpenCADStudio {
/// table, so unlike that whole-table Apply this can cheaply scope the
/// re-solve to just the entities that actually reference it.
fn resolve_named_parameter_edit(&mut self, i: usize, name: &str) {
self.tabs[i].scene.refresh_expression_sweeps();
let readers: Vec<&crate::scene::parametric_constraints::ParametricConstraint> = self
.tabs[i]
.scene
+9 -1
View File
@@ -459,6 +459,7 @@ impl OpenCADStudio {
mode,
options,
color: _,
expressions,
} = result
else {
unreachable!("router only routes the matching variant");
@@ -501,6 +502,11 @@ impl OpenCADStudio {
// reference does.
let result = (|| -> Result<_, Option<u32>> {
let (path, options) = path.as_ref().zip(options).ok_or(None)?;
if sweep_model::spatial_profile(&profile).is_some() {
let record = sweep_model::spatial_sweep_record(&profile, path, options)?;
let body = kernel::acis::rebuild_sweep_with_mode(&record, true).map_err(|_| None)?;
return Ok((body, record, true));
}
let mut record = sweep_model::sweep_record(&profile, path, options).ok_or(None)?;
record.flags_294_296[0] |= picked_base;
let (_, _, closed) = kernel::acis::sweep_profile_geometry(
@@ -533,7 +539,9 @@ impl OpenCADStudio {
continue;
}
let created = if surface {
self.add_surface_model(sweep_model::swept_surface_entity(&record), body)
let mut entity = sweep_model::swept_surface_entity(&record);
sweep_model::link_sweep_expressions(&mut entity, &expressions);
self.add_surface_model(entity, body)
} else {
self.add_solid_model(
empty_solid3d(),
+1
View File
@@ -904,6 +904,7 @@ mod delobj_tests {
mode,
options: crate::command::SweepOptions::default(),
color: [1.0; 4],
expressions: [None, None],
});
let created = app.tabs[i]