Как выбрать непрямоугольный Viewport

Автор Тема: Как выбрать непрямоугольный Viewport  (Прочитано 5942 раз)

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

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

Оффлайн JudasАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 78
  • Карма: 0
Продолжаем борьбу...
Теперь стала другая проблема ломанные видовые экраны,которые созданы полилинией.
При их выборе через PromptEntityResult выкидывает ошибку невозможно преобразовать полилинию в Viewport.
Хотя в свойствах показывает как оба видовых экранов, но 1 (прямоугольный ) = "Видовой экран", а второй 2 (произвольный) = "Видовой экран (1)"
Кто-нибудь сталкивался с такой проблемой?
« Последнее редактирование: 07-02-2018, 20:32:15 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как выбрать непрямоугольный Viewport
« Ответ #1 : 07-02-2018, 18:36:01 »
Пример чертежа с таким Viewport выкладывай. Чего гадать на кофейной гуще. И вообще создай отдельную тему. К этой теме вопрос вроде бы не относится.
« Последнее редактирование: 07-02-2018, 20:32:34 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн JudasАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 78
  • Карма: 0
Re: Как выбрать непрямоугольный Viewport
« Ответ #2 : 07-02-2018, 18:39:23 »
Код и пример
Код - C# [Выбрать]
  1. using (Transaction acTrans = db.TransactionManager.StartTransaction())
  2.             {
  3.                 //Переменая получаемая из командной строки
  4.                 PromptEntityOptions EntityOption = new PromptEntityOptions("\nВыберите видовой экран");
  5.                 //Запрос в командную строку
  6.                 EntityOption.SetRejectMessage("");
  7.                 //Проверка типа выбранного объекта
  8.                 EntityOption.AddAllowedClass(typeof(Autodesk.AutoCAD.DatabaseServices.Viewport), true);
  9.                 //Запрос выбора объектов в области чертежа
  10.                 PromptEntityResult EntityResult = AcadDc.Editor.GetEntity(EntityOption);
  11.                 //Получаем текущий Viewport
  12.                 Viewport CurrentViewport = (Viewport)acTrans.GetObject(EntityResult.ObjectId, OpenMode.ForWrite);
  13.                 //Получаем текущий Viewport
  14.                 AcadDc.Editor.SwitchToPaperSpace();
  15.  
  16.                 //Пересчет координат
  17.                 double detlaX = 0;
  18.                 double detlaY = 0;
  19.  
  20.                 //Пересчет координат
  21.                 double newX = CurrentViewport.ViewCenter.X + detlaX;
  22.                 double newY = CurrentViewport.ViewCenter.Y + detlaY;
  23.  
  24.                 //Смена видового экрана
  25.                 CurrentViewport.ViewCenter = (new Point2d(newX, newY));
  26.                 acTrans.Commit();
  27.             }
  28.  
  29.  
« Последнее редактирование: 07-02-2018, 20:32:47 от Александр Ривилис »

Отмечено как Решение Judas 08-02-2018, 19:48:40

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как выбрать непрямоугольный Viewport
« Ответ #3 : 07-02-2018, 20:45:01 »
Я разделил и переименовал тему. Вопрос достаточно интересный. Вот его решение:

Код - C# [Выбрать]
  1. public static ObjectId SelectViewport()
  2. {
  3.     Document doc = Application.DocumentManager.MdiActiveDocument;
  4.     Editor ed = doc.Editor;
  5.     ObjectId viewportObjId = ObjectId.Null;
  6.     PromptEntityOptions opt = new PromptEntityOptions("\nВыберите видовой экран: ");
  7.     opt.SetRejectMessage("\nВыбран не видовой экран.\n");
  8.     opt.AddAllowedClass(typeof(Viewport), true);
  9.     // Следующие строки позволяют выбрать непрямоугольный видовой экран
  10.     opt.AddAllowedClass(typeof(Circle), true);
  11.     opt.AddAllowedClass(typeof(Polyline), true);
  12.     opt.AddAllowedClass(typeof(Polyline2d), true);
  13.     opt.AddAllowedClass(typeof(Polyline3d), true);
  14.     opt.AddAllowedClass(typeof(Ellipse), true);
  15.     opt.AddAllowedClass(typeof(Autodesk.AutoCAD.DatabaseServices.Region), true);
  16.     opt.AddAllowedClass(typeof(Spline), true);
  17.     opt.AddAllowedClass(typeof(Face), true);
  18.     PromptEntityResult viewportResult = ed.GetEntity(opt);
  19.  
  20.     if (viewportResult.Status == PromptStatus.OK)
  21.     {
  22.         Entity ent = viewportResult.ObjectId.GetObject(OpenMode.ForRead) as Entity;
  23.         // Это прямоугольный видовой экран
  24.         if (ent.GetType() == typeof(Viewport))
  25.         {
  26.             viewportObjId = viewportResult.ObjectId;
  27.         }
  28.         else if (true)
  29.         {
  30.             // Видовой экран непрямоугольный - пытаемся получить его из его "подрезки"
  31.             ObjectId vpId = LayoutManager.Current.GetNonRectangularViewportIdFromClipId(viewportResult.ObjectId);
  32.             if (vpId != ObjectId.Null)
  33.             {
  34.                 viewportObjId = vpId;
  35.             }
  36.         }
  37.     }
  38.     return viewportObjId;
  39. }

Источник: http://blog.civil3dreminders.com/2013/02/select-viewport.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн JudasАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 78
  • Карма: 0
Re: Как выбрать непрямоугольный Viewport
« Ответ #4 : 08-02-2018, 18:48:37 »
Благодарю!
То что надо!

Оффлайн pavka_97

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Re: Как выбрать непрямоугольный Viewport
« Ответ #5 : 16-03-2023, 13:16:00 »
Fatall Error с вьюпортом по примитивам типа Circle,Ellipse итд

Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.EditorInput;
  5.  
  6. namespace Test
  7. {
  8.  
  9.     public class MyCommands
  10.     {
  11.  
  12.         [CommandMethod("TestPointInContour")]
  13.         public void TestPointInContour()
  14.         {
  15.  
  16.    
  17.             Document doc = Application.DocumentManager.MdiActiveDocument;
  18.             Editor ed = doc.Editor;
  19.             ObjectId viewportObjId = ObjectId.Null;
  20.             PromptEntityOptions opt = new PromptEntityOptions("\nВыберите видовой экран: ");
  21.             opt.SetRejectMessage("\nВыбран не видовой экран.\n");
  22.             opt.AddAllowedClass(typeof(Viewport), true);
  23.             // Следующие строки позволяют выбрать непрямоугольный видовой экран
  24.             opt.AddAllowedClass(typeof(Circle), true);
  25.             opt.AddAllowedClass(typeof(Polyline), true);
  26.             opt.AddAllowedClass(typeof(Polyline2d), true);
  27.             opt.AddAllowedClass(typeof(Polyline3d), true);
  28.             opt.AddAllowedClass(typeof(Ellipse), true);
  29.             opt.AddAllowedClass(typeof(Autodesk.AutoCAD.DatabaseServices.Region), true);
  30.             opt.AddAllowedClass(typeof(Spline), true);
  31.             opt.AddAllowedClass(typeof(Face), true);
  32.             PromptEntityResult viewportResult = ed.GetEntity(opt);
  33.  
  34.             if (viewportResult.Status == PromptStatus.OK)
  35.             {
  36.                 using (Entity ent = viewportResult.ObjectId.GetObject(OpenMode.ForRead) as Entity)// ТУТ ФАТАЛИТ!!
  37.                     //System.NullReferenceException:
  38.                     //"Object reference not set to an instance of an object."
  39.                     //  с using, с транзакцией и без
  40.                 {
  41.                     // Это прямоугольный видовой экран
  42.                     if (ent.GetType() == typeof(Viewport))
  43.                     {
  44.                         viewportObjId = viewportResult.ObjectId;
  45.                     }
  46.                     else if (true)
  47.                     {
  48.                         // Видовой экран непрямоугольный - пытаемся получить его из его "подрезки"
  49.                         ObjectId vpId = LayoutManager.Current.GetNonRectangularViewportIdFromClipId(viewportResult.ObjectId);
  50.                         if (vpId != ObjectId.Null)
  51.                         {
  52.                             viewportObjId = vpId;
  53.                         }
  54.                     }
  55.                 }
  56.             }
  57.            
  58.         }
  59.     }
  60. }
  61.  



Autocad 2022,Eng. Прошу проверить.
И есть ли другой способ (без GetNonRectangularViewportIdFromClipId и vp.NonRectClipEntityId) сопоставить (найти соответствие, принадлежность одно другому) Circle и его Viewport
 

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как выбрать непрямоугольный Viewport
« Ответ #6 : 16-03-2023, 21:17:57 »
pavka_97,
А чему равно viewportResult.ObjectId ?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн pavka_97

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Re: Как выбрать непрямоугольный Viewport
« Ответ #7 : 16-03-2023, 21:59:34 »
Фаталит и на обычном ,прямоугольном Viewport.
pavka_97,
А чему равно viewportResult.ObjectId ?
Значение ObjectId, которое соответствует этому прямоугольному Viewport (MgdDbg- Snoop Entities)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как выбрать непрямоугольный Viewport
« Ответ #8 : 16-03-2023, 22:37:15 »
Фаталит и на обычном ,прямоугольном Viewport.
pavka_97,
А чему равно viewportResult.ObjectId ?
Значение ObjectId, которое соответствует этому прямоугольному Viewport (MgdDbg- Snoop Entities)

Ну если он не открывается, то это похоже на баг AutoCAD. Можешь попробовать вместо viewportResult.ObjectId.GetObject использовать viewportResult.ObjectId.Open - на предупреждение компилятора не обращай внимания.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн pavka_97

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Re: Как выбрать непрямоугольный Viewport
« Ответ #9 : 16-03-2023, 22:52:09 »
А вот с Open работает.
Вот же ж.
Спасибо.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как выбрать непрямоугольный Viewport
« Ответ #10 : 16-03-2023, 23:15:18 »
А вот с Open работает.
Вот же ж.
Спасибо.
Я посмотрел еще раз тот код. Вообще-то он работать не должен был, так как ObjectId.GetObject работает только если есть активная транзакция. В твоем же коде ее нет. А ObjectId.Open работает в любом случае - ему транзакция не нужна.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн pavka_97

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Re: Как выбрать непрямоугольный Viewport
« Ответ #11 : 16-03-2023, 23:25:06 »
Спасибо. Я должен был учесть, что в решении указан фрагмент кода и не всегда подходит под разные ситуации