Теоретический вопрос: Возможно ли в AutoCAD.NET API создать что-то типа анимации

Автор Тема: Теоретический вопрос: Возможно ли в AutoCAD.NET API создать что-то типа анимации  (Прочитано 8703 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Всем привет.
Например, надо показать на экране поведение радиус-вектора в движении - это отрезок, StartPoint которого находится в фиксированной точке, а EndPoint перемещается (с каким-то
 шагом) по пространственной траектории, задаваемой какой-то функцией f(x,y,z,t). Положения EndPoint определяются итерацией по f(x,y,z,t).
Насколько мне известно, все видимые на экране изменения, связанные с модификацией примитивов проявляются только после корректно выполненной транзакции и передачи фокуса АвтоКАДу (когда пользователю предлагается сделать какой-нибудь ввод). При таком положении вещей чтобы увидеть на экране промежуточные положения радиус-вектора надо каждый раз осуществлять какой-нибудь ввод. Может быть существует какой-нибудь способ?

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Думаю дожно. Изображение на экране чаще всего появляется сразу после коммита транзакции. Но можно и принудительно обновить экран ed.UpdateScreen(). Можно даже запустить полный Regen, но это долго, плавной анимации не будет. Можно еще попробовать рисовать Transient-графику - она тоже сразу отрисовывается и мусора в БД не остается, но с ней бывают жесткие фаталы - надо тщательно тестить.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Насколько мне известно, все видимые на экране изменения, связанные с модификацией примитивов проявляются только после корректно выполненной транзакции и передачи фокуса АвтоКАДу (когда пользователю предлагается сделать какой-нибудь ввод).
1. Можно обойтись без транзакций
2. А можно и вот так: https://adndevblog.typepad.com/autocad/2014/02/3dwalk-through-an-autocad-model.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0

COM, lisp
Жаль, с lisp'ом не дружу - если только укажите готовый код?

Можно еще попробовать рисовать Transient-графику - она тоже сразу отрисовывается и мусора в БД не остается, но с ней бывают жесткие фаталы - надо тщательно тестить.
с этой темой не знаком - где почитать?

2. А можно и вот так: https://adndevblog.typepad.com/autocad/2014/02/3dwalk-through-an-autocad-model.html
Спасибо, но это не то, что мне нужно.

1. Можно обойтись без транзакций
Интересно, а это как???

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Скрипты и COM вам вряд ли как-то улучшат плавность анимаций.
Transient гуглится легко: https://adn-cis.org/forum/index.php?topic=8011.0
Без транзакций все точно также, только открывается объект не через транзакцию, а через ObjectId.Open и вся ответственность за сохранение изменений и уничтожение объекта ложится на программиста. Hardcore-mode короче. Может быть чуть быстрее чем хлопать транзакциями в каждом цикле, но для анимации 10-20 циклов в секунду достаточно и издержки транзакций никак не скажутся (мне кажется). Но можете попробовать

Отмечено как Решение Vns 21-10-2020, 05:53:24

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Цитата: avc от 17-10-2020, 19:03:59

    2. А можно и вот так: https://adndevblog.typepad.com/autocad/2014/02/3dwalk-through-an-autocad-model.html

Спасибо, но это не то, что мне нужно.

Похоже ты не понял, что это было на уровне идеи, которая реализуется именно в то, что ты описал в своём вопросе.
Посмотри во что это выливается:
Код - 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 Autodesk.AutoCAD.EditorInput;
  7.  
  8. // This line is not mandatory, but improves loading performances
  9. [assembly: CommandClass(typeof(AnimateClock.MyCommands))]
  10.  
  11. #pragma warning disable 0618
  12.  
  13. namespace AnimateClock
  14. {
  15.   public class MyCommands
  16.   {
  17.     [CommandMethod("AnimateClock")]
  18.     public void AnimateClockHandler()
  19.     {
  20.       Document doc = Application.DocumentManager.MdiActiveDocument;
  21.       if (doc == null) return;
  22.       Editor ed = doc.Editor;
  23.       Database db = doc.Database;
  24.       Point3d center = (Point3d) Application.GetSystemVariable("VIEWCTR");
  25.       double height = (double) Application.GetSystemVariable("VIEWSIZE");
  26.       Point2d scrsize = (Point2d)Application.GetSystemVariable("SCREENSIZE");
  27.       double width = height * (scrsize.X / scrsize.Y);
  28.       double radius = Math.Min(height, width) * 0.45;
  29.  
  30.       ObjectId axisId = ObjectId.Null;
  31.       using (BlockTable bt = db.BlockTableId.Open(OpenMode.ForRead) as BlockTable)
  32.       {
  33.         using (BlockTableRecord btr = bt[BlockTableRecord.ModelSpace].Open(OpenMode.ForWrite) as BlockTableRecord)
  34.         {
  35.           using (Line axis = new Line (center, center + new Vector3d(0, radius, 0)))
  36.           {
  37.             axisId = btr.AppendEntity(axis);
  38.           }
  39.         }
  40.       }
  41.       MyMessageFilter filter = new MyMessageFilter();
  42.       System.Windows.Forms.Application.AddMessageFilter(filter);
  43.  
  44.       if (!axisId.IsNull)
  45.       {
  46.         double ang = 0;
  47.         while (!filter.bCanceled)
  48.         {
  49.           using (Transaction tr = doc.TransactionManager.StartTransaction())
  50.           {
  51.             Line line = tr.GetObject(axisId, OpenMode.ForWrite) as Line;
  52.             line.EndPoint = line.StartPoint + new Vector3d(0, radius, 0).RotateBy(ang, Vector3d.ZAxis);
  53.             //doc.TransactionManager.QueueForGraphicsFlush();
  54.             //doc.TransactionManager.FlushGraphics();
  55.             tr.Commit();
  56.           }
  57.           //ed.UpdateScreen();
  58.           Autodesk.AutoCAD.Internal.Utils.FlushGraphics();
  59.           System.Threading.Thread.Sleep(1000);
  60.           System.Windows.Forms.Application.DoEvents();
  61.           ang -= Math.PI / 30;
  62.           if (ang < 0) ang += 2 * Math.PI;
  63.         }
  64.       }
  65.       System.Windows.Forms.Application.RemoveMessageFilter(filter);
  66.     }
  67.  
  68.     public class MyMessageFilter : System.Windows.Forms.IMessageFilter
  69.     {
  70.       public const int WM_KEYDOWN = 0x0100;
  71.       public bool bCanceled = false;
  72.       public bool PreFilterMessage(ref System.Windows.Forms.Message m)
  73.       {
  74.         if (m.Msg == WM_KEYDOWN)
  75.         {
  76.           // Check for the Escape keypress
  77.           System.Windows.Forms.Keys kc
  78.               = (System.Windows.Forms.Keys)
  79.               (int)m.WParam & System.Windows.Forms.Keys.KeyCode;
  80.  
  81.           if (m.Msg == WM_KEYDOWN &&
  82.               kc == System.Windows.Forms.Keys.Escape)
  83.           {
  84.             bCanceled = true;
  85.           }
  86.           // Return true to filter all keypresses
  87.           return true;
  88.         }
  89.  
  90.         // Return false to let other messages through
  91.  
  92.         return false;
  93.  
  94.       }
  95.  
  96.     }
  97.   }
  98. }

Вот такая бегающая секундная стрелка:


« Последнее редактирование: 18-10-2020, 19:15:24 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Огромное спасибо, avc, Александр. Буду пробовать. О результатах сообщу позже.

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
https://forum.dwg.ru/showthread.php?t=111486
В первом посте пример видео анимации.

з.ы. давно не брался за api автокада - уж забыл все - но понадобилось вспомнить.
з.ы.ы видео настолько старое (точнее кодек) что в десятке оно проигрывается только через "открыть с помощью=>windows media" - по крайней мере у меня

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

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Вопрос решен. Всем ОГРОМНОЕ спасибо.