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

ADN Club => AutoCAD .NET API => Тема начата: Doublefish от 18-08-2015, 12:41:58

Название: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Doublefish от 18-08-2015, 12:41:58
Пример: если окно автокада активно - выполняется код и окно появляется нормально, в панеле задач окно появляется. А вот если окно автокада не активно - то окно в панеле задач не появляется и если перейти а autocad, то окно становится на заднем плане.   
Подскажите пожалуйста, как отобразить окно в потоке на переднем плане, например через 10 секунд (или по таймеру), если окно автокада не активно?
Код - C# [Выбрать]
  1. [CommandMethod("TestForm1", CommandFlags.Modal | CommandFlags.Session)]
  2. public void TestForm1()
  3. {
  4.              var tr = new Thread(delegate()
  5.                 {
  6.                     Form newform = new Form1();
  7.                     newform.TopLevel = true;
  8.                     newform.TopMost = true;
  9.                     newform.ShowInTaskbar = true;
  10.                     newform.Activate();
  11.                     Application.ShowModalDialog(newform);
  12.                 });
  13.              Thread.Sleep(5000);
  14.              tr.Start();
  15. }
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Александр Пекшев aka Modis от 18-08-2015, 12:46:20
Открывать его не как дочернее окно автокада, а стандартным методом newform.ShowDialog();
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Александр Ривилис от 18-08-2015, 13:07:17
Application.ShowModalDialog(newform);
Насколько мне известно этот метод нельзя вызывать из отдельной Thread, т.к. AutoCAD .NET API не является потокобезопасным.
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Doublefish от 18-08-2015, 13:41:42
Вроде уже обсуждалось что newform.ShowDialog(); так нельзя, а нужно пользоваться автокадовскими

Как же тогда выводить окно например раз в час, если выполнились условия для этого ? Если потоками нельзя, то вообще никак? 
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Александр Ривилис от 18-08-2015, 13:43:36
Как же тогда выводить окно например раз в час, если выполнились условия для этого ? Если потоками нельзя, то вообще никак? 
Может быть опишешь подробнее чего ты хочешь добиться?
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Александр Пекшев aka Modis от 18-08-2015, 13:44:42
Вроде уже обсуждалось что newform.ShowDialog(); так нельзя, а нужно пользоваться автокадовскими

Как же тогда выводить окно например раз в час, если выполнились условия для этого ? Если потоками нельзя, то вообще никак? 

Все зависит от ваших нужд и от конкретной работы вашей программы. Иногда можно и нужно использовать newform.ShowDialog(); Тем более автокад не очень-то хорошо работает с потоками
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Doublefish от 18-08-2015, 14:00:49
Нужно проверять изменились ли dwg в другой системе для текущего открытого dwg и если изменились, то показать окно со списком. Проверка осуществляется по заданному интервалу времени в настройках, например 1 раз в час.
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Александр Ривилис от 18-08-2015, 14:08:35
Нужно проверять изменились ли dwg в другой системе для текущего открытого dwg
Как идёт проверка изменилось или нет? По дате/времени файла? Тогда просто запусти таймер, в её функции-обработчике проверь изменился ли файл и оповести об этом пользователя.
Посмотри такой пример: http://adndevblog.typepad.com/autocad/2012/06/setting-up-a-timer-in-a-net-sample-that-uses-the-autocad-net-api.html
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Doublefish от 19-08-2015, 14:35:06
да - проверка идет по дате и по времени и нужно ещё из окна выполнитить действие
посмотрел по ссылке
как выполнить какое либо действие из всплывающей подсказки (там есть только text и hyperlink), никак?

попробовал создать контекстное меню - оно появляется, но как добраться до обработчика при нажатии на пункт контекстного меню?   
http://forums.autodesk.com/t5/net/contextmenu-from-statusbar/td-p/2614538
не работает?
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Александр Ривилис от 20-08-2015, 00:31:53
как выполнить какое либо действие из всплывающей подсказки (там есть только text и hyperlink), никак?
А причем здесь действие? Ты ведь говорил об оповещении пользователя, а не о том, что нужно будет предпринимать какие-то действия. Поэтому я и предложил такой вариант.
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Александр Ривилис от 20-08-2015, 00:57:18
Ну и если ты действительно решил показывать контекстное меню, то тогда тебе в том примере нужно для добавления пункта меню использовать не метод:
Код - C# [Выбрать]
  1. Menu.MenuItemCollection.Add(String)
а метод:
Код - C# [Выбрать]
  1. Menu.MenuItemCollection.Add(String, EventHandler)
где EventHandler - обработчик события выбора пункта меню (для каждого пункта свой обработчик)
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Пашин Евгений от 20-08-2015, 07:23:44
Здравствуйте, уважаемые форумчане!

Хочу лично написать слова благодарности Modis-у за его подсказку.

Действительно, все работает и очень просто:

1. Работаем в среде Visual Studio 2013 (VB.NET)
2. Создаем проект (Библиотека классов, по умолчанию Class1)
3. Создаем в проекте форму (Form1)
4. Подключаем библиотеки AcCoreMgd.dll, AcDbMgd.dll, свойство "КОПИРОВАТЬ ЛОКАЛЬНО=False"
5. В классе Class1 пишем код

Код - vb.net [Выбрать]
  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.ApplicationServices
  3.  
  4. Public Class Class1
  5.     <Autodesk.AutoCAD.Runtime.CommandMethod("ShowMyForm")> _
  6.     Public Sub ShowMyForm()
  7.         Dim NewForm As New Form1
  8.         NewForm.ShowDialog()
  9.     End Sub
  10. End Class

6. Собираем решение
7. Запускаем AutoCAD
8. В командной строке пишем "NETLOAD" и указываем путь к сборке *.dll
9. В командной строке пишем "SHOWMYFORM" и любуемся результатом!

Modis, СПАСИБО!
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Александр Ривилис от 20-08-2015, 07:28:24
Пашин Евгений
Приветствую на форуме.
1. Не забывай про правильное форматирование кода на форуме (смотри у меня в подписи).
2. В данном случае вместо
Код - vb.net [Выбрать]
  1. NewForm.ShowDialog()
должно быть
Код - vb.net [Выбрать]
  1. Application.ShowModalDialog(NewForm)
Да и подключить AcMgd.dll тоже очень желательно.
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Пашин Евгений от 20-08-2015, 07:54:56
Приношу свои извинения, первый раз на этом форуме.

Спасибо за подсказку  :)
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Пашин Евгений от 20-08-2015, 08:01:09
Проблема!

Подключил AcMgd.dll

Сделал как вы написали и перестало работать!

Ошибка: невозможно преобразовать значение типа "ProjectTest.Form1" в "System.Uri"

Что в таком случае делать нужно?
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Пашин Евгений от 20-08-2015, 08:11:58
Вот что получается (изображение)
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Пашин Евгений от 20-08-2015, 08:20:01
Еще одна проблема, вернул все обратно и поместил открытие формы до того, как срабатывает остальной код! Форма открывается, но остальной код не срабатывает, пока не закрою форму!

Что делать? Подскажите.
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Алексей Кулик от 20-08-2015, 08:53:00
Похоже, перепутаны Application. Используй полное имя: Autodesk.ApplicationServices.Application.ShowModalDialog(NewForm).
И какой "остальной" код не срабатывает? Где он располагается? Я бы подумал о том, чтобы предоставить весь проект, с указанием версии AutoCAD, под который ведется разработка.
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Александр Ривилис от 20-08-2015, 09:28:24
Еще одна проблема, вернул все обратно и поместил открытие формы до того, как срабатывает остальной код! Форма открывается, но остальной код не срабатывает, пока не закрою форму!

Что делать? Подскажите.
Так и должно быть. Модальная форма на то и модальная, чтобы приостанавливать выполнение до момента, пока она не будет закрыта. Если ты хочешь, чтобы форма "висела" и при этом выполнялся другой код нужно использовать немодальную форму (т.е. вместо Form.ShowDialog использовать Form.Show, а точнее Application.ShowModelessDialog). Но там будут свои "заморочки".
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Пашин Евгений от 21-08-2015, 06:46:17
Всем большое спасибо!
Заработало в немодальном режиме

Код - vb.net [Выбрать]
  1.     Public Class AcFormReport
  2.         <Autodesk.AutoCAD.Runtime.CommandMethod("ShowMyForm")> _
  3.         Public Sub ShowMyForm()
  4.             Dim NewForm As New Form1
  5.  
  6.             Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessDialog(NewForm)
  7.         End Sub
  8.     End Class

Полный путь к ShowModelessDialog и все заработало! Спасибо!

Теперь ищу ответ на вопрос о проблеме подключения моей dll-ки к Автокад 2014 на XP SP3?
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Александр Ривилис от 21-08-2015, 06:47:44
Теперь ищу ответ на вопрос о проблеме подключения моей dll-ки к Автокад 2014 на XP SP3?
А где вопрос?
P.S.: Один вопрос - одна тема.
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Александр Ривилис от 21-08-2015, 07:18:42
Разделил тему: http://adn-cis.org/forum/index.php?topic=2926
Название: Re: Как отобразить окно на переднем плане из потока если окно AutoCAD не активно?
Отправлено: Пашин Евгений от 21-08-2015, 08:12:04
Как создать новую тему?