Почему на чертеже не отображается изменение текста элемента

Автор Тема: Почему на чертеже не отображается изменение текста элемента  (Прочитано 8086 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Всем доброго дня!
Меняю на чертеже текст однострочного элемента с помощью такого метода:
Код - 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.  
При этом показывается старое значение текста, до замены.
Где я не прав?
Спасибо.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Новое значение текста отображается только, если первый оператор метода - ZoomDynamic.ZoomObject(docInf.ObjId, 60);
Отображается или действительно не меняется? Нет ли внешней транзакции в которой потерян Transaction.Commit()? Как-то всё это очень странно. Явных ошибок в коде я не вижу. Ну и не знаю что делает  ZoomDynamic.ZoomObject(docInf.ObjId, 60);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Вот класс 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.  

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Борис_С,
Не вижу tr.Commit() в методе ZoomObject()
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Саша, этот метод я взял у тебя. https://adn-cis.org/forum/index.php?topic=10174.0
Там ошибка. Я исправлю там, а ты исправь у себя. В другом контексте и в другой версии AutoCAD это возможно бы сработало нормально.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
И все-равно непонятно, почему без ZoomDynamic.ZoomObject текст не меняется. Меняется только если я нажимаю на чертеж.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Меняется только если я нажимаю на чертеж.
Я не знаю, что такое "нажимаю на чертеж". Думаю, что только не меняется изображение текста на экране, а текст меняется. Для проверки можешь после завершения транзакции вставить:
Код - C# [Выбрать]
  1. Autodesk.AutoCAD.Internal.Utils.FlushGraphics();
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Борис_С,
А текст случайно не внутри блока? В этом случае для отображения нового текста необходимо выполнять регенерацию чертежа: Editor.Regen();
Но только если это делать после изменения каждого текста - это будет слишком накладно. Так что советую делать это после изменения всех текстов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Меняется только если я нажимаю на чертеж.
Подозреваю, что изменения вне команды. Или ещё какой-то подобный механизм, когда фокуса нет в чертеже. Так?

Отмечено как Решение Борис_С 16-12-2020, 19:51:15

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Меняется только если я нажимаю на чертеж.
Подозреваю, что изменения вне команды. Или ещё какой-то подобный механизм, когда фокуса нет в чертеже. Так?
Небось с какой-то немодальной формы, которая где-то выше упоминалась...
Борис_С,
Если это так, то еще следует не забывать о блокировке документа перед его изменением. Ну и передать фокус редактору AutoCAD не мешало бы: Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView()
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Да, я осуществляю изменение текста из немодальной формы.
После того, как вставил оператор Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView() все заработало.
В методе SelectItem я нашел ошибку. Теперь все работает. Спасибо.