Всем привет. Как-то давно были у меня вопросы (
вот,
вот) касаемо ObjectOverrule. Те проблемы были решены и все работает. Конечно, возможно не идеально, но вроде без фаталов ошибок и прочего такого. По крайней мере пользователи не сообщали и у меня при тестах хорошо. О результатах я пишу понемногу в
этой теме. Скоро, кстати, будет новый комментарий, если это конечно кому-то интересно.
Проект был надолго заброшен, но недавно я прям загорелся им снова. На данный момент занимаюсь рефакторингом и оптимизацией. Переделал практически весь проект, упростив создание новых примитивов до максимума. Настолько, что даже палитра строится сама на основе выбранного примитива ))
Так вот - есть такой код - его не получается обобщить и приходится делать для каждого типа моих примитивов:
namespace mpESKD.Functions.mpBreakLine.Overrules
{
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using ModPlusAPI.Windows;
using Base.Helpers;
using Base;
public class BreakLineObjectOverrule : ObjectOverrule
{
protected static BreakLineObjectOverrule _breakLineObjectOverrule;
public static BreakLineObjectOverrule Instance()
{
if (_breakLineObjectOverrule != null) return _breakLineObjectOverrule;
_breakLineObjectOverrule = new BreakLineObjectOverrule();
// Фильтр "отлова" примитива по расширенным данным. Работает лучше, чем проверка вручную!
_breakLineObjectOverrule.SetXDataFilter(BreakLineInterface.Name);
return _breakLineObjectOverrule;
}
public override void Close(DBObject dbObject)
{
// Проверка дополнительных условий
if (IsApplicable(dbObject))
{
AcadHelpers.WriteMessageInDebug("Close in ObjectOverrule");
try
{
if (AcadHelpers.Document != null)
if (dbObject != null && dbObject.IsNewObject & dbObject.Database == AcadHelpers.Database ||
dbObject != null && dbObject.IsUndoing & dbObject.IsModifiedXData)
{
var breakLine = EntityReaderFactory.Instance.GetFromEntity<BreakLine>((Entity)dbObject);
if (breakLine != null)
{
breakLine.UpdateEntities();
breakLine.GetBlockTableRecordForUndo((BlockReference)dbObject).UpdateAnonymousBlocks();
}
}
}
catch (Exception exception)
{
ExceptionBox.Show(exception);
}
}
base.Close(dbObject);
}
public override bool IsApplicable(RXObject overruledSubject)
{
return ExtendedDataHelpers.IsApplicable(overruledSubject, BreakLineInterface.Name);
}
}
}
Весь код в вопросе не важен. Важны только некоторые строки:
18 - согласно
этой статье использование SetXDataFilter позволяет убрать ручную проверку XData, перекладывая эту работу на сам автокад
51-53 - стандартная реализация метода IsApplicable где я проверяю что в примитиве имеется нужная мне XData с кодом 1001
И вот самое интересное - в 27 строке - я просто вывожу сообщение в командную строку. А интересно то, что после создания моего примитива в чертеже, эту строчку в командной строке я вижу ПОСТОЯННО. Независимо от того, делаю я что-то со своим объектом или с любым другим примитивов автокада. А самое главное - эту строчку я вижу при каждом движении мышкой в чертеже!
Получается как-то совсем не оптимизировано. Хотелось бы понять почему так происходит и как лучше поступить в этой ситуации