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

ADN Club => Vault API => Тема начата: Ritor1 от 26-12-2014, 20:01:26

Название: Доступ к свойствам детали в Vault
Отправлено: Ritor1 от 26-12-2014, 20:01:26
Приветствую всех!
У меня возникла необходимость получить в коде C# доступ к свойствам детали(красным обозначены на картинке).
https://onedrive.live.com/redir?resid=C4BE91A263730832!111&authkey=!AK4LQgP-L5ow9V4&v=3&ithint=photo%2cpng (https://onedrive.live.com/redir?resid=C4BE91A263730832!111&authkey=!AK4LQgP-L5ow9V4&v=3&ithint=photo%2cpng)
Если кто знает как это сделать, поделитесь пожалуйста. Заранее спасибо.
Название: Re: Доступ к свойствам детали в Vault
Отправлено: Александр Игнатович от 29-12-2014, 10:01:20
Посмотри в SDK PropertyService:

PropertyService.GetPropertiesByEntityIds("ITEM", new long[] { item.Id });
Название: Re: Доступ к свойствам детали в Vault
Отправлено: Дмитрий Емельянов от 29-12-2014, 13:02:40
Ritor1, про доступ к свойствам можете почитать в цикле статей Свойства Vault (http://adn-cis.org/articles/vault/cookbook/9-svojstva/) на нашем же сайте "ADN Open CIS".
Название: Re: Доступ к свойствам детали в Vault
Отправлено: Ritor1 от 30-12-2014, 10:21:57
Приветствую всех!
Александр Игнатович, спасибо большое. Ваш пост задал мне направление поиска.
Дмитрий Емельянов, не менее благодарен Вам. Ваш огромный труд на сайте "ADN Open CIS" не остался не замеченным. Только там про свойства немного(про определяемые пользователем вроде нет) и в основном на VB.

На настоящий момент чтобы получить доступ к свойствам (Определяемое пользователем) детали, сделал следующее:
Код - C# [Выбрать]
  1. PropDef[] fileProps = connection.WebServiceManager.PropertyService.GetPropertyDefinitionsByEntityClassId("ITEM");
  2. IEnumerable<PropDef> selection1 =
  3.  from propDef in fileProps
  4.  where propDef.DispName == "Материал"
  5.  select propDef;
  6. int num = selection1.Count();
  7. if (selection1.Count() == 0)
  8.   //throw new Exception("Свойство не найдено");
  9.   MessageBox.Show("Свойство не найдено");
  10. else
  11.   MessageBox.Show(String.Format("Свойство найдено {0} раз", num));
  12.  

Как результат, выходит сообщение что "найдено 1 раз". Теперь пытаюсь понять как получить значение этого свойства. Если знаете поделитесь пожалуйста.
Название: Re: Доступ к свойствам детали в Vault
Отправлено: Александр Игнатович от 30-12-2014, 10:45:41
Что-то вроде:
var propId = selection1.First().Id
var value = connection.WebServiceManager.PropertyService.GetProperties("ITEM", new[] { item.Id }, new[] { propId }).First().Val;

Только, соответственно, проверять, что найдено определение свойства, найдены значения, и т.д.

Название: Re: Доступ к свойствам детали в Vault
Отправлено: Ritor1 от 30-12-2014, 14:53:08
Получилось! Теперь я могу получать значение "Материал". Прикрепляю код:

Код - C# [Выбрать]
  1.  PropDef[] fileProps = connection.WebServiceManager.PropertyService.GetPropertyDefinitionsByEntityClassId("ITEM");
  2.  IEnumerable<PropDef> selection1 =
  3.       from propDef in fileProps
  4.       where propDef.DispName == "Материал"
  5.      select propDef;
  6.  
  7. PropInst[] values = connection.WebServiceManager.PropertyService.GetProperties("ITEM", new long[] { selectedFile.Id }, new long[] { selection1.First().Id });
  8. MessageBox.Show(values[0].Val.ToString());
  9.  

Но присвоить свойству "Материал" другое значение следующим кодом:
Код - C# [Выбрать]
  1. values[0].Val = "Rubber";
  2.  
не получается. :(
Может кто знает как это сделать?
Название: Re: Доступ к свойствам детали в Vault
Отправлено: Александр Игнатович от 30-12-2014, 15:05:21
Посмотри в SDK класс ItemService, метод UpdateItemProperties
Название: Re: Доступ к свойствам детали в Vault
Отправлено: Ritor1 от 30-12-2014, 15:56:52
Александр Игнатович спасибо за оперативность. Как я понял, нужно производить обновление файла. В SDK так мало написано.
Пробую так:
Код - C# [Выбрать]
  1. values[0].Val = "Rubber";
  2. connection.WebServiceManager.ItemService.UpdateItemProperties(selectedFile.Id, values[0].PropDefId, values[0].Val);
  3.  
Но у меня всё краснит. И не понятно какие аргументы надо передавать в функцию.
В описании функции так:
public Item[] UpdateItemProperties(
   System.long[] itemRevIds,
   System.long[] propDefIds,
   System.object[] values
)
а что именно представляет itemRevIds, не могу понять. Может кто делал подобное поделитесь опытом.
Название: Re: Доступ к свойствам детали в Vault
Отправлено: Дмитрий Емельянов от 30-12-2014, 16:11:31
Item Class в SDK содержит слеюующую заметку:

Цитировать
There are 3 levels of Item data. At the top level is the Item Master.
Item Masters can have multiple Item Revisions.
Every time a Revision is modified, a new Item Version is created.
The Item class represents an Item Version.

Думаю, должно стать понятней.
Название: Re: Доступ к свойствам детали в Vault
Отправлено: Ritor1 от 01-01-2015, 12:12:29
Понятнее стало, что может существовать несколько Item Revision. Но пока не понятно как узнать эти данные. Как подобраться к Item с её свойствами, когда известно только selectedFile?
Название: Re: Доступ к свойствам детали в Vault
Отправлено: Ritor1 от 05-01-2015, 13:35:30
Поля Свойства(Определяемые пользователем) получилось изменить. Я подключил ExtensibilityTools:
Код - C# [Выбрать]
  1. using Autodesk.Connectivity.Explorer.ExtensibilityTools;
  2.  
Далее вставил в код:
Код - C# [Выбрать]
  1. PropDef[] fileProps = connection.WebServiceManager.PropertyService.GetPropertyDefinitionsByEntityClassId("FILE");
  2. PropDef prop = new PropDef();
  3.  
  4. for (int i = 0; i < fileProps.Count(); i++)
  5. {
  6.   if(fileProps[i].DispName == "Код ЕСКД")
  7.     prop = fileProps[i];
  8. }
  9. System.Collections.Generic.Dictionary<PropDef, object> propAndVals = new Dictionary<PropDef,object>();
  10. propAndVals.Add(prop, MyDialogBox.eskd_code);//MyDialogBox.eskd_code беру из созданного отдельно модального окна(можно просто указать статично "test")
  11.  
  12. var explorerUtil = ExplorerLoader.GetExplorerUtil(e.Context.Application);
  13. explorerUtil.UpdateFileProperties(selectedFile, propAndVals);
  14.  
Но при этом не сразу обновляется окно свойств. Приходится нажимать на другую папку и вновь нажимать на папку компонентов, чтобы обновилось отображение свойств. Может кто знает как это исправить, т.е. чтобы сразу обновлялось окно свойств?
Видео(звук немного запаздывает): https://onedrive.live.com/redir?resid=C4BE91A263730832!112&authkey=!AIlMXRlDOrkuVRM&ithint=video%2cmp4

Ну а в целом вроде всё получилось. Это мой первый плагин для Vault. Большое спасибо всем кто помогал.
Название: Re: Доступ к свойствам детали в Vault
Отправлено: Александр Игнатович от 07-01-2015, 12:52:03
Чтобы сразу обновлялось окно свойств: в обработчик commandItem.Execute передаются аргументы события CommandItemEventArgs e.
Нужно в этом обработчике добавить:
Код - C# [Выбрать]
  1. e.Context.ForceRefresh = true;

Вуаля)
Название: Re: Доступ к свойствам детали в Vault
Отправлено: Ritor1 от 14-01-2015, 12:27:43
Александр Игнатович спасибо Вам.
Теперь всё обновляется сразу же.