Implement nested object selection and placement for NCOPY

This commit is contained in:
ramox81 committed 2026-09-11 10:23:38 +03:00
1 parent 7d0c059b30
commit f24fdc7965
5 files changed
+189 -36

No files matched your search

+12 -2
View File
@@ -929,6 +929,8 @@ impl OpenCADStudio {
fn apply_cmd_result_inner(&mut self, result: CmdResult) -> Task<Message> {
let i = self.active_tab;
let preserve_commit_style = self.tabs[i].active_cmd.as_ref()
.is_some_and(|command| command.preserve_commit_style());
let preserve_commit_layer = self.tabs[i]
.active_cmd
.as_ref()
@@ -1070,7 +1072,9 @@ impl OpenCADStudio {
.all(|entity| self.delta_add_safe(i, entity));
let pending = self.begin_undo(i, label, entities.len(), delta_safe);
for entity in entities {
if preserve_commit_layer {
if preserve_commit_style {
let _ = self.commit_entity_handle_preserve_style(entity);
} else if preserve_commit_layer {
let _ = self.commit_entity_handle_preserve_layer(entity);
} else {
self.commit_entity(entity);
@@ -1093,7 +1097,13 @@ impl OpenCADStudio {
.all(|entity| self.delta_add_safe(i, entity));
let pending = self.begin_undo(i, label, entities.len(), delta_safe);
for entity in entities {
self.commit_entity(entity);
if preserve_commit_style {
let _ = self.commit_entity_handle_preserve_style(entity);
} else if preserve_commit_layer {
let _ = self.commit_entity_handle_preserve_layer(entity);
} else {
self.commit_entity(entity);
}
}
self.tabs[i].dirty = true;
self.tabs[i].scene.clear_preview_wire();
+5 -34
View File
@@ -654,42 +654,13 @@ impl OpenCADStudio {
}
}
// NCOPY — copy the nested objects of the selected block reference(s)
// into model space, keeping the block (a non-destructive extraction;
// every nested object is copied — the block is not exploded).
"NCOPY" | "NCOPYALL" => {
use crate::modules::draw::modify::explode::explode_entity;
let inserts: Vec<acadrust::Handle> = self.tabs[i]
.scene
.selected_entities()
.iter()
.filter(|(_, e)| matches!(e, acadrust::EntityType::Insert(_)))
.map(|(h, _)| *h)
.filter(|handle| !self.tabs[i].scene.is_layer_locked(*handle))
.collect();
if inserts.is_empty() {
self.command_line
.push_error(crate::t!("NCOPY: select a block reference first.").as_ref());
return Some(Task::none());
}
self.push_undo_snapshot(i, "NCOPY");
let mut n = 0usize;
for h in &inserts {
let nested = match self.tabs[i].scene.document.get_entity(*h).cloned() {
Some(ins) => explode_entity(&ins, &self.tabs[i].scene.document),
None => Vec::new(),
};
for e in nested {
self.tabs[i].scene.add_entity(e);
n += 1;
}
}
self.tabs[i].dirty = true;
self.command_line.push_output(crate::tf!(
"NCOPY: copied {n} nested object(s) into model space (blocks kept)."
).as_ref());
let command = crate::modules::draw::modify::ncopy::NcopyCommand::new(
&self.tabs[i].scene.document,
);
self.command_line.push_info(&command.prompt());
self.tabs[i].active_cmd = Some(Box::new(command));
}
_ => return None,
}
Some(self.finish_dispatch(cmd))