ADN Club > ObjectARX
Как вызвать команду программно из другой команды?
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 (это будет асинхронный вызов).
Навигация
Перейти к полной версии