Возврат в Vault.

Автор Тема: Возврат в Vault.  (Прочитано 3504 раз)

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

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Возврат в Vault.
« : 27-03-2017, 15:44:13 »
Доброго времени суток, уважаемые форумчане. Ищу вашей помощи в решении возникшего вопроса.

Стоит задача закрыть файл и снова его открыть. Непосредственно с закрытием / открытием все понятно. Но появилось недопонимание касательно всплывающих при закрытием окон. Ну то есть, если руками закрываешь файл при закрытии всплывает меню сохранения (если был изменен) и следом окно возврата файла в хранилище Vault (мы работаем в формате многопользовательских проектов). Установил "Application.SilentOperation = true", потестировал: файл сохраняется, но в хранилище не возвращается. Хочу разобраться, как заставить программу возвращать файлы в хранилище, когда это необходимо?
В программировании я новичок...но ненадолго! ;)

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Возврат в Vault.
« Ответ #1 : 18-08-2017, 09:22:24 »
Хочу разобраться, как заставить программу возвращать файлы в хранилище, когда это необходимо?

Наверное, проще самому перезалить файл в Vault.

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Возврат в Vault.
« Ответ #2 : 18-08-2017, 10:43:50 »
Наверное, проще самому перезалить файл в Vault.
Спасибо за совет. Вы не могли бы подсказать, как это делается? Или где про это можно почитать?
В программировании я новичок...но ненадолго! ;)

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Возврат в Vault.
« Ответ #3 : 18-08-2017, 10:49:22 »
Вы не могли бы подсказать, как это делается? Или где про это можно почитать?

Попробую подсказать - немного терпения!

Я лично делаю это так (через клиент Vault):

Через внешнее приложение это будет выглядеть немного по другому, но суть в использовании CheckIn / CheckOut.

Код - vb.net [Выбрать]
  1. Imports System.DirectoryServices
  2. Imports System.IO
  3. Imports Autodesk.Connectivity.Explorer.Extensibility
  4. Imports Autodesk.Connectivity.Extensibility.Framework
  5. Imports Autodesk.Connectivity.WebServices
  6. Imports VDF = Autodesk.DataManagement.Client.Framework
  7.  
  8. <Assembly: ApiVersion("10.0")>
  9. <Assembly: ExtensionId("51aa1a38-1baa-4b48-b927-e00f43dfba8e")>
  10.  
  11. Public Class VENs
  12.     Implements IExplorerExtension
  13.  
  14.     ' Публичный параметр для доступа к приложению
  15.     Public Property VltApp As IApplication
  16.     ' Параметр для хранения информации о всех пользователях, зарегистрированных в Vault
  17.     Public Property VltUsers As New vltEmailNotificationUsers
  18.     ' Создаётся автоматически при подключения IExplorerExtension
  19.     Public Function CommandSites() As IEnumerable(Of CommandSite) Implements IExplorerExtension.CommandSites
  20.         ' Создаём контейнер для кнопки с уникальным ID (Gallurgy.ru) и ярлыком (ru)
  21.         Dim site As CommandSite = New CommandSite("Gallurgy", "ru")
  22.         ' Устанавливаем местоположение кнопки в контекстном меню файла (по нажатию правой клашишы мыши)
  23.         site.Location = CommandSiteLocation.FileContextMenu
  24.         ' Указываем, что кнопка не имеет выпадающего меню
  25.         site.DeployAsPulldownMenu = False
  26.         ' Теперь создаём элемент контейнера с его уникальным ID (Gallurgy.Command) и названием кнопки (Моя кнопочка!!!)
  27.         Dim cmd As CommandItem = New CommandItem("Gallurgy.Command", "Загрузить новую версию")
  28.         ' Добавляем в контейнер наш элемент
  29.         site.AddCommand(cmd)
  30.         ' Для события выполнения элемента регистрируем обработку события и привязываем его к процедуре CommandExecute
  31.         AddHandler cmd.Execute, AddressOf Update_File
  32.         Return New CommandSite() {site}
  33.     End Function
  34.  
  35.     ' Событие для загрузки новой версии файла
  36.     Public Sub Update_File(ByVal sender As Object, ByVal e As Autodesk.Connectivity.Explorer.Extensibility.CommandItemEventArgs)
  37.         Try
  38.             ' В части контекста аргументов события показывают нам информацию о том, что это за выделенный объект.
  39.             ' Запускаем некоторую проверку, чтобы убедиться что выделенный объект корректный.
  40.             If e.Context.CurrentSelectionSet.Count() = 0 Then
  41.                 MsgBox("Ничего не выделено", , "Сообщение")
  42.             ElseIf e.Context.CurrentSelectionSet.Count() > 1 Then
  43.                 MsgBox("Этот модуль не позволяет работать с многочисленным выделением", , "Сообщение")
  44.             Else
  45.                 ' У нас есть только выделенный элемент, который обладает своим поведением.
  46.                 Dim selection As ISelection = e.Context.CurrentSelectionSet.First()
  47.                 Dim mgr As Autodesk.Connectivity.WebServicesTools.WebServiceManager = e.Context.Application.Connection.WebServiceManager
  48.                 ' Получение имени хранилища из контекста Vault-а
  49.                 Dim vaultName As String = e.Context.Application.Connection.Vault
  50.                 ' Получение имени сервера из контекста Vault-а
  51.                 Dim serverName As String = e.Context.Application.Connection.Server
  52.                 ' Проверяем объект. Как если бы мы определяли, что файл выделен.
  53.                 Dim selectedFile As Autodesk.Connectivity.WebServices.File = Nothing
  54.                 If selection.TypeId = SelectionTypeId.File Then
  55.                     ' Наш ISelection.Id это действительно File.MasterId
  56.                     selectedFile = mgr.DocumentService.GetLatestFileByMasterId(selection.Id)
  57.                     ' Имя нового файла
  58.                     Dim newFileName As String = ""
  59.                     ' Путь к новому файлу
  60.                     Dim newFilePath As String = ""
  61.                     ' Имя исходного файла
  62.                     Dim fileName As String = selectedFile.Name
  63.                     ' Расширение исходного файла
  64.                     Dim ext As String = IO.Path.GetExtension(selectedFile.Name).Replace(".", "")
  65.                     ' Создаём новый экземпляр элемента управления OpenFileDialog
  66.                     Dim OFD As New System.Windows.Forms.OpenFileDialog
  67.                     ' Устанавливаем фильтр для выбора файлов (расширение должно быть как и у исходного файла)
  68.                     OFD.Filter = String.Format("Тип выбранного файла {0}|*.{1}", ext.ToUpper, ext)
  69.                     ' Запускаем экземпляр диалогового окна и получаем от него нажатие кнопок
  70.                     Dim dialResult As System.Windows.Forms.DialogResult = OFD.ShowDialog()
  71.                     ' Нажатие кнопки «ОК»
  72.                     If dialResult = Windows.Forms.DialogResult.OK Then
  73.                         ' Действие для открытия файлов
  74.                         newFilePath = OFD.FileName
  75.                         newFileName = IO.Path.GetFileName(newFilePath)
  76.                         ' Создание экземпляра класса «Коментарий»
  77.                         Dim Comment As New dxComment
  78.                         ' Откроем экземпляр формы для заполнения коментария и связываем его с экземпляром класса «Коментарий»
  79.                         Dim nf As New UpdateFile(Comment)
  80.                         nf.ShowDialog()
  81.                         ' Если значение коментария не пустой, то происходит автоматическая выгрузка старой версии файла и загрузка новой версии файла
  82.                         If Comment.Value <> "" Then
  83.                             ' Получаем папку старой версии файла, который находится в хранилище Vault в формате [$/Папка/Папка/Файл.расширение]
  84.                             Dim folderVault As Folder = mgr.DocumentService.GetFolderById(selectedFile.FolderId)
  85.                             ' Выгрузка старой версии файла, чтобы у него был аттрибут CheckOuted
  86.                             CheckOut(newFilePath, folderVault.FullName & "/" & selectedFile.Name, serverName, vaultName, ext)
  87.                             ' Загрузка новой версии файла в хранилище Vault
  88.                             CheckIn(newFilePath, folderVault.FullName & "/" & selectedFile.Name, serverName, vaultName, Comment.Value)
  89.                             ' После загрузки в родительской папке нового файла появится папка, если имя нового файла отличается от старого
  90.                             Dim localFile As String = newFilePath.Replace("." & ext, "_v." & ext)
  91.                             ' Удаляем эту папку со всем его содержимым
  92.                             If IO.Directory.Exists(localFile) Then
  93.                                 IO.Directory.Delete(localFile, True)
  94.                             End If
  95.                         Else
  96.                             MsgBox("Отменено!",, "")
  97.                         End If
  98.                     ElseIf dialResult = Windows.Forms.DialogResult.Cancel Then
  99.                         ' Закрыл окно через кнопку отменить
  100.                         newFilePath = ""
  101.                         newFileName = ""
  102.                     End If
  103.                 ElseIf selection.TypeId = SelectionTypeId.FileVersion Then
  104.                     ' Наш ISelection.Id это действительно File.Id
  105.                     selectedFile = mgr.DocumentService.GetFileById(selection.Id)
  106.                 End If
  107.                 If selectedFile Is Nothing Then
  108.                     MsgBox("Выделенное - это не файл.", , "Сообщение")
  109.                 Else
  110.                     ' Любое сообщение или дальнейшие действия
  111.                 End If
  112.             End If
  113.         Catch ex As Exception
  114.             ' Если что-то пойдёт не так как задумал
  115.             MsgBox("Error: " & ex.Message, , "Сообщение")
  116.         End Try
  117.     End Sub
  118.  
  119.     ' Публикация файла
  120.     Public Sub CheckIn(ByVal newFilePath As String, ByVal SourceFilePathFromVault As String, ByVal serverName As String, ByVal vaultName As String, ByVal dialComment As String)
  121.         ' Соединение с Vault
  122.         Dim results As VDF.Vault.Results.LogInResult = VDF.Vault.Library.ConnectionManager.LogIn(serverName, vaultName, "", "", VDF.Vault.Currency.Connections.AuthenticationFlags.WindowsAuthentication, Nothing)
  123.         ' Если соединение не произошло - выходим из процедуры
  124.         If results.Success = False Then
  125.             Return
  126.         End If
  127.         ' Если соединение произошло - устанавливаем соединение в параметр
  128.         Dim connection As VDF.Vault.Currency.Connections.Connection = results.Connection
  129.         ' Держим руку на пульсе, а то вдруг какой-то косяк в коде возникнет
  130.         Try
  131.             ' Корневая папка
  132.             Dim root As VDF.Vault.Currency.Entities.Folder = connection.FolderManager.RootFolder
  133.             ' Файл на компьютере
  134.             'Dim localFile As String = newFilePath
  135.             ' Файл в хранилище Vault [$/Путь/Путь/Файл.расширение]
  136.             Dim vaultFile As String = SourceFilePathFromVault ' Получен из списка папок хранилища
  137.             ' Файл на компьютере, который мы публикуем в хранилище Vault-а
  138.             Dim newFile As String = newFilePath
  139.             ' Получаем все пути файла по указанному пути ??? нафига столько много, или это быть может все файлы от MasterId
  140.             Dim fls As Autodesk.Connectivity.WebServices.File() = connection.WebServiceManager.DocumentService.FindLatestFilesByPaths(New String() {vaultFile})
  141.             ' Получаем только текущую версию файла
  142.             Dim flit As VDF.Vault.Currency.Entities.FileIteration = New VDF.Vault.Currency.Entities.FileIteration(connection, fls(0))
  143.             ' Получаем абсолютную ссылку на файл в хранилище
  144.             Dim FPa As VDF.Currency.FilePathAbsolute = New VDF.Currency.FilePathAbsolute(newFile)
  145.             ' Запихиваем файл в хранилище
  146.             connection.FileManager.CheckinFile(flit, dialComment, False, Nothing, Nothing, False, Nothing, FileClassification.None, False, FPa)
  147.         Catch ex As Exception
  148.             MsgBox(ex.Message)
  149.         End Try
  150.         ' Завершаем соединение, чтобы ничего не подвисло!
  151.         VDF.Vault.Library.ConnectionManager.LogOut(connection)
  152.     End Sub
  153.  
  154.     ' Выгружаем последнюю версию файла из хранилища Vault-а на компьютер
  155.     Public Sub CheckOut(ByVal newFilePath As String, ByVal SourceFilePathFromVault As String, ByVal serverName As String, ByVal vaultName As String, ByVal ext As String)
  156.         ' Соединение с Vault
  157.         Dim results As VDF.Vault.Results.LogInResult = VDF.Vault.Library.ConnectionManager.LogIn(serverName, vaultName, "", "", VDF.Vault.Currency.Connections.AuthenticationFlags.WindowsAuthentication, Nothing)
  158.         ' Если соединение не произошло - выходим из процедуры
  159.         If results.Success = False Then
  160.             Return
  161.         End If
  162.         ' Если соединение произошло - устанавливаем соединение в параметр
  163.         Dim connection As VDF.Vault.Currency.Connections.Connection = results.Connection
  164.         ' Держим руку на пульсе, а то вдруг какой-то косяк в коде возникнет
  165.         Try
  166.             ' Файл на компьютере
  167.             Dim localFile As String = newFilePath.Replace("." & ext, "_v." & ext)
  168.             ' Файл в хранилище Vault [$/Путь/Путь/Файл.расширение]
  169.             Dim vaultFile As String = SourceFilePathFromVault
  170.             ' Файл на компьютере, который мы публикуем в хранилище Vault-а
  171.             Dim newFile As String = newFilePath
  172.             ' Получаем все пути файла по указанному пути ??? нафига столько много, или это быть может все файлы от MasterId
  173.             Dim fls As Autodesk.Connectivity.WebServices.File() = connection.WebServiceManager.DocumentService.FindLatestFilesByPaths(New String() {vaultFile})
  174.             ' Получаем только текущую версию файла
  175.             Dim flit As VDF.Vault.Currency.Entities.FileIteration = New VDF.Vault.Currency.Entities.FileIteration(connection, fls(0))
  176.             ' Получаем абсолютную ссылку на файл в хранилище
  177.             Dim FPa As VDF.Currency.FilePathAbsolute = New VDF.Currency.FilePathAbsolute(newFile)
  178.             ' Создаём настройки для выгрузки
  179.             Dim settings As VDF.Vault.Settings.AcquireFilesSettings = New VDF.Vault.Settings.AcquireFilesSettings(connection)
  180.             With settings
  181.                 ' Не очень понятные параметры!!!
  182.                 .AddEntityToAcquire(flit)
  183.                 .DefaultAcquisitionOption = VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Checkout AndAlso VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download
  184.                 .LocalPath = New VDF.Currency.FolderPathAbsolute(localFile)
  185.                 connection.FileManager.AcquireFiles(settings)
  186.             End With
  187.         Catch ex As Exception
  188.             MsgBox(ex.Message)
  189.             Return
  190.         End Try
  191.         ' Завершаем соединение, чтобы ничего не подвисло!
  192.         VDF.Vault.Library.ConnectionManager.LogOut(connection)
  193.     End Sub
  194.  

Здесь я показываю, как это делается с помощью CheckIn и CheckOut.

Возникнут следующие проблемы:
1. Вам потребуется определять место в хранилище Vault-а (путь в виде «$/Folder/Folder/File.ipt») - это Ваша первая проблема, поскольку Inventor в себе такую информацию, насколько я знаю, не хранит (а хранит эту информацию Vault addin, но туда ещё как-то нужно достучаться, а по опыту с Revit я знаю как это не легко - точнее не реально, хотя хоть что-то можно взглянуть тут: http://adn-cis.org/svyaz-nadstrojki-vault-add-in-v-autocad-2014.html). Единственная зацепка была для меня - это путь к рабочей папке!!!
2. Для чего нужен этот путь (из пункта 1)? Чтобы получить его MasterId. Это есть у Дмитрия Емельянова здесь: http://adn-cis.org/lyogkoe-programmirovanie-pod-autodesk-vault-chast-22.html.
3. Вторая проблема: откуда запущен файл - с какого сервера и какого хранилища??? Inventor Вам на этот вопрос не ответит. А вот Connectivity.Application.VaultBase знает! И поможет Вам. Вам очень не сказано повезло, если Вы пользуетесь только одним сервером и одним хранилищем, тогда вопрос отпадёт сразу. Но если у Вас две площадки в разных городах и несколько серверов, реплицированных между собой - тогда Вам обязательно нужно будет искать ответ у Connectivity.Application.VaultBase! По нему не нашёл ничего в SDK. Искать ответ нужно только на англоязычных форумах: https://forums.autodesk.com/t5/vault-forum/bd-p/101.
4. Третья проблема: научиться пользоваться CheckIn и CheckOut для решения Вашей задачи. То есть, Вы не сможете сделать CheckIn до тех пор пока не сделаете CheckOut. Почитать можно на форумах https://forums.autodesk.com/t5/vault-forum/bd-p/101. Можно у Дага Редмонда: http://justonesandzeros.typepad.com/blog/sitemap.html, а также Дмитрия Емельянова: http://adn-cis.org/lyogkoe-programmirovanie-pod-autodesk-vault.html.
5. Так как эта задача не укладывается в один пост, Вам придётся разбить задачу на подзадачи, потому что это довольно крупный раздел.

Удачи Вам.


Если найдёте хорошую информацию по работе Vault addin с продуктами Autodesk, то буду признателен. Я пока хорошего материала не смог найти.

« Последнее редактирование: 18-08-2017, 11:25:02 от Пашин Евгений »