forked from 1b-agent/opencadstudio-upstream
feat: WBLOCK — write block or selected entities to external file
- src/modules/insert/wblock.rs: extract_block_to_doc() copies a named block's entities into a fresh CadDocument; extract_entities_to_doc() does the same for a selection set; layer definitions are carried over - WBLOCK <name> writes the named block; WBLOCK * writes selected entities - WblockSave / WblockSaveResult messages drive the async save-dialog flow - ROADMAP.md: 1.10 WBLOCK marked ✅ Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
This commit is contained in:
1 parent
64837e9aed
commit
b15be3af3d
6 files changed
+176
-2
No files matched your search
@@ -422,6 +422,23 @@ impl H7CAD {
|
||||
return Task::done(Message::XAttachPick);
|
||||
}
|
||||
|
||||
cmd if cmd == "WBLOCK" || cmd == "WB" || cmd.starts_with("WBLOCK ") => {
|
||||
let arg = cmd.splitn(2, ' ').nth(1).unwrap_or("").trim();
|
||||
if arg.is_empty() {
|
||||
// No argument: use selected entities (*) if any, else ask.
|
||||
let sel: Vec<_> = self.tabs[i].scene.selected.iter().copied().collect();
|
||||
if sel.is_empty() {
|
||||
self.command_line.push_error(
|
||||
"WBLOCK Select entities first, or: WBLOCK <block name> or WBLOCK *",
|
||||
);
|
||||
} else {
|
||||
return Task::done(Message::WblockSave("*".to_string()));
|
||||
}
|
||||
} else {
|
||||
return Task::done(Message::WblockSave(arg.to_string()));
|
||||
}
|
||||
}
|
||||
|
||||
"XREF" | "XR" => {
|
||||
// List all xref blocks in the current drawing.
|
||||
let xrefs: Vec<String> = self.tabs[i]
|
||||
|
||||
@@ -417,6 +417,11 @@ pub enum Message {
|
||||
XAttachPick,
|
||||
/// Result of the XATTACH file picker.
|
||||
XAttachPickResult(Result<std::path::PathBuf, String>),
|
||||
// ── WBLOCK ────────────────────────────────────────────────────────────
|
||||
/// Trigger the WBLOCK save dialog for `block_name` (or `*` = selection).
|
||||
WblockSave(String),
|
||||
/// Result of the WBLOCK save path dialog.
|
||||
WblockSaveResult(String, Option<std::path::PathBuf>),
|
||||
}
|
||||
|
||||
impl H7CAD {
|
||||
|
||||
@@ -163,6 +163,50 @@ impl H7CAD {
|
||||
Task::none()
|
||||
}
|
||||
|
||||
Message::WblockSave(block_name) => {
|
||||
let name = block_name.clone();
|
||||
Task::perform(
|
||||
async move {
|
||||
let path = crate::io::pick_save_path().await;
|
||||
(name, path)
|
||||
},
|
||||
|(name, path)| Message::WblockSaveResult(name, path),
|
||||
)
|
||||
}
|
||||
|
||||
Message::WblockSaveResult(block_name, Some(path)) => {
|
||||
let i = self.active_tab;
|
||||
let result = if block_name == "*" {
|
||||
let handles: Vec<_> = self.tabs[i].scene.selected.iter().copied().collect();
|
||||
crate::modules::insert::wblock::extract_entities_to_doc(
|
||||
&self.tabs[i].scene.document,
|
||||
&handles,
|
||||
)
|
||||
} else {
|
||||
crate::modules::insert::wblock::extract_block_to_doc(
|
||||
&self.tabs[i].scene.document,
|
||||
&block_name,
|
||||
)
|
||||
};
|
||||
match result {
|
||||
Ok(doc) => match crate::io::save(&doc, &path) {
|
||||
Ok(()) => {
|
||||
let fname = path
|
||||
.file_name()
|
||||
.map(|n| n.to_string_lossy().into_owned())
|
||||
.unwrap_or_else(|| path.to_string_lossy().into_owned());
|
||||
self.command_line
|
||||
.push_output(&format!("WBLOCK Saved \"{block_name}\" → \"{fname}\""));
|
||||
}
|
||||
Err(e) => self.command_line.push_error(&format!("WBLOCK save failed: {e}")),
|
||||
},
|
||||
Err(e) => self.command_line.push_error(&format!("WBLOCK: {e}")),
|
||||
}
|
||||
Task::none()
|
||||
}
|
||||
|
||||
Message::WblockSaveResult(_, None) => Task::none(),
|
||||
|
||||
Message::SaveFile => {
|
||||
let i = self.active_tab;
|
||||
if let Some(path) = &self.tabs[i].current_path {
|
||||
|
||||
Reference in new issue
Block a user