В данной небольшой заметке я не открою Америку и не расскажу что-то уникальное. Но заметку я решил написать, так как не сразу можно догадаться о причинах такого поведения.
Итак, у вас есть команда, работающая по сценарию: запуск команды, выбор примитива, какие-то действия с примитивом. И может случиться так: вы запустили команду, начался запрос на выбор примитива, вы покрутили колесиком, а затем нажали 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;