ADN Open CIS
Сообщество программистов Autodesk в СНГ

21/05/2014

Определение прерывания команды при выполнении acedCommandC

Выполнение команд в AutoCAD сейчас возможна двумя способами вместо одного варианта функции acedCommand. Функция acedCommandS проще для использования, но требует задания сразу всех параметров, которые необходимы AutoCAD для завершения команды и без ввода данных пользователем. При выполнении команды при помощи функции acedCommandS её нельзя прервать.

Функция acedCommandC используется в том случае когда может возникнуть необходимость паузы для ввода данных пользователем. Тут возможно прерывание пользователем выполнения команды вместо ввода данных. Чтобы идентифицировать это событие в коде используются функции "acedCmdCWasCancelled" и "acedCallBackOnCancel". Так же в силу асинхронности функции acedCommandC, завершение команды может быть идентифицировано только в функции обратного вызова, как в следующем коде.

Код - C++: [Выделить]
  1. #include "acedCmdNF.h"
  2.  
  3. static void AdskMyTestCommand()
  4. {
  5.     ads_point pt1;
  6.     int rt = acedGetPoint(
  7.         NULL,
  8.         _T("\nУкажите первую точку: "), pt1);
  9.  
  10.     int rs = acedCommandC
  11.                 (
  12.                     &MyCallback,
  13.                     NULL,
  14.                     RTSTR,
  15.                     _T("_LINE"),
  16.                     RT3DPOINT,
  17.                     pt1,
  18.                     RTNONE
  19.                 );
  20.  
  21.     acutPrintf(ACRX_T("\nПосле вызова acedCommandC.
  22.                         acedCommandC выполняется асинхронно..."));
  23. }
  24.  
  25. static int MyCallback(void * pData)
  26. {
  27.     if (acedCmdCWasCancelled())
  28.     {
  29.         acutPrintf(ACRX_T("\nКоманда прервана..."));
  30.         return 0;
  31.     }
  32.  
  33.     if(isLineActive())
  34.     {
  35.         int rs = acedCommandC
  36.             (
  37.                 &MyCallback,
  38.                 NULL,
  39.                 RTSTR,
  40.                 PAUSE,
  41.                 RTNONE
  42.             );
  43.  
  44.         acedCallBackOnCancel();
  45.  
  46.         return 1;
  47.     }
  48.  
  49.     CallWhenLineDone();
  50.  
  51.     return 0;
  52. }
  53.  
  54. static void CallWhenLineDone()
  55. {
  56.     acutPrintf(ACRX_T("\nКоманда завершена."));
  57. }
  58.  
  59. static Adesk::Boolean isLineActive()
  60. {
  61.     struct resbuf rb;
  62.     acedGetVar(_T("CMDNAMES"),&rb);
  63.     if (_tcsstr(rb.resval.rstring, _T("LINE")))
  64.         return Adesk::kTrue;
  65.     return Adesk::kFalse;
  66. }

 

Источник: 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