From 04b2c07a381f3902d9f0cc50e7afc55d5251c3a2 Mon Sep 17 00:00:00 2001 From: Hakan Seven Date: Fri, 16 Oct 2026 12:02:39 +0300 Subject: [PATCH] Use the codec audit and repair in place of OCS's corruption guard Opening a drawing no longer drops entities with its own sanity checks or rewrites knotless splines; recovery runs the codec's repair and records its actions and unresolved issues in the drawing's notifications. Xref merges keep every entity. The dropped-entity counts, their command-line warnings, recovery report rows and the automation "purged" field go with the guard. AUDIT now reports the codec's audit (counts plus the first 50 issues) and asks whether to fix; Yes applies the codec repair as one undo step. Cargo: codec 325fa98, kernel dfca391, graph 5d4e713. Co-Authored-By: Claude Opus 5.5 --- Cargo.lock | 8 +- Cargo.toml | 8 +- crates/ocs_plugin_api/Cargo.toml | 4 +- crates/ocs_save/Cargo.toml | 2 +- crates/ocs_web_worker/Cargo.toml | 2 +- docs/plugin-template-v2/Cargo.toml | 2 +- locales/ar-SA/opencadstudio.ftl | 10 +- locales/bg-BG/opencadstudio.ftl | 10 +- locales/cs-CZ/opencadstudio.ftl | 10 +- locales/de-DE/opencadstudio.ftl | 10 +- locales/el-GR/opencadstudio.ftl | 10 +- locales/en-US/opencadstudio.ftl | 10 +- locales/es-ES/opencadstudio.ftl | 10 +- locales/fi-FI/opencadstudio.ftl | 10 +- locales/fr-FR/opencadstudio.ftl | 10 +- locales/hi-IN/opencadstudio.ftl | 10 +- locales/hu-HU/opencadstudio.ftl | 10 +- locales/it-IT/opencadstudio.ftl | 10 +- locales/ja-JP/opencadstudio.ftl | 10 +- locales/ko-KR/opencadstudio.ftl | 10 +- locales/lo-LA/opencadstudio.ftl | 10 +- locales/nl-NL/opencadstudio.ftl | 10 +- locales/pl-PL/opencadstudio.ftl | 10 +- locales/pt-BR/opencadstudio.ftl | 10 +- locales/ru-RU/opencadstudio.ftl | 10 +- locales/tr-TR/opencadstudio.ftl | 10 +- locales/zh-CN/opencadstudio.ftl | 10 +- locales/zh-TW/opencadstudio.ftl | 10 +- plugins/opencad-python/Cargo.lock | 2 +- src/app/automation.rs | 32 +-- src/app/commands/blocks.rs | 4 +- src/app/commands/styleprops.rs | 89 +++--- src/app/control/mod.rs | 3 +- src/app/control/sheets.rs | 8 +- src/app/update/dialog.rs | 4 +- src/app/update/file.rs | 27 +- src/io/mod.rs | 429 ++--------------------------- src/io/recovery.rs | 19 -- src/io/xref.rs | 60 ++-- src/locale_catalog.rs | 8 +- src/scene/cache/block_cache.rs | 2 +- src/scene/mod.rs | 8 - src/ui/window/recovery.rs | 14 - 43 files changed, 192 insertions(+), 763 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0244239b9..9e0cbba2d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4382,7 +4382,7 @@ dependencies = [ [[package]] name = "opencadcodec" version = "0.6.0" -source = "git+https://github.com/HakanSeven12/opencadcodec.git?rev=cb3ce6a#cb3ce6a93c76a5069f5c2391ee44ea38b4485d15" +source = "git+https://github.com/HakanSeven12/opencadcodec.git?rev=325fa98#325fa98d2b881f48e106a830d5cf161624f63131" dependencies = [ "anyhow", "bitflags 2.13.1", @@ -4406,7 +4406,7 @@ dependencies = [ [[package]] name = "opencadgraph" version = "0.1.0" -source = "git+https://github.com/HakanSeven12/opencadgraph.git?rev=a4bd351#a4bd351b4a11e6072bd3269b7936da716a782577" +source = "git+https://github.com/HakanSeven12/opencadgraph.git?rev=5d4e713#5d4e713968bd515be15302079d9edc1fd3df4df0" dependencies = [ "opencadkernel", "serde_json", @@ -4415,7 +4415,7 @@ dependencies = [ [[package]] name = "opencadkernel" version = "0.1.0" -source = "git+https://github.com/HakanSeven12/opencadkernel.git?rev=40f59ca#40f59caf1e18df6c4bad3b53389fe59d0e740796" +source = "git+https://github.com/HakanSeven12/opencadkernel.git?rev=dfca391#dfca3912228b19d4df25c8695b628ccb13497a78" dependencies = [ "cavalier_contours", "opencadcodec", @@ -4426,7 +4426,7 @@ dependencies = [ [[package]] name = "opencadkernel-constraints" version = "0.1.0" -source = "git+https://github.com/HakanSeven12/opencadkernel.git?rev=40f59ca#40f59caf1e18df6c4bad3b53389fe59d0e740796" +source = "git+https://github.com/HakanSeven12/opencadkernel.git?rev=dfca391#dfca3912228b19d4df25c8695b628ccb13497a78" dependencies = [ "nalgebra", ] diff --git a/Cargo.toml b/Cargo.toml index e37088072..dedd35878 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,10 +37,10 @@ rfd = "0.17" clap = { version = "4", features = ["derive", "string"] } env_logger = "0.11" log = "0.4" -codec = { package = "opencadcodec", git = "https://github.com/HakanSeven12/opencadcodec.git", rev = "cb3ce6a", features = ["serde"] } -kernel = { package = "opencadkernel", git = "https://github.com/HakanSeven12/opencadkernel.git", rev = "40f59ca", features = ["acis", "offset"] } -kernel-constraints = { package = "opencadkernel-constraints", git = "https://github.com/HakanSeven12/opencadkernel.git", rev = "40f59ca" } -graph = { package = "opencadgraph", git = "https://github.com/HakanSeven12/opencadgraph.git", rev = "a4bd351" } +codec = { package = "opencadcodec", git = "https://github.com/HakanSeven12/opencadcodec.git", rev = "325fa98", features = ["serde"] } +kernel = { package = "opencadkernel", git = "https://github.com/HakanSeven12/opencadkernel.git", rev = "dfca391", features = ["acis", "offset"] } +kernel-constraints = { package = "opencadkernel-constraints", git = "https://github.com/HakanSeven12/opencadkernel.git", rev = "dfca391" } +graph = { package = "opencadgraph", git = "https://github.com/HakanSeven12/opencadgraph.git", rev = "5d4e713" } dwg-thumbnailer = { path = "crates/dwg-thumbnailer" } # Shared SAVE serialization dispatch + web-worker wire format: one # implementation for the inline (fallback/native) path and the worker path. diff --git a/crates/ocs_plugin_api/Cargo.toml b/crates/ocs_plugin_api/Cargo.toml index 67ed604a2..dc495b6eb 100644 --- a/crates/ocs_plugin_api/Cargo.toml +++ b/crates/ocs_plugin_api/Cargo.toml @@ -15,7 +15,7 @@ serde_json = { version = "1", optional = true } # Pulled in only by the `host` feature, which adds the `opencadcodec`-typed # `HostApi` runtime surface. The default crate stays dependency-free so engine # crates and external tooling can depend on the manifest/ribbon contract cheaply. -codec = { package = "opencadcodec", git = "https://github.com/HakanSeven12/opencadcodec.git", rev = "cb3ce6a", optional = true, features = ["serde"] } +codec = { package = "opencadcodec", git = "https://github.com/HakanSeven12/opencadcodec.git", rev = "325fa98", optional = true, features = ["serde"] } # Runtime IPC and serialization (host feature only). interprocess = { version = "2", optional = true } @@ -39,7 +39,7 @@ serde_json = "1" serde = { version = "1", features = ["derive"] } cargo-lock = "11" # opencadcodec is scanned at build time to generate the embedded type registry. -codec = { package = "opencadcodec", git = "https://github.com/HakanSeven12/opencadcodec.git", rev = "cb3ce6a", features = ["serde"] } +codec = { package = "opencadcodec", git = "https://github.com/HakanSeven12/opencadcodec.git", rev = "325fa98", features = ["serde"] } [dev-dependencies] serde_json = "1" diff --git a/crates/ocs_save/Cargo.toml b/crates/ocs_save/Cargo.toml index c4c8a1036..a64f550ef 100644 --- a/crates/ocs_save/Cargo.toml +++ b/crates/ocs_save/Cargo.toml @@ -10,6 +10,6 @@ publish = false # exactly one implementation. No UI/app dependencies — only the codec + serde. [dependencies] -codec = { package = "opencadcodec", git = "https://github.com/HakanSeven12/opencadcodec.git", rev = "cb3ce6a", features = ["serde"] } +codec = { package = "opencadcodec", git = "https://github.com/HakanSeven12/opencadcodec.git", rev = "325fa98", features = ["serde"] } bincode = "1.3" serde = { version = "1", features = ["derive"] } diff --git a/crates/ocs_web_worker/Cargo.toml b/crates/ocs_web_worker/Cargo.toml index 755654723..bc91d4438 100644 --- a/crates/ocs_web_worker/Cargo.toml +++ b/crates/ocs_web_worker/Cargo.toml @@ -8,7 +8,7 @@ publish = false crate-type = ["cdylib"] [dependencies] -codec = { package = "opencadcodec", git = "https://github.com/HakanSeven12/opencadcodec.git", rev = "cb3ce6a", features = ["serde"] } +codec = { package = "opencadcodec", git = "https://github.com/HakanSeven12/opencadcodec.git", rev = "325fa98", features = ["serde"] } bincode = "1.3" serde = { version = "1", features = ["derive"] } console_error_panic_hook = "0.1" diff --git a/docs/plugin-template-v2/Cargo.toml b/docs/plugin-template-v2/Cargo.toml index 0a02cbd66..63a19d6b5 100644 --- a/docs/plugin-template-v2/Cargo.toml +++ b/docs/plugin-template-v2/Cargo.toml @@ -16,4 +16,4 @@ ocs_plugin_api = { path = "../../crates/ocs_plugin_api", features = ["host"] } # entry): the plugin's entities and the host's re-exports are the same types # only when both resolve the same revision. The registration `rustc` / # `acadrust_source` gates enforce this at load time too. -acadrust = { package = "opencadcodec", git = "https://github.com/HakanSeven12/opencadcodec.git", rev = "cb3ce6a" } +acadrust = { package = "opencadcodec", git = "https://github.com/HakanSeven12/opencadcodec.git", rev = "325fa98" } diff --git a/locales/ar-SA/opencadstudio.ftl b/locales/ar-SA/opencadstudio.ftl index 6429a0f89..e259076a2 100644 --- a/locales/ar-SA/opencadstudio.ftl +++ b/locales/ar-SA/opencadstudio.ftl @@ -225,9 +225,7 @@ recovery = .failed-description = تعذر على الاسترداد إنتاج بيانات رسم قابلة للاستخدام. راجع التقرير وجرّب نسخة احتياطية أو نسخة حفظ تلقائي. .entities-checked = الكيانات التي تم فحصها .issues-found = المشكلات الموجودة - .entities-removed = الكيانات التي تمت إزالتها .references-checked = المراجع التي تم فحصها - .referenced-entities-removed = الكيانات المرجعية التي تمت إزالتها .references-unavailable = المراجع غير المتاحة .log-path = سجل الاسترداد .log-write-failed = تعذرت كتابة سجل الاسترداد @@ -2603,8 +2601,6 @@ file = .usage-undo-number-of-steps = الاستخدام: UNDO [number of steps] .used-for-the-first-save-of-a-new-drawing-exist = يُستخدم للحفظ الأول لرسم جديد. تحتفظ الرسومات الحالية بنوع ملفها وإصدارها. .visual-style-label = النمط المرئي: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = تحذير: أُسقط __ocs_fmt_0__ كيان تالف (بيانات تحليل غير صالحة — اتجاهات/أعداد سيئة) - .warning-corrupt-xref-entities-dropped = تحذير: أُسقط __ocs_fmt_0__ كيان مرجع خارجي تالف .xref-loaded = XREF حُمّل "__ocs_fmt_0__" .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: لا يمكن إنشاء ZIP الإرسال (__ocs_fmt_1__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: تعذر إنشاء المجلد (__ocs_fmt_1__). @@ -5650,9 +5646,9 @@ styles = .aci-color-index = فهرس ألوان ACI .aci = ACI: .audit-no-issues-found = AUDIT: لم يُعثر على مشكلات. - .audit-reference-s-to-undefined-block-s = AUDIT: مراجع إلى كتل غير معرّفة: __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: مراجع إلى طبقات غير معرّفة: __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: تقرير فقط — لم يُجرَ إصلاح تلقائي. + .audit-fix-any-errors-detected = AUDIT هل تريد إصلاح الأخطاء المكتشفة؟ [نعم / لا] <لا>: + .audit-error-s-warning-s-found = AUDIT: تم العثور على __ocs_fmt_0__ خطأ و__ocs_fmt_1__ تحذير. + .audit-repair-s-applied-issue-s-left = AUDIT: تم تطبيق __ocs_fmt_0__ إصلاح، و__ocs_fmt_1__ مشكلة بلا حل. .audit-scanned-total-object-s = AUDIT: فُحص __ocs_fmt_0__ كائن. .above-text = أعلى النص .active-dim-style-set-to-name-arg = عُيّن نمط الأبعاد النشط إلى "__ocs_fmt_0__" diff --git a/locales/bg-BG/opencadstudio.ftl b/locales/bg-BG/opencadstudio.ftl index c37642d03..a20f37406 100644 --- a/locales/bg-BG/opencadstudio.ftl +++ b/locales/bg-BG/opencadstudio.ftl @@ -225,9 +225,7 @@ recovery = .failed-description = Възстановяването не успя да генерира използваеми чертожни данни. Прегледай отчета и опитай резервно копие или копие от автоматично запазване. .entities-checked = Проверени обекти .issues-found = Открити проблеми - .entities-removed = Премахнати обекти .references-checked = Проверени препратки - .referenced-entities-removed = Премахнати препратени обекти .references-unavailable = Препратките не са налични .log-path = Дневник за възстановяване .log-write-failed = Дневникът за възстановяване не можа да бъде записан @@ -2590,8 +2588,6 @@ file = .usage-undo-number-of-steps = Употреба: UNDO [брой стъпки] .used-for-the-first-save-of-a-new-drawing-exist = Използва се при първото запазване на нов чертеж. Съществуващите чертежи запазват своя тип файл и версия. .visual-style-label = Визуален стил: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = Предупреждение: __ocs_fmt_0__ повредени обекта отхвърлени (грешка в анализатора — лоши нормали / брой) - .warning-corrupt-xref-entities-dropped = Предупреждение: __ocs_fmt_0__ повредени xref обекта отхвърлени .xref-loaded = XREF Зареден "__ocs_fmt_0__" .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: не може да се създаде ZIP за предаване (__ocs_fmt_1__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: папката не може да бъде създадена (__ocs_fmt_1__). @@ -5638,9 +5634,9 @@ styles = .aci-color-index = ACI Цветови индекс .aci = ACI: .audit-no-issues-found = AUDIT: не са открити проблеми. - .audit-reference-s-to-undefined-block-s = AUDIT: препратка/и към недефинирани блок(ове): __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: препратка/и към недефинирани слой(еве): __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: само отчет — не е извършена автоматична поправка. + .audit-fix-any-errors-detected = AUDIT Да се поправят ли откритите грешки? [Да / Не] <Не>: + .audit-error-s-warning-s-found = AUDIT: открити грешки: __ocs_fmt_0__, предупреждения: __ocs_fmt_1__. + .audit-repair-s-applied-issue-s-left = AUDIT: приложени поправки: __ocs_fmt_0__, нерешени проблеми: __ocs_fmt_1__. .audit-scanned-total-object-s = AUDIT: сканирани __ocs_fmt_0__ обект(а). .above-text = Над текста .active-dim-style-set-to-name-arg = Активният стил за оразмеряване е зададен на "__ocs_fmt_0__" diff --git a/locales/cs-CZ/opencadstudio.ftl b/locales/cs-CZ/opencadstudio.ftl index abf843f86..b36cac75e 100644 --- a/locales/cs-CZ/opencadstudio.ftl +++ b/locales/cs-CZ/opencadstudio.ftl @@ -225,9 +225,7 @@ recovery = .failed-description = Při obnovení se nepodařilo získat použitelná data výkresu. Projděte zprávu a zkuste zálohu nebo automaticky uloženou kopii. .entities-checked = Zkontrolované entity .issues-found = Nalezené problémy - .entities-removed = Odstraněné entity .references-checked = Zkontrolované reference - .referenced-entities-removed = Odstraněné odkazované entity .references-unavailable = Nedostupné reference .log-path = Protokol obnovení .log-write-failed = Protokol obnovení se nepodařilo zapsat @@ -2590,8 +2588,6 @@ file = .usage-undo-number-of-steps = Použití: UNDO [počet kroků] .used-for-the-first-save-of-a-new-drawing-exist = Používá se pro první uložení nového výkresu. Stávající výkresy si ponechají svůj typ souboru a verzi. .visual-style-label = Vizuální styl: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = Varování: __ocs_fmt_0__ poškozené entity byly odstraněny (nevyžádaná analyzátor – špatné normály / počty) - .warning-corrupt-xref-entities-dropped = Varování: __ocs_fmt_0__ poškozené entity externí reference byly zrušeny .xref-loaded = XREF Načteno "__ocs_fmt_0__" .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: nelze vytvořit přenosový ZIP (__ocs_fmt_1__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: Nelze vytvořit složku (__ocs_fmt_1__). @@ -5635,9 +5631,9 @@ styles = .aci-color-index = Barevný index ACI .aci = ACI: .audit-no-issues-found = AUDIT: nebyly nalezeny žádné problémy. - .audit-reference-s-to-undefined-block-s = AUDIT: reference na nedefinované bloky: __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: reference na nedefinované vrstvy: __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: pouze zpráva – neprovádí se žádná automatická oprava. + .audit-fix-any-errors-detected = AUDIT Opravit zjištěné chyby? [Ano / Ne] : + .audit-error-s-warning-s-found = AUDIT: nalezeno chyb: __ocs_fmt_0__, varování: __ocs_fmt_1__. + .audit-repair-s-applied-issue-s-left = AUDIT: provedeno oprav: __ocs_fmt_0__, nevyřešeno problémů: __ocs_fmt_1__. .audit-scanned-total-object-s = AUDIT: skenovaný objekt(y) __ocs_fmt_0__. .above-text = Nad textem .active-dim-style-set-to-name-arg = Styl aktivního ztlumení nastaven na "__ocs_fmt_0__" diff --git a/locales/de-DE/opencadstudio.ftl b/locales/de-DE/opencadstudio.ftl index ba3802c7f..fc1946179 100644 --- a/locales/de-DE/opencadstudio.ftl +++ b/locales/de-DE/opencadstudio.ftl @@ -225,9 +225,7 @@ recovery = .failed-description = Die Wiederherstellung konnte keine verwendbaren Zeichnungsdaten erzeugen. Prüfen Sie den Bericht und versuchen Sie eine Sicherungskopie oder automatisch gespeicherte Kopie. .entities-checked = Geprüfte Objekte .issues-found = Gefundene Probleme - .entities-removed = Entfernte Objekte .references-checked = Geprüfte Referenzen - .referenced-entities-removed = Entfernte referenzierte Objekte .references-unavailable = Nicht verfügbare Referenzen .log-path = Wiederherstellungsprotokoll .log-write-failed = Wiederherstellungsprotokoll konnte nicht geschrieben werden @@ -2591,8 +2589,6 @@ file = .usage-undo-number-of-steps = Anwendung: UNDO [number of steps] .used-for-the-first-save-of-a-new-drawing-exist = Wird für die erste Speicherung einer neuen Zeichnung verwendet. Bestehende Zeichnungen behalten ihren Dateityp und ihre Version bei. .visual-style-label = Visueller Stil: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = Warnung: __ocs_fmt_0__ beschädigte Objekte verworfen (ungültige Analysedaten — fehlerhafte Normalen oder Anzahlen) - .warning-corrupt-xref-entities-dropped = Warnung: __ocs_fmt_0__ beschädigte XRef-Objekte verworfen .xref-loaded = XREF Geladen "__ocs_fmt_0__" .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: das Übertragungs-ZIP kann nicht erstellt werden (__ocs_fmt_1__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: kann keinen Ordner erstellen (__ocs_fmt_1__). @@ -5636,9 +5632,9 @@ styles = .aci-color-index = ACI Farbindex .aci = ACI: .audit-no-issues-found = AUDIT: keine Probleme gefunden. - .audit-reference-s-to-undefined-block-s = AUDIT: Verweis(e) auf undefinierte(n) Block(e): __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: Referenz(en) auf undefinierte Ebene(n): __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: Nur Bericht erstatten — keine automatische Reparatur durchgeführt. + .audit-fix-any-errors-detected = AUDIT Gefundene Fehler beheben? [Ja / Nein] : + .audit-error-s-warning-s-found = AUDIT: __ocs_fmt_0__ Fehler, __ocs_fmt_1__ Warnung(en) gefunden. + .audit-repair-s-applied-issue-s-left = AUDIT: __ocs_fmt_0__ Reparatur(en) ausgeführt, __ocs_fmt_1__ Problem(e) ungelöst. .audit-scanned-total-object-s = AUDIT: gescanntes __ocs_fmt_0__ Objekt(e). .above-text = Vorstehender Text .active-dim-style-set-to-name-arg = Aktiver Bemaßungsstil auf „__ocs_fmt_0__“ gesetzt diff --git a/locales/el-GR/opencadstudio.ftl b/locales/el-GR/opencadstudio.ftl index 9ea02d2ca..2f187eb4e 100644 --- a/locales/el-GR/opencadstudio.ftl +++ b/locales/el-GR/opencadstudio.ftl @@ -224,9 +224,7 @@ recovery = .failed-description = Η ανάκτηση δεν μπόρεσε να παραγάγει αξιοποιήσιμα δεδομένα σχεδίου. Ελέγξτε την αναφορά και δοκιμάστε ένα αντίγραφο ασφαλείας ή αυτόματης αποθήκευσης. .entities-checked = Οντότητες που ελέγχθηκαν .issues-found = Προβλήματα που βρέθηκαν - .entities-removed = Οντότητες που αφαιρέθηκαν .references-checked = Αναφορές που ελέγχθηκαν - .referenced-entities-removed = Αναφερόμενες οντότητες που αφαιρέθηκαν .references-unavailable = Οι αναφορές δεν είναι διαθέσιμες .log-path = Αρχείο καταγραφής ανάκτησης .log-write-failed = Δεν ήταν δυνατή η εγγραφή του αρχείου καταγραφής ανάκτησης @@ -2590,8 +2588,6 @@ file = .usage-undo-number-of-steps = Χρήση: UNDO [αριθμός βημάτων] .used-for-the-first-save-of-a-new-drawing-exist = Χρησιμοποιείται στην πρώτη αποθήκευση ενός νέου σχεδίου. Τα υπάρχοντα σχέδια διατηρούν τον τύπο και την έκδοση του αρχείου τους. .visual-style-label = Οπτικό στυλ: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = Προειδοποίηση: απορρίφθηκαν __ocs_fmt_0__ κατεστραμμένες οντότητες (άχρηστα δεδομένα αναλυτή — εσφαλμένα κάθετα διανύσματα / πλήθη) - .warning-corrupt-xref-entities-dropped = Προειδοποίηση: απορρίφθηκαν __ocs_fmt_0__ κατεστραμμένες οντότητες xref .xref-loaded = XREF Φορτώθηκε το "__ocs_fmt_0__" .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: δεν είναι δυνατή η δημιουργία του ZIP μεταφοράς (__ocs_fmt_1__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: δεν είναι δυνατή η δημιουργία φακέλου (__ocs_fmt_1__). @@ -5638,9 +5634,9 @@ styles = .aci-color-index = Δείκτης χρώματος ACI .aci = ACI: .audit-no-issues-found = AUDIT: δεν βρέθηκαν προβλήματα. - .audit-reference-s-to-undefined-block-s = AUDIT: αναφορά(ές) σε μη ορισμένα μπλοκ: __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: αναφορά(ές) σε μη ορισμένα επίπεδα: __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: μόνο αναφορά — δεν έγινε αυτόματη επιδιόρθωση. + .audit-fix-any-errors-detected = AUDIT Διόρθωση των σφαλμάτων που εντοπίστηκαν; [Ναι / Όχι] <Όχι>: + .audit-error-s-warning-s-found = AUDIT: βρέθηκαν __ocs_fmt_0__ σφάλματα, __ocs_fmt_1__ προειδοποιήσεις. + .audit-repair-s-applied-issue-s-left = AUDIT: εφαρμόστηκαν __ocs_fmt_0__ επιδιορθώσεις, __ocs_fmt_1__ προβλήματα παραμένουν άλυτα. .audit-scanned-total-object-s = AUDIT: σαρώθηκαν __ocs_fmt_0__ αντικείμενο(α). .above-text = Πάνω από το κείμενο .active-dim-style-set-to-name-arg = Το ενεργό στυλ διαστάσεων ορίστηκε σε "__ocs_fmt_0__" diff --git a/locales/en-US/opencadstudio.ftl b/locales/en-US/opencadstudio.ftl index 0b25e247b..913d9e300 100644 --- a/locales/en-US/opencadstudio.ftl +++ b/locales/en-US/opencadstudio.ftl @@ -224,9 +224,7 @@ recovery = .failed-description = Recovery could not produce usable drawing data. Review the report and try a backup or automatic-save copy. .entities-checked = Entities checked .issues-found = Issues found - .entities-removed = Entities removed .references-checked = References checked - .referenced-entities-removed = Referenced entities removed .references-unavailable = References unavailable .log-path = Recovery log .log-write-failed = Recovery log could not be written @@ -2591,8 +2589,6 @@ file = .usage-undo-number-of-steps = Usage: UNDO [number of steps] .used-for-the-first-save-of-a-new-drawing-exist = Used for the first save of a new drawing. Existing drawings keep their file type and version. .visual-style-label = Visual style: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = Warning: __ocs_fmt_0__ corrupt entities dropped (parser junk — bad normals / counts) - .warning-corrupt-xref-entities-dropped = Warning: __ocs_fmt_0__ corrupt xref entities dropped .xref-loaded = XREF Loaded "__ocs_fmt_0__" .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: cannot build the transmittal ZIP (__ocs_fmt_1__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: cannot create folder (__ocs_fmt_1__). @@ -5637,9 +5633,9 @@ styles = .aci-color-index = ACI Color Index .aci = ACI: .audit-no-issues-found = AUDIT: no issues found. - .audit-reference-s-to-undefined-block-s = AUDIT: reference(s) to undefined block(s): __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: reference(s) to undefined layer(s): __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: report only — no automatic repair performed. + .audit-fix-any-errors-detected = AUDIT Fix any errors detected? [Yes / No] : + .audit-error-s-warning-s-found = AUDIT: __ocs_fmt_0__ error(s), __ocs_fmt_1__ warning(s) found. + .audit-repair-s-applied-issue-s-left = AUDIT: __ocs_fmt_0__ repair(s) applied, __ocs_fmt_1__ issue(s) left unresolved. .audit-scanned-total-object-s = AUDIT: scanned __ocs_fmt_0__ object(s). .above-text = Above text .active-dim-style-set-to-name-arg = Active dim style set to "__ocs_fmt_0__" diff --git a/locales/es-ES/opencadstudio.ftl b/locales/es-ES/opencadstudio.ftl index a5efe2c3e..65613bb20 100644 --- a/locales/es-ES/opencadstudio.ftl +++ b/locales/es-ES/opencadstudio.ftl @@ -225,9 +225,7 @@ recovery = .failed-description = La recuperación no pudo producir datos de dibujo utilizables. Revise el informe e intente usar una copia de seguridad o de guardado automático. .entities-checked = Entidades comprobadas .issues-found = Problemas encontrados - .entities-removed = Entidades eliminadas .references-checked = Referencias comprobadas - .referenced-entities-removed = Entidades referenciadas eliminadas .references-unavailable = Referencias no disponibles .log-path = Registro de recuperación .log-write-failed = No se pudo escribir el registro de recuperación @@ -2591,8 +2589,6 @@ file = .usage-undo-number-of-steps = Uso: UNDO [número de pasos] .used-for-the-first-save-of-a-new-drawing-exist = Se usa para el primer guardado de un dibujo nuevo. Los dibujos existentes conservan su tipo y versión de archivo. .visual-style-label = Estilo visual: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = Advertencia: se descartaron __ocs_fmt_0__ entidades dañadas (datos inválidos del analizador: normales o recuentos erróneos) - .warning-corrupt-xref-entities-dropped = Advertencia: se descartaron __ocs_fmt_0__ entidades de referencia externa dañadas .xref-loaded = XREF Se cargó «__ocs_fmt_0__» .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: no se puede crear el ZIP de transmisión (__ocs_fmt_1__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: no se puede crear la carpeta (__ocs_fmt_1__). @@ -5638,9 +5634,9 @@ styles = .aci-color-index = Índice de color ACI .aci = ACI: .audit-no-issues-found = AUDIT: no se encontraron problemas. - .audit-reference-s-to-undefined-block-s = AUDIT: referencias a bloques no definidos: __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: referencias a capas no definidas: __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: solo informe; no se realizó ninguna reparación automática. + .audit-fix-any-errors-detected = AUDIT ¿Corregir los errores detectados? [Sí / No] : + .audit-error-s-warning-s-found = AUDIT: __ocs_fmt_0__ error(es), __ocs_fmt_1__ advertencia(s) encontrados. + .audit-repair-s-applied-issue-s-left = AUDIT: __ocs_fmt_0__ reparación(es) aplicada(s), __ocs_fmt_1__ problema(s) sin resolver. .audit-scanned-total-object-s = AUDIT: se examinaron __ocs_fmt_0__ objetos. .above-text = Encima del texto .active-dim-style-set-to-name-arg = Estilo de cota activo definido como «__ocs_fmt_0__» diff --git a/locales/fi-FI/opencadstudio.ftl b/locales/fi-FI/opencadstudio.ftl index d4e00edd1..26fb97570 100644 --- a/locales/fi-FI/opencadstudio.ftl +++ b/locales/fi-FI/opencadstudio.ftl @@ -225,9 +225,7 @@ recovery = .failed-description = Palautus ei tuottanut käyttökelpoisia piirustustietoja. Tarkista raportti ja kokeile varmuuskopiota tai automaattisesti tallennettua kopiota. .entities-checked = Tarkistetut entiteetit .issues-found = Havaitut ongelmat - .entities-removed = Poistetut entiteetit .references-checked = Tarkistetut viitteet - .referenced-entities-removed = Poistetut viitatut entiteetit .references-unavailable = Viitteet eivät ole käytettävissä .log-path = Palautusloki .log-write-failed = Palautuslokia ei voitu kirjoittaa @@ -2590,8 +2588,6 @@ file = .usage-undo-number-of-steps = Käyttö: UNDO [vaiheiden määrä] .used-for-the-first-save-of-a-new-drawing-exist = Käytetään uuden piirustuksen ensimmäiseen tallennukseen. Olemassa olevat piirustukset säilyttävät tiedostotyyppinsä ja -versionsa. .visual-style-label = Visuaalinen tyyli: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = Varoitus: __ocs_fmt_0__-korruptoituneet entiteetit pudotettiin (jäsennysroska - huonot normaalit / määrät) - .warning-corrupt-xref-entities-dropped = Varoitus: __ocs_fmt_0__-korruptoituneet xref-entiteetit putosivat .xref-loaded = XREF Ladattu "__ocs_fmt_0__" .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: siirto-ZIP:n luominen epäonnistui (__ocs_fmt_1__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: kansiota (__ocs_fmt_1__) ei voi luoda. @@ -5637,9 +5633,9 @@ styles = .aci-color-index = ACI väriindeksi .aci = ACI: .audit-no-issues-found = AUDIT: ongelmia ei löytynyt. - .audit-reference-s-to-undefined-block-s = AUDIT: viittaus määrittelemättömiin lohkoihin: __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: viittaukset määrittelemättömiin tasoihin: __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: vain raportti – automaattista korjausta ei suoritettu. + .audit-fix-any-errors-detected = AUDIT Korjataanko havaitut virheet? [Kyllä / Ei] : + .audit-error-s-warning-s-found = AUDIT: löytyi __ocs_fmt_0__ virhettä, __ocs_fmt_1__ varoitusta. + .audit-repair-s-applied-issue-s-left = AUDIT: __ocs_fmt_0__ korjausta tehty, __ocs_fmt_1__ ongelmaa ratkaisematta. .audit-scanned-total-object-s = AUDIT: skannatut __ocs_fmt_0__-objektit. .above-text = Tekstin yläpuolella .active-dim-style-set-to-name-arg = Aktiivinen himmennystyyli asetettu "__ocs_fmt_0__" diff --git a/locales/fr-FR/opencadstudio.ftl b/locales/fr-FR/opencadstudio.ftl index 0e5473ea4..697f5a59a 100644 --- a/locales/fr-FR/opencadstudio.ftl +++ b/locales/fr-FR/opencadstudio.ftl @@ -225,9 +225,7 @@ recovery = .failed-description = La récupération n'a pas produit de données de dessin utilisables. Consultez le rapport et essayez une sauvegarde ou une copie d'enregistrement automatique. .entities-checked = Entités vérifiées .issues-found = Problèmes détectés - .entities-removed = Entités supprimées .references-checked = Références vérifiées - .referenced-entities-removed = Entités référencées supprimées .references-unavailable = Références indisponibles .log-path = Journal de récupération .log-write-failed = Impossible d'écrire le journal de récupération @@ -2591,8 +2589,6 @@ file = .usage-undo-number-of-steps = Utilisation : UNDO [number of steps] .used-for-the-first-save-of-a-new-drawing-exist = Utilisé pour la première sauvegarde d'un nouveau dessin. Les dessins existants conservent leur type de fichier et leur version. .visual-style-label = Style visuel : __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = Avertissement : __ocs_fmt_0__ objet(s) corrompu(s) ignoré(s) (données d’analyse invalides — normales ou nombres incorrects) - .warning-corrupt-xref-entities-dropped = Avertissement : __ocs_fmt_0__ objet(s) de référence externe corrompu(s) ignoré(s) .xref-loaded = XREF Charge "__ocs_fmt_0__" .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__ : impossible de créer le ZIP de transmission (__ocs_fmt_1__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: ne peut pas créer de dossier (__ocs_fmt_1__). @@ -5639,9 +5635,9 @@ styles = .aci-color-index = ACI Indice de couleur .aci = ACI: .audit-no-issues-found = AUDIT: aucun problème trouvé. - .audit-reference-s-to-undefined-block-s = AUDIT: référence(s) à un ou plusieurs blocs non définis: __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT : références à des calques non définis : __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: rapport seulement — aucune réparation automatique n'est effectuée. + .audit-fix-any-errors-detected = AUDIT Corriger les erreurs détectées ? [Oui / Non] : + .audit-error-s-warning-s-found = AUDIT : __ocs_fmt_0__ erreur(s), __ocs_fmt_1__ avertissement(s) trouvé(s). + .audit-repair-s-applied-issue-s-left = AUDIT : __ocs_fmt_0__ réparation(s) appliquée(s), __ocs_fmt_1__ problème(s) non résolu(s). .audit-scanned-total-object-s = AUDIT : objets analysés : __ocs_fmt_0__. .above-text = Texte ci-dessus .active-dim-style-set-to-name-arg = Style de cote courant défini sur « __ocs_fmt_0__ » diff --git a/locales/hi-IN/opencadstudio.ftl b/locales/hi-IN/opencadstudio.ftl index e7f26c977..1a08d75dd 100644 --- a/locales/hi-IN/opencadstudio.ftl +++ b/locales/hi-IN/opencadstudio.ftl @@ -225,9 +225,7 @@ recovery = .failed-description = पुनर्प्राप्ति उपयोग योग्य ड्रॉइंग डेटा नहीं बना सकी। रिपोर्ट की समीक्षा करें और बैकअप या स्वतः-सहेजी गई प्रति आज़माएँ। .entities-checked = जाँची गई एंटिटियाँ .issues-found = मिली समस्याएँ - .entities-removed = हटाई गई एंटिटियाँ .references-checked = जाँचे गए संदर्भ - .referenced-entities-removed = हटाई गई संदर्भित एंटिटियाँ .references-unavailable = अनुपलब्ध संदर्भ .log-path = पुनर्प्राप्ति लॉग .log-write-failed = पुनर्प्राप्ति लॉग लिखा नहीं जा सका @@ -2579,8 +2577,6 @@ file = .usage-undo-number-of-steps = उपयोग: UNDO [number of steps] .used-for-the-first-save-of-a-new-drawing-exist = नई ड्रॉइंग को पहली बार सहेजते समय उपयोग होता है। मौजूदा ड्रॉइंग अपना फ़ाइल प्रकार और संस्करण बनाए रखती हैं। .visual-style-label = दृश्य शैली: __ocs_fmt_0__ - .warning-corrupt-entities-dropped-parser-junk-b = चेतावनी: __ocs_fmt_0__ दूषित ऑब्जेक्ट छोड़े गए (अमान्य पार्सर डेटा — गलत नॉर्मल या गिनती) - .warning-corrupt-xref-entities-dropped = चेतावनी: __ocs_fmt_0__ दूषित xref ऑब्जेक्ट छोड़े गए .xref-loaded = XREF लोड हो गया "__ocs_fmt_0__" .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: ट्रांसमिट ZIP नहीं बनाया जा सकता (__ocs_fmt_1__)। .cmd-cannot-create-folder-e = __ocs_fmt_0__: फ़ोल्डर नहीं बना सकता (__ocs_fmt_1__). @@ -5626,9 +5622,9 @@ styles = .aci-color-index = ACI रंग सूचकांक .aci = ACI: .audit-no-issues-found = AUDIT: कोई समस्या नहीं मिली। - .audit-reference-s-to-undefined-block-s = AUDIT: संदर्भ (s) अपरिभाषित ब्लॉकों के लिए: __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: अपरिभाषित लेयर के संदर्भ: __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: केवल रिपोर्ट - कोई स्वचालित मरम्मत नहीं की जाती है। + .audit-fix-any-errors-detected = AUDIT पाई गई त्रुटियाँ ठीक करें? [हाँ / नहीं] <नहीं>: + .audit-error-s-warning-s-found = AUDIT: __ocs_fmt_0__ त्रुटि(याँ), __ocs_fmt_1__ चेतावनी(याँ) मिलीं। + .audit-repair-s-applied-issue-s-left = AUDIT: __ocs_fmt_0__ सुधार लागू हुए, __ocs_fmt_1__ समस्या(एँ) अनसुलझी रहीं। .audit-scanned-total-object-s = AUDIT: __ocs_fmt_0__ ऑब्जेक्ट जाँचे गए। .above-text = पाठ के ऊपर .active-dim-style-set-to-name-arg = सक्रिय मंद शैली "__ocs_fmt_0__" के लिए सेट diff --git a/locales/hu-HU/opencadstudio.ftl b/locales/hu-HU/opencadstudio.ftl index 15bee6825..d5b06aa60 100644 --- a/locales/hu-HU/opencadstudio.ftl +++ b/locales/hu-HU/opencadstudio.ftl @@ -224,9 +224,7 @@ recovery = .failed-description = A helyreállítás nem eredményezett használható rajzadatokat. Tekintse át a jelentést, és próbáljon meg egy biztonsági vagy automatikusan mentett példányt. .entities-checked = Ellenőrzött entitások .issues-found = Talált problémák - .entities-removed = Eltávolított entitások .references-checked = Ellenőrzött hivatkozások - .referenced-entities-removed = Eltávolított hivatkozott entitások .references-unavailable = Nem elérhető hivatkozások .log-path = Helyreállítási napló .log-write-failed = A helyreállítási napló nem írható @@ -2590,8 +2588,6 @@ file = .usage-undo-number-of-steps = Használat: UNDO [lépések száma] .used-for-the-first-save-of-a-new-drawing-exist = Egy új rajz első mentésénél használatos. A meglévő rajzok megtartják fájltípusukat és verziójukat. .visual-style-label = Vizuális stílus: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = Figyelmeztetés: __ocs_fmt_0__ sérült objektum kihagyva (érvénytelen adatok: hibás normálvektorok / elemszámok) - .warning-corrupt-xref-entities-dropped = Figyelmeztetés: __ocs_fmt_0__ sérült xref-objektum kihagyva .xref-loaded = XREF betöltve: "__ocs_fmt_0__" .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: nem hozható létre az átviteli ZIP (__ocs_fmt_1__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: nem hozható létre mappa (__ocs_fmt_1__). @@ -5627,9 +5623,9 @@ styles = .aci-color-index = ACI színindex .aci = ACI: .audit-no-issues-found = AUDIT: nem található probléma. - .audit-reference-s-to-undefined-block-s = AUDIT: hivatkozás(ok) meghatározatlan blokk(ok)ra: __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: hivatkozások nem definiált fóliákra: __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: csak jelentés – nem történt automatikus javítás. + .audit-fix-any-errors-detected = AUDIT Javítsa az észlelt hibákat? [Igen / Nem] : + .audit-error-s-warning-s-found = AUDIT: __ocs_fmt_0__ hiba, __ocs_fmt_1__ figyelmeztetés található. + .audit-repair-s-applied-issue-s-left = AUDIT: __ocs_fmt_0__ javítás alkalmazva, __ocs_fmt_1__ probléma megoldatlan. .audit-scanned-total-object-s = AUDIT: __ocs_fmt_0__ objektum ellenőrizve. .above-text = A szöveg felett .active-dim-style-set-to-name-arg = Aktív méretezési stílus: „__ocs_fmt_0__” diff --git a/locales/it-IT/opencadstudio.ftl b/locales/it-IT/opencadstudio.ftl index df881cc37..ab3f753aa 100644 --- a/locales/it-IT/opencadstudio.ftl +++ b/locales/it-IT/opencadstudio.ftl @@ -225,9 +225,7 @@ recovery = .failed-description = Il recupero non ha prodotto dati di disegno utilizzabili. Esamina il rapporto e prova una copia di backup o di salvataggio automatico. .entities-checked = Entità controllate .issues-found = Problemi rilevati - .entities-removed = Entità rimosse .references-checked = Riferimenti controllati - .referenced-entities-removed = Entità referenziate rimosse .references-unavailable = Riferimenti non disponibili .log-path = Registro di recupero .log-write-failed = Impossibile scrivere il registro di recupero @@ -2590,8 +2588,6 @@ file = .usage-undo-number-of-steps = Utilizzo: UNDO [numero di passi] .used-for-the-first-save-of-a-new-drawing-exist = Utilizzato per il primo salvataggio di un nuovo disegno. I disegni esistenti mantengono il tipo e la versione del file. .visual-style-label = Stile visivo: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = Avviso: entità corrotte __ocs_fmt_0__ eliminate (spazzatura del parser: valori normali/conteggi errati) - .warning-corrupt-xref-entities-dropped = Avviso: entità xrif corrotte __ocs_fmt_0__ eliminate .xref-loaded = XREF Caricato "__ocs_fmt_0__" .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: impossibile creare il ZIP di trasmissione (__ocs_fmt_1__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: impossibile creare la cartella (__ocs_fmt_1__). @@ -5637,9 +5633,9 @@ styles = .aci-color-index = ACI Indice colori .aci = ACI: .audit-no-issues-found = AUDIT: nessun problema trovato. - .audit-reference-s-to-undefined-block-s = AUDIT: riferimento/i a blocchi non definiti: __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: riferimento/i a livelli non definiti: __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: solo rapporto: nessuna riparazione automatica eseguita. + .audit-fix-any-errors-detected = AUDIT Correggere gli errori rilevati? [Sì / No] : + .audit-error-s-warning-s-found = AUDIT: trovati __ocs_fmt_0__ errore/i, __ocs_fmt_1__ avviso/i. + .audit-repair-s-applied-issue-s-left = AUDIT: __ocs_fmt_0__ riparazione/i applicata/e, __ocs_fmt_1__ problema/i irrisolto/i. .audit-scanned-total-object-s = AUDIT: oggetto/i __ocs_fmt_0__ scansionato/i. .above-text = Sopra il testo .active-dim-style-set-to-name-arg = Stile di attenuazione attivo impostato su "__ocs_fmt_0__" diff --git a/locales/ja-JP/opencadstudio.ftl b/locales/ja-JP/opencadstudio.ftl index 271c127f7..d0f40ad57 100644 --- a/locales/ja-JP/opencadstudio.ftl +++ b/locales/ja-JP/opencadstudio.ftl @@ -225,9 +225,7 @@ recovery = .failed-description = 修復処理で使用可能な図面データを生成できませんでした。レポートを確認し、バックアップまたは自動保存コピーをお試しください。 .entities-checked = 確認したエンティティ .issues-found = 検出した問題 - .entities-removed = 削除したエンティティ .references-checked = 確認した参照 - .referenced-entities-removed = 削除した参照エンティティ .references-unavailable = 使用できない参照 .log-path = 修復ログ .log-write-failed = 修復ログを書き込めませんでした @@ -2581,8 +2579,6 @@ file = .usage-undo-number-of-steps = 使用法: UNDO [number of steps] .used-for-the-first-save-of-a-new-drawing-exist = 新しい図面の初回保存時に使用されます。既存の図面ではファイル形式とバージョンが維持されます。 .visual-style-label = 表示スタイル: __ocs_fmt_0__。 - .warning-corrupt-entities-dropped-parser-junk-b = 警告: __ocs_fmt_0__ 個の破損した図形を除外しました(パーサーの不正データ — 法線 / 数の異常) - .warning-corrupt-xref-entities-dropped = 警告: __ocs_fmt_0__ 個の破損した外部参照図形を除外しました .xref-loaded = XREF 「__ocs_fmt_0__」をロードしました .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: 転送 ZIP を作成できません(__ocs_fmt_1__)。 .cmd-cannot-create-folder-e = __ocs_fmt_0__: フォルダーを作成できません(__ocs_fmt_1__)。 @@ -5626,9 +5622,9 @@ styles = .aci-color-index = ACI カラーインデックス .aci = ACI: .audit-no-issues-found = AUDIT: 問題は見つかりませんでした。 - .audit-reference-s-to-undefined-block-s = AUDIT: 未定義ブロックへの参照: __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: 未定義レイヤーへの参照: __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: レポートのみ — 自動修復は行いませんでした。 + .audit-fix-any-errors-detected = AUDIT 検出されたエラーを修正しますか? [はい / いいえ] <いいえ>: + .audit-error-s-warning-s-found = AUDIT: エラー __ocs_fmt_0__ 件、警告 __ocs_fmt_1__ 件が見つかりました。 + .audit-repair-s-applied-issue-s-left = AUDIT: __ocs_fmt_0__ 件の修復を適用し、__ocs_fmt_1__ 件の問題が未解決です。 .audit-scanned-total-object-s = AUDIT: __ocs_fmt_0__ 個のオブジェクトを検査しました。 .above-text = 文字の上 .active-dim-style-set-to-name-arg = 現在の寸法スタイルを "__ocs_fmt_0__" に設定しました diff --git a/locales/ko-KR/opencadstudio.ftl b/locales/ko-KR/opencadstudio.ftl index 63f5bfb85..25428a492 100644 --- a/locales/ko-KR/opencadstudio.ftl +++ b/locales/ko-KR/opencadstudio.ftl @@ -225,9 +225,7 @@ recovery = .failed-description = 복구 과정에서 사용 가능한 도면 데이터를 만들지 못했습니다. 보고서를 검토하고 백업 또는 자동 저장 사본을 사용해 보세요. .entities-checked = 검사한 엔티티 .issues-found = 발견된 문제 - .entities-removed = 제거된 엔티티 .references-checked = 검사한 참조 - .referenced-entities-removed = 제거된 참조 엔티티 .references-unavailable = 사용할 수 없는 참조 .log-path = 복구 로그 .log-write-failed = 복구 로그를 쓸 수 없습니다 @@ -2590,8 +2588,6 @@ file = .usage-undo-number-of-steps = 사용법: UNDO [단계 수] .used-for-the-first-save-of-a-new-drawing-exist = 새 도면을 처음 저장할 때 사용됩니다. 기존 도면은 파일 유형과 버전을 유지합니다. .visual-style-label = 시각적 스타일: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = 경고: __ocs_fmt_0__ 손상된 엔터티가 삭제됨(파서 정크 - 잘못된 노멀/카운트) - .warning-corrupt-xref-entities-dropped = 경고: __ocs_fmt_0__ 손상된 외부 참조 엔티티가 삭제되었습니다. .xref-loaded = XREF가 "__ocs_fmt_0__"를 로드했습니다. .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: 전송 ZIP을 만들 수 없습니다(__ocs_fmt_1__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: 폴더(__ocs_fmt_1__)를 생성할 수 없습니다. @@ -5637,9 +5633,9 @@ styles = .aci-color-index = ACI 컬러 인덱스 .aci = ACI: .audit-no-issues-found = AUDIT: 문제가 발견되지 않았습니다. - .audit-reference-s-to-undefined-block-s = AUDIT: 정의되지 않은 블록에 대한 참조: __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: 정의되지 않은 레이어에 대한 참조: __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: 보고 전용 - 자동 복구가 수행되지 않습니다. + .audit-fix-any-errors-detected = AUDIT 감지된 오류를 수정하시겠습니까? [예 / 아니요] <아니요>: + .audit-error-s-warning-s-found = AUDIT: 오류 __ocs_fmt_0__개, 경고 __ocs_fmt_1__개를 찾았습니다. + .audit-repair-s-applied-issue-s-left = AUDIT: 복구 __ocs_fmt_0__개 적용, 미해결 문제 __ocs_fmt_1__개. .audit-scanned-total-object-s = AUDIT: __ocs_fmt_0__ 개체를 스캔했습니다. .above-text = 텍스트 위 .active-dim-style-set-to-name-arg = 활성 밝기 스타일이 "__ocs_fmt_0__"로 설정됨 diff --git a/locales/lo-LA/opencadstudio.ftl b/locales/lo-LA/opencadstudio.ftl index fc88b2625..573647583 100644 --- a/locales/lo-LA/opencadstudio.ftl +++ b/locales/lo-LA/opencadstudio.ftl @@ -224,9 +224,7 @@ recovery = .failed-description = ການກູ້ຄືນບໍ່ສາມາດສ້າງຂໍ້ມູນຮູບແຕ້ມທີ່ໃຊ້ງານໄດ້. ກະລຸນາກວດສອບລາຍງານ ແລະ ລອງໃຊ້ສຳເນົາສຳຮອງ ຫຼື ໄຟລ໌ບັນທຶກອັດຕະໂນມັດ. .entities-checked = ອົງປະກອບທີ່ກວດສອບແລ້ວ .issues-found = ບັນຫາທີ່ພົບ - .entities-removed = ອົງປະກອບທີ່ຖືກລຶບອອກ .references-checked = ຈຸດອ້າງອີງທີ່ກວດສອບແລ້ວ - .referenced-entities-removed = ອົງປະກອບອ້າງອີງທີ່ຖືກລຶບອອກ .references-unavailable = ຈຸດອ້າງອີງບໍ່ພ້ອມໃຊ້ງານ .log-path = ບັນທຶກເຫດການການກູ້ຄືນ .log-write-failed = ບໍ່ສາມາດຂຽນບັນທຶກເຫດການການກູ້ຄືນໄດ້ @@ -2598,8 +2596,6 @@ file = .usage-undo-number-of-steps = ວິທີໃຊ້: UNDO [ຈຳນວນຂັ້ນຕອນ] .used-for-the-first-save-of-a-new-drawing-exist = ໃຊ້ສຳລັບການບັນທຶກຄັ້ງທຳອິດຂອງແບບແຕ້ມໃໝ່. ແບບແຕ້ມທີ່ມີຢູ່ແລ້ວຈະຮັກສາປະເພດໄຟລ໌ ແລະ ເວີຊັນເດີມໄວ້. .visual-style-label = ຮູບແບບມຸມມອງ: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = ຄຳເຕືອນ: ຕັດອົງປະກອບທີ່ເສຍຫາຍຖິ້ມ __ocs_fmt_0__ ອັນ (ຂໍ້ມູນເສດຈາກການວິເຄາະ — ຄ່າແນວຕັ້ງສາກ/ຈຳນວນຜິດພາດ) - .warning-corrupt-xref-entities-dropped = ຄຳເຕືອນ: ຕັດອົງປະກອບ xref ທີ່ເສຍຫາຍຖິ້ມ __ocs_fmt_0__ ອັນ .xref-loaded = XREF ໂຫຼດແລ້ວ "__ocs_fmt_0__" .cmd-cannot-create-folder-e = __ocs_fmt_0__: ບໍ່ສາມາດສ້າງໂຟລເດີໄດ້ (__ocs_fmt_1__). .cmd-packaged-copied-file-s-into = __ocs_fmt_0__: ລວມໄຟລ໌ ແລະ ສຳເນົາ __ocs_fmt_1__ ໄຟລ໌ ລົງໃນ __ocs_fmt_2__ @@ -5638,9 +5634,9 @@ styles = .aci-color-index = ດັດຊະນີສີ ACI .aci = ACI: .audit-no-issues-found = AUDIT: ບໍ່ພົບຂໍ້ຜິດພາດ. - .audit-reference-s-to-undefined-block-s = AUDIT: ການອ້າງອີງເຖິງບລັອກທີ່ບໍ່ໄດ້ກຳນົດ: __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: ການອ້າງອີງເຖິງເລເຢີທີ່ບໍ່ໄດ້ກຳນົດ: __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: ລາຍງານເທົ່ານັ້ນ — ບໍ່ໄດ້ມີການສ້ອມແປງອັດຕະໂນມັດ. + .audit-fix-any-errors-detected = AUDIT ແກ້ໄຂຂໍ້ຜິດພາດທີ່ກວດພົບບໍ? [ແມ່ນ / ບໍ່] <ບໍ່>: + .audit-error-s-warning-s-found = AUDIT: ພົບຂໍ້ຜິດພາດ __ocs_fmt_0__ ລາຍການ, ຄຳເຕືອນ __ocs_fmt_1__ ລາຍການ. + .audit-repair-s-applied-issue-s-left = AUDIT: ສ້ອມແປງແລ້ວ __ocs_fmt_0__ ລາຍການ, ບັນຫາທີ່ຍັງບໍ່ໄດ້ແກ້ __ocs_fmt_1__ ລາຍການ. .audit-scanned-total-object-s = AUDIT: ສະແກນທັງໝົດ __ocs_fmt_0__ ວັດຖຸ. .above-text = ເທິງຂໍ້ຄວາມ .active-dim-style-set-to-name-arg = ຮູບແບບຂະໜາດທີ່ໃຊ້ງານຕັ້ງເປັນ "__ocs_fmt_0__" diff --git a/locales/nl-NL/opencadstudio.ftl b/locales/nl-NL/opencadstudio.ftl index 60ff5d8e4..3e01ed379 100644 --- a/locales/nl-NL/opencadstudio.ftl +++ b/locales/nl-NL/opencadstudio.ftl @@ -225,9 +225,7 @@ recovery = .failed-description = Het herstel kon geen bruikbare tekeninggegevens opleveren. Controleer het rapport en probeer een reservekopie of automatisch opgeslagen kopie. .entities-checked = Gecontroleerde objecten .issues-found = Gevonden problemen - .entities-removed = Verwijderde objecten .references-checked = Gecontroleerde verwijzingen - .referenced-entities-removed = Verwijderde objecten waarnaar werd verwezen .references-unavailable = Niet-beschikbare verwijzingen .log-path = Herstellogboek .log-write-failed = Het herstellogboek kon niet worden geschreven @@ -2591,8 +2589,6 @@ file = .usage-undo-number-of-steps = Gebruik: UNDO [number of steps] .used-for-the-first-save-of-a-new-drawing-exist = Gebruikt voor de eerste opslag van een nieuwe tekening. Bestaande tekeningen houden hun bestandstype en versie. .visual-style-label = Visuele stijl: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = Waarschuwing: __ocs_fmt_0__ beschadigde objecten overgeslagen (ongeldige parsergegevens — foutieve normalen of aantallen) - .warning-corrupt-xref-entities-dropped = Waarschuwing: __ocs_fmt_0__ beschadigde xref-objecten overgeslagen .xref-loaded = XREF geladen "__ocs_fmt_0__" .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: kan de transmissie-ZIP niet maken (__ocs_fmt_1__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: kan map (__ocs_fmt_1__) niet aanmaken. @@ -5636,9 +5632,9 @@ styles = .aci-color-index = ACI Kleurindex .aci = ACI: .audit-no-issues-found = AUDIT: geen problemen gevonden. - .audit-reference-s-to-undefined-block-s = AUDIT: verwijzing(s) naar ongedefinieerd symbool(en): __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: verwijzing(s) naar ongedefinieerde laag(en): __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: alleen melden + .audit-fix-any-errors-detected = AUDIT Gevonden fouten herstellen? [Ja / Nee] : + .audit-error-s-warning-s-found = AUDIT: __ocs_fmt_0__ fout(en), __ocs_fmt_1__ waarschuwing(en) gevonden. + .audit-repair-s-applied-issue-s-left = AUDIT: __ocs_fmt_0__ herstelling(en) toegepast, __ocs_fmt_1__ probleem/problemen onopgelost. .audit-scanned-total-object-s = AUDIT: __ocs_fmt_0__ object(en) gecontroleerd. .above-text = Bovenstaande tekst .active-dim-style-set-to-name-arg = Actieve maatstijl ingesteld op "__ocs_fmt_0__" diff --git a/locales/pl-PL/opencadstudio.ftl b/locales/pl-PL/opencadstudio.ftl index 3801846f2..8146fe178 100644 --- a/locales/pl-PL/opencadstudio.ftl +++ b/locales/pl-PL/opencadstudio.ftl @@ -225,9 +225,7 @@ recovery = .failed-description = Odzyskiwanie nie przyniosło użytecznych danych rysunku. Przejrzyj raport i spróbuj użyć kopii zapasowej lub automatycznie zapisanej. .entities-checked = Sprawdzone elementy .issues-found = Znalezione problemy - .entities-removed = Usunięte elementy .references-checked = Sprawdzone odnośniki - .referenced-entities-removed = Usunięte elementy przywoływane .references-unavailable = Niedostępne odnośniki .log-path = Dziennik odzyskiwania .log-write-failed = Nie można zapisać dziennika odzyskiwania @@ -2590,8 +2588,6 @@ file = .usage-undo-number-of-steps = Sposób użycia: UNDO [liczba kroków] .used-for-the-first-save-of-a-new-drawing-exist = Używane przy pierwszym zapisie nowego rysunku. Istniejące rysunki zachowują swój typ pliku i wersję. .visual-style-label = Styl wizualny: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = Ostrzeżenie: usunięte zostały uszkodzone jednostki __ocs_fmt_0__ (śmieci parsera — złe wartości normalne/liczby) - .warning-corrupt-xref-entities-dropped = Ostrzeżenie: usunięte zostały uszkodzone elementy odnośników zewnętrznych __ocs_fmt_0__ .xref-loaded = XREF Załadowano „__ocs_fmt_0__” .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: nie można utworzyć archiwum ZIP transmittalu (__ocs_fmt_1__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: nie można utworzyć folderu (__ocs_fmt_1__). @@ -5637,9 +5633,9 @@ styles = .aci-color-index = Indeks kolorów ACI .aci = ACI: .audit-no-issues-found = AUDIT: nie znaleziono żadnych problemów. - .audit-reference-s-to-undefined-block-s = AUDIT: odniesienia do niezdefiniowanych bloków: __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: odniesienia do niezdefiniowanych warstw: __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: tylko raport — nie wykonano automatycznej naprawy. + .audit-fix-any-errors-detected = AUDIT Naprawić wykryte błędy? [Tak / Nie] : + .audit-error-s-warning-s-found = AUDIT: znaleziono błędy: __ocs_fmt_0__, ostrzeżenia: __ocs_fmt_1__. + .audit-repair-s-applied-issue-s-left = AUDIT: zastosowane naprawy: __ocs_fmt_0__, nierozwiązane problemy: __ocs_fmt_1__. .audit-scanned-total-object-s = AUDIT: zeskanowane obiekty __ocs_fmt_0__. .above-text = Powyżej tekstu .active-dim-style-set-to-name-arg = Aktywny styl przyciemnienia ustawiony na „__ocs_fmt_0__” diff --git a/locales/pt-BR/opencadstudio.ftl b/locales/pt-BR/opencadstudio.ftl index 22723a1dc..35c9279a3 100644 --- a/locales/pt-BR/opencadstudio.ftl +++ b/locales/pt-BR/opencadstudio.ftl @@ -225,9 +225,7 @@ recovery = .failed-description = A recuperação não conseguiu produzir dados de desenho utilizáveis. Revise o relatório e tente um backup ou uma cópia de salvamento automático. .entities-checked = Entidades verificadas .issues-found = Problemas encontrados - .entities-removed = Entidades removidas .references-checked = Referências verificadas - .referenced-entities-removed = Entidades referenciadas removidas .references-unavailable = Referências indisponíveis .log-path = Log de recuperação .log-write-failed = Não foi possível gravar o log de recuperação @@ -2591,8 +2589,6 @@ file = .usage-undo-number-of-steps = Uso: UNDO [número de etapas] .used-for-the-first-save-of-a-new-drawing-exist = Usado no primeiro salvamento de um novo desenho. Desenhos existentes mantêm seu tipo e versão de arquivo. .visual-style-label = Estilo visual: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = Aviso: __ocs_fmt_0__ entidades corrompidas descartadas (dados inválidos do analisador — normais/contagens incorretas) - .warning-corrupt-xref-entities-dropped = Aviso: __ocs_fmt_0__ entidades de referência externa corrompidas descartadas .xref-loaded = XREF “__ocs_fmt_0__” carregada .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: não foi possível criar o ZIP de transmissão (__ocs_fmt_1__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: não é possível criar a pasta (__ocs_fmt_1__). @@ -5638,9 +5634,9 @@ styles = .aci-color-index = Índice de cor ACI .aci = ACI: .audit-no-issues-found = AUDIT: nenhum problema encontrado. - .audit-reference-s-to-undefined-block-s = AUDIT: referências a blocos indefinidos: __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: referências a camadas indefinidas: __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: somente relatório — nenhum reparo automático realizado. + .audit-fix-any-errors-detected = AUDIT Corrigir os erros detectados? [Sim / Não] : + .audit-error-s-warning-s-found = AUDIT: __ocs_fmt_0__ erro(s), __ocs_fmt_1__ aviso(s) encontrado(s). + .audit-repair-s-applied-issue-s-left = AUDIT: __ocs_fmt_0__ reparo(s) aplicado(s), __ocs_fmt_1__ problema(s) não resolvido(s). .audit-scanned-total-object-s = AUDIT: __ocs_fmt_0__ objetos verificados. .above-text = Acima do texto .active-dim-style-set-to-name-arg = Estilo de cota ativo definido como “__ocs_fmt_0__” diff --git a/locales/ru-RU/opencadstudio.ftl b/locales/ru-RU/opencadstudio.ftl index ae46aa3b6..c60d33e8e 100644 --- a/locales/ru-RU/opencadstudio.ftl +++ b/locales/ru-RU/opencadstudio.ftl @@ -225,9 +225,7 @@ recovery = .failed-description = Восстановить пригодные данные чертежа не удалось. Просмотрите отчёт и попробуйте резервную или автоматически сохранённую копию. .entities-checked = Проверено объектов .issues-found = Обнаружено проблем - .entities-removed = Удалено объектов .references-checked = Проверено ссылок - .referenced-entities-removed = Удалено ссылочных объектов .references-unavailable = Недоступные ссылки .log-path = Журнал восстановления .log-write-failed = Не удалось записать журнал восстановления @@ -2594,8 +2592,6 @@ file = .usage-undo-number-of-steps = Использование: UNDO [number of steps] .used-for-the-first-save-of-a-new-drawing-exist = Используется при первом сохранении нового чертежа. Существующие чертежи сохраняют свой тип и версию файла. .visual-style-label = Визуальный стиль: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = Предупреждение: повреждённые объекты пропущены: __ocs_fmt_0__ (ошибочные данные анализатора — неверные нормали или количества) - .warning-corrupt-xref-entities-dropped = Предупреждение: повреждённые объекты внешней ссылки пропущены: __ocs_fmt_0__ .xref-loaded = XREF Загруженный "__ocs_fmt_0__" .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: не удалось создать ZIP-пакет передачи (__ocs_fmt_1__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: не может создавать папку (__ocs_fmt_1__). @@ -5639,9 +5635,9 @@ styles = .aci-color-index = Индекс цвета ACI .aci = ACI: .audit-no-issues-found = AUDIT: не найдено никаких проблем. - .audit-reference-s-to-undefined-block-s = AUDIT: ссылка(ы) на неопределенный(ые) блок(ы): __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: ссылка(ы) на неопределенный(ые) слой(ы): __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: только отчет - не выполняется автоматический ремонт. + .audit-fix-any-errors-detected = AUDIT Исправить обнаруженные ошибки? [Да / Нет] <Нет>: + .audit-error-s-warning-s-found = AUDIT: найдено ошибок: __ocs_fmt_0__, предупреждений: __ocs_fmt_1__. + .audit-repair-s-applied-issue-s-left = AUDIT: применено исправлений: __ocs_fmt_0__, не устранено проблем: __ocs_fmt_1__. .audit-scanned-total-object-s = AUDIT: сканируемый объект (объекты) __ocs_fmt_0__. .above-text = Выше текста .active-dim-style-set-to-name-arg = Активным стилем размеров назначен «__ocs_fmt_0__» diff --git a/locales/tr-TR/opencadstudio.ftl b/locales/tr-TR/opencadstudio.ftl index 80109e3fe..ebca91193 100644 --- a/locales/tr-TR/opencadstudio.ftl +++ b/locales/tr-TR/opencadstudio.ftl @@ -222,9 +222,7 @@ recovery = .failed-description = Kurtarma işlemi kullanılabilir çizim verisi üretemedi. Raporu inceleyip bir yedek veya otomatik kayıt kopyasını deneyin. .entities-checked = Denetlenen obje .issues-found = Bulunan sorun - .entities-removed = Kaldırılan obje .references-checked = Denetlenen referans - .referenced-entities-removed = Referanslardan kaldırılan obje .references-unavailable = Kullanılamayan referans .log-path = Kurtarma günlüğü .log-write-failed = Kurtarma günlüğü yazılamadı @@ -2574,8 +2572,6 @@ file = .usage-undo-number-of-steps = Kullanım: UNDO [number of steps] .used-for-the-first-save-of-a-new-drawing-exist = Yeni bir çizimin ilk kaydında kullanılır. Mevcut çizimler dosya türünü ve sürümünü korur. .visual-style-label = Görsel stil: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = Uyarı: __ocs_fmt_0__ bozuk nesne atıldı (ayrıştırıcı artığı — hatalı normaller / sayılar) - .warning-corrupt-xref-entities-dropped = Uyarı: __ocs_fmt_0__ bozuk dış referans nesnesi atıldı .xref-loaded = XREF "__ocs_fmt_0__" yüklendi .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: aktarım ZIP'i oluşturulamıyor (__ocs_fmt_1__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: Klasör oluşturulamıyor (__ocs_fmt_1__). @@ -5576,9 +5572,9 @@ styles = .aci-color-index = ACI renk dizini .aci = ACI: .audit-no-issues-found = AUDIT: sorun bulunamadı. - .audit-reference-s-to-undefined-block-s = AUDIT: tanımsız bloklara başvurular: __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: tanımsız katmanlara başvurular: __ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT: yalnızca rapor oluşturuldu; otomatik onarım yapılmadı. + .audit-fix-any-errors-detected = AUDIT Bulunan hatalar düzeltilsin mi? [Evet / Hayır] : + .audit-error-s-warning-s-found = AUDIT: __ocs_fmt_0__ hata, __ocs_fmt_1__ uyarı bulundu. + .audit-repair-s-applied-issue-s-left = AUDIT: __ocs_fmt_0__ onarım uygulandı, __ocs_fmt_1__ sorun çözülemedi. .audit-scanned-total-object-s = AUDIT: __ocs_fmt_0__ nesne tarandı. .above-text = Metnin üstünde .active-dim-style-set-to-name-arg = Etkin ölçü stili "__ocs_fmt_0__" olarak ayarlandı. diff --git a/locales/zh-CN/opencadstudio.ftl b/locales/zh-CN/opencadstudio.ftl index a87e01d6e..993d5f538 100644 --- a/locales/zh-CN/opencadstudio.ftl +++ b/locales/zh-CN/opencadstudio.ftl @@ -224,9 +224,7 @@ recovery = .failed-description = 修复未能生成可用的图形数据。请查看报告并尝试备份或自动保存的副本。 .entities-checked = 已检查实体 .issues-found = 发现的问题 - .entities-removed = 已删除实体 .references-checked = 已检查参照 - .referenced-entities-removed = 已删除被参照实体 .references-unavailable = 不可用参照 .log-path = 修复日志 .log-write-failed = 无法写入修复日志 @@ -2578,8 +2576,6 @@ file = .usage-undo-number-of-steps = 用法: UNDO [number of steps] .used-for-the-first-save-of-a-new-drawing-exist = 用于新图形的首次保存。现有图形会保留其自身的文件类型和版本。 .visual-style-label = 视觉风格: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = 警告:已丢弃 __ocs_fmt_0__ 个损坏对象(解析数据无效——法线或计数错误) - .warning-corrupt-xref-entities-dropped = 警告:已丢弃 __ocs_fmt_0__ 个损坏的 xref 对象 .xref-loaded = XREF已装入"__ocs_fmt_0__" .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: 无法创建传输 ZIP(__ocs_fmt_1__)。 .cmd-cannot-create-folder-e = __ocs_fmt_0__:无法创建文件夹(__ocs_fmt_1__). @@ -5621,9 +5617,9 @@ styles = .aci-color-index = ACI 颜色索引 .aci = ACI: .audit-no-issues-found = AUDIT:没有找到问题。 - .audit-reference-s-to-undefined-block-s = AUDIT: 未定义块的引用 : __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: 未定义层的参考:__ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT:只报告——没有进行自动修复。 + .audit-fix-any-errors-detected = AUDIT 修复检测到的错误? [是 / 否] <否>: + .audit-error-s-warning-s-found = AUDIT: 发现 __ocs_fmt_0__ 个错误,__ocs_fmt_1__ 个警告。 + .audit-repair-s-applied-issue-s-left = AUDIT: 已应用 __ocs_fmt_0__ 项修复,__ocs_fmt_1__ 个问题未解决。 .audit-scanned-total-object-s = AUDIT: 扫描__ocs_fmt_0__对象。 .above-text = 上方为文本 .active-dim-style-set-to-name-arg = 当前标注样式已设为“__ocs_fmt_0__” diff --git a/locales/zh-TW/opencadstudio.ftl b/locales/zh-TW/opencadstudio.ftl index 0ff11fa53..efbf617ad 100644 --- a/locales/zh-TW/opencadstudio.ftl +++ b/locales/zh-TW/opencadstudio.ftl @@ -224,9 +224,7 @@ recovery = .failed-description = 修復未能產生可用的圖形資料。請查看報告並嘗試備份或自動儲存的副本。 .entities-checked = 已檢查實體 .issues-found = 發現的問題 - .entities-removed = 已刪除實體 .references-checked = 已檢查參照 - .referenced-entities-removed = 已刪除被參照實體 .references-unavailable = 不可用參照 .log-path = 修復日誌 .log-write-failed = 無法寫入修復日誌 @@ -2590,8 +2588,6 @@ file = .usage-undo-number-of-steps = 用法: UNDO [number of steps] .used-for-the-first-save-of-a-new-drawing-exist = 用於新圖形的首次儲存。現有圖形會保留其自身的檔案類型和版本。 .visual-style-label = 視覺風格: __ocs_fmt_0__. - .warning-corrupt-entities-dropped-parser-junk-b = 警告:已丟棄 __ocs_fmt_0__ 個損壞物件(解析資料無效——法線或計數錯誤) - .warning-corrupt-xref-entities-dropped = 警告:已丟棄 __ocs_fmt_0__ 個損壞的 xref 物件 .xref-loaded = XREF已載入"__ocs_fmt_0__" .cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: 無法建立傳送 ZIP(__ocs_fmt_1__)。 .cmd-cannot-create-folder-e = __ocs_fmt_0__:無法建立資料夾(__ocs_fmt_1__). @@ -5633,9 +5629,9 @@ styles = .aci-color-index = ACI 顏色索引 .aci = ACI: .audit-no-issues-found = AUDIT:沒有找到問題。 - .audit-reference-s-to-undefined-block-s = AUDIT: 未定義圖塊的引用 : __ocs_fmt_0__ - .audit-reference-s-to-undefined-layer-s = AUDIT: 未定義層的參考:__ocs_fmt_0__ - .audit-report-only-no-automatic-repair-performe = AUDIT:只報告——沒有進行自動修復。 + .audit-fix-any-errors-detected = AUDIT 修復偵測到的錯誤? [是 / 否] <否>: + .audit-error-s-warning-s-found = AUDIT: 發現 __ocs_fmt_0__ 個錯誤,__ocs_fmt_1__ 個警告。 + .audit-repair-s-applied-issue-s-left = AUDIT: 已套用 __ocs_fmt_0__ 項修復,__ocs_fmt_1__ 個問題未解決。 .audit-scanned-total-object-s = AUDIT: 掃描__ocs_fmt_0__物件。 .above-text = 上方為文字 .active-dim-style-set-to-name-arg = 目前標註樣式已設為“__ocs_fmt_0__” diff --git a/plugins/opencad-python/Cargo.lock b/plugins/opencad-python/Cargo.lock index c74034305..11cfbc9aa 100644 --- a/plugins/opencad-python/Cargo.lock +++ b/plugins/opencad-python/Cargo.lock @@ -1273,7 +1273,7 @@ dependencies = [ [[package]] name = "opencadcodec" version = "0.6.0" -source = "git+https://github.com/HakanSeven12/opencadcodec.git?rev=cb3ce6a#cb3ce6a93c76a5069f5c2391ee44ea38b4485d15" +source = "git+https://github.com/HakanSeven12/opencadcodec.git?rev=325fa98#325fa98d2b881f48e106a830d5cf161624f63131" dependencies = [ "anyhow", "bitflags", diff --git a/src/app/automation.rs b/src/app/automation.rs index 74b95ce18..1524e09c9 100644 --- a/src/app/automation.rs +++ b/src/app/automation.rs @@ -762,7 +762,7 @@ impl OpenCADStudio { Err(e) => return err(format!("open: {e}")), }; match crate::io::load_bytes_finalized(&path_buf, bytes) { - Ok((doc, dropped)) => { + Ok(doc) => { let i = self.active_tab; self.tabs[i].scene.clear(); self.tabs[i].scene.document = doc; @@ -784,13 +784,7 @@ impl OpenCADStudio { // The opened document settled (API v9): the post-op // boundary announces `DocumentOpened` once for this load. self.tabs[i].note_document_loaded(); - let mut summary = self.entity_summary(); - if dropped > 0 { - if let Some(obj) = summary.as_object_mut() { - obj.insert("purged".to_string(), json!(dropped)); - } - } - summary + self.entity_summary() } Err(e) => err(format!("open: {e}")), } @@ -1903,8 +1897,7 @@ mod tests { fingerprint: None, }); let bytes = std::fs::read(&path).expect("read the fixture back"); - let (document, _dropped) = - crate::io::load_bytes_finalized(&path, bytes).expect("reparse the fixture"); + let document = crate::io::load_bytes_finalized(&path, bytes).expect("reparse the fixture"); let caches = crate::scene::build_derived_caches_with_progress(&document, &|_| {}, None); let _ = plugin_dispatch_log(); let _ = app.update(crate::app::Message::FileOpened( @@ -3839,7 +3832,7 @@ mod tests { } #[test] - fn open_finalizes_and_purges_like_the_ui_open_path() { + fn open_finalizes_like_the_ui_open_path() { let mut app = OpenCADStudio::new_for_test(); let stale = codec::Handle::from(9999); app.tabs[app.active_tab].scene.solid_models.insert( @@ -3857,26 +3850,13 @@ mod tests { good.center = codec::types::Vector3::new(5.0, 5.0, 0.0); good.radius = 2.0; doc.add_entity(codec::EntityType::Circle(good)).unwrap(); - let mut corrupt = codec::entities::Circle::new(); - corrupt.center = codec::types::Vector3::new(1.0, 1.0, 0.0); - // An absurd radius is rejected; a zero radius is valid. - corrupt.radius = 1.0e11; - doc.add_entity(codec::EntityType::Circle(corrupt)).unwrap(); - let bytes = crate::io::save_to_bytes(&doc, "dxf", doc.version) - .expect("save a document containing a corrupt entity"); + let bytes = crate::io::save_to_bytes(&doc, "dxf", doc.version).expect("save the fixture"); std::fs::write(&path, bytes).unwrap(); let p = path.to_string_lossy().replace('\\', "\\\\"); let result = app.automation_op(&format!(r#"{{"op":"open","path":"{p}"}}"#)); assert_eq!(result["ok"], true, "{}", result["error"]); - assert_eq!( - result["total"], 1, - "the corrupt circle must not survive the open" - ); - assert_eq!( - result["purged"], 1, - "the purge count must be reported, matching the UI open path's diagnostics" - ); + assert_eq!(result["total"], 1); let i = app.active_tab; assert!(!app.tabs[i].scene.solid_models.contains_key(&stale)); diff --git a/src/app/commands/blocks.rs b/src/app/commands/blocks.rs index 5259bc53e..c4ca382f9 100644 --- a/src/app/commands/blocks.rs +++ b/src/app/commands/blocks.rs @@ -1128,7 +1128,7 @@ impl OpenCADStudio { .filter(|br| reload_keys.contains(&br.handle.value())) .map(|br| br.handle) .collect(); - let (infos, _dropped) = crate::io::xref::resolve_xrefs_for_keys( + let infos = crate::io::xref::resolve_xrefs_for_keys( &mut self.tabs[i].scene.document, base_dir, &handles, @@ -1674,7 +1674,7 @@ impl OpenCADStudio { self.tabs[i].xref_unloaded.remove(key); self.tabs[i].xref_stat_cache.remove(key); } - let (infos, _dropped) = crate::io::xref::resolve_xrefs( + let infos = crate::io::xref::resolve_xrefs( &mut self.tabs[i].scene.document, &base_dir, ); diff --git a/src/app/commands/styleprops.rs b/src/app/commands/styleprops.rs index d1147aa5f..376f0ae63 100644 --- a/src/app/commands/styleprops.rs +++ b/src/app/commands/styleprops.rs @@ -3635,53 +3635,62 @@ impl OpenCADStudio { .push_error(crate::tf!("COMPARE: {error}").as_ref()), } } + // AUDIT runs the codec's audit; `AUDIT Yes` also applies its + // repair, undoable as one step. "AUDIT" => { - use std::collections::BTreeSet; - let mut undefined_layers: BTreeSet = BTreeSet::new(); - let mut undefined_blocks: BTreeSet = BTreeSet::new(); - let mut total = 0usize; - { + use crate::command::KeywordCommand; + let c = KeywordCommand::new( + "AUDIT", + "AUDIT Fix any errors detected? [Yes / No] :", + vec![("Yes", "YES", None), ("No", "NO", None)], + ) + .with_default("NO"); + self.command_line.push_info(&c.prompt()); + self.tabs[i].active_cmd = Some(Box::new(c)); + } + cmd if cmd.starts_with("AUDIT ") => { + let fix = cmd[6..].trim().to_uppercase().starts_with('Y'); + let report = self.tabs[i].scene.document.audit(); + let total = { let doc = &self.tabs[i].scene.document; - for e in doc.entities() { - total += 1; - let layer = &e.common().layer; - if !layer.is_empty() && doc.layers.get(layer).is_none() { - undefined_layers.insert(layer.clone()); - } - if let codec::EntityType::Insert(ins) = e { - if doc.block_records.get(&ins.block_name).is_none() { - undefined_blocks.insert(ins.block_name.clone()); - } - } - } - } + doc.entities().count() + doc.objects.len() + }; self.command_line .push_output(crate::tf!("AUDIT: scanned {total} object(s).").as_ref()); - if undefined_layers.is_empty() && undefined_blocks.is_empty() { + if report.is_clean() { self.command_line .push_output(crate::t!("AUDIT: no issues found.").as_ref()); - } else { - if !undefined_layers.is_empty() { - self.command_line.push_error( - crate::tf!( - "AUDIT: reference(s) to undefined layer(s): {}", - undefined_layers.into_iter().collect::>().join(", ") - ) - .as_ref(), - ); - } - if !undefined_blocks.is_empty() { - self.command_line.push_error( - crate::tf!( - "AUDIT: reference(s) to undefined block(s): {}", - undefined_blocks.into_iter().collect::>().join(", ") - ) - .as_ref(), - ); - } - self.command_line.push_info( - crate::t!("AUDIT: report only — no automatic repair performed.").as_ref(), + return Some(Task::none()); + } + self.command_line.push_error( + crate::tf!( + "AUDIT: {} error(s), {} warning(s) found.", + report.error_count(), + report.warning_count() + ) + .as_ref(), + ); + // ponytail: first 50 issues only; the counts above cover the rest. + for issue in report.issues.iter().take(50) { + self.command_line + .push_info(&format!(" {:?}: {}", issue.code, issue.message)); + } + if fix { + self.push_undo_snapshot(i, "AUDIT"); + let repair = self.tabs[i].scene.document.repair(); + self.command_line.push_output( + crate::tf!( + "AUDIT: {} repair(s) applied, {} issue(s) left unresolved.", + repair.actions.len(), + repair.unresolved.len() + ) + .as_ref(), ); + if !repair.actions.is_empty() { + self.tabs[i].dirty = true; + self.tabs[i].scene.rebuild_derived_caches(); + self.refresh_layer_panel(); + } } } diff --git a/src/app/control/mod.rs b/src/app/control/mod.rs index cd1dccfd1..834b60e26 100644 --- a/src/app/control/mod.rs +++ b/src/app/control/mod.rs @@ -1009,10 +1009,9 @@ impl OpenCADStudio { "new" => { if let Some(template) = req["template"].as_str() { match self.apply_template(template) { - Ok(purged) => { + Ok(()) => { self.set_control_result(json!({ "template": template, - "purged": purged, "total": self.tabs[i].scene.document.entities().count(), })); Task::none() diff --git a/src/app/control/sheets.rs b/src/app/control/sheets.rs index 3045149ac..486929b5a 100644 --- a/src/app/control/sheets.rs +++ b/src/app/control/sheets.rs @@ -434,7 +434,7 @@ impl OpenCADStudio { /// `new` with `"template"` — the web build reads no files from a path, so /// a template is refused there rather than silently ignored. #[cfg(target_arch = "wasm32")] - pub(in crate::app) fn apply_template(&mut self, _template: &str) -> Result { + pub(in crate::app) fn apply_template(&mut self, _template: &str) -> Result<(), Value> { Err(failure( "invalid_request", "starting from a template needs the desktop build", @@ -445,7 +445,7 @@ impl OpenCADStudio { /// file. Tables and styles come from the template; the document keeps no /// source path. #[cfg(not(target_arch = "wasm32"))] - pub(in crate::app) fn apply_template(&mut self, template: &str) -> Result { + pub(in crate::app) fn apply_template(&mut self, template: &str) -> Result<(), Value> { let path = std::path::PathBuf::from(template); let bytes = self .read_drawing(&path) @@ -461,7 +461,7 @@ impl OpenCADStudio { } else { path.clone() }; - let (mut document, purged) = crate::io::load_bytes_finalized(&load_path, bytes) + let mut document = crate::io::load_bytes_finalized(&load_path, bytes) .map_err(|e| failure("template_failed", e))?; document.source_path = Some(path.to_string_lossy().into_owned()); let i = self.active_tab; @@ -482,7 +482,7 @@ impl OpenCADStudio { // A whole document just became resident in the tab (API v9): the // boundary announces `DocumentOpened` once. self.tabs[i].note_document_loaded(); - Ok(purged) + Ok(()) } /// `file_identity` — stable per-document GUID (the drawing's SPMDOCUNIQUE value, diff --git a/src/app/update/dialog.rs b/src/app/update/dialog.rs index ea74e5f10..66223bb6a 100644 --- a/src/app/update/dialog.rs +++ b/src/app/update/dialog.rs @@ -886,7 +886,7 @@ impl OpenCADStudio { .filter(|br| dwg_picked.iter().any(|(key, _)| *key == br.handle.value())) .map(|br| br.handle) .collect(); - let (infos, _dropped) = crate::io::xref::resolve_xrefs_for_keys( + let infos = crate::io::xref::resolve_xrefs_for_keys( &mut self.tabs[i].scene.document, &base_dir, &handles, @@ -1093,7 +1093,7 @@ impl OpenCADStudio { self.tabs[i].xref_unloaded.remove(key); self.tabs[i].xref_stat_cache.remove(key); } - let (infos, _dropped) = + let infos = crate::io::xref::resolve_xrefs(&mut self.tabs[i].scene.document, &base_dir); let fresh = crate::io::xref::collect_entries_with_prev( &self.tabs[i].scene.document, diff --git a/src/app/update/file.rs b/src/app/update/file.rs index 16bd379cb..c4a7b38bc 100644 --- a/src/app/update/file.rs +++ b/src/app/update/file.rs @@ -2051,34 +2051,13 @@ impl OpenCADStudio { .xrefs .iter() .any(|item| item.status == crate::io::xref::XrefStatus::Failed); - let document_repaired = parser_errors_recovered - || reference_recovered - || caches.corrupt_dropped > 0 - || caches.xref_dropped > 0; + let document_repaired = parser_errors_recovered || reference_recovered; let recovery_needed = document_repaired || reference_failed; let total_ms = open_started .map(|started| started.elapsed().as_millis() as u32) .unwrap_or(0); self.command_line .push_output(crate::tf!("Opened \"{name}\" — {entity_count} entities").as_ref()); - if caches.corrupt_dropped > 0 { - self.command_line.push_error( - crate::tf!( - "Warning: {} corrupt entities dropped (parser junk — bad normals / counts)", - caches.corrupt_dropped - ) - .as_ref(), - ); - } - if caches.xref_dropped > 0 { - self.command_line.push_error( - crate::tf!( - "Warning: {} corrupt xref entities dropped", - caches.xref_dropped - ) - .as_ref(), - ); - } for info in &caches.xrefs { match info.status { crate::io::xref::XrefStatus::Loaded => { @@ -2178,9 +2157,7 @@ impl OpenCADStudio { size_bytes, caches.source_sha256.clone(), caches.read_stats.clone(), - entity_count.saturating_add(caches.corrupt_dropped), - caches.corrupt_dropped, - caches.xref_dropped, + entity_count, &caches.xrefs, &doc.notifications, document_repaired, diff --git a/src/io/mod.rs b/src/io/mod.rs index a0e639614..fa8a619f7 100644 --- a/src/io/mod.rs +++ b/src/io/mod.rs @@ -130,7 +130,7 @@ fn recovery_fingerprint_needed(caches: &DerivedCaches) -> bool { crate::io::xref::XrefStatus::Recovered | crate::io::xref::XrefStatus::Failed ) }); - parser_issue || caches.corrupt_dropped > 0 || caches.xref_dropped > 0 || reference_issue + parser_issue || reference_issue } #[derive(Debug, Clone)] @@ -439,17 +439,10 @@ async fn open_path_with_phase_attempt( let parse_ms = t_parse.elapsed().as_millis() as u32; progress2.set(crate::app::OPEN_PHASE_PARSING, 5800, 1000, 1000); let t_purge = Instant::now(); - let dropped = purge_corrupt_entities(&mut doc); - let purge_ms = t_purge.elapsed().as_millis() as u32; - if matches!(attempt, OpenAttempt::Strict) && dropped > 0 { - return Err(OpenAttemptFailure { - message: format!( - "normal read found {dropped} structurally invalid drawing records" - ), - read_stats: Some(read_stats), - recoverable: true, - }); + if matches!(attempt, OpenAttempt::Recovery(..)) { + repair_drawing(&mut doc); } + let purge_ms = t_purge.elapsed().as_millis() as u32; // Before the geometry is prepared below: repairing the // drawing's stripped catalog linetypes after it would leave // the first view drawn without their shapes. None is added: @@ -457,7 +450,7 @@ async fn open_path_with_phase_attempt( crate::io::linetypes::repair_document(&mut doc); progress2.set(crate::app::OPEN_PHASE_XREF, 6000, 0, 1); let t_xref = Instant::now(); - let (xref_infos, xref_dropped) = if let Some(base_dir) = path2.parent() { + let xref_infos = if let Some(base_dir) = path2.parent() { let xref_progress = { let progress = Arc::clone(&progress2); let callback: Arc = @@ -479,7 +472,7 @@ async fn open_path_with_phase_attempt( Some(xref_progress), ) } else { - (Vec::new(), 0) + Vec::new() }; let xref_ms = t_xref.elapsed().as_millis() as u32; progress2.set(crate::app::OPEN_PHASE_CACHING, 7400, 0, 10000); @@ -506,9 +499,7 @@ async fn open_path_with_phase_attempt( // Filled in after `prepare_open_geometry` below. finalize_ms: 0, }; - caches.corrupt_dropped = dropped; caches.read_stats = Some(read_stats); - caches.xref_dropped = xref_dropped; caches.xrefs = xref_infos; if recovery_fingerprint_needed(&caches) { caches.source_sha256 = @@ -800,25 +791,17 @@ async fn load_web_bytes( fix_current_style_names(&mut doc); crate::entities::field::local_header_dates(&mut doc); progress.set(crate::app::OPEN_PHASE_CACHING, 7000, 0, 1); - let dropped = purge_corrupt_entities(&mut doc); - if !recovery_mode && dropped > 0 { - return Err(OpenLoadError { - message: format!("normal read found {dropped} structurally invalid drawing records"), - source_sha256: None, - read_stats: Some(outcome.stats), - recovery_available: true, - }); + if recovery_mode { + repair_drawing(&mut doc); } // XREFs inside the opened drawing resolve from the in-session bytes // registry (see `resolve_web_xrefs`) before the caches snapshot the // document, so merged xref geometry is part of the caches — the same // phase order the native open uses. - let (xref_infos, xref_dropped) = resolve_web_xrefs(&mut doc, progress.clone()).await; + let xref_infos = resolve_web_xrefs(&mut doc, progress.clone()).await; let mut caches = crate::scene::build_derived_caches(&doc); - caches.corrupt_dropped = dropped; caches.read_stats = Some(outcome.stats); caches.xrefs = xref_infos; - caches.xref_dropped = xref_dropped; if source_sha256.is_none() && recovery_fingerprint_needed(&caches) { source_sha256 = web_worker::sha256_document(bytes).await.ok(); } @@ -891,7 +874,7 @@ pub async fn parse_drawing_bytes_web(name: &str, bytes: &[u8]) -> Result, -) -> (Vec, usize) { +) -> Vec { let pending: Vec = doc .block_records .iter() @@ -995,7 +978,7 @@ pub fn load_bytes(name: &str, bytes: Vec) -> Result { } #[cfg(not(target_arch = "wasm32"))] -pub fn load_bytes_finalized(path: &Path, bytes: Vec) -> Result<(CadDocument, usize), String> { +pub fn load_bytes_finalized(path: &Path, bytes: Vec) -> Result { let name = path .file_name() .map(|n| n.to_string_lossy().into_owned()) @@ -1006,8 +989,7 @@ pub fn load_bytes_finalized(path: &Path, bytes: Vec) -> Result<(CadDocument, doc.source_path = Some(path.to_string_lossy().into_owned()); // Opening is a field evaluation event (FIELDEVAL bit 1). crate::entities::field::update_fields(&mut doc, 1, None); - let dropped = purge_corrupt_entities(&mut doc); - Ok((doc, dropped)) + Ok(doc) } /// Load a DWG or DXF file directly from a path (auto-detect by extension). @@ -1254,7 +1236,6 @@ fn finalize_loaded_outcome( let doc = &mut outcome.document; normalize_block_origins(doc); materialize_missing_block_markers(doc); - normalize_knotless_splines(doc); if outcome.stats.source_format == Some(codec::SourceFormat::Dxf) { fix_dxf_dimension_rotations(doc); fix_dxf_layout_plot_settings(doc); @@ -2679,174 +2660,24 @@ fn sync_current_styles_on_save(doc: &mut CadDocument) { set_sketch_settings(doc, sketch_type, increment, tolerance); } -// ── Corrupt-entity guard ────────────────────────────────────────────────── -// -// opencadcodec's DWG parser occasionally desynchronises on certain files and -// produces entities with garbage fields: non-unit normals (components in -// 1e200+), nonsensical vertex counts (e.g. 100000), or infinite/NaN -// coordinates. Tessellating such entities triggers huge allocations and -// numerical blow-ups in the wire pipeline. -// -// `purge_corrupt_entities` scans the document and removes any entity that -// fails a cheap sanity check, returning the number dropped so the caller can -// surface it to the UI / log. -// -// Keep valid degenerate geometry: dropping it would trigger strict-open recovery. - -fn finite_unit_normal(n: &codec::types::Vector3) -> bool { - let (x, y, z) = (n.x, n.y, n.z); - if !x.is_finite() || !y.is_finite() || !z.is_finite() { - return false; +/// Recovery runs the codec's repair and reports what it did, and what it +/// left, through the drawing's notifications. +pub(crate) fn repair_drawing(doc: &mut CadDocument) { + let repair = doc.repair(); + for action in &repair.actions { + doc.notifications.notify( + codec::notification::NotificationType::Warning, + format!("Recovery repair: {action:?}"), + ); } - let mag2 = x * x + y * y + z * z; - // Accept anything within ~10% of unit length. Real files sometimes - // store slightly denormalised normals from rounding. - (mag2 - 1.0).abs() < 0.21 -} - -fn finite_coord(v: f64) -> bool { - v.is_finite() && v.abs() < 1.0e12 -} - -fn finite_vec3(v: &codec::types::Vector3) -> bool { - finite_coord(v.x) && finite_coord(v.y) && finite_coord(v.z) -} - -/// Returns true if the entity looks like parser garbage and should be dropped. -pub(crate) fn is_entity_corrupt(e: &EntityType) -> bool { - use codec::entities::EntityType as E; - // Reject polylines at or above this vertex count. Even valid drawings - // rarely use this many — and parser desync produces exactly-100_000-vertex - // junk records. - const MAX_VERTS: usize = 100_000; - match e { - E::LwPolyline(p) => { - !finite_unit_normal(&p.normal) - || p.vertices.len() >= MAX_VERTS - || !finite_coord(p.elevation) - || p.elevation.abs() > 1.0e10 - || !finite_coord(p.thickness) - || p.thickness.abs() > 1.0e10 - || p.vertices - .iter() - .any(|v| !finite_coord(v.location.x) || !finite_coord(v.location.y)) - } - E::Polyline2D(p) => { - !finite_unit_normal(&p.normal) - || p.vertices.len() >= MAX_VERTS - || !finite_coord(p.elevation) - || p.elevation.abs() > 1.0e10 - || !finite_coord(p.thickness) - || p.thickness.abs() > 1.0e10 - || p.vertices.iter().any(|v| !finite_vec3(&v.location)) - } - E::Polyline3D(p) => { - p.vertices.len() >= MAX_VERTS || p.vertices.iter().any(|v| !finite_vec3(&v.position)) - } - E::Polyline(p) => { - p.vertices.len() >= MAX_VERTS || p.vertices.iter().any(|v| !finite_vec3(&v.location)) - } - E::Line(l) => !finite_vec3(&l.start) || !finite_vec3(&l.end), - // Zero-radius curves are valid and have bounded kernel tessellation. - E::Circle(c) => { - !finite_vec3(&c.center) || !finite_coord(c.radius) || c.radius.abs() > 1.0e10 - } - E::Arc(a) => { - !finite_vec3(&a.center) - || !finite_coord(a.radius) - || !a.start_angle.is_finite() - || !a.end_angle.is_finite() - || a.radius.abs() > 1.0e10 - || !finite_unit_normal(&a.normal) - } - E::Ellipse(e) => { - !finite_vec3(&e.center) - || !finite_vec3(&e.major_axis) - || !e.start_parameter.is_finite() - || !e.end_parameter.is_finite() - || (e.end_parameter - e.start_parameter).abs() < 1.0e-9 - || { - let m2 = e.major_axis.x * e.major_axis.x - + e.major_axis.y * e.major_axis.y - + e.major_axis.z * e.major_axis.z; - !m2.is_finite() || m2 < 1.0e-20 || m2 > 1.0e20 - } - || !e.minor_axis_ratio.is_finite() - || e.minor_axis_ratio.abs() < 1.0e-10 - } - E::Spline(s) => { - // Parser desync emits exactly-100_000-control-point splines with a - // garbage knot vector. Building a NURBS from one and - // tessellating it runs `parameter_division` into an unbounded - // allocation — single-threaded, 32 GB+ — long before the drawing - // finishes loading. Reject the desync signature plus any spline - // the kernel can't build: non-finite control points, or a knot vector - // that's non-finite, non-monotonic, or the wrong length - // (the kernel requires `knots.len() == ctrl.len() + degree + 1`). - let n = s.control_points.len(); - let degree_bad = s.degree < 1; - let deg = s.degree.max(0) as usize; - let compact_periodic_knots = s.flags.periodic && s.knots.len() == n.saturating_add(1); - let knots_bad = !s.knots.is_empty() - && (s.knots.iter().any(|k| !k.is_finite()) - || s.knots.windows(2).any(|w| w[1] < w[0]) - || (!compact_periodic_knots && s.knots.len() != n + deg + 1)); - // A single control point with no knots and no fit points cannot - // form a curve, and no knot vector exists for it. - let lone_point = n == 1 && s.knots.is_empty() && s.fit_points.is_empty(); - n >= MAX_VERTS - || degree_bad - || lone_point - || s.control_points.iter().any(|p| !finite_vec3(p)) - || knots_bad - } - _ => false, + for issue in &repair.unresolved { + doc.notifications.notify( + codec::notification::NotificationType::Warning, + format!("Recovery left unresolved: {}", issue.message), + ); } } -/// Give control-point splines stored without knots a degree their control -/// points can carry, and the matching clamped knot vector. -/// -/// A degree-p curve needs at least p + 1 control points. Knot generation -/// (here, and in the DWG writer for knot-less splines) subtracts in `usize` -/// and underflows when there are fewer; in release builds the wrapped count -/// drives an unbounded allocation. Lowering the degree keeps the geometry the -/// points describe: two points are a straight segment at any degree. -fn normalize_knotless_splines(doc: &mut CadDocument) { - for entity in doc.entities_mut() { - let EntityType::Spline(spline) = entity else { - continue; - }; - let n = spline.control_points.len(); - if !spline.knots.is_empty() || n < 2 || spline.degree < 1 { - continue; - } - let degree = (spline.degree as usize).min(n - 1); - spline.degree = degree as i32; - spline.knots = codec::entities::Spline::generate_clamped_knots(degree, n); - } -} - -pub fn purge_corrupt_entities(doc: &mut CadDocument) -> usize { - use crate::par::prelude::*; - normalize_knotless_splines(doc); - // Detection is pure and read-only; the per-vertex finite/extent checks on - // large polylines dominate, so fan the scan out across cores. Gather - // entity references in one pass, test in parallel, then remove serially - // (`remove_entity` needs `&mut doc`). - let entities: Vec<&EntityType> = doc.entities().collect(); - let bad: Vec = entities - .par_iter() - .filter(|e| is_entity_corrupt(e)) - .map(|e| e.common().handle) - .collect(); - let n = bad.len(); - for h in bad { - doc.remove_entity(h); - } - n -} - /// opencadcodec's ViewportStatusFlags::from_bits() maps bit 0 → is_on and bit 15 → locked, /// but the real DXF/DWG spec uses bit 15 (0x8000) → viewport on and bit 14 (0x4000) → locked. /// Files from AutoCAD and other tools always set bit 15 for active viewports, leaving bit 0 @@ -3161,214 +2992,6 @@ mod layer_roundtrip_tests { } } -#[cfg(test)] -mod corrupt_guard_tests { - use super::*; - use codec::entities::{Arc, Circle, EntityType, Spline}; - use codec::types::Vector3; - - fn knotless_spline(degree: i32, points: usize) -> Spline { - let mut spline = Spline::new(); - spline.degree = degree; - spline.control_points = (0..points) - .map(|index| Vector3::new(index as f64, index as f64, 0.0)) - .collect(); - spline - } - - // Degree 3 over two control points with no knot vector: generating knots - // for it underflows, and writing it to DWG used to panic (debug) or - // allocate without bound (release). - #[test] - fn knotless_spline_with_too_few_points_is_lowered_and_saves_as_dwg() { - let mut doc = CadDocument::new(); - doc.add_entity(EntityType::Spline(knotless_spline(3, 2))) - .unwrap(); - doc.add_entity(EntityType::Spline(knotless_spline(3, 1))) - .unwrap(); - assert_eq!( - purge_corrupt_entities(&mut doc), - 1, - "the lone point is dropped" - ); - let spline = doc - .entities() - .find_map(|entity| match entity { - EntityType::Spline(spline) => Some(spline.clone()), - _ => None, - }) - .expect("the two-point spline is kept"); - assert_eq!(spline.degree, 1); - assert_eq!(spline.knots, vec![0.0, 0.0, 1.0, 1.0]); - - let path = - std::env::temp_dir().join(format!("ocs_knotless_spline_{}.dwg", std::process::id())); - save_as_version(&doc, &path, codec::DxfVersion::AC1032).expect("save"); - let _ = std::fs::remove_file(&path); - } - - // `load_file` (headless export, xrefs, block import) does not purge, so - // the spline repair has to happen when any load is finalized. - #[test] - fn knotless_spline_is_repaired_by_every_load_path() { - const DXF: &str = - "0\nSECTION\n2\nENTITIES\n0\nSPLINE\n8\n0\n70\n0\n71\n3\n72\n0\n73\n2\n74\n0\n\ -10\n0\n20\n0\n30\n0\n10\n1\n20\n1\n30\n0\n0\nENDSEC\n0\nEOF\n"; - let dir = std::env::temp_dir(); - let source = dir.join(format!("ocs_knotless_load_{}.dxf", std::process::id())); - let target = dir.join(format!("ocs_knotless_load_{}.dwg", std::process::id())); - std::fs::write(&source, DXF).unwrap(); - let doc = load_file(&source).expect("load"); - let _ = std::fs::remove_file(&source); - let spline = doc - .entities() - .find_map(|entity| match entity { - EntityType::Spline(spline) => Some(spline), - _ => None, - }) - .expect("spline"); - assert_eq!(spline.degree, 1); - assert_eq!(spline.knots.len(), 4); - save_as_version(&doc, &target, codec::DxfVersion::AC1032).expect("save"); - let _ = std::fs::remove_file(&target); - } - - // Small but finite arcs are valid records. Kernel tessellation is bounded, - // so opening must retain them instead of treating their size as corruption. - #[test] - fn keeps_small_finite_arc() { - let mut a = Arc::new(); - a.center = Vector3::new(2880.84, 891.83, 0.0); - a.radius = 0.0038974142851181423; - a.start_angle = 1.0401656235942365; - a.end_angle = 1.0401671831670538; - a.normal = Vector3::new(0.0, 0.0, 1.0); - assert!(!is_entity_corrupt(&EntityType::Arc(a))); - } - - // A nearly straight arc still carries valid source geometry. - #[test] - fn keeps_nearly_straight_arc() { - let mut a = Arc::new(); - a.center = Vector3::new(551435.3071786845, 4051623.7156955916, 0.0); - a.radius = 35.0; - a.start_angle = 5.823361856481176; - a.end_angle = 5.823362506017916; - a.normal = Vector3::new(0.0, 0.0, 1.0); - assert!(!is_entity_corrupt(&EntityType::Arc(a))); - } - - // A large-radius small-sweep arc is still a visible curve and must survive: - // radius 1e6 × sweep 1e-4 ≈ 100 units of arc. - #[test] - fn keeps_large_radius_small_sweep_arc() { - let mut a = Arc::new(); - a.radius = 1.0e6; - a.start_angle = 0.0; - a.end_angle = 1.0e-4; - a.normal = Vector3::new(0.0, 0.0, 1.0); - assert!(!is_entity_corrupt(&EntityType::Arc(a))); - } - - #[test] - fn keeps_zero_radius_circle_and_arc() { - let mut c = Circle::new(); - c.center = Vector3::new(206.2, 150.7, 0.0); - c.radius = 0.0; - assert!(!is_entity_corrupt(&EntityType::Circle(c))); - - let mut a = Arc::new(); - a.center = Vector3::new(223.5, 174.5, 0.0); - a.radius = 0.0; - a.start_angle = 0.0; - a.end_angle = 0.0; - a.normal = Vector3::new(0.0, 0.0, 1.0); - assert!(!is_entity_corrupt(&EntityType::Arc(a))); - } - - #[test] - fn drops_absurd_radius_circle() { - let mut c = Circle::new(); - c.radius = 1.0e11; - assert!(is_entity_corrupt(&EntityType::Circle(c))); - let mut c = Circle::new(); - c.radius = f64::NAN; - assert!(is_entity_corrupt(&EntityType::Circle(c))); - } - - // Parser desync emits 100_000-control-point splines; building a kernel - // NURBS from one and tessellating it OOMs. The control-point cap rejects it. - #[test] - fn rejects_desync_spline() { - let pts = vec![Vector3::new(0.0, 0.0, 0.0); 100_000]; - let s = Spline::from_control_points(3, pts); - assert!(is_entity_corrupt(&EntityType::Spline(s))); - } - - // A collapsed spline is still a valid source record. Kernel subdivision - // has a fixed depth bound and can process it safely. - #[test] - fn keeps_degenerate_point_spline() { - let pts = vec![Vector3::new(1e-12, -1e-12, 0.0); 9]; - let s = Spline::from_control_points(3, pts); - assert!(!is_entity_corrupt(&EntityType::Spline(s))); - } - - #[test] - fn keeps_compact_periodic_spline_knots() { - let pts = (0..12) - .map(|index| Vector3::new(index as f64, (index % 3) as f64, 0.0)) - .collect(); - let mut s = Spline::from_control_points(2, pts); - s.flags.closed = true; - s.flags.periodic = true; - s.knots = (0..13).map(|value| value as f64).collect(); - assert!(!is_entity_corrupt(&EntityType::Spline(s))); - } - - // A normal cubic spline (4 control points, valid clamped knots) survives. - #[test] - fn keeps_valid_spline() { - let pts = vec![ - Vector3::new(0.0, 0.0, 0.0), - Vector3::new(1.0, 1.0, 0.0), - Vector3::new(2.0, -1.0, 0.0), - Vector3::new(3.0, 0.0, 0.0), - ]; - let s = Spline::from_control_points(3, pts); - assert!(!is_entity_corrupt(&EntityType::Spline(s))); - } - - // A corrupt or adversarial MINSERT row/column pair (u16, so its unchecked - // product can reach into the billions) must be rejected before it can - // drive the render graph's per-instance allocation and expansion. - #[test] - fn preserves_large_minsert_data_while_rendering_is_bounded() { - let mut i = codec::entities::Insert::new("BLOCK", Vector3::ZERO); - i.row_count = u16::MAX; - i.column_count = u16::MAX; - assert!(!is_entity_corrupt(&EntityType::Insert(i))); - } - - // An ordinary array insert, well under the budget, is valid source data. - #[test] - fn keeps_a_reasonable_minsert() { - let mut i = codec::entities::Insert::new("BLOCK", Vector3::ZERO); - i.row_count = 10; - i.column_count = 10; - i.row_spacing = 5.0; - i.column_spacing = 5.0; - assert!(!is_entity_corrupt(&EntityType::Insert(i))); - } - - // A plain (non-array) INSERT is never treated as a MINSERT-count problem. - #[test] - fn keeps_a_plain_insert() { - let i = codec::entities::Insert::new("BLOCK", Vector3::ZERO); - assert!(!is_entity_corrupt(&EntityType::Insert(i))); - } -} - #[cfg(test)] mod pre_r2000_layer_plot_tests { use super::*; diff --git a/src/io/recovery.rs b/src/io/recovery.rs index 0b1ae1b4d..700033b02 100644 --- a/src/io/recovery.rs +++ b/src/io/recovery.rs @@ -24,8 +24,6 @@ pub struct RecoveryReport { pub source_sha256: Option, pub read_stats: Option, pub entities_scanned: usize, - pub entities_removed: usize, - pub referenced_entities_removed: usize, pub parser_errors_recovered: usize, pub diagnostics: Vec<(String, String)>, pub references_checked: usize, @@ -54,8 +52,6 @@ impl RecoveryReport { source_sha256: Option, read_stats: Option, entities_scanned: usize, - entities_removed: usize, - referenced_entities_removed: usize, references: &[XrefInfo], notifications: &codec::notification::NotificationCollection, save_as_required: bool, @@ -163,8 +159,6 @@ impl RecoveryReport { source_sha256, read_stats, entities_scanned, - entities_removed, - referenced_entities_removed, parser_errors_recovered, diagnostics, references_checked: references.len(), @@ -211,8 +205,6 @@ impl RecoveryReport { .unwrap_or(0), read_stats, entities_scanned: 0, - entities_removed: 0, - referenced_entities_removed: 0, diagnostics: Vec::new(), references_checked: 0, references_loaded: 0, @@ -233,17 +225,11 @@ impl RecoveryReport { } } - pub fn removed_total(&self) -> usize { - self.entities_removed - .saturating_add(self.referenced_entities_removed) - } - pub fn issues_found(&self) -> usize { self.parser_errors_recovered .saturating_add(self.references_recovered) .saturating_add(self.references_failed) .saturating_add(self.references_missing) - .saturating_add(self.removed_total()) .saturating_add(usize::from(self.error.is_some())) } @@ -315,11 +301,6 @@ impl RecoveryReport { )); } lines.push(format!("Entities scanned: {}", self.entities_scanned)); - lines.push(format!("Entities removed: {}", self.entities_removed)); - lines.push(format!( - "Referenced entities removed: {}", - self.referenced_entities_removed - )); lines.push(format!( "Parser errors recovered: {}", self.parser_errors_recovered diff --git a/src/io/xref.rs b/src/io/xref.rs index 13c34f34f..6aade03b0 100644 --- a/src/io/xref.rs +++ b/src/io/xref.rs @@ -277,12 +277,8 @@ fn read_outcome_from_bytes( /// `base_dir`, and populate each xref block with entities from the /// referenced file. /// -/// Returns a list of [`XrefInfo`] describing each xref block found, plus the -/// number of corrupt xref entities dropped during merge. Purging happens -/// inline as each xref's entities are merged — xref content is parser output -/// just like the host doc, so it gets the same corrupt-entity guard. Folding -/// it in here avoids a second full-document `entities()` walk after resolve. -pub fn resolve_xrefs(doc: &mut CadDocument, base_dir: &Path) -> (Vec, usize) { +/// Returns a list of [`XrefInfo`] describing each xref block found. +pub fn resolve_xrefs(doc: &mut CadDocument, base_dir: &Path) -> Vec { resolve_xrefs_with_filter(doc, base_dir, None, None) } @@ -295,7 +291,7 @@ pub fn resolve_xrefs_for_keys( doc: &mut CadDocument, base_dir: &Path, keys: &HashSet, -) -> (Vec, usize) { +) -> Vec { resolve_xrefs_with_filter(doc, base_dir, None, Some(keys)) } @@ -308,7 +304,7 @@ pub fn resolve_xrefs_with_progress( doc: &mut CadDocument, base_dir: &Path, progress: Option>, -) -> (Vec, usize) { +) -> Vec { resolve_xrefs_with_filter(doc, base_dir, progress, None) } @@ -317,7 +313,7 @@ fn resolve_xrefs_with_filter( base_dir: &Path, progress: Option>, only: Option<&HashSet>, -) -> (Vec, usize) { +) -> Vec { // Auto-resolve every xref — frustum + LOD culling keep GPU cost bounded. let xref_entries: Vec<(String, String, Handle)> = doc .block_records @@ -432,7 +428,6 @@ fn resolve_xrefs_with_filter( // Phase 2 — merge each parsed xref into the host document, in the original // block order (par_iter preserves it), so handle allocation is deterministic. let mut result = Vec::with_capacity(parsed.len()); - let mut dropped = 0usize; #[allow(unused_mut, unused_variables)] for ( merge_index, @@ -468,19 +463,7 @@ fn resolve_xrefs_with_filter( .iter() .map(|diagnostic| diagnostic.message.clone()), ); - let invalid = super::purge_corrupt_entities(&mut outcome.document); - if invalid > 0 { - diagnostics.push(format!( - "normal read found {invalid} structurally invalid reference records" - )); - #[cfg(not(target_arch = "wasm32"))] - if source_sha256.is_none() { - source_sha256 = resolved.as_ref().and_then(|path| { - super::stable_sha256_file(path, initial_fingerprint.as_ref()) - }); - } - } - if recovered || invalid > 0 { + if recovered { (XrefStatus::Failed, diagnostics, Some(outcome.stats)) } else { // Reload is replacement, never append. Keep the prior merge @@ -502,7 +485,7 @@ fn resolve_xrefs_with_filter( let _ = unload_reference(doc, br_handle.value()); remove_pipe_symbols(doc, &block_name); ensure_block_entities(doc, &block_name); - dropped += merge_xref_into_block(doc, &block_name, br_handle, outcome.document); + merge_xref_into_block(doc, &block_name, br_handle, outcome.document); if visretain { restore_dependent_layers(doc, &block_name, kept_layers); } @@ -533,7 +516,7 @@ fn resolve_xrefs_with_filter( } } - (result, dropped) + result } /// Underlay files named by a relative (or moved) path: read them from where @@ -1218,13 +1201,12 @@ fn copy_xref_sortents( /// — which doesn't know about the xref's layers — and silently falls /// back to WHITE / 1 px line weight. AutoCAD's BIND command uses the /// same naming scheme. -/// Returns the number of corrupt entities skipped during the merge. fn merge_xref_into_block( doc: &mut CadDocument, xref_block_name: &str, br_handle: Handle, xref_doc: CadDocument, -) -> usize { +) { let prefix = xref_block_name; // Carry the xref's INSUNITS onto the host BlockRecord. Used at INSERT @@ -1264,7 +1246,7 @@ fn merge_xref_into_block( // ── Entities (shared helper) ──────────────────────────────────────── // The unremapped-handle count is ignored on the load path (BIND reports // it per bind). - let (dropped, _, entity_handle_map) = merge_source_entities(doc, &xref_doc, br_handle, &maps); + let (_, entity_handle_map) = merge_source_entities(doc, &xref_doc, br_handle, &maps); // ── Draw-order overrides (shared helper) ────────────────────────────── copy_xref_sortents( @@ -1274,7 +1256,6 @@ fn merge_xref_into_block( &maps.br_handles, &entity_handle_map, ); - dropped } /// Source entities in display order: each block record's `entity_handles` @@ -1308,26 +1289,18 @@ fn ordered_source_entities(xref_doc: &CadDocument) -> Vec<(Handle, EntityType)> /// Merge one source doc's entities into `target`, routing model-space content /// into `target_br` and nested-block content into its imported counterpart -/// (`maps.br_handles`). Returns corrupt-drop count, unremapped-handle count, -/// and the old→new entity handle map for the sortents copy. +/// (`maps.br_handles`). Returns the unremapped-handle count and the old→new +/// entity handle map for the sortents copy. fn merge_source_entities( target: &mut CadDocument, source: &CadDocument, target_br: Handle, maps: &XrefSymbolMaps, -) -> (usize, usize, HashMap) { +) -> (usize, HashMap) { let source_ms_handle = source.header.model_space_block_handle; let mut entity_handle_map: HashMap = HashMap::default(); - let mut dropped = 0usize; let mut unremapped = 0usize; for (old_h, mut entity) in ordered_source_entities(source) { - // Drop parser-garbage entities (bad normals / vertex counts / inf - // coords) before they enter the host doc — they trigger huge - // allocations and unbounded recursion in the wire pipeline. - if super::is_entity_corrupt(&entity) { - dropped += 1; - continue; - } // Remap every symbol reference so the host's resolver hits the copies // just imported (load path ignores the unremapped count; BIND reports // it per bind). @@ -1351,7 +1324,7 @@ fn merge_source_entities( entity_handle_map.insert(old_h, new_h); } } - (dropped, unremapped, entity_handle_map) + (unremapped, entity_handle_map) } fn is_sentinel_linetype(name: &str) -> bool { @@ -2170,8 +2143,7 @@ fn merge_bound_doc( taken, }; let maps = import_xref_symbols(target, source, &mut naming); - let (_, unremapped, entity_handle_map) = - merge_source_entities(target, source, target_br, &maps); + let (unremapped, entity_handle_map) = merge_source_entities(target, source, target_br, &maps); copy_xref_sortents( target, source, @@ -2970,7 +2942,7 @@ mod tests { // 3. Targeted reload: back to Loaded. let mut handles = HashSet::default(); handles.insert(doc.block_records.get("MID").unwrap().handle); - let (infos, _) = resolve_xrefs_for_keys(&mut doc, &dir, &handles); + let infos = resolve_xrefs_for_keys(&mut doc, &dir, &handles); assert!(infos.iter().any(|i| i.name == "MID")); let listed = collect_entries_with_prev(&doc, &dir, &empty, &no_prev); assert!(listed diff --git a/src/locale_catalog.rs b/src/locale_catalog.rs index 8868a5457..16904c85e 100644 --- a/src/locale_catalog.rs +++ b/src/locale_catalog.rs @@ -696,10 +696,10 @@ pub(super) fn message_attribute(source: &str) -> Option<(&'static str, &'static "ATTSYNC block name to sync:" => Some(("insert", "attsync-block-name-to-sync")), "ATTSYNC: no block named \"{arg}\"." => Some(("insert", "attsync-no-block-named-arg")), "ATTSYNC: synchronised {synced} insert(s) of \"{block}\" against {} attribute definition(s)." => Some(("insert", "attsync-synchronised-synced-insert-s-of-block")), + "AUDIT Fix any errors detected? [Yes / No] :" => Some(("styles", "audit-fix-any-errors-detected")), "AUDIT: no issues found." => Some(("styles", "audit-no-issues-found")), - "AUDIT: reference(s) to undefined block(s): {}" => Some(("styles", "audit-reference-s-to-undefined-block-s")), - "AUDIT: reference(s) to undefined layer(s): {}" => Some(("styles", "audit-reference-s-to-undefined-layer-s")), - "AUDIT: report only — no automatic repair performed." => Some(("styles", "audit-report-only-no-automatic-repair-performe")), + "AUDIT: {} error(s), {} warning(s) found." => Some(("styles", "audit-error-s-warning-s-found")), + "AUDIT: {} repair(s) applied, {} issue(s) left unresolved." => Some(("styles", "audit-repair-s-applied-issue-s-left")), "AUDIT: scanned {total} object(s)." => Some(("styles", "audit-scanned-total-object-s")), "About" => Some(("manage", "about")), "Above" => Some(("common", "above")), @@ -3803,8 +3803,6 @@ pub(super) fn message_attribute(source: &str) -> Option<(&'static str, &'static "WIPEOUT Rectangular Specify first corner:" => Some(("draw", "wipeout-rectangular-specify-first-corner")), "WIPEOUT Rectangular Specify opposite corner:" => Some(("draw", "wipeout-rectangular-specify-opposite-corner")), "Warning" => Some(("errors", "warning")), - "Warning: {} corrupt entities dropped (parser junk — bad normals / counts)" => Some(("file", "warning-corrupt-entities-dropped-parser-junk-b")), - "Warning: {} corrupt xref entities dropped" => Some(("file", "warning-corrupt-xref-entities-dropped")), "Watertight" => Some(("properties", "watertight")), "Web" => Some(("common", "web")), "Web File" => Some(("properties", "web-file")), diff --git a/src/scene/cache/block_cache.rs b/src/scene/cache/block_cache.rs index 11897898d..cf0214220 100644 --- a/src/scene/cache/block_cache.rs +++ b/src/scene/cache/block_cache.rs @@ -747,7 +747,7 @@ fn tessellate_sub_local( // Sanity guard: skip sub-entities whose primary dimension is so large // that adaptive tessellation will explode into hundreds of millions // of points. These are typically corrupt-radius primitives that slipped - // past purge_corrupt_entities (finite but absurd values). + // past the codec's unusable-geometry audit (finite but absurd values). if is_unreasonable_extent(sub) { return vec![]; } diff --git a/src/scene/mod.rs b/src/scene/mod.rs index a81d2f444..b79bf2ae8 100644 --- a/src/scene/mod.rs +++ b/src/scene/mod.rs @@ -1221,12 +1221,6 @@ pub struct DerivedCaches { /// Prepared during file open so entity selection/deselection never scans /// the complete object store on the UI thread. pub object_data: crate::entities::object_data::ObjectDataCache, - /// Number of entities removed by the corrupt-entity guard during load. - /// Reported back to the UI so the user knows when a file had parser-junk - /// entities silently dropped. - pub corrupt_dropped: usize, - /// Corrupt entities dropped while resolving referenced drawings. - pub xref_dropped: usize, /// XREF resolution results produced by the loader worker. Keeping these in /// the open bundle prevents parsing and merging references on the UI thread. pub xrefs: Vec, @@ -1523,8 +1517,6 @@ fn build_derived_caches_impl( meshes, block_meshes, object_data, - corrupt_dropped: 0, - xref_dropped: 0, xrefs: Vec::new(), prepared_geometry: None, timings: OpenTimings::default(), diff --git a/src/ui/window/recovery.rs b/src/ui/window/recovery.rs index 1030a2b26..beae8d90c 100644 --- a/src/ui/window/recovery.rs +++ b/src/ui/window/recovery.rs @@ -62,10 +62,6 @@ pub fn view_window<'a>( crate::tr!("recovery", "issues-found"), report.issues_found().to_string(), ), - metric( - crate::tr!("recovery", "entities-removed"), - report.removed_total().to_string(), - ), metric( crate::tr!("recovery", "references-checked"), report.references_checked.to_string(), @@ -75,16 +71,6 @@ pub fn view_window<'a>( .width(Fill); let mut details = column![].spacing(6); - if report.referenced_entities_removed > 0 { - details = details.push( - text(format!( - "{}: {}", - crate::tr!("recovery", "referenced-entities-removed"), - report.referenced_entities_removed - )) - .size(11), - ); - } if report.references_missing > 0 || report.references_failed > 0 { details = details.push( text(format!(