static class Transient
{
// Список временных рисунков
private static List<Drawable> _drawn = new List<Drawable>();
private static bool _needclear = false;
/// <summary>
/// Нарисовать временный объект заданным цветом во всех вьюпортах текущего листа активного документа
/// Объект будет скопирован и сохранен в _drawn. Графика не будет стерта до вызова Clear()
/// </summary>
public static void Draw(Entity obj, int color = 0, Matrix3d transform = new Matrix3d(), bool clear = false)
{
try
{
if (clear) Clear();
if (obj == null || obj.IsDisposed || obj.IsErased) return;
TransientManager tm = TransientManager.CurrentTransientManager;
if (tm == null || AcadApp.DocumentManager.MdiActiveDocument == null) return;
IntegerCollection ic = new IntegerCollection();
int currentViewPort = Convert.ToInt16(AcadApp.GetSystemVariable("CVPORT"));
if ((obj.IsNewObject || obj.BlockName != "*Paper_Space") && currentViewPort == 1) // текущее пространство - бумага
{
ic.Add(2); // первый вьюпорт на листе
ic.Add(3); ic.Add(4); ic.Add(5); ic.Add(6); // врядли будет больше вьюпортов на листе. TransientManager не ругается на номера несуществующих вьюпортов, а вызывать Layout.GetViewports лень
}
else
ic.Add(currentViewPort);
if (obj is BlockReference)
{
// подсветка блоков приводит к крешу автокада даже если подсвечивать клон или взорванный блок
Highlight.Add(obj);
}
else
{
Entity ent = obj.Clone() as Entity;
if (transform != new Matrix3d()) ent.TransformBy(transform);
if (color != 0) ent.ColorIndex = color; // не влияет на блоки
tm.AddTransient(ent, TransientDrawingMode.Highlight, 128, ic);
_needclear = true;
_drawn.Add(ent); // если сборщик мусора удалит объекты то TransientManager сам сотрет их -> сохраним ссылку на объекты до тех пор пока они должны отображаться
}
}
catch (System.Exception e) { Cns.Err("Transient Draw error: " + e); }
}
/// <summary>
/// Стереть Transient-графику с любого вьюпорта из всех открытых документов
/// </summary>
public static void Clear()
{
Highlight.Clear();
try
{
if (!_needclear) return;
TransientManager tm = TransientManager.CurrentTransientManager;
if (tm == null || tm.IsDisposed) return;
//tm.EraseTransients(TransientDrawingMode.Highlight, 128, new IntegerCollection()); // стирание всех объектов не дожидаясь пока их удалит сборщик мусора
IntegerCollection ic = new IntegerCollection();
foreach (Entity obj in _drawn)
if(obj!=null || !obj.IsDisposed) tm.EraseTransient(obj, ic);
_drawn.Clear();
}
catch (System.Exception e) { Cns.Err("Transient Clear error: " + e); }
finally { _needclear = false; }
}
}