Есть ли альтернативный способ подсветить графический объект чертежа?

Автор Тема: Есть ли альтернативный способ подсветить графический объект чертежа?  (Прочитано 10101 раз)

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Здравствуйте!
Есть замечательный метод для подсветки объектов Entity.Highlight, назовём его "основной метод". Но понадобилось выполнить альтернативную подсветку объектов, чтобы пользователь видел, какие элементы были выбраны в предыдущем выборе. Подсветить их основным методом нельзя, т.к. это внесёт путаницу в текущий выбор объектов. Возможно, есть какой-то стандартный, или нестандартный, но проверенный способ для этого?

Отмечено как Решение Дмитрий Загорулькин 15-09-2017, 18:46:38

Оффлайн avc

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Временно поменять цвет, тип линий?
На мой взгляд - это не лучший вариант по ряду причин. Одна из них - если "вдруг чего", то объект так и останется изменённым.
Нарисовать поверх транзинтую графику с подсветочкой? С офсетом, чтоб видней...
Вот пока что изучаю этот вариант, ещё ни разу не пользовался. На первый взгляд, вроде как годится. Но, как-то он посложнее, чем основной метод подсветки - нужно программно создавать временные объекты для отображения. Возможно, есть какой-то способ попроще?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Как же я "люблю" справочные материалы!  >:( Вот как понять по описанию параметра "subDrawingMode", что он обозначает?
http://help.autodesk.com/view/OARX/2018/ENU/?guid=OREFNET-Autodesk_AutoCAD_GraphicsInterface_TransientManager_AddTransient_Drawable_TransientDrawingMode_int_IntegerCollection

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Временные объекты - это ж просто клон тех самых объектов что вы хотите подсветить. Главное где-то сохранить ссылку на эти объекты пока они нужны. Иначе TransientManager сам их отдиспозит и "погасит". Ничего сложного, за исключением, что автокад бывает крэшится при попытке подсветки блоков
Код - C# [Выбрать]
  1.   static class Transient
  2.   {
  3.  
  4.     // Список временных рисунков
  5.     private static List<Drawable> _drawn = new List<Drawable>();
  6.     private static bool _needclear = false;
  7.  
  8.     /// <summary>
  9.     /// Нарисовать временный объект заданным цветом во всех вьюпортах текущего листа активного документа
  10.     /// Объект будет скопирован и сохранен в _drawn. Графика не будет стерта до вызова Clear()
  11.     /// </summary>
  12.     public static void Draw(Entity obj, int color = 0, Matrix3d transform = new Matrix3d(), bool clear = false)
  13.     {
  14.       try
  15.       {
  16.         if (clear) Clear();
  17.         if (obj == null || obj.IsDisposed || obj.IsErased) return;
  18.         TransientManager tm = TransientManager.CurrentTransientManager;
  19.         if (tm == null || AcadApp.DocumentManager.MdiActiveDocument == null) return;
  20.         IntegerCollection ic = new IntegerCollection();
  21.         int currentViewPort = Convert.ToInt16(AcadApp.GetSystemVariable("CVPORT"));
  22.         if ((obj.IsNewObject || obj.BlockName != "*Paper_Space") && currentViewPort == 1) // текущее пространство - бумага
  23.         {
  24.           ic.Add(2); // первый вьюпорт на листе
  25.           ic.Add(3); ic.Add(4); ic.Add(5); ic.Add(6); // врядли будет больше вьюпортов на листе. TransientManager не ругается на номера несуществующих вьюпортов, а вызывать Layout.GetViewports лень
  26.         }
  27.         else
  28.           ic.Add(currentViewPort);
  29.  
  30.         if (obj is BlockReference)
  31.         {
  32.           // подсветка блоков приводит к крешу автокада даже если подсвечивать клон или взорванный блок
  33.           Highlight.Add(obj);
  34.         }
  35.         else
  36.         {
  37.           Entity ent = obj.Clone() as Entity;
  38.           if (transform != new Matrix3d()) ent.TransformBy(transform);
  39.           if (color != 0) ent.ColorIndex = color; // не влияет на блоки
  40.           tm.AddTransient(ent, TransientDrawingMode.Highlight, 128, ic);
  41.           _needclear = true;
  42.           _drawn.Add(ent); // если сборщик мусора удалит объекты то TransientManager сам сотрет их -> сохраним ссылку на объекты до тех пор пока они должны отображаться
  43.         }
  44.  
  45.       }
  46.       catch (System.Exception e) { Cns.Err("Transient Draw error: " + e); }
  47.     }
  48.  
  49.     /// <summary>
  50.     /// Стереть Transient-графику с любого вьюпорта из всех открытых документов
  51.     /// </summary>
  52.     public static void Clear()
  53.     {
  54.       Highlight.Clear();
  55.       try
  56.       {
  57.         if (!_needclear) return;
  58.         TransientManager tm = TransientManager.CurrentTransientManager;
  59.         if (tm == null || tm.IsDisposed) return;
  60.         //tm.EraseTransients(TransientDrawingMode.Highlight, 128, new IntegerCollection()); // стирание всех объектов не дожидаясь пока их удалит сборщик мусора
  61.         IntegerCollection ic = new IntegerCollection();
  62.         foreach (Entity obj in _drawn)
  63.           if(obj!=null || !obj.IsDisposed) tm.EraseTransient(obj, ic);
  64.         _drawn.Clear();
  65.       }
  66.       catch (System.Exception e) { Cns.Err("Transient Clear error: " + e); }
  67.       finally { _needclear = false; }
  68.     }
  69.  
  70.   }

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Спасибо за пример!
Временные объекты - это ж просто клон тех самых объектов что вы хотите подсветить.
Да, я понимаю это. Но у меня объекты Civil 3D. Делать их клоны - очень опасное занятие. Если уж от клонирования блоков падает автокад, то с большой вероятностью тут будет то же самое. Ну или какие-то ещё более неприятные проблемы вылезут.
Но у меня появилась безумная идея :)
А зачем создавать клон объекта? Ведь можно открыть объект на чтение и передать его в TransientManager. Если перед этим поменять значение переменной SELECTIONEFFECTCOLOR, а затем вернуть обратно, то должен получиться именно тот эффект, на который я рассчитываю. Естественно, в версиях ниже 2016 работать не будет. Но это будет стимулом для перехода на новые версии :) Сейчас буду тестировать.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
С передачей самих объектов, а не клонов, я точно экспериментировал пока боролся с блоками. Но вернулся к клонам. Не помню почему.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Возможно, потому, что нужно было цвет поменять у примитива (строка 39 в коде)?

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Возможно. Попробуйте без замены цвета. TransientDrawingMode.Highlight итак дает заметную подсветку. Но она наверно будет совпадать с подсветкой выделенных объектов...

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Если перед этим поменять значение переменной SELECTIONEFFECTCOLOR, а затем вернуть обратно, то должен получиться именно тот эффект, на который я рассчитываю.
Ожидания не оправдались. Транзиентная графика реагирует на каждое изменение переменной SELECTIONEFFECTCOLOR.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Логично. Это ж срабатывает TransientDrawingMode.Highlight . Цвет свечения задается той же системной переменной. И это не цвет объекта. А если попробовать другие варианты TransientDrawingMode? Я только Main пробовал...

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
А если попробовать другие варианты TransientDrawingMode?
Попробовал. При некоторых транзиентная графика вообще не отображается, при остальных - каких-то визуальных отличий я не заметил. Просто отрисовывается заданный объект.