Как получить коллекцию пользовательских видовых экранов текущей вкладки листа?

Автор Тема: Как получить коллекцию пользовательских видовых экранов текущей вкладки листа?  (Прочитано 18352 раз)

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

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Вопрос на первый взгляд тривиальный, но бьюсь над ним уже неприличное количество времени :-[
Вся беда в том, что наряду с ограниченными рамками пользовательскими видовыми экранами в коллекцию попадает основной видовой экран листа и рушит всю работу приложения.
Пример кода:
Код - C# [Выбрать]
  1. [CommandMethod("TestViewPorts", CommandFlags.NoTileMode)]
  2.         public void Run()
  3.         {          
  4.  
  5.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  6.             Database db = adoc.Database;
  7.             Editor ed = adoc.Editor;            
  8.  
  9.             // Проверяем, что мы находимся в пространстве листа
  10.             ObjectId
  11.                 cSpaceId = db.CurrentSpaceId,
  12.                 mSpaceId = SymbolUtilityServices.GetBlockModelSpaceId(db);
  13.  
  14.             if (cSpaceId == mSpaceId)
  15.             {
  16.                 Application.ShowAlertDialog("Программа работает только в пространстве листа!");
  17.                 return;
  18.             }
  19.  
  20.             // Проверяем наличие видовых экранов на листе
  21.  
  22.             ObjectIdCollection vPortsIds = new ObjectIdCollection();
  23.             //LayoutManager layoutMgr = LayoutManager.Current;
  24.             //ObjectId curLayoutId = layoutMgr.GetLayoutId(layoutMgr.CurrentLayout);
  25.             using (Transaction tr = db.TransactionManager.StartTransaction())
  26.             //using (Layout curLay = tr.GetObject(curLayoutId, OpenMode.ForRead) as Layout)
  27.             using (BlockTableRecord cSpace = tr.GetObject(cSpaceId, OpenMode.ForRead) as BlockTableRecord)
  28.             {
  29.                 foreach (ObjectId objId in cSpace)
  30.                 {
  31.                     using (AcDb.DBObject obj = tr.GetObject(objId, OpenMode.ForRead))
  32.                     {
  33.                         if (obj is Viewport)
  34.                         {
  35.                             Viewport vPort = obj as Viewport;
  36.                             vPortsIds.Add(objId);
  37.                         }
  38.                     }
  39.                 }
  40.                 //vPortsIds = curLay.GetViewports();                
  41.             }
  42.  
  43.             if (vPortsIds.Count == 0)
  44.             {
  45.                 AcDialogs.ShowAlertDialog("На листе нет видовых экранов!");
  46.                 return;
  47.             }
  48.         }
Даже на пустом листе этот код найдет видовой экран - главный видовой экран листа. Как его отсортировать?
Есть подозрение, (пока ничем не подтвержденное, кроме опытов) что его номер всегда будет 1 (значение переменной CVPORT = 1 или значение свойства Number объекта Viewport). Так ли это?
« Последнее редактирование: 16-01-2017, 10:55:21 от Дмитрий Загорулькин »

Отмечено как Решение Дмитрий Загорулькин 08-10-2014, 14:53:46

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Добрый день, Дмитрий! Не нужно биться над вопросами -  нужно их задавать! Ну или читать ObjectARX SDK Documentation.  ;)
В описании метода Layout.GetViewports четко указано:
Цитировать
This function returns a collection of ObjectIds of all the Viewports that exist in the Layout's paperspace. The first ID in the list will be the paperspace viewport. If the list returned is empty, then this Layout has never been switched to (activated). The list is updated each time a layout is activated, and kept up-to-date while that layout is active (whenever viewports are added or deleted).
Т.е. первым в списке будет видовой порт Пространства Листа. Так что если он тебя не интересует - просто пропускай первый элемент списка.
 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Здравствуйте, Александр Наумович! Да, получается, что не доглядел... Надо взять за привычку внимательно изучать описание. Спасибо большое!
Кстати, как следствие этого, скорее всего номер этого ВЭ всегда будет 1, как я и предполагал.