AutoCAD. Как устранить обратный zoom при прерывании выбора примитивов

Печать
Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

В данной небольшой заметке я не открою Америку и не расскажу что-то уникальное. Но заметку я решил написать, так как не сразу можно догадаться о причинах такого поведения.

Итак, у вас есть команда, работающая по сценарию: запуск команды, выбор примитива, какие-то действия с примитивом. И может случиться так: вы запустили команду, начался запрос на выбор примитива, вы покрутили колесиком, а затем нажали Esc и произошло зуммирование к тем границам экрана, которые были до вызова команды. Иногда это может сильно бесить пользователей.

Вот кусок кода, который вызывает такое поведение:

using (var tr = db.TransactionManager.StartTransaction())
{
    var peo = new PromptEntityOptions("\nSelect dim: ");
    peo.SetRejectMessage("\nWrong");
    peo.AddAllowedClass(typeof(RotatedDimension), false);
    peo.AddAllowedClass(typeof(AlignedDimension), false);
    peo.AllowNone = true;
    var per = ed.GetEntity(peo);

    if (per.Status != PromptStatus.OK)
        return;
    
    var btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite, false);  

    var firstDim = tr.GetObject(per.ObjectId, OpenMode.ForWrite, false) as Entity;
    if (firstDim == null)
        return;

Так вот причина такого поведения в том, что выбор примитива находится внутри блока using с транзакцией. Т.е. внутри транзакции. А когда вы прерываете выбор примитива, то происходит откат транзакции к начальному состоянию, включая и границы экрана. Все просто, но не всегда можно догадаться.

Просто выносим выбор примитива за транзакцию, и проблема исчезает

var peo = new PromptEntityOptions("\nSelect dim: ");
peo.SetRejectMessage("\nWrong");
peo.AddAllowedClass(typeof(RotatedDimension), false);
peo.AddAllowedClass(typeof(AlignedDimension), false);
peo.AllowNone = true;
var per = ed.GetEntity(peo);

if (per.Status != PromptStatus.OK)
    return;

using (var tr = db.TransactionManager.StartTransaction())
{
    var btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite, false);

    var firstDim = tr.GetObject(per.ObjectId, OpenMode.ForWrite, false) as Entity;
    if (firstDim == null)
        return;
Tags: , ,