forked from 1b-agent/opencadstudio-upstream
feat(clipboard): carry referenced records across drawings on paste
Copy/paste between drawings dropped the entities' layer (and linetype / text + dim style): the clipboard held only the entities, which reference those records by name, so pasting into a drawing without a matching record left the entity dangling on a non-existent layer. (#129) Snapshot the referenced table records from the source drawing at copy time (ClipboardDeps::capture) and, on paste, recreate any the target drawing lacks with a fresh handle (merge_clipboard_deps). A record that already exists by name in the target is left untouched — the target's own definition wins; only missing ones are imported from the source. Same-document pastes are unaffected (every record already exists). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
1 parent
5ce3aaf260
commit
70e73877b2
3 files changed
+132
No files matched your search
@@ -547,6 +547,9 @@ impl OpenCADStudio {
|
||||
let delta = base_pt - self.clipboard_centroid;
|
||||
let translate = crate::command::EntityTransform::Translate(delta);
|
||||
self.push_undo_snapshot(i, "PASTECLIP");
|
||||
// Recreate any layer / linetype / style the copied entities
|
||||
// need but this drawing lacks (cross-drawing paste). (#129)
|
||||
self.merge_clipboard_deps(i);
|
||||
let count = self.clipboard.len();
|
||||
let new_handles: Vec<Handle> = self
|
||||
.clipboard
|
||||
@@ -1675,6 +1678,47 @@ impl OpenCADStudio {
|
||||
}
|
||||
|
||||
/// Restore the tangent-snap / ortho state that was in effect before the command started.
|
||||
/// Recreate clipboard-dependency records (layer / linetype / text + dim
|
||||
/// style) in tab `i`'s document for any the copied entities reference but
|
||||
/// this drawing doesn't already have. Each recreated record gets a fresh
|
||||
/// handle from the target document so it can't collide with an existing
|
||||
/// one. No-op for same-document pastes (the records already exist). (#129)
|
||||
fn merge_clipboard_deps(&mut self, i: usize) {
|
||||
use acadrust::TableEntry;
|
||||
if self.clipboard_deps.is_empty() {
|
||||
return;
|
||||
}
|
||||
let doc = &mut self.tabs[i].scene.document;
|
||||
for rec in &self.clipboard_deps.layers {
|
||||
if !doc.layers.contains(rec.name()) {
|
||||
let mut r = rec.clone();
|
||||
r.set_handle(doc.allocate_handle());
|
||||
let _ = doc.layers.add(r);
|
||||
}
|
||||
}
|
||||
for rec in &self.clipboard_deps.linetypes {
|
||||
if !doc.line_types.contains(rec.name()) {
|
||||
let mut r = rec.clone();
|
||||
r.set_handle(doc.allocate_handle());
|
||||
let _ = doc.line_types.add(r);
|
||||
}
|
||||
}
|
||||
for rec in &self.clipboard_deps.text_styles {
|
||||
if !doc.text_styles.contains(rec.name()) {
|
||||
let mut r = rec.clone();
|
||||
r.set_handle(doc.allocate_handle());
|
||||
let _ = doc.text_styles.add(r);
|
||||
}
|
||||
}
|
||||
for rec in &self.clipboard_deps.dim_styles {
|
||||
if !doc.dim_styles.contains(rec.name()) {
|
||||
let mut r = rec.clone();
|
||||
r.set_handle(doc.allocate_handle());
|
||||
let _ = doc.dim_styles.add(r);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn restore_pre_cmd_tangent(&mut self) {
|
||||
if let Some(was_on) = self.pre_cmd_tangent.take() {
|
||||
if !was_on {
|
||||
|
||||
Reference in new issue
Block a user