Я бы на твоём месте писал бы эти данные в ObjectOverrule.Close - так было бы универсальнее.
Думал об этом. Решил вот пробовать и конечно-же столкнулся с проблемами
1. Мне нужно между Overrules (на данный момент это GripsOverrule и ObjectOverrule) передавать данные моего объекта. Т.е. в момент начала редактирования я получаю эти данные, в завершении - записываю. Вот пытаюсь осмыслить куда мне это вынести? Может сделать отдельный класс с переменной, в которой я буду хранить эти данные между началом изменения и окончанием? Тогда еще нужно решить в каком Overrule мне их получать. ObjectOverrule.Оpen подойдет?
UPD: Объясню сразу - данные, хранимые в XRecord, зависят от графики (точнее - от его местоположения). При использовании GripsOverrule в методе GetGripPoints я получаю данные, в методе MoveGripPointsAt изменяю и записываю обратно. Если начну использовать ObjectOverrule.Close, то нужно правильно разместить получение данных, изменение и расположение их обратно
2. Накидал просто тестовый код, чтобы по командной строке посмотреть, что происходит:
public class BreakLineObjectOverrule : ObjectOverrule
{
protected static BreakLineObjectOverrule _breakLineObjectOverrule;
public static BreakLineObjectOverrule Instance()
{
if (_breakLineObjectOverrule == null)
_breakLineObjectOverrule = new BreakLineObjectOverrule();
return _breakLineObjectOverrule;
}
public override void Open(DBObject dbObject, OpenMode mode)
{
if (IsApplicable(dbObject))
{
AcadHelpers.Editor.WriteMessage("\nObjectOverrule on Open");
AcadHelpers.Editor.WriteMessage("\nObjectOverrule on Open - mode: " + mode);
AcadHelpers.Editor.WriteMessage("\nObjectOverrule on Open - ObjectId: " + dbObject.ObjectId);
}
base.Open(dbObject, mode);
}
public override void Close(DBObject dbObject)
{
if (IsApplicable(dbObject))
{
AcadHelpers.Editor.WriteMessage("\nObjectOverrule on Close");
AcadHelpers.Editor.WriteMessage("\nObjectOverrule on Close - isModified: " + dbObject.IsModified);
AcadHelpers.Editor.WriteMessage("\nObjectOverrule on Close - IsCancelling: " + dbObject.IsCancelling);
AcadHelpers.Editor.WriteMessage("\nObjectOverrule on Close - IsErased: " + dbObject.IsErased);
AcadHelpers.Editor.WriteMessage("\nObjectOverrule on Close - IsModifiedGraphics: " + dbObject.IsModifiedGraphics);
AcadHelpers.Editor.WriteMessage("\nObjectOverrule on Close - IsUndoing: " + dbObject.IsUndoing);
AcadHelpers.Editor.WriteMessage("\nObjectOverrule on Close - ObjectId: " + dbObject.ObjectId);
}
base.Close(dbObject);
}
public override bool IsApplicable(RXObject overruledSubject)
{
return ExtendedDataHelpers.IsApplicable(overruledSubject);
//return base.IsApplicable(overruledSubject);
}
}
В итоге, сразу после создания (да и при создании) объекта я постоянно вижу в командной строке все эти надписи. Даже если я не трогаю объект, а просто вожу мышкой по экрану