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

ADN Club => AutoCAD .NET API => Тема начата: Judas от 07-02-2018, 18:27:58

Название: Как выбрать непрямоугольный Viewport
Отправлено: Judas от 07-02-2018, 18:27:58
Продолжаем борьбу...
Теперь стала другая проблема ломанные видовые экраны,которые созданы полилинией.
При их выборе через PromptEntityResult выкидывает ошибку невозможно преобразовать полилинию в Viewport.
Хотя в свойствах показывает как оба видовых экранов, но 1 (прямоугольный ) = "Видовой экран", а второй 2 (произвольный) = "Видовой экран (1)"
Кто-нибудь сталкивался с такой проблемой?
Название: Re: Как выбрать непрямоугольный Viewport
Отправлено: Александр Ривилис от 07-02-2018, 18:36:01
Пример чертежа с таким Viewport выкладывай. Чего гадать на кофейной гуще. И вообще создай отдельную тему. К этой теме вопрос вроде бы не относится.
Название: Re: Как выбрать непрямоугольный Viewport
Отправлено: Judas от 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.  
Название: Re: Как выбрать непрямоугольный Viewport
Отправлено: Александр Ривилис от 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
Название: Re: Как выбрать непрямоугольный Viewport
Отправлено: Judas от 08-02-2018, 18:48:37
Благодарю!
То что надо!
Название: Re: Как выбрать непрямоугольный Viewport
Отправлено: pavka_97 от 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
 
Название: Re: Как выбрать непрямоугольный Viewport
Отправлено: Александр Ривилис от 16-03-2023, 21:17:57
pavka_97,
А чему равно viewportResult.ObjectId ?
Название: Re: Как выбрать непрямоугольный Viewport
Отправлено: pavka_97 от 16-03-2023, 21:59:34
Фаталит и на обычном ,прямоугольном Viewport.
pavka_97,
А чему равно viewportResult.ObjectId ?
Значение ObjectId, которое соответствует этому прямоугольному Viewport (MgdDbg- Snoop Entities)
Название: Re: Как выбрать непрямоугольный Viewport
Отправлено: Александр Ривилис от 16-03-2023, 22:37:15
Фаталит и на обычном ,прямоугольном Viewport.
pavka_97,
А чему равно viewportResult.ObjectId ?
Значение ObjectId, которое соответствует этому прямоугольному Viewport (MgdDbg- Snoop Entities)

Ну если он не открывается, то это похоже на баг AutoCAD. Можешь попробовать вместо viewportResult.ObjectId.GetObject использовать viewportResult.ObjectId.Open - на предупреждение компилятора не обращай внимания.
Название: Re: Как выбрать непрямоугольный Viewport
Отправлено: pavka_97 от 16-03-2023, 22:52:09
А вот с Open работает.
Вот же ж.
Спасибо.
Название: Re: Как выбрать непрямоугольный Viewport
Отправлено: Александр Ривилис от 16-03-2023, 23:15:18
А вот с Open работает.
Вот же ж.
Спасибо.
Я посмотрел еще раз тот код. Вообще-то он работать не должен был, так как ObjectId.GetObject работает только если есть активная транзакция. В твоем же коде ее нет. А ObjectId.Open работает в любом случае - ему транзакция не нужна.
Название: Re: Как выбрать непрямоугольный Viewport
Отправлено: pavka_97 от 16-03-2023, 23:25:06
Спасибо. Я должен был учесть, что в решении указан фрагмент кода и не всегда подходит под разные ситуации