forked from 1b-agent/opencadstudio-upstream
feat(layout): copy a layout from its tab menu (#1822)
The layout tab's right-click menu gains New Layout, Copy, Page Setup and Plot beside Rename and Delete. Copy makes "<name> (2)" with the source's page setup, sheet view and every paper-space object, viewports included, and opens it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
38d81bf838
commit
0126ea212f
28 files changed
+172
-16
No files matched your search
@@ -32,6 +32,78 @@ impl Scene {
|
||||
Ok(handle)
|
||||
}
|
||||
|
||||
/// Give layout `name` the page of layout `source`: its page setup,
|
||||
/// limits and UCS, and the sheet viewport's view. It opens as it is, so
|
||||
/// it does not get the first viewport a new layout gets. The paper-space
|
||||
/// objects are copied by the caller.
|
||||
pub fn copy_layout_page(&mut self, source: &str, name: &str) {
|
||||
let find = |document: &codec::CadDocument, wanted: &str| {
|
||||
document.objects.values().find_map(|object| match object {
|
||||
ObjectType::Layout(layout) if layout.name == wanted => Some(layout.clone()),
|
||||
_ => None,
|
||||
})
|
||||
};
|
||||
let (Some(from), Some(to)) = (find(&self.document, source), find(&self.document, name))
|
||||
else {
|
||||
return;
|
||||
};
|
||||
if let Some(ObjectType::Layout(layout)) = self.document.objects.get_mut(&to.handle) {
|
||||
*layout = codec::objects::Layout {
|
||||
handle: to.handle,
|
||||
owner: to.owner,
|
||||
name: to.name.clone(),
|
||||
tab_order: to.tab_order,
|
||||
block_record: to.block_record,
|
||||
viewport: to.viewport,
|
||||
viewports: to.viewports.clone(),
|
||||
reactors: to.reactors.clone(),
|
||||
xdictionary_handle: to.xdictionary_handle,
|
||||
..from.clone()
|
||||
};
|
||||
}
|
||||
if let Some(EntityType::Viewport(sheet)) = self.document.get_entity(from.viewport).cloned()
|
||||
{
|
||||
if let Some(EntityType::Viewport(target)) = self.document.get_entity_mut(to.viewport) {
|
||||
*target = codec::entities::Viewport {
|
||||
common: target.common.clone(),
|
||||
..sheet
|
||||
};
|
||||
}
|
||||
}
|
||||
self.unopened_layouts.remove(name);
|
||||
self.bump_layout_epoch();
|
||||
}
|
||||
|
||||
/// The paper-space objects of layout `name`, without its sheet viewport.
|
||||
pub fn layout_paper_entities(&self, name: &str) -> Vec<Handle> {
|
||||
let Some((record, sheet)) = self.document.objects.values().find_map(|object| match object {
|
||||
ObjectType::Layout(layout) if layout.name == name => {
|
||||
Some((layout.block_record, layout.viewport))
|
||||
}
|
||||
_ => None,
|
||||
}) else {
|
||||
return Vec::new();
|
||||
};
|
||||
self.document
|
||||
.block_records
|
||||
.iter()
|
||||
.find(|br| br.handle == record)
|
||||
.map(|br| {
|
||||
br.entity_handles
|
||||
.iter()
|
||||
.copied()
|
||||
.filter(|handle| *handle != sheet)
|
||||
.filter(|handle| {
|
||||
!matches!(
|
||||
self.document.get_entity(*handle),
|
||||
None | Some(EntityType::Block(_) | EntityType::BlockEnd(_))
|
||||
)
|
||||
})
|
||||
.collect()
|
||||
})
|
||||
.unwrap_or_default()
|
||||
}
|
||||
|
||||
/// Rename a paper-space layout. Updates the Layout object name in the document.
|
||||
pub fn rename_layout(&mut self, old_name: &str, new_name: &str) {
|
||||
for obj in self.document.objects.values_mut() {
|
||||
|
||||
Reference in new issue
Block a user