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

ADN Club => AutoCAD .NET API => Тема начата: Doublefish от 04-12-2015, 22:50:42

Название: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Doublefish от 04-12-2015, 22:50:42
Подскажите пожалуйста, до AutoCAD 2016 при загрузке dll через плагин,  то что было написано в коде на IExtensionApplication.Initialize() срабатывало нормально и сразу при загрузке AutoCAD. Начиная с AutoCAD 2016 не срабатывает при загрузке AutoCAD, а выполняется только после вызова команды?

Что теперь нужно сделать чтобы код сработал при загрузке AutoCAD 2016?
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Андрей Бушман от 04-12-2015, 22:54:41
Может ты не тот шрифт в текстовом редакторе используешь? Или background не подходящий :) Гадать можно долго.
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Doublefish от 04-12-2015, 23:05:07
Код - C# [Выбрать]
  1. void IExtensionApplication.Initialize()
  2. {
  3.      Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("load app");
  4. }
  5. [CommandMethod("testcommand")]
  6. public void testcoommand()
  7. {
  8.     Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("test command");
  9. }

В PackageContents.xml прописано
Код - XML [Выбрать]
  1. <Command Local="testcommand" Global="testcommand" HelpTopic="#testcommand"/>   
  2. ...
  3. LoadOnAutoCADStartup="True"

Если запустить автокад, то окно не появляется с текстом, а появляется только после ввода команды (два).

Если же грузить через netload - то сообщение появляется сразу.   

Как сделать чтобы сообщение появилось сразу при загрузке AutoCAD 2016 при загрузке через PackageContents.xml?
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Александр Ривилис от 04-12-2015, 23:12:12
Начиная с AutoCAD 2016 не срабатывает при загрузке AutoCAD, а выполняется только после вызова команды?
Из основных особенностей при запуске AutoCAD 2016 возможна ситуация, когда нет ни одного открытого документа и Application.DocumentManager.MdiActiveDocument == null и HostApplicationServices.WorkingDatabase == null
Отсюда возможны и другие проблемы. Без понимания того, что делает код ничего сказать нельзя.
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Doublefish от 04-12-2015, 23:15:26
эээ, код выше просто выводит сообщение Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("load app")

собственно вопрос в том почему инициализация происходит после вызова команды в командной строке, а не при загрузке AutoCAD и как сделать чтобы IExtensionApplication.Initialize() произошло до вызова команды testcommand в командной строке?
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Александр Ривилис от 04-12-2015, 23:16:54
Как сделать чтобы сообщение появилось сразу при загрузке AutoCAD 2016 при загрузке через PackageContents.xml?
Для этой цели в PackageContents.xml есть параметр StartupCommand: http://adndevblog.typepad.com/autocad/2012/04/autoloader-the-startupcommand-parameter.html
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Александр Ривилис от 04-12-2015, 23:18:35
собственно вопрос в том почему инициализация происходит после вызова команды в командной строке
Она происходит вовремя. Просто диалоговое окно не выводится. Попробуй проверить через отладчик или выведи диалоговое окно другим способом. Возможно как раз причина в том, о чем я писал выше - это диалогове окно привязано к окну документа, а окна такого еще нет. Вот диалог и не показывается.
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Doublefish от 04-12-2015, 23:29:14
В командную строку тоже ничего не выводится и не пишется.
Поясню суть проблемы на IExtensionApplication.Initialize() я подписываюсь на события - до 2016 они срабатывали, а в 2016 я нажимаю два раза по dwg, запускается AutoCAD 2016 и отображается чертеж но ничего не происходит - ни окна не появляются, ни сообщения в командной строке и события не срабатывают. Только если ввести любую команду из плагина то срабатывает код из IExtensionApplication.Initialize() и сообщение появляется и окна!
У меня для отладки доступно по 2015, проверить отладчиком в 2016 сейчас не могу :(
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Андрей Бушман от 04-12-2015, 23:32:56
эээ, код выше просто выводит сообщение Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("load app")

собственно вопрос в том почему инициализация происходит после вызова команды в командной строке, а не при загрузке AutoCAD и как сделать чтобы IExtensionApplication.Initialize() произошло до вызова команды testcommand в командной строке?
А с чего ты взял, что при вызове команды происходит инициализация? У тебя что, при вызове команды окно открывается два раза подряд (ты же в команду тот же код запихнул)? Оберни содержимое Initialize() в try\catch и посмотри, не генерируется исключение (покажи текст ошибки в модальном окне WinForms или WPF).
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Александр Ривилис от 04-12-2015, 23:35:25
В командную строку тоже ничего не выводится и не пишется.
И не должно - её (командной строки) просто еще нет.
Поясню суть проблемы на IExtensionApplication.Initialize() я подписываюсь на события
Какие события? Как подписываешься? Ты попробовал как я предложил StartupCommand (т.е. проделать в этой команде всё то, что ты собирался сделать в Initialize)?
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Андрей Бушман от 04-12-2015, 23:44:10
это диалогове окно привязано к окну документа, а окна такого еще нет. Вот диалог и не показывается.
Если такая привязка существует, то скорее всего проблема именно в этом.

Цитировать
В командную строку тоже ничего не выводится и не пишется.
В последних версиях акада загрузка плагинов порой происходит в контексте временного документа, который затем удаляется (это помимо возможности натолкнуться на null). Сталкивался с этим, когда в консоль акада не выводилась информация, хотя документ в момент исполнения кода был не null. Оказывается текст выводился в консоль временного документа, который затем акадом же и закрывался. А юзер, создавая новый документ при открытии акада, не видел этого консольного вывода. Пришлось добавить аналитику текущего документа и если выяснялось, что это временный, то подписывался на создание нового документа. Когда событие срабатывало - выводил текст в консоль нового документа и отменял подписку.

Но в случае с ShowAlertDialog документ скорее всего null в момент выполнения кода в Initialize. Проверь.
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Doublefish от 04-12-2015, 23:50:29
Два раза нажимаю по dwg - открывается автокад и чертеж.
Ввожу команду в командную строку и появляется ДВА сообщения !
Автокад и документ на экране уже точно есть - см. видео.
Первым появляется сообщение "load app" - оно же на Initialize() - как так?
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Андрей Бушман от 04-12-2015, 23:54:03
Ввожу команду в командную строку и появляется ДВА сообщения !
Покажи полностью свой файл PackageContents.xml
Так же покажи полность свой CS-файл с твоим "хелло-ворлдом" (интересуют атрибуты сборки). Другие CS-файлы присутствуют в проекте? Если да, то покажи и их содержимое. Надеюсь, что ты не додумался создать более одного атрибута сборки, указывающего на разные (https://sites.google.com/site/bushmansnetlaboratory/moi-zametki/iextensionapplication) классы, реализующие интерфейс IExtensionApplication, и что реализация этого интерфейса у тебя так же одна...
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Андрей Бушман от 05-12-2015, 00:10:17
долго носки жевать будем? Спать уже пора, а ты всё резину тянешь.
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Doublefish от 05-12-2015, 00:13:47
Приложил, у меня как на видео
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Андрей Бушман от 05-12-2015, 00:15:29
нафига архивами? Опубликуй код обычным способом, в сообщении (с форматированием) - так наглядней и удобней. Щас ещё студия будет открывать его несколько минут.... Да и опубликовать я тебе предлагал не всё подряд а конкретные файлы.
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Андрей Бушман от 05-12-2015, 00:21:00
А какой смысл тебе отвечать, если ты даже не читаешь? Я кому писал в #8, себе что ли? Ждёшь, что за тебя твой код кто-то другой подправит?

Дабы исключить вероятность того, что глючит не Bundle, проверь поведение, когда автозагрузка прописана не через настройки Bundle, но через реестр: https://sites.google.com/site/bushmansnetlaboratory/moi-zametki/avtomaticeskaa-zagruzka-net-bibliotek/pri-pomosi-izmenenij-v-reestre (не забудь про настройки доверительных каталогов).
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Андрей Бушман от 05-12-2015, 00:32:27
Только сейчас обратил внимание...
Код - C# [Выбрать]
  1. void IExtensionApplication.Initialize() {...}
Замени на:
Код - C# [Выбрать]
  1. void Initialize() {...}
По аналогии и Terminate().
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Александр Ривилис от 05-12-2015, 01:02:07
Приложил, у меня как на видео
Ну с тем PackageContents.xml, который ты приложил так и должно быть (да и у меня точно также).
Ты где-то "посеял" LoadOnAutoCADStartup = "True", поэтому dll-файл у тебя загружается только при вызове команды и соотвественно сначала выполняется Initialize, а потом уже сама команда. Если добавить LoadOnAutoCADStartup = "True", то у меня срабатывает нормально:

Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Андрей Бушман от 05-12-2015, 01:09:26
Ну с тем PackageContents.xml, который ты приложил
XML автора я не проверял, т.к. исходил из того, что настройки именно те, которые он указал в #2. Видать за ним всё перепроверять нужно, если уж браться отвечать....
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Doublefish от 05-12-2015, 19:59:32
К сожалению вчера поздно вечером совсем не вовремя отключился интернет и я не смог сразу написать :(

По итогу действительно оказалось что в xml файле параметр LoadOnAutoCADStartup = "True" был не в той сроке!

Дописал и тоже заработало.

Выполнить команду после загрузки AutoCAD можно через параметр StartupCommand="True" - работает.

Спасибо.
Название: Re: Не срабатывают команды при запуске AutoCAD 2016?
Отправлено: Александр Ривилис от 05-12-2015, 22:18:15
Обратил внимание, на неточность в документации: https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2016/ENU/AutoCAD-Customization/files/GUID-3C25E517-8660-4BB7-9447-2310462EF06F-htm.html
Если не указано ни одного Loadreasons, то это должно быть эквивалентно:
LoadOnAutoCADStartup = "True" и
LoadOnAppearance = "True" и
LoadOnProxy = "True"
По факту же оказалось, что при отсутствии LoadOnAutoCADStartup = "True", сработало как будто установлено:
LoadOnAutoCADStartup = "False" и
LoadOnCommandInvocation = "True".
Так что нужно иметь это в виду и явно указывать нужные Loadreasons.