Разрешаем использование глобальных имён команд в AutoCAD с помощью .NET
Идея заключается в том, чтобы позволить использование вводить английские имена команд без необходимости использовать подчеркивание. В коде определяется что команда неизвестна (“unknown”) и выполняется попытка выполнить её повторно с префиксом подчеркивания для запуска глобальной команды. Это конечно может сработать или не сработать и чтобы предотвратить бесконечный цикл необходимо установить флаг установки подчеркивания.
Кроме того нам придётся отключить автокоррекцию и автозавершение команд для того чтобы наш код работал корректно. Так как нет специальных системных переменных то это придётся сделать при помощи команды.
А вот и код:
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.Runtime;
- namespace CommandHelper
- {
- public class Commands
- {
- // Семафор для прекращения запуска обработчика неизвестной команды
- private bool _launched = false;
- [CommandMethod("CMDS")]
- public void CommandTranslation()
- {
- var doc = Application.DocumentManager.MdiActiveDocument;
- if (doc == null)
- return;
- // Автозавершение и автокоррекция вызывают проблемы,
- // так что мы их отключим
- doc.Editor.Command(
- "_.-INPUTSEARCHOPTIONS",
- "_autoComplete", "_No",
- "_autocoRrect", "_No",
- ""
- );
- // Подпишемся на событие, в обработчике которого
- // будем «префиксировать» команды
- doc.UnknownCommand += OnUnknownCommand;
- }
- [CommandMethod("CMDSX")]
- public void StopCommandTranslation()
- {
- var doc = Application.DocumentManager.MdiActiveDocument;
- if (doc == null)
- return;
- // Удаляем наш обработчик события
- doc.UnknownCommand -= OnUnknownCommand;
- }
- async void OnUnknownCommand(
- object sender, UnknownCommandEventArgs e
- )
- {
- var doc = sender as Document;
- // Проверяем, чтобы не войти в бесконечный цикл добавления префикса
- if (doc != null && !_launched)
- {
- try
- {
- // Устанавливаем семафор и вызываем команду
- _launched = true;
- await doc.Editor.CommandAsync("_" + e.GlobalCommandName);
- }
- catch { } finally
- {
- // Сбрасываем наш флаг
- _launched = false;
- }
- }
- }
- }
- }
Обратите внимание, что в английской версии 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://adn-cis.org/forum/index.php?topic=1917
Опубликовано 10.03.2015Отредактировано 10.03.2015 в 01:43:50