Как вызвать команду программно из другой команды?

Автор Тема: Как вызвать команду программно из другой команды?  (Прочитано 9724 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
Здравствуйте!
Подскажите как можно вызвать команду, добавленную в Автокад из другой команды?

1. Добавил команду
static void TestAppcmdGlobalName(void) {
   acutPrintf(L">>> cmdGlobalName() - START\n\r");
}
ACED_ARXCOMMAND_ENTRY_AUTO(СTestApp, TestApp, cmdGlobalName, cmdLocalName, ACRX_CMD_TRANSPARENT, NULL)

2. Пробую вызвать эту команду из другой команды, также как и команды Автокад
acedCommandS(RTSTR, _T("cmdGlobalName"), 0);
Команда cmdGlobalName не выполняется. При программном вызове она не видна.
Но команда cmdGlobalName вызывается из командной строки Автокада

Как вызвать команду программно из другой команды?

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

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
Уточняю вопрос
Делаем программу, указанную ниже
Код - C++ [Выбрать]
  1. static void TestAppcmdGlobalName1(void) {
  2.    acutPrintf(L">>> cmdGlobalName1() - START\n\r");
  3.    acedCommandS(RTSTR, _T("cmdGlobalName2"), 0);
  4.    acutPrintf(L">>> cmdGlobalName1() - END\n\r");
  5. }
  6. static void TestAppcmdGlobalName2(void) {
  7.    acutPrintf(L">>> cmdGlobalName2() - START\n\r");
  8. }
  9. ACED_ARXCOMMAND_ENTRY_AUTO(СTestApp, TestApp, cmdGlobalName1, cmdLocalName1, ACRX_CMD_TRANSPARENT, NULL)
  10. ACED_ARXCOMMAND_ENTRY_AUTO(СTestApp, TestApp, cmdGlobalName2, cmdLocalName2, ACRX_CMD_TRANSPARENT, NULL)
  11.  
Команда cmdGlobalName2 выполняется и выводится текстовое сообщение
>>> cmdGlobalName2() - START

При вызове команды cmdGlobalName1 Выводится только
>>> cmdGlobalName1() - START
>>> cmdGlobalName1() - END
Команда cmdGlobalName2 в данном случае не выполняется

Почему не вызывается cmdGlobalName2 и как сделать, чтобы она вызывалась?

Если заменить вызов
acedCommandS(RTSTR, _T("cmdGlobalName2"), 0);
на
TestAppcmdGlobalName2();
функция выполняется.
Но в задаче требуется выполнить вызов команды из другого файла и этого сделать нельзя

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вместо:
Код - C++ [Выбрать]
  1. acedCommandS(RTSTR, _T("cmdGlobalName2"), 0);
должно быть
Код - C++ [Выбрать]
  1. acedCommandS(RTSTR, _T("_cmdGlobalName2"), 0);
или
Код - C++ [Выбрать]
  1. acedCommandS(RTSTR, _T("cmdLocalName2"), 0);



Вот полный код:
Код - C++ [Выбрать]
  1. //-----------------------------------------------------------------------------
  2. //----- acrxEntryPoint.cpp
  3. //-----------------------------------------------------------------------------
  4. #include "StdAfx.h"
  5. #include "resource.h"
  6. #include "acedcmdnf.h"
  7. //-----------------------------------------------------------------------------
  8. #define szRDS _RXST("ADSK")
  9.  
  10. //-----------------------------------------------------------------------------
  11. //----- ObjectARX EntryPoint
  12. class CTestApp : public AcRxArxApp {
  13.  
  14. public:
  15.   CTestApp() : AcRxArxApp() {}
  16.  
  17.   virtual AcRx::AppRetCode On_kInitAppMsg(void *pkt) {
  18.     AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg(pkt);
  19.     return (retCode);
  20.   }
  21.  
  22.   virtual AcRx::AppRetCode On_kUnloadAppMsg(void *pkt) {
  23.     AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg(pkt);
  24.     return (retCode);
  25.   }
  26.  
  27.   virtual void RegisterServerComponents() {     }
  28.  
  29.   static void TestAppcmdGlobalName1(void) {
  30.     acutPrintf(L">>> cmdGlobalName1() - START\n");
  31.     acedCommandS(RTSTR, _T("_cmdGlobalName2"), 0);
  32.     acutPrintf(L">>> cmdGlobalName1() - END\n");
  33.   }
  34.   static void TestAppcmdGlobalName2(void) {
  35.     acutPrintf(L">>> cmdGlobalName2() - START\n");
  36.     acutPrintf(L">>> cmdGlobalName2() - END\n");
  37.   }
  38. };
  39.  
  40. //-----------------------------------------------------------------------------
  41. IMPLEMENT_ARX_ENTRYPOINT(CTestApp)
  42.  
  43. ACED_ARXCOMMAND_ENTRY_AUTO(CTestApp, TestApp, cmdGlobalName1, cmdLocalName1, ACRX_CMD_TRANSPARENT, NULL)
  44. ACED_ARXCOMMAND_ENTRY_AUTO(CTestApp, TestApp, cmdGlobalName2, cmdLocalName2, ACRX_CMD_TRANSPARENT, NULL)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
Я неправильно указал в тестовом примере флаги запуска для cmdGlobalName2
С флагом ACRX_CMD_TRANSPARENT программа отрабатывает правильно
Если я меняю флаг на ACRX_CMD_MODAL | ACRX_CMD_SESSION  - программа не вызывается

Вот результат работы программы
Command: CMDLOCALNAME1
>>> cmdGlobalName1() - START
_cmdGlobalName2 >>> cmdGlobalName1() - END

Привожу дополненный код тестовой программы

Код - C++ [Выбрать]
  1.         static void lancNestingcmdGlobalName1(void) {
  2.                 acutPrintf(L">>> cmdGlobalName1() - START\n");
  3.                 acedCommandS(RTSTR, _T("_cmdGlobalName2"), 0);
  4.                 acutPrintf(L">>> cmdGlobalName1() - END\n");
  5.         }
  6.         static void lancNestingcmdGlobalName2(void) {
  7.                 acutPrintf(L">>> cmdGlobalName2() - START\n");
  8.  
  9.                 AcApDocument *pCurDoc = acDocManager->curDocument();
  10.                 CString sFile = L"C:\\000\\Part.dwg";
  11.                 Acad::ErrorStatus es = acDocManager->appContextOpenDocument((CString)sFile);
  12.                 acutPrintf(L">>> acDocManager es=%i\n\r", es);
  13.                 acDocManager->activateDocument(pCurDoc);                //восстановить указатель на текущий ченртеж
  14.  
  15.                 acutPrintf(L">>> cmdGlobalName2() - END\n");
  16.         }
  17.  
  18. ACED_ARXCOMMAND_ENTRY_AUTO(CTestApp, TestApp, cmdGlobalName1, cmdLocalName1, ACRX_CMD_TRANSPARENT, NULL)
  19. ACED_ARXCOMMAND_ENTRY_AUTO(CTestApp, TestApp, cmdGlobalName2, cmdLocalName2, ACRX_CMD_MODAL | ACRX_CMD_SESSION, NULL)
  20.  

Отмечено как Решение Ura 02-10-2019, 00:15:46

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
acedCommandS(RTSTR, _T("_cmdGlobalName2"), 0); возвращает -5001 (eError), потому что нельзя использовать acedCommandS для вызова команды, работающей в контексте приложения. Так что пробуй или acedCommandС или AcApDocManager::sendStringToExecute (это будет асинхронный вызов).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
Спасибо за ответ
Сделал с использованием AcApDocManager::sendStringToExecute

Оффлайн DimVer

  • ADN OPEN
  • Сообщений: 32
  • Карма: 2