Как определить список соответствий папок сервера с папками в хранилище?

Автор Тема: Как определить список соответствий папок сервера с папками в хранилище?  (Прочитано 643 раз)

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

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

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 11
  • Skype: pashin.evgeniy
Добрый день, коллеги!

Ищу ответ на вопрос: как определить все соответствия папок на сервере и папок в хранилище?

Поясню:
1. В Revit-е есть вкладка Vault.
2. С помощью этой вкладки открываю проект центральной модели, которая имеет соответствие с папкой в хранилище.
3. Как определить папку, откуда файл центральной модели открылся - я знаю.
4. Как определить папку, соответствующая ей в хранилище - ВОПРОС ИЗ ВОПРОСОВ!!!


Оффлайн Дмитрий Емельянов

  • Administrator
  • Сообщений: 38
  • Карма: 7
Добрый день, Евгений!

Провербьте, пожалуйста, следующие инструменты Vault в Revit:

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 11
  • Skype: pashin.evgeniy
Добрый день, Евгений!Провербьте, пожалуйста, следующие инструменты Vault в Revit:Настройка сопоставленийПривязка файлов из Vault

Дмитрий, добрый день. Тут проблем нет. Эти статьи я уже просматривал.

Отмечено как Решение Пашин Евгений 01-03-2018, 16:26:38

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 11
  • Skype: pashin.evgeniy
Добрый день, коллеги!

Извиняюсь за запоздалый ответ. Итак, в самом Vault SDK нет ничего, что могло бы помочь с решением данной проблемой. К сожалению, ни форумы, ни Autodesk Consulting не смогли дать ответ.
Поэтому я решил это по-другому. Взял Fiddler от Telerik + VapiTrace именно для Vault. Просмотрел все обращения к серверу. И увидел очень интересную штуку, которая привела меня к решению. Это всего-навсего одна текстовая команда (KnowledgeVaultService.GetVaultOption("RevitVaultFolderMapping")).

Код - vb.net [Выбрать]
  1.         Public Function Get_Required_Vault_Folder(ByVal RevitCentralPath As String) As String
  2.             ' Параметр для хранения строк будущего xml-файла
  3.             Dim myXML As New List(Of String)
  4.             ' Параметр для соединения с Vault из Revit
  5.             Dim conn As VDF.Vault.Currency.Connections.Connection = Connectivity.Application.VaultBase.ConnectionManager.Instance.Connection
  6.             ' Параметр для определения связанных папок между Revit и Vault
  7.             Dim GVO As String = conn.WebServiceManager.KnowledgeVaultService.GetVaultOption("RevitVaultFolderMapping")
  8.             ' Добавляем текст связанных папок между Revit и Vault
  9.             myXML.Add(GVO)
  10.             ' Определение папки на сервере для центральной модели проекта
  11.             Dim cmFolder As String = IO.Path.GetDirectoryName(RevitCentralPath)
  12.             ' Параметр для хранения соответствующей папки в хранилище Vault
  13.             Dim vltFolder As String = ""
  14.             ' Сохранение xml-файла
  15.             Dim xmlFile As String = Environ("TEMP") & "\RevitVaultFolderMapping.xml"
  16.             IO.File.WriteAllLines(xmlFile, myXML)
  17.             ' Читаем получившийся xml-файл
  18.             Dim xdoc As XDocument = XDocument.Load(xmlFile)
  19.             ' Перебираем все элементы xml-файла внутри элемента "MappingItems"
  20.             For Each xmlItem As XElement In xdoc.Element("MappingItems").Elements
  21.                 ' Если аттрибут "PhysicalPath" = пути к файлу проекта на сервере, то получаем его папку в хранилище Vault
  22.                 If xmlItem.Attribute("PhysicalPath").Value = cmFolder Then
  23.                     vltFolder = xmlItem.Attribute("VaultPath").Value
  24.                 End If
  25.             Next
  26.             ' Возвращаем папку в Vault
  27.             Return vltFolder
  28.         End Function
  29.  

То же самое, но на C#.

Код - C# [Выбрать]
  1. public string Get_Required_Vault_Folder(string RevitCentralPath)
  2. {
  3.     List<string> myXML = new List<string>;
  4.     VDF.Vault.Currency.Connections.Connection conn = Connectivity.Application.VaultBase.ConnectionManager.Instance.Connection;
  5.     string GVO = conn.WebServiceManager.KnowledgeVaultService.GetVaultOption("RevitVaultFolderMapping");
  6.     myXML.Add(GVO);
  7.     string cmFolder = IO.Path.GetDirectoryName(RevitCentralPath);
  8.     string vltFolder = "";
  9.     string xmlFile = Environ("TEMP") + "\\RevitVaultFolderMapping.xml";
  10.     IO.File.WriteAllLines(xmlFile, myXML);
  11.     XDocument xdoc = XDocument.Load(xmlFile);
  12.     foreach (XElement xmlItem in xdoc.Element("MappingItems").Elements)
  13.     {
  14.         if (xmlItem.Attribute("PhysicalPath").Value == cmFolder)
  15.         {
  16.             vltFolder = xmlItem.Attribute("VaultPath").Value;
  17.         }
  18.     }
  19.  
  20.     return vltFolder;
  21. }

Вопрос закрыт.

Для тех, кто изучает Vault API настоятельно рекомендую обзавестись Fiddler-ом и надстройкой VapiTrace для слежения за сервером Vault! Сможете на раз-два определять последовательность действий  и сервисы, которые в этом участвуют.