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

10/03/2015

Разрешаем использование глобальных имён команд в AutoCAD с помощью .NET

Идея заключается в том, чтобы позволить использование вводить английские имена команд без необходимости использовать подчеркивание. В коде определяется что команда неизвестна (“unknown”) и выполняется попытка выполнить её повторно с префиксом подчеркивания для запуска глобальной команды. Это конечно может сработать или не сработать и чтобы предотвратить бесконечный цикл необходимо установить флаг установки подчеркивания.

Кроме того нам придётся отключить автокоррекцию и автозавершение команд для того чтобы наш код работал корректно. Так как нет специальных системных переменных то это придётся сделать при помощи команды.

А вот и код:

Код - C#: [Выделить]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.Runtime;
  3.  
  4. namespace CommandHelper
  5. {
  6.   public class Commands
  7.   {
  8.     // Семафор для прекращения запуска обработчика неизвестной команды
  9.     private bool _launched = false;
  10.  
  11.     [CommandMethod("CMDS")]
  12.     public void CommandTranslation()
  13.     {
  14.       var doc = Application.DocumentManager.MdiActiveDocument;
  15.       if (doc == null)
  16.         return;
  17.  
  18.       // Автозавершение и автокоррекция вызывают проблемы,
  19.       // так что мы их отключим
  20.  
  21.       doc.Editor.Command(
  22.         "_.-INPUTSEARCHOPTIONS",
  23.         "_autoComplete", "_No",
  24.         "_autocoRrect", "_No",
  25.         ""
  26.       );
  27.  
  28.       // Подпишемся на событие, в обработчике которого
  29.       // будем «префиксировать» команды
  30.  
  31.       doc.UnknownCommand += OnUnknownCommand;
  32.     }
  33.  
  34.     [CommandMethod("CMDSX")]
  35.     public void StopCommandTranslation()
  36.     {
  37.       var doc = Application.DocumentManager.MdiActiveDocument;
  38.       if (doc == null)
  39.         return;
  40.  
  41.       // Удаляем наш обработчик события
  42.  
  43.       doc.UnknownCommand -= OnUnknownCommand;
  44.     }
  45.  
  46.     async void OnUnknownCommand(
  47.       object sender, UnknownCommandEventArgs e
  48.     )
  49.     {
  50.       var doc = sender as Document;
  51.  
  52.       // Проверяем, чтобы не войти в бесконечный цикл добавления префикса
  53.  
  54.       if (doc != null && !_launched)
  55.       {
  56.         try
  57.         {
  58.           // Устанавливаем семафор и вызываем команду
  59.  
  60.           _launched = true;
  61.           await doc.Editor.CommandAsync("_" + e.GlobalCommandName);
  62.         }
  63.         catch { }        finally
  64.         {
  65.           // Сбрасываем наш флаг
  66.  
  67.           _launched = false;
  68.         }
  69.       }
  70.     }
  71.   }
  72. }

Обратите внимание, что в английской версии AutoCAD этот код ничего не будет делать. Во-первых, вы не получите события «неизвестная команда» при запуске глобальной команды. Во-вторых, префикс ничего не меняет при запуске команды. Ну и для запуска этого кода потребуется как минимум AutoCAD 2015, так как он зависит от Editor.CommandAsync().

Примечание переводчика:

По странному стечению обстоятельств в AutoCAD 2015 Russian в команде _.-INPUTSEARCHOPTIONS (-НАСТРВВОДПОИСК) нет опции _autocoRect. Сравните:

Command: _.-INPUTSEARCHOPTIONS
Current settings: AutoComplete = Y, AutoCorrect = Y, System variable = Y, Content = Y, Midstring = Y, Delay=0.30
Enter an input search Option [autoComplete/autocoRrect/System variables/conTent/Midstring/Delay]:

Команда: _.-INPUTSEARCHOPTIONS
Текущие настройки: автозавершение = Н, системная переменная = Н, содержимое = Н, внутри строки = Н, задержка = 0.30
Введите параметр поиска при вводе [автоЗавершение/системная пЕременная/соДержимое/внУтри строки/задерЖка]:

 

Источник: http://through-the-interface.typepad.com/through_the_interface/2015/02/enabling-global-commands-on-localized-autocad-versions-using-net.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=1917

Опубликовано 10.03.2015
Отредактировано 10.03.2015 в 01:43:50