Всем Здравствуйте. Вопрос в следующем - есть рабочий DrawJig который "протягивает" размеры (AlignedDimension) от необходимых точек и есть желание заставить его работать не по команде, а при "тяготении" ручек. Я знаю что MoveGripPointsAt в процессе перемещения работает не с настоящей БД а с клонами объектов, но на последний вызов идет "из под" нормального объекта. Так вот при вызове Editor.Drag() из под переопределенного метода MoveGripPointsAt в процессе перемещения (когда вызываемый ObjectID не валидный) - происходит ФАТАЛ по завершении Jig'а, при том, что, например, просто запрос точки Editor.GetPoint("\nPT: ") - работает. Причем тот-же Jig из отдельной команды, либо из того-же MoveGripPointsAt, но при валидно ObjectID прекрасно работает. Я грешил, что ошибка где-то в районе создания AlignedDimension, но оказалось, что даже создав "пустой", ниего не делающий Jig валится на AcquirePoint. Ниже упрощенный пример, команда test запускает Jig, и переопеделенно перемещение у примитива "точка" - ошибка выявится при включении строки 27:
module JigTest
open Autodesk.AutoCAD.ApplicationServices
open Autodesk.AutoCAD.Runtime
open Autodesk.AutoCAD.DatabaseServices
open Autodesk.AutoCAD.Geometry
open Autodesk.AutoCAD.EditorInput
// сокращение на Editor
let Ed()=Application.DocumentManager.MdiActiveDocument.Editor
//класс Jig'а
type JigEmpty()=
inherit DrawJig()
override jg.WorldDraw(wd)=true
override jg.Sampler(jp)=
jp.AcquirePoint("\nPoint: ")|>ignore //этого достаточно для вызова фатала
SamplerStatus.OK
//класс переопределения ручек
type GrpOver()=
inherit GripOverrule()
override ob.MoveGripPointsAt(ent,ic,vct)=
match ent with
| :? DBPoint as point when point.ObjectId.IsValid-> // произойдет когда закончим перетакивание перетащили
Ed().Drag(new JigEmpty())|>ignore // здесь работает
| :? DBPoint as point-> // проиcходит при перетаскивании
//Ed().Drag(new JigEmpty())|>ignore // !!!! раскоментирование данной строки ведет к фаталу после завершения Drag'а
Ed().GetPoint("Test")|>ignore// этот вызов в то-же время будет работать
()
|_->base.MoveGripPointsAt(ent,ic,vct)
// команда для проверки
[<CommandMethod "Test">]
let Test()=
Ed().Drag(new JigEmpty())|>ignore // команда-же прекрасно работает
// ставим в "автозагрузку" Overrule на точку
type Initial()=
interface IExtensionApplication with
member obj.Initialize()=GripOverrule.AddOverrule(RXClass.GetClass(typeof<DBPoint>),new GrpOver(),true)
member obj.Terminate()=()
з.ы. все это нужно для обеспечения точности перемещения ручек в переOverrule'ный объект.