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

ADN Club => AutoCAD .NET API => Тема начата: VitaliyB от 21-05-2021, 01:06:53

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


(https://i.ibb.co/VBtn69K/image.png) (https://ibb.co/KyX4nh1)
Название: Re: ViewportVisibilityDefault
Отправлено: VitaliyB от 21-05-2021, 01:11:41
или это работает только для новых ВЭ? тогда как программно создать слой, замороженный на ВСЕХ ВЭ?

(https://i.ibb.co/MkFXyxf/image.png) (https://ibb.co/hF3qxJc)
Название: Re: ViewportVisibilityDefault
Отправлено: avc от 21-05-2021, 11:04:59
Вам надо перебрать все вьюпорты всех листов и заморозить им этот слой: Viewport.FreezeLayersInViewport(IEnumerator layerIds)
Название: Re: ViewportVisibilityDefault
Отправлено: VitaliyB от 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.                                 }
Название: Re: ViewportVisibilityDefault
Отправлено: avc от 21-05-2021, 15:18:07
 подправьте код, чтоб не LM.CurrentLayout брать, а перебрать весь словарь листов
Название: Re: ViewportVisibilityDefault
Отправлено: VitaliyB от 21-05-2021, 15:45:30
не понимаю, а как это сделать? можно пересчитать количество элементов LayoutDict, а вот обратиться к ним не по имени, а по индексу нельзя. доступ и к Key и к Values запрещен.
Название: Re: ViewportVisibilityDefault
Отправлено: avc от 21-05-2021, 15:49:41
ровно так же как у вас строчкой ниже перебираются элементы в блоке :) Словарь - он же вполне IEnumerable.
А по большому счету вам и листы не нужны - найдите все блоки PaperSpace в таблице блоков - а в них и вьюпорты тоже найдутся.
Название: Re: ViewportVisibilityDefault
Отправлено: avc от 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.  
Название: Re: ViewportVisibilityDefault
Отправлено: VitaliyB от 21-05-2021, 16:36:36
УРРРААА! Все работает как часы! Спасибо за помощь!  ;D
Название: Re: ViewportVisibilityDefault
Отправлено: Александр Ривилис от 21-05-2021, 19:58:38
VitaliyB,
Database.GetViewports возвращает ObjectId всех Viewport'ов базы.