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

Автор Тема: Странное поведение при получении замороженных слоев в видовом экране  (Прочитано 3787 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн AlexxАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Добрый день!

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

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

Код - 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.  

Однако сегодня заметил, что почему-то замороженные слои возвращаются лишь на тех листах, которые я делал до этого активными в автокаде. Подскажите, с чем может быть связано такое поведение?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Давай пример чертежа, полный тестовый код (готовый проект) с указанием версии AutoCAD и Visual Studio. Проверю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Однако сегодня заметил, что почему-то замороженные слои возвращаются лишь на тех листах, которые я делал до этого активными в автокаде.
Возможно (если листы создавались программно) не выполнялся метод Layout.Initialize, который создаёт в листе основной видовой экран. Этот метод вызывается и в случае если ты вручную в AutoCAD активизируешь новый лист, у которого еще не создан видовой экран.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Alexx 01-07-2016, 17:17:31

Оффлайн AlexxАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
В общем я уже сам разобрался.

Достаточно было в начале функции вставить
Код - 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.