21/05/2014
Определение прерывания команды при выполнении acedCommandC
Выполнение команд в AutoCAD сейчас возможна двумя способами вместо одного варианта функции acedCommand. Функция acedCommandS проще для использования, но требует задания сразу всех параметров, которые необходимы AutoCAD для завершения команды и без ввода данных пользователем. При выполнении команды при помощи функции acedCommandS её нельзя прервать.Функция acedCommandC используется в том случае когда может возникнуть необходимость паузы для ввода данных пользователем. Тут возможно прерывание пользователем выполнения команды вместо ввода данных. Чтобы идентифицировать это событие в коде используются функции "acedCmdCWasCancelled" и "acedCallBackOnCancel". Так же в силу асинхронности функции acedCommandC, завершение команды может быть идентифицировано только в функции обратного вызова, как в следующем коде.
Код - C++: [Выделить]
- #include "acedCmdNF.h"
- static void AdskMyTestCommand()
- {
- ads_point pt1;
- int rt = acedGetPoint(
- NULL,
- _T("\nУкажите первую точку: "), pt1);
- int rs = acedCommandC
- (
- &MyCallback,
- NULL,
- RTSTR,
- _T("_LINE"),
- RT3DPOINT,
- pt1,
- RTNONE
- );
- acutPrintf(ACRX_T("\nПосле вызова acedCommandC.
- acedCommandC выполняется асинхронно..."));
- }
- static int MyCallback(void * pData)
- {
- if (acedCmdCWasCancelled())
- {
- acutPrintf(ACRX_T("\nКоманда прервана..."));
- return 0;
- }
- if(isLineActive())
- {
- int rs = acedCommandC
- (
- &MyCallback,
- NULL,
- RTSTR,
- PAUSE,
- RTNONE
- );
- acedCallBackOnCancel();
- return 1;
- }
- CallWhenLineDone();
- return 0;
- }
- static void CallWhenLineDone()
- {
- acutPrintf(ACRX_T("\nКоманда завершена."));
- }
- static Adesk::Boolean isLineActive()
- {
- struct resbuf rb;
- acedGetVar(_T("CMDNAMES"),&rb);
- if (_tcsstr(rb.resval.rstring, _T("LINE")))
- return Adesk::kTrue;
- return Adesk::kFalse;
- }
Источник: http://adndevblog.typepad.com/autocad/2014/05/recognising-cancel-when-using-acedcommandc.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=744
Опубликовано 21.05.2014