forked from 1b-agent/opencadstudio-upstream
Merge remote-tracking branch 'origin/main' into codex/import-formats
# Conflicts: # Cargo.lock
This commit is contained in:
commit
d8959a4635
43 files changed
+189
-760
No files matched your search
Generated
+1
-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",
|
||||
|
||||
+4
-4
@@ -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.
|
||||
|
||||
@@ -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"
|
||||
@@ -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"] }
|
||||
@@ -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"
|
||||
|
||||
@@ -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" }
|
||||
@@ -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__"
|
||||
|
||||
@@ -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__"
|
||||
|
||||
@@ -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] <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__"
|
||||
|
||||
@@ -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] <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
|
||||
|
||||
@@ -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__"
|
||||
|
||||
@@ -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] <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__"
|
||||
|
||||
@@ -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] <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__»
|
||||
|
||||
@@ -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] <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__"
|
||||
|
||||
@@ -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] <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__ »
|
||||
|
||||
@@ -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__" के लिए सेट
|
||||
|
||||
@@ -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] <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__”
|
||||
|
||||
@@ -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] <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__"
|
||||
|
||||
@@ -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__" に設定しました
|
||||
|
||||
@@ -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__"로 설정됨
|
||||
|
||||
@@ -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__"
|
||||
|
||||
@@ -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] <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__"
|
||||
|
||||
@@ -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] <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__”
|
||||
|
||||
@@ -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] <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__”
|
||||
|
||||
@@ -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__»
|
||||
|
||||
@@ -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] <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ı.
|
||||
|
||||
@@ -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__”
|
||||
|
||||
@@ -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__”
|
||||
|
||||
Generated
+1
-1
@@ -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",
|
||||
|
||||
+6
-26
@@ -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));
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
|
||||
@@ -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<String> = BTreeSet::new();
|
||||
let mut undefined_blocks: BTreeSet<String> = BTreeSet::new();
|
||||
let mut total = 0usize;
|
||||
{
|
||||
use crate::command::KeywordCommand;
|
||||
let c = KeywordCommand::new(
|
||||
"AUDIT",
|
||||
"AUDIT Fix any errors detected? [Yes / No] <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::<Vec<_>>().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::<Vec<_>>().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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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<usize, Value> {
|
||||
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<usize, Value> {
|
||||
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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
+2
-25
@@ -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,
|
||||
|
||||
+26
-403
@@ -135,7 +135,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)]
|
||||
@@ -444,17 +444,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:
|
||||
@@ -462,7 +455,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<dyn Fn(usize, usize) + Send + Sync> =
|
||||
@@ -484,7 +477,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);
|
||||
@@ -511,9 +504,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 =
|
||||
@@ -805,25 +796,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();
|
||||
}
|
||||
@@ -896,7 +879,7 @@ pub async fn parse_drawing_bytes_web(name: &str, bytes: &[u8]) -> Result<CadDocu
|
||||
async fn resolve_web_xrefs(
|
||||
doc: &mut CadDocument,
|
||||
progress: Arc<OpenProgressState>,
|
||||
) -> (Vec<crate::io::xref::XrefInfo>, usize) {
|
||||
) -> Vec<crate::io::xref::XrefInfo> {
|
||||
let pending: Vec<String> = doc
|
||||
.block_records
|
||||
.iter()
|
||||
@@ -1000,7 +983,7 @@ pub fn load_bytes(name: &str, bytes: Vec<u8>) -> Result<CadDocument, String> {
|
||||
}
|
||||
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
pub fn load_bytes_finalized(path: &Path, bytes: Vec<u8>) -> Result<(CadDocument, usize), String> {
|
||||
pub fn load_bytes_finalized(path: &Path, bytes: Vec<u8>) -> Result<CadDocument, String> {
|
||||
let name = path
|
||||
.file_name()
|
||||
.map(|n| n.to_string_lossy().into_owned())
|
||||
@@ -1011,8 +994,7 @@ pub fn load_bytes_finalized(path: &Path, bytes: Vec<u8>) -> 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).
|
||||
@@ -1259,7 +1241,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);
|
||||
@@ -2684,174 +2665,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<codec::Handle> = 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
|
||||
@@ -3166,214 +2997,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::*;
|
||||
|
||||
@@ -24,8 +24,6 @@ pub struct RecoveryReport {
|
||||
pub source_sha256: Option<String>,
|
||||
pub read_stats: Option<codec::ReadStats>,
|
||||
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<String>,
|
||||
read_stats: Option<codec::ReadStats>,
|
||||
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
|
||||
|
||||
+16
-44
@@ -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<XrefInfo>, usize) {
|
||||
/// Returns a list of [`XrefInfo`] describing each xref block found.
|
||||
pub fn resolve_xrefs(doc: &mut CadDocument, base_dir: &Path) -> Vec<XrefInfo> {
|
||||
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<Handle>,
|
||||
) -> (Vec<XrefInfo>, usize) {
|
||||
) -> Vec<XrefInfo> {
|
||||
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<std::sync::Arc<dyn Fn(usize, usize) + Send + Sync>>,
|
||||
) -> (Vec<XrefInfo>, usize) {
|
||||
) -> Vec<XrefInfo> {
|
||||
resolve_xrefs_with_filter(doc, base_dir, progress, None)
|
||||
}
|
||||
|
||||
@@ -317,7 +313,7 @@ fn resolve_xrefs_with_filter(
|
||||
base_dir: &Path,
|
||||
progress: Option<std::sync::Arc<dyn Fn(usize, usize) + Send + Sync>>,
|
||||
only: Option<&HashSet<Handle>>,
|
||||
) -> (Vec<XrefInfo>, usize) {
|
||||
) -> Vec<XrefInfo> {
|
||||
// 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<Handle, Handle>) {
|
||||
) -> (usize, HashMap<Handle, Handle>) {
|
||||
let source_ms_handle = source.header.model_space_block_handle;
|
||||
let mut entity_handle_map: HashMap<Handle, Handle> = 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
|
||||
|
||||
@@ -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] <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")),
|
||||
@@ -3799,8 +3799,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")),
|
||||
|
||||
Vendored
+1
-1
@@ -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![];
|
||||
}
|
||||
|
||||
@@ -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<crate::io::xref::XrefInfo>,
|
||||
@@ -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(),
|
||||
|
||||
@@ -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!(
|
||||
|
||||
Reference in new issue
Block a user