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

ADN Club => AutoLisp / VisualLISP и DCL => Тема начата: Балиев от 11-12-2014, 15:22:14

Название: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Балиев от 11-12-2014, 15:22:14
Тема, насколько я понимаю, не новая. Но решения найти не удалось, поэтому пишу сюда.
Есть приложение, написанное на AutoLISP. Есть PackageContents.xml для работы по технологии "bandle", в котором соответствующим образом указан help-файл и команды, которые должны "хелпится" по нажатию F1. Но вся эта, извините, хрень не работает - при нажатии на F1 в появляющемся окне аутодесковского браузера сообщается, что файл не найден. При этом само приложение работает и help-файл вызывается, но не по F1, а кнопкой в окошке приложения.

Буду благодарен, если кто-нибудь выложит пример файла PackageContents.xml  для приложения на AutoLISP с работающей кнопкой F1. Ну, или просто объяснит "где я дурак".
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Александр Ривилис от 11-12-2014, 15:41:16
Приветствую на форуме.
Буду благодарен, если кто-нибудь выложит пример файла PackageContents.xml  для приложения на AutoLISP с работающей кнопкой F1. Ну, или просто объяснит "где я дурак".
Гадать на кофейной гуще не будем - выкладывай свой bundle вместе с help-файлом.
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Балиев от 11-12-2014, 15:56:39
Лови.
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Александр Ривилис от 11-12-2014, 18:00:11
Так. У меня появляется обычная справка AutoCAD (проверял в 2013-ой версии). Посмотрю что можно сделать. Если не получится - пошлю в ADN DevHelp.
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Балиев от 11-12-2014, 18:07:12
А когда ты жмешь на F1: после запуска приложения или просто наведя курсор на иконку?
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Александр Ривилис от 11-12-2014, 18:16:08
А когда ты жмешь на F1: после запуска приложения или просто наведя курсор на иконку?
Наведя курсор на иконку. Насколько я помню из диалогового окна, написанного на lisp, F1 не работает никогда - только во время запроса в командной строке.
Фактически то, что ты хочешь делается при помощи функции (setfunhelp): http://exchange.autodesk.com/autocadmep/enu/online-help/BLDSYS/2012/ENU/pages/WS1a9193826455f5ff1a32d8d10ebc6b7ccc-6954.htm
Посмотрел, работает ли F1 для приложений Autodesk. Например, MGDDBG (http://adndevblog.typepad.com/autocad/2012/04/dwg-debugger-mgddbg-app-for-autocad-20122013.html). Не работает. Во всяком случае в AutoCAD 2013. Похоже на баг.
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Балиев от 11-12-2014, 18:49:06
Да пробовал я вставлять (setfunhelp). Эффект тот же... Самое интересное, что функция сама по себе работает, т.е. откликается правильно, а эффект - нуль.
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Алексей Кулик от 12-12-2014, 09:41:35
Что-то я не очень понял: где вставляется (setfunhelp)? В архиве только vlx, исходников нет.
P.S. Сильно подозреваю, что элементарно не находится chm-файл.
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Балиев от 12-12-2014, 11:36:30
В присланном бандле этой функции нет. Я говорил только о том, что пробовал ее использовать, но безрезультатно.

Я тоже склонен полагать, что система не находит chm-файл. Вопрос только в том, почему она его не находит? Ведь все для того, чтобы найти у нее вроде есть.
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Алексей Кулик от 12-12-2014, 14:13:41
Попробуй загрузить свой bundle и выполни findfile для своего chm. Я почти уверен, что вернется nil.
Поэтому для setfunhelp / help надо будет или указывать полный путь к файлу справки, или добавлять каталог в пути поддержки, или помещать файл в пути поддержки. Может быть, есть еще варианты.
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Балиев от 12-12-2014, 14:19:37
Так каталог в пути поддержки есть (см.PackageContents.xml).

Да и (findfile) все находит...
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Алексей Кулик от 12-12-2014, 15:03:17
Можно попробовать нечто типа (setfunhelp (findfile "help.chm") <...>)
Но я не уверен, что сработает
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Балиев от 12-12-2014, 16:03:34
Но я не уверен, что сработает
Угадал :(
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Александр Ривилис от 12-12-2014, 17:11:34
Теперь несколько абстрактных размышлений:
1) Каким образом AutoCAD знает, что при наведении на иконку с командой и нажатии кнопки F1 он должен открыть именно этот файл справки и именно этот (кстати какой?) раздел в файле справки? Меню CUIX и BUNDLE никак не пересекаются.
2) В диалоговом окне назначение через (setfunhelp) не работает.
3) Я поверил твой bundle - в AutoCAD 2013 и 2014 x64 он не работает.
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Балиев от 12-12-2014, 18:47:40
1) Каким образом AutoCAD знает, что при наведении на иконку с командой и нажатии кнопки F1 он должен открыть именно этот файл справки и именно этот (кстати какой?) раздел в файле справки? Меню CUIX и BUNDLE никак не пересекаются.
Имя CUIX-файла прописано в PackageContents.xml. Там же прописано имя файла справки. Т.е. наведя курсор на иконку получаем имя CUIX-файла, а дальше через PackageContents.xml получаем имя файла справки.

Цитировать
3) Я поверил твой bundle - в AutoCAD 2013 и 2014 x64 он не работает.
Само приложение не работает? А что говорит? Имей в виду, там часть приложения выполняется на удаленном сервере.
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Александр Ривилис от 12-12-2014, 19:13:31
Имя CUIX-файла прописано в PackageContents.xml. Там же прописано имя файла справки. Т.е. наведя курсор на иконку получаем имя CUIX-файла, а дальше через PackageContents.xml получаем имя файла справки.
Это тебе только так кажется. После того как BUNDLE загружен нет никакой взаимосвязи между CUIX и PackageContents.xml
Чтобы по F1 при наведении на иконку появлялась справка нужно делать xaml-файл:
http://adndevblog.typepad.com/autocad/2012/08/specifying-a-different-path-for-ribbon-cuix-extended-help-tooltips-using-xaml.html
Как я уже писал по F1 справка запускается только если запрос идёт в командной строке.
Само приложение не работает? А что говорит? Имей в виду, там часть приложения выполняется на удаленном сервере.
А просто не грузится: Initializing..._.setvar Enter variable name or [?]: ucsortho
Enter new value for UCSORTHO <0>: 0
Command: _.netload Assembly file name: C:\Users\Rivilis-AN\AppData\Roaming\Autodesk\ApplicationPlugins\IDEaL-Spring_web_v01_2014.bundle\Contents\bin\cnc14.dll Cannot load assembly. Error details: System.IO.FileLoadException: Could not load file or assembly 'file:///C:\Users\Rivilis-AN\AppData\Roaming\Autodesk\ApplicationPlugins\IDEaL-Spring_web_v01_2014.bundle\Contents\bin\cnc14.dll' or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x80131515)
File name: 'file:///C:\Users\Rivilis-AN\AppData\Roaming\Autodesk\ApplicationPlugins\IDEaL-Spring_web_v01_2014.bundle\Contents\bin\cnc14.dll' ---> System.NotSupportedException: An attempt was made to load an assembly from a network location which would have caused the assembly to be sandboxed in previous versions of the .NET Framework. This release of the .NET Framework does not enable CAS policy by default, so this load may be dangerous. If this load is not intended to sandbox the assembly, please enable the loadFromRemoteSources switch. See http://go.microsoft.com/fwlink/?LinkId=155569 for more information.
   at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark)
   at System.Reflection.Assembly.LoadFrom(String assemblyFile)
   at Autodesk.AutoCAD.Runtime.ExtensionLoader.Load(String fileName)
   at loadmgd()
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Александр Ривилис от 12-12-2014, 19:25:53
Но ко всему прочему похоже для F1 не работают относительные пути в PackageContents.xml, что конечно же является багом.
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Александр Ривилис от 12-12-2014, 21:08:36
Еще пару замечаний.
1) Должно быть HelpFile, а не Helpfile.
2) chm-файлы не приветствуются, т.к. настройками системы можно заблокировать их открытие (так в большинстве случаев и происходит). Рекомендуется использование htm-файла.
http://adndevblog.typepad.com/autocad/2012/04/autoloaderf1-help-integration.html
3) Создание расширенной помощи для команды: http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%202010%20User%20Documentation/index.html?url=WS1a9193826455f5ffba22e1113c6c30c0e-39dc.htm,topicNumber=d0e376084
4) Возьми готовый пример приложения из Магазина Приложений и поизучай его. Например:
https://apps.exchange.autodesk.com/ACD/en/Detail/Index?id=appstore.exchange.autodesk.com:JTBWorld-DimensionPatrol-Trial:en
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Балиев от 13-12-2014, 13:32:05
Это тебе только так кажется. После того как BUNDLE загружен нет никакой взаимосвязи между CUIX и PackageContents.xml
Это так, но я полагаю, что после загрузки PackageContents.xml в память формируется массив с данными из этого файла и указателями, при помощи которых можно добраться до данных. Во-всяком случае, так обычно делается, иначе зачем этот файл вообще нужен. Хотя я, конечно, понимаю, что это все домыслы, а реальность может оказаться много суровей.

Цитировать
Чтобы по F1 при наведении на иконку появлялась справка нужно делать xaml-файл:
Возможно это работает, но это нестандартный путь. А стандартный путь тоже работает - я изучил несколько приложений из Autodesk Exchange. Поэтому хотелось бы понять, почему не работает у меня.

Цитировать
А просто не грузится:
Странно... Но скорее всего, это система так странно реагирует на проблему с сетью, причем с твоей стороны: то ли ты работаешь через прокси и он настроен специфическим образом, то ли это защита сети "бдит". Эта dll-ка связывается с удаленным сервером, отправляет и принимает данные.

Цитировать
Но ко всему прочему похоже для F1 не работают относительные пути в PackageContents.xml, что конечно же является багом.
Вот это и настараживает - в изученых мной приложениях эти самые относительные пути прекрасно работают.

Цитировать
Должно быть HelpFile, а не Helpfile.
Это правильно, но в данном случае не помогает.

Цитировать
chm-файлы не приветствуются, т.к. настройками системы можно заблокировать их открытие (так в большинстве случаев и происходит). Рекомендуется использование htm-файла.
Менял chm на htm - не помогает.

Цитировать
Возьми готовый пример приложения из Магазина Приложений и поизучай его.
Уже изучал и не один... Кстати, именно тот пример, который ты рекомендуешь.
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Александр Ривилис от 13-12-2014, 15:23:53
Странно... Но скорее всего, это система так странно реагирует на проблему с сетью, причем с твоей стороны: то ли ты работаешь через прокси и он настроен специфическим образом, то ли это защита сети "бдит". Эта dll-ка связывается с удаленным сервером, отправляет и принимает данные.
Прокси нет. Файервол выключен. dll-ка просто не загружается, т.е. как минимум в Initialize происходит Exception.
Возможно это работает, но это нестандартный путь.
Это именно стандартный путь, который появился задолго (как минимум за две версии) до появления BUNDLE.
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Балиев от 13-12-2014, 15:36:29
Похоже, нашел причину. Она в формате вызова макро в cuix-файле.
У меня было: ^C^C^P(c:stw) и это не работает. Зато работает такой формат: ^C^C_stw. Еще бы знать, почему?
С chm-файлом тоже работает.

Цитировать
Прокси нет. Файервол выключен. dll-ка просто не загружается, т.е. как минимум в Initialize происходит Exception.
Совсем непонятно. За год это первое сообщение о незагружающейся dll-ке. А ты не мог бы попробовать загрузить ее напрямую - командной netload (dll-ка лежит в папке "bin")?
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Александр Ривилис от 13-12-2014, 16:05:46
Еще бы знать, почему?
Это как раз очевидно (и я как-то тоже не обратил внимание у тебя в меню на это)-, т.к. (c:stw) трактуется AutoCAD'ом как вызов lisp-функции, а не запуск команды. А файл помощи привязывается именно к команде.
 
Совсем непонятно. За год это первое сообщение о незагружающейся dll-ке. А ты не мог бы попробовать загрузить ее напрямую - командной netload (dll-ка лежит в папке "bin")?
Интересный факт. Сегодня попробовал повторить это и dll-ка грузится и в 2013-ом и в 2014-ом. Что вчера с ней было - сейчас уже и не пойму.
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Балиев от 13-12-2014, 16:11:18
Цитировать
Что вчера с ней было - сейчас уже и не пойму.
Видимо, не выспалась.:)

Спасибо за помощь!
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Александр Ривилис от 13-12-2014, 16:23:15
Это конечно не моё дело, но почему-бы тебе не избавится от lisp, если ты всё-равно грузишь dll-ки?
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Балиев от 13-12-2014, 17:57:42
Так dll-ки не я писал. А вообще, просто руки не доходят - время никак не выберу. Но в планах есть...:)
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Балиев от 18-12-2014, 12:30:32
Это конечно не моё дело, но почему-бы тебе не избавится от lisp, если ты всё-равно грузишь dll-ки?
Кстати, не посоветуешь, что лучше почитать по программированию приложений для AutoCAD на VB .net?
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Александр Ривилис от 18-12-2014, 12:37:46
Кстати, не посоветуешь, что лучше почитать по программированию приложений для AutoCAD на VB .net?
Если спрашиваешь мой совет, то порекомендую не читать ничего по VB.NET, а читать по C#. Андрей Бушман привел список литературы, к которому мне нечего добавить: Литература по программированию на .NET (http://adn-cis.org/forum/index.php?topic=400.0)
По программированию под AutoCAD средствами .NET есть на данный момент только одна книга на русском языке: Н.Н.Полещук. "Программирование для AutoCAD 2013-2015". ДМК Пресс, 2015, 462 с. ISBN 978-5-97060-066-5. (http://www.private.peterlink.ru/poleshchuk/cad/2014/Pr2013-2015.htm) обсуждаемая здесь: http://adn-cis.org/forum/index.php?topic=1097
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Балиев от 18-12-2014, 12:52:13
Спасибо! А не скажешь пару слов, чем C# лучше VB в контексте программирования под AutoCAD?
Да, и, если знаешь, что можно почитать на английском?
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Александр Ривилис от 18-12-2014, 13:04:33
А не скажешь пару слов, чем C# лучше VB в контексте программирования под AutoCAD?
Я приверженец C-подобных языков (C/C++/C# и т.д.), а Basic/Visual Basic/VBA/VB.NET - это учебные языки. Это моя точка зрения и навязывать я ее не буду. C# - это родной язык для .NET, а VB.NET искусственно переделаный из VB.
Англоязычной литературы по C# для AutoCAD я честно говоря сейчас и не вспомню. Наверное ничего достойного мне не попадалось. Тебе нужно изучить сам язык программирования C#, возможности платформы .NET, а как программировать для AutoCAD мы тебя здесь научим. Не бойся. :)
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: BearDyugin от 23-11-2015, 11:46:44
     Раньше ни когда справок не делал, а тут в App Store их автоматически генерят, ну и ради интереса свою написал. Из ленты всё нормально справку показывает, даже к нужному топику привязывается. Но что-то мне подсказывает, что желание обратиться к справке, у пользователя возникнет не при виде кнопки на ленте, а уже нажав на неё и вызвав команду, перед ним появится не маленькое такое диалоговое окно(в моём приложении). Вот и подумал, раз уже справка есть, чего бы в диалоге не добавить кнопку "Справка".
     Но вся сложность в том как этот файл справки найти?
AutoCAD как-то её(справки) находит, для вызова с ленты, для этого мы ему подсказываем и в PackageContents.xml пишем:
Код - XML [Выбрать]
  1. HelpFile="./Contents/Help/Import_Export.html"  
Но при этом сами мы его найти не можем
Код - Auto/Visual Lisp [Выбрать]
  1. (findfile "Import_Export.html")
вернёт nil, что и логично, потому что он не лежит "в путях поиска ..."
Можем ли мы рассчитывать, что наш boundle будет всегда ложиться в C:\ProgramData\Autodesk\ApplicationPlugins\, и тогда мы можем написать?
Код - Auto/Visual Lisp [Выбрать]
  1.  (Help "C:/ProgramData/Autodesk/ApplicationPlugins/Имя приложения.boundle/Contents/Help/Import_Export.html")

     Но так же в PackageContents.xml в разделе компонентов, в элементе RuntimeRequirements (http://exchange.autodesk.com/autocad/rus/online-help/browse#WS73099cc142f4875533992bfb12ce8a5f915-7dfe.htm) есть атрибут Support Path.
Проще тогда указать тут путь к нашему  HelpFile , а заодно и путь к нашим ресурсным dll для cuix файлов, и ещё чего-нибудь, не будет ли это злоупотреблением и через чур раздуванием списка "путей поиска вспомогательных фалов..."? Или закинуть все эти файлы в одну папку в общую кучу, чтоб каша была, и тогда только один путь в Support Path?

Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Александр Ривилис от 23-11-2015, 12:22:56
Можем ли мы рассчитывать, что наш boundle будет всегда ложиться в C:\ProgramData\Autodesk\ApplicationPlugins\
Нет. Как минимум может быть другой диск.
не будет ли это злоупотреблением и через чур раздуванием списка "путей поиска вспомогательных фалов..."?
Не будет. Длина этого списка может быть порядка 64K байт.
а заодно и путь к нашим ресурсным dll для cuix файлов
А вот это лишнее. Ресурсные dll должны лежать в одном каталоге с cuix.
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: BearDyugin от 23-11-2015, 12:45:43
Не будет. Длина этого списка может быть порядка 64K байт.
Хорошо, тогда воспользоваться Support Path, самое правильное.
Ресурсные dll должны лежать в одном каталоге с cuix
не, не лишнее, лежат то они в одном, но AutoCAD их так не находит :-( http://adn-cis.org/forum/index.php?topic=3138.msg13170#msg13170
причём первый раз AutoCAD загружает cuix из папки boundle, пока AutoCAD не закроешь, не появляется копия нашего cuix в папке Support, но и при первом запуске он не находит лежащие рядом ресурсные dll. А уже последующие запуски cuix загружается из его копии из C:\Users\...\AppData\Roaming\Autodesk\AutoCAD xxxx\Rxx.x\rus\Support
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Алексей Кулик от 23-11-2015, 14:14:39
А что вернет (findfile "\\Contents\\Help\\Import_Export.html") ?
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: Александр Ривилис от 23-11-2015, 14:23:06
А что вернет (findfile "\\Contents\\Help\\Import_Export.html") ?
Скорее:
Код - Auto/Visual Lisp [Выбрать]
  1. (findfile ".\\Contents\\Help\\Import_Export.html")
Но вряд ли...
Название: Re: Кнопка F1, файл PackageContents.xml и приложение на AutoLISP.
Отправлено: BearDyugin от 23-11-2015, 20:28:51
Скорее:
Код - Auto/Visual Lisp [Выбрать]
  1. (findfile ".\\Contents\\Help\\Import_Export.html")
Но вряд ли...
Да, именно так с точкой в начале будет работать, если только путь до точки прописан в путях поиска.
Т.е. как вариант, в путях поиска можно прописать один путь SupportPath="./Contents/Resources/R19/" там расположить ресурсную dll, а уже HelpFile расположить в .../Contents/Resources/R19/Help
Код - Auto/Visual Lisp [Выбрать]
  1. (if
  2.   (setq help_file (findfile "./Help/Import_Export.html"))
  3.    (help help_file)
  4.    (alert "Файл справки не найден")
  5. )
причём даже можно сразу
Код - Auto/Visual Lisp [Выбрать]
  1.  (help "./Help/Import_Export.html")
в случаи неудачи, если AutoCAD всё же его не найдёт, он сам выдаст сообщение, "Не удаётся найти файл справочной системы", даже сразу на нужном языке.  :)

Всё же любопытно, куда AutoCAD для себя запоминает HelpFile="./Contents/Help/Import_Export.html"

И я так понял все плавно переходят с chm справки на html?