UPDATEFIELD: count fields as the reference does

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ramox81andClaude Opus 5.5 committed 2026-10-07 10:24:35 +03:00
1 parent 7a8ec02003
commit 6da3fea563
2 files changed
+23 -18

No files matched your search

+18 -14
View File
@@ -546,6 +546,9 @@ impl OpenCADStudio {
/// its attributes and the texts of its block definition; a table, the /// its attributes and the texts of its block definition; a table, the
/// cell texts of its drawing (its `*T` block). /// cell texts of its drawing (its `*T` block).
fn update_fields(&mut self, i: usize, handles: &[Handle]) { fn update_fields(&mut self, i: usize, handles: &[Handle]) {
if handles.is_empty() {
return;
}
let doc = &self.tabs[i].scene.document; let doc = &self.tabs[i].scene.document;
let mut hosts = handles.to_vec(); let mut hosts = handles.to_vec();
for h in handles { for h in handles {
@@ -572,25 +575,26 @@ impl OpenCADStudio {
}) })
.flatten() .flatten()
.collect(); .collect();
let found = hosts let hosting = hosts.iter().any(|h| match doc.get_entity(*h) {
.iter() Some(entity) => crate::entities::field::hosts_field(doc, entity),
.filter(|h| match doc.get_entity(**h) { None => attributes
Some(entity) => crate::entities::field::hosts_field(doc, entity), .iter()
None => attributes.iter().any(|common| { .any(|common| common.handle == *h && crate::entities::field::common_hosts_field(doc, common)),
common.handle == **h && crate::entities::field::common_hosts_field(doc, common) });
}), if !hosting {
}) self.command_line.push_output(&crate::tf!("{found} field(s) found.", found = 0));
.count(); self.command_line.push_output(&crate::tf!("{updated} field(s) updated.", updated = 0));
self.command_line.push_output(&crate::tf!("{found} field(s) found."));
if found == 0 {
return; return;
} }
// The reference counts fields, not the texts holding them, and
// reports every field it evaluated as updated, changed or not.
self.push_undo_snapshot(i, "UPDATEFIELD"); self.push_undo_snapshot(i, "UPDATEFIELD");
let updated = self.tabs[i].scene.update_fields(32, Some(&hosts)); let (changed, found) = self.tabs[i].scene.update_fields(32, Some(&hosts));
if updated > 0 { if changed > 0 {
self.tabs[i].dirty = true; self.tabs[i].dirty = true;
} }
self.command_line.push_output(&crate::tf!("{updated} field(s) updated.")); self.command_line.push_output(&crate::tf!("{found} field(s) found."));
self.command_line.push_output(&crate::tf!("{updated} field(s) updated.", updated = found));
} }
/// A count table at `point`: `Item` | `Count`, one row per block (all /// A count table at `point`: `Item` | `Count`, one row per block (all
+5 -4
View File
@@ -3419,13 +3419,14 @@ impl Scene {
/// Update the fields an evaluation event re-evaluates (see /// Update the fields an evaluation event re-evaluates (see
/// [`crate::entities::field::update_fields`]) and redraw the hosts whose /// [`crate::entities::field::update_fields`]) and redraw the hosts whose
/// text changed. Returns the number of fields the hosts hold. /// text changed. Returns the number of hosts whose text changed and the
pub fn update_fields(&mut self, event: i32, hosts: Option<&[Handle]>) -> usize { /// number of fields the hosts hold.
let changed = crate::entities::field::update_fields(&mut self.document, event, hosts).0; pub fn update_fields(&mut self, event: i32, hosts: Option<&[Handle]>) -> (usize, usize) {
let (changed, found) = crate::entities::field::update_fields(&mut self.document, event, hosts);
if !changed.is_empty() { if !changed.is_empty() {
self.bump_text_hosts(&changed); self.bump_text_hosts(&changed);
} }
changed.len() (changed.len(), found)
} }
/// Redraw text hosts whose stored text changed (re-evaluated fields). An /// Redraw text hosts whose stored text changed (re-evaluated fields). An