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

04/01/2014

Добавление файла и связывание его с существующим файлом в хранилище

Вам может потребоваться добавить файл и связать его с уже существующим в хранилище. Этот пример на VB.NET показывает как выполнить эту задачу. Пример добавляет файл Excel с диска к текстовому файлу в хранилище.

connection.FileManager.AddFile() используется для добавления файла с диска в хранилище.

connection.FileManager.AcquireFiles() используется для проверки файла, к которому присоединяется файл. (он проверяется без загрузки на компьютер).

connection.FileManager.GetFileAssociationLites() используется для получения связей существующего файла. Новый FileAssocParam используется для добавления присоединенного файла. Присоединенные файлы добавляются как параметры к методу connection.FileManager.CheckinFile.

Метод CheckinFile имеет две подписи. Одна, с байтовым параметром System.IO.Stream, используется для получения файла, который не был загружен (Параметр равен Nothing).

Объект связи: Autodesk.DataManagement.Client.Framework.Vault.Currency.Connections.Connection

Для получения присоединенных файлов вы можете использовать функцию GetFileAssociationsByIds из WebService. Было выяснено, что GetFileAssociationLites() работает лучше, если есть большое количество присоединенных файлов, она-то и используется в примере (использование GetFileAssociationsByIds()  в примере указано в комментариях).

Примечание: Текущая версия Vault API не поддерживает добавление САПР-файлов, таких как сборки Autodesk Inventor. Также было замечено, что вставка файла к .idw может неблагоприятно влиять на файл dwf, который прикреплен как вложение визуализации (файл dwf становится вложением и должен быть пересоздан - это происходит при получении idw при помощи надстройки Vault на Inventor). Также надстройка Inventor Vault Add-in перечислит все прикрепленные файлы, когда при помощи неё будет производиться возврат всего. Однако, прикрепленный файл может не быть скачан, что приведет к ошибке при возврате. 

Скачайте проект Visual Studio:  Vault_list_Add_and_Associate.

Пример является обновлением примера VaultList из SDK. В нем есть три новые кнопки. Одна из кнопок будет «добавлять и прикреплять файл».

Код из приложенного проекта:

Код - VBA: [Выделить]
  1. Private Sub Button4_Click(sender As System.Object,
  2.        e As System.EventArgs) Handles Button4.Click
  3.      ' В демонстрационных целях информация
  4.      ' задана жестко, прямо в коде.
  5.     Dim results As VDF.Vault.Results.LogInResult =
  6.         VDF.Vault.Library.ConnectionManager.LogIn _
  7.         ("localhost", "Vault", "Administrator", "",
  8.         VDF.Vault.Currency.Connections. _
  9.                   AuthenticationFlags.Standard,
  10.          Nothing)
  11.     If Not results.Success Then
  12.         Return
  13.     End If
  14.     Dim connection As  _
  15.     VDF.Vault.Currency.Connections.Connection _
  16.                           = results.Connection
  17.     ' Необходимо заменить эту строку на
  18.     ' путь к файлу, который вы хотите добавить в хранилище
  19.     Dim filePath As String =
  20.                       "C:\Temp\myFile_20.xlsx"
  21.     Dim myFldrCol As System.Collections.Generic.List _
  22.                (Of VDF.Vault.Currency.Entities.Folder)
  23.     myFldrCol = connection.FolderManager. _
  24. GetChildFolders(connection.FolderManager.RootFolder,
  25.                                        False, False)
  26.     ' Получите папку для добавления нового файла для изменения
  27.     ' замените FullName test на папку Folder в вашем хранилище
  28.     Dim myFolder As  _
  29.     VDF.Vault.Currency.Entities.Folder = Nothing
  30.     For Each Flder As  _
  31.     VDF.Vault.Currency.Entities.Folder In myFldrCol
  32.         If Flder.FullName = "$/wB_Excel_Files" Then
  33.             myFolder = Flder
  34.             Exit For
  35.         End If
  36.     Next
  37.     Dim myFileIterationNewFile As  _
  38.     VDF.Vault.Currency.Entities.FileIteration = _
  39.                                            Nothing
  40.     Using fileStream As Stream = New FileStream _
  41.        (filePath, FileMode.Open, FileAccess.Read)
  42.         ' Добавляем файл в хранилище
  43.         myFileIterationNewFile =
  44.             connection.FileManager.AddFile(myFolder,
  45.             Path.GetFileName(filePath),
  46.             "Добавлен по коду wB",
  47.             DateTime.Now, Nothing, Nothing,
  48.             ACW.FileClassification.None,
  49.             False, fileStream)
  50.     End Using
  51.     If Not myFileIterationNewFile Is Nothing Then
  52.         Dim bAddedAttachment As Boolean = False
  53.         ' Необходимо заменить эту строку на путь
  54.         ' к существующему файлу в хранилище
  55.         Dim strNameOfFileToAddTo = "wB_test.txt"
  56.         Dim fldrId As Long =
  57.                myFileIterationNewFile.FolderId
  58.         bAddedAttachment = AddMyAttachment _
  59.             (strNameOfFileToAddTo,
  60.              myFileIterationNewFile.EntityIterationId,
  61.              fldrId, connection)
  62.         If bAddedAttachment = False Then
  63.             MessageBox.Show _
  64.          («Невозможно получить объект FileIteration")
  65.         Else
  66.             MessageBox.Show _
  67.           («Успешно - Файл добавлен и прикреплен")
  68.         End If
  69.     End If
  70.     ' Выход из хранилища
  71.     VDF.Vault.Library.ConnectionManager.LogOut _
  72.                                     (connection)
  73. End Sub
  74. Public Function AddMyAttachment _
  75.                  (nameOfFileToAttachTo As String,
  76.                        myFileIterationId As Long,
  77.             myFolderIdOfNewFileIteration As Long,
  78.             connection As  _
  79.     VDF.Vault.Currency.Connections.Connection) _
  80.                                       As Boolean
  81.     Dim oFileIteration As  _
  82.     VDF.Vault.Currency.Entities.FileIteration =
  83. getFileIteration(nameOfFileToAttachTo, connection)
  84.     If oFileIteration Is Nothing Then
  85.         MessageBox.Show(" Невозможно получить FileIteration")
  86.         Return False
  87.     End If
  88.     ' Получить настройки
  89.     Dim oSettings As  _
  90.         VDF.Vault.Settings.AcquireFilesSettings =
  91.       New VDF.Vault.Settings.AcquireFilesSettings _
  92.                                        (connection)
  93.  
  94.     ' Собираемся вернуть (не загрузить файл)
  95.     oSettings.DefaultAcquisitionOption =
  96.         VDF.Vault.Settings.AcquireFilesSettings. _
  97.                         AcquisitionOption.Checkout
  98.     ' добавить файл в настройки
  99.     oSettings.AddEntityToAcquire(oFileIteration)
  100.     ' Выполнить возврат файла
  101.     Dim myAcquireVaultSettings As  _
  102.         VDF.Vault.Results.AcquireFilesResults
  103.     myAcquireVaultSettings =
  104.   connection.FileManager.AcquireFiles(oSettings)
  105.     Dim oNewFileIteration As  _
  106.         VDF.Vault.Currency.Entities.FileIteration
  107.     Dim myFileAcqRes As  _
  108.         VDF.Vault.Results.FileAcquisitionResult
  109.     myFileAcqRes =
  110.           myAcquireVaultSettings.FileResults(0)
  111.     oNewFileIteration =
  112.                    myFileAcqRes.NewFileIteration
  113.     If oNewFileIteration.IsCheckedOut = True Then
  114.         ' настройки используются в GetFileAssociationLites()
  115.         Dim myFileRelationshipSettings As  _
  116. VDF.Vault.Settings.FileRelationshipGatheringSettings
  117.         myFileRelationshipSettings = _
  118. New VDF.Vault.Settings.FileRelationshipGatheringSettings
  119.         myFileRelationshipSettings. _
  120.                             IncludeAttachments = True
  121.         myFileRelationshipSettings. _
  122.                                IncludeChildren = True
  123.         myFileRelationshipSettings. _
  124.                                 IncludeParents = True
  125.         myFileRelationshipSettings. _
  126.                    IncludeRelatedDocumentation = True
  127.         Dim myColOfFileAssocLite As  _
  128.             System.Collections.Generic.IEnumerable _
  129.                    (Of ACW.FileAssocLite) = Nothing
  130.         myColOfFileAssocLite =
  131.     connection.FileManager.GetFileAssociationLites _
  132.   (New Long() {oNewFileIteration.EntityIterationId},
  133.                         myFileRelationshipSettings)
  134.         ' Собираемся добавить новые объекты FileAssocParam
  135.         ' в список
  136.         ' ArrayList для хранения
  137.         ' объектов FileAssocParam
  138.         Dim fileAssocParams As ArrayList =
  139.                                 New ArrayList
  140.         ' Добавьте объекты FileAssocParam в ArrayList
  141.         ' используя значения из коллекции
  142.         ' из FileAssocLite в коллекции,
  143.         ' возвращенной из  GetFileAssociationLites()
  144.         If Not myColOfFileAssocLite Is Nothing Then
  145.             Dim myFileAssocLite As FileAssocLite
  146.             '   Пройти каждый FileAssoLite в
  147.             '   коллекции из FileAssocLite
  148.             For Each myFileAssocLite In
  149.                                myColOfFileAssocLite
  150.                 ' Это новый FileAssocParam, который
  151.                 ' будет добавлен в List
  152.                 ' получая свойства
  153.                 Dim par As FileAssocParam =
  154.                                New FileAssocParam()
  155.                 par.CldFileId =
  156.                          myFileAssocLite.CldFileId
  157.                 par.RefId = myFileAssocLite.RefId
  158.                 par.Source = myFileAssocLite.Source
  159.                 par.Typ = myFileAssocLite.Typ
  160.                 par.ExpectedVaultPath =
  161.                    myFileAssocLite.ExpectedVaultPath
  162.                 fileAssocParams.Add(par)
  163.             Next
  164.         End If
  165.         ' Получаем папку файла
  166.         ' который мы прикрепляем
  167.         Dim myDictionary As IDictionary _
  168.        (Of Long, VDF.Vault.Currency.Entities.Folder)
  169.         myDictionary =
  170.          connection.FolderManager.GetFoldersByIds _
  171.         (New Long() {myFolderIdOfNewFileIteration})
  172.         ' Получить папку из словаря
  173.         Dim keyPair As Generic.KeyValuePair _
  174.      (Of Long, VDF.Vault.Currency.Entities.Folder)
  175.         keyPair = myDictionary.First
  176.         Dim myFldr As  _
  177.             VDF.Vault.Currency.Entities.Folder _
  178.                                   = keyPair.Value
  179.  
  180.         ' Добавить новую связь
  181.         Dim newFileAssocPar As  _
  182.         FileAssocParam = New FileAssocParam()
  183.         newFileAssocPar.CldFileId = _
  184.                             myFileIterationId
  185.         newFileAssocPar.RefId = Nothing
  186.         newFileAssocPar.Source = Nothing
  187.         newFileAssocPar.Typ = _
  188.                     AssociationType.Attachment
  189.         newFileAssocPar.ExpectedVaultPath = _
  190.                             myFldr.FolderPath
  191.         ' Добавить наш новый FileAssocParam
  192.         fileAssocParams.Add(newFileAssocPar)
  193.         ' Заполняем это новыми объектами FileAssocParam,
  194.         ' которые мы создаем из свойств'
  195.         ' в FileAssocArray и новом файле
  196.         Dim myFileAssocParamArray As FileAssocParam() _
  197.             = DirectCast(fileAssocParams.ToArray _
  198.           (GetType(FileAssocParam)), FileAssocParam())
  199.         ' Используем перегруженный метод CheckInFile,
  200.         ' который получает поток. Это даст возможность
  201.         ' возвращать файл, который не был
  202.         ' загружен
  203.         ' (выполняя передачу в поток, равный Nothing)
  204.         Dim myStream As System.IO.Stream = Nothing
  205.         connection.FileManager.CheckinFile _
  206.             (oNewFileIteration, "wbTesting", False,
  207.                                        Date.Now,
  208.                           myFileAssocParamArray,
  209.                           Nothing, False, Nothing,
  210.                       ACW.FileClassification.None,
  211.                                   False, myStream)
  212.     Else
  213.         MessageBox.Show("Невозможно вернуть")
  214.         Return False
  215.     End If
  216.     Return True
  217. End Function

Источник: http://adndevblog.typepad.com/manufacturing/2013/09/vault-2014-api-example-that-adds-a-file-and-associates-it-to-an-existing-file-in-the-vault.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=437

Опубликовано 04.01.2014
Отредактировано 08.01.2014 в 11:59:31