diff --git a/Cargo.lock b/Cargo.lock index e869f168d..6b96c417e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4206,7 +4206,7 @@ dependencies = [ [[package]] name = "opencadcodec" version = "0.5.5" -source = "git+https://github.com/ramox81/cadcodec.git?rev=178b596#178b596ba1606ce6d4ed719cd48551750a0f32a5" +source = "git+https://github.com/ramox81/cadcodec.git?rev=483c006#483c006df06edeb371af25a39f975007dd91f8ca" dependencies = [ "ahash 0.8.12", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index e5ef28bce..83e94433a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -91,7 +91,7 @@ block2 = "0.5" objc2-foundation = { version = "0.2", features = ["NSArray", "NSURL", "NSString", "NSObject", "NSNotification", "NSThread", "NSEnumerator"] } [patch."https://github.com/HakanSeven12/opencadcodec.git"] -opencadcodec = { git = "https://github.com/ramox81/cadcodec.git", rev = "178b596" } +opencadcodec = { git = "https://github.com/ramox81/cadcodec.git", rev = "483c006" } [patch.crates-io] iced_core = { git = "https://github.com/iced-rs/iced.git", rev = "23604ff22ab0aad9e00b9327cb7b8546ed84db39" } diff --git a/src/app/commands/count.rs b/src/app/commands/count.rs index 3dcbcd259..6fd6d0b92 100644 --- a/src/app/commands/count.rs +++ b/src/app/commands/count.rs @@ -530,10 +530,42 @@ impl OpenCADStudio { .column_width(3.6) .build(); table.set_column_width(1, 1.08); + // As the reference writes it: no title row, data rows centred + // (table and cell overrides), header cells without overrides. + table.value_flags = 22; + table.legacy_style_override = Some(codec::entities::table::LegacyTableStyleOverride { + flags: 0x10001, + title_suppressed: Some(true), + row_alignments: vec![5], + ..Default::default() + }); table.set_cell_text(0, 0, "Item"); table.set_cell_text(0, 1, "Count"); for (r, name) in names.iter().enumerate() { table.set_cell_text(r + 1, 0, name); + if let Some(cell) = table.cell_mut(r + 1, 1) { + // The count comes from the field; the cell keeps no text. + let mut content = codec::entities::table::CellContent::text(""); + content.value.flags = 1; + cell.contents = vec![content]; + cell.cell_type = codec::entities::table::CellType::Text; + } + } + for (r, row) in table.rows.iter_mut().enumerate() { + for cell in &mut row.cells { + if let Some(content) = cell.contents.first_mut().filter(|c| c.value.flags != 1) { + content.value.flags = 6; + } + if r == 0 { + cell.flag = 0x40000; + } else { + cell.flag = 0x40001; + let mut style = codec::entities::CellStyle::new(); + style.override_flags = 0x01; + style.alignment = 5; + cell.style = Some(style); + } + } } let codes: Vec = names.iter().map(|n| self.block_field_code(i, n, &CountKey::default())).collect(); @@ -541,26 +573,18 @@ impl OpenCADStudio { let Some(handle) = self.commit_entity_handle(EntityType::Table(Box::new(table))) else { return; }; + // The table's graphics block holds one MTEXT per cell; each count + // cell's MTEXT owns its field, which the cell refers to. let doc = &mut self.tabs[i].scene.document; - let mut fields = Vec::new(); - for code in &codes { - let value = crate::entities::field::evaluate(doc, code, &[], None).unwrap_or_else(|| "####".into()); - let field = doc.new_table_cell_field(handle, "%<\\_FldIdx 0>%", vec![codec::fields::NewField::new(code.clone(), value.clone())]); - fields.push((field, value)); - } - if let Some(EntityType::Table(table)) = doc.get_entity_mut(handle) { - for (r, (field, value)) in fields.into_iter().enumerate() { - let Some(field) = field else { continue }; - if let Some(cell) = table.cell_mut(r + 1, 1) { - let mut content = codec::entities::table::CellContent::text(&value); - content.field_handle = Some(field); - cell.contents.clear(); - cell.contents.push(content); - cell.cell_type = codec::entities::table::CellType::Text; - } - table.field_handles.push(field); - } - } + let fields = codes + .iter() + .enumerate() + .map(|(r, code)| { + let value = crate::entities::field::evaluate(doc, code, &[], None).unwrap_or_else(|| "####".into()); + (r + 1, 1, r"%<\_FldIdx 0>%".to_string(), vec![codec::fields::NewField::new(code.clone(), value)]) + }) + .collect(); + doc.build_table_block(handle, fields); self.tabs[i].scene.bump_entities(&[(handle, crate::scene::ChangeKind::Modified)]); self.tabs[i].dirty = true; } @@ -570,11 +594,11 @@ impl OpenCADStudio { let doc = &self.tabs[i].scene.document; let Some(entity) = doc.get_entity(h) else { return }; let outline = codec::count::entity_outline(doc, entity); - if outline.iter().all(|part| part.is_empty()) { + if outline.is_empty() { return; } let (mut lo, mut hi) = (glam::Vec3::splat(f32::MAX), glam::Vec3::splat(f32::MIN)); - for c in outline.into_iter().flatten() { + for c in outline.iter().flat_map(codec::count::Piece::points) { let p = glam::Vec3::new(c.x as f32, c.y as f32, c.z as f32); lo = lo.min(p); hi = hi.max(p); diff --git a/src/modules/annotate/count_cmd.rs b/src/modules/annotate/count_cmd.rs index 9b0517d6b..f2be96126 100644 --- a/src/modules/annotate/count_cmd.rs +++ b/src/modules/annotate/count_cmd.rs @@ -3,7 +3,7 @@ // Specify first corner point of the count area or // [Current area/Entire model space/Object/Polygonal] : // Specify opposite corner: (Polygonal: Specify start point: / -// Specify next point:; Object: +// Specify next point; Object: // Select object as count area boundary:) // Select target objects or [List all blocks] : (COUNT) // @@ -109,7 +109,8 @@ impl CadCommand for CountCommand { Step::Area => "Specify first corner point of the count area or [Current area/Entire model space/Object/Polygonal] :".into(), Step::Corner => "Specify opposite corner:".into(), Step::PolyStart => "Specify start point:".into(), - Step::PolyNext => "Specify next point:".into(), + // The reference shows this one without a colon. + Step::PolyNext => "Specify next point".into(), Step::Object => "Select object as count area boundary:".into(), Step::Targets => "Select target objects or [List all blocks] :".into(), }