Imports System.DirectoryServices
Imports System.IO
Imports Autodesk.Connectivity.Explorer.Extensibility
Imports Autodesk.Connectivity.Extensibility.Framework
Imports Autodesk.Connectivity.WebServices
Imports VDF = Autodesk.DataManagement.Client.Framework
<Assembly: ApiVersion("10.0")>
<Assembly: ExtensionId("51aa1a38-1baa-4b48-b927-e00f43dfba8e")>
Public Class VENs
Implements IExplorerExtension
' Публичный параметр для доступа к приложению
Public Property VltApp As IApplication
' Параметр для хранения информации о всех пользователях, зарегистрированных в Vault
Public Property VltUsers As New vltEmailNotificationUsers
' Создаётся автоматически при подключения IExplorerExtension
Public Function CommandSites() As IEnumerable(Of CommandSite) Implements IExplorerExtension.CommandSites
' Создаём контейнер для кнопки с уникальным ID (Gallurgy.ru) и ярлыком (ru)
Dim site As CommandSite = New CommandSite("Gallurgy", "ru")
' Устанавливаем местоположение кнопки в контекстном меню файла (по нажатию правой клашишы мыши)
site.Location = CommandSiteLocation.FileContextMenu
' Указываем, что кнопка не имеет выпадающего меню
site.DeployAsPulldownMenu = False
' Теперь создаём элемент контейнера с его уникальным ID (Gallurgy.Command) и названием кнопки (Моя кнопочка!!!)
Dim cmd As CommandItem = New CommandItem("Gallurgy.Command", "Загрузить новую версию")
' Добавляем в контейнер наш элемент
site.AddCommand(cmd)
' Для события выполнения элемента регистрируем обработку события и привязываем его к процедуре CommandExecute
AddHandler cmd.Execute, AddressOf Update_File
Return New CommandSite() {site}
End Function
' Событие для загрузки новой версии файла
Public Sub Update_File(ByVal sender As Object, ByVal e As Autodesk.Connectivity.Explorer.Extensibility.CommandItemEventArgs)
Try
' В части контекста аргументов события показывают нам информацию о том, что это за выделенный объект.
' Запускаем некоторую проверку, чтобы убедиться что выделенный объект корректный.
If e.Context.CurrentSelectionSet.Count() = 0 Then
MsgBox("Ничего не выделено", , "Сообщение")
ElseIf e.Context.CurrentSelectionSet.Count() > 1 Then
MsgBox("Этот модуль не позволяет работать с многочисленным выделением", , "Сообщение")
Else
' У нас есть только выделенный элемент, который обладает своим поведением.
Dim selection As ISelection = e.Context.CurrentSelectionSet.First()
Dim mgr As Autodesk.Connectivity.WebServicesTools.WebServiceManager = e.Context.Application.Connection.WebServiceManager
' Получение имени хранилища из контекста Vault-а
Dim vaultName As String = e.Context.Application.Connection.Vault
' Получение имени сервера из контекста Vault-а
Dim serverName As String = e.Context.Application.Connection.Server
' Проверяем объект. Как если бы мы определяли, что файл выделен.
Dim selectedFile
As Autodesk.
Connectivity.
WebServices.
File = Nothing If selection.
TypeId = SelectionTypeId.
File Then ' Наш ISelection.Id это действительно File.MasterId
selectedFile = mgr.DocumentService.GetLatestFileByMasterId(selection.Id)
' Имя нового файла
Dim newFileName As String = ""
' Путь к новому файлу
Dim newFilePath As String = ""
' Имя исходного файла
Dim fileName As String = selectedFile.Name
' Расширение исходного файла
Dim ext As String = IO.Path.GetExtension(selectedFile.Name).Replace(".", "")
' Создаём новый экземпляр элемента управления OpenFileDialog
Dim OFD As New System.Windows.Forms.OpenFileDialog
' Устанавливаем фильтр для выбора файлов (расширение должно быть как и у исходного файла)
OFD.Filter = String.Format("Тип выбранного файла {0}|*.{1}", ext.ToUpper, ext)
' Запускаем экземпляр диалогового окна и получаем от него нажатие кнопок
Dim dialResult As System.Windows.Forms.DialogResult = OFD.ShowDialog()
' Нажатие кнопки «ОК»
If dialResult = Windows.Forms.DialogResult.OK Then
' Действие для открытия файлов
newFilePath = OFD.FileName
newFileName = IO.Path.GetFileName(newFilePath)
' Создание экземпляра класса «Коментарий»
Dim Comment As New dxComment
' Откроем экземпляр формы для заполнения коментария и связываем его с экземпляром класса «Коментарий»
Dim nf As New UpdateFile(Comment)
nf.ShowDialog()
' Если значение коментария не пустой, то происходит автоматическая выгрузка старой версии файла и загрузка новой версии файла
If Comment.Value <> "" Then
' Получаем папку старой версии файла, который находится в хранилище Vault в формате [$/Папка/Папка/Файл.расширение]
Dim folderVault
As Folder = mgr.
DocumentService.
GetFolderById(selectedFile.
FolderId) ' Выгрузка старой версии файла, чтобы у него был аттрибут CheckOuted
CheckOut(newFilePath, folderVault.FullName & "/" & selectedFile.Name, serverName, vaultName, ext)
' Загрузка новой версии файла в хранилище Vault
CheckIn(newFilePath, folderVault.FullName & "/" & selectedFile.Name, serverName, vaultName, Comment.Value)
' После загрузки в родительской папке нового файла появится папка, если имя нового файла отличается от старого
Dim localFile As String = newFilePath.Replace("." & ext, "_v." & ext)
' Удаляем эту папку со всем его содержимым
If IO.Directory.Exists(localFile) Then
IO.Directory.Delete(localFile, True)
End If
Else
MsgBox("Отменено!",, "")
End If
ElseIf dialResult = Windows.Forms.DialogResult.Cancel Then
' Закрыл окно через кнопку отменить
newFilePath = ""
newFileName = ""
End If
ElseIf selection.TypeId = SelectionTypeId.FileVersion Then
' Наш ISelection.Id это действительно File.Id
selectedFile = mgr.DocumentService.GetFileById(selection.Id)
End If
If selectedFile Is Nothing Then
MsgBox("Выделенное - это не файл.", , "Сообщение")
Else
' Любое сообщение или дальнейшие действия
End If
End If
Catch ex As Exception
' Если что-то пойдёт не так как задумал
MsgBox("Error: " & ex.Message, , "Сообщение")
End Try
End Sub
' Публикация файла
Public Sub CheckIn(ByVal newFilePath As String, ByVal SourceFilePathFromVault As String, ByVal serverName As String, ByVal vaultName As String, ByVal dialComment As String)
' Соединение с Vault
Dim results As VDF.Vault.Results.LogInResult = VDF.Vault.Library.ConnectionManager.LogIn(serverName, vaultName, "", "", VDF.Vault.Currency.Connections.AuthenticationFlags.WindowsAuthentication, Nothing)
' Если соединение не произошло - выходим из процедуры
If results.Success = False Then
Return
End If
' Если соединение произошло - устанавливаем соединение в параметр
Dim connection As VDF.Vault.Currency.Connections.Connection = results.Connection
' Держим руку на пульсе, а то вдруг какой-то косяк в коде возникнет
Try
' Корневая папка
Dim root
As VDF.
Vault.
Currency.
Entities.
Folder = connection.
FolderManager.
RootFolder ' Файл на компьютере
'Dim localFile As String = newFilePath
' Файл в хранилище Vault [$/Путь/Путь/Файл.расширение]
Dim vaultFile As String = SourceFilePathFromVault ' Получен из списка папок хранилища
' Файл на компьютере, который мы публикуем в хранилище Vault-а
Dim newFile As String = newFilePath
' Получаем все пути файла по указанному пути ??? нафига столько много, или это быть может все файлы от MasterId
Dim fls
As Autodesk.
Connectivity.
WebServices.
File() = connection.
WebServiceManager.
DocumentService.
FindLatestFilesByPaths(New String() {vaultFile
}) ' Получаем только текущую версию файла
Dim flit As VDF.Vault.Currency.Entities.FileIteration = New VDF.Vault.Currency.Entities.FileIteration(connection, fls(0))
' Получаем абсолютную ссылку на файл в хранилище
Dim FPa As VDF.Currency.FilePathAbsolute = New VDF.Currency.FilePathAbsolute(newFile)
' Запихиваем файл в хранилище
connection.FileManager.CheckinFile(flit, dialComment, False, Nothing, Nothing, False, Nothing, FileClassification.None, False, FPa)
Catch ex As Exception
MsgBox(ex.Message)
End Try
' Завершаем соединение, чтобы ничего не подвисло!
VDF.Vault.Library.ConnectionManager.LogOut(connection)
End Sub
' Выгружаем последнюю версию файла из хранилища Vault-а на компьютер
Public Sub CheckOut(ByVal newFilePath As String, ByVal SourceFilePathFromVault As String, ByVal serverName As String, ByVal vaultName As String, ByVal ext As String)
' Соединение с Vault
Dim results As VDF.Vault.Results.LogInResult = VDF.Vault.Library.ConnectionManager.LogIn(serverName, vaultName, "", "", VDF.Vault.Currency.Connections.AuthenticationFlags.WindowsAuthentication, Nothing)
' Если соединение не произошло - выходим из процедуры
If results.Success = False Then
Return
End If
' Если соединение произошло - устанавливаем соединение в параметр
Dim connection As VDF.Vault.Currency.Connections.Connection = results.Connection
' Держим руку на пульсе, а то вдруг какой-то косяк в коде возникнет
Try
' Файл на компьютере
Dim localFile As String = newFilePath.Replace("." & ext, "_v." & ext)
' Файл в хранилище Vault [$/Путь/Путь/Файл.расширение]
Dim vaultFile As String = SourceFilePathFromVault
' Файл на компьютере, который мы публикуем в хранилище Vault-а
Dim newFile As String = newFilePath
' Получаем все пути файла по указанному пути ??? нафига столько много, или это быть может все файлы от MasterId
Dim fls
As Autodesk.
Connectivity.
WebServices.
File() = connection.
WebServiceManager.
DocumentService.
FindLatestFilesByPaths(New String() {vaultFile
}) ' Получаем только текущую версию файла
Dim flit As VDF.Vault.Currency.Entities.FileIteration = New VDF.Vault.Currency.Entities.FileIteration(connection, fls(0))
' Получаем абсолютную ссылку на файл в хранилище
Dim FPa As VDF.Currency.FilePathAbsolute = New VDF.Currency.FilePathAbsolute(newFile)
' Создаём настройки для выгрузки
Dim settings As VDF.Vault.Settings.AcquireFilesSettings = New VDF.Vault.Settings.AcquireFilesSettings(connection)
With settings
' Не очень понятные параметры!!!
.AddEntityToAcquire(flit)
.DefaultAcquisitionOption = VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Checkout AndAlso VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download
.LocalPath = New VDF.Currency.FolderPathAbsolute(localFile)
connection.FileManager.AcquireFiles(settings)
End With
Catch ex As Exception
MsgBox(ex.Message)
Return
End Try
' Завершаем соединение, чтобы ничего не подвисло!
VDF.Vault.Library.ConnectionManager.LogOut(connection)
End Sub