Вызов редактора AcDbMText

Автор Тема: Вызов редактора AcDbMText  (Прочитано 9016 раз)

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

Оффлайн EgorZaАвтор темы

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Вызов редактора AcDbMText
« : 09-12-2015, 15:02:13 »
Здравствуйте!
Есть dbx проект и созданный объект использующий примитив AcDbMText.

Подскажите, как инициировать процесс редактирования пользователем встроенного в мой объект примитива AcDbMText?
Имеет ли к этому отношение AcDbTextEditor?

Отмечено как Решение EgorZa 15-12-2015, 10:37:14

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вызов редактора AcDbMText
« Ответ #1 : 09-12-2015, 18:53:46 »
Приветствую на форуме!

Код - C++ [Выбрать]
  1. static void RivilisMTEditor () {
  2.   ads_point pt;
  3.   ads_name en;
  4.   if (acedEntSel(_T("\nВыберите мультитекст: "), en, pt) == RTNORM)
  5.   {
  6.     AcDbObjectId eId; acdbGetObjectId(eId, en);
  7.     AcDbObjectPointer<AcDbMText> pMtext(eId, AcDb::kForWrite);
  8.     Acad::ErrorStatus es = pMtext.openStatus();
  9.     if (es == Acad::eNotThatKindOfClass) {
  10.       acedPrompt(_T("\nЭто не мультитекст!"));
  11.       return;
  12.     } else if (es != Acad::eOk) {
  13.       acutPrintf(_T("\nОшибка: %s"), acadErrorStatusText(es));
  14.       return;
  15.     }
  16.     // Объект редактора MTEXT:
  17.     AcEdInplaceTextEditor *pTextEditor = AcEdInplaceTextEditor::current();
  18.     // Установки редактора:
  19.     AcEdInplaceTextEditorSettings *pTextEditorSettings = new AcEdInplaceTextEditorSettings();
  20.     // Запускаем редактирование
  21.     if (pTextEditor->invoke(pMtext, pTextEditorSettings) != Acad::eOk) {
  22.       pMtext->cancel();
  23.     }
  24.     delete pTextEditorSettings;
  25.   }
  26. }
Только учти, что тебе придётся прилинковать еще и accore.lib (для версии AutoCAD начиная с 2013) или acad.lib (для версий 2011 и 2012). В версиях до 2010 включительно этого класса нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вызов редактора AcDbMText
« Ответ #2 : 10-12-2015, 11:53:03 »
Так как нигде в интернете не нашёл информации по использованию AcEdInplaceTextEditor, то оформил примеры в виде статьи: Как запустить редактор мультитекста?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн EgorZaАвтор темы

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Re: Вызов редактора AcDbMText
« Ответ #3 : 11-12-2015, 12:17:43 »
Большое спасибо! Работает!

Привязал запуск редактора к реатору AcEditorReactor3::beginDoubleClick,
но, к сожалению, мультитекст не обновляется сразу после ввода... только после какого-нибудь события, например, перемещения объекта...

Можно ли объект обновить после ввода содержимого мультитекста? AcDbEntity::draw() не помогает..

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вызов редактора AcDbMText
« Ответ #4 : 11-12-2015, 13:14:59 »
но, к сожалению, мультитекст не обновляется сразу после ввода... только после какого-нибудь события, например, перемещения объекта...
1) Ты можешь сам выполнить перемещение примитива (метод transformBy), а потом вернуть его обратно - он будет помечен как отредактированный и перерисован.
2) Ты можешь вызвать метод recordGraphicsModified(true) для своего примитива (не AcDbMtext, а основного), что тоже должно приводить к его перерисовке.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн EgorZaАвтор темы

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Re: Вызов редактора AcDbMText
« Ответ #5 : 15-12-2015, 10:35:25 »
Спасибо, Александр!

эффект даёт:
Код - C++ [Выбрать]
  1. AcDbEntity *pEnt;
  2. pEnt->subTransformBy(AcGeMatrix3d().setToIdentity());
мультитекст, зашитый в pEnt обновляется, а объект не меняет своего расположения в пространстве.

Но subTransformBy можно применять только в режиме OpenMode::kForWrite,
а у меня вызов редактора привязан к реактору beginDoubleClick, свой объект нахожу через коллекцию выделения с помощью acedSSGet,
и в момент срабатывания реактора и открытия его в режиме kForWrite  объект имеет openStatus = eLockViolation.

Как можно, в этом случае, открыть его с правами перезаписи?
Искал функцию сброса выделения объектов, пока не разобрался..
« Последнее редактирование: 15-12-2015, 11:24:11 от EgorZa »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вызов редактора AcDbMText
« Ответ #6 : 15-12-2015, 11:55:38 »
и в момент срабатывания реактора и открытия его в режиме kForWrite  объект имеет openStatus = eLockViolation.
Ну, во-первых, ты работаешь в контексте приложения. Так что нужно документ блокировать перед открытием примитива на запись.
Т.е. что-то типа:
Код - C++ [Выбрать]
  1. AcAxDocLock doclock(curDoc()->database());
Искал функцию сброса выделения объектов, пока не разобрался..
Код - C++ [Выбрать]
  1. acedSSSetFirst(NULL,NULL);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение