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

ADN Club => AutoCAD .NET API => Тема начата: Doublefish от 18-11-2014, 09:47:21

Название: Событие endopen - как выполнить команду в AutoCAD 2015?
Отправлено: Doublefish от 18-11-2014, 09:47:21
Подскажите пожалуйста
в AutoCAD 2012-2014 на событии endopen можно было выполнить синхронную команду  через ActiveDocument.SendCommand("команда "); и всё работало.

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

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

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

Название: Re: Событие endopen - как выполнить команду в AutoCAD 2015?
Отправлено: Александр Ривилис от 18-11-2014, 11:37:47
Давай тестовый пример. Посмотрим что можно сделать. Подозреваю, что придется использовать такой трюк: http://adn-cis.org/ispolzovanie-potokov-dlya-fonovoj-obrabotki.html Хотя возможно проблема не в этом.
И еще. Объясни зачем пытаться выполнять из этого контекста команду синхронно, если можно весь код оформить в виде отдельной команды, которую запускать асинхронно?
Название: Re: Событие endopen - как выполнить команду в AutoCAD 2015?
Отправлено: Doublefish от 18-11-2014, 12:03:40
Есть отдельная команда которая в открытых файлах работает - обновляет объекты и нужно выполнить эту же команду после открытия 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.

Скорее всего фоновая обработка не совсем то, т.к. надо чтобы можно было работать только после того как команда выполнится.
Название: Re: Событие endopen - как выполнить команду в AutoCAD 2015?
Отправлено: Александр Ривилис от 18-11-2014, 12:30:17
1) Я просил не тестовый пример программы, а всего кода, в том числе и endopen.
2)
Скорее всего фоновая обработка не совсем то, т.к. надо чтобы можно было работать только после того как команда выполнится.
Я имел в виду, что Control.Invoke() запускается из события endopen
Название: Re: Событие endopen - как выполнить команду в AutoCAD 2015?
Отправлено: Александр Ривилис от 18-11-2014, 14:35:44
Попробуй такой вариант:
Код - 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.

Название: Re: Событие endopen - как выполнить команду в AutoCAD 2015?
Отправлено: Doublefish от 18-11-2014, 16:35:43
Команда обновляет внешние ссылки из другой системы и там много строк кода, я определил в чем проблема и вкраце описал ситуацию в этой теме и что изменилось.

Через 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.

Подскажите пожалуйста где хранится значение галочки "Всегда игнорировать необработанные ссылки и продолжать "у диалога "Ссылки — необработанные файлы ссылок" ? т.е. как включить, отключить, проверить эту галочку?
Название: Re: Событие endopen - как выполнить команду в AutoCAD 2015?
Отправлено: Александр Ривилис от 18-11-2014, 16:54:35
Команда обновляет внешние ссылки из другой системы и там много строк кода, я определил в чем проблема и вкраце описал ситуацию в этой теме и что изменилось.
Тем не менее подготовить такой коротенький пример, который я в результате сделал, труда бы не составило, а я скорее смог бы понять о чем идёт речь. В дальнейшем прошу именно так и делать.
Подскажите пожалуйста где хранится значение галочки "Всегда игнорировать необработанные ссылки и продолжать "у диалога "Ссылки — необработанные файлы ссылок" ? т.е. как включить, отключить, проверить эту галочку?
Если я правильно понял о чем идёт речь, то: http://adndevblog.typepad.com/autocad/2013/07/disable-task-dialogs-programmatically.html
Там пример на C++, но так как FixedProfile.aws - это простой xml-файл, а в .NET достаточно средств для работы с ним, то думаю что справишься. Есть только один нюанс, что скорее всего этот файл считывается один раз при старте AutoCAD.
Название: Re: Событие endopen - как выполнить команду в AutoCAD 2015?
Отправлено: Александр Ривилис от 19-11-2014, 01:37:55
Подскажите пожалуйста где хранится значение галочки "Всегда игнорировать необработанные ссылки и продолжать "у диалога "Ссылки — необработанные файлы ссылок" ? т.е. как включить, отключить, проверить эту галочку?(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fadn-cis.org%2Fforum%2Findex.php%3Faction%3Ddlattach%3Btopic%3D1085.0%3Battach%3D608%3Bimage&hash=2147ea8d3c198330527e6d2f32239638)

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

Название: Re: Событие endopen - как выполнить команду в AutoCAD 2015?
Отправлено: Doublefish от 19-11-2014, 08:07:54
По поводу примера стало понятно - ок.

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