ADN Club > ObjectARX

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

(1/2) > >>

Ura:
Здравствуйте!
Подскажите как можно вызвать команду, добавленную в Автокад из другой команды?

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:
Уточняю вопрос
Делаем программу, указанную ниже

--- Код - C++ [Выбрать] ---static void TestAppcmdGlobalName1(void) {   acutPrintf(L">>> cmdGlobalName1() - START\n\r");   acedCommandS(RTSTR, _T("cmdGlobalName2"), 0);   acutPrintf(L">>> cmdGlobalName1() - END\n\r");}static void TestAppcmdGlobalName2(void) {   acutPrintf(L">>> cmdGlobalName2() - START\n\r");}ACED_ARXCOMMAND_ENTRY_AUTO(СTestApp, TestApp, cmdGlobalName1, cmdLocalName1, ACRX_CMD_TRANSPARENT, NULL)ACED_ARXCOMMAND_ENTRY_AUTO(СTestApp, TestApp, cmdGlobalName2, cmdLocalName2, ACRX_CMD_TRANSPARENT, NULL) Команда cmdGlobalName2 выполняется и выводится текстовое сообщение
>>> cmdGlobalName2() - START

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

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

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

Александр Ривилис:
Вместо:

--- Код - C++ [Выбрать] ---acedCommandS(RTSTR, _T("cmdGlobalName2"), 0);должно быть

--- Код - C++ [Выбрать] ---acedCommandS(RTSTR, _T("_cmdGlobalName2"), 0);или

--- Код - C++ [Выбрать] ---acedCommandS(RTSTR, _T("cmdLocalName2"), 0);


Вот полный код:

--- Код - C++ [Выбрать] ---//-----------------------------------------------------------------------------//----- acrxEntryPoint.cpp//-----------------------------------------------------------------------------#include "StdAfx.h"#include "resource.h"#include "acedcmdnf.h"//-----------------------------------------------------------------------------#define szRDS _RXST("ADSK") //-----------------------------------------------------------------------------//----- ObjectARX EntryPointclass CTestApp : public AcRxArxApp { public:  CTestApp() : AcRxArxApp() {}   virtual AcRx::AppRetCode On_kInitAppMsg(void *pkt) {    AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg(pkt);    return (retCode);  }   virtual AcRx::AppRetCode On_kUnloadAppMsg(void *pkt) {    AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg(pkt);    return (retCode);  }   virtual void RegisterServerComponents() {     }   static void TestAppcmdGlobalName1(void) {    acutPrintf(L">>> cmdGlobalName1() - START\n");    acedCommandS(RTSTR, _T("_cmdGlobalName2"), 0);    acutPrintf(L">>> cmdGlobalName1() - END\n");  }  static void TestAppcmdGlobalName2(void) {    acutPrintf(L">>> cmdGlobalName2() - START\n");    acutPrintf(L">>> cmdGlobalName2() - END\n");  }}; //-----------------------------------------------------------------------------IMPLEMENT_ARX_ENTRYPOINT(CTestApp) ACED_ARXCOMMAND_ENTRY_AUTO(CTestApp, TestApp, cmdGlobalName1, cmdLocalName1, ACRX_CMD_TRANSPARENT, NULL)ACED_ARXCOMMAND_ENTRY_AUTO(CTestApp, TestApp, cmdGlobalName2, cmdLocalName2, ACRX_CMD_TRANSPARENT, NULL)

Ura:
Я неправильно указал в тестовом примере флаги запуска для cmdGlobalName2
С флагом ACRX_CMD_TRANSPARENT программа отрабатывает правильно
Если я меняю флаг на ACRX_CMD_MODAL | ACRX_CMD_SESSION  - программа не вызывается

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

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


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

Александр Ривилис:
acedCommandS(RTSTR, _T("_cmdGlobalName2"), 0); возвращает -5001 (eError), потому что нельзя использовать acedCommandS для вызова команды, работающей в контексте приложения. Так что пробуй или acedCommandС или AcApDocManager::sendStringToExecute (это будет асинхронный вызов).

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии