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

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

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

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
На вкус и цвет все фломастеры разные - мне так не удобней.
Тоже правда, я из соображений что отладка так точно быстрей (поменять аргументы не требует перезагрузки), но пожалуйста могу и командой (в 2010x86 работает - проверял):
Код - 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)
  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","About")|>ignore
  17.     member obj.Terminate()=()

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Хм. А в 2009-ом работает?
Не до конца...

AutoCAD 2009 SP3 x86 Enu. Пробовал два варианта.
Первый:
Цитировать
(testhelp "example" "C:/public/ACAD/Debug/dimas_help_sample/myhelp.chm" "About")
(defun c:example()(getpoint "Есть время на F1"))
EXAMPLE
Второй:
Цитировать
(testhelp "example" "C:/public/ACAD/Debug/dimas_help_sample/myhelp.chm" "ThroughAttribute")
(defun c:example()(getpoint "Есть время на F1"))
EXAMPLE
Пользовательская справка открывается, но в обоих случаях текущим является первый раздел About (см. вложение).

Я не уверен, да и 2015 у меня нет, а точно acedSetFunHelp не скомпилирует (нужен именно _acedSetFunHelp) ? Проверь - если не сложно.
C++ компилятор от Microsoft для функций x86 теперь автоматом добавляет префикс в виде подчёркивания. Такой вот "подарочек" программистам... Поскольку я использую x86, то наличие обозначенного префикса (начиная с версии AutoCAD 2015) является необходимым.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
По поводу префикса для x86:
Цитировать
__stdcall
Соглашение об оформлении имен
К имени добавляется префикс в виде символа подчеркивания (_). После имени добавляется знак @, за которым следует количество байтов (в десятичном представлении) в списке аргументов. Поэтому функция, объявленная как int func( int a, double b ) декорируется следующим образом: _func@12
...
На процессорах ARM и 64-разрядных процессорах соглашение __stdcall принимается и игнорируется компилятором;
источник здесь.

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
C++ компилятор от Microsoft для функций x86 теперь автоматом добавляет префикс в виде подчёркивания.
Извини за назойливость - точно не скомпилирует?

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
точно не скомпилирует?
скомпилировать-то он скомпилирует, но во время выполнения обязательно возникнет ошибка:
Цитировать
Исключение типа "System.EntryPointNotFoundException" возникло в dimas_help_sample.dll, но не было обработано в коде пользователя

Additional information: Unable to find an entry point named 'acedSetFunHelp' in DLL 'accore.dll'.

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

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

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Похоже, что в этом случае используется какая-то другая функция, отличная от той, что применяется в случае пользовательских команд.
Я тоже об этом думал...
Цитировать
Пользовательская справка открывается, но в обоих случаях текущим является первый раздел About
Там у тебя два сомнительных момента - во первых топик по другому называется (пробела нет), во вторых в одной сессии не факт что на одну команду можно переназначать, НО это все лирика - по ходу мой косяк - я копипастил название из твого chm (для вставки в команду) и видимо просто не закрыл его - то есть он "повторно" открылся на старом месте - сейчас проверил - да всегда About - в общем надо "порыть" еще.

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

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

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
и видимо просто не закрыл его - то есть он "повторно" открылся на старом месте
этой части фразы я не понял (очередные "точки\запятые" видимо).

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Открылась справка на About, я зашел в топик "Through Process", скопипастил его название и не закрыв ввел в функцию автокада на команду example2, при вызове команды т.к. chm уже открыт винда просто активировала окно (естественно на той-же вкладке где и была) - и я ошибочно решил - что все в  порядке.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не понятно, почему тогда работает F1 для родных команд AutoCAD... Похоже, что в этом случае используется какая-то другая функция, отличная от той, что применяется в случае пользовательских команд. Это, мягко говоря, было бы очень странно...
Ну почему же другая функция? Скорее всего таже самая. Но только для стандартных команд AutoCAD в его справке есть соответствующие разделы для команд.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Но только для стандартных команд AutoCAD в его справке есть соответствующие разделы для команд.
В качестве значений параметров важны имя CHM файла и идентификатор (в виде строки) нужного раздела. Оба указаны в моём коде. А вы что подразумеваете под "разделами", если не это?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
В качестве значений параметров важны имя CHM файла и идентификатор (в виде строки) нужного раздела. Оба указаны в моём коде. А вы что подразумеваете под "разделами", если не это?
Вот такое впечатление, что у тебя AutoCAD игнорирует имя файла при вызове справке.

Ну и на всякий случай исходник (cpp-файл) для arx-файла, который я просил тестировать:
Код - C++ [Выбрать]
  1. //-----------------------------------------------------------------------------
  2. //----- acrxEntryPoint.cpp
  3. //-----------------------------------------------------------------------------
  4. #include "StdAfx.h"
  5. #include "resource.h"
  6.  
  7. //-----------------------------------------------------------------------------
  8. #define szRDS _RXST("")
  9. const TCHAR ThroughAcedSetFunHelp[] = _T("ThroughAcedSetFunHelp");
  10. CString helpPath;
  11. CString helpTopic;
  12.  
  13. //-----------------------------------------------------------------------------
  14. //----- ObjectARX EntryPoint
  15. class CMyHelpApp : public AcRxArxApp {
  16.  
  17. public:
  18.   CMyHelpApp () : AcRxArxApp () {}
  19.  
  20.   void GetHelpPath()
  21.   {
  22.     TCHAR buffer[_MAX_PATH] = _T("");
  23.     GetModuleFileName(_hdllInstance,buffer,sizeof(buffer));
  24.     TCHAR path_buffer[_MAX_PATH];
  25.     TCHAR drive[_MAX_DRIVE];
  26.     TCHAR dir[_MAX_DIR];
  27.     TCHAR fname[_MAX_FNAME];
  28.     TCHAR ext[_MAX_EXT];
  29.     _tsplitpath( buffer, drive, dir, fname, ext );
  30.     _tmakepath(path_buffer,drive,dir,fname,_T(".chm"));
  31.     helpPath = path_buffer;
  32.   }
  33.  
  34.   virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  35.     // TODO: Load dependencies here
  36.  
  37.     // You *must* call On_kInitAppMsg here
  38.     AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
  39.  
  40.     // TODO: Add your initialization code here
  41.     GetHelpPath();
  42.  
  43.     return (retCode) ;
  44.   }
  45.  
  46.   virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  47.     // TODO: Add your code here
  48.  
  49.     // You *must* call On_kUnloadAppMsg here
  50.     AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
  51.  
  52.     // TODO: Unload dependencies here
  53.  
  54.     return (retCode) ;
  55.   }
  56.  
  57.   virtual void RegisterServerComponents () {
  58.   }
  59.   // Команда AcedSetFunHelp
  60.   static void MyGroupThroughAcedSetFunHelp () {
  61.     acedSetFunHelp(ThroughAcedSetFunHelp,LPCTSTR(helpPath),ThroughAcedSetFunHelp,0);
  62.     ads_point p;
  63.     acutPrintf(_T("\nPath=%s"),LPCTSTR(helpPath));
  64.     acedGetPoint(NULL,_T("\nНажмите F1 для справки: "), p);
  65.   }
  66.   // Команда ThroughAcedHelp
  67.   static void MyGroupThroughAcedHelp () {
  68.     acedHelp(LPCTSTR(helpPath),ThroughAcedSetFunHelp,0);
  69.   }
  70.  
  71. } ;
  72.  
  73. //-----------------------------------------------------------------------------
  74. IMPLEMENT_ARX_ENTRYPOINT(CMyHelpApp)
  75.  
  76. ACED_ARXCOMMAND_ENTRY_AUTO(CMyHelpApp, MyGroup, ThroughAcedSetFunHelp, ThroughAcedSetFunHelp, ACRX_CMD_MODAL, NULL)
  77. ACED_ARXCOMMAND_ENTRY_AUTO(CMyHelpApp, MyGroup, ThroughAcedHelp, ThroughAcedHelp, ACRX_CMD_MODAL, NULL)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
но ведь функции возвращали 5100, сообщая тем самым, что "всё пучком"...
Читаем документацию по функции acedSetFunHelp:
Цитировать
acedSetFunHelp() returns RTNORM if it is successful. If pszFunctionName does not start with C:, it returns RTERROR. No checking of the acedHelp() parameters (pszHelpfile, pszTopic, and iCmd) is done until the Help call is actually made.
Т.е. наличие файла и раздела для справки эта функция не проверяет. С другой стороны явный баг в документации по поводу требования C: Это требование действительно есть, но в lisp-функции (SetFunHelp ...), но не в функции acedSetFunHelp
Документация по функции acedHelp говорит:
Цитировать
The acedHelp() function returns RTNORM if it is successful. It returns RTERROR if the Help file is not found. Your application does not have to generate error messages because HTML Help reports errors directly to the user.
Значит help-файл находится. Другой вопрос какой именно...

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение