вторник, 1 ноября 2011 г.

PURGE + AUDIT = Total Errors

На данной страничке я покажу ситуацию, когда команда purge, вызванная в AutoCAD, может приводить к возникновению ошибок (хорошо известных как total errors), выявляемых с помощью команды auditВозможно, что обозначенная команда не корректно работает и в др. случаях, но я в данной статье буду писать о той ситуации, с которой столкнулся сам (тесты на др. ситуации не проводил за неимением времени)...


Описание проблемы
Если в динамическом блоке атрибуты размещены на отдельном слое, то команда "_purge _a" может спровоцировать появление хорошо известных "Total errors", которые будут выявлены с помощью команды _audit...
Покажу пример...


Воспроизведение проблемы
В указанном мною чертеже имеется два определения блока:
- Рамка листа (вариант 1 - доп. текст на слое PlotInfo)
- Рамка листа (вариант 2 - всё на одном слое)

Примечание: вариант 2 - это модифицированный вариант 1, с той лишь разницей, что все определения атрибутов размещены на слое 0.

Открываем файл PurgeProblem.dwg, а так же создаём новый чертёж на основе шаблона acadiso.dwt. Нажимаем Ctrl + 2 и с помощью DesignCenter копируем в новый файл определение блока "Рамка листа (вариант 2 - всё на одном слое)" (перетаскиваем мышью и бросаем в модель нового чертежа).
В пространстве модели нового чертежа появляется вхождение блока. Удаляем это вхождение, после чего "отпуржить" слои, либо вызвать "_purge _a", и затем запускаем _audit. 
Результат: Total errors found 0 fixed 0.

Теперь выполняем те же действия, но с блоком "Рамка листа (вариант 1 - доп. текст на слое PlotInfo)". 
Результат: Total errors found 6 fixed 0.

Изучение проблемы
Смотрим лог команды _audit:

Command: _audit
Fix any errors detected? [Yes/No] <N>:
Auditing Header
Auditing Tables
Auditing Entities Pass 1
Pass 1 200 objects audited
Auditing Entities Pass 2
Pass 2 100 objects auditedAcDbAttribute(245) Invalid layer eWasErased 
$AUDIT-BAD-LAYER
AcDbAttribute(245) was not repaired.
AcDbAttribute(256) Invalid layer eWasErased $AUDIT-BAD-LAYER
AcDbAttribute(256) was not repaired.
Pass 2 200 objects auditedAcDbAttribute(25E) Invalid layer eWasErased 
$AUDIT-BAD-LAYER
AcDbAttribute(25E) was not repaired.
AcDbAttribute(26D) Invalid layer eWasErased $AUDIT-BAD-LAYER
AcDbAttribute(26D) was not repaired.
AcDbAttribute(27E) Invalid layer eWasErased $AUDIT-BAD-LAYER
AcDbAttribute(27E) was not repaired.
AcDbAttribute(286) Invalid layer eWasErased $AUDIT-BAD-LAYER
AcDbAttribute(286) was not repaired.
Auditing Blocks
1 Blocks audited
Total errors found 6 fixed 0
Erased 0 objects


Как видим, "_purge _a" удалила слои, на которые ссылаются некоторые, опять же удалённые объекты базы данных. Вывод: команда _purge отработала не корректно. Другой вариант блока выдаёт 76 ошибок. Некорректная работа 
_purge для приведённых выше примеров происходит в AutoCAD 2009 и 2012 (другие версии не проверял, но подозреваю, что они не исключение).

Решение проблемы
Важным моментом является то, что причиной ошибок возникают удалённые слои и удалённые атрибуты блоков (ключевое слово - "удалённые"). Это означает, что 
выявленные ошибки не являются опасными, поскольку они затрагивают лишь такие объекты базы данных, свойство IsErased которых равно true - они безвозвратно удаляются из базы данных при закрытии чертежа. Рассуждая логически получаем, то при очередном открытии этого файла, команда _audit уже не найдёт тех ошибок, которые были найдены в прошлой сессии работы, а если нет проблемных объектов -то не будет и ошибок связанных с ними. Я проверил своё предположение - оно оказалось верным: сохранив чертёж, закрыв и снова открыв его, запустил команду _audit и обнаружил, что ошибки исчезли.

Т.о. обозначенная проблема самоустраняется без каких либо наших усилий (по счастливому совпадению), хотя то, что команда purge работает некорректно - это плохо...

Любой желающий может самостоятельно воспроизвести эту проблему. Последовательность действий такова:
1. Создайте новый чертёж из пустого шаблона, например Acadiso.dwt
2. Создайте новый слой, к примеру Layer1
3. В чертеже создайте новое определение блока, к примеру из одной полилинии и одного определения атрибута. При этом определение атрибута поместите на любой слой, отличный от 0 - например на слой Layer1.
4. Создайте вхождение этого блока.
5. Удалите вхождение блока.
6. Выполните _purge _a
7. Выполните _audit
      Вы получите 1 Total Error.
8. Внимательно посмотрите лог команды AUDIT.
9. Сохраните чертёж и закройте его.
10. Снова откройте этот чертёж и выполните audit - ошибка исчезает (по понятным причинам).

Видео, демонстрирующее баг, записанное для AutoCAD 2012:





2 комментария:

Dmitriy комментирует...

а тех поддержка autodesk что ответила на этот баг?

Андрей комментирует...

Техническая поддержка подтвердила наличие данной ошибки. Что будет далее - не знаю.