Всем привет. На пути тестирования различных Overrule, обрабатывающих блоки, отлавливаю баги и пытаюсь их устранить. Один баг был с таблицами и ручками, но вроде вопрос решил.
Теперь столкнулся с новой проблемой, но ни одной идеи нет.
Имеется Osnap Overrule:
using System;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using mpESKD.Base.Helpers;
using ModPlusAPI.Windows;
namespace mpESKD.Functions.mpBreakLine.Overrules
{
public class BreakLineOsnapOverrule : OsnapOverrule
{
protected static BreakLineOsnapOverrule _breakLineOsnapOverrule;
public static BreakLineOsnapOverrule Instance()
{
return _breakLineOsnapOverrule ?? (_breakLineOsnapOverrule = new BreakLineOsnapOverrule());
}
public override void GetObjectSnapPoints(Autodesk.AutoCAD.DatabaseServices.Entity entity, ObjectSnapModes snapMode, IntPtr gsSelectionMark, Point3d pickPoint,
Point3d lastPoint, Matrix3d viewTransform, Point3dCollection snapPoints, IntegerCollection geometryIds)
{
AcadHelpers.WriteMessageInDebug("get object snap points");
if (IsApplicable(entity))
{
AcadHelpers.WriteMessageInDebug("внутри");
try
{
var breakLine = BreakLineXDataHelper.GetBreakLineFromEntity(entity);
if (breakLine != null)
{
snapPoints.Add(breakLine.InsertionPoint);
snapPoints.Add(breakLine.EndPoint);
}
}
catch (Autodesk.AutoCAD.Runtime.Exception exception)
{
ExceptionBox.Show(exception);
}
}
else base.GetObjectSnapPoints(entity, snapMode, gsSelectionMark, pickPoint, lastPoint, viewTransform, snapPoints, geometryIds);
}
public override bool IsApplicable(RXObject overruledSubject)
{
return ExtendedDataHelpers.IsApplicable(overruledSubject, BreakLineFunction.MPCOEntName);
}
}
}
Метод IsApplicable, на всякий случай:
public static bool IsApplicable(RXObject rxObject, string appName)
{
DBObject dbObject = rxObject as DBObject;
if (dbObject == null) return false;
if (dbObject.IsAProxy ||
dbObject.IsErased ||
dbObject.IsEraseStatusToggled ||
dbObject.IsUndoing) return false;
return IsMPCOentity(dbObject, appName);
}
public static bool IsMPCOentity(DBObject dbObject, string appName)
{
ResultBuffer rb = dbObject.GetXDataForApplication(appName);
return rb != null;
}
Если в чертеж вставить внешнюю ссылку и начать перемещать любой объект - например вершину полилинии - автокад начинает зависать на очень долго. Секунд на 5-10. Особенно явно, когда при движении курсор проходит над внешней ссылкой. После запуска кода выше, с выводом в командную строку, получаю такое:
Я пытался пролистать к началу, но ограничения на вывод в командную строку мне этого не позволили. Получается, что метод GetObjectSnapPoints() срабатывает для всех примитивов, находящихся внутри внешний ссылки!
Вопрос - как правильно исключить из работы OsnapOverrule обработку внешних ссылок?