Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?

Автор Тема: Command Group, Help - файл и кнопка на ленте. Как подружить? И надо ли?  (Прочитано 14196 раз)

0 Пользователей и 4 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Здравствуйте. Решил навести порядок и красоту в своих разработках, дошли наконец руки до создания 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 справку находил).
« Последнее редактирование: 21-07-2015, 11:46:19 от Александр Ривилис »

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Сегодня попробовал пойти другим путем. Файл справки и раздел можно задавать в настройках Autodesk Autoloader в файле PackageContents.xml. Как ни удивительно, но поведение при этом точно такое же. Видимо, за кулисами используются одни и те же механизмы. Очень неприятный баг, который начисто убивает идею использования собственного пространства имен для команд :(.
Видео этого безобразия:
« Последнее редактирование: 21-07-2015, 11:45:35 от Александр Ривилис »

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13881
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Вернусь из отпуска - всё перепроверю. И отправлю в ADN DevHelp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн German

  • ADN Club
  • **
  • Сообщений: 84
  • Карма: 13
Сегодня попробовал пойти другим путем
Дмитрий Загорулькин, не могу попробовать сам пока, но весьма интересно посмотреть, что будет в третьем варианте 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

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Попробовал. Там каждому инструменту в настройках явно задается файл и раздел справки. Наличие/отсутствие группы команд (да и вообще самой команды) никак на этот механизм не может повлиять.

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13881
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Вернусь из отпуска - всё перепроверю.
Перепроверил - баг присутствует. Отправил в ADN DevHelp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Спасибо за проверку, значит, все-таки баг :(
Пока что решил, что буду команды именовать следующим образом: <group>.<group><command_name>, а в макросе прописывать ^C^C<group><command_name>. В таком варианте все работает хорошо, только имена команд длиннее.

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13881
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Спасибо за проверку, значит, все-таки баг :(
Во всяком случае я не нашёл ни способа обойти это поведение, ни ошибок в коде и меню.
Пока что решил, что буду команды именовать следующим образом: <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
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Да, идею как раз оттуда и взял :) Точнее, из этого документа: http://adndevblog.typepad.com/autocad/2013/01/autodesk-autoloader-white-paper.html из раздела описаний команд.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13881
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
чем обусловлено?
Я могу лишь догадываться, что это потеряло актуальность. Или уже все четырёхсимвольные комбинации латинских букв были использованы за последние 25 лет (если мне не изменяет память, то регистрация RDS появилась одновременно с AutoCAD R11). ;)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Дмитрий Загорулькин 27-07-2015, 17:35:39

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13881
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Получил ответ из 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 ничего с этим поделать нельзя, кроме как добавлять имя группы в имя команды, что ты уже и делаешь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
фиксить баг собираются, или по накатанной - в долгий ящик? В данном случае под "фиксить" подразумевается его устранение в ближайшем SP, а не предложение надеяться на исправление в ближайшем десятилетии.

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13881
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
фиксить баг собираются, или по накатанной - в долгий ящик?
1. Они не считают это багом, т.к. так было всегда (как минимум начиная с AutoCAD R12) и никому до сих пор не мешало и судя по всему никто раньше таких вопросов не задавал.
2. В список пожеланий внесли. Но каким боком это может стрельнуть в случае если нет групп - вопрос не тривиальный.
В любом случае весь сценарий как проходил через acedSetFunHelp, так проходить и будет. Как продумать логику её работы, чтобы и с группами команд и с командами без групп нормально работало - я пока не понимаю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13881
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
В данном случае под "фиксить" подразумевается его устранение в ближайшем SP
Однозначно нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение