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

18/06/2020

Переопределение клавиши вызова Помощи при помощи CUI API

Существует общая потребность изменить назначение клавиши вызова Помощи с F1 на какую-нибудь другую клавишу (или сочетание клавиш), так как на клавиатуре F1 и ESC находятся рядом, а клавиша ESC используется для отмены запущенной команды или отмены выбранных объектов. Поскольку клавиша  F1 соседствует с ESC - шансы нажатия этой клавиши случайно довольно высоки. F1 приводит к появлению окно справки, что в указанных случаях является контрпродуктивным.

Чтобы избежать этого, мы можем присвоить F1 команде Отмена, а CTRL + ALT + H для справки.

Код - C#: [Выделить]
  1. public static void RedefineHelpKey()
  2. {
  3.     string mainCuiFile = (string)Application.GetSystemVariable("MENUNAME");
  4.     mainCuiFile += ".cuix";
  5.     var doc = Application.DocumentManager.MdiActiveDocument;
  6.     var db = doc.Database;
  7.     var ed = doc.Editor;
  8.     CustomizationSection cs = new CustomizationSection(mainCuiFile);
  9.     AcceleratorCollection acCollection = cs.MenuGroup.Accelerators;
  10.     // Получаем макро для меню Помощь.
  11.     var macros = from MacroGroup mg in cs.MenuGroup.MacroGroups
  12.                     from MenuMacro mm in mg.MenuMacros
  13.                     where mm.ElementID.Equals("ID_Help") || mm.ElementID.Equals("ID_Cancel")
  14.                     select mm;
  15.     foreach (MenuMacro menuMacro in macros)
  16.     {
  17.         if (menuMacro.ElementID.Equals("ID_Help"))
  18.         {
  19.             MenuAccelerator macHelp = new MenuAccelerator(menuMacro,
  20.                                         /*ShortCutKeyCombination*/"CTRL+ALT+H",
  21.                                             cs.MenuGroup);
  22.             if (acCollection.Contains(macHelp))
  23.             {
  24.                 ed.WriteMessage($"\n Уже содержит клавиши.");
  25.             }
  26.             else
  27.             {
  28.                 acCollection.Add(macHelp);
  29.             }
  30.         }
  31.         if (menuMacro.ElementID.Equals("ID_Cancel"))
  32.         {
  33.             //Assigning Cancel to F1
  34.             MenuAccelerator macCancel =
  35.                 new MenuAccelerator(menuMacro,
  36.                 /*ShortCutKeyCombination*/"F1",
  37.                                                     cs.MenuGroup);
  38.             if (acCollection.Contains(macCancel))
  39.             {
  40.                 ed.WriteMessage($"\n Уже содержит клавиши.");
  41.             }
  42.             else
  43.             {
  44.                 acCollection.Add(macCancel);
  45.             }
  46.         }
  47.     }
  48.     // Сохраняем CUIX - это создаст и его бэкап.
  49.     cs.Save(true);
  50. }
           

Замечание:

Причина того, что изменения не произошли сразу же, связана с тем, что мы меняем основное меню, так что требуется перезапуск AutoCAD.

Примечание переводчика: Можно воспользоваться методом Application.ReloadAllMenus для перезагрузки всех меню без перезапуска AutoCAD

А это команда показывает переопределённые нами клавиши:

Код - C#: [Выделить]
  1. [CommandMethod("LISTMAC")]
  2. public static void ListMenuAccelerators()
  3. {
  4.     var doc = Application.DocumentManager.MdiActiveDocument;
  5.     var db = doc.Database;
  6.     var ed = doc.Editor;
  7.     string mainCuiFile = (string)Application.GetSystemVariable("MENUNAME");
  8.     mainCuiFile += ".cuix";
  9.     CustomizationSection cs = new CustomizationSection(mainCuiFile);
  10.     AcceleratorCollection acCollection = cs.MenuGroup.Accelerators;
  11.     var q = from MenuAccelerator menuAcltr in acCollection
  12.             where menuAcltr.Name.Contains("Help") ||
  13.                 menuAcltr.Name.Contains("Cancel")
  14.             select menuAcltr;
  15.     if (!= null && q.ToList().Count > 0)
  16.     {
  17.         foreach (var m in q.ToList())
  18.         {
  19.             ed.WriteMessage($"\n Имя: {m.Name}\n\tКлавиши: {m.AcceleratorShortcutKey}");
  20.         }
  21.     }
  22. }

Источник: https://adndevblog.typepad.com/autocad/2020/06/redefining-help-shortcut-key-with-cui-api.html

 

Автор перевода: Александр Ривилис
Опубликовано 18.06.2020