Как получить свойства текущего файла?

Автор Тема: Как получить свойства текущего файла?  (Прочитано 10480 раз)

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

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

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

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

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



Какие библиотеки подключить, интерфейсы, события?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Посмотри не подойдёт ли тебе эта статья: http://adndevblog.typepad.com/manufacturing/2013/12/getting-properties-of-file-interation-with-vault-development-framework-in-vault-2014-api.html

Я уже пробовал этот код. Тут он перебирает все файлы в хранилище. А мне нужен только тот, который выделил я, точнее его Id, причём при изменении состояния жизненного цикла.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
А этот тоже пробовал: https://forums.autodesk.com/t5/vault-customization/vault-2015-c-get-selected-file-properties-and-values/td-p/5733448 ?

А в этой статье тоже не ясно, как найти SelectedFile.Id:

Код - C# [Выбрать]
  1. public static void PrintProperties(VDF.Vault.Currency.Connections.Connection connection, File selectedFile)
  2.         {
  3.             VDF.Vault.Currency.Entities.FileIteration fileInteration = new FileIteration(connection, selectedFile);
  4.             var propDefs = connection.PropertyManager.GetPropertyDefinitions(VDF.Vault.Currency.Entities.EntityClassIds.Files, null, VDF.Vault.Currency.Properties.PropertyDefinitionFilter.IncludeAll);
  5.             foreach (var key in propDefs.Keys)
  6.             {
  7.                 // Print the Name from the Definition and the Value from the Property
  8.                 object propValue = connection.PropertyManager.GetPropertyValue(fileInteration, propDefs[key], null);
  9.                 logit.logger(string.Format("== LIB 1 DICT == >>   '{0}' = '{1}'", key.ToString(), propValue == null ? "" : propValue.ToString()));
  10.             }
  11.         }

Как Raghulan нашёл selectedFile?




Есть простой пример в C:\Program Files (x86)\Autodesk\Autodesk Vault 2017 SDK\vs15\VB\HelloWorldVB\:
Код - vb.net [Выбрать]
  1. '...
  2. AddHandler helloWorldCmdItem.Execute, AddressOf HelloWorldCommandHandler
  3. '...
  4.  
  5.         Private Sub HelloWorldCommandHandler(s As Object, e As CommandItemEventArgs)
  6.             Try
  7.                 ' The Context part of the event args tells us information about what is selected.
  8.                 ' Run some checks to make sure that the selection is valid.
  9.                 If e.Context.CurrentSelectionSet.Count() = 0 Then
  10.                     MessageBox.Show("Nothing is selected")
  11.                 ElseIf e.Context.CurrentSelectionSet.Count() > 1 Then
  12.                     MessageBox.Show("This function does not support multiple selections")
  13.                 Else
  14.                     ' we only have one item selected, which is the expected behavior
  15.  
  16.                     Dim selection As ISelection = e.Context.CurrentSelectionSet.First()                  
  17.                     Dim mgr As WebServiceManager = e.Context.Application.Connection.WebServiceManager
  18.  
  19.                     ' Look of the File object.  How we do this depends on what is selected.
  20.                     Dim selectedFile As File = Nothing
  21.                     If selection.TypeId = SelectionTypeId.File Then
  22.                         ' our ISelection.Id is really a File.MasterId
  23.                         selectedFile = mgr.DocumentService.GetLatestFileByMasterId(selection.Id)
  24.                     ElseIf selection.TypeId = SelectionTypeId.FileVersion Then
  25.                         ' our ISelection.Id is really a File.Id
  26.                         selectedFile = mgr.DocumentService.GetFileById(selection.Id)
  27.                     End If
  28.  
  29.                     If selectedFile Is Nothing Then
  30.                         MessageBox.Show("Selection is not a file.")
  31.                     Else
  32.                         ' this is the message we hope to see
  33.                         MessageBox.Show([String].Format("Hello World! The file size is: {0} bytes", selectedFile.FileSize))
  34.                     End If
  35.                 End If
  36.             Catch ex As Exception
  37.                 ' If something goes wrong, we don't want the exception to bubble up to Vault Explorer.
  38.                 MessageBox.Show("Error: " & ex.Message)
  39.             End Try
  40.         End Sub

Это хорошо, при работе по нажатию кнопки, точнее по событию выполнения команды, где входным параметров является CommandItemEventArgs.
А есть ли вариант при отрабатывании события изменения состояния жизненного цикла файла/папки/пользовательского объекта? То есть мне нужно знать, какой подключить ****EventArgs для события UpdateFileLifecycleStateEvents!!!

Код - vb.net [Выбрать]
  1. '...
  2. AddHandler Autodesk.Connectivity.WebServices.DocumentServiceExtensions.UpdateFileLifecycleStateEvents.Post, AddressOf Get_Lifecycle_Changes
  3. '...
  4.  
  5.     Public Sub Get_Lifecycle_Changes(ByVal e As *****EventArgs - что здесь написать?)
  6.         Dim Connection As Autodesk.DataManagement.Client.Framework.Vault.Currency.Connections.Connection = VltApp.Connection
  7.         Dim WebManager As Autodesk.Connectivity.WebServicesTools.WebServiceManager = Connection.WebServiceManager
  8.         Dim allUsers() As Autodesk.Connectivity.WebServices.User = WebManager.AdminService.GetAllUsers()
  9.  
  10.         For Each mUsr As Autodesk.Connectivity.WebServices.User In allUsers
  11.             Dim newUsr As New vltUser
  12.             With newUsr
  13.                 .firstName = mUsr.FirstName
  14.                 .lastName = mUsr.LastName
  15.                 .name = mUsr.Name
  16.                 .userEmail = mUsr.Email
  17.                 .userId = mUsr.Id
  18.                 .userIsActive = mUsr.IsActive
  19.             End With
  20.             VltUsers.allUsers.Add(newUsr)
  21.         Next
  22.         MsgBox("Вы только что изменили состояние жизненного цикла") ' Here is message that user changed the state of lifecycle of selected file
  23.         Dim nf As New Main(VltUsers)
  24.         nf.ShowDialog()
  25.  
  26.         Dim selection As ISelection = e.Context.CurrentSelectionSet.First() ' ???????????????????????????????????????????????????? Is not working
  27.         Dim fileProperties As Autodesk.Connectivity.WebServices.PropInst() = WebManager.PropertyService.GetPropertiesByEntityIds("FILE", New Long() {selection.Id})  'For a selected file
  28.         'Dim folderProperties As Autodesk.Connectivity.WebServices.PropInst() = WebManager.PropertyService.GetPropertiesByEntityIds("FLDR", New Long() {FileID}) ' For a selected folder
  29.         MsgBox(selection.Id)
  30.     End Sub



« Последнее редактирование: 25-05-2017, 15:34:53 от Пашин Евгений »

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Так вроде сработало, но я не уверен, что правильно задал параметр:

Код - vb.net [Выбрать]
  1.     Public Sub Get_Lifecycle_Changes(ByVal sender As Object, ByVal e As Autodesk.Connectivity.WebServices.UpdateFileLifeCycleStateCommandEventArgs)
  2.         Dim Connection As Autodesk.DataManagement.Client.Framework.Vault.Currency.Connections.Connection = VltApp.Connection
  3.         Dim WebManager As Autodesk.Connectivity.WebServicesTools.WebServiceManager = Connection.WebServiceManager
  4.         Dim allUsers() As Autodesk.Connectivity.WebServices.User = WebManager.AdminService.GetAllUsers()
  5.  
  6.         For Each mUsr As Autodesk.Connectivity.WebServices.User In allUsers
  7.             Dim newUsr As New vltUser
  8.             With newUsr
  9.                 .firstName = mUsr.FirstName
  10.                 .lastName = mUsr.LastName
  11.                 .name = mUsr.Name
  12.                 .userEmail = mUsr.Email
  13.                 .userId = mUsr.Id
  14.                 .userIsActive = mUsr.IsActive
  15.             End With
  16.             VltUsers.allUsers.Add(newUsr)
  17.         Next
  18.         MsgBox("Вы только что изменили состояние жизненного цикла") ' Here is message that user changed the state of lifecycle of selected file
  19.         Dim nf As New Main(VltUsers)
  20.         nf.ShowDialog()
  21.  
  22.         'Dim selection As id = e.FileMasterIds 'CurrentSelectionSet.First() ' ???????????????????????????????????????????????????? Is not working
  23.         Dim fileProperties As Autodesk.Connectivity.WebServices.PropInst() = WebManager.PropertyService.GetPropertiesByEntityIds("FILE", New Long() {e.FileMasterIds(0)})  'For a selected file
  24.         'Dim folderProperties As Autodesk.Connectivity.WebServices.PropInst() = WebManager.PropertyService.GetPropertiesByEntityIds("FLDR", New Long() {FileID}) ' For a selected folder
  25.         MsgBox(e.FileMasterIds(0))
  26.     End Sub

Прошу меня поправить, если что!

Отмечено как Решение Пашин Евгений 26-05-2017, 10:21:48

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Решение оказалось не совсем простым, но всё же получилось:

Код - vb.net [Выбрать]
  1. Imports Autodesk.Connectivity.Explorer.Extensibility
  2. Imports Autodesk.Connectivity.Extensibility.Framework
  3.  
  4. <Assembly: ApiVersion("10.0")>
  5. <Assembly: ExtensionId("F184B08F-C81C-46F6-A58F-55BD9991F28F")>
  6. Public Class VENs
  7.     Implements IExplorerExtension
  8.     Public Property VltApp As IApplication ' Пришлось создать публичный параметр для доступа к приложению
  9.     Public Function CommandSites() As IEnumerable(Of CommandSite) Implements IExplorerExtension.CommandSites
  10.         Return Nothing
  11.     End Function
  12.     Public Function CustomEntityHandlers() As IEnumerable(Of CustomEntityHandler) Implements IExplorerExtension.CustomEntityHandlers
  13.         Return Nothing
  14.     End Function
  15.     Public Function DetailTabs() As IEnumerable(Of DetailPaneTab) Implements IExplorerExtension.DetailTabs
  16.         Return Nothing
  17.     End Function
  18.     Public Function HiddenCommands() As IEnumerable(Of String) Implements IExplorerExtension.HiddenCommands
  19.         Return Nothing
  20.     End Function
  21.     Public Sub OnLogOff(application As IApplication) Implements IExplorerExtension.OnLogOff
  22.     End Sub
  23.     Public Sub OnLogOn(application As IApplication) Implements IExplorerExtension.OnLogOn
  24.         ' Создание соединения
  25.         Dim Connection As Autodesk.DataManagement.Client.Framework.Vault.Currency.Connections.Connection = application.Connection
  26.         ' Подключаем менеджер сервисов
  27.         Dim WebManager As Autodesk.Connectivity.WebServicesTools.WebServiceManager = Connection.WebServiceManager
  28.         ' Устанавливаем значение параметра для доступа к приложению
  29.         VltApp = application
  30.         ' Регстрируем обработчик события UpdateFileLifecycleStateEvents.Post и привязываем его к процедуре, которая его обработает
  31.         AddHandler Autodesk.Connectivity.WebServices.DocumentServiceExtensions.UpdateFileLifecycleStateEvents.Post, AddressOf Get_Lifecycle_Changes
  32.     End Sub
  33.     ' Процедура обработки события
  34.     Public Sub Get_Lifecycle_Changes(ByVal sender As Object, ByVal e As Autodesk.Connectivity.WebServices.UpdateFileLifeCycleStateCommandEventArgs)
  35.         ' Создание соединения
  36.         Dim Connection As Autodesk.DataManagement.Client.Framework.Vault.Currency.Connections.Connection = VltApp.Connection
  37.         ' Подключаем менеджер сервисов
  38.         Dim WebManager As Autodesk.Connectivity.WebServicesTools.WebServiceManager = Connection.WebServiceManager
  39.         ' Определяем все версии файлой текущего/выделенного файла             
  40.         Dim files As Autodesk.Connectivity.WebServices.File() = WebManager.DocumentService.FindLatestFilesByMasterIds(e.FileMasterIds)
  41.         ' Получаем значения всех свойств текущей (надеюсь, что 0 - индекс текущего файла) версии файла
  42.         Dim values As Autodesk.Connectivity.WebServices.PropInst() = WebManager.PropertyService.GetPropertiesByEntityIds("FILE", New Long() {files(0).Id})
  43.         ' Перебираем все свойства в цикле и выводим в сообщении их имя и значение
  44.         For Each vl As Autodesk.Connectivity.WebServices.PropInst In values
  45.             ' Имя свойства
  46.             Dim propName As String = WebManager.PropertyService.GetPropertyDefinitionInfosByEntityClassId("FILE", New Long() {vl.PropDefId})(0).PropDef.DispName
  47.             ' Значение свойства
  48.             Dim propValue As String = vl.Val.ToString
  49.             ' Сообщение
  50.             MsgBox(propName & vbCrLf & propValue)
  51.         Next
  52.     End Sub
  53.     Public Sub OnShutdown(application As IApplication) Implements IExplorerExtension.OnShutdown
  54.     End Sub
  55.     Public Sub OnStartup(application As IApplication) Implements IExplorerExtension.OnStartup
  56.     End Sub
  57. End Class

Я умышленно не стал вводить сокращения в коде.