Событие endopen - как выполнить команду в AutoCAD 2015?

Автор Тема: Событие endopen - как выполнить команду в AutoCAD 2015?  (Прочитано 7707 раз)

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

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

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Подскажите пожалуйста
в AutoCAD 2012-2014 на событии endopen можно было выполнить синхронную команду  через ActiveDocument.SendCommand("команда "); и всё работало.

В AutoCAD 2015 теперь это не работает, пишет: Недопустимый контекст выполнения

Как в AutoCAD 2015 выполнить синхронную команду в событии EndOpen?

ed.Command("команда", 1, 1, 0); пишет ошибку eInvalidInput


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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Давай тестовый пример. Посмотрим что можно сделать. Подозреваю, что придется использовать такой трюк: http://adn-cis.org/ispolzovanie-potokov-dlya-fonovoj-obrabotki.html Хотя возможно проблема не в этом.
И еще. Объясни зачем пытаться выполнять из этого контекста команду синхронно, если можно весь код оформить в виде отдельной команды, которую запускать асинхронно?
« Последнее редактирование: 18-11-2014, 11:48:11 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Есть отдельная команда которая в открытых файлах работает - обновляет объекты и нужно выполнить эту же команду после открытия dwg на endopen, дождаться её выполнения, затем выполнить следующие действия. До 2015 проблемы не было, работало SendCommand(обновить) и выполнялись следующие действия.

В 2015 это перестало работать - возник вопрос как это теперь в 2015 сделать чтобы работало?

Самый простой пример, есть команда и в 2014 через SendCommand("test2015 ") будет работать на endopen:
Код - C# [Выбрать]
  1. [CommandMethod("test2015")]
  2. public void test2015()
  3. {
  4.     Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("test");  
  5. }

а в 2015 как? т.е. нужно просто выполнить только одну команду сразу после открытия dwg в 2015.

Скорее всего фоновая обработка не совсем то, т.к. надо чтобы можно было работать только после того как команда выполнится.
« Последнее редактирование: 18-11-2014, 12:21:01 от Doublefish »

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
1) Я просил не тестовый пример программы, а всего кода, в том числе и endopen.
2)
Скорее всего фоновая обработка не совсем то, т.к. надо чтобы можно было работать только после того как команда выполнится.
Я имел в виду, что Control.Invoke() запускается из события endopen
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Doublefish 18-11-2014, 17:01:06

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Попробуй такой вариант:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.Internal;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using Autodesk.AutoCAD.Geometry;
  7. using Autodesk.AutoCAD.EditorInput;
  8. using Autodesk.AutoCAD.Interop;
  9. using Autodesk.AutoCAD.Interop.Common;
  10. using AcRx = Autodesk.AutoCAD.Runtime;
  11. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  12. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  13. using AcGe = Autodesk.AutoCAD.Geometry;
  14. using AcEd = Autodesk.AutoCAD.EditorInput;
  15. using AcIt = Autodesk.AutoCAD.Internal;
  16. using app  = Autodesk.AutoCAD.ApplicationServices.Application;
  17.  
  18. [assembly: CommandClass(typeof(TestEndOpen.MyCommands))]
  19.  
  20. namespace TestEndOpen
  21. {
  22.   public class MyCommands
  23.   {
  24.     static Autodesk.AutoCAD.Interop.AcadApplication appInt;
  25.     static MyCommands()
  26.     {
  27.       appInt = (AcadApplication)AcAp.Application.AcadApplication;
  28.     }
  29.     static void StartCommandAfterEndOpen()
  30.     {
  31.       appInt.ActiveDocument.SendCommand("_TEST2015 ");
  32.     }
  33.     public static void app_Idle(object sender, EventArgs e)
  34.     {
  35.       app.Idle -= new EventHandler(app_Idle);
  36.       StartCommandAfterEndOpen();
  37.     }
  38.     void app_EndOpen(string target)
  39.     {
  40.       app.Idle += new EventHandler(app_Idle);
  41.     }
  42.     [CommandMethod("TestEndOpen")]
  43.     public void TestEndOpen()
  44.     {
  45.       appInt.EndOpen += new _DAcadApplicationEvents_EndOpenEventHandler(app_EndOpen);
  46.     }
  47.     [CommandMethod("test2015")]
  48.     public void test2015()
  49.     {
  50.       Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("test");
  51.     }
  52.   }
  53. }
Кстати, довольно странно, что твой код работал в предыдущих версиях AutoCAD. Ведь появление события EndOpen еще не означает, что этот документ становится ActiveDocument. Совсем не означает. Скорее всего тебе просто везло до AutoCAD 2015.

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

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Команда обновляет внешние ссылки из другой системы и там много строк кода, я определил в чем проблема и вкраце описал ситуацию в этой теме и что изменилось.

Через Control.Invoke() была ошибка на .ActiveDocument.FullName : Фильтр сообщений выдал диагностику о занятости приложения. (Исключение из HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER))
если поставить  System.Threading.Thread.Sleep(1000); - то ошибки выше не было либо была в редких случаях

Попробовал второй вариант через app.Idle += new EventHandler(app_Idle); - так работает - это хорошо, но появляется окно  диалоговое окне "Ссылки — необработанные файлы ссылок", а потом ссылки обновляются. Проверил в 2014 на тех же файлах и при тех же обстоятельствах - диалог не появляется "Ссылки — необработанные файлы ссылок". Видимо как то позже в 2015 стало срабатывать или диалог этот раньше.

Спасибо - до этого я не додумался бы.

Наверное как то везло более чем на 500 компах в AutoCAD 2012 и 2014.

Подскажите пожалуйста где хранится значение галочки "Всегда игнорировать необработанные ссылки и продолжать "у диалога "Ссылки — необработанные файлы ссылок" ? т.е. как включить, отключить, проверить эту галочку?
« Последнее редактирование: 18-11-2014, 16:49:18 от Doublefish »

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Команда обновляет внешние ссылки из другой системы и там много строк кода, я определил в чем проблема и вкраце описал ситуацию в этой теме и что изменилось.
Тем не менее подготовить такой коротенький пример, который я в результате сделал, труда бы не составило, а я скорее смог бы понять о чем идёт речь. В дальнейшем прошу именно так и делать.
Подскажите пожалуйста где хранится значение галочки "Всегда игнорировать необработанные ссылки и продолжать "у диалога "Ссылки — необработанные файлы ссылок" ? т.е. как включить, отключить, проверить эту галочку?
Если я правильно понял о чем идёт речь, то: http://adndevblog.typepad.com/autocad/2013/07/disable-task-dialogs-programmatically.html
Там пример на C++, но так как FixedProfile.aws - это простой xml-файл, а в .NET достаточно средств для работы с ним, то думаю что справишься. Есть только один нюанс, что скорее всего этот файл считывается один раз при старте AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Подскажите пожалуйста где хранится значение галочки "Всегда игнорировать необработанные ссылки и продолжать "у диалога "Ссылки — необработанные файлы ссылок" ? т.е. как включить, отключить, проверить эту галочку?

Я написал специальную статью по этому поводу:
Как управлять Параметрами скрытых сообщений в .NET
Если появятся замечания, то обсуждение в теме: http://adn-cis.org/forum/index.php?topic=1088

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

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
По поводу примера стало понятно - ок.

С галочкой это оно - спасибо.