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

ADN Club => AutoCAD .NET API => Тема начата: Alexx от 01-07-2016, 14:21:38

Название: Странное поведение при получении замороженных слоев в видовом экране
Отправлено: Alexx от 01-07-2016, 14:21:38
Добрый день!

Столкнулся с проблемой получения списка замороженных слоев у видового экрана.

Использовал такой метод:

Код - C# [Выбрать]
  1.         public static IEnumerable<string> GetFrozenLayers(this Layout lt, Transaction tr)
  2.         {
  3.             var vpIds = lt.GetViewports();
  4.             if (vpIds.Count > 0)
  5.             {
  6.                 var vp = (Viewport)tr.GetObject(vpIds[0],
  7.                     OpenMode.ForRead, false, true);
  8.  
  9.                 foreach (var tpVal in vp.XData)
  10.                 {
  11.                     if (tpVal.TypeCode == 1003)
  12.                         yield return (string)tpVal.Value;
  13.                 }
  14.             }
  15.         }
  16.  

Однако сегодня заметил, что почему-то замороженные слои возвращаются лишь на тех листах, которые я делал до этого активными в автокаде. Подскажите, с чем может быть связано такое поведение?
Название: Re: Странное поведение при получении замороженных слоев в видовом экране
Отправлено: Александр Ривилис от 01-07-2016, 15:00:23
Давай пример чертежа, полный тестовый код (готовый проект) с указанием версии AutoCAD и Visual Studio. Проверю.
Название: Re: Странное поведение при получении замороженных слоев в видовом экране
Отправлено: Александр Ривилис от 01-07-2016, 15:15:27
Однако сегодня заметил, что почему-то замороженные слои возвращаются лишь на тех листах, которые я делал до этого активными в автокаде.
Возможно (если листы создавались программно) не выполнялся метод Layout.Initialize, который создаёт в листе основной видовой экран. Этот метод вызывается и в случае если ты вручную в AutoCAD активизируешь новый лист, у которого еще не создан видовой экран.
Название: Re: Странное поведение при получении замороженных слоев в видовом экране
Отправлено: Alexx от 01-07-2016, 15:15:39
В общем я уже сам разобрался.

Достаточно было в начале функции вставить
Код - C# [Выбрать]
  1. ...
  2.             LayoutManager.Current.CurrentLayout = lt.LayoutName;
  3. ...
  4.  

Поковыряв документацию, нашел другой (более логичный) способ получения замороженных слоев на видовом экране.
Хотя мне нужны только имена слоев, поэтому я оставлю старый способ. Но может кому-то пригодится:

Код - C# [Выбрать]
  1.         public static IEnumerable<ObjectId> GetFrozenLayers(this Layout lt, Transaction tr)
  2.         {
  3.             LayoutManager.Current.CurrentLayout = lt.LayoutName;
  4.  
  5.             var vpIds = lt.GetViewports();
  6.             if (vpIds.Count > 0)
  7.             {
  8.                 var vp = (Viewport)tr.GetObject(vpIds[0],
  9.                     OpenMode.ForRead, false, true);
  10.  
  11.                 foreach (ObjectId lrId in vp.GetFrozenLayers())
  12.                     yield return lrId;
  13.             }
  14.         }
  15.