Доступ к Revit из внешнего приложения

Автор Тема: Доступ к Revit из внешнего приложения  (Прочитано 11921 раз)

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

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

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Пара риторических вопросов к размышлению:

1. Что произойдёт, если клиент отправляет запрос, но при этом на хостовой машине будет запущено сразу несколько экземпляров приложений Revit, в каждом из которых, в свою очередь, будет работать указанная служба?

2. Каким образом, в обозначенном выше решении, внешнее приложение сможет адресовать свой запрос конкретному процессу, если присутствует ситуация, обозначенная в п.1?

Я не специалист в WCF, поэтому наверняка некоторые вещи можно сделать более грамотно, чем мне это видится сейчас. На мой взгляд, в обозначенном решении, между клиентом и сервисом, хостящимся в Revit не хватает посредника - дополнительной службы, работающей либо под управлением диспетчера служб Windows, либо хостящейся в некотором стороннем процессе. Клиент должен обращаться не напрямую к службе, хостящейся в Revit, но к службе-посреднику, указывая в составе своего запроса идентификатор того процесса, которому он хотел бы адресовать этот запрос. Посредник же, в свою очередь, выполняет переадресацию запроса нужному экземпляру службы. Этот же посредник может управлять временем жизни экземпляров процессов Revit, создавая\закрывая их по мере необходимости.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
1. Что произойдёт, если клиент отправляет запрос, но при этом на хостовой машине будет запущено сразу несколько экземпляров приложений Revit, в каждом из которых, в свою очередь, будет работать указанная служба?
В данной реализации WCF сервис просто не запустится при запуске второго экземпляра Revit, а вернее вылетет с exception.

2. Каким образом, в обозначенном выше решении, внешнее приложение сможет адресовать свой запрос конкретному процессу, если присутствует ситуация, обозначенная в п.1?
В каждом экземпляре приложения нужно будет создавать отдельный экземпляр WCF сервиса с прослушкой разных портов (если речь идет о tcp протоколе). Клиент должен адресовать свой запрос конкретному WCF сервису, а значит и конретному процессу Revit.

Правда тут сложность в том, как определить какой экземпляр WCF сервиса соответствует определенному процессу Revit.

Это можно будет реализовать в том числе и предложенным вами способом, с помощью посредника.

Все зависит от задачи конечно. В статье приводится лишь идея и пример простой реализации.

В той задаче, где я применял на практике подобный подход, мне совершенно не требовался запуск нескольких экземпляров Revit, а следовательно лишние усложенния архитектуры (создание посредника, определение конкретного процесса) были совершенно ни к чему.

Оффлайн Ярослав

  • ADN OPEN
  • **
  • Сообщений: 82
  • Карма: 1
Добрый день.
Подскажите пожалуйста с выходом новых версий ничего не поменялось с подключением к Ревит из другого приложения?

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Нет. И не думаю, что что-то в дальнейшем может измениться в этом плане.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Ярослав

  • ADN OPEN
  • **
  • Сообщений: 82
  • Карма: 1
Добрый день. Подскажите пожалуйста, было приложение где через WCF сервис выполнялось подключение к Ревит 2017.
С установкой Ревита 2019, совершенно не могу подключится к серверу WCF. Сервис создается без проблем, а вот обращение к нему не выполняется, говорит что прошло время запроса.
Это что то перекрыли в Ревите или проблемы с Фраемворком 4.7?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78

Оффлайн Ярослав

  • ADN OPEN
  • **
  • Сообщений: 82
  • Карма: 1
Не очень радостная новость. Но в интернете встречал что у некоторых людей(не Revit API) возникали проблемы при переходах с NET 4,6 на 4,7. Но решений не предоставлялось.

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
С .NET Framework 4.7 проблемы у многих программ Autodesk (и не только Autodesk). Часть из них решена в обновлении .NET Framework 4.7.1
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Ярослав

  • ADN OPEN
  • **
  • Сообщений: 82
  • Карма: 1
и  .NET Framework 4.7.1 не помог.
Клиент как бы хочет обратится к серверу, но тот его не пускает причем Ревит при этом виснет(курсор-часики) до бесконечности.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Доступ к Revit из внешнего приложения
« Ответ #10 : 26-04-2018, 12:40:40 »
Клиент как бы хочет обратится к серверу, но тот его не пускает причем Ревит при этом виснет(курсор-часики) до бесконечности.
На консольном "Hello World" пробовал, работает?

Оффлайн Ярослав

  • ADN OPEN
  • **
  • Сообщений: 82
  • Карма: 1
Re: Доступ к Revit из внешнего приложения
« Ответ #11 : 26-04-2018, 14:12:12 »
На консольном "Hello World" пробовал, работает?
в смысле приложение "Hello World" или подключится к "Hello World"?
Другие приложения работают без проблем. но вот с  WCF сервисом никак.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Доступ к Revit из внешнего приложения
« Ответ #12 : 26-04-2018, 14:16:54 »
в смысле приложение "Hello World" или подключится к "Hello World"?
Другие приложения работают без проблем. но вот с  WCF сервисом никак.
Создать два простых консольных приложения - один клиент, а др. - являющийся хостом для твоего WCF-сервиса. Отправить клиентом запрос сервису и получить обратно ответ. Чтобы исключить Ревит из уравнения и понять, работает ли твой код в др. ситуациях.

Оффлайн Ярослав

  • ADN OPEN
  • **
  • Сообщений: 82
  • Карма: 1
Re: Доступ к Revit из внешнего приложения
« Ответ #13 : 26-04-2018, 14:34:09 »
так еще не делал, но пробовал приложение собранное на  .NET Framework 4.7.1 запускать на Ревите 17 то сервис работает, а как только 19 то ... в ответ тишина.

Оффлайн Ярослав

  • ADN OPEN
  • **
  • Сообщений: 82
  • Карма: 1
Re: Доступ к Revit из внешнего приложения
« Ответ #14 : 27-04-2018, 08:52:58 »
Если попытаться "пройтись" по http://adn-cis.org/dostup-k-revit-iz-vneshnego-prilozheniya.html, приложение заходит на сервис, на lock (_locker)
            {
                TaskContainer.Instance.EnqueueTask(GetDocumentPath);
 
                // Ждем завершение задачи
                Monitor.Wait(_locker, WAIT_TIMEOUT);
            }

заходит в Instance, потом заходит в EnqueueTask а вот в GetDocumentPath не заходит.
 и дальше на себе спокойно на Monitor.Wait(_locker, WAIT_TIMEOUT);. и все.
А знаний у меня маловато и...