На данной страничке я покажу ситуацию, когда команда 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:
Описание проблемы
Если в динамическом блоке атрибуты размещены на отдельном слое, то команда "_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 комментария:
а тех поддержка autodesk что ответила на этот баг?
Техническая поддержка подтвердила наличие данной ошибки. Что будет далее - не знаю.
Отправить комментарий