using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using gr=Autodesk.AutoCAD.GraphicsInterface;
namespace OverruleBugExample
{
public class OverRule : gr.DrawableOverrule
{
public override bool WorldDraw(gr.Drawable drawable, gr.WorldDraw wd)
{
if (drawable is Polyline pl)
//if (drawable is Polyline pl && pl.ObjectId.IsValid && !pl.ObjectId.IsErased) // можно и так - по примеру бага ничего не изменится
{
// без этого блока баг не проявляется
using (var tr = Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction())
{
tr.Commit();
}
// просто для примера работы отображения - без этого блока баг так-же проявляется
using (var circ = new Circle { Center = pl.StartPoint, Radius = 50 })
{
circ.WorldDraw(wd);
}
}
return base.WorldDraw(drawable, wd);
}
}
public class BugExample
{
private bool isOn = false;
private readonly OverRule over=new OverRule();
[CommandMethod("OverBug")]
public void OverBug()
{
var ed = Application.DocumentManager.MdiActiveDocument.Editor;
if (isOn)
{
Overrule.RemoveOverrule(RXClass.GetClass(typeof(Polyline)), over);
isOn = false;
ed.Regen();
ed.WriteMessage("\nOverrule off");
}
else
{
Overrule.AddOverrule(RXClass.GetClass(typeof(Polyline)), over, true);
isOn = true;
ed.Regen();
ed.WriteMessage("\nOverrule on");
}
}
}
}