Доступ к свойствам детали в Vault

Автор Тема: Доступ к свойствам детали в Vault  (Прочитано 12593 раз)

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

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

Оффлайн Ritor1Автор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
  • Skype: azamatovserik
Приветствую всех!
У меня возникла необходимость получить в коде C# доступ к свойствам детали(красным обозначены на картинке).
https://onedrive.live.com/redir?resid=C4BE91A263730832!111&authkey=!AK4LQgP-L5ow9V4&v=3&ithint=photo%2cpng
Если кто знает как это сделать, поделитесь пожалуйста. Заранее спасибо.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Доступ к свойствам детали в Vault
« Ответ #1 : 29-12-2014, 10:01:20 »
Посмотри в SDK PropertyService:

PropertyService.GetPropertiesByEntityIds("ITEM", new long[] { item.Id });

Оффлайн Дмитрий Емельянов

  • Administrator
  • Сообщений: 38
  • Карма: 7
Re: Доступ к свойствам детали в Vault
« Ответ #2 : 29-12-2014, 13:02:40 »
Ritor1, про доступ к свойствам можете почитать в цикле статей Свойства Vault на нашем же сайте "ADN Open CIS".

Оффлайн Ritor1Автор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
  • Skype: azamatovserik
Re: Доступ к свойствам детали в Vault
« Ответ #3 : 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 раз". Теперь пытаюсь понять как получить значение этого свойства. Если знаете поделитесь пожалуйста.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Доступ к свойствам детали в Vault
« Ответ #4 : 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;

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


Оффлайн Ritor1Автор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
  • Skype: azamatovserik
Re: Доступ к свойствам детали в Vault
« Ответ #5 : 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.  
не получается. :(
Может кто знает как это сделать?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Доступ к свойствам детали в Vault
« Ответ #6 : 30-12-2014, 15:05:21 »
Посмотри в SDK класс ItemService, метод UpdateItemProperties

Оффлайн Ritor1Автор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
  • Skype: azamatovserik
Re: Доступ к свойствам детали в Vault
« Ответ #7 : 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, не могу понять. Может кто делал подобное поделитесь опытом.

Оффлайн Дмитрий Емельянов

  • Administrator
  • Сообщений: 38
  • Карма: 7
Re: Доступ к свойствам детали в Vault
« Ответ #8 : 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.

Думаю, должно стать понятней.

Оффлайн Ritor1Автор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
  • Skype: azamatovserik
Re: Доступ к свойствам детали в Vault
« Ответ #9 : 01-01-2015, 12:12:29 »
Понятнее стало, что может существовать несколько Item Revision. Но пока не понятно как узнать эти данные. Как подобраться к Item с её свойствами, когда известно только selectedFile?

Отмечено как Решение Ritor1 14-01-2015, 12:25:03

Оффлайн Ritor1Автор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
  • Skype: azamatovserik
Re: Доступ к свойствам детали в Vault
« Ответ #10 : 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. Большое спасибо всем кто помогал.
« Последнее редактирование: 05-01-2015, 13:46:21 от Ritor1 »

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Доступ к свойствам детали в Vault
« Ответ #11 : 07-01-2015, 12:52:03 »
Чтобы сразу обновлялось окно свойств: в обработчик commandItem.Execute передаются аргументы события CommandItemEventArgs e.
Нужно в этом обработчике добавить:
Код - C# [Выбрать]
  1. e.Context.ForceRefresh = true;

Вуаля)

Оффлайн Ritor1Автор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
  • Skype: azamatovserik
Re: Доступ к свойствам детали в Vault
« Ответ #12 : 14-01-2015, 12:27:43 »
Александр Игнатович спасибо Вам.
Теперь всё обновляется сразу же.