Turned Off All Viewport

Автор Тема: Turned Off All Viewport  (Прочитано 26660 раз)

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

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

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Turned Off All Viewport
« : 25-01-2019, 14:33:30 »
На dwg заинтересовала вот эта тема: http://forum.dwg.ru/showthread.php?p=1779755
Код ничего особенного из себя не представляет...
т.к. листы - блоки, то просто прохожу по всем BlockTableRecord и уже внутри них ищу Viewport и пытаюсь его/их выключить
Извините, вам запрещён просмотр содержимого спойлеров.

Однако получаю вот такую ошибку (acad 2017x64 Win7):

и вроде бы метод public bool On { get; set; } класса Viewport имеет и сеттер и геттер, но выключить Viewport у меня так и не получилось.

Прошу подсказать, что я делаю не так и как все таки выключить ВЭ?
« Последнее редактирование: 28-01-2019, 08:23:03 от Владимир Шу »

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Turned Off All Viewport
« Ответ #1 : 25-01-2019, 14:37:25 »
Возможно, что пытаетесь отключить основной видовой экран листа.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Turned Off All Viewport
« Ответ #2 : 25-01-2019, 14:37:29 »
как все таки выключить ВЭ
А что это за понятие такое "Выключить ВЭ"? Сколько знаком с автокадом, но слышу в первый раз

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Turned Off All Viewport
« Ответ #3 : 25-01-2019, 14:48:22 »
А что это за понятие такое "Выключить ВЭ"? Сколько знаком с автокадом, но слышу в первый раз


Возможно, что пытаетесь отключить основной видовой экран листа.
Эээ.. а можно несколько подробней?

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Turned Off All Viewport
« Ответ #4 : 25-01-2019, 14:49:46 »
Владимир Шу, вот дела - даже не замечал никогда этого свойства =)

Отмечено как Решение Владимир Шу 25-01-2019, 15:01:49

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Turned Off All Viewport
« Ответ #5 : 25-01-2019, 14:51:54 »
Эээ.. а можно несколько подробней?
Я так понимаю ,что всё то что мы непосредственно в пространстве листа рисуем, попадает в этот самый основной видовой экран. Его отключить нельзя. Вот тут у меня была похожая проблема: http://adn-cis.org/forum/index.php?topic=228.0

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Turned Off All Viewport
« Ответ #6 : 25-01-2019, 15:02:35 »
Я так понимаю ,что всё то что мы непосредственно в пространстве листа рисуем, попадает в этот самый основной видовой экран.
Да, это оно. Спасибо, не знал эту тонкость.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Re: Turned Off All Viewport
« Ответ #7 : 25-01-2019, 15:04:41 »
Эээ.. а можно несколько подробней?
Вьюпорт с Number==1 - это не вьюпорт, а просто хранилице визуальных настроек самого листа. Отключить его нельзя. И вообще трогать не надо - большинство свойств и методов вызывает ошибку. Есть на каждом листе.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Turned Off All Viewport
« Ответ #8 : 25-01-2019, 15:05:36 »
Владимир Шу,
Кстати, не самый рациональный алгоритм при большом количестве BlockTableRecord. Лучше было бы подойти со стороны Layout - их всегда меньше и из каждого Layout можно сразу получить все Viewport'ы в нём (Layout.GetViewports).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Turned Off All Viewport
« Ответ #9 : 25-01-2019, 15:12:56 »
Кстати, не самый рациональный алгоритм при большом количестве BlockTableRecord. Лучше было бы подойти со стороны Layout - их всегда меньше и из каждого Layout можно сразу получить все Viewport'ы в нём (Layout.GetViewports).
Ну так и получилось в итоге, т.к. искать ID для первого ВЭ было как то не с руки, кто их знает какой из них первый, какой второй, то зашел со стороны Layout ...

Вьюпорт с Number==1 - это не вьюпорт, а просто хранилице визуальных настроек самого листа.
А вот как найти первый ВЭ... спасибо. =О)

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Re: Turned Off All Viewport
« Ответ #10 : 25-01-2019, 15:13:50 »
кто их знает какой из них первый, какой второй, то зашел со стороны Layout ...
Я ж написал - Number == 1

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Turned Off All Viewport
« Ответ #11 : 25-01-2019, 15:29:15 »
Я ж написал - Number == 1
Увы но нет, это так не работает, автокад назначает номера видовым экранам только в открытом листе, для всех остальных ВЭ на остальных листах номер всегда = -1.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Re: Turned Off All Viewport
« Ответ #12 : 25-01-2019, 15:39:56 »
Я ж написал - Number == 1
Увы но нет, это так не работает, автокад назначает номера видовым экранам только в открытом листе, для всех остальных ВЭ на остальных листах номер всегда = -1.

Да?! Неожиданно... Я в самом деле переключал текущий лист перед этой проверкой, но абсолютно по другой причине...

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Turned Off All Viewport
« Ответ #13 : 25-01-2019, 15:53:01 »
Вот итоговый код:
Код - C# [Выбрать]
  1. using System;
  2. using App = Autodesk.AutoCAD.ApplicationServices;
  3. using Db = Autodesk.AutoCAD.DatabaseServices;
  4. using Rtm = Autodesk.AutoCAD.Runtime;
  5.  
  6. [assembly: Rtm.CommandClass(typeof(TurnedOffAllViewport.Commands))]
  7. namespace TurnedOffAllViewport
  8. {
  9.     public class Commands
  10.     {
  11.         [Rtm.CommandMethod("TurnedOffAllViewport")]
  12.         static public void TurnedOff()
  13.         {
  14.             App.Document acDoc = App.Application.DocumentManager.MdiActiveDocument;
  15.             if (acDoc == null) return;
  16.             Db.Database acCurDb = acDoc.Database;
  17.             using (Db.Transaction acTrans = acCurDb.TransactionManager.StartOpenCloseTransaction())
  18.             {
  19.                 Db.DBDictionary lays = acTrans.GetObject(acCurDb.LayoutDictionaryId,
  20.                        Db.OpenMode.ForRead) as Db.DBDictionary;
  21.  
  22.                 Db.BlockTable bt = acTrans.GetObject(acCurDb.BlockTableId, Db.OpenMode.ForRead) as Db.BlockTable;
  23.                 Db.BlockTableRecord btr = acTrans.GetObject(bt[Db.BlockTableRecord.ModelSpace], Db.OpenMode.ForRead) as Db.BlockTableRecord;
  24.  
  25.                 foreach (Db.DBDictionaryEntry item in lays)
  26.                 {
  27.                     if (item.Value != btr.LayoutId)
  28.                     {
  29.                         Db.Layout layout = acTrans.GetObject(item.Value, Db.OpenMode.ForWrite) as Db.Layout;
  30.  
  31.                         var list = layout.GetViewports();
  32.                         if (list.Count > 1)
  33.                             for (int i = 1; i < list.Count; i++)
  34.                             {
  35.                                 Db.Viewport vp = acTrans.GetObject(list[i], Db.OpenMode.ForWrite, true, true) as Db.Viewport;
  36.                                
  37.                                 if (vp.OwnerId == layout.BlockTableRecordId)
  38.                                     vp.On = false; //тут может быть ошибка eNotInPaperspace
  39.             //http://help.autodesk.com/view/OARX/2019/ENU/?guid=OREF-AcDbViewport__setIsOn_bool
  40.  
  41.                             }
  42.                     }
  43.                 }
  44.                 acTrans.Commit();
  45.             }
  46.         }
  47.     }
  48. }


ЗЫ.
Подправил код, т.к.  if (item.Key != Db.BlockTableRecord.ModelSpace) не работает.
« Последнее редактирование: 28-01-2019, 10:51:01 от Владимир Шу »

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Turned Off All Viewport
« Ответ #14 : 28-01-2019, 08:21:55 »
на некоторых файлах, в строчке  38, возникает ошибка eNotInPaperspace (http://help.autodesk.com/view/OARX/2019/ENU/?guid=OREF-AcDbViewport__setIsOn_bool)

и это очень странно, т.к. набор листов получается из LayoutDictionary и там других BlockTableRecord кроме как пространства модели и листов нет, но модель вроде как отсекается в строке 27 и такой ситуации быть не должно...

Строка 37 (if (vp.OwnerId == layout.BlockTableRecordId)), вроде как отсекает эту ошибку, но не всегда надежно отрабатывает...
Есть еще идеи как сделать код надежным и безотказным?