Присоединение внешних ссылок на файлы, хранимые в интерете

Автор Тема: Присоединение внешних ссылок на файлы, хранимые в интерете  (Прочитано 5890 раз)

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

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

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Здравствуйте!
В автокаде можно создавать внешние ссылки на файлы, хранимые в интернете. Для этого достаточно в поле ввода пути к файлу ввести URL, например "https://Какой-то путь/Какой-то чертеж.dwg".  Подробнее об этом написано здесь: https://knowledge.autodesk.com/support/autocad/learn-explore/caas/CloudHelp/cloudhelp/2016/ENU/AutoCAD-Core/files/GUID-D91CFD9D-44EC-408D-8E60-8C826216EA61-htm.html.
И это работает. Например, у меня получалось создавать внешние ссылки на файлы в облачном хранилище SharePoint.
При этом файл из интернета копируется на компьютер (и ссылка идет на локальный файл), но файл на компьютере синхронизируется с файлом на облаке при обновлении внешней ссылки.

Вопрос: как это реализовать программно на .NET?
Попытка впихнуть URL вместо пути в качестве параметра в метод AttachXref базы данных чертежа не увенчалась успехом.
Значит сначала нужно скачать файл из интернета  в локальную папку и затем нужно выполнить какие-то действия для синхронизации.

Пока писал вопрос пришла в голову мысль:
наверняка можно написать обработку события обновления внешних ссылок и когда внешняя ссылка обновляется нужно заново скачать файл в ту же папку и заменить старый.

Тем не менее интересно узнать мнение знатоков по данному вопросу.

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Значит сначала нужно скачать файл из интернета  в локальную папку и затем нужно выполнить какие-то действия для синхронизации.
А как иначе? Именно так.
наверняка можно написать обработку события обновления внешних ссылок и когда внешняя ссылка обновляется нужно заново скачать файл в ту же папку и заменить старый.
А для того, чтобы проверить, что внешняя ссылка обновилась, нужно файл оттуда скачать и сравнить исходный и скопированный. Другого способа с файлом на http:// и ftp:// я не вижу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Для того чтобы получить файл: HostApplicationServices.GetRemoteFile, чтобы отправить обратно: HostApplicationServices.PutRemoteFile
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Не могу разобраться как использовать HostApplicationServices.GetRemoteFile.
Пробую так:
Код - C# [Выбрать]
  1. string x = HostApplicationServices.Current.GetRemoteFile(new Uri(uploadURL), true);
  2.  
Получаю ошибку eInetBase.

До этого пробовал использовать WebClient для скачивания файла в определенную папку. Этот код работает нормально:
Код - C# [Выбрать]
  1. WebClient client = new WebClient();
  2. client.Credentials = CredentialCache.DefaultCredentials;//в моем случае подходят системные учетные данные.
  3. //Без учетных данных была ошибка 401(несанкционированный)
  4. client.DownloadFile(uploadURL, pathToDownload);
  5.  

Может причина ошибки eInetBase в том что адрес защищен паролем?
Совершенно не получается нагуглить по этой теме никакой информации.

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Может причина ошибки eInetBase в том что адрес защищен паролем?
Вообще-то eInetBase - это нормальный код завершения (эквивалентен eInetOk)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Вот подробности об этом исключении:

Autodesk.AutoCAD.Runtime.Exception не обработано
  HResult=-2146233088
  Message=eInetBase
  Source=Acdbmgd
  StackTrace:
       в Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.GetRemoteFile(Uri url, Boolean ignoreCache)
  InnerException:

Перехватывается try-catch

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Похоже на баг в AutoCAD .NET API. Вполне возможно, что этим никто и никогда не пользовался.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Кирилл Захаров 08-06-2017, 11:44:29

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Работает такой код (через COM/ActiveX):
Код - C# [Выбрать]
  1. string localFile = "";
  2. try
  3. {
  4.   AcadApplication app = Application.AcadApplication as AcadApplication;
  5.   app.ActiveDocument.Utility.GetRemoteFile("http://maestrogroup.com.ua/DEMO/L1.dwg", out localFile, true);
  6. }
  7. catch { };
  8.  
В переменной localFile путь к загруженному L1.dwg
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Спасибо большое Александр!

Если скачать файл с помощью этого метода и подключить к нему внешнюю ссылку, то он синхронизируется с файлом на удаленном сервере.
Но только при принудительном обновлении внешней ссылки в чертеже.