ViewportVisibilityDefault

Автор Тема: ViewportVisibilityDefault  (Прочитано 9225 раз)

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
ViewportVisibilityDefault
« : 21-05-2021, 01:06:53 »
Добрый день! Буду благодарен, если поможете разобраться. При создании слоя устанавливаю свойство ViewportVisibilityDefault = true, чтобы новый слой был заморожен на всех видовых экранах. И это свойство включено. Но при входе в видовых экран (любой) - слой разморожен. Если создавать слой через панель слоев в самом автокаде нажатием на кнопку "заморожен на ВЭ" - то свойство включено и слой сам заморожен... Как добиться такого же эффекта программно?



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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: ViewportVisibilityDefault
« Ответ #1 : 21-05-2021, 01:11:41 »
или это работает только для новых ВЭ? тогда как программно создать слой, замороженный на ВСЕХ ВЭ?


Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 167
    • Мои плагины к Автокаду
Re: ViewportVisibilityDefault
« Ответ #2 : 21-05-2021, 11:04:59 »
Вам надо перебрать все вьюпорты всех листов и заморозить им этот слой: Viewport.FreezeLayersInViewport(IEnumerator layerIds)

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: ViewportVisibilityDefault
« Ответ #3 : 21-05-2021, 14:38:42 »
а как это сделать?  :o
попробовал таким способом - но это работает только на активном в данный момент листе:

Код - C# [Выбрать]
  1.  ObjectIdCollection idCol = new ObjectIdCollection();
  2.                                 idCol.Add(acLyrTblRec.ObjectId);
  3.                                 LayoutManager LM = LayoutManager.Current;
  4.                                 string currentLo = LM.CurrentLayout;
  5.                                 DBDictionary LayoutDict = acTrans.GetObject(acCurDb.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary;
  6.                                 Layout CurrentLo = acTrans.GetObject((ObjectId)LayoutDict[currentLo], OpenMode.ForRead) as Layout;
  7.                                 BlockTableRecord BlkTblRec = acTrans.GetObject(CurrentLo.BlockTableRecordId, OpenMode.ForRead) as BlockTableRecord;
  8.                                 foreach (ObjectId ID in BlkTblRec)
  9.                                 {
  10.                                     Viewport VP = acTrans.GetObject(ID, OpenMode.ForWrite) as Viewport;
  11.                                     if (VP != null)
  12.                                     {
  13.                                         VP.FreezeLayersInViewport(idCol.GetEnumerator());
  14.                                     }
  15.                                 }

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 167
    • Мои плагины к Автокаду
Re: ViewportVisibilityDefault
« Ответ #4 : 21-05-2021, 15:18:07 »
 подправьте код, чтоб не LM.CurrentLayout брать, а перебрать весь словарь листов

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: ViewportVisibilityDefault
« Ответ #5 : 21-05-2021, 15:45:30 »
не понимаю, а как это сделать? можно пересчитать количество элементов LayoutDict, а вот обратиться к ним не по имени, а по индексу нельзя. доступ и к Key и к Values запрещен.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 167
    • Мои плагины к Автокаду
Re: ViewportVisibilityDefault
« Ответ #6 : 21-05-2021, 15:49:41 »
ровно так же как у вас строчкой ниже перебираются элементы в блоке :) Словарь - он же вполне IEnumerable.
А по большому счету вам и листы не нужны - найдите все блоки PaperSpace в таблице блоков - а в них и вьюпорты тоже найдутся.

Отмечено как Решение Александр Ривилис 21-05-2021, 19:54:07

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 167
    • Мои плагины к Автокаду
Re: ViewportVisibilityDefault
« Ответ #7 : 21-05-2021, 15:52:35 »
Код - C# [Выбрать]
  1. using (DBDictionary layoutDict = tr.GetObject(HostApplicationServices.WorkingDatabase.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary)
  2.         foreach (DictionaryEntry de in layoutDict)
  3.           using (Layout ltr = tr.GetObject((ObjectId)de.Value, OpenMode.ForRead) as Layout)
  4.           using (BlockTableRecord btr = tr.GetObject(ltr.BlockTableRecordId, OpenMode.ForRead) as BlockTableRecord)
  5.             foreach (ObjectId objId in btr)
  6.                ...
  7.  

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: ViewportVisibilityDefault
« Ответ #8 : 21-05-2021, 16:36:36 »
УРРРААА! Все работает как часы! Спасибо за помощь!  ;D

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: ViewportVisibilityDefault
« Ответ #9 : 21-05-2021, 19:58:38 »
VitaliyB,
Database.GetViewports возвращает ObjectId всех Viewport'ов базы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение