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

ADN Club => AutoCAD .NET API => Тема начата: Дмитрий Загорулькин от 13-07-2015, 19:35:41

Название: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Дмитрий Загорулькин от 13-07-2015, 19:35:41
Здравствуйте. Решил навести порядок и красоту в своих разработках, дошли наконец руки до создания Help-файлов. Для привязки команд к разделам справки использую перегрузку CommandMethod:
Код - C# [Выбрать]
  1. public CommandMethodAttribute(string groupName, string globalName, string localizedNameId, CommandFlags flags, Type contextMenuExtensionType, string helpFileName, string helpTopic);
Создал CUIX файл для кнопочек, сделал кнопку для команды, в ней в поле макросов вбил имя команды вместе с группой. Одну кнопку поместил на ленту, а еще одну такую же - на классическую панель.
И получаю такую картину (в AutoCAD Civil 3D 2014 as AutoCAD и в AutoCAD Civil 3D 2016 as AutoCAD):
1. Если набирать имя команды в командной строке - справка по F1 вызывается моя. Причем, разницы нет, указываешь группу или нет.
2. Если вызывать справку по всплывающей подсказке кнопки на панели - тоже все в порядке.
3. Но вот с кнопкой на ленте такой фокус не проходит. Если в макросе указана группа команды - справка вызывается стандартная. Если группу убрать - моя.
Поэтому, у меня возникли вопросы:
Видео (под вечер по кнопкам плохо попадаю, поэтому в видео присутствует кривой монтаж в виде двойных нажатий клавиш F1 :) ):

Проект для опытов прилагаю, Help файл внутри папки решения в подпапке CHM (к нему нужно добавить путь поддержки, чтобы AutoCAD справку находил).
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Дмитрий Загорулькин от 16-07-2015, 19:36:17
Сегодня попробовал пойти другим путем. Файл справки и раздел можно задавать в настройках Autodesk Autoloader в файле PackageContents.xml. Как ни удивительно, но поведение при этом точно такое же. Видимо, за кулисами используются одни и те же механизмы. Очень неприятный баг, который начисто убивает идею использования собственного пространства имен для команд :(.
Видео этого безобразия:
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Александр Ривилис от 16-07-2015, 23:30:58
Вернусь из отпуска - всё перепроверю. И отправлю в ADN DevHelp.
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: German от 22-07-2015, 23:29:01
Сегодня попробовал пойти другим путем
Дмитрий Загорулькин, не могу попробовать сам пока, но весьма интересно посмотреть, что будет в третьем варианте http://knowledge.autodesk.com/support/autocad-civil-3d/learn-explore/caas/CloudHelp/cloudhelp/2016/ENU/Civil3D-DevGuide/files/GUID-FD05D402-7082-4530-9943-E7BE0ED7A399-htm.html (http://knowledge.autodesk.com/support/autocad-civil-3d/learn-explore/caas/CloudHelp/cloudhelp/2016/ENU/Civil3D-DevGuide/files/GUID-FD05D402-7082-4530-9943-E7BE0ED7A399-htm.html)
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Дмитрий Загорулькин от 23-07-2015, 10:30:44
Попробовал. Там каждому инструменту в настройках явно задается файл и раздел справки. Наличие/отсутствие группы команд (да и вообще самой команды) никак на этот механизм не может повлиять.
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Александр Ривилис от 23-07-2015, 15:06:55
Вернусь из отпуска - всё перепроверю.
Перепроверил - баг присутствует. Отправил в ADN DevHelp.
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Дмитрий Загорулькин от 23-07-2015, 15:16:12
Спасибо за проверку, значит, все-таки баг :(
Пока что решил, что буду команды именовать следующим образом: <group>.<group><command_name>, а в макросе прописывать ^C^C<group><command_name>. В таком варианте все работает хорошо, только имена команд длиннее.
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Александр Ривилис от 23-07-2015, 15:24:01
Спасибо за проверку, значит, все-таки баг :(
Во всяком случае я не нашёл ни способа обойти это поведение, ни ошибок в коде и меню.
Пока что решил, что буду команды именовать следующим образом: <group>.<group><command_name>, а в макросе прописывать ^C^C<group><command_name>. В таком варианте все работает хорошо, только имена команд длиннее.
Это немного напоминает добавление четырёхсимвольных Developer Symbol, которые когда-то регистрировались в Autodesk ( http://adndevblog.typepad.com/autocad/2012/05/registered-developer-symbols.html ), но сейчас регистрация прекращена: http://usa.autodesk.com/adsk/servlet/index?siteID=123112&id=1075006
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Дмитрий Загорулькин от 23-07-2015, 15:35:32
Да, идею как раз оттуда и взял :) Точнее, из этого документа: http://adndevblog.typepad.com/autocad/2013/01/autodesk-autoloader-white-paper.html из раздела описаний команд.
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Андрей Бушман от 23-07-2015, 16:55:01
но сейчас регистрация прекращена: http://usa.autodesk.com/adsk/servlet/index?siteID=123112&id=1075006
чем обусловлено?
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Александр Ривилис от 23-07-2015, 17:21:33
чем обусловлено?
Я могу лишь догадываться, что это потеряло актуальность. Или уже все четырёхсимвольные комбинации латинских букв были использованы за последние 25 лет (если мне не изменяет память, то регистрация RDS появилась одновременно с AutoCAD R11). ;)
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Александр Ривилис от 27-07-2015, 16:37:53
Получил ответ из ADN DevHelp. Всё оказалось еще хуже. Чтобы понять это достаточно проверить такой код:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.EditorInput;
  3. using Autodesk.AutoCAD.Runtime;
  4.  
  5. namespace HelpTest
  6. {
  7.     public class CmdClass
  8.     {
  9.         [CommandMethod ("MyGroup1", "MyCommand", null,
  10.             CommandFlags.Modal | CommandFlags.NoBlockEditor,
  11.             null, "MyTestHelp.chm", "MyTestHelpTopic1")]
  12.         public static void MyTestCommandRun1()
  13.         {
  14.             Application.ShowAlertDialog("MyTestCommand work!");
  15.         }
  16.         [CommandMethod("MyGroup2", "MyCommand", null,
  17.             CommandFlags.Modal | CommandFlags.NoBlockEditor,
  18.             null, "MyTestHelp.chm", "MyTestHelpTopic2")]
  19.         public static void MyTestCommandRun2()
  20.         {
  21.           Application.ShowAlertDialog("MyTestCommand work!");
  22.         }
  23.  
  24.     }
  25. }
Если в командной строке ввести MyGroup1.MyCommand и нажать F1, то появится справка MyTestHelpTopic2 вместо ожидаемой MyTestHelpTopic1
Объяснение очень простое. Назначение файла помощи во всех этих случаях идёт через функцию acedSetFunHelp (из ObjectARX), которая ничего про имена групп не знает и оперирует только именами команд. Имена команд здесь одинаковые и второй вызов acedSetFunHelp заменил имя раздела помощи на MyTestHelpTopic2.
Так что в текущих версиях AutoCAD ничего с этим поделать нельзя, кроме как добавлять имя группы в имя команды, что ты уже и делаешь.
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Андрей Бушман от 27-07-2015, 17:25:28
фиксить баг собираются, или по накатанной - в долгий ящик? В данном случае под "фиксить" подразумевается его устранение в ближайшем SP, а не предложение надеяться на исправление в ближайшем десятилетии.
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Александр Ривилис от 27-07-2015, 17:31:43
фиксить баг собираются, или по накатанной - в долгий ящик?
1. Они не считают это багом, т.к. так было всегда (как минимум начиная с AutoCAD R12) и никому до сих пор не мешало и судя по всему никто раньше таких вопросов не задавал.
2. В список пожеланий внесли. Но каким боком это может стрельнуть в случае если нет групп - вопрос не тривиальный.
В любом случае весь сценарий как проходил через acedSetFunHelp, так проходить и будет. Как продумать логику её работы, чтобы и с группами команд и с командами без групп нормально работало - я пока не понимаю.
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Александр Ривилис от 27-07-2015, 17:32:48
В данном случае под "фиксить" подразумевается его устранение в ближайшем SP
Однозначно нет.
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Дмитрий Загорулькин от 27-07-2015, 17:48:54
Александр Наумович, отметил как решение Ваш ответ, т.к. для себя уже считаю вопрос решенным - раз баг есть, то надо его обходить. Но вопрос-то изначально был не в том, что не воспринимаются группы команд справкой, а в том, что из командной строки справка вызывается, с кнопки на панели - тоже, а с кнопки на ленте - нет. А раз один и тот же механизм используется, то непонятно, почему такое поведение.
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Александр Ривилис от 27-07-2015, 17:58:04
Но вопрос-то изначально был не в том, что не воспринимаются группы команд справкой, а в том, что из командной строки справка вызывается, с кнопки на панели - тоже, а с кнопки на ленте - нет.
В одном случае (кнопка на ленте) AutoCAD выкидывает из "MyGroup.MyCommand" всё что после точки, воспринимая как команду "MyGroup" (а так как для неё нет отдельного назначения, то ищет среди команд AutoCAD), а в другом случае откидывает "MyGroup." и в качестве команды для поиска справки использует "MyCommand". Конечно это не правильно. Как минимум должно быть единообразие.
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Дмитрий Загорулькин от 27-07-2015, 18:06:48
Шикарно :)
Ну ладно, теперь хотя бы понятна причина. Спасибо!
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: German от 27-07-2015, 20:07:24
И еще сохраняют группы команд в Autoloader. Шикарнейше :D
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Александр Ривилис от 27-07-2015, 20:08:35
И еще сохраняют группы команд в Autoloader. Шикарнейше :D
Юмора не понял. Это о чем?
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: German от 27-07-2015, 20:49:16
Но вопрос-то изначально был не в том, что не воспринимаются группы команд справкой, а в том, что из командной строки справка вызывается, с кнопки на панели - тоже, а с кнопки на ленте - нет.
В одном случае (кнопка на ленте) AutoCAD выкидывает из "MyGroup.MyCommand" всё что после точки, воспринимая как команду "MyGroup" (а так как для неё нет отдельного назначения, то ищет среди команд AutoCAD), а в другом случае откидывает "MyGroup." и в качестве команды для поиска справки использует "MyCommand". Конечно это не правильно. Как минимум должно быть единообразие.
IMHO, другими словами, это баг. И его при вводе нового инструмента автоматической загрузки логично было исправить сразу.
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Александр Ривилис от 27-07-2015, 22:06:38
И его при вводе нового инструмента автоматической загрузки логично было исправить сразу.
Инструмент автоматической загрузки ввели в AutoCAD 2012, а об этом баге им сообщили только сейчас - видимо раньше никто не сталкивался.
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Андрей Бушман от 28-07-2015, 11:04:44
Они не считают это багом
Я смотрю "у них" это универсальный ответ, обозначающий то, что исправлений не будет. Без комментариев...
Название: Re: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?
Отправлено: Александр Ривилис от 28-07-2015, 11:48:52
Без комментариев...
И это правильно ибо п. 3.9 Правил форума (http://adn-cis.org/forum-rules.html) еще никто не отменял.