Не открывается нужный раздел пользовательской справки по нажатию F1

Автор Тема: Не открывается нужный раздел пользовательской справки по нажатию F1  (Прочитано 56851 раз)

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

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Другой вопрос какой именно...
а какие тут могут быть варианты? Конкретный CHM файл ведь чётко прописан (абсолютный путь).

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Если бы у меня был ответ на этот вопрос, я бы уже ответил... ;)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Да уж - Александр сам того не зная подсказал - я из-за сработавшей памяти на лисп функцию - пропустил параметр (int cmd) - а из-за типа вызова функция таки работала, но с ошибкой, исправил:
Код - C# [Выбрать]
  1. open Autodesk.AutoCAD.ApplicationServices
  2. open Autodesk.AutoCAD.Runtime
  3. open Autodesk.AutoCAD.DatabaseServices
  4. open Autodesk.AutoCAD.EditorInput
  5. open System.Runtime.InteropServices
  6. [<DllImport("acad.exe",CallingConvention=CallingConvention.Cdecl,
  7.             CharSet=CharSet.Auto)>] extern int acedSetFunHelp(string,string,string,int)
  8.  
  9. [<CommandMethod "example">]
  10. let Example()=
  11.   Application.DocumentManager.MdiActiveDocument.Editor.GetPoint("Press F1 th help...")|>ignore
  12.  
  13. type Init()=
  14.   interface IExtensionApplication with
  15.     member obj.Initialize()=
  16.       acedSetFunHelp("example","d:/lib/myhelp.chm","ThroughAttribute",0)|>ignore
  17.     member obj.Terminate()=()

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Сейчас скорее всего (при изменении соотв. имен) заработает и 2015 версия - я думаю ломилась в интернет просто за разделом которого нет (другая внутренния обработка Api).

Оффлайн Андрей БушманАвтор темы

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
В 2009 x86 работает.
Интересно.
В 2015 x86 лезет в интернет.
Подчеркивание перед именем функции ставил? Кстати разница между твоей командой и командой Димы:
1) Нет группы
2) Команда в контексте документа.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Если бы не ставил, то получил бы исключение в процессе выполнения кода.
Не обязательно. Я обратил внимание, на то, что ряд функций имеет дублированное имя (и с подчеркиванием и без).
И еще для меня пока непонятная ситуация. В ObjectARX 2013 (как и в ObjectARX 2015) в accore.lib x86 функция _acedSetFunHelp (т.е. с подчеркиванием), а в получаемом MyHelp.arx она без подчеркивания, как и в accore.dll в AutoCAD 2013
accore.dll от AutoCAD 2015 x86 у меня нет. Так что проверить не могу.

P.S.: Нашел таки дистрибутив AutoCAD 2015 x86 и вытащил из него accore.dll
И вот что вижу:
Код - INI [Выбрать]
  1. ?acedHelp@@YAHPB_W0H@Z
  2. acedHelp
  3. _acedHelp
Код - INI [Выбрать]
  1. ?acedSetFunHelp@@YAHPB_W00H@Z
  2. _acedSetFunHelp
Т.е. acedHelp можно звать и с подчеркиванием и без, хотя я не уверен что действия эквиваленты. А acedSetFunHelp только с подчеркиванием.
« Последнее редактирование: 27-06-2014, 17:16:09 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Давай пробывать бредятину замени "ThroughAttribute" на "ThroughAttribute.htm"

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Давай пробывать бредятину
Не надо. Я обратил внимание на то, что твой код работает в 2009-м, хотя почти ничем не отличается от моего, за исключением флага: Modal вместо Session. Я  в ходе экспериментов менял флаг, однако делал это то ли в 2013-м, то ли в 2015-м.

Итак, вот, что пробовал сейчас:

Код - C# [Выбрать]
  1. /* Commands.cs
  2.  * © Andrey Bushman, 2014
  3.  * При необходимости закомментируйте или раскомментируйте обозначенные ниже
  4.  * символы компиляции соответственно Вашей версии AutoCAD.
  5.  * В коде определены следующие команды:
  6.  * -  Cmd1
  7.  * -  Cmd2
  8.  */
  9.  
  10. #define AUTOCAD
  11. // #define AUTOCAD_NEWER_THAN_2012
  12. // #define AUTOCAD_NEWER_THAN_2014
  13.  
  14. using System;
  15. using System.Collections.Generic;
  16. using System.Linq;
  17. using System.Reflection;
  18. using System.Diagnostics;
  19. using System.IO;
  20. using System.Runtime.InteropServices;
  21.  
  22. #if AUTOCAD
  23. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  24. using Ap = Autodesk.AutoCAD.ApplicationServices;
  25. using Db = Autodesk.AutoCAD.DatabaseServices;
  26. using Ed = Autodesk.AutoCAD.EditorInput;
  27. using Rt = Autodesk.AutoCAD.Runtime;
  28. using Wn = Autodesk.AutoCAD.Windows;
  29. #endif
  30.  
  31. namespace Bushman.CAD.Samples.Help {
  32.   public class Commands : Rt.IExtensionApplication {
  33.  
  34.     #region PInvoke
  35.  
  36. #if AUTOCAD_NEWER_THAN_2012
  37.     const String fnc_location = "accore.dll";
  38. #else
  39.     const String fnc_location = "acad.exe";
  40. #endif
  41.  
  42. #if AUTOCAD_NEWER_THAN_2014
  43.     const String x86_Prefix = "_";
  44. #else
  45.     const String x86_Prefix = "";
  46. #endif
  47.  
  48.     #region acedSetFunHelp
  49.     const String acedSetFunHelp_Name = "acedSetFunHelp";
  50.  
  51.     [DllImport(fnc_location, CharSet = CharSet.Unicode,
  52.       CallingConvention = CallingConvention.Cdecl,
  53.       EntryPoint = "acedSetFunHelp")]
  54.     private static extern Int32 acedSetFunHelp_x64(
  55.         String functionName,
  56.         String helpFile,
  57.         String helpTopic,
  58.         Int32 cmd);
  59.  
  60.     [DllImport(fnc_location, CharSet = CharSet.Unicode,
  61.       CallingConvention = CallingConvention.Cdecl,
  62.       EntryPoint = x86_Prefix + "acedSetFunHelp")]
  63.     private static extern Int32 acedSetFunHelp_x86(
  64.         String functionName,
  65.         String helpFile,
  66.         String helpTopic,
  67.         Int32 cmd);
  68.  
  69.  
  70.     internal static Int32 acedSetFunHelp(
  71.         String functionName,
  72.         String helpFile,
  73.         String helpTopic,
  74.         Int32 cmd) {
  75.       if(IntPtr.Size == 4)
  76.         return acedSetFunHelp_x86(functionName, helpFile, helpTopic, cmd);
  77.       else
  78.         return acedSetFunHelp_x64(functionName, helpFile, helpTopic, cmd);
  79.     }
  80.     #endregion // acedSetFunHelp
  81.  
  82.     #endregion // PInvoke
  83.  
  84.     const String throughAcedSetFunHelp = "ThroughAcedSetFunHelp";
  85.  
  86.     const String f1_msg = "\nНажмите клавишу F1 для открытия нужного " +
  87.         "раздела справочной системы.\n";
  88.  
  89.     [Rt.CommandMethod("cmd1", Rt.CommandFlags.Modal)]
  90.     public static void Cmd1_Command() {
  91.  
  92.       Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  93.       if(null == doc) {
  94.         return;
  95.       }
  96.       using(doc.LockDocument()) {
  97.         doc.Editor.GetPoint(f1_msg);
  98.       }      
  99.     }
  100.  
  101.     [Rt.CommandMethod("cmd2", Rt.CommandFlags.Session)]
  102.     public static void Cmd2_Command() {
  103.  
  104.       Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  105.       if(null == doc) {
  106.         return;
  107.       }
  108.       using(doc.LockDocument()) {
  109.         doc.Editor.GetPoint(f1_msg);
  110.       }
  111.     }
  112.  
  113.     public void Initialize() {
  114.       Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  115.  
  116.       Int32 result = Commands.acedSetFunHelp("cmd1",
  117.             @"C:\public\ACAD\Debug\MyHelp\MyHelp.chm", throughAcedSetFunHelp, 0);
  118.       Int32 result2 = Commands.acedSetFunHelp("cmd2",
  119.             @"C:\public\ACAD\Debug\MyHelp\MyHelp.chm", throughAcedSetFunHelp, 0);
  120.     }
  121.     public void Terminate() { }
  122.   }
  123. }

В AutoCAD 2009 x86 успешно работает Cmd1, но не работает Cmd2 (открывает справку акада). Если в Cmd2 меняю Model на Session, то всё работает.
Однако этот фокус не проходит ни в 2013-м x86, ни в 2015-м x86: оба варианта лезут за справкой в интернет.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
В этом своём коде заменил все Session на Modal. В AutoCAD 2009 x86 почти всё заработало... А именно: кроме ThroughAttribute всё отработало как полагается. В случае ThroughAttribute получаю сообщение, что CHM файл не найден. Если добавить запись в каталоги поиска AutoCAD, то и ThroughAttribute начинает работать.

Однако можно в каталоги поиска добавить только одну запись, общую для всех плагинов: например "C:\AutoCAD\Plugins". Затем в этом каталоге размещать плагины по своим подкаталогам. Тогда можно через атрибуты указывать файл справки так:
Код - C# [Выбрать]
  1. [CommandMethod(commandGroup, commandName, null, CommandFlags.Modal, null,
  2.     @".\MyPluginName\Documentation" + chmFileName, commandName)]
В AutoCAD 2009 x86 это работает (в др. не проверял).

Это чтобы под каждый плагин не добавлять в каталоги поиска очередную запись. Чем меньше записей, тем быстрее AutoCAD будет выполнять поиск. Такой способ позволяет хранить файл справки в каталоге, отличном от каталога размещения DLL. Например, DLL файлы плагина могут размещаться в подкаталоге .\MyPlugin\bin по соответствующим подкаталогам (как показано здесь). А файл документации будет один на все версии DLL и храниться в .\MyPlugin\Documentation.
« Последнее редактирование: 27-06-2014, 18:15:07 от Андрей Бушман »

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Подводя итоги: уже в который раз убеждаюсь, что наша компания правильно делает, что не переходит с AutoCAD 2009 на более новые версии. Разница в использовании весьма ощутима как в плане скорости работы AutoCAD, так и в плане количества косяков\багов. И каждая новая версия AutoCAD лишний раз подтверждает правильность нашего выбора.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Пока проверил в AutoCAD 2013 x86 в Windows XP SP3 и AutoCAD 2013 x64 Windows 7 - всё работает. Повторить ошибку не смог.

Цитата: Boxa.Shu
Справка открылась в соответствующих разделах все 3 раза.
AutoCAD 2014 x64 , Win7 x64

Цитата: Дима_
ACAD 2010 Win7*32 - как и у автора - ThroughProcess - вызывает нужную справку, в остальных случаях по F1 - выскакивает автокадная.

Цитата: Александр Ривилис
Проверил еще в x64 AutoCAD 2012, 2013, 2014 - всё нормально
Проверил на всякий случай в x86 AutoCAD 2008, но в Win7 X64 - работает только последний вариант. При этом в этом же AutoCAD'е но в Windows XP x86 работает нормально.

Цитата: Дима_
Acad 2014*64, Win8.1:
сборка и файл помощи на рабочем столе:
сборка загруженна успешно, регистрация выполненна
THROUGHATTRIBUTE - автокад ругается что такого файла нету, после загружает свою справку
THROUGHACEDSETFUNHELP - открывает "правильную" справку - курсор на пункте about (в 2010 был на "своем" месте)
THROUGHPROCESS - открывает "правильную" справку - курсор на пункте about

сборка на рабочем столе, файл справки в папке автокада:
сборка загруженна успешно, файл справки не найден
THROUGHATTRIBUTE - открывает "правильную" справку - курсор на пункте about
THROUGHACEDSETFUNHELP - автокад "молча" загружает свою справку
THROUGHPROCESS - ругается что не удается открыть справку

Цитировать
и т.д.

В моём случае замена Sessoin на Modal помогло. У всех аналогично?

Пока получается (судя по обозначенным выше цитатам), что на одних компьютерах, для команд уровня приложения [Session], пользовательская справка работает, а на других нет... Причина непонятна.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Собрался с духом и отправил запрос в ADN DevHelp. Пока ограничил его проверкой работы acedHelp и acedSetFunHelp в AutoCAD 2013...2015 и Windows 7 x86. Дальше будет видно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Собрался с духом и отправил запрос в ADN DevHelp.
No comments...