Turned Off All Viewport

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Turned Off All Viewport
« Ответ #15 : 28-01-2019, 10:46:10 »
Странно, вроде в коде нет каких-то явных ошибок.
Я бы попробовал, для начала, заменить OpenCloseTransaction на обычную транзакцию или открывать Layout не для записи, а для чтения.
P.S. Вытащите код из спойлера, пожалуйста!

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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Turned Off All Viewport
« Ответ #16 : 28-01-2019, 11:04:23 »
Спасибо. Замена StartOpenCloseTransaction() на StartTransaction() на одном и том же файле убирает ошибку eNotInPaperspac.
Очень интересно...

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Turned Off All Viewport
« Ответ #17 : 28-01-2019, 11:13:58 »
Значит, где-то в коде есть ошибка открытия-закрытия объектов, которую обычная транзакция прощает.

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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Turned Off All Viewport
« Ответ #18 : 28-01-2019, 11:48:33 »
нет, ошибка не из-за незакрытого объекта. Переписал код вот так:
Код - C# [Выбрать]
  1.         [Rtm.CommandMethod("TurnedOffAllViewport")]
  2.         static public void TurnedOff()
  3.         {
  4.             App.Document acDoc = App.Application.DocumentManager.MdiActiveDocument;
  5.             if (acDoc == null) return;
  6.             Db.Database acCurDb = acDoc.Database;
  7.  
  8.             Db.ObjectId MSId = Db.ObjectId.Null;
  9.             using (Db.BlockTable bt = acCurDb.BlockTableId.Open(Db.OpenMode.ForRead) as Db.BlockTable)
  10.             {
  11.                 using (Db.BlockTableRecord btr = bt[Db.BlockTableRecord.ModelSpace].Open(Db.OpenMode.ForRead) as Db.BlockTableRecord)
  12.                 {
  13.                     MSId = btr.LayoutId;
  14.                 }
  15.             }
  16.  
  17.             List<Db.ObjectId> lll = new List<Db.ObjectId>();
  18.             using (Db.DBDictionary lays = acCurDb.LayoutDictionaryId.Open(Db.OpenMode.ForRead) as Db.DBDictionary)
  19.             {
  20.                 foreach (Db.DBDictionaryEntry item in lays)
  21.                     lll.Add(item.Value);
  22.             }
  23.  
  24.             List<Db.ObjectId> vps = new List<Db.ObjectId>();
  25.             foreach (Db.ObjectId item in lll.FindAll(q => q != MSId))
  26.             {
  27.                 using (Db.Layout layout = item.Open(Db.OpenMode.ForRead) as Db.Layout)
  28.                 {
  29.                     var list = layout.GetViewports();
  30.                     if (list.Count > 1)
  31.                         for (int i = 1; i < list.Count; i++)
  32.                         {
  33.                             vps.Add(list[i]);
  34.                         }
  35.                 }
  36.             }
  37.  
  38.             foreach (Db.ObjectId item in vps)
  39.             {
  40.                 using (Db.Viewport vp = item.Open(Db.OpenMode.ForWrite, true, true) as Db.Viewport)
  41.                 {
  42.                     vp.On = false; //может быть ошибка eNotInPaperspace
  43.                 }
  44.             }
  45.         }
и получаю всё ту же ошибку eNotInPaperspac все в том же методе

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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Turned Off All Viewport
« Ответ #19 : 28-01-2019, 12:29:17 »
проблема именно в методе On..
если не тупо выключать, а с условием
Код - C# [Выбрать]
  1. if (vp.On) vp.On = false;
то ошибка не появляется, но и не все листы и не все ВЭ выключаются... надо копать глубже.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Turned Off All Viewport
« Ответ #20 : 28-01-2019, 12:36:08 »
Хм... А если в 40 строке openErased поставить false?
P.S. Хотя, нет. Если бы в этом была проблема, то вместо vp был бы null и другая ошибка.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Turned Off All Viewport
« Ответ #21 : 28-01-2019, 12:36:39 »
Владимир Шу,
Интересно глянуть на чертеж, в котором это происходит.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Turned Off All Viewport
« Ответ #22 : 28-01-2019, 12:46:12 »
Вот.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Turned Off All Viewport
« Ответ #23 : 28-01-2019, 12:47:46 »
Вот.
Заодно уточни версию AutoCAD в которой проверял. Это может быть баг в конкретной версии.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Turned Off All Viewport
« Ответ #24 : 28-01-2019, 12:53:44 »
2017х64... но на dwg.ru писали что подобная ошибка есть и на 2018... и что-то у меня подозрение, что проблема именно в методе On. Если ему два раза подряд задать свойство false, то получаю ошибку
Код - C# [Выбрать]
  1.             int a = 1;
  2.             foreach (Db.ObjectId item in vps)
  3.             {
  4.                
  5.                 using (Db.Viewport vp = item.Open(Db.OpenMode.ForWrite) as Db.Viewport)
  6.                 {
  7.                    vp.UpdateDisplay();
  8.                     acDoc.Editor.WriteMessage($"\n {a++}- {vp.Handle}");
  9.                    if (vp.On) vp.On = false; //может быть ошибка eNotInPaperspace
  10.                    //vp.On = false;
  11.                 }
  12.             }
если раскоментить строчку, то точно ошибку получаю, а с закоментированной строчкой ВЭ не выключатся. Блин.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Turned Off All Viewport
« Ответ #25 : 28-01-2019, 12:57:08 »
Я так подозреваю, что проблема возникает если в чертеже есть лист, который никогда не становился активным, т.е. не был инициализирован. Если пройтись по всем вкладкам перед запуском команды - ошибка пропадает.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Turned Off All Viewport
« Ответ #26 : 28-01-2019, 13:13:05 »
Владимир Шу,
Кроме Layout1 никакие листы не инициализированы:


Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Turned Off All Viewport
« Ответ #27 : 28-01-2019, 13:15:48 »
P.S. Кстати, проверить Layout является моделью или нет можно проще - сравнить его свойство Modeltype с true.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Turned Off All Viewport
« Ответ #28 : 28-01-2019, 13:26:56 »
Что ещё интересно, даже если инициализировать все листы, то есть ещё такой глюк: запускаем код, переходим в другой лист и видим, что видовые экраны включены. Хотя в свойствах у них стоит "Вкл-Нет". Я добавил в код:
Код - C# [Выбрать]
  1. vp.UpdateDisplay();
  2. vp.RecordGraphicsModified(true);
  3. vp.Draw();
  4.  
  5. ...
  6.  
  7. Autodesk.AutoCAD.Internal.Utils.FlushGraphics();
  8.  
Это не помогло. Действительно отключаются только ВЭ на активной вкладке. Регенерация не помогает.
Так что, либо использовать обычную транзакцию, либо выставлять активным тот лист, на котором в данный момент отключаются ВЭ.

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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Turned Off All Viewport
« Ответ #29 : 28-01-2019, 13:32:24 »
vp.UpdateDisplay();
http://help.autodesk.com/view/OARX/2019/ENU/?guid=OREF-AcDbViewport__updateDisplay
Цитировать
If no changes have been made, or the viewport is not on, or is not onscreen, then this function does nothing.