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

ADN Club => AutoCAD .NET API => Тема начата: Алексей Терно от 12-09-2018, 13:47:50

Название: Ограничения DrawJig по количеству объектов
Отправлено: Алексей Терно от 12-09-2018, 13:47:50
Приперла нужда показать временную графику перед вставкой условных обозначений. Использовал DrawJig и с удивлением обнаружил, что во время отрисовки временной графики часть объектов не показывается. Причем последний показанный объект просто обрезается:


Код:
Извините, вам запрещён просмотр содержимого спойлеров.

Джиг:
Извините, вам запрещён просмотр содержимого спойлеров.


Это такие ограничения DrawJig?
Название: Re: Ограничения DrawJig по количеству объектов
Отправлено: avc от 12-09-2018, 14:01:01
Скорее просто ограничения производительности видеосистемы. При многих операциях Автокад делает умышленную деградацию изображения, чтоб поднять фпс. Оно даже настраивается где-то.
Название: Re: Ограничения DrawJig по количеству объектов
Отправлено: Алексей Терно от 12-09-2018, 14:13:46
Похоже на то. При отключении аппаратного ускорения показывается меньше, чем полторы цифры  ;D

(https://s15.postimg.cc/bv15f6q23/2018-09-12_14-12-10.png)
Название: Re: Ограничения DrawJig по количеству объектов
Отправлено: Александр Ривилис от 12-09-2018, 16:33:15
Алексей Терно,
Ты делаешь гигантское количество клонов объектов и нигде их не освобождаешь. Утечка памяти будет жуткая.
Что касается основного вопроса, то со сложной графикой всегда так и даже для Custom Entity. Если не успело отрисоваться, то и не успело...
Если draw.Geometry.Draw(ent0); возвращает false, то нужно сразу выйти из функции и прекратить отрисовку.
Название: Re: Ограничения DrawJig по количеству объектов
Отправлено: Александр Ривилис от 12-09-2018, 16:37:00
Можешь поиграться с системными переменными DRAGP1 и DRAGP2
Название: Re: Ограничения DrawJig по количеству объектов
Отправлено: Алексей Терно от 12-09-2018, 16:42:13
Ты делаешь гигантское количество клонов объектов и нигде их не освобождаешь. Утечка памяти будет жуткая.
Разве эти объекты не удаляются после завершения функции, где они были инициализированы?
Название: Re: Ограничения DrawJig по количеству объектов
Отправлено: Александр Ривилис от 12-09-2018, 16:48:03
Разве эти объекты не удаляются после завершения функции, где они были инициализированы?
Шутишь? С какой стати. Почитай про сборку мусора.
Название: Re: Ограничения DrawJig по количеству объектов
Отправлено: Александр Ривилис от 12-09-2018, 17:10:07
Я переделал твой пример. Выкинул оттуда клонирование. У меня встроенная видеокарта от Intel (i7), т.е. аппаратного ускорения нет никакого.
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using GI = Autodesk.AutoCAD.GraphicsInterface;
  7. using Autodesk.AutoCAD.EditorInput;
  8. using System.Collections.Generic;
  9.  
  10. // This line is not mandatory, but improves loading performances
  11. [assembly: CommandClass(typeof(TestDrawJig.MyCommands))]
  12.  
  13. namespace TestDrawJig
  14. {
  15.   public class MyCommands
  16.   {
  17.     [CommandMethod("Test01")]
  18.     public static void Test01()
  19.     {
  20.       Document doc = Application.DocumentManager.MdiActiveDocument;
  21.       Database db = doc.Database;
  22.       Editor ed = doc.Editor;
  23.  
  24.       using (OpenCloseTransaction trans = db.TransactionManager.StartOpenCloseTransaction())
  25.       {
  26.         BlockTableRecord ms = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  27.  
  28.         List<Entity> ents = new List<Entity>();
  29.         Point3d p = Point3d.Origin;
  30.  
  31.         int num = 1;
  32.  
  33.         for (int j = 0; j < 20; j++)
  34.         {
  35.           for (int i = 0; i < 20; i++)
  36.           {
  37.             DBText txt = new DBText();
  38.             txt.TextString = num.ToString();
  39.             txt.Position = new Point3d(p.X + 6 * i, p.Y - 6 * j, 0);
  40.             ents.Add(txt);
  41.             num++;
  42.           }
  43.         }
  44.  
  45.         TestJigClass jig = new TestJigClass(ents);
  46.         PromptResult res = ed.Drag(jig);
  47.  
  48.         if (res.Status == PromptStatus.OK)
  49.         {
  50.           BlockTableRecord curSpace = trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  51.           foreach (Entity ent in ents)
  52.           {
  53.             ent.TransformBy(Matrix3d.Displacement(jig.offset));
  54.             curSpace.AppendEntity(ent);
  55.             trans.AddNewlyCreatedDBObject(ent, true);
  56.           }
  57.         }
  58.  
  59.         trans.Commit();
  60.       }
  61.     }
  62.   }
  63.   public class TestJigClass : DrawJig
  64.   {
  65.     private readonly List<Entity> ents = new List<Entity>();
  66.     private Point3d _position;
  67.     internal Vector3d offset;
  68.  
  69.     public TestJigClass(List<Entity> _ents)
  70.     {
  71.       ents = _ents;
  72.  
  73.       Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  74.       ed.PointMonitor += new PointMonitorEventHandler(ed_PointMonitor);
  75.     }
  76.  
  77.     protected override SamplerStatus Sampler(JigPrompts prompts)
  78.     {
  79.       JigPromptPointOptions opt_point = new JigPromptPointOptions("New point: ");
  80.       PromptPointResult res_point = prompts.AcquirePoint(opt_point);
  81.  
  82.       if (res_point.Status == PromptStatus.OK)
  83.       {
  84.         offset = Point3d.Origin.GetVectorTo(_position);
  85.       }
  86.       return SamplerStatus.OK;
  87.     }
  88.  
  89.     protected override bool WorldDraw(GI.WorldDraw draw)
  90.     {
  91.       if (draw.Geometry != null)
  92.       {
  93.         Matrix3d mat = Matrix3d.Displacement(offset);
  94.         draw.Geometry.PushModelTransform(mat);
  95.         foreach (Entity ent in ents)
  96.         {
  97.           if (!draw.Geometry.Draw(ent)) break;
  98.         }
  99.         draw.Geometry.PopModelTransform();
  100.       }
  101.  
  102.       return true;
  103.     }
  104.  
  105.     void ed_PointMonitor(object sender, PointMonitorEventArgs e)
  106.     {
  107.       _position = e.Context.ComputedPoint;
  108.     }
  109.   }
  110.  
  111. }
  112.  

Вот так это выглядит:

Как видишь всё показывается нормально.
Название: Re: Ограничения DrawJig по количеству объектов
Отправлено: Алексей Терно от 12-09-2018, 17:14:45
А вот у меня все по-прежнему.
Название: Re: Ограничения DrawJig по количеству объектов
Отправлено: Александр Ривилис от 12-09-2018, 17:41:25
А вот у меня все по-прежнему.
В точности с тем кодом, который я привёл?
Название: Re: Ограничения DrawJig по количеству объектов
Отправлено: Алексей Терно от 12-09-2018, 17:57:17
А вот у меня все по-прежнему.
В точности с тем кодом, который я привёл?
Да - только что скопировал этот код в свой проект.
Название: Re: Ограничения DrawJig по количеству объектов
Отправлено: Александр Ривилис от 12-09-2018, 18:01:47
Да - только что скопировал этот код в свой проект.
1. Попробуй сбросить профиль в AutoCAD (или создай новый).
2. Попробуй в различных визуальных стилях.
Название: Re: Ограничения DrawJig по количеству объектов
Отправлено: Александр Ривилис от 12-09-2018, 18:14:34
Еще желательно убедиться, что ты работаешь на голом AutoCAD'е, т.е. это не конфликт с каким-то другим приложением.
Название: Re: Ограничения DrawJig по количеству объектов
Отправлено: Дима_ от 12-09-2018, 21:59:09
Александр, а если res.Status != PromptStatus.OK разве не надо Dispos'ить ents'ы?
Название: Re: Ограничения DrawJig по количеству объектов
Отправлено: Александр Ривилис от 12-09-2018, 22:52:48
Александр, а если res.Status != PromptStatus.OK разве не надо Dispos'ить ents'ы?
Надо конечно. Там еще есть глупости, которые я не исправлял. Мне главное было показать, что можно обойтись без клонирования.
Название: Re: Ограничения DrawJig по количеству объектов
Отправлено: Александр Ривилис от 13-09-2018, 11:19:55
А вот у меня все по-прежнему.
Я более детально проанализировал ситуацию и пришел к такому выводу:
1. Я использовал в текстовом стиле по-умолчанию TTF-шрифт, а ты SHX-шрифт.
2. Для SHX-шрифта играет роль значение DRAGP1, а для TTF-шрифта нет, т.к. SHX-шрифт состоит из отдельных векторов.
3. Если увеличить значение DRAGP1, то и с SHX-шрифтом становится лучше (в данном примере просто идеально).
Всё это видно на этом видео:
Название: Re: Ограничения DrawJig по количеству объектов
Отправлено: Алексей Терно от 15-09-2018, 23:42:51
Спасибо за подсказку! Смогу попробовать чуть позже. Обязательно отпишусь
Название: Re: Ограничения DrawJig по количеству объектов
Отправлено: Алексей Терно от 16-09-2018, 04:00:43
DRAGP1 решает эту проблему! )))
Спасибо!