Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Александр Пекшев aka Modis от 19-08-2019, 23:16:49

Название: ePermanentlyErased при получении слоев
Отправлено: Александр Пекшев aka Modis от 19-08-2019, 23:16:49
Всем привет. Имеется вот такое свойство (ну можно сказать - метод):
Код - C# [Выбрать]
  1. public static List<string> Layers
  2. {
  3.     get
  4.     {
  5.         var layers = new List<string>();
  6.         using (Document.LockDocument())
  7.         {
  8.             using (OpenCloseTransaction tr = Database.TransactionManager.StartOpenCloseTransaction())
  9.             {
  10.                 LayerTable lt = tr.GetObject(Database.LayerTableId, OpenMode.ForRead) as LayerTable;
  11.                 if (lt != null)
  12.                 {
  13.                     foreach (ObjectId layerId in lt)
  14.                     {
  15.                         var layer = tr.GetObject(layerId, OpenMode.ForRead) as LayerTableRecord;
  16.                         if (layer != null)
  17.                             layers.Add(layer.Name);
  18.                     }
  19.                 }
  20.             }
  21.         }
  22.         return layers;
  23.     }
  24. }
Этот метод выдает иногда ошибку ePermanentlyErased. Переводится вроде как "Стерт навсегда".
У меня два вопроса:
1. Что это за условие такое, при котором может быть такая ошибка? Я сам не сталкивался (только по отчетам) и никак не могу понять какие условия возникновения такой ошибки могут быть
2. Достаточно ли будет добавить такую проверку:
Код - C# [Выбрать]
  1. if (layer != null && !layer.IsErased && !layer.IsEraseStatusToggled)
  2.     layers.Add(layer.Name);
?
Название: Re: ePermanentlyErased при получении слоев
Отправлено: avc от 19-08-2019, 23:24:11
Не уверен, но мне кажется я сталкивался с этим эксепшеном и заблокировал просто по IsErased
Название: Re: ePermanentlyErased при получении слоев
Отправлено: Александр Пекшев aka Modis от 20-08-2019, 00:03:18
но мне кажется я сталкивался с этим эксепшеном
Специально получалось создать условия возникновения ошибки? Не программно, а какими-то действиями в автокаде
Название: Re: ePermanentlyErased при получении слоев
Отправлено: avc от 20-08-2019, 00:10:26
Боюсь соврать, но кажется я пытался сделать выпадающий список с именами слоев... или ошибка потом вылезала, потому что слой уже в самом деле удален был... Вот кроме впечатляющего ePermanentlyErased уже ничего не помню :)
Название: Re: ePermanentlyErased при получении слоев
Отправлено: avc от 20-08-2019, 00:13:19
Я стараюсь еще до вызова GetObject всегда проверять ObjectId на IsErased  - оно так безопасней и по идее быстрей.
Название: Re: ePermanentlyErased при получении слоев
Отправлено: Привалов Дмитрий от 20-08-2019, 07:23:11
2. Достаточно ли будет добавить такую проверку:
Попробуй так:
var layer = tr.GetObject(layerId, OpenMode.ForRead, false) as LayerTableRecord;
Название: Re: ePermanentlyErased при получении слоев
Отправлено: Александр Ривилис от 20-08-2019, 08:55:31
но мне кажется я сталкивался с этим эксепшеном
Специально получалось создать условия возникновения ошибки? Не программно, а какими-то действиями в автокаде
_PURGE, которое почистит неиспользуемые слои. Они же физически не удаляются, а только помечаются как удаленные. И только сохранение чертежа и повторное его открытие удаляет их физически.
Название: Re: ePermanentlyErased при получении слоев
Отправлено: Дмитрий Загорулькин от 20-08-2019, 10:22:07
Может быть это слои удалённой внешней ссылки?