26/10/2020
Как обновить информацию в командной строке AutoCAD?
Вопрос: В процессе длительного выполнения кода необходимо обновлять информацию в командной строке AutoCAD (например, процент выполнения). В старых версиях AutoCAD достаточно было вызвать acedPrompt(L""). Начиная с AutoCAD 2015 это не помогает.
Ответ: По-прежнему в последних версиях AutoCAD lisp-выражение (princ) позволяет обновить содержимое командной строки. В ObjectARX для этой цели приходится использовать недокументированную функцию adsi_flushcommandline(). При этом следует учитывать, что для обновления интерфейса AutoCAD ему необходимо дать возможность обработать свои сообщения. Для этой цели можно воспользоваться такой функцией:
Код - C++: [Выделить]
- int OnIdleAcadInternal(void) {
- CWinApp* app = acedGetAcadWinApp();
- CWnd* wnd = app->GetMainWnd();
- MSG msg;
- while (::PeekMessage(&msg, wnd->m_hWnd, 0, 0, PM_NOREMOVE)) {
- if (!app->PumpMessage()) {
- ::PostQuitMessage(0);
- break;
- }
- }
- LONG lIdle = 0;
- // while (app->OnIdle(lIdle++)&& lIdle < 1000);
- return RSRSLT;
- }
Тестовый код может выглядеть вот так:
Код - C++: [Выделить]
- //-----------------------------------------------------------------------------
- //----- acrxEntryPoint.cpp
- //-----------------------------------------------------------------------------
- #include "StdAfx.h"
- #include "resource.h"
- //-----------------------------------------------------------------------------
- #define szRDS _RXST("")
- // Эта функция выполняет обновление командной строки
- void __cdecl adsi_flushcommandline(void);
- int OnIdleAcadInternal(void) {
- CWinApp* app = acedGetAcadWinApp();
- CWnd* wnd = app->GetMainWnd();
- MSG msg;
- while (::PeekMessage(&msg, wnd->m_hWnd, 0, 0, PM_NOREMOVE)) {
- if (!app->PumpMessage()) {
- ::PostQuitMessage(0);
- break;
- }
- }
- LONG lIdle = 0;
- // while (app->OnIdle(lIdle++)&& lIdle < 1000);
- return RSRSLT;
- }
- //-----------------------------------------------------------------------------
- //----- ObjectARX EntryPoint
- class CTestCommandLineApp : public AcRxArxApp {
- public:
- CTestCommandLineApp() : 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 RivilisTestCommandLine() {
- for (int i = 0; i <= 100; i++)
- {
- acutPrintf(_T("\rПроцент выполнения: %d%%"), i);
- OnIdleAcadInternal();
- adsi_flushcommandline();
- Sleep(100);
- }
- }
- };
- //-----------------------------------------------------------------------------
- IMPLEMENT_ARX_ENTRYPOINT(CTestCommandLineApp)
- ACED_ARXCOMMAND_ENTRY_AUTO(CTestCommandLineApp, Rivilis, TestCommandLine, TestCommandLine, ACRX_CMD_MODAL, NULL)
Результат:
Автор: Александр Ривилис
Опубликовано 26.10.2020
Опубликовано 26.10.2020