Ограничения DrawJig по количеству объектов

Автор Тема: Ограничения DrawJig по количеству объектов  (Прочитано 11274 раз)

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

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

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Приперла нужда показать временную графику перед вставкой условных обозначений. Использовал DrawJig и с удивлением обнаружил, что во время отрисовки временной графики часть объектов не показывается. Причем последний показанный объект просто обрезается:


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

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


Это такие ограничения DrawJig?

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Скорее просто ограничения производительности видеосистемы. При многих операциях Автокад делает умышленную деградацию изображения, чтоб поднять фпс. Оно даже настраивается где-то.

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Похоже на то. При отключении аппаратного ускорения показывается меньше, чем полторы цифры  ;D



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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Алексей Терно,
Ты делаешь гигантское количество клонов объектов и нигде их не освобождаешь. Утечка памяти будет жуткая.
Что касается основного вопроса, то со сложной графикой всегда так и даже для Custom Entity. Если не успело отрисоваться, то и не успело...
Если draw.Geometry.Draw(ent0); возвращает false, то нужно сразу выйти из функции и прекратить отрисовку.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Можешь поиграться с системными переменными DRAGP1 и DRAGP2
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Ты делаешь гигантское количество клонов объектов и нигде их не освобождаешь. Утечка памяти будет жуткая.
Разве эти объекты не удаляются после завершения функции, где они были инициализированы?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Разве эти объекты не удаляются после завершения функции, где они были инициализированы?
Шутишь? С какой стати. Почитай про сборку мусора.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я переделал твой пример. Выкинул оттуда клонирование. У меня встроенная видеокарта от 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.  

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

Как видишь всё показывается нормально.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
А вот у меня все по-прежнему.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А вот у меня все по-прежнему.
В точности с тем кодом, который я привёл?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
А вот у меня все по-прежнему.
В точности с тем кодом, который я привёл?
Да - только что скопировал этот код в свой проект.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Да - только что скопировал этот код в свой проект.
1. Попробуй сбросить профиль в AutoCAD (или создай новый).
2. Попробуй в различных визуальных стилях.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Еще желательно убедиться, что ты работаешь на голом AutoCAD'е, т.е. это не конфликт с каким-то другим приложением.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Александр, а если res.Status != PromptStatus.OK разве не надо Dispos'ить ents'ы?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Александр, а если res.Status != PromptStatus.OK разве не надо Dispos'ить ents'ы?
Надо конечно. Там еще есть глупости, которые я не исправлял. Мне главное было показать, что можно обойтись без клонирования.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение