forked from 1b-agent/opencadstudio-upstream
fix(block-editor): preserve legacy basepoint preview
This commit is contained in:
1 parent
80366d411f
commit
f74e1e8bd3
1 file changed
+42
-1
@@ -39,9 +39,19 @@ impl CadCommand for EditCommand {
|
|||||||
if edit::move_part(&mut staged, self.definition, self.handle, self.part, at).is_err() {
|
if edit::move_part(&mut staged, self.definition, self.handle, self.part, at).is_err() {
|
||||||
return Vec::new();
|
return Vec::new();
|
||||||
}
|
}
|
||||||
|
// A legacy block basepoint is represented by the definition handle.
|
||||||
|
// Moving it materializes a native BasePointParameter with its own
|
||||||
|
// handle, so resolve that replacement when producing the preview.
|
||||||
|
let preview_handle = if self.handle == self.definition {
|
||||||
|
crate::scene::block_basepoint::parameter(&staged, self.definition)
|
||||||
|
.map(|(handle, _)| handle)
|
||||||
|
.unwrap_or(self.handle)
|
||||||
|
} else {
|
||||||
|
self.handle
|
||||||
|
};
|
||||||
let Some(item) = edit::items(&staged, self.definition)
|
let Some(item) = edit::items(&staged, self.definition)
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.find(|item| item.handle == self.handle)
|
.find(|item| item.handle == preview_handle)
|
||||||
else {
|
else {
|
||||||
return Vec::new();
|
return Vec::new();
|
||||||
};
|
};
|
||||||
@@ -380,3 +390,34 @@ impl OpenCADStudio {
|
|||||||
Task::none()
|
Task::none()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn legacy_basepoint_preview_follows_materialized_parameter() {
|
||||||
|
let mut scene = crate::scene::Scene::new();
|
||||||
|
scene.define_block_raw(
|
||||||
|
"PREVIEW_BASEPOINT",
|
||||||
|
codec::types::Vector3::new(2.0, 3.0, 0.0),
|
||||||
|
vec![codec::EntityType::Line(codec::entities::Line::from_points(
|
||||||
|
codec::types::Vector3::ZERO,
|
||||||
|
codec::types::Vector3::new(1.0, 0.0, 0.0),
|
||||||
|
))],
|
||||||
|
);
|
||||||
|
let definition = scene.document.block_records.get("PREVIEW_BASEPOINT").unwrap().handle;
|
||||||
|
assert!(crate::scene::block_basepoint::parameter(&scene.document, definition).is_none());
|
||||||
|
let mut command = EditCommand {
|
||||||
|
document: 1,
|
||||||
|
definition,
|
||||||
|
handle: definition,
|
||||||
|
part: Part::Point,
|
||||||
|
document_snapshot: scene.document.clone(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let preview = command.on_preview_wires(DVec3::new(4.0, 5.0, 0.0));
|
||||||
|
|
||||||
|
assert!(!preview.is_empty());
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user