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

ADN Club => AutoCAD .NET API => Тема начата: Владимир Шу от 25-01-2019, 14:33:30

Название: Turned Off All Viewport
Отправлено: Владимир Шу от 25-01-2019, 14:33:30
На dwg заинтересовала вот эта тема: http://forum.dwg.ru/showthread.php?p=1779755
Код ничего особенного из себя не представляет...
т.к. листы - блоки, то просто прохожу по всем BlockTableRecord и уже внутри них ищу Viewport и пытаюсь его/их выключить
Извините, вам запрещён просмотр содержимого спойлеров.

Однако получаю вот такую ошибку (acad 2017x64 Win7):
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Ficecream.me%2Fuploads%2F56b1d8fef5020119dac1e0a2b1b8153d.png&hash=f307b1083011e45b50e76ae2c1024d9a)
и вроде бы метод public bool On { get; set; } класса Viewport имеет и сеттер и геттер, но выключить Viewport у меня так и не получилось.

Прошу подсказать, что я делаю не так и как все таки выключить ВЭ?
Название: Re: Turned Off All Viewport
Отправлено: Дмитрий Загорулькин от 25-01-2019, 14:37:25
Возможно, что пытаетесь отключить основной видовой экран листа.
Название: Re: Turned Off All Viewport
Отправлено: Александр Пекшев aka Modis от 25-01-2019, 14:37:29
как все таки выключить ВЭ
А что это за понятие такое "Выключить ВЭ"? Сколько знаком с автокадом, но слышу в первый раз
Название: Re: Turned Off All Viewport
Отправлено: Владимир Шу от 25-01-2019, 14:48:22
А что это за понятие такое "Выключить ВЭ"? Сколько знаком с автокадом, но слышу в первый раз
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Ficecream.me%2Fuploads%2Fa9faf2030f5a58512f0c1b1bf3403fc0.png&hash=2b4e8aafb445f0dce0f6ae293d767f60)

Возможно, что пытаетесь отключить основной видовой экран листа.
Эээ.. а можно несколько подробней?
Название: Re: Turned Off All Viewport
Отправлено: Александр Пекшев aka Modis от 25-01-2019, 14:49:46
Владимир Шу, вот дела - даже не замечал никогда этого свойства =)
Название: Re: Turned Off All Viewport
Отправлено: Дмитрий Загорулькин от 25-01-2019, 14:51:54
Эээ.. а можно несколько подробней?
Я так понимаю ,что всё то что мы непосредственно в пространстве листа рисуем, попадает в этот самый основной видовой экран. Его отключить нельзя. Вот тут у меня была похожая проблема: http://adn-cis.org/forum/index.php?topic=228.0
Название: Re: Turned Off All Viewport
Отправлено: Владимир Шу от 25-01-2019, 15:02:35
Я так понимаю ,что всё то что мы непосредственно в пространстве листа рисуем, попадает в этот самый основной видовой экран.
Да, это оно. Спасибо, не знал эту тонкость.
Название: Re: Turned Off All Viewport
Отправлено: avc от 25-01-2019, 15:04:41
Эээ.. а можно несколько подробней?
Вьюпорт с Number==1 - это не вьюпорт, а просто хранилице визуальных настроек самого листа. Отключить его нельзя. И вообще трогать не надо - большинство свойств и методов вызывает ошибку. Есть на каждом листе.
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 25-01-2019, 15:05:36
Владимир Шу,
Кстати, не самый рациональный алгоритм при большом количестве BlockTableRecord. Лучше было бы подойти со стороны Layout - их всегда меньше и из каждого Layout можно сразу получить все Viewport'ы в нём (Layout.GetViewports).
Название: Re: Turned Off All Viewport
Отправлено: Владимир Шу от 25-01-2019, 15:12:56
Кстати, не самый рациональный алгоритм при большом количестве BlockTableRecord. Лучше было бы подойти со стороны Layout - их всегда меньше и из каждого Layout можно сразу получить все Viewport'ы в нём (Layout.GetViewports).
Ну так и получилось в итоге, т.к. искать ID для первого ВЭ было как то не с руки, кто их знает какой из них первый, какой второй, то зашел со стороны Layout ...

Вьюпорт с Number==1 - это не вьюпорт, а просто хранилице визуальных настроек самого листа.
А вот как найти первый ВЭ... спасибо. =О)
Название: Re: Turned Off All Viewport
Отправлено: avc от 25-01-2019, 15:13:50
кто их знает какой из них первый, какой второй, то зашел со стороны Layout ...
Я ж написал - Number == 1
Название: Re: Turned Off All Viewport
Отправлено: Владимир Шу от 25-01-2019, 15:29:15
Я ж написал - Number == 1
Увы но нет, это так не работает, автокад назначает номера видовым экранам только в открытом листе, для всех остальных ВЭ на остальных листах номер всегда = -1.
Название: Re: Turned Off All Viewport
Отправлено: avc от 25-01-2019, 15:39:56
Я ж написал - Number == 1
Увы но нет, это так не работает, автокад назначает номера видовым экранам только в открытом листе, для всех остальных ВЭ на остальных листах номер всегда = -1.

Да?! Неожиданно... Я в самом деле переключал текущий лист перед этой проверкой, но абсолютно по другой причине...
Название: Re: Turned Off All Viewport
Отправлено: Владимир Шу от 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) не работает.
Название: Re: Turned Off All Viewport
Отправлено: Владимир Шу от 28-01-2019, 08:21:55
на некоторых файлах, в строчке  38, возникает ошибка eNotInPaperspace (http://help.autodesk.com/view/OARX/2019/ENU/?guid=OREF-AcDbViewport__setIsOn_bool)
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Ficecream.me%2Fuploads%2Fc22d5eb6c2db35897caff31e86daba2f.png&hash=062c900031e0db83fdc297bffdd1607a)
и это очень странно, т.к. набор листов получается из LayoutDictionary и там других BlockTableRecord кроме как пространства модели и листов нет, но модель вроде как отсекается в строке 27 и такой ситуации быть не должно...

Строка 37 (if (vp.OwnerId == layout.BlockTableRecordId)), вроде как отсекает эту ошибку, но не всегда надежно отрабатывает...
Есть еще идеи как сделать код надежным и безотказным?
Название: Re: Turned Off All Viewport
Отправлено: Дмитрий Загорулькин от 28-01-2019, 10:46:10
Странно, вроде в коде нет каких-то явных ошибок.
Я бы попробовал, для начала, заменить OpenCloseTransaction на обычную транзакцию или открывать Layout не для записи, а для чтения.
P.S. Вытащите код из спойлера, пожалуйста!
Название: Re: Turned Off All Viewport
Отправлено: Владимир Шу от 28-01-2019, 11:04:23
Спасибо. Замена StartOpenCloseTransaction() на StartTransaction() на одном и том же файле убирает ошибку eNotInPaperspac.
Очень интересно...
Название: Re: Turned Off All Viewport
Отправлено: Дмитрий Загорулькин от 28-01-2019, 11:13:58
Значит, где-то в коде есть ошибка открытия-закрытия объектов, которую обычная транзакция прощает.
Название: Re: Turned Off All Viewport
Отправлено: Владимир Шу от 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 все в том же методе
Название: Re: Turned Off All Viewport
Отправлено: Владимир Шу от 28-01-2019, 12:29:17
проблема именно в методе On..
если не тупо выключать, а с условием
Код - C# [Выбрать]
  1. if (vp.On) vp.On = false;
то ошибка не появляется, но и не все листы и не все ВЭ выключаются... надо копать глубже.
Название: Re: Turned Off All Viewport
Отправлено: Дмитрий Загорулькин от 28-01-2019, 12:36:08
Хм... А если в 40 строке openErased поставить false?
P.S. Хотя, нет. Если бы в этом была проблема, то вместо vp был бы null и другая ошибка.
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 28-01-2019, 12:36:39
Владимир Шу,
Интересно глянуть на чертеж, в котором это происходит.
Название: Re: Turned Off All Viewport
Отправлено: Владимир Шу от 28-01-2019, 12:46:12
Вот.
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 28-01-2019, 12:47:46
Вот.
Заодно уточни версию AutoCAD в которой проверял. Это может быть баг в конкретной версии.
Название: Re: Turned Off All Viewport
Отправлено: Владимир Шу от 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.             }
если раскоментить строчку, то точно ошибку получаю, а с закоментированной строчкой ВЭ не выключатся. Блин.
Название: Re: Turned Off All Viewport
Отправлено: Дмитрий Загорулькин от 28-01-2019, 12:57:08
Я так подозреваю, что проблема возникает если в чертеже есть лист, который никогда не становился активным, т.е. не был инициализирован. Если пройтись по всем вкладкам перед запуском команды - ошибка пропадает.
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 28-01-2019, 13:13:05
Владимир Шу,
Кроме Layout1 никакие листы не инициализированы:
(https://farm8.staticflickr.com/7803/31962555197_a2970368f3_o.png)

Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 28-01-2019, 13:15:48
P.S. Кстати, проверить Layout является моделью или нет можно проще - сравнить его свойство Modeltype с true.
Название: Re: Turned Off All Viewport
Отправлено: Дмитрий Загорулькин от 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.  
Это не помогло. Действительно отключаются только ВЭ на активной вкладке. Регенерация не помогает.
Так что, либо использовать обычную транзакцию, либо выставлять активным тот лист, на котором в данный момент отключаются ВЭ.
Название: Re: Turned Off All Viewport
Отправлено: Владимир Шу от 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.
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 28-01-2019, 13:33:59
Дмитрий Загорулькин,
LAYOUTREGENCTL не влияет?
Название: Re: Turned Off All Viewport
Отправлено: Владимир Шу от 28-01-2019, 13:41:28
вот так отрабатывает без ошибок,
Код - 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.             List<Db.ObjectId> lll = new List<Db.ObjectId>();
  9.             using (Db.DBDictionary lays = acCurDb.LayoutDictionaryId.Open(Db.OpenMode.ForRead) as Db.DBDictionary)
  10.             {
  11.                 foreach (Db.DBDictionaryEntry item in lays)
  12.                    lll.Add(item.Value);
  13.             }
  14.             List<Db.ObjectId> vps = new List<Db.ObjectId>();
  15.             foreach (Db.ObjectId item in lll)
  16.             {
  17.                 using (Db.Layout layout = item.Open(Db.OpenMode.ForWrite) as Db.Layout)
  18.                 {
  19.                     if (!layout.ModelType)
  20.                     {
  21.                         var list = layout.GetViewports();
  22.                         if (list.Count == 0)
  23.                         {
  24.                             layout.Initialize();
  25.                             list = layout.GetViewports();
  26.                         }
  27.                         if (list.Count > 1)
  28.                             for (int i = 1; i < list.Count; i++)
  29.                             {
  30.                                 vps.Add(list[i]);
  31.                             }
  32.                     }
  33.                 }
  34.             }
  35.             int a = 1;
  36.             foreach (Db.ObjectId item in vps)
  37.             {
  38.                  using (Db.Viewport vp = item.Open(Db.OpenMode.ForWrite) as Db.Viewport)
  39.                 {
  40.                     acDoc.Editor.WriteMessage($"\n {a++}- {vp.Handle}");
  41.                     vp.On = false;
  42.                 }
  43.             }
  44.         }
НО... для листов, которые были принудительно инициализированны, каким то чудом становятся видимыми ВЭ (те которые под номером 0) и выключаются.
Название: Re: Turned Off All Viewport
Отправлено: Дмитрий Загорулькин от 28-01-2019, 13:51:12
LAYOUTREGENCTL не влияет?
Влияет! Если 0 - то всё ок. Если 2 - то как я описывал ранее.
Название: Re: Turned Off All Viewport
Отправлено: Дмитрий Загорулькин от 28-01-2019, 13:57:55
вот так отрабатывает без ошибок
Вот тут я перестал понимать...
Если раньше работу рушили ВЭ на неинициализированных листах, то как теперь выполняется условие в строке 22? То есть, на неинициализированных листах не выдаёт ВЭ, тогда откуда в предыдущем варианте взялись ВЭ, которые выдавали ошибку? Мистика...
Название: Re: Turned Off All Viewport
Отправлено: Владимир Шу от 28-01-2019, 14:45:15
Кроме Layout1 никакие листы не инициализированы:
т.е. до тех пор, пока не будет инициирован лист, ВЭ не будет записано ID владельца или владельцу не будет установлено свойство, что он -  лист?
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 28-01-2019, 16:20:09
т.е. до тех пор, пока не будет инициирован лист, ВЭ не будет записано ID владельца или владельцу не будет установлено свойство, что он -  лист?
До тех пор у листа не будет Viewport'ов. На тех картинках, которые я привёл видно, что GetViewports для неинициализированных листов возвращает пустой список. Меня удивило другое. Такое впечатление, что лист "Корпус 1. Секция 3. Стены подвала." (впрочем как и многие другие) был создан и не инициализирован (возможно программно?) и в него были добавлены Viewport'ы до инициализации. Вручную, как я понимаю это сделать нельзя - при переключении на лист он инциализируется.
Название: Re: Turned Off All Viewport
Отправлено: Владимир Шу от 28-01-2019, 16:27:08
Такое впечатление, что лист "Корпус 1. Секция 3. Стены подвала." (впрочем как и многие другие) был создан и не инициализирован (возможно программно?) и в него были добавлены Viewport'ы до инициализации. Вручную, как я понимаю это сделать нельзя - при переключении на лист он инциализируется.
Нет. Эти листы делались либо из шаблона (другой файл), либо просто добавлялись руками, ВЭ создавались руками.
Layout1, Layout2 ... делал точно руками в процессе тестирования кода из первого сообщения в этой теме.
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 28-01-2019, 16:30:50
Layout1, Layout2 ... делал точно руками в процессе тестирования кода из первого сообщения в этой теме.
Посмотри значение переменной LAYOUTCREATEVIEWPORT.
Название: Re: Turned Off All Viewport
Отправлено: Владимир Шу от 28-01-2019, 16:42:04
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Ficecream.me%2Fuploads%2F6c845818ffa7d7d6e766efdc8a6dfe00.png&hash=2374ab71a7210092524310fd967cdc30)
 LAYOUTCREATEVIEWPORT=0
я сам делал ВЭ командой  _-vports
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 28-01-2019, 16:45:03
LAYOUTCREATEVIEWPORT=0
я сам делал ВЭ командой  _-vports
Вот поэтому что-то и не срослось.
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 21-09-2020, 18:03:55
НО... для листов, которые были принудительно инициализированны, каким то чудом становятся видимыми ВЭ (те которые под номером 0) и выключаются.
Похожая ситуация. Метод layout. Inizialise вдобавок выключают и существующие vp на некоторых  других  layouts или вообще на всех. Все vp делались руками в различных вариантах(обычный, подрезанный,полигональный,по примитиву).Возможно ли избежать создания видимого , но выключенного vp[0]  и выключения существующих vp без переключений на каждый layout ?
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 21-09-2020, 19:31:27
Метод layout. Inizialise вдобавок выключают и существующие vp на некоторых  других  layouts или вообще на всех.
Это или баг в AutoCAD или в конкретном чертеже.
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 21-09-2020, 23:40:26
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4.  
  5. namespace pavtest
  6. {
  7.     public class PavTest
  8.     {
  9.  
  10.         [CommandMethod("PAVTEST")]
  11.         public void PAVTEST()
  12.         {
  13.             Document doc = Application.DocumentManager.MdiActiveDocument;
  14.             Database db = doc.Database;
  15.  
  16.             //проходим по layouts
  17.             using (DBDictionary dict = (DBDictionary)db.LayoutDictionaryId.Open(OpenMode.ForRead))
  18.             {
  19.                 foreach (DBDictionaryEntry eDict in dict)
  20.                 {
  21.                     using (Layout layout = (Layout)eDict.Value.Open(OpenMode.ForRead))
  22.                     {
  23.                         if (!layout.ModelType)
  24.                         {
  25.                             //если неинициализирован, то vp.count = 0, инициализируем
  26.                             if (layout.GetViewports().Count == 0)
  27.                             {
  28.  
  29.                                 layout.UpgradeOpen();
  30.                                 layout.Initialize();
  31.                                 layout.DowngradeOpen();
  32.  
  33.                             }
  34.                         }
  35.  
  36.                     }
  37.                 }
  38.  
  39.             }
  40.         }
  41.     }
  42. }
  43.  
  44.  
  45.  

Появляется в 13,16,20 кадах, в других не проверял. Появляется во вкладке в которую не переключаешься в сессии и то не всегда. Но единожды то переключение (руками) во время создания листа и vp было когда то. Как вариант для устранения проблемы нужно переключится во вкладку еще раз после создания.
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 22-09-2020, 10:44:56
pavka_97,
Увы, но я ничего не понял. Что появляется? Код внешне выглядит вполне корректным.
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 22-09-2020, 11:41:18

в layout1 и layaout2 включенные vp. если мы запускаем код из layout4, предварительно не переключаясь в layout1 или 2, то видим что на видео. Т.е. выключенные vp плюс видимый выключенный контур "старого" о-го vp 
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 22-09-2020, 11:43:19
pavka_97,
Выложи dwg-файл. Подозреваю что проблема в нём.
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 22-09-2020, 11:51:07
Пожалуйста :)
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 22-09-2020, 12:11:21
в layout1 и layaout2 включенные vp.
В них вообще нет Viewport'ов - эти листы не были инициализированы. Когда ты на них переключаешься, AutoCAD их сам инициализирует и на них получаются Viewport'ы.



Если в BlockTableRecord соответствующего Layout уже были Viewport'ы, то получается чехарда, как в твоём случае. Поэтому сначала нужно создавать Layout, инициализировать его, а потом уже добавлять в него, то что нужно.

Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 22-09-2020, 12:21:45
это все понятно, кроме:
Поэтому сначала нужно создавать Layout, инициализировать его
Я все layout создаю руками(т.е последовательно создаю вкладку, в ней создаю viewport, затем создаю следующую вкладку,в ней свой viewport) - это не является  инициализацией?
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 22-09-2020, 12:41:13
это все понятно, кроме:
Поэтому сначала нужно создавать Layout, инициализировать его
Я все layout создаю руками(т.е последовательно создаю вкладку, в ней создаю viewport, затем создаю следующую вкладку,в ней свой viewport) - это не является  инициализацией?
Даже если ты установил LAYOUTCREATEVIEWPORT в 0, при создании листа Viewport'ы не создаются, но при переключении на созданный лист AutoCAD неявно выполняет его инициализацию и создаёт в нём один основной (невидимый) Viewport:

Если LAYOUTCREATEVIEWPORT в 1, то создаются два Viewport'а - один основной невидимый, и второй который ты видишь:

(https://live.staticflickr.com/65535/50371182417_8b7edac302_o.png)

В твоём же случае листы были созданы, но не инициализированы никаким образом. И в них (похоже программно) закинуты Viewport'ы.


Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 22-09-2020, 12:52:06
И в них (похоже программно) закинуты Viewport'ы.
Это не так.

Я все layout создаю руками(т.е последовательно создаю вкладку, в ней создаю viewport, затем создаю следующую вкладку,в ней свой viewport) - это не является  инициализацией?
Такой последовательность вручную можно назвать инициализацией?

Ладно бы это была проблема конкретного файла, но к сожалению ситуация повторяется на многих других, не только моих файлах.
 
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 22-09-2020, 13:00:39
Цитата: Александр Ривилис от 22-09-2020, 12:11:21

    Я все layout создаю руками(т.е последовательно создаю вкладку, в ней создаю viewport, затем создаю следующую вкладку,в ней свой viewport) - это не является  инициализацией?

Такой последовательность вручную можно назвать инициализацией?
Вручную можно создать Viewport только если переключится на соответствующий Layout, что приводит к его инициализации (фактически вызов Layout.Initialize()). В этом случае в нём всегда есть как минимум два Viewport'а - один основной невидимый, второй - который ты создал.
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 22-09-2020, 13:16:01
pavka_97,
Если ты не закинул программно Viewport'ы в не инициализированный Layout, то тут два варианта:
1) Баг в конкретной версии AutoCAD
2) Установлено приложение в AutoCAD, которое само создаёт (или копирует Viewport'ы)
Вот анализ твоего чертежа. Смотрим, что Layout1 не инициализирован, но его BlockTableRecord уже содержит 3 Viewport'а
Откуда они там взялись?

Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 22-09-2020, 13:26:34
удалось точно поймать "баг". (и это одна из многих комбинаций)создаем последовательно вручную вьюпорты в 4x листах. на 4м листе копируем vp. теперь в 4м их два, не считая 0го.Сохраняем автокад выходим. Открываем этот же файл.Переключаемся в 1йлист.В первой вкладке копируем существующий вьюпорт. Теперь и в первой вкладке два вьюпорта, не считая  0-го. Сохраняем выходим.Открываем и в первой вкладке запускаем код. Теперь во 2-й и 3й вкладках выключились вьюпорты.
Если нужно, видео могу позднее записать.
Autocad 2013 eng. 32x. Windows7
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 22-09-2020, 13:30:21
Если нужно, видео могу позднее записать.
Было бы очень желательно, но вот только делать это в AutoCAD 2013 совершенно бессмысленно, так как эта версия уже очень давно не поддерживается. Если есть возможность - запиши в одной из двух последних версий (2020 или 2021).
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 22-09-2020, 13:32:07
В первой вкладке копируем существующий вьюпорт.
Копируешь через буфер обмена, или командой _COPY?
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 22-09-2020, 13:37:16
Copy. В 2020  не могу сегодня проверить
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 22-09-2020, 13:41:33
Copy. В 2020  не могу сегодня проверить
Хорошо. Запиши в 2013. Я по твоей последовательности проверю в 2021. Если такой ошибки не будет, то увы... Значит исправили в одной из последующих версий.
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 22-09-2020, 14:50:30
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 22-09-2020, 15:01:11
pavka_97,
Я вижу, что как минимум VetCAD++ используется. Плюс я хотел бы понять после всех этих манипуляций что с листами и viewport'ами в них? Установи MGDDBG и проверь то, что я показывал на предыдущих видео.
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 22-09-2020, 15:15:53
ARX не подойдет? MGD не пойму как ставить на 13й.
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 22-09-2020, 15:19:06
ARX не подойдет? MGD не пойму как ставить на 13й.
Нет, не подойдет. Он не всю информацию снимает. Как сказано здесь: https://adn-cis.org/forum/index.php?topic=7274.0
Цитировать
Чтобы установить ARXDBG и MGDDBG необходимо их BUNDLE'ы разархивировать в каталог  %ProgramFiles%\Autodesk\ApplicationPlugins
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 22-09-2020, 15:24:06
pavka_97,
И для начала проверь без VetCAD++ и вообще без любых сторонних приложений...
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 22-09-2020, 15:35:22
Off-Topic: показать
Я себя полнейшим д..... ощущаю, но не выходит mgd. через netload же ставится?/bin/debug/MgdDbg.dll? так не выходит .на работе в 16 и 20 все сразу подключилось
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 22-09-2020, 15:38:58
Off-Topic: показать
Я себя полнейшим д..... ощущаю, но не выходит mgd. через netload же ставится?/bin/debug/MgdDbg.dll? так не выходит .на работе в 16 и 20 все сразу подключилось

Через netload вообще ничего не ставится, а загружается. Но не в этом случае. Здесь AutoCAD при запуске сам загружает при помощи автозагрузчика. И загружает автозагрузчик для AutoCAD 2013 файл "C:\Program Files\Autodesk\ApplicationPlugins\Autodesk DWG MgdDBG.bundle\Contents\Resources\DWGMgdDbgSource\bin\DebugA2013\MgdDbg.dll"
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 22-09-2020, 15:44:32
Off-Topic: показать
если достаточно разархивировать туда же куда и arx, т.е. %ProgramFiles%\Autodesk\ApplicationPlugins, то нет не подгружает.попробую автокад переустановить
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 22-09-2020, 15:49:47
если достаточно разархивировать туда же куда и arx, т.е. %ProgramFiles%\Autodesk\ApplicationPlugins, то нет не подгружает.попробую автокад переустановить
Должно быть так:
(https://live.staticflickr.com/65535/50370800798_9573954e45_o.png)

P.S.: Это не оффтоп.
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 22-09-2020, 15:58:35
Проверил у себя - в AutoCAD 2013 нормально грузится. Впрочем у меня x64:

(https://live.staticflickr.com/65535/50370826723_aced671a6b_o.png)

Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 22-09-2020, 16:25:36
Переустановил. Не грузится mgd...(:. Vetcad как оказалось ни причем:). Придется проверять в другом автокаде, но не сегодня уже
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 22-09-2020, 16:28:25
Не грузится mgd...
Через netload указанный мной выше файл тоже не грузится?
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 22-09-2020, 16:29:29
угу
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 22-09-2020, 16:34:34
угу
Ну тогда даже и не знаю чем помочь... Попробуй у себя перекомпилировать MGDDBG для AutoCAD 2013.
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 22-09-2020, 16:36:00
Кстати, неплохо бы убедиться, что установлены все обновления для AutoCAD 2013. Как минимум нашел вот это:
https://knowledge.autodesk.com/support/autocad/troubleshooting/caas/downloads/content/autocad-2013-service-pack-2.html
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 22-09-2020, 16:38:47
Off-Topic: показать
Спасибо, попробую. Но уже завтра
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 22-09-2020, 22:39:22
Через AnyDesk зашел на рабочий комп. В 16, 20 кадах ситуация аналогичная 13-му(алгоритм создания листов тот же, что и выше у меня в последнем видео,  запуск кода выключает вьюпорты). MGDDBG показывает,  то же что и вас в последнем видео. Завтра постараюсь записать с работы видео. 
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 23-09-2020, 18:23:11
Вот что у меня получилось  в Autocad 2021eng x64 Windows7: наличие трех layout, два раза сохранить/закрыть, изменить количество vp в одной из вкладок, не переключаться во второй сессии по вкладкам, запустить код c методом layout.Initialize().


 
но... в 2021 такой алгоритм выключает vp не во всех 100% случаев. в 16 и 20 кадах  близок к 100%. детально тестировать не было времени. надеюсь видео покажет что собственно я имею ввиду
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 23-09-2020, 20:31:14
pavka_97,
Мне кажется что ты нашел баг, но не тот, о котором говоришь. То что ты видишь - это следствие, а не причина. Причина в том, что после сохранения dwg-файла и повторного его открытия Layout.GetViewports возвращает пустой список для неактивного листа.
Это хорошо видно на этом видео:



В общем чтобы его обойти придётся таки переключаться на нужный лист, а затем уже проверять Layout.GetViewports
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 23-09-2020, 20:46:04
Я отправил в ADN DevHelp эту информацию. Если это баг, то есть шанс, что будет исправлено в следующей версии. В противном случае надеюсь на их корректное объяснение такого поведения.
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 23-09-2020, 21:24:06
Layout.GetViewports возвращает пустой список для неактивного листа.

В самом деле. Я забыл что до initialize был похожий результат  .я решил что это нормально, просто не проинициализировал. А потом зациклился на initialize.


придётся таки переключаться на нужный лист, а затем уже проверять Layout.GetViewports

Именно поэтому я и полез во все это,чтобы избежать переключений.
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 23-09-2020, 22:19:41
Не грузится mgd...(:
загрузилось. некоторые файлы, не все, но самые нужные, были заблокированы.
Off-Topic: показать

узнал об этом, прочитав соответствующую тему:). а перед этим посносил автокады, студию. поигрался с фреймворками, uac, сертификатами и прочими обновлениями. веселился как мог вобщем. ну хоть комп теперь почище стал.:)
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 23-09-2020, 22:23:12
узнал об этом, прочитав соответствующую тему:).
Сочувствую. Но теперь думаю, что надолго это запомнишь. Кстати, тоже самое касается не только dll, но и arx/dbx/crx и т.д.
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 23-09-2020, 22:41:12
надолго это запомнишь
Off-Topic: показать

о, да. иногда читать по теме и документацию полезно.. но я вчера что то выбился из сил, да и  грешил на загаженность компьютора.


В связи с вышеобозначенной ситуацией, если не использовать layout.GetVieports и проходить обычным циклом по пространству листа, первый попавшийся id vieport-а, это 0-й vp и далее следущие попадающиеся vp, совпадают с vp.Number или не факт?

 
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 23-09-2020, 22:43:25
В связи с вышеобозначенной ситуацией, если не использовать layout.GetVieports и проходить обычным циклом по пространству листа, первый попавшийся id vieport-а, это 0-й vp и далее следущие попадающиеся vp, совпадают с vp.Number или не факт?
Увы, но это не факт.
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 23-09-2020, 22:45:58
То есть номер viewport -а без layout.GetViewports никак не получить? 
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 23-09-2020, 22:49:55
То есть номер viewport -а без layout.GetViewports никак не получить? 
Фактически номер у него возникает только тогда, когда Layout становится активным:

(https://live.staticflickr.com/65535/50375756133_cd771a823a_o.png)

Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 23-09-2020, 23:03:07
номер у него возникает только тогда, когда Layout становится активным

да, это я читал, разочаровался и надеялся, что время и порядок создания objectid vp-та, будет равно vp number.

Я еще один вопрос тут задам, если решите что нужна новая тема, то создам.

Мне нужно добраться до конкретных -vp.
Я вижу два варианта:
1. через его номер,cоответственно переключаясь во вкладки
2. через его ранее сохраненный в другой сессии handle. GetObjectId(..., handle,...)

Я понимаю конечно, что все будет зависит от размера файла,но все же..(вдруг опять подводные камни какие то есть)

Какой способ будет предпочтительней при прочих равных? Насколько быстро ищет по базе handle's?

Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 23-09-2020, 23:05:19
Какой способ будет предпочтительней при прочих равных?
Handle
Насколько быстро ищет по базе handle's?
Практически моментально. Только лучше вместо GetObjectId использовать метод TryGetObjectId. Это обсуждалось у нас на форуме.
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 23-09-2020, 23:10:50
Это обсуждалось у нас на форуме
Ага, мелькало где то.
Спасибо, буду пробовать.
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 29-09-2020, 15:14:50
В ADN DevHelp мне подтвердили, что Layout.GetViewports возвращает непустой список Viewport'ов только если этот лист был или активирован или инициализирован в текущей сессии AutoCAD, так как этот список не сохраняется в чертеже при его сохранении, а вычисляется при активации листа или его инициализации.
Для неактивного листа рекомендуют при помощи Database.GetViewports(true) получить все Viewport'ы листов чертежа, затем используя для них метод OwnerId получить BlockTableRecord листа, которому они принадлежат, а затем по свойству LayoutId получить и сам лист. Таким образом можно найти все Viewport'ы конкретного листа без использования Layout.GetViewports.
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 01-10-2020, 18:18:08
ADN DevHelp спасибо за новый для меня метод (Database.GetViewports(true)), но каким образом получить из коллекции вьюпортов конкретного листа, к примеру, 0-й вьюпорт этого листа? Он ведь не факт, что первый в коллекции? Или его ObjectId можно чему-то сопоставить/приравнять?
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 01-10-2020, 21:05:15
Он ведь не факт, что первый в коллекции?
Не 100% факт, но можно поэкспериментировать.
Название: Re: Turned Off All Viewport
Отправлено: Дмитрий Загорулькин от 08-10-2020, 14:38:51
Не 100% факт
Хм... https://adn-cis.org/forum/index.php?topic=228.msg415#msg415
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 08-10-2020, 14:42:57
Не 100% факт
Хм... https://adn-cis.org/forum/index.php?topic=228.msg415#msg415
Дима. Ты не прочитал всю эту тему. В данном случае идёт речь о том, что Layout.GetViewports возвращает пустой массив, хотя Layout был инициализирован, чертеж был сохранён и открыт повторно. Этот массив не пустой только если Layout был инициализирован в этой сессии AutoCAD или на него в этой сессии AutoCAD переключались.
Название: Re: Turned Off All Viewport
Отправлено: Дмитрий Загорулькин от 08-10-2020, 14:54:52
Возможно да, не так понял. Но вроде как спрашивали именно про это... Ну да ладно, вопрошающий сам разберётся  :)
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 08-10-2020, 15:07:37
Возможно да, не так понял. Но вроде как спрашивали именно про это... Ну да ладно, вопрошающий сам разберётся  :)
Тем не менее почитай тему внимательно. Ответ от ADN DevHelp меня сильно удивил. Я был уверен, что если вызвано Layout.Initialize() или было хотя-бы переключение на этот лист, то после сохранения чертежа, его повторного открытия и  вызова Layout.GetViewports() возвращает не пустой массив и мы всегда сможем определить главный Viewport.  Оказалось, что это не так.
Название: Re: Turned Off All Viewport
Отправлено: Привалов Дмитрий от 08-10-2020, 15:36:58
каким образом получить из коллекции вьюпортов конкретного листа, к примеру, 0-й вьюпорт этого листа? Он ведь не факт, что первый в коллекции? Или его ObjectId можно чему-то сопоставить/приравнять?

Если лист создавался нормально, т.е. был создан, сделан текущим  и инициализирован, то :
1. Если лист активный
1.1 получаешь Database.GetViewports(true) и берешь первый лист
1.2 получаешь BlockTableRecordId, получаешгь блок листа (BlockTableRecord) находишь все Viewport, берешь с Viewport.Number==1 (1....n)

2. Если лист не активный, то делаешь по пункту 1.2, только Viewport.Number будет -1 у всех видовых экранов, поэтому сортируешь по Id и берешь первый в списке.

Если создание листов было не в "правильном порядке", нужно экспериментировать.
Возможно у листа отсутствует Layout, если лист не был инициализирован.
Либо 0й Viewport создавался последним, но при этом важно проверить, что будет после сохранения, закрытия/открытия чертежа. Возможно AutoCAD "заберет" первый Viewport?
Название: Re: Turned Off All Viewport
Отправлено: pavka_97 от 08-10-2020, 15:49:10
Активные листы не обсуждаем, тут и так понятно.
Насчет неактивных: если листы "правильные" (которые создавались классическими способами,без использовались сторонних программ и плагинов, а также без удаления 0х вьюпортов, которые автокад потом пересоздает - это вроде в ранних версиях только) то у меня простым перебором в пространстве листа главный vp всегда идет первым в коллекции. Детально не эксперементировал.
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 08-10-2020, 15:51:40
1. Если лист активный
1.1 получаешь Database.GetViewports(true) и берешь первый лист
1.2 получаешь BlockTableRecordId, получаешгь блок листа (BlockTableRecord) находишь все Viewport, берешь с Viewport.Number==1 (1....n)
Если лист активный, то достаточно  Layout.GetViewports() и взять первый Viewport - это будет однозначно быстрее, так как AutoCAD уже сам проанализировал лист, нашел все его Viewport'ы и определил какой из них главный.
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 08-10-2020, 15:53:05
Возможно у листа отсутствует Layout, если лист не был инициализирован.
А вот это как??? Лист == Layout. 
Название: Re: Turned Off All Viewport
Отправлено: Привалов Дмитрий от 08-10-2020, 16:02:28
А вот это как??? Лист == Layout. 
Прошу прощения, написал не правильно. Имел ввиду такой сценарий:
Предполагаю, что можно склонировать блок листа в чертеж, и при этом не появиться запись(Layout) в NOD/ACAD_LAYOUT.
Если получать пространство "неправильного" листа перебором в BlockTable, то вполне можно получить блок с именем Name="*Paper_Space3", при этом IsLayout и LayoutId будут не верными.
Название: Re: Turned Off All Viewport
Отправлено: Александр Ривилис от 08-10-2020, 16:08:00
Предполагаю, что можно склонировать блок листа в чертеж, и при этом не появиться запись(Layout) в NOD/ACAD_LAYOUT.
Это только если всё это делать незаконными методами. LayoutManager.CloneLayout клонирует правильно Layout, LayoutManager.DeleteLayout его правильно удаляет.