Merge remote-tracking branch 'origin/main' into codex/import-formats

# Conflicts:
#	Cargo.lock
This commit is contained in:
ramox81 committed 2026-10-16 16:58:41 +03:00
commit d8959a4635
43 files changed
+189 -760

No files matched your search

Generated
+1 -1
View File
@@ -4406,7 +4406,7 @@ dependencies = [
[[package]] [[package]]
name = "opencadgraph" name = "opencadgraph"
version = "0.1.0" 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 = [ dependencies = [
"opencadkernel", "opencadkernel",
"serde_json", "serde_json",
+4 -4
View File
@@ -37,10 +37,10 @@ rfd = "0.17"
clap = { version = "4", features = ["derive", "string"] } clap = { version = "4", features = ["derive", "string"] }
env_logger = "0.11" env_logger = "0.11"
log = "0.4" log = "0.4"
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"] }
kernel = { package = "opencadkernel", git = "https://github.com/HakanSeven12/opencadkernel.git", rev = "40f59ca", features = ["acis", "offset"] } 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 = "40f59ca" } 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 = "a4bd351" } graph = { package = "opencadgraph", git = "https://github.com/HakanSeven12/opencadgraph.git", rev = "5d4e713" }
dwg-thumbnailer = { path = "crates/dwg-thumbnailer" } dwg-thumbnailer = { path = "crates/dwg-thumbnailer" }
# Shared SAVE serialization dispatch + web-worker wire format: one # Shared SAVE serialization dispatch + web-worker wire format: one
# implementation for the inline (fallback/native) path and the worker path. # implementation for the inline (fallback/native) path and the worker path.
+2 -2
View File
@@ -15,7 +15,7 @@ serde_json = { version = "1", optional = true }
# Pulled in only by the `host` feature, which adds the `opencadcodec`-typed # Pulled in only by the `host` feature, which adds the `opencadcodec`-typed
# `HostApi` runtime surface. The default crate stays dependency-free so engine # `HostApi` runtime surface. The default crate stays dependency-free so engine
# crates and external tooling can depend on the manifest/ribbon contract cheaply. # 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). # Runtime IPC and serialization (host feature only).
interprocess = { version = "2", optional = true } interprocess = { version = "2", optional = true }
@@ -39,7 +39,7 @@ serde_json = "1"
serde = { version = "1", features = ["derive"] } serde = { version = "1", features = ["derive"] }
cargo-lock = "11" cargo-lock = "11"
# opencadcodec is scanned at build time to generate the embedded type registry. # 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] [dev-dependencies]
serde_json = "1" serde_json = "1"
+1 -1
View File
@@ -10,6 +10,6 @@ publish = false
# exactly one implementation. No UI/app dependencies — only the codec + serde. # exactly one implementation. No UI/app dependencies — only the codec + serde.
[dependencies] [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" bincode = "1.3"
serde = { version = "1", features = ["derive"] } serde = { version = "1", features = ["derive"] }
+1 -1
View File
@@ -8,7 +8,7 @@ publish = false
crate-type = ["cdylib"] crate-type = ["cdylib"]
[dependencies] [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" bincode = "1.3"
serde = { version = "1", features = ["derive"] } serde = { version = "1", features = ["derive"] }
console_error_panic_hook = "0.1" console_error_panic_hook = "0.1"
+1 -1
View File
@@ -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 # 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` / # only when both resolve the same revision. The registration `rustc` /
# `acadrust_source` gates enforce this at load time too. # `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" }
+3 -7
View File
@@ -225,9 +225,7 @@ recovery =
.failed-description = تعذر على الاسترداد إنتاج بيانات رسم قابلة للاستخدام. راجع التقرير وجرّب نسخة احتياطية أو نسخة حفظ تلقائي. .failed-description = تعذر على الاسترداد إنتاج بيانات رسم قابلة للاستخدام. راجع التقرير وجرّب نسخة احتياطية أو نسخة حفظ تلقائي.
.entities-checked = الكيانات التي تم فحصها .entities-checked = الكيانات التي تم فحصها
.issues-found = المشكلات الموجودة .issues-found = المشكلات الموجودة
.entities-removed = الكيانات التي تمت إزالتها
.references-checked = المراجع التي تم فحصها .references-checked = المراجع التي تم فحصها
.referenced-entities-removed = الكيانات المرجعية التي تمت إزالتها
.references-unavailable = المراجع غير المتاحة .references-unavailable = المراجع غير المتاحة
.log-path = سجل الاسترداد .log-path = سجل الاسترداد
.log-write-failed = تعذرت كتابة سجل الاسترداد .log-write-failed = تعذرت كتابة سجل الاسترداد
@@ -2603,8 +2601,6 @@ file =
.usage-undo-number-of-steps = الاستخدام: UNDO [number of steps] .usage-undo-number-of-steps = الاستخدام: UNDO [number of steps]
.used-for-the-first-save-of-a-new-drawing-exist = يُستخدم للحفظ الأول لرسم جديد. تحتفظ الرسومات الحالية بنوع ملفها وإصدارها. .used-for-the-first-save-of-a-new-drawing-exist = يُستخدم للحفظ الأول لرسم جديد. تحتفظ الرسومات الحالية بنوع ملفها وإصدارها.
.visual-style-label = النمط المرئي: __ocs_fmt_0__. .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__" .xref-loaded = XREF حُمّل "__ocs_fmt_0__"
.cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: لا يمكن إنشاء ZIP الإرسال (__ocs_fmt_1__). .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__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: تعذر إنشاء المجلد (__ocs_fmt_1__).
@@ -5650,9 +5646,9 @@ styles =
.aci-color-index = فهرس ألوان ACI .aci-color-index = فهرس ألوان ACI
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: لم يُعثر على مشكلات. .audit-no-issues-found = AUDIT: لم يُعثر على مشكلات.
.audit-reference-s-to-undefined-block-s = AUDIT: مراجع إلى كتل غير معرّفة: __ocs_fmt_0__ .audit-fix-any-errors-detected = AUDIT هل تريد إصلاح الأخطاء المكتشفة؟ [نعم / لا] <لا>:
.audit-reference-s-to-undefined-layer-s = AUDIT: مراجع إلى طبقات غير معرّفة: __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: تم العثور على __ocs_fmt_0__ خطأ و__ocs_fmt_1__ تحذير.
.audit-report-only-no-automatic-repair-performe = AUDIT: تقرير فقط — لم يُجرَ إصلاح تلقائي. .audit-repair-s-applied-issue-s-left = AUDIT: تم تطبيق __ocs_fmt_0__ إصلاح، و__ocs_fmt_1__ مشكلة بلا حل.
.audit-scanned-total-object-s = AUDIT: فُحص __ocs_fmt_0__ كائن. .audit-scanned-total-object-s = AUDIT: فُحص __ocs_fmt_0__ كائن.
.above-text = أعلى النص .above-text = أعلى النص
.active-dim-style-set-to-name-arg = عُيّن نمط الأبعاد النشط إلى "__ocs_fmt_0__" .active-dim-style-set-to-name-arg = عُيّن نمط الأبعاد النشط إلى "__ocs_fmt_0__"
+3 -7
View File
@@ -225,9 +225,7 @@ recovery =
.failed-description = Възстановяването не успя да генерира използваеми чертожни данни. Прегледай отчета и опитай резервно копие или копие от автоматично запазване. .failed-description = Възстановяването не успя да генерира използваеми чертожни данни. Прегледай отчета и опитай резервно копие или копие от автоматично запазване.
.entities-checked = Проверени обекти .entities-checked = Проверени обекти
.issues-found = Открити проблеми .issues-found = Открити проблеми
.entities-removed = Премахнати обекти
.references-checked = Проверени препратки .references-checked = Проверени препратки
.referenced-entities-removed = Премахнати препратени обекти
.references-unavailable = Препратките не са налични .references-unavailable = Препратките не са налични
.log-path = Дневник за възстановяване .log-path = Дневник за възстановяване
.log-write-failed = Дневникът за възстановяване не можа да бъде записан .log-write-failed = Дневникът за възстановяване не можа да бъде записан
@@ -2590,8 +2588,6 @@ file =
.usage-undo-number-of-steps = Употреба: UNDO [брой стъпки] .usage-undo-number-of-steps = Употреба: UNDO [брой стъпки]
.used-for-the-first-save-of-a-new-drawing-exist = Използва се при първото запазване на нов чертеж. Съществуващите чертежи запазват своя тип файл и версия. .used-for-the-first-save-of-a-new-drawing-exist = Използва се при първото запазване на нов чертеж. Съществуващите чертежи запазват своя тип файл и версия.
.visual-style-label = Визуален стил: __ocs_fmt_0__. .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__" .xref-loaded = XREF Зареден "__ocs_fmt_0__"
.cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: не може да се създаде ZIP за предаване (__ocs_fmt_1__). .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__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: папката не може да бъде създадена (__ocs_fmt_1__).
@@ -5638,9 +5634,9 @@ styles =
.aci-color-index = ACI Цветови индекс .aci-color-index = ACI Цветови индекс
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: не са открити проблеми. .audit-no-issues-found = AUDIT: не са открити проблеми.
.audit-reference-s-to-undefined-block-s = AUDIT: препратка/и към недефинирани блок(ове): __ocs_fmt_0__ .audit-fix-any-errors-detected = AUDIT Да се поправят ли откритите грешки? [Да / Не] <Не>:
.audit-reference-s-to-undefined-layer-s = AUDIT: препратка/и към недефинирани слой(еве): __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: открити грешки: __ocs_fmt_0__, предупреждения: __ocs_fmt_1__.
.audit-report-only-no-automatic-repair-performe = AUDIT: само отчет — не е извършена автоматична поправка. .audit-repair-s-applied-issue-s-left = AUDIT: приложени поправки: __ocs_fmt_0__, нерешени проблеми: __ocs_fmt_1__.
.audit-scanned-total-object-s = AUDIT: сканирани __ocs_fmt_0__ обект(а). .audit-scanned-total-object-s = AUDIT: сканирани __ocs_fmt_0__ обект(а).
.above-text = Над текста .above-text = Над текста
.active-dim-style-set-to-name-arg = Активният стил за оразмеряване е зададен на "__ocs_fmt_0__" .active-dim-style-set-to-name-arg = Активният стил за оразмеряване е зададен на "__ocs_fmt_0__"
+3 -7
View File
@@ -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. .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 .entities-checked = Zkontrolované entity
.issues-found = Nalezené problémy .issues-found = Nalezené problémy
.entities-removed = Odstraněné entity
.references-checked = Zkontrolované reference .references-checked = Zkontrolované reference
.referenced-entities-removed = Odstraněné odkazované entity
.references-unavailable = Nedostupné reference .references-unavailable = Nedostupné reference
.log-path = Protokol obnovení .log-path = Protokol obnovení
.log-write-failed = Protokol obnovení se nepodařilo zapsat .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ů] .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. .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__. .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__" .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-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__). .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-color-index = Barevný index ACI
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: nebyly nalezeny žádné problémy. .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-fix-any-errors-detected = AUDIT Opravit zjištěné chyby? [Ano / Ne] <Ne>:
.audit-reference-s-to-undefined-layer-s = AUDIT: reference na nedefinované vrstvy: __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: nalezeno chyb: __ocs_fmt_0__, varování: __ocs_fmt_1__.
.audit-report-only-no-automatic-repair-performe = AUDIT: pouze zpráva – neprovádí se žádná automatická oprava. .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__. .audit-scanned-total-object-s = AUDIT: skenovaný objekt(y) __ocs_fmt_0__.
.above-text = Nad textem .above-text = Nad textem
.active-dim-style-set-to-name-arg = Styl aktivního ztlumení nastaven na "__ocs_fmt_0__" .active-dim-style-set-to-name-arg = Styl aktivního ztlumení nastaven na "__ocs_fmt_0__"
+3 -7
View File
@@ -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. .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 .entities-checked = Geprüfte Objekte
.issues-found = Gefundene Probleme .issues-found = Gefundene Probleme
.entities-removed = Entfernte Objekte
.references-checked = Geprüfte Referenzen .references-checked = Geprüfte Referenzen
.referenced-entities-removed = Entfernte referenzierte Objekte
.references-unavailable = Nicht verfügbare Referenzen .references-unavailable = Nicht verfügbare Referenzen
.log-path = Wiederherstellungsprotokoll .log-path = Wiederherstellungsprotokoll
.log-write-failed = Wiederherstellungsprotokoll konnte nicht geschrieben werden .log-write-failed = Wiederherstellungsprotokoll konnte nicht geschrieben werden
@@ -2591,8 +2589,6 @@ file =
.usage-undo-number-of-steps = Anwendung: UNDO [number of steps] .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. .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__. .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__" .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-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__). .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-color-index = ACI Farbindex
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: keine Probleme gefunden. .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-fix-any-errors-detected = AUDIT Gefundene Fehler beheben? [Ja / Nein] <Nein>:
.audit-reference-s-to-undefined-layer-s = AUDIT: Referenz(en) auf undefinierte Ebene(n): __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: __ocs_fmt_0__ Fehler, __ocs_fmt_1__ Warnung(en) gefunden.
.audit-report-only-no-automatic-repair-performe = AUDIT: Nur Bericht erstatten — keine automatische Reparatur durchgeführt. .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). .audit-scanned-total-object-s = AUDIT: gescanntes __ocs_fmt_0__ Objekt(e).
.above-text = Vorstehender Text .above-text = Vorstehender Text
.active-dim-style-set-to-name-arg = Aktiver Bemaßungsstil auf „__ocs_fmt_0__“ gesetzt .active-dim-style-set-to-name-arg = Aktiver Bemaßungsstil auf „__ocs_fmt_0__“ gesetzt
+3 -7
View File
@@ -224,9 +224,7 @@ recovery =
.failed-description = Η ανάκτηση δεν μπόρεσε να παραγάγει αξιοποιήσιμα δεδομένα σχεδίου. Ελέγξτε την αναφορά και δοκιμάστε ένα αντίγραφο ασφαλείας ή αυτόματης αποθήκευσης. .failed-description = Η ανάκτηση δεν μπόρεσε να παραγάγει αξιοποιήσιμα δεδομένα σχεδίου. Ελέγξτε την αναφορά και δοκιμάστε ένα αντίγραφο ασφαλείας ή αυτόματης αποθήκευσης.
.entities-checked = Οντότητες που ελέγχθηκαν .entities-checked = Οντότητες που ελέγχθηκαν
.issues-found = Προβλήματα που βρέθηκαν .issues-found = Προβλήματα που βρέθηκαν
.entities-removed = Οντότητες που αφαιρέθηκαν
.references-checked = Αναφορές που ελέγχθηκαν .references-checked = Αναφορές που ελέγχθηκαν
.referenced-entities-removed = Αναφερόμενες οντότητες που αφαιρέθηκαν
.references-unavailable = Οι αναφορές δεν είναι διαθέσιμες .references-unavailable = Οι αναφορές δεν είναι διαθέσιμες
.log-path = Αρχείο καταγραφής ανάκτησης .log-path = Αρχείο καταγραφής ανάκτησης
.log-write-failed = Δεν ήταν δυνατή η εγγραφή του αρχείου καταγραφής ανάκτησης .log-write-failed = Δεν ήταν δυνατή η εγγραφή του αρχείου καταγραφής ανάκτησης
@@ -2590,8 +2588,6 @@ file =
.usage-undo-number-of-steps = Χρήση: UNDO [αριθμός βημάτων] .usage-undo-number-of-steps = Χρήση: UNDO [αριθμός βημάτων]
.used-for-the-first-save-of-a-new-drawing-exist = Χρησιμοποιείται στην πρώτη αποθήκευση ενός νέου σχεδίου. Τα υπάρχοντα σχέδια διατηρούν τον τύπο και την έκδοση του αρχείου τους. .used-for-the-first-save-of-a-new-drawing-exist = Χρησιμοποιείται στην πρώτη αποθήκευση ενός νέου σχεδίου. Τα υπάρχοντα σχέδια διατηρούν τον τύπο και την έκδοση του αρχείου τους.
.visual-style-label = Οπτικό στυλ: __ocs_fmt_0__. .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__" .xref-loaded = XREF Φορτώθηκε το "__ocs_fmt_0__"
.cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: δεν είναι δυνατή η δημιουργία του ZIP μεταφοράς (__ocs_fmt_1__). .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__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: δεν είναι δυνατή η δημιουργία φακέλου (__ocs_fmt_1__).
@@ -5638,9 +5634,9 @@ styles =
.aci-color-index = Δείκτης χρώματος ACI .aci-color-index = Δείκτης χρώματος ACI
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: δεν βρέθηκαν προβλήματα. .audit-no-issues-found = AUDIT: δεν βρέθηκαν προβλήματα.
.audit-reference-s-to-undefined-block-s = AUDIT: αναφορά(ές) σε μη ορισμένα μπλοκ: __ocs_fmt_0__ .audit-fix-any-errors-detected = AUDIT Διόρθωση των σφαλμάτων που εντοπίστηκαν; [Ναι / Όχι] <Όχι>:
.audit-reference-s-to-undefined-layer-s = AUDIT: αναφορά(ές) σε μη ορισμένα επίπεδα: __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: βρέθηκαν __ocs_fmt_0__ σφάλματα, __ocs_fmt_1__ προειδοποιήσεις.
.audit-report-only-no-automatic-repair-performe = AUDIT: μόνο αναφορά — δεν έγινε αυτόματη επιδιόρθωση. .audit-repair-s-applied-issue-s-left = AUDIT: εφαρμόστηκαν __ocs_fmt_0__ επιδιορθώσεις, __ocs_fmt_1__ προβλήματα παραμένουν άλυτα.
.audit-scanned-total-object-s = AUDIT: σαρώθηκαν __ocs_fmt_0__ αντικείμενο(α). .audit-scanned-total-object-s = AUDIT: σαρώθηκαν __ocs_fmt_0__ αντικείμενο(α).
.above-text = Πάνω από το κείμενο .above-text = Πάνω από το κείμενο
.active-dim-style-set-to-name-arg = Το ενεργό στυλ διαστάσεων ορίστηκε σε "__ocs_fmt_0__" .active-dim-style-set-to-name-arg = Το ενεργό στυλ διαστάσεων ορίστηκε σε "__ocs_fmt_0__"
+3 -7
View File
@@ -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. .failed-description = Recovery could not produce usable drawing data. Review the report and try a backup or automatic-save copy.
.entities-checked = Entities checked .entities-checked = Entities checked
.issues-found = Issues found .issues-found = Issues found
.entities-removed = Entities removed
.references-checked = References checked .references-checked = References checked
.referenced-entities-removed = Referenced entities removed
.references-unavailable = References unavailable .references-unavailable = References unavailable
.log-path = Recovery log .log-path = Recovery log
.log-write-failed = Recovery log could not be written .log-write-failed = Recovery log could not be written
@@ -2591,8 +2589,6 @@ file =
.usage-undo-number-of-steps = Usage: UNDO [number of steps] .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. .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__. .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__" .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-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__). .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-color-index = ACI Color Index
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: no issues found. .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-fix-any-errors-detected = AUDIT Fix any errors detected? [Yes / No] <No>:
.audit-reference-s-to-undefined-layer-s = AUDIT: reference(s) to undefined layer(s): __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: __ocs_fmt_0__ error(s), __ocs_fmt_1__ warning(s) found.
.audit-report-only-no-automatic-repair-performe = AUDIT: report only — no automatic repair performed. .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). .audit-scanned-total-object-s = AUDIT: scanned __ocs_fmt_0__ object(s).
.above-text = Above text .above-text = Above text
.active-dim-style-set-to-name-arg = Active dim style set to "__ocs_fmt_0__" .active-dim-style-set-to-name-arg = Active dim style set to "__ocs_fmt_0__"
+3 -7
View File
@@ -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. .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 .entities-checked = Entidades comprobadas
.issues-found = Problemas encontrados .issues-found = Problemas encontrados
.entities-removed = Entidades eliminadas
.references-checked = Referencias comprobadas .references-checked = Referencias comprobadas
.referenced-entities-removed = Entidades referenciadas eliminadas
.references-unavailable = Referencias no disponibles .references-unavailable = Referencias no disponibles
.log-path = Registro de recuperación .log-path = Registro de recuperación
.log-write-failed = No se pudo escribir el 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] .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. .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__. .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__» .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-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__). .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-color-index = Índice de color ACI
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: no se encontraron problemas. .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-fix-any-errors-detected = AUDIT ¿Corregir los errores detectados? [Sí / No] <No>:
.audit-reference-s-to-undefined-layer-s = AUDIT: referencias a capas no definidas: __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: __ocs_fmt_0__ error(es), __ocs_fmt_1__ advertencia(s) encontrados.
.audit-report-only-no-automatic-repair-performe = AUDIT: solo informe; no se realizó ninguna reparación automática. .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. .audit-scanned-total-object-s = AUDIT: se examinaron __ocs_fmt_0__ objetos.
.above-text = Encima del texto .above-text = Encima del texto
.active-dim-style-set-to-name-arg = Estilo de cota activo definido como «__ocs_fmt_0__» .active-dim-style-set-to-name-arg = Estilo de cota activo definido como «__ocs_fmt_0__»
+3 -7
View File
@@ -225,9 +225,7 @@ recovery =
.failed-description = Palautus ei tuottanut käyttökelpoisia piirustustietoja. Tarkista raportti ja kokeile varmuuskopiota tai automaattisesti tallennettua kopiota. .failed-description = Palautus ei tuottanut käyttökelpoisia piirustustietoja. Tarkista raportti ja kokeile varmuuskopiota tai automaattisesti tallennettua kopiota.
.entities-checked = Tarkistetut entiteetit .entities-checked = Tarkistetut entiteetit
.issues-found = Havaitut ongelmat .issues-found = Havaitut ongelmat
.entities-removed = Poistetut entiteetit
.references-checked = Tarkistetut viitteet .references-checked = Tarkistetut viitteet
.referenced-entities-removed = Poistetut viitatut entiteetit
.references-unavailable = Viitteet eivät ole käytettävissä .references-unavailable = Viitteet eivät ole käytettävissä
.log-path = Palautusloki .log-path = Palautusloki
.log-write-failed = Palautuslokia ei voitu kirjoittaa .log-write-failed = Palautuslokia ei voitu kirjoittaa
@@ -2590,8 +2588,6 @@ file =
.usage-undo-number-of-steps = Käyttö: UNDO [vaiheiden määrä] .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. .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__. .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__" .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-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. .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-color-index = ACI väriindeksi
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: ongelmia ei löytynyt. .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-fix-any-errors-detected = AUDIT Korjataanko havaitut virheet? [Kyllä / Ei] <Ei>:
.audit-reference-s-to-undefined-layer-s = AUDIT: viittaukset määrittelemättömiin tasoihin: __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: löytyi __ocs_fmt_0__ virhettä, __ocs_fmt_1__ varoitusta.
.audit-report-only-no-automatic-repair-performe = AUDIT: vain raportti – automaattista korjausta ei suoritettu. .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. .audit-scanned-total-object-s = AUDIT: skannatut __ocs_fmt_0__-objektit.
.above-text = Tekstin yläpuolella .above-text = Tekstin yläpuolella
.active-dim-style-set-to-name-arg = Aktiivinen himmennystyyli asetettu "__ocs_fmt_0__" .active-dim-style-set-to-name-arg = Aktiivinen himmennystyyli asetettu "__ocs_fmt_0__"
+3 -7
View File
@@ -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. .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 .entities-checked = Entités vérifiées
.issues-found = Problèmes détectés .issues-found = Problèmes détectés
.entities-removed = Entités supprimées
.references-checked = Références vérifié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 .references-unavailable = Références indisponibles
.log-path = Journal de récupération .log-path = Journal de récupération
.log-write-failed = Impossible d'écrire le 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] .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. .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__. .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__" .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-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__). .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-color-index = ACI Indice de couleur
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: aucun problème trouvé. .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-fix-any-errors-detected = AUDIT Corriger les erreurs détectées ? [Oui / Non] <Non> :
.audit-reference-s-to-undefined-layer-s = AUDIT : références à des calques non définis : __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT : __ocs_fmt_0__ erreur(s), __ocs_fmt_1__ avertissement(s) trouvé(s).
.audit-report-only-no-automatic-repair-performe = AUDIT: rapport seulement — aucune réparation automatique n'est effectuée. .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__. .audit-scanned-total-object-s = AUDIT : objets analysés : __ocs_fmt_0__.
.above-text = Texte ci-dessus .above-text = Texte ci-dessus
.active-dim-style-set-to-name-arg = Style de cote courant défini sur « __ocs_fmt_0__ » .active-dim-style-set-to-name-arg = Style de cote courant défini sur « __ocs_fmt_0__ »
+3 -7
View File
@@ -225,9 +225,7 @@ recovery =
.failed-description = पुनर्प्राप्ति उपयोग योग्य ड्रॉइंग डेटा नहीं बना सकी। रिपोर्ट की समीक्षा करें और बैकअप या स्वतः-सहेजी गई प्रति आज़माएँ। .failed-description = पुनर्प्राप्ति उपयोग योग्य ड्रॉइंग डेटा नहीं बना सकी। रिपोर्ट की समीक्षा करें और बैकअप या स्वतः-सहेजी गई प्रति आज़माएँ।
.entities-checked = जाँची गई एंटिटियाँ .entities-checked = जाँची गई एंटिटियाँ
.issues-found = मिली समस्याएँ .issues-found = मिली समस्याएँ
.entities-removed = हटाई गई एंटिटियाँ
.references-checked = जाँचे गए संदर्भ .references-checked = जाँचे गए संदर्भ
.referenced-entities-removed = हटाई गई संदर्भित एंटिटियाँ
.references-unavailable = अनुपलब्ध संदर्भ .references-unavailable = अनुपलब्ध संदर्भ
.log-path = पुनर्प्राप्ति लॉग .log-path = पुनर्प्राप्ति लॉग
.log-write-failed = पुनर्प्राप्ति लॉग लिखा नहीं जा सका .log-write-failed = पुनर्प्राप्ति लॉग लिखा नहीं जा सका
@@ -2579,8 +2577,6 @@ file =
.usage-undo-number-of-steps = उपयोग: UNDO [number of steps] .usage-undo-number-of-steps = उपयोग: UNDO [number of steps]
.used-for-the-first-save-of-a-new-drawing-exist = नई ड्रॉइंग को पहली बार सहेजते समय उपयोग होता है। मौजूदा ड्रॉइंग अपना फ़ाइल प्रकार और संस्करण बनाए रखती हैं। .used-for-the-first-save-of-a-new-drawing-exist = नई ड्रॉइंग को पहली बार सहेजते समय उपयोग होता है। मौजूदा ड्रॉइंग अपना फ़ाइल प्रकार और संस्करण बनाए रखती हैं।
.visual-style-label = दृश्य शैली: __ocs_fmt_0__ .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__" .xref-loaded = XREF लोड हो गया "__ocs_fmt_0__"
.cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: ट्रांसमिट ZIP नहीं बनाया जा सकता (__ocs_fmt_1__)। .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__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: फ़ोल्डर नहीं बना सकता (__ocs_fmt_1__).
@@ -5626,9 +5622,9 @@ styles =
.aci-color-index = ACI रंग सूचकांक .aci-color-index = ACI रंग सूचकांक
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: कोई समस्या नहीं मिली। .audit-no-issues-found = AUDIT: कोई समस्या नहीं मिली।
.audit-reference-s-to-undefined-block-s = AUDIT: संदर्भ (s) अपरिभाषित ब्लॉकों के लिए: __ocs_fmt_0__ .audit-fix-any-errors-detected = AUDIT पाई गई त्रुटियाँ ठीक करें? [हाँ / नहीं] <नहीं>:
.audit-reference-s-to-undefined-layer-s = AUDIT: अपरिभाषित लेयर के संदर्भ: __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: __ocs_fmt_0__ त्रुटि(याँ), __ocs_fmt_1__ चेतावनी(याँ) मिलीं।
.audit-report-only-no-automatic-repair-performe = AUDIT: केवल रिपोर्ट - कोई स्वचालित मरम्मत नहीं की जाती है। .audit-repair-s-applied-issue-s-left = AUDIT: __ocs_fmt_0__ सुधार लागू हुए, __ocs_fmt_1__ समस्या(एँ) अनसुलझी रहीं।
.audit-scanned-total-object-s = AUDIT: __ocs_fmt_0__ ऑब्जेक्ट जाँचे गए। .audit-scanned-total-object-s = AUDIT: __ocs_fmt_0__ ऑब्जेक्ट जाँचे गए।
.above-text = पाठ के ऊपर .above-text = पाठ के ऊपर
.active-dim-style-set-to-name-arg = सक्रिय मंद शैली "__ocs_fmt_0__" के लिए सेट .active-dim-style-set-to-name-arg = सक्रिय मंद शैली "__ocs_fmt_0__" के लिए सेट
+3 -7
View File
@@ -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. .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 .entities-checked = Ellenőrzött entitások
.issues-found = Talált problémák .issues-found = Talált problémák
.entities-removed = Eltávolított entitások
.references-checked = Ellenőrzött hivatkozások .references-checked = Ellenőrzött hivatkozások
.referenced-entities-removed = Eltávolított hivatkozott entitások
.references-unavailable = Nem elérhető hivatkozások .references-unavailable = Nem elérhető hivatkozások
.log-path = Helyreállítási napló .log-path = Helyreállítási napló
.log-write-failed = A helyreállítási napló nem írható .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] .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. .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__. .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__" .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-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__). .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-color-index = ACI színindex
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: nem található probléma. .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-fix-any-errors-detected = AUDIT Javítsa az észlelt hibákat? [Igen / Nem] <Nem>:
.audit-reference-s-to-undefined-layer-s = AUDIT: hivatkozások nem definiált fóliákra: __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: __ocs_fmt_0__ hiba, __ocs_fmt_1__ figyelmeztetés található.
.audit-report-only-no-automatic-repair-performe = AUDIT: csak jelentés – nem történt automatikus javítás. .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. .audit-scanned-total-object-s = AUDIT: __ocs_fmt_0__ objektum ellenőrizve.
.above-text = A szöveg felett .above-text = A szöveg felett
.active-dim-style-set-to-name-arg = Aktív méretezési stílus: „__ocs_fmt_0__” .active-dim-style-set-to-name-arg = Aktív méretezési stílus: „__ocs_fmt_0__”
+3 -7
View File
@@ -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. .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 .entities-checked = Entità controllate
.issues-found = Problemi rilevati .issues-found = Problemi rilevati
.entities-removed = Entità rimosse
.references-checked = Riferimenti controllati .references-checked = Riferimenti controllati
.referenced-entities-removed = Entità referenziate rimosse
.references-unavailable = Riferimenti non disponibili .references-unavailable = Riferimenti non disponibili
.log-path = Registro di recupero .log-path = Registro di recupero
.log-write-failed = Impossibile scrivere il 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] .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. .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__. .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__" .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-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__). .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-color-index = ACI Indice colori
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: nessun problema trovato. .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-fix-any-errors-detected = AUDIT Correggere gli errori rilevati? [Sì / No] <No>:
.audit-reference-s-to-undefined-layer-s = AUDIT: riferimento/i a livelli non definiti: __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: trovati __ocs_fmt_0__ errore/i, __ocs_fmt_1__ avviso/i.
.audit-report-only-no-automatic-repair-performe = AUDIT: solo rapporto: nessuna riparazione automatica eseguita. .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. .audit-scanned-total-object-s = AUDIT: oggetto/i __ocs_fmt_0__ scansionato/i.
.above-text = Sopra il testo .above-text = Sopra il testo
.active-dim-style-set-to-name-arg = Stile di attenuazione attivo impostato su "__ocs_fmt_0__" .active-dim-style-set-to-name-arg = Stile di attenuazione attivo impostato su "__ocs_fmt_0__"
+3 -7
View File
@@ -225,9 +225,7 @@ recovery =
.failed-description = 修復処理で使用可能な図面データを生成できませんでした。レポートを確認し、バックアップまたは自動保存コピーをお試しください。 .failed-description = 修復処理で使用可能な図面データを生成できませんでした。レポートを確認し、バックアップまたは自動保存コピーをお試しください。
.entities-checked = 確認したエンティティ .entities-checked = 確認したエンティティ
.issues-found = 検出した問題 .issues-found = 検出した問題
.entities-removed = 削除したエンティティ
.references-checked = 確認した参照 .references-checked = 確認した参照
.referenced-entities-removed = 削除した参照エンティティ
.references-unavailable = 使用できない参照 .references-unavailable = 使用できない参照
.log-path = 修復ログ .log-path = 修復ログ
.log-write-failed = 修復ログを書き込めませんでした .log-write-failed = 修復ログを書き込めませんでした
@@ -2581,8 +2579,6 @@ file =
.usage-undo-number-of-steps = 使用法: UNDO [number of steps] .usage-undo-number-of-steps = 使用法: UNDO [number of steps]
.used-for-the-first-save-of-a-new-drawing-exist = 新しい図面の初回保存時に使用されます。既存の図面ではファイル形式とバージョンが維持されます。 .used-for-the-first-save-of-a-new-drawing-exist = 新しい図面の初回保存時に使用されます。既存の図面ではファイル形式とバージョンが維持されます。
.visual-style-label = 表示スタイル: __ocs_fmt_0__。 .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__」をロードしました .xref-loaded = XREF 「__ocs_fmt_0__」をロードしました
.cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: 転送 ZIP を作成できません(__ocs_fmt_1__)。 .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__)。 .cmd-cannot-create-folder-e = __ocs_fmt_0__: フォルダーを作成できません(__ocs_fmt_1__)。
@@ -5626,9 +5622,9 @@ styles =
.aci-color-index = ACI カラーインデックス .aci-color-index = ACI カラーインデックス
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: 問題は見つかりませんでした。 .audit-no-issues-found = AUDIT: 問題は見つかりませんでした。
.audit-reference-s-to-undefined-block-s = AUDIT: 未定義ブロックへの参照: __ocs_fmt_0__ .audit-fix-any-errors-detected = AUDIT 検出されたエラーを修正しますか? [はい / いいえ] <いいえ>:
.audit-reference-s-to-undefined-layer-s = AUDIT: 未定義レイヤーへの参照: __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: エラー __ocs_fmt_0__ 件、警告 __ocs_fmt_1__ 件が見つかりました。
.audit-report-only-no-automatic-repair-performe = AUDIT: レポートのみ — 自動修復は行いませんでした。 .audit-repair-s-applied-issue-s-left = AUDIT: __ocs_fmt_0__ 件の修復を適用し、__ocs_fmt_1__ 件の問題が未解決です。
.audit-scanned-total-object-s = AUDIT: __ocs_fmt_0__ 個のオブジェクトを検査しました。 .audit-scanned-total-object-s = AUDIT: __ocs_fmt_0__ 個のオブジェクトを検査しました。
.above-text = 文字の上 .above-text = 文字の上
.active-dim-style-set-to-name-arg = 現在の寸法スタイルを "__ocs_fmt_0__" に設定しました .active-dim-style-set-to-name-arg = 現在の寸法スタイルを "__ocs_fmt_0__" に設定しました
+3 -7
View File
@@ -225,9 +225,7 @@ recovery =
.failed-description = 복구 과정에서 사용 가능한 도면 데이터를 만들지 못했습니다. 보고서를 검토하고 백업 또는 자동 저장 사본을 사용해 보세요. .failed-description = 복구 과정에서 사용 가능한 도면 데이터를 만들지 못했습니다. 보고서를 검토하고 백업 또는 자동 저장 사본을 사용해 보세요.
.entities-checked = 검사한 엔티티 .entities-checked = 검사한 엔티티
.issues-found = 발견된 문제 .issues-found = 발견된 문제
.entities-removed = 제거된 엔티티
.references-checked = 검사한 참조 .references-checked = 검사한 참조
.referenced-entities-removed = 제거된 참조 엔티티
.references-unavailable = 사용할 수 없는 참조 .references-unavailable = 사용할 수 없는 참조
.log-path = 복구 로그 .log-path = 복구 로그
.log-write-failed = 복구 로그를 쓸 수 없습니다 .log-write-failed = 복구 로그를 쓸 수 없습니다
@@ -2590,8 +2588,6 @@ file =
.usage-undo-number-of-steps = 사용법: UNDO [단계 수] .usage-undo-number-of-steps = 사용법: UNDO [단계 수]
.used-for-the-first-save-of-a-new-drawing-exist = 새 도면을 처음 저장할 때 사용됩니다. 기존 도면은 파일 유형과 버전을 유지합니다. .used-for-the-first-save-of-a-new-drawing-exist = 새 도면을 처음 저장할 때 사용됩니다. 기존 도면은 파일 유형과 버전을 유지합니다.
.visual-style-label = 시각적 스타일: __ocs_fmt_0__. .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__"를 로드했습니다. .xref-loaded = XREF가 "__ocs_fmt_0__"를 로드했습니다.
.cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: 전송 ZIP을 만들 수 없습니다(__ocs_fmt_1__). .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__)를 생성할 수 없습니다. .cmd-cannot-create-folder-e = __ocs_fmt_0__: 폴더(__ocs_fmt_1__)를 생성할 수 없습니다.
@@ -5637,9 +5633,9 @@ styles =
.aci-color-index = ACI 컬러 인덱스 .aci-color-index = ACI 컬러 인덱스
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: 문제가 발견되지 않았습니다. .audit-no-issues-found = AUDIT: 문제가 발견되지 않았습니다.
.audit-reference-s-to-undefined-block-s = AUDIT: 정의되지 않은 블록에 대한 참조: __ocs_fmt_0__ .audit-fix-any-errors-detected = AUDIT 감지된 오류를 수정하시겠습니까? [예 / 아니요] <아니요>:
.audit-reference-s-to-undefined-layer-s = AUDIT: 정의되지 않은 레이어에 대한 참조: __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: 오류 __ocs_fmt_0__개, 경고 __ocs_fmt_1__개를 찾았습니다.
.audit-report-only-no-automatic-repair-performe = AUDIT: 보고 전용 - 자동 복구가 수행되지 않습니다. .audit-repair-s-applied-issue-s-left = AUDIT: 복구 __ocs_fmt_0__개 적용, 미해결 문제 __ocs_fmt_1__개.
.audit-scanned-total-object-s = AUDIT: __ocs_fmt_0__ 개체를 스캔했습니다. .audit-scanned-total-object-s = AUDIT: __ocs_fmt_0__ 개체를 스캔했습니다.
.above-text = 텍스트 위 .above-text = 텍스트 위
.active-dim-style-set-to-name-arg = 활성 밝기 스타일이 "__ocs_fmt_0__"로 설정됨 .active-dim-style-set-to-name-arg = 활성 밝기 스타일이 "__ocs_fmt_0__"로 설정됨
+3 -7
View File
@@ -224,9 +224,7 @@ recovery =
.failed-description = ການກູ້ຄືນບໍ່ສາມາດສ້າງຂໍ້ມູນຮູບແຕ້ມທີ່ໃຊ້ງານໄດ້. ກະລຸນາກວດສອບລາຍງານ ແລະ ລອງໃຊ້ສຳເນົາສຳຮອງ ຫຼື ໄຟລ໌ບັນທຶກອັດຕະໂນມັດ. .failed-description = ການກູ້ຄືນບໍ່ສາມາດສ້າງຂໍ້ມູນຮູບແຕ້ມທີ່ໃຊ້ງານໄດ້. ກະລຸນາກວດສອບລາຍງານ ແລະ ລອງໃຊ້ສຳເນົາສຳຮອງ ຫຼື ໄຟລ໌ບັນທຶກອັດຕະໂນມັດ.
.entities-checked = ອົງປະກອບທີ່ກວດສອບແລ້ວ .entities-checked = ອົງປະກອບທີ່ກວດສອບແລ້ວ
.issues-found = ບັນຫາທີ່ພົບ .issues-found = ບັນຫາທີ່ພົບ
.entities-removed = ອົງປະກອບທີ່ຖືກລຶບອອກ
.references-checked = ຈຸດອ້າງອີງທີ່ກວດສອບແລ້ວ .references-checked = ຈຸດອ້າງອີງທີ່ກວດສອບແລ້ວ
.referenced-entities-removed = ອົງປະກອບອ້າງອີງທີ່ຖືກລຶບອອກ
.references-unavailable = ຈຸດອ້າງອີງບໍ່ພ້ອມໃຊ້ງານ .references-unavailable = ຈຸດອ້າງອີງບໍ່ພ້ອມໃຊ້ງານ
.log-path = ບັນທຶກເຫດການການກູ້ຄືນ .log-path = ບັນທຶກເຫດການການກູ້ຄືນ
.log-write-failed = ບໍ່ສາມາດຂຽນບັນທຶກເຫດການການກູ້ຄືນໄດ້ .log-write-failed = ບໍ່ສາມາດຂຽນບັນທຶກເຫດການການກູ້ຄືນໄດ້
@@ -2598,8 +2596,6 @@ file =
.usage-undo-number-of-steps = ວິທີໃຊ້: UNDO [ຈຳນວນຂັ້ນຕອນ] .usage-undo-number-of-steps = ວິທີໃຊ້: UNDO [ຈຳນວນຂັ້ນຕອນ]
.used-for-the-first-save-of-a-new-drawing-exist = ໃຊ້ສຳລັບການບັນທຶກຄັ້ງທຳອິດຂອງແບບແຕ້ມໃໝ່. ແບບແຕ້ມທີ່ມີຢູ່ແລ້ວຈະຮັກສາປະເພດໄຟລ໌ ແລະ ເວີຊັນເດີມໄວ້. .used-for-the-first-save-of-a-new-drawing-exist = ໃຊ້ສຳລັບການບັນທຶກຄັ້ງທຳອິດຂອງແບບແຕ້ມໃໝ່. ແບບແຕ້ມທີ່ມີຢູ່ແລ້ວຈະຮັກສາປະເພດໄຟລ໌ ແລະ ເວີຊັນເດີມໄວ້.
.visual-style-label = ຮູບແບບມຸມມອງ: __ocs_fmt_0__. .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__" .xref-loaded = XREF ໂຫຼດແລ້ວ "__ocs_fmt_0__"
.cmd-cannot-create-folder-e = __ocs_fmt_0__: ບໍ່ສາມາດສ້າງໂຟລເດີໄດ້ (__ocs_fmt_1__). .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__ .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-color-index = ດັດຊະນີສີ ACI
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: ບໍ່ພົບຂໍ້ຜິດພາດ. .audit-no-issues-found = AUDIT: ບໍ່ພົບຂໍ້ຜິດພາດ.
.audit-reference-s-to-undefined-block-s = AUDIT: ການອ້າງອີງເຖິງບລັອກທີ່ບໍ່ໄດ້ກຳນົດ: __ocs_fmt_0__ .audit-fix-any-errors-detected = AUDIT ແກ້ໄຂຂໍ້ຜິດພາດທີ່ກວດພົບບໍ? [ແມ່ນ / ບໍ່] <ບໍ່>:
.audit-reference-s-to-undefined-layer-s = AUDIT: ການອ້າງອີງເຖິງເລເຢີທີ່ບໍ່ໄດ້ກຳນົດ: __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: ພົບຂໍ້ຜິດພາດ __ocs_fmt_0__ ລາຍການ, ຄຳເຕືອນ __ocs_fmt_1__ ລາຍການ.
.audit-report-only-no-automatic-repair-performe = AUDIT: ລາຍງານເທົ່ານັ້ນ — ບໍ່ໄດ້ມີການສ້ອມແປງອັດຕະໂນມັດ. .audit-repair-s-applied-issue-s-left = AUDIT: ສ້ອມແປງແລ້ວ __ocs_fmt_0__ ລາຍການ, ບັນຫາທີ່ຍັງບໍ່ໄດ້ແກ້ __ocs_fmt_1__ ລາຍການ.
.audit-scanned-total-object-s = AUDIT: ສະແກນທັງໝົດ __ocs_fmt_0__ ວັດຖຸ. .audit-scanned-total-object-s = AUDIT: ສະແກນທັງໝົດ __ocs_fmt_0__ ວັດຖຸ.
.above-text = ເທິງຂໍ້ຄວາມ .above-text = ເທິງຂໍ້ຄວາມ
.active-dim-style-set-to-name-arg = ຮູບແບບຂະໜາດທີ່ໃຊ້ງານຕັ້ງເປັນ "__ocs_fmt_0__" .active-dim-style-set-to-name-arg = ຮູບແບບຂະໜາດທີ່ໃຊ້ງານຕັ້ງເປັນ "__ocs_fmt_0__"
+3 -7
View File
@@ -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. .failed-description = Het herstel kon geen bruikbare tekeninggegevens opleveren. Controleer het rapport en probeer een reservekopie of automatisch opgeslagen kopie.
.entities-checked = Gecontroleerde objecten .entities-checked = Gecontroleerde objecten
.issues-found = Gevonden problemen .issues-found = Gevonden problemen
.entities-removed = Verwijderde objecten
.references-checked = Gecontroleerde verwijzingen .references-checked = Gecontroleerde verwijzingen
.referenced-entities-removed = Verwijderde objecten waarnaar werd verwezen
.references-unavailable = Niet-beschikbare verwijzingen .references-unavailable = Niet-beschikbare verwijzingen
.log-path = Herstellogboek .log-path = Herstellogboek
.log-write-failed = Het herstellogboek kon niet worden geschreven .log-write-failed = Het herstellogboek kon niet worden geschreven
@@ -2591,8 +2589,6 @@ file =
.usage-undo-number-of-steps = Gebruik: UNDO [number of steps] .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. .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__. .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__" .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-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. .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-color-index = ACI Kleurindex
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: geen problemen gevonden. .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-fix-any-errors-detected = AUDIT Gevonden fouten herstellen? [Ja / Nee] <Nee>:
.audit-reference-s-to-undefined-layer-s = AUDIT: verwijzing(s) naar ongedefinieerde laag(en): __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: __ocs_fmt_0__ fout(en), __ocs_fmt_1__ waarschuwing(en) gevonden.
.audit-report-only-no-automatic-repair-performe = AUDIT: alleen melden .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. .audit-scanned-total-object-s = AUDIT: __ocs_fmt_0__ object(en) gecontroleerd.
.above-text = Bovenstaande tekst .above-text = Bovenstaande tekst
.active-dim-style-set-to-name-arg = Actieve maatstijl ingesteld op "__ocs_fmt_0__" .active-dim-style-set-to-name-arg = Actieve maatstijl ingesteld op "__ocs_fmt_0__"
+3 -7
View File
@@ -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. .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 .entities-checked = Sprawdzone elementy
.issues-found = Znalezione problemy .issues-found = Znalezione problemy
.entities-removed = Usunięte elementy
.references-checked = Sprawdzone odnośniki .references-checked = Sprawdzone odnośniki
.referenced-entities-removed = Usunięte elementy przywoływane
.references-unavailable = Niedostępne odnośniki .references-unavailable = Niedostępne odnośniki
.log-path = Dziennik odzyskiwania .log-path = Dziennik odzyskiwania
.log-write-failed = Nie można zapisać dziennika 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] .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ę. .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__. .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__” .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-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__). .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-color-index = Indeks kolorów ACI
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: nie znaleziono żadnych problemów. .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-fix-any-errors-detected = AUDIT Naprawić wykryte błędy? [Tak / Nie] <Nie>:
.audit-reference-s-to-undefined-layer-s = AUDIT: odniesienia do niezdefiniowanych warstw: __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: znaleziono błędy: __ocs_fmt_0__, ostrzeżenia: __ocs_fmt_1__.
.audit-report-only-no-automatic-repair-performe = AUDIT: tylko raport — nie wykonano automatycznej naprawy. .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__. .audit-scanned-total-object-s = AUDIT: zeskanowane obiekty __ocs_fmt_0__.
.above-text = Powyżej tekstu .above-text = Powyżej tekstu
.active-dim-style-set-to-name-arg = Aktywny styl przyciemnienia ustawiony na „__ocs_fmt_0__” .active-dim-style-set-to-name-arg = Aktywny styl przyciemnienia ustawiony na „__ocs_fmt_0__”
+3 -7
View File
@@ -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. .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 .entities-checked = Entidades verificadas
.issues-found = Problemas encontrados .issues-found = Problemas encontrados
.entities-removed = Entidades removidas
.references-checked = Referências verificadas .references-checked = Referências verificadas
.referenced-entities-removed = Entidades referenciadas removidas
.references-unavailable = Referências indisponíveis .references-unavailable = Referências indisponíveis
.log-path = Log de recuperação .log-path = Log de recuperação
.log-write-failed = Não foi possível gravar o 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] .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. .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__. .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 .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-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__). .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-color-index = Índice de cor ACI
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: nenhum problema encontrado. .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-fix-any-errors-detected = AUDIT Corrigir os erros detectados? [Sim / Não] <Não>:
.audit-reference-s-to-undefined-layer-s = AUDIT: referências a camadas indefinidas: __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: __ocs_fmt_0__ erro(s), __ocs_fmt_1__ aviso(s) encontrado(s).
.audit-report-only-no-automatic-repair-performe = AUDIT: somente relatório — nenhum reparo automático realizado. .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. .audit-scanned-total-object-s = AUDIT: __ocs_fmt_0__ objetos verificados.
.above-text = Acima do texto .above-text = Acima do texto
.active-dim-style-set-to-name-arg = Estilo de cota ativo definido como “__ocs_fmt_0__” .active-dim-style-set-to-name-arg = Estilo de cota ativo definido como “__ocs_fmt_0__”
+3 -7
View File
@@ -225,9 +225,7 @@ recovery =
.failed-description = Восстановить пригодные данные чертежа не удалось. Просмотрите отчёт и попробуйте резервную или автоматически сохранённую копию. .failed-description = Восстановить пригодные данные чертежа не удалось. Просмотрите отчёт и попробуйте резервную или автоматически сохранённую копию.
.entities-checked = Проверено объектов .entities-checked = Проверено объектов
.issues-found = Обнаружено проблем .issues-found = Обнаружено проблем
.entities-removed = Удалено объектов
.references-checked = Проверено ссылок .references-checked = Проверено ссылок
.referenced-entities-removed = Удалено ссылочных объектов
.references-unavailable = Недоступные ссылки .references-unavailable = Недоступные ссылки
.log-path = Журнал восстановления .log-path = Журнал восстановления
.log-write-failed = Не удалось записать журнал восстановления .log-write-failed = Не удалось записать журнал восстановления
@@ -2594,8 +2592,6 @@ file =
.usage-undo-number-of-steps = Использование: UNDO [number of steps] .usage-undo-number-of-steps = Использование: UNDO [number of steps]
.used-for-the-first-save-of-a-new-drawing-exist = Используется при первом сохранении нового чертежа. Существующие чертежи сохраняют свой тип и версию файла. .used-for-the-first-save-of-a-new-drawing-exist = Используется при первом сохранении нового чертежа. Существующие чертежи сохраняют свой тип и версию файла.
.visual-style-label = Визуальный стиль: __ocs_fmt_0__. .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__" .xref-loaded = XREF Загруженный "__ocs_fmt_0__"
.cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: не удалось создать ZIP-пакет передачи (__ocs_fmt_1__). .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__). .cmd-cannot-create-folder-e = __ocs_fmt_0__: не может создавать папку (__ocs_fmt_1__).
@@ -5639,9 +5635,9 @@ styles =
.aci-color-index = Индекс цвета ACI .aci-color-index = Индекс цвета ACI
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: не найдено никаких проблем. .audit-no-issues-found = AUDIT: не найдено никаких проблем.
.audit-reference-s-to-undefined-block-s = AUDIT: ссылка(ы) на неопределенный(ые) блок(ы): __ocs_fmt_0__ .audit-fix-any-errors-detected = AUDIT Исправить обнаруженные ошибки? [Да / Нет] <Нет>:
.audit-reference-s-to-undefined-layer-s = AUDIT: ссылка(ы) на неопределенный(ые) слой(ы): __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: найдено ошибок: __ocs_fmt_0__, предупреждений: __ocs_fmt_1__.
.audit-report-only-no-automatic-repair-performe = AUDIT: только отчет - не выполняется автоматический ремонт. .audit-repair-s-applied-issue-s-left = AUDIT: применено исправлений: __ocs_fmt_0__, не устранено проблем: __ocs_fmt_1__.
.audit-scanned-total-object-s = AUDIT: сканируемый объект (объекты) __ocs_fmt_0__. .audit-scanned-total-object-s = AUDIT: сканируемый объект (объекты) __ocs_fmt_0__.
.above-text = Выше текста .above-text = Выше текста
.active-dim-style-set-to-name-arg = Активным стилем размеров назначен «__ocs_fmt_0__» .active-dim-style-set-to-name-arg = Активным стилем размеров назначен «__ocs_fmt_0__»
+3 -7
View File
@@ -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. .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 .entities-checked = Denetlenen obje
.issues-found = Bulunan sorun .issues-found = Bulunan sorun
.entities-removed = Kaldırılan obje
.references-checked = Denetlenen referans .references-checked = Denetlenen referans
.referenced-entities-removed = Referanslardan kaldırılan obje
.references-unavailable = Kullanılamayan referans .references-unavailable = Kullanılamayan referans
.log-path = Kurtarma günlüğü .log-path = Kurtarma günlüğü
.log-write-failed = Kurtarma günlüğü yazılamadı .log-write-failed = Kurtarma günlüğü yazılamadı
@@ -2574,8 +2572,6 @@ file =
.usage-undo-number-of-steps = Kullanım: UNDO [number of steps] .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. .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__. .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 .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-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__). .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-color-index = ACI renk dizini
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT: sorun bulunamadı. .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-fix-any-errors-detected = AUDIT Bulunan hatalar düzeltilsin mi? [Evet / Hayır] <Hayır>:
.audit-reference-s-to-undefined-layer-s = AUDIT: tanımsız katmanlara başvurular: __ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: __ocs_fmt_0__ hata, __ocs_fmt_1__ uyarı bulundu.
.audit-report-only-no-automatic-repair-performe = AUDIT: yalnızca rapor oluşturuldu; otomatik onarım yapılmadı. .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ı. .audit-scanned-total-object-s = AUDIT: __ocs_fmt_0__ nesne tarandı.
.above-text = Metnin üstünde .above-text = Metnin üstünde
.active-dim-style-set-to-name-arg = Etkin ölçü stili "__ocs_fmt_0__" olarak ayarlandı. .active-dim-style-set-to-name-arg = Etkin ölçü stili "__ocs_fmt_0__" olarak ayarlandı.
+3 -7
View File
@@ -224,9 +224,7 @@ recovery =
.failed-description = 修复未能生成可用的图形数据。请查看报告并尝试备份或自动保存的副本。 .failed-description = 修复未能生成可用的图形数据。请查看报告并尝试备份或自动保存的副本。
.entities-checked = 已检查实体 .entities-checked = 已检查实体
.issues-found = 发现的问题 .issues-found = 发现的问题
.entities-removed = 已删除实体
.references-checked = 已检查参照 .references-checked = 已检查参照
.referenced-entities-removed = 已删除被参照实体
.references-unavailable = 不可用参照 .references-unavailable = 不可用参照
.log-path = 修复日志 .log-path = 修复日志
.log-write-failed = 无法写入修复日志 .log-write-failed = 无法写入修复日志
@@ -2578,8 +2576,6 @@ file =
.usage-undo-number-of-steps = 用法: UNDO [number of steps] .usage-undo-number-of-steps = 用法: UNDO [number of steps]
.used-for-the-first-save-of-a-new-drawing-exist = 用于新图形的首次保存。现有图形会保留其自身的文件类型和版本。 .used-for-the-first-save-of-a-new-drawing-exist = 用于新图形的首次保存。现有图形会保留其自身的文件类型和版本。
.visual-style-label = 视觉风格: __ocs_fmt_0__. .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__" .xref-loaded = XREF已装入"__ocs_fmt_0__"
.cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: 无法创建传输 ZIP(__ocs_fmt_1__)。 .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__). .cmd-cannot-create-folder-e = __ocs_fmt_0__:无法创建文件夹(__ocs_fmt_1__).
@@ -5621,9 +5617,9 @@ styles =
.aci-color-index = ACI 颜色索引 .aci-color-index = ACI 颜色索引
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT:没有找到问题。 .audit-no-issues-found = AUDIT:没有找到问题。
.audit-reference-s-to-undefined-block-s = AUDIT: 未定义块的引用 : __ocs_fmt_0__ .audit-fix-any-errors-detected = AUDIT 修复检测到的错误? [是 / 否] <否>:
.audit-reference-s-to-undefined-layer-s = AUDIT: 未定义层的参考:__ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: 发现 __ocs_fmt_0__ 个错误,__ocs_fmt_1__ 个警告。
.audit-report-only-no-automatic-repair-performe = AUDIT:只报告——没有进行自动修复。 .audit-repair-s-applied-issue-s-left = AUDIT: 已应用 __ocs_fmt_0__ 项修复,__ocs_fmt_1__ 个问题未解决。
.audit-scanned-total-object-s = AUDIT: 扫描__ocs_fmt_0__对象。 .audit-scanned-total-object-s = AUDIT: 扫描__ocs_fmt_0__对象。
.above-text = 上方为文本 .above-text = 上方为文本
.active-dim-style-set-to-name-arg = 当前标注样式已设为“__ocs_fmt_0__” .active-dim-style-set-to-name-arg = 当前标注样式已设为“__ocs_fmt_0__”
+3 -7
View File
@@ -224,9 +224,7 @@ recovery =
.failed-description = 修復未能產生可用的圖形資料。請查看報告並嘗試備份或自動儲存的副本。 .failed-description = 修復未能產生可用的圖形資料。請查看報告並嘗試備份或自動儲存的副本。
.entities-checked = 已檢查實體 .entities-checked = 已檢查實體
.issues-found = 發現的問題 .issues-found = 發現的問題
.entities-removed = 已刪除實體
.references-checked = 已檢查參照 .references-checked = 已檢查參照
.referenced-entities-removed = 已刪除被參照實體
.references-unavailable = 不可用參照 .references-unavailable = 不可用參照
.log-path = 修復日誌 .log-path = 修復日誌
.log-write-failed = 無法寫入修復日誌 .log-write-failed = 無法寫入修復日誌
@@ -2590,8 +2588,6 @@ file =
.usage-undo-number-of-steps = 用法: UNDO [number of steps] .usage-undo-number-of-steps = 用法: UNDO [number of steps]
.used-for-the-first-save-of-a-new-drawing-exist = 用於新圖形的首次儲存。現有圖形會保留其自身的檔案類型和版本。 .used-for-the-first-save-of-a-new-drawing-exist = 用於新圖形的首次儲存。現有圖形會保留其自身的檔案類型和版本。
.visual-style-label = 視覺風格: __ocs_fmt_0__. .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__" .xref-loaded = XREF已載入"__ocs_fmt_0__"
.cmd-cannot-build-the-transmittal-zip-e = __ocs_fmt_0__: 無法建立傳送 ZIP(__ocs_fmt_1__)。 .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__). .cmd-cannot-create-folder-e = __ocs_fmt_0__:無法建立資料夾(__ocs_fmt_1__).
@@ -5633,9 +5629,9 @@ styles =
.aci-color-index = ACI 顏色索引 .aci-color-index = ACI 顏色索引
.aci = ACI: .aci = ACI:
.audit-no-issues-found = AUDIT:沒有找到問題。 .audit-no-issues-found = AUDIT:沒有找到問題。
.audit-reference-s-to-undefined-block-s = AUDIT: 未定義圖塊的引用 : __ocs_fmt_0__ .audit-fix-any-errors-detected = AUDIT 修復偵測到的錯誤? [是 / 否] <否>:
.audit-reference-s-to-undefined-layer-s = AUDIT: 未定義層的參考:__ocs_fmt_0__ .audit-error-s-warning-s-found = AUDIT: 發現 __ocs_fmt_0__ 個錯誤,__ocs_fmt_1__ 個警告。
.audit-report-only-no-automatic-repair-performe = AUDIT:只報告——沒有進行自動修復。 .audit-repair-s-applied-issue-s-left = AUDIT: 已套用 __ocs_fmt_0__ 項修復,__ocs_fmt_1__ 個問題未解決。
.audit-scanned-total-object-s = AUDIT: 掃描__ocs_fmt_0__物件。 .audit-scanned-total-object-s = AUDIT: 掃描__ocs_fmt_0__物件。
.above-text = 上方為文字 .above-text = 上方為文字
.active-dim-style-set-to-name-arg = 目前標註樣式已設為“__ocs_fmt_0__” .active-dim-style-set-to-name-arg = 目前標註樣式已設為“__ocs_fmt_0__”
+1 -1
View File
@@ -1273,7 +1273,7 @@ dependencies = [
[[package]] [[package]]
name = "opencadcodec" name = "opencadcodec"
version = "0.6.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"bitflags", "bitflags",
+6 -26
View File
@@ -762,7 +762,7 @@ impl OpenCADStudio {
Err(e) => return err(format!("open: {e}")), Err(e) => return err(format!("open: {e}")),
}; };
match crate::io::load_bytes_finalized(&path_buf, bytes) { match crate::io::load_bytes_finalized(&path_buf, bytes) {
Ok((doc, dropped)) => { Ok(doc) => {
let i = self.active_tab; let i = self.active_tab;
self.tabs[i].scene.clear(); self.tabs[i].scene.clear();
self.tabs[i].scene.document = doc; self.tabs[i].scene.document = doc;
@@ -784,13 +784,7 @@ impl OpenCADStudio {
// The opened document settled (API v9): the post-op // The opened document settled (API v9): the post-op
// boundary announces `DocumentOpened` once for this load. // boundary announces `DocumentOpened` once for this load.
self.tabs[i].note_document_loaded(); self.tabs[i].note_document_loaded();
let mut summary = self.entity_summary(); self.entity_summary()
if dropped > 0 {
if let Some(obj) = summary.as_object_mut() {
obj.insert("purged".to_string(), json!(dropped));
}
}
summary
} }
Err(e) => err(format!("open: {e}")), Err(e) => err(format!("open: {e}")),
} }
@@ -1903,8 +1897,7 @@ mod tests {
fingerprint: None, fingerprint: None,
}); });
let bytes = std::fs::read(&path).expect("read the fixture back"); let bytes = std::fs::read(&path).expect("read the fixture back");
let (document, _dropped) = let document = crate::io::load_bytes_finalized(&path, bytes).expect("reparse the fixture");
crate::io::load_bytes_finalized(&path, bytes).expect("reparse the fixture");
let caches = crate::scene::build_derived_caches_with_progress(&document, &|_| {}, None); let caches = crate::scene::build_derived_caches_with_progress(&document, &|_| {}, None);
let _ = plugin_dispatch_log(); let _ = plugin_dispatch_log();
let _ = app.update(crate::app::Message::FileOpened( let _ = app.update(crate::app::Message::FileOpened(
@@ -3839,7 +3832,7 @@ mod tests {
} }
#[test] #[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 mut app = OpenCADStudio::new_for_test();
let stale = codec::Handle::from(9999); let stale = codec::Handle::from(9999);
app.tabs[app.active_tab].scene.solid_models.insert( 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.center = codec::types::Vector3::new(5.0, 5.0, 0.0);
good.radius = 2.0; good.radius = 2.0;
doc.add_entity(codec::EntityType::Circle(good)).unwrap(); doc.add_entity(codec::EntityType::Circle(good)).unwrap();
let mut corrupt = codec::entities::Circle::new(); let bytes = crate::io::save_to_bytes(&doc, "dxf", doc.version).expect("save the fixture");
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");
std::fs::write(&path, bytes).unwrap(); std::fs::write(&path, bytes).unwrap();
let p = path.to_string_lossy().replace('\\', "\\\\"); let p = path.to_string_lossy().replace('\\', "\\\\");
let result = app.automation_op(&format!(r#"{{"op":"open","path":"{p}"}}"#)); let result = app.automation_op(&format!(r#"{{"op":"open","path":"{p}"}}"#));
assert_eq!(result["ok"], true, "{}", result["error"]); assert_eq!(result["ok"], true, "{}", result["error"]);
assert_eq!( assert_eq!(result["total"], 1);
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"
);
let i = app.active_tab; let i = app.active_tab;
assert!(!app.tabs[i].scene.solid_models.contains_key(&stale)); assert!(!app.tabs[i].scene.solid_models.contains_key(&stale));
+2 -2
View File
@@ -1128,7 +1128,7 @@ impl OpenCADStudio {
.filter(|br| reload_keys.contains(&br.handle.value())) .filter(|br| reload_keys.contains(&br.handle.value()))
.map(|br| br.handle) .map(|br| br.handle)
.collect(); .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, &mut self.tabs[i].scene.document,
base_dir, base_dir,
&handles, &handles,
@@ -1674,7 +1674,7 @@ impl OpenCADStudio {
self.tabs[i].xref_unloaded.remove(key); self.tabs[i].xref_unloaded.remove(key);
self.tabs[i].xref_stat_cache.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, &mut self.tabs[i].scene.document,
&base_dir, &base_dir,
); );
+49 -40
View File
@@ -3635,53 +3635,62 @@ impl OpenCADStudio {
.push_error(crate::tf!("COMPARE: {error}").as_ref()), .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" => { "AUDIT" => {
use std::collections::BTreeSet; use crate::command::KeywordCommand;
let mut undefined_layers: BTreeSet<String> = BTreeSet::new(); let c = KeywordCommand::new(
let mut undefined_blocks: BTreeSet<String> = BTreeSet::new(); "AUDIT",
let mut total = 0usize; "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; let doc = &self.tabs[i].scene.document;
for e in doc.entities() { doc.entities().count() + doc.objects.len()
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());
}
}
}
}
self.command_line self.command_line
.push_output(crate::tf!("AUDIT: scanned {total} object(s).").as_ref()); .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 self.command_line
.push_output(crate::t!("AUDIT: no issues found.").as_ref()); .push_output(crate::t!("AUDIT: no issues found.").as_ref());
} else { return Some(Task::none());
if !undefined_layers.is_empty() { }
self.command_line.push_error( self.command_line.push_error(
crate::tf!( crate::tf!(
"AUDIT: reference(s) to undefined layer(s): {}", "AUDIT: {} error(s), {} warning(s) found.",
undefined_layers.into_iter().collect::<Vec<_>>().join(", ") report.error_count(),
) report.warning_count()
.as_ref(), )
); .as_ref(),
} );
if !undefined_blocks.is_empty() { // ponytail: first 50 issues only; the counts above cover the rest.
self.command_line.push_error( for issue in report.issues.iter().take(50) {
crate::tf!( self.command_line
"AUDIT: reference(s) to undefined block(s): {}", .push_info(&format!(" {:?}: {}", issue.code, issue.message));
undefined_blocks.into_iter().collect::<Vec<_>>().join(", ") }
) if fix {
.as_ref(), self.push_undo_snapshot(i, "AUDIT");
); let repair = self.tabs[i].scene.document.repair();
} self.command_line.push_output(
self.command_line.push_info( crate::tf!(
crate::t!("AUDIT: report only — no automatic repair performed.").as_ref(), "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();
}
} }
} }
+1 -2
View File
@@ -1009,10 +1009,9 @@ impl OpenCADStudio {
"new" => { "new" => {
if let Some(template) = req["template"].as_str() { if let Some(template) = req["template"].as_str() {
match self.apply_template(template) { match self.apply_template(template) {
Ok(purged) => { Ok(()) => {
self.set_control_result(json!({ self.set_control_result(json!({
"template": template, "template": template,
"purged": purged,
"total": self.tabs[i].scene.document.entities().count(), "total": self.tabs[i].scene.document.entities().count(),
})); }));
Task::none() Task::none()
+4 -4
View File
@@ -434,7 +434,7 @@ impl OpenCADStudio {
/// `new` with `"template"` — the web build reads no files from a path, so /// `new` with `"template"` — the web build reads no files from a path, so
/// a template is refused there rather than silently ignored. /// a template is refused there rather than silently ignored.
#[cfg(target_arch = "wasm32")] #[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( Err(failure(
"invalid_request", "invalid_request",
"starting from a template needs the desktop build", "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 /// file. Tables and styles come from the template; the document keeps no
/// source path. /// source path.
#[cfg(not(target_arch = "wasm32"))] #[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 path = std::path::PathBuf::from(template);
let bytes = self let bytes = self
.read_drawing(&path) .read_drawing(&path)
@@ -461,7 +461,7 @@ impl OpenCADStudio {
} else { } else {
path.clone() 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))?; .map_err(|e| failure("template_failed", e))?;
document.source_path = Some(path.to_string_lossy().into_owned()); document.source_path = Some(path.to_string_lossy().into_owned());
let i = self.active_tab; let i = self.active_tab;
@@ -482,7 +482,7 @@ impl OpenCADStudio {
// A whole document just became resident in the tab (API v9): the // A whole document just became resident in the tab (API v9): the
// boundary announces `DocumentOpened` once. // boundary announces `DocumentOpened` once.
self.tabs[i].note_document_loaded(); self.tabs[i].note_document_loaded();
Ok(purged) Ok(())
} }
/// `file_identity` — stable per-document GUID (the drawing's SPMDOCUNIQUE value, /// `file_identity` — stable per-document GUID (the drawing's SPMDOCUNIQUE value,
+2 -2
View File
@@ -886,7 +886,7 @@ impl OpenCADStudio {
.filter(|br| dwg_picked.iter().any(|(key, _)| *key == br.handle.value())) .filter(|br| dwg_picked.iter().any(|(key, _)| *key == br.handle.value()))
.map(|br| br.handle) .map(|br| br.handle)
.collect(); .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, &mut self.tabs[i].scene.document,
&base_dir, &base_dir,
&handles, &handles,
@@ -1093,7 +1093,7 @@ impl OpenCADStudio {
self.tabs[i].xref_unloaded.remove(key); self.tabs[i].xref_unloaded.remove(key);
self.tabs[i].xref_stat_cache.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); crate::io::xref::resolve_xrefs(&mut self.tabs[i].scene.document, &base_dir);
let fresh = crate::io::xref::collect_entries_with_prev( let fresh = crate::io::xref::collect_entries_with_prev(
&self.tabs[i].scene.document, &self.tabs[i].scene.document,
+2 -25
View File
@@ -2051,34 +2051,13 @@ impl OpenCADStudio {
.xrefs .xrefs
.iter() .iter()
.any(|item| item.status == crate::io::xref::XrefStatus::Failed); .any(|item| item.status == crate::io::xref::XrefStatus::Failed);
let document_repaired = parser_errors_recovered let document_repaired = parser_errors_recovered || reference_recovered;
|| reference_recovered
|| caches.corrupt_dropped > 0
|| caches.xref_dropped > 0;
let recovery_needed = document_repaired || reference_failed; let recovery_needed = document_repaired || reference_failed;
let total_ms = open_started let total_ms = open_started
.map(|started| started.elapsed().as_millis() as u32) .map(|started| started.elapsed().as_millis() as u32)
.unwrap_or(0); .unwrap_or(0);
self.command_line self.command_line
.push_output(crate::tf!("Opened \"{name}\" — {entity_count} entities").as_ref()); .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 { for info in &caches.xrefs {
match info.status { match info.status {
crate::io::xref::XrefStatus::Loaded => { crate::io::xref::XrefStatus::Loaded => {
@@ -2178,9 +2157,7 @@ impl OpenCADStudio {
size_bytes, size_bytes,
caches.source_sha256.clone(), caches.source_sha256.clone(),
caches.read_stats.clone(), caches.read_stats.clone(),
entity_count.saturating_add(caches.corrupt_dropped), entity_count,
caches.corrupt_dropped,
caches.xref_dropped,
&caches.xrefs, &caches.xrefs,
&doc.notifications, &doc.notifications,
document_repaired, document_repaired,
+26 -403
View File
@@ -135,7 +135,7 @@ fn recovery_fingerprint_needed(caches: &DerivedCaches) -> bool {
crate::io::xref::XrefStatus::Recovered | crate::io::xref::XrefStatus::Failed 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)] #[derive(Debug, Clone)]
@@ -444,17 +444,10 @@ async fn open_path_with_phase_attempt(
let parse_ms = t_parse.elapsed().as_millis() as u32; let parse_ms = t_parse.elapsed().as_millis() as u32;
progress2.set(crate::app::OPEN_PHASE_PARSING, 5800, 1000, 1000); progress2.set(crate::app::OPEN_PHASE_PARSING, 5800, 1000, 1000);
let t_purge = Instant::now(); let t_purge = Instant::now();
let dropped = purge_corrupt_entities(&mut doc); if matches!(attempt, OpenAttempt::Recovery(..)) {
let purge_ms = t_purge.elapsed().as_millis() as u32; repair_drawing(&mut doc);
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,
});
} }
let purge_ms = t_purge.elapsed().as_millis() as u32;
// Before the geometry is prepared below: repairing the // Before the geometry is prepared below: repairing the
// drawing's stripped catalog linetypes after it would leave // drawing's stripped catalog linetypes after it would leave
// the first view drawn without their shapes. None is added: // 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); crate::io::linetypes::repair_document(&mut doc);
progress2.set(crate::app::OPEN_PHASE_XREF, 6000, 0, 1); progress2.set(crate::app::OPEN_PHASE_XREF, 6000, 0, 1);
let t_xref = Instant::now(); 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 xref_progress = {
let progress = Arc::clone(&progress2); let progress = Arc::clone(&progress2);
let callback: Arc<dyn Fn(usize, usize) + Send + Sync> = let callback: Arc<dyn Fn(usize, usize) + Send + Sync> =
@@ -484,7 +477,7 @@ async fn open_path_with_phase_attempt(
Some(xref_progress), Some(xref_progress),
) )
} else { } else {
(Vec::new(), 0) Vec::new()
}; };
let xref_ms = t_xref.elapsed().as_millis() as u32; let xref_ms = t_xref.elapsed().as_millis() as u32;
progress2.set(crate::app::OPEN_PHASE_CACHING, 7400, 0, 10000); 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. // Filled in after `prepare_open_geometry` below.
finalize_ms: 0, finalize_ms: 0,
}; };
caches.corrupt_dropped = dropped;
caches.read_stats = Some(read_stats); caches.read_stats = Some(read_stats);
caches.xref_dropped = xref_dropped;
caches.xrefs = xref_infos; caches.xrefs = xref_infos;
if recovery_fingerprint_needed(&caches) { if recovery_fingerprint_needed(&caches) {
caches.source_sha256 = caches.source_sha256 =
@@ -805,25 +796,17 @@ async fn load_web_bytes(
fix_current_style_names(&mut doc); fix_current_style_names(&mut doc);
crate::entities::field::local_header_dates(&mut doc); crate::entities::field::local_header_dates(&mut doc);
progress.set(crate::app::OPEN_PHASE_CACHING, 7000, 0, 1); progress.set(crate::app::OPEN_PHASE_CACHING, 7000, 0, 1);
let dropped = purge_corrupt_entities(&mut doc); if recovery_mode {
if !recovery_mode && dropped > 0 { repair_drawing(&mut doc);
return Err(OpenLoadError {
message: format!("normal read found {dropped} structurally invalid drawing records"),
source_sha256: None,
read_stats: Some(outcome.stats),
recovery_available: true,
});
} }
// XREFs inside the opened drawing resolve from the in-session bytes // XREFs inside the opened drawing resolve from the in-session bytes
// registry (see `resolve_web_xrefs`) before the caches snapshot the // registry (see `resolve_web_xrefs`) before the caches snapshot the
// document, so merged xref geometry is part of the caches — the same // document, so merged xref geometry is part of the caches — the same
// phase order the native open uses. // 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); let mut caches = crate::scene::build_derived_caches(&doc);
caches.corrupt_dropped = dropped;
caches.read_stats = Some(outcome.stats); caches.read_stats = Some(outcome.stats);
caches.xrefs = xref_infos; caches.xrefs = xref_infos;
caches.xref_dropped = xref_dropped;
if source_sha256.is_none() && recovery_fingerprint_needed(&caches) { if source_sha256.is_none() && recovery_fingerprint_needed(&caches) {
source_sha256 = web_worker::sha256_document(bytes).await.ok(); 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( async fn resolve_web_xrefs(
doc: &mut CadDocument, doc: &mut CadDocument,
progress: Arc<OpenProgressState>, progress: Arc<OpenProgressState>,
) -> (Vec<crate::io::xref::XrefInfo>, usize) { ) -> Vec<crate::io::xref::XrefInfo> {
let pending: Vec<String> = doc let pending: Vec<String> = doc
.block_records .block_records
.iter() .iter()
@@ -1000,7 +983,7 @@ pub fn load_bytes(name: &str, bytes: Vec<u8>) -> Result<CadDocument, String> {
} }
#[cfg(not(target_arch = "wasm32"))] #[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 let name = path
.file_name() .file_name()
.map(|n| n.to_string_lossy().into_owned()) .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()); doc.source_path = Some(path.to_string_lossy().into_owned());
// Opening is a field evaluation event (FIELDEVAL bit 1). // Opening is a field evaluation event (FIELDEVAL bit 1).
crate::entities::field::update_fields(&mut doc, 1, None); crate::entities::field::update_fields(&mut doc, 1, None);
let dropped = purge_corrupt_entities(&mut doc); Ok(doc)
Ok((doc, dropped))
} }
/// Load a DWG or DXF file directly from a path (auto-detect by extension). /// 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; let doc = &mut outcome.document;
normalize_block_origins(doc); normalize_block_origins(doc);
materialize_missing_block_markers(doc); materialize_missing_block_markers(doc);
normalize_knotless_splines(doc);
if outcome.stats.source_format == Some(codec::SourceFormat::Dxf) { if outcome.stats.source_format == Some(codec::SourceFormat::Dxf) {
fix_dxf_dimension_rotations(doc); fix_dxf_dimension_rotations(doc);
fix_dxf_layout_plot_settings(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); set_sketch_settings(doc, sketch_type, increment, tolerance);
} }
// ── Corrupt-entity guard ────────────────────────────────────────────────── /// Recovery runs the codec's repair and reports what it did, and what it
// /// left, through the drawing's notifications.
// opencadcodec's DWG parser occasionally desynchronises on certain files and pub(crate) fn repair_drawing(doc: &mut CadDocument) {
// produces entities with garbage fields: non-unit normals (components in let repair = doc.repair();
// 1e200+), nonsensical vertex counts (e.g. 100000), or infinite/NaN for action in &repair.actions {
// coordinates. Tessellating such entities triggers huge allocations and doc.notifications.notify(
// numerical blow-ups in the wire pipeline. codec::notification::NotificationType::Warning,
// format!("Recovery repair: {action:?}"),
// `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;
} }
let mag2 = x * x + y * y + z * z; for issue in &repair.unresolved {
// Accept anything within ~10% of unit length. Real files sometimes doc.notifications.notify(
// store slightly denormalised normals from rounding. codec::notification::NotificationType::Warning,
(mag2 - 1.0).abs() < 0.21 format!("Recovery left unresolved: {}", issue.message),
} );
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,
} }
} }
/// 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, /// 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. /// 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 /// 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)] #[cfg(test)]
mod pre_r2000_layer_plot_tests { mod pre_r2000_layer_plot_tests {
use super::*; use super::*;
-19
View File
@@ -24,8 +24,6 @@ pub struct RecoveryReport {
pub source_sha256: Option<String>, pub source_sha256: Option<String>,
pub read_stats: Option<codec::ReadStats>, pub read_stats: Option<codec::ReadStats>,
pub entities_scanned: usize, pub entities_scanned: usize,
pub entities_removed: usize,
pub referenced_entities_removed: usize,
pub parser_errors_recovered: usize, pub parser_errors_recovered: usize,
pub diagnostics: Vec<(String, String)>, pub diagnostics: Vec<(String, String)>,
pub references_checked: usize, pub references_checked: usize,
@@ -54,8 +52,6 @@ impl RecoveryReport {
source_sha256: Option<String>, source_sha256: Option<String>,
read_stats: Option<codec::ReadStats>, read_stats: Option<codec::ReadStats>,
entities_scanned: usize, entities_scanned: usize,
entities_removed: usize,
referenced_entities_removed: usize,
references: &[XrefInfo], references: &[XrefInfo],
notifications: &codec::notification::NotificationCollection, notifications: &codec::notification::NotificationCollection,
save_as_required: bool, save_as_required: bool,
@@ -163,8 +159,6 @@ impl RecoveryReport {
source_sha256, source_sha256,
read_stats, read_stats,
entities_scanned, entities_scanned,
entities_removed,
referenced_entities_removed,
parser_errors_recovered, parser_errors_recovered,
diagnostics, diagnostics,
references_checked: references.len(), references_checked: references.len(),
@@ -211,8 +205,6 @@ impl RecoveryReport {
.unwrap_or(0), .unwrap_or(0),
read_stats, read_stats,
entities_scanned: 0, entities_scanned: 0,
entities_removed: 0,
referenced_entities_removed: 0,
diagnostics: Vec::new(), diagnostics: Vec::new(),
references_checked: 0, references_checked: 0,
references_loaded: 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 { pub fn issues_found(&self) -> usize {
self.parser_errors_recovered self.parser_errors_recovered
.saturating_add(self.references_recovered) .saturating_add(self.references_recovered)
.saturating_add(self.references_failed) .saturating_add(self.references_failed)
.saturating_add(self.references_missing) .saturating_add(self.references_missing)
.saturating_add(self.removed_total())
.saturating_add(usize::from(self.error.is_some())) .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 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!( lines.push(format!(
"Parser errors recovered: {}", "Parser errors recovered: {}",
self.parser_errors_recovered self.parser_errors_recovered
+16 -44
View File
@@ -277,12 +277,8 @@ fn read_outcome_from_bytes(
/// `base_dir`, and populate each xref block with entities from the /// `base_dir`, and populate each xref block with entities from the
/// referenced file. /// referenced file.
/// ///
/// Returns a list of [`XrefInfo`] describing each xref block found, plus the /// Returns a list of [`XrefInfo`] describing each xref block found.
/// number of corrupt xref entities dropped during merge. Purging happens pub fn resolve_xrefs(doc: &mut CadDocument, base_dir: &Path) -> Vec<XrefInfo> {
/// 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) {
resolve_xrefs_with_filter(doc, base_dir, None, None) resolve_xrefs_with_filter(doc, base_dir, None, None)
} }
@@ -295,7 +291,7 @@ pub fn resolve_xrefs_for_keys(
doc: &mut CadDocument, doc: &mut CadDocument,
base_dir: &Path, base_dir: &Path,
keys: &HashSet<Handle>, keys: &HashSet<Handle>,
) -> (Vec<XrefInfo>, usize) { ) -> Vec<XrefInfo> {
resolve_xrefs_with_filter(doc, base_dir, None, Some(keys)) resolve_xrefs_with_filter(doc, base_dir, None, Some(keys))
} }
@@ -308,7 +304,7 @@ pub fn resolve_xrefs_with_progress(
doc: &mut CadDocument, doc: &mut CadDocument,
base_dir: &Path, base_dir: &Path,
progress: Option<std::sync::Arc<dyn Fn(usize, usize) + Send + Sync>>, 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) resolve_xrefs_with_filter(doc, base_dir, progress, None)
} }
@@ -317,7 +313,7 @@ fn resolve_xrefs_with_filter(
base_dir: &Path, base_dir: &Path,
progress: Option<std::sync::Arc<dyn Fn(usize, usize) + Send + Sync>>, progress: Option<std::sync::Arc<dyn Fn(usize, usize) + Send + Sync>>,
only: Option<&HashSet<Handle>>, only: Option<&HashSet<Handle>>,
) -> (Vec<XrefInfo>, usize) { ) -> Vec<XrefInfo> {
// Auto-resolve every xref — frustum + LOD culling keep GPU cost bounded. // Auto-resolve every xref — frustum + LOD culling keep GPU cost bounded.
let xref_entries: Vec<(String, String, Handle)> = doc let xref_entries: Vec<(String, String, Handle)> = doc
.block_records .block_records
@@ -432,7 +428,6 @@ fn resolve_xrefs_with_filter(
// Phase 2 — merge each parsed xref into the host document, in the original // Phase 2 — merge each parsed xref into the host document, in the original
// block order (par_iter preserves it), so handle allocation is deterministic. // block order (par_iter preserves it), so handle allocation is deterministic.
let mut result = Vec::with_capacity(parsed.len()); let mut result = Vec::with_capacity(parsed.len());
let mut dropped = 0usize;
#[allow(unused_mut, unused_variables)] #[allow(unused_mut, unused_variables)]
for ( for (
merge_index, merge_index,
@@ -468,19 +463,7 @@ fn resolve_xrefs_with_filter(
.iter() .iter()
.map(|diagnostic| diagnostic.message.clone()), .map(|diagnostic| diagnostic.message.clone()),
); );
let invalid = super::purge_corrupt_entities(&mut outcome.document); if recovered {
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 {
(XrefStatus::Failed, diagnostics, Some(outcome.stats)) (XrefStatus::Failed, diagnostics, Some(outcome.stats))
} else { } else {
// Reload is replacement, never append. Keep the prior merge // 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()); let _ = unload_reference(doc, br_handle.value());
remove_pipe_symbols(doc, &block_name); remove_pipe_symbols(doc, &block_name);
ensure_block_entities(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 { if visretain {
restore_dependent_layers(doc, &block_name, kept_layers); 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 /// 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 /// — 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 /// back to WHITE / 1 px line weight. AutoCAD's BIND command uses the
/// same naming scheme. /// same naming scheme.
/// Returns the number of corrupt entities skipped during the merge.
fn merge_xref_into_block( fn merge_xref_into_block(
doc: &mut CadDocument, doc: &mut CadDocument,
xref_block_name: &str, xref_block_name: &str,
br_handle: Handle, br_handle: Handle,
xref_doc: CadDocument, xref_doc: CadDocument,
) -> usize { ) {
let prefix = xref_block_name; let prefix = xref_block_name;
// Carry the xref's INSUNITS onto the host BlockRecord. Used at INSERT // Carry the xref's INSUNITS onto the host BlockRecord. Used at INSERT
@@ -1264,7 +1246,7 @@ fn merge_xref_into_block(
// ── Entities (shared helper) ──────────────────────────────────────── // ── Entities (shared helper) ────────────────────────────────────────
// The unremapped-handle count is ignored on the load path (BIND reports // The unremapped-handle count is ignored on the load path (BIND reports
// it per bind). // 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) ────────────────────────────── // ── Draw-order overrides (shared helper) ──────────────────────────────
copy_xref_sortents( copy_xref_sortents(
@@ -1274,7 +1256,6 @@ fn merge_xref_into_block(
&maps.br_handles, &maps.br_handles,
&entity_handle_map, &entity_handle_map,
); );
dropped
} }
/// Source entities in display order: each block record's `entity_handles` /// 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 /// Merge one source doc's entities into `target`, routing model-space content
/// into `target_br` and nested-block content into its imported counterpart /// into `target_br` and nested-block content into its imported counterpart
/// (`maps.br_handles`). Returns corrupt-drop count, unremapped-handle count, /// (`maps.br_handles`). Returns the unremapped-handle count and the old→new
/// and the old→new entity handle map for the sortents copy. /// entity handle map for the sortents copy.
fn merge_source_entities( fn merge_source_entities(
target: &mut CadDocument, target: &mut CadDocument,
source: &CadDocument, source: &CadDocument,
target_br: Handle, target_br: Handle,
maps: &XrefSymbolMaps, maps: &XrefSymbolMaps,
) -> (usize, usize, HashMap<Handle, Handle>) { ) -> (usize, HashMap<Handle, Handle>) {
let source_ms_handle = source.header.model_space_block_handle; let source_ms_handle = source.header.model_space_block_handle;
let mut entity_handle_map: HashMap<Handle, Handle> = HashMap::default(); let mut entity_handle_map: HashMap<Handle, Handle> = HashMap::default();
let mut dropped = 0usize;
let mut unremapped = 0usize; let mut unremapped = 0usize;
for (old_h, mut entity) in ordered_source_entities(source) { 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 // Remap every symbol reference so the host's resolver hits the copies
// just imported (load path ignores the unremapped count; BIND reports // just imported (load path ignores the unremapped count; BIND reports
// it per bind). // it per bind).
@@ -1351,7 +1324,7 @@ fn merge_source_entities(
entity_handle_map.insert(old_h, new_h); entity_handle_map.insert(old_h, new_h);
} }
} }
(dropped, unremapped, entity_handle_map) (unremapped, entity_handle_map)
} }
fn is_sentinel_linetype(name: &str) -> bool { fn is_sentinel_linetype(name: &str) -> bool {
@@ -2170,8 +2143,7 @@ fn merge_bound_doc(
taken, taken,
}; };
let maps = import_xref_symbols(target, source, &mut naming); let maps = import_xref_symbols(target, source, &mut naming);
let (_, unremapped, entity_handle_map) = let (unremapped, entity_handle_map) = merge_source_entities(target, source, target_br, &maps);
merge_source_entities(target, source, target_br, &maps);
copy_xref_sortents( copy_xref_sortents(
target, target,
source, source,
@@ -2970,7 +2942,7 @@ mod tests {
// 3. Targeted reload: back to Loaded. // 3. Targeted reload: back to Loaded.
let mut handles = HashSet::default(); let mut handles = HashSet::default();
handles.insert(doc.block_records.get("MID").unwrap().handle); 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")); assert!(infos.iter().any(|i| i.name == "MID"));
let listed = collect_entries_with_prev(&doc, &dir, &empty, &no_prev); let listed = collect_entries_with_prev(&doc, &dir, &empty, &no_prev);
assert!(listed assert!(listed
+3 -5
View File
@@ -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 block name to sync:" => Some(("insert", "attsync-block-name-to-sync")),
"ATTSYNC: no block named \"{arg}\"." => Some(("insert", "attsync-no-block-named-arg")), "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")), "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: 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: {} error(s), {} warning(s) found." => Some(("styles", "audit-error-s-warning-s-found")),
"AUDIT: reference(s) to undefined layer(s): {}" => Some(("styles", "audit-reference-s-to-undefined-layer-s")), "AUDIT: {} repair(s) applied, {} issue(s) left unresolved." => Some(("styles", "audit-repair-s-applied-issue-s-left")),
"AUDIT: report only — no automatic repair performed." => Some(("styles", "audit-report-only-no-automatic-repair-performe")),
"AUDIT: scanned {total} object(s)." => Some(("styles", "audit-scanned-total-object-s")), "AUDIT: scanned {total} object(s)." => Some(("styles", "audit-scanned-total-object-s")),
"About" => Some(("manage", "about")), "About" => Some(("manage", "about")),
"Above" => Some(("common", "above")), "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 first corner:" => Some(("draw", "wipeout-rectangular-specify-first-corner")),
"WIPEOUT Rectangular Specify opposite corner:" => Some(("draw", "wipeout-rectangular-specify-opposite-corner")), "WIPEOUT Rectangular Specify opposite corner:" => Some(("draw", "wipeout-rectangular-specify-opposite-corner")),
"Warning" => Some(("errors", "warning")), "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")), "Watertight" => Some(("properties", "watertight")),
"Web" => Some(("common", "web")), "Web" => Some(("common", "web")),
"Web File" => Some(("properties", "web-file")), "Web File" => Some(("properties", "web-file")),
+1 -1
View File
@@ -747,7 +747,7 @@ fn tessellate_sub_local(
// Sanity guard: skip sub-entities whose primary dimension is so large // Sanity guard: skip sub-entities whose primary dimension is so large
// that adaptive tessellation will explode into hundreds of millions // that adaptive tessellation will explode into hundreds of millions
// of points. These are typically corrupt-radius primitives that slipped // 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) { if is_unreasonable_extent(sub) {
return vec![]; return vec![];
} }
-8
View File
@@ -1221,12 +1221,6 @@ pub struct DerivedCaches {
/// Prepared during file open so entity selection/deselection never scans /// Prepared during file open so entity selection/deselection never scans
/// the complete object store on the UI thread. /// the complete object store on the UI thread.
pub object_data: crate::entities::object_data::ObjectDataCache, 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 /// XREF resolution results produced by the loader worker. Keeping these in
/// the open bundle prevents parsing and merging references on the UI thread. /// the open bundle prevents parsing and merging references on the UI thread.
pub xrefs: Vec<crate::io::xref::XrefInfo>, pub xrefs: Vec<crate::io::xref::XrefInfo>,
@@ -1523,8 +1517,6 @@ fn build_derived_caches_impl(
meshes, meshes,
block_meshes, block_meshes,
object_data, object_data,
corrupt_dropped: 0,
xref_dropped: 0,
xrefs: Vec::new(), xrefs: Vec::new(),
prepared_geometry: None, prepared_geometry: None,
timings: OpenTimings::default(), timings: OpenTimings::default(),
-14
View File
@@ -62,10 +62,6 @@ pub fn view_window<'a>(
crate::tr!("recovery", "issues-found"), crate::tr!("recovery", "issues-found"),
report.issues_found().to_string(), report.issues_found().to_string(),
), ),
metric(
crate::tr!("recovery", "entities-removed"),
report.removed_total().to_string(),
),
metric( metric(
crate::tr!("recovery", "references-checked"), crate::tr!("recovery", "references-checked"),
report.references_checked.to_string(), report.references_checked.to_string(),
@@ -75,16 +71,6 @@ pub fn view_window<'a>(
.width(Fill); .width(Fill);
let mut details = column![].spacing(6); 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 { if report.references_missing > 0 || report.references_failed > 0 {
details = details.push( details = details.push(
text(format!( text(format!(