DrawableOverrule и Solid3d

Автор Тема: DrawableOverrule и Solid3d  (Прочитано 19499 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: DrawableOverrule и Solid3d
« Ответ #15 : 18-02-2016, 16:26:20 »
REGEN3 спасает конечно ситуацию, если рассматривать вариант когда Solid3d создается каждый раз. в этом случае команда REGEN3 вызывает перерисовку и Solid3d будет подменяться в cash. (к слову для "старого" Solid3d который был в cash вызываю dispose())
Не понял. Ты внутри ViewportDraw вызываешь запуск команды REGEN3? Это не годится в любом случае.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: DrawableOverrule и Solid3d
« Ответ #16 : 18-02-2016, 16:41:19 »
А чем эта команда от обычного REGEN отличается?

Оффлайн Алексей КузинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 8
Re: DrawableOverrule и Solid3d
« Ответ #17 : 18-02-2016, 16:46:12 »
конечно не внутри.

Вот вариант кода, когда подменяется Solid3d каждый раз.
Код - C# [Выбрать]
  1. static Dictionary<ObjectId, Solid3d> cash = new Dictionary<ObjectId, Solid3d>();
  2.  
  3.         public override void ViewportDraw(Drawable drawable, ViewportDraw vd)
  4.         {
  5.             Solid3d Solidd = new Solid3d();
  6.             Solidd.CreateBox(100, 100, 100);//для примера
  7.  
  8.             ObjectId key = drawable.Id;
  9.             if (!cash.ContainsKey(key))
  10.                 cash.Add(key, Solidd);
  11.             else
  12.             {
  13.                 cash[key].Dispose();
  14.                 cash[key] = Solidd;
  15.             }
  16.  
  17.             vd.Geometry.Draw(Solidd);
  18.  
  19.             base.ViewportDraw(drawable, vd);
  20.         }

В такой ситуации при каждом вызове REGEN3 - запускается перерисовка и вызывается метод ViewportDraw.
Solid3d после вызова REGEN3 появляется. Но стоит масштабировать и Solid3d пропадает.
Именно исходя из этого я начал думать что нужно хранить объекты в памяти для каждого уровня детализации.
Проверил теорию так - сохраняю в памяти все объекты , потому как не нашел способ определения этих уровней детализации.
Код - C# [Выбрать]
  1. static Dictionary<ObjectId, List<Solid3d>> cash = new Dictionary<ObjectId, List<Solid3d>>();
  2.  
  3.         public override void ViewportDraw(Drawable drawable, ViewportDraw vd)
  4.         {
  5.             Solid3d Solidd = new Solid3d();
  6.             Solidd.CreateBox(100, 100, 100);//для примера
  7.  
  8.             ObjectId key = drawable.Id;
  9.             if (!cash.ContainsKey(key))
  10.                 cash.Add(key, new List<Solid3d>());
  11.            
  12.             cash[key].Add(Solidd);
  13.  
  14.             vd.Geometry.Draw(Solidd);
  15.  
  16.             base.ViewportDraw(drawable, vd);
  17.         }

При масштабировании перестал пропадать Solid3d (по крайне мере сколько успел посмотреть до падения Автокада  :D)
этот пример конечно не работоспособен. Сделал чтобы проверить теорию...

Оффлайн Алексей КузинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 8
Re: DrawableOverrule и Solid3d
« Ответ #18 : 18-02-2016, 16:57:55 »
Цитировать
А чем эта команда от обычного REGEN отличается?

точно не знаю чем именно. Но REGEN3 вызывает перерисовку, а REGEN - нет.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: DrawableOverrule и Solid3d
« Ответ #19 : 18-02-2016, 17:07:53 »
А чем эта команда от обычного REGEN отличается?
Команда недокументированная. Судя по всему отличие от REGEN в том, что REGEN работает только с примитивами в базе данных, а REGEN3 и с транзитной графикой - заставляет её перерисовываться.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей КузинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 8
Re: DrawableOverrule и Solid3d
« Ответ #20 : 18-02-2016, 18:36:37 »
Если drawing сохранить, то при масштабировании Solid3d пропадать не будет.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: DrawableOverrule и Solid3d
« Ответ #21 : 18-02-2016, 19:55:30 »
Если drawing сохранить, то при масштабировании Solid3d пропадать не будет.
Не понял. Поясни о чем ты?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Алексей Кузин 19-02-2016, 11:26:45

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: DrawableOverrule и Solid3d
« Ответ #22 : 19-02-2016, 00:41:10 »
Так. Добрался до компа и проверил что даёт _REGEN3:
Код - C# [Выбрать]
  1. // (C) Copyright 2016 by  
  2. //
  3. using System;
  4. using System.Collections.Generic;
  5. using Autodesk.AutoCAD.Runtime;
  6. using Autodesk.AutoCAD.ApplicationServices;
  7. using Autodesk.AutoCAD.DatabaseServices;
  8. using Autodesk.AutoCAD.Geometry;
  9. using Autodesk.AutoCAD.GraphicsSystem;
  10.  
  11. using Autodesk.AutoCAD.EditorInput;
  12. using AcGi = Autodesk.AutoCAD.GraphicsInterface;
  13.  
  14. // This line is not mandatory, but improves loading performances
  15. [assembly: CommandClass(typeof(Rivilis.MyCommands))]
  16.  
  17. namespace Rivilis
  18. {
  19.   public class MyCommands
  20.   {
  21.     [CommandMethod("S3DOver")]
  22.     public void CmdSimpleOverrule()
  23.     {
  24.       if (_overrule == null)
  25.       {
  26.         _overrule = new Solid3dOverrule();
  27.         Overrule.AddOverrule(RXClass.GetClass(typeof(Circle)), _overrule, false);
  28.       }
  29.       else
  30.       {
  31.         Overrule.RemoveOverrule(RXClass.GetClass(typeof(Circle)), _overrule);
  32.         _overrule = null;
  33.       }
  34.       Application.DocumentManager.MdiActiveDocument.Editor.Regen();
  35.       Application.DocumentManager.MdiActiveDocument.SendStringToExecute("_REGEN3 ", true, false, false);
  36.     }
  37.     private static Solid3dOverrule _overrule = null;
  38.   }
  39.   public class Solid3dOverrule : AcGi.DrawableOverrule
  40.   {
  41.     public Dictionary<ObjectId, Solid3d> cash = null;
  42.  
  43.     public override bool WorldDraw(AcGi.Drawable drawable, AcGi.WorldDraw wd)
  44.     {
  45.       base.WorldDraw(drawable, wd);
  46.       return false;
  47.     }
  48.     public override void ViewportDraw(AcGi.Drawable drawable, AcGi.ViewportDraw vd)
  49.     {
  50.       base.ViewportDraw(drawable, vd);
  51.       if (cash == null) cash = new Dictionary<ObjectId, Solid3d>();
  52.       Solid3d sol = new Solid3d();
  53.       if (!cash.ContainsKey(drawable.Id))
  54.       {
  55.         sol.CreateBox(100, 100, 100);
  56.         Circle pt = drawable as Circle;
  57.         if (pt != null) {
  58.           sol.TransformBy(Matrix3d.Displacement(pt.Center.GetAsVector()));
  59.         }
  60.         cash.Add(drawable.Id, sol);
  61.      }
  62.      else
  63.      {
  64.        sol = cash[drawable.Id];
  65.      }
  66.      vd.Geometry.Draw(sol);
  67.     }
  68.   }
  69. }

Вот видео:


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

Оффлайн Алексей КузинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 8
Re: DrawableOverrule и Solid3d
« Ответ #23 : 19-02-2016, 11:09:48 »
Цитата: LmRArtist от 18-02-2016, 18:36:37
Если drawing сохранить, то при масштабировании Solid3d пропадать не будет.
Не понял. Поясни о чем ты?

создаем новый drawing - рисуем - появляются пропадания при масштабировании.
Сохраняем drawing.
Переоткрываем его - рисуем, теперь при масштабировании пропадания отсутствуют.
(Повторилось несколько раз, но не всегда это срабатывает) - возможно из-за этого у вас пропадания перестали появляться.

Оффлайн Алексей КузинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 8
Re: DrawableOverrule и Solid3d
« Ответ #24 : 19-02-2016, 11:26:13 »
Ваш код работает. буду разбираться что у меня не так. Очень странно кстати.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: DrawableOverrule и Solid3d
« Ответ #25 : 19-02-2016, 14:11:16 »
Задал вопрос почему пропадают Solid3D если вызвать для них Dispose() в WorldDraw/ViewportDraw и получил ожидаемый ответ:
Цитировать
Вы должны хранить Solid3D в памяти. Это ожидаемое (запланированное) поведение. AutoCAD в различных условиях сохраняет Drawable в своем списке для оптимального отображения. Если Solid3D удален из памяти, то AutoCAD не сможет его показать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей КузинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 8
Re: DrawableOverrule и Solid3d
« Ответ #26 : 19-02-2016, 14:35:58 »
Всё понятно. Спасибо за помощь.
Кстати при вашем варианте падает автокад, из-за того что для Solid3d не вызывается Dispose().   в Output валит сообщения - "Forgot to call Dispose? (Autodesk.AutoCAD.DatabaseServices.Solid3d): DisposableWrapper"

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: DrawableOverrule и Solid3d
« Ответ #27 : 19-02-2016, 15:30:21 »
Кстати при вашем варианте падает автокад, из-за того что для Solid3d не вызывается Dispose().   в Output валит сообщения - "Forgot to call Dispose? (Autodesk.AutoCAD.DatabaseServices.Solid3d): DisposableWrapper"
Я в курсе. Это лишь тестовый пример. В какой момент вызывать Dispose нужно продумать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 533
  • Карма: 117
Re: DrawableOverrule и Solid3d
« Ответ #28 : 19-02-2016, 15:45:39 »
В какой момент вызывать Dispose нужно продумать.
Еще неплохо бы выяснить чем отличаются:
Application.DocumentManager.MdiActiveDocument.Editor.Regen();
Application.DocumentManager.MdiActiveDocument.SendStringToExecute("_REGEN3 ", true, false, false);
_regen
_redrawall
_regenall
RecordGraphicsModified(true);
...и возможно что-то еще


Слишком много их развелось для "освежения вида".
Можно ли ADN потрясти на этот счет?
....кстати словил еще один случай когда помог только RecordGraphicsModified(true); для отображения правильного цвета, после изменения цвета у размера в 2008 автокаде.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: DrawableOverrule и Solid3d
« Ответ #29 : 19-02-2016, 15:55:16 »
У таблиц и у размеров, как у сложных объектов, есть еще свои методы обновления. У размера это RecomputeDimensionBlock.