Files
OneCAD-Draft/src/modules/insert/wblock.rs
T
2026-05-12 10:36:15 +03:00

107 lines
3.5 KiB
Rust

// WBLOCK — write a block (or selected entities) to an external DWG/DXF file.
//
// Two modes:
// block name → copies the named block definition to a new document
// * → copies currently selected model-space entities
use acadrust::{CadDocument, EntityType};
use crate::modules::{IconKind, ModuleEvent, ToolDef};
#[allow(dead_code)]
pub fn tool() -> ToolDef {
ToolDef {
id: "WBLOCK",
label: "Write Block",
icon: IconKind::Svg(include_bytes!("../../../assets/icons/blocks/insert.svg")),
event: ModuleEvent::Command("WBLOCK".to_string()),
}
}
/// Build a standalone `CadDocument` containing the named block's entities
/// extracted into model space.
///
/// Returns `Err` if the block is not found or has no entities.
pub fn extract_block_to_doc(src: &CadDocument, block_name: &str) -> Result<CadDocument, String> {
let br = src
.block_records
.get(block_name)
.ok_or_else(|| format!("Block \"{block_name}\" not found."))?;
let handles = br.entity_handles.clone();
if handles.is_empty() {
return Err(format!("Block \"{block_name}\" has no entities."));
}
let mut out = CadDocument::new();
// Copy layers referenced by the block entities.
for h in &handles {
if let Some(e) = src.get_entity(*h) {
let layer = e.common().layer.clone();
if !layer.is_empty() && !layer.eq("0") && out.layers.get(&layer).is_none() {
if let Some(src_layer) = src.layers.get(&layer) {
let _ = out.layers.add(src_layer.clone());
}
}
}
}
for h in handles {
if let Some(entity) = src.get_entity(h) {
if matches!(entity, EntityType::Block(_) | EntityType::BlockEnd(_)) {
continue;
}
let mut clone = entity.clone();
clone.common_mut().handle = acadrust::types::Handle::NULL;
clone.common_mut().owner_handle = acadrust::types::Handle::NULL;
let _ = out.add_entity(clone);
}
}
if out.entities().count() == 0 {
return Err(format!(
"Block \"{block_name}\" produced no exportable entities."
));
}
Ok(out)
}
/// Build a standalone `CadDocument` from an explicit list of entity handles
/// (the "selected entities" mode, `*`).
pub fn extract_entities_to_doc(
src: &CadDocument,
handles: &[acadrust::Handle],
) -> Result<CadDocument, String> {
if handles.is_empty() {
return Err("No entities selected for WBLOCK.".into());
}
let mut out = CadDocument::new();
for &h in handles {
if let Some(entity) = src.get_entity(h) {
if matches!(entity, EntityType::Block(_) | EntityType::BlockEnd(_)) {
continue;
}
// Copy layer definition.
let layer = entity.common().layer.clone();
if !layer.is_empty() && !layer.eq("0") && out.layers.get(&layer).is_none() {
if let Some(src_layer) = src.layers.get(&layer) {
let _ = out.layers.add(src_layer.clone());
}
}
let mut clone = entity.clone();
clone.common_mut().handle = acadrust::types::Handle::NULL;
clone.common_mut().owner_handle = acadrust::types::Handle::NULL;
let _ = out.add_entity(clone);
}
}
if out.entities().count() == 0 {
return Err("None of the selected entities could be exported.".into());
}
Ok(out)
}