Create and enable a floating viewport

Автор Тема: Create and enable a floating viewport  (Прочитано 8427 раз)

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

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

Оффлайн Иван ЛогиновАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Create and enable a floating viewport
« : 30-03-2021, 10:22:33 »
Привет всем!
AutoCAD 2020 (x64 eng)
В процессе чтения Help и тестирования примеров, а в частности
https://help.autodesk.com/view/OARX/2020/ENU/?guid=GUID-61C22902-F63B-4204-86EC-FA37312D1B6E
При выполнении следующих действий:
1. Создаём новый чертёж и переходим в пространство листа
2. Через NETLOAD грузим сборку .dll
3. Ctrl+A DEL (Erase all)
4. Запускаем команду CREATEFLOATINGVIEWPORT

Выскакивает ошибка:
eCannotChangeActiveViewport на строчке:
Код - C# [Выбрать]
  1. acDoc.Editor.SwitchToModelSpace();

В процессе исследования удалось решить проблему через выполнение активации пространства модели из пространства листа через отдельную транзакцию.
Но в процессе получения
Код - C# [Выбрать]
  1. vPortsIds = acLayout.GetViewports();
если, допустим, мне необходимо создать несколько viewports, то понять по свойству Number где какой крайне затруднительно и возможно это не совсем корректный путь, а можно и нужно переключиться, после создания viewport, сразу в пространство модели из пространства листа в рамках одной транзакции (как в примере по Help)

Вопрос: почему пример из help'а не работает?

Исходный код:

Код - C# [Выбрать]
  1. using System.Runtime.InteropServices;
  2.  
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using Autodesk.AutoCAD.Geometry;
  7.  
  8. [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl,
  9.  EntryPoint = "?acedSetCurrentVPort@@YA?AW4ErrorStatus@Acad@@PBVAcDbViewport@@@Z")]
  10. extern static private int acedSetCurrentVPort(IntPtr AcDbVport);
  11.  
  12. [CommandMethod("CreateFloatingViewport")]
  13. public static void CreateFloatingViewport()
  14. {
  15.     // Get the current document and database, and start a transaction
  16.     Document acDoc = Application.DocumentManager.MdiActiveDocument;
  17.     Database acCurDb = acDoc.Database;
  18.  
  19.     using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  20.     {
  21.         // Open the Block table for read
  22.         BlockTable acBlkTbl;
  23.         acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
  24.                                      OpenMode.ForRead) as BlockTable;
  25.  
  26.         // Open the Block table record Paper space for write
  27.         BlockTableRecord acBlkTblRec;
  28.         acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.PaperSpace],
  29.                                         OpenMode.ForWrite) as BlockTableRecord;
  30.  
  31.         // Switch to the previous Paper space layout
  32.         Application.SetSystemVariable("TILEMODE", 0);
  33.         acDoc.Editor.SwitchToPaperSpace();
  34.  
  35.         // Create a Viewport
  36.         using (Viewport acVport = new Viewport())
  37.         {
  38.             acVport.CenterPoint = new Point3d(3.25, 3, 0);
  39.             acVport.Width = 6;
  40.             acVport.Height = 5;
  41.  
  42.             // Add the new object to the block table record and the transaction
  43.             acBlkTblRec.AppendEntity(acVport);
  44.             acTrans.AddNewlyCreatedDBObject(acVport, true);
  45.  
  46.             // Change the view direction
  47.             acVport.ViewDirection = new Vector3d(1, 1, 1);
  48.  
  49.             // Enable the viewport
  50.             acVport.On = true;
  51.  
  52.             // Activate model space in the viewport
  53.             acDoc.Editor.SwitchToModelSpace();
  54.  
  55.             // Set the new viewport current via an imported ObjectARX function
  56.             acedSetCurrentVPort(acVport.UnmanagedObject);
  57.         }
  58.  
  59.         // Save the new objects to the database
  60.         acTrans.Commit();
  61.     }
  62. }

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Create and enable a floating viewport
« Ответ #1 : 30-03-2021, 10:37:42 »
Сейчас за форматирование кода влетит от модератора ;)
А в чём вопрос?

Оффлайн Иван ЛогиновАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Create and enable a floating viewport
« Ответ #2 : 30-03-2021, 10:47:09 »
Вопрос: почему пример из help'а не работает и можно ли всё-таки в рамках одной транзакции создавать viewport и сразу переключаться в пространство модели (Activate model space in the viewport)

Отмечено как Решение Иван Логинов 30-03-2021, 20:29:23

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Create and enable a floating viewport
« Ответ #3 : 30-03-2021, 13:33:45 »
Вопрос: почему пример из help'а не работает?
Ответ: Это не единственный пример из help'а, который не работает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Create and enable a floating viewport
« Ответ #4 : 30-03-2021, 13:42:17 »
Иван Логинов,
Ты в какой версии и разрядности AutoCAD проверяешь? Этот код может работать только в 32-разрядном AutoCAD и версия не больше 2012. Начиная с AutoCAD 2013 функция acedSetCurrentVPort находится не в acad.exe, а в accore.dll. И для 64-разрядного AutoCAD её описание должно выглядеть так:
Код - C# [Выбрать]
  1. [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl,
  2.  EntryPoint = "?acedSetCurrentVPort@@YA?AW4ErrorStatus@Acad@@PEBVAcDbViewport@@@Z")]
  3. extern static private int acedSetCurrentVPort(IntPtr AcDbVport);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Иван ЛогиновАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Create and enable a floating viewport
« Ответ #5 : 30-03-2021, 16:37:04 »
AutoCAD 2020 (x64 eng)
Этот код может работать только в 32-разрядном AutoCAD и версия не больше 2012. Начиная с AutoCAD 2013 функция acedSetCurrentVPort находится не в acad.exe, а в accore.dll. И для 64-разрядного AutoCAD её описание должно выглядеть так:
Да, спасибо, это уже всё я тоже решил.

Ответ: Это не единственный пример из help'а, который не работает.
Читал хелп по 2010 AutoCAD, потом решил посмотреть по 2020, там тот же код, видимо не поправили.
Как тоже писал выше, не совсем удобно работать с номерами когда получаешь viewports через GetViewports()
если, допустим, мне необходимо создать несколько viewports, то понять по свойству Number где какой крайне затруднительно

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Create and enable a floating viewport
« Ответ #6 : 30-03-2021, 19:21:20 »
Читал хелп по 2010 AutoCAD, потом решил посмотреть по 2020, там тот же код, видимо не поправили.
Изменение документации по API достаточно сложный и многоступенчатый процесс. Документацию могут поменять только если кто-то сообщил об ошибках в ней - это необходимое, но не достаточное условие.
Как тоже писал выше, не совсем удобно работать с номерами когда получаешь viewports через GetViewports()
Цитата: Иван Логинов от 30-03-2021, 10:22:33

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

Оффлайн Иван ЛогиновАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Create and enable a floating viewport
« Ответ #7 : 30-03-2021, 20:30:39 »
Что не так с этим?
Всё так =)
Думал, если есть альтернативное "более красивое" решение, то кто-то поделится.