Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Борис_С от 16-12-2020, 12:08:52

Название: Почему на чертеже не отображается изменение текста элемента
Отправлено: Борис_С от 16-12-2020, 12:08:52
Всем доброго дня!
Меняю на чертеже текст однострочного элемента с помощью такого метода:
Код - C# [Выбрать]
  1.         public void ReplaceText(FCheckRefDialog.CDocumentsInfo docInf, string text)
  2.         {
  3.             ZoomDynamic.ZoomObject(docInf.ObjId, 60);
  4.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.
  5.                 MdiActiveDocument;
  6.             Database acCurDb = acDoc.Database;
  7.  
  8.             using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  9.             {
  10.                 Entity en = acTrans.GetObject(docInf.ObjId, OpenMode.ForWrite) as Entity;
  11.                 if (docInf.dt == DataType.DBText)
  12.                 {
  13.                     DBText dbText = (DBText)en;
  14.                     dbText.TextString = text;
  15.                 }
  16.                 acTrans.Commit();
  17.             }
  18.         }
  19.  
Новое значение текста отображается только, если первый оператор метода - ZoomDynamic.ZoomObject(docInf.ObjId, 60);
Если закомментировать этот оператор, текст элемента на чертеже не меняется.
После этого я выделяю часть теста с помощью подчеркивания.
Код - C# [Выбрать]
  1.         public void SelectItem(FCheckRefDialog.CDocumentsInfo docInf)
  2.         {
  3.             ZoomDynamic.ZoomObject(docInf.ObjId, 60);
  4.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.
  5.                 MdiActiveDocument;
  6.             Database acCurDb = acDoc.Database;
  7.             using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  8.             {
  9.                 Entity en = acTrans.GetObject(docInf.ObjId, OpenMode.ForWrite) as Entity;
  10.                 if (docInf.dt == DataType.DBText)
  11.                 {
  12.                     DBText dbText = (DBText)en;
  13.                     dbText.TextString = dbText.TextString.Replace(docInf.designation,
  14.                         "%%u" + docInf.designation + "%%u");
  15.                 }
  16.                 acTrans.Commit();
  17.             }
  18.        }
  19.  
При этом показывается старое значение текста, до замены.
Где я не прав?
Спасибо.
Название: Re: Почему на чертеже не отображается изменение текста элемента
Отправлено: Александр Ривилис от 16-12-2020, 12:16:12
Новое значение текста отображается только, если первый оператор метода - ZoomDynamic.ZoomObject(docInf.ObjId, 60);
Отображается или действительно не меняется? Нет ли внешней транзакции в которой потерян Transaction.Commit()? Как-то всё это очень странно. Явных ошибок в коде я не вижу. Ну и не знаю что делает  ZoomDynamic.ZoomObject(docInf.ObjId, 60);
Название: Re: Почему на чертеже не отображается изменение текста элемента
Отправлено: Борис_С от 16-12-2020, 12:29:06
Вот класс ZoomDynamic:
Код - C# [Выбрать]
  1.         public class ZoomDynamic
  2.         {
  3.             public static void ZoomWindow(Point3d p1, Point3d p2)
  4.             {
  5.                 dynamic acad = Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication;
  6.                 acad.ZoomWindow(p1.ToArray(), p2.ToArray());
  7.             }
  8.             static public void ZoomObject(ObjectId id, double zoomFactor)
  9.             {
  10.                 Database db = HostApplicationServices.WorkingDatabase;
  11.                 Extents3d ext;
  12.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  13.                 {
  14.                     Entity en = (Entity)tr.GetObject(id, OpenMode.ForRead);
  15.                     ext = en.GeometricExtents;
  16.                 }
  17.                 Vector3d v = new Vector3d((ext.MinPoint - ext.MaxPoint).ToArray());
  18.                 ZoomWindow(ext.MinPoint - v * 100.0 / zoomFactor, ext.MaxPoint + v * 100.0 / zoomFactor);
  19.             }
  20.         }
  21.  
Название: Re: Почему на чертеже не отображается изменение текста элемента
Отправлено: Александр Ривилис от 16-12-2020, 12:32:30
Борис_С,
Не вижу tr.Commit() в методе ZoomObject()
Название: Re: Почему на чертеже не отображается изменение текста элемента
Отправлено: Борис_С от 16-12-2020, 12:37:38
Саша, этот метод я взял у тебя. https://adn-cis.org/forum/index.php?topic=10174.0
Название: Re: Почему на чертеже не отображается изменение текста элемента
Отправлено: Александр Ривилис от 16-12-2020, 12:39:59
Саша, этот метод я взял у тебя. https://adn-cis.org/forum/index.php?topic=10174.0
Там ошибка. Я исправлю там, а ты исправь у себя. В другом контексте и в другой версии AutoCAD это возможно бы сработало нормально.
Название: Re: Почему на чертеже не отображается изменение текста элемента
Отправлено: Борис_С от 16-12-2020, 12:43:51
И все-равно непонятно, почему без ZoomDynamic.ZoomObject текст не меняется. Меняется только если я нажимаю на чертеж.
Название: Re: Почему на чертеже не отображается изменение текста элемента
Отправлено: Александр Ривилис от 16-12-2020, 12:47:51
Меняется только если я нажимаю на чертеж.
Я не знаю, что такое "нажимаю на чертеж". Думаю, что только не меняется изображение текста на экране, а текст меняется. Для проверки можешь после завершения транзакции вставить:
Код - C# [Выбрать]
  1. Autodesk.AutoCAD.Internal.Utils.FlushGraphics();
Название: Re: Почему на чертеже не отображается изменение текста элемента
Отправлено: Александр Ривилис от 16-12-2020, 12:50:45
Борис_С,
А текст случайно не внутри блока? В этом случае для отображения нового текста необходимо выполнять регенерацию чертежа: Editor.Regen();
Но только если это делать после изменения каждого текста - это будет слишком накладно. Так что советую делать это после изменения всех текстов.
Название: Re: Почему на чертеже не отображается изменение текста элемента
Отправлено: Дмитрий Загорулькин от 16-12-2020, 17:36:57
Меняется только если я нажимаю на чертеж.
Подозреваю, что изменения вне команды. Или ещё какой-то подобный механизм, когда фокуса нет в чертеже. Так?
Название: Re: Почему на чертеже не отображается изменение текста элемента
Отправлено: Александр Ривилис от 16-12-2020, 17:46:33
Меняется только если я нажимаю на чертеж.
Подозреваю, что изменения вне команды. Или ещё какой-то подобный механизм, когда фокуса нет в чертеже. Так?
Небось с какой-то немодальной формы, которая где-то выше упоминалась...
Борис_С,
Если это так, то еще следует не забывать о блокировке документа перед его изменением. Ну и передать фокус редактору AutoCAD не мешало бы: Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView()
Название: Re: Почему на чертеже не отображается изменение текста элемента
Отправлено: Борис_С от 16-12-2020, 19:50:55
Да, я осуществляю изменение текста из немодальной формы.
После того, как вставил оператор Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView() все заработало.
В методе SelectItem я нашел ошибку. Теперь все работает. Спасибо.