WIP count: automation, locales

This commit is contained in:
ramox81 committed 2026-10-02 17:53:28 +03:00
1 parent e29b408bda
commit f76b6cb3bb
25 files changed
+445 -3

No files matched your search

+17
View File
@@ -5930,3 +5930,20 @@ style-manager =
.center-of-text-overline = مركز النص مع خط علوي
.block-extents = نطاق الكتلة
.base-point = نقطة الأساس
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5918,3 +5918,20 @@ style-manager =
.center-of-text-overline = Център на надчертан текст
.block-extents = Обхват на блок
.base-point = Базова точка
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5915,3 +5915,20 @@ style-manager =
.center-of-text-overline = Střed textu s přeškrtnutím
.block-extents = Blokovat rozsahy
.base-point = Základní bod
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5916,3 +5916,20 @@ style-manager =
.center-of-text-overline = Textzentrum mit Oberstrich
.block-extents = Blockgrenzen
.base-point = Basispunkt
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5918,3 +5918,20 @@ style-manager =
.center-of-text-overline = Κέντρο του κειμένου με επιγράμμιση
.block-extents = Όρια μπλοκ
.base-point = Σημείο βάσης
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5919,3 +5919,20 @@ style-manager =
.center-of-text-overline = Center of text with overline
.block-extents = Block extents
.base-point = Base point
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5918,3 +5918,20 @@ style-manager =
.center-of-text-overline = Centro del texto con suprarrayado
.block-extents = Extensión del bloque
.base-point = Punto base
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5915,3 +5915,20 @@ style-manager =
.center-of-text-overline = Tekstin keskikohta yliviivauksella
.block-extents = Estä laajuudet
.base-point = Peruspiste
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5917,3 +5917,20 @@ style-manager =
.center-of-text-overline = Centre du texte avec surlignement
.block-extents = Limites du bloc
.base-point = Point de base
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5906,3 +5906,20 @@ style-manager =
.center-of-text-overline = ऊपरी रेखा सहित टेक्स्ट का केंद्र
.block-extents = ब्लॉक परिमिति
.base-point = आधार बिंदु
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5917,3 +5917,20 @@ style-manager =
.center-of-text-overline = Szöveg közepe áthúzással
.block-extents = Kiterjedések blokkolása
.base-point = Alappont
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5917,3 +5917,20 @@ style-manager =
.center-of-text-overline = Centro del testo con sopralineato
.block-extents = Blocca estensioni
.base-point = Punto base
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5906,3 +5906,20 @@ style-manager =
.center-of-text-overline = 上線付きテキストの中心
.block-extents = ブロック範囲
.base-point = 基点
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5917,3 +5917,20 @@ style-manager =
.center-of-text-overline = 윗줄이 있는 텍스트 중앙
.block-extents = 블록 범위
.base-point = 기준점
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5916,3 +5916,20 @@ style-manager =
.center-of-text-overline = Tekstmiddelpunt met bovenstreep
.block-extents = Symboolgrenzen
.base-point = Basispunt
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5917,3 +5917,20 @@ style-manager =
.center-of-text-overline = Środek tekstu z podkreśleniem
.block-extents = Zasięg bloku
.base-point = Punkt bazowy
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5918,3 +5918,20 @@ style-manager =
.center-of-text-overline = Centro do texto com sobrelinha
.block-extents = Extensões do bloco
.base-point = Ponto base
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5919,3 +5919,20 @@ style-manager =
.center-of-text-overline = Центр текста с надчёркиванием
.block-extents = Габариты блока
.base-point = Базовая точка
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5841,3 +5841,20 @@ style-manager =
.center-of-text-overline = Üst çizgili metin merkezi
.block-extents = Blok sınırları
.base-point = Taban noktası
count-feature =
.palette = Sayım
.menu = Say
.selection = Seçimi say
.review = Sayım ayrıntılarını incele
.insert-field = Sayım alanı ekle
.expand-by = GENİŞLET
.mirror-state = Ayna durumu
.area = Belirli bir alanda say
.create-table = Tablo Oluştur
.back = Listeye dön
.match-scale = Ölçeği Eşleştir
.match-mirror = Ayna Durumunu Eşleştir
.error-report = Sayım hata raporu: __ocs_fmt_0__
.toolbar-count = Sayım: __ocs_fmt_0__
.overlap = Üst üste binen nesne
.show-instances = Örnekleri göster
+17
View File
@@ -5901,3 +5901,20 @@ style-manager =
.center-of-text-overline = 带上划线的文字中心
.block-extents = 块范围
.base-point = 基点
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+17
View File
@@ -5913,3 +5913,20 @@ style-manager =
.center-of-text-overline = 帶上划線的文字中心
.block-extents = 圖塊範圍
.base-point = 基點
count-feature =
.palette = Count
.menu = Count
.selection = Count Selection
.review = Review Count Details
.insert-field = Insert Count Field
.expand-by = EXPAND BY
.mirror-state = Mirror State
.area = Count in a specified area
.create-table = Create Table
.back = Back to List
.match-scale = Match Scale
.match-mirror = Match Mirror State
.error-report = Count Error Report: __ocs_fmt_0__
.toolbar-count = Count: __ocs_fmt_0__
.overlap = Overlapping object
.show-instances = Show Count Instances
+69
View File
@@ -73,6 +73,7 @@ pub(super) const NAMES: &[&str] = &[
"pdf_layer_toggle",
"pc_manager_toggle",
"pc_manager",
"count_palette",
"blocks_palette",
"pdf_page_select",
"pc_colormap",
@@ -813,6 +814,74 @@ impl OpenCADStudio {
}
// Point Cloud Manager tree: "search=<text>", "collapse", "expand",
// "toggle_node=<key>" or "select=<key>".
// Count palette and count mode: "search=<text>", "sort=name|count",
// "open=NAME", "child=NAME:<n>" (an expanded row), "menu=<review|field|
// layer|scale|mirror>:NAME", "create_table", "check=NAME:1",
// "all=1", "table_cancel", "table_insert", "back", "match=<0|1|2>:1",
// "details", "errors", "error=<n>", "area", "prev", "next", "select",
// "field", "close".
"count_palette" => {
use crate::ui::window::count_palette::{CountMsg as M, RowAction};
let value = string(req, "value")?;
let (key, arg) = value.split_once('=').unwrap_or((value, ""));
let flag = |s: &str| s == "1" || s.eq_ignore_ascii_case("true");
let bad = || failure("invalid_value", "Unknown count palette edit");
Message::Count(match key {
"search" => M::Search(arg.into()),
"sort" => M::Sort(arg == "count"),
"open" => M::Open(arg.into(), codec::count::CountKey::default()),
"child" => {
let (name, n) = arg.rsplit_once(':').ok_or_else(bad)?;
let n: usize = n.parse().map_err(|_| bad())?;
let [l, s, m] = self.count_palette.expansion(name).ok_or_else(bad)?;
let i = self.active_tab;
let area = self.tabs[i].count.as_ref().and_then(|c| c.area.clone());
let instances = codec::count::block_instances(&self.tabs[i].scene.document, area.as_deref());
let (k, _) = codec::count::expanded_counts(&instances, name, l, s, m).into_iter().nth(n).ok_or_else(bad)?;
M::Open(name.into(), k)
}
"menu" => {
let (action, name) = arg.split_once(':').ok_or_else(bad)?;
let action = match action {
"review" => RowAction::Review,
"field" => RowAction::Field,
"layer" => RowAction::Expand(0),
"scale" => RowAction::Expand(1),
"mirror" => RowAction::Expand(2),
_ => return Err(bad()),
};
M::Menu(name.into(), codec::count::CountKey::default(), action)
}
"create_table" => M::CreateTable,
"check" => {
let (name, on) = arg.rsplit_once(':').unwrap_or((arg, "1"));
M::TableCheck(name.into(), flag(on))
}
"all" => M::TableAll(flag(arg)),
"table_cancel" => M::TableCancel,
"table_insert" => M::TableInsert,
"back" => M::Back,
"match" => {
let (k, on) = arg.split_once(':').unwrap_or((arg, "1"));
M::Match(k.parse::<usize>().ok().filter(|k| *k < 3).ok_or_else(bad)?, flag(on))
}
"details" => M::ToggleDetails,
"errors" => M::ToggleErrors,
"error" => {
let i = self.active_tab;
let n: usize = arg.parse().map_err(|_| bad())?;
let mode = self.tabs[i].count.as_ref().ok_or_else(bad)?;
M::ShowError(*mode.result(&self.tabs[i].scene.document).errors.get(n).ok_or_else(bad)?)
}
"area" => M::Area,
"prev" => M::Prev,
"next" => M::Next,
"select" => M::Select,
"field" => M::Field,
"close" => M::Close,
_ => return Err(bad()),
})
}
"pc_manager" => {
use crate::ui::window::pc_manager::PcManagerMsg as M;
let value = string(req, "value")?;
+16
View File
@@ -5521,6 +5521,22 @@ pub(super) fn message_attribute(source: &str) -> Option<(&'static str, &'static
"US Survey Feet" => Some(("common", "us-survey-feet")),
"to layout" => Some(("common", "to-layout")),
"{count} objects selected" => Some(("common", "count-objects-selected")),
"Count palette" => Some(("count-feature", "palette")),
"Count menu" => Some(("count-feature", "menu")),
"Count Selection" => Some(("count-feature", "selection")),
"Review Count Details" => Some(("count-feature", "review")),
"Insert Count Field" => Some(("count-feature", "insert-field")),
"EXPAND BY" => Some(("count-feature", "expand-by")),
"Mirror State" => Some(("count-feature", "mirror-state")),
"Count in a specified area" => Some(("count-feature", "area")),
"Create Table" => Some(("count-feature", "create-table")),
"Back to List" => Some(("count-feature", "back")),
"Match Scale" => Some(("count-feature", "match-scale")),
"Match Mirror State" => Some(("count-feature", "match-mirror")),
"Count Error Report: {}" => Some(("count-feature", "error-report")),
"Count: {}" => Some(("count-feature", "toolbar-count")),
"Overlapping object" => Some(("count-feature", "overlap")),
"Show Count Instances" => Some(("count-feature", "show-instances")),
_ => None,
}
}
+1 -1
View File
@@ -4,7 +4,7 @@ pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/d
pub fn tool() -> ToolDef {
ToolDef {
id: "COUNTLIST",
label: "Count",
label: "Count palette",
icon: ICON,
event: ModuleEvent::Command("_COUNTLISTTOGGLE".to_string()),
}
+2 -2
View File
@@ -334,7 +334,7 @@ fn list_view<'a>(palette: &'a CountPalette, instances: &[BlockInstance]) -> Elem
let header = row![
header_button(crate::t!("Name").into_owned(), !palette.by_count, palette.descending, CountMsg::Sort(false)),
Space::new().width(Fill),
header_button(crate::t!("Count column").into_owned(), palette.by_count, palette.descending, CountMsg::Sort(true)),
header_button(crate::t!("Count").into_owned(), palette.by_count, palette.descending, CountMsg::Sort(true)),
]
.align_y(iced::Center);
let mut list = column![].spacing(1);
@@ -478,7 +478,7 @@ pub fn view<'a>(
width: f32,
auto_collapse: bool,
) -> Element<'a, Message> {
let title_bar = crate::ui::dock::title_bar(PanelId::Count, crate::t!("Count").into_owned(), auto_collapse);
let title_bar = crate::ui::dock::title_bar(PanelId::Count, crate::t!("Count palette").into_owned(), auto_collapse);
// ponytail: the list is recounted on every view; cache by geometry epoch
// if very large drawings make the palette slow.
let body = match mode {