From 0af477544d2979afc0d602323508bf0500542b89 Mon Sep 17 00:00:00 2001
From: ramox81 <184937705+ramox81@users.noreply.github.com>
Date: Fri, 11 Sep 2026 09:33:04 +0300
Subject: [PATCH] Expose Copy Nested Objects in the Modify extension
---
assets/icons/modify_ncopy.svg | 1 +
src/app/commands/blocks.rs | 7 +++++++
src/ui/ribbon/modify_tools/11_ncopy.rs | 6 ++++++
3 files changed, 14 insertions(+)
create mode 100644 assets/icons/modify_ncopy.svg
create mode 100644 src/ui/ribbon/modify_tools/11_ncopy.rs
diff --git a/assets/icons/modify_ncopy.svg b/assets/icons/modify_ncopy.svg
new file mode 100644
index 000000000..a7ce9f0ba
--- /dev/null
+++ b/assets/icons/modify_ncopy.svg
@@ -0,0 +1 @@
+
diff --git a/src/app/commands/blocks.rs b/src/app/commands/blocks.rs
index d020e42cc..50f4aedbc 100644
--- a/src/app/commands/blocks.rs
+++ b/src/app/commands/blocks.rs
@@ -659,6 +659,13 @@ impl OpenCADStudio {
// every nested object is copied — the block is not exploded).
"NCOPY" | "NCOPYALL" => {
use crate::modules::draw::modify::explode::explode_entity;
+ if cmd == "NCOPY" && self.tabs[i].scene.selected.is_empty() {
+ use crate::modules::draw::select::SelectObjectsCommand;
+ let selection = SelectObjectsCommand::new("NCOPY");
+ self.command_line.push_info(&selection.prompt());
+ self.tabs[i].active_cmd = Some(Box::new(selection));
+ return Some(self.finish_dispatch(cmd));
+ }
let inserts: Vec = self.tabs[i]
.scene
.selected_entities()
diff --git a/src/ui/ribbon/modify_tools/11_ncopy.rs b/src/ui/ribbon/modify_tools/11_ncopy.rs
new file mode 100644
index 000000000..e926ce540
--- /dev/null
+++ b/src/ui/ribbon/modify_tools/11_ncopy.rs
@@ -0,0 +1,6 @@
+Tool {
+ command: "NCOPY",
+ label: "Copy Nested Objects",
+ icon: include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/assets/icons/modify_ncopy.svg")),
+ options: &[],
+}