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

19/09/2014

Лёгкое программирование под Autodesk Vault Часть 39

Рекомендуемый способ добавления определяемых пользователем свойств (UDP) - это использование интерфейса Vault Explorer, но иногда разработчик хочет сделать это с помощью кода.

Будем использовать функцию API AddPropertyDefinition для достижения этой цели. Это позволяет установить отображение свойств со свойствами некоторых файлов, например iProperties в файле Inventor, при создании нового UDP. При настройке отображения псевдоним (Moniker) источника содержимого является ключевой информацией. Псевдоним - это строка, которая состоит из трех частей:

1) Отображаемое имя свойства файла;

2) CLSID для свойства (т.е. CLSID для любых пользовательских свойств в файле Inventor можно найти в Vault 2012\Explorer\ProviderConfig_Inventor.xml: Microsoft User Defined PropertySet id. Функция GetPropertyDefinitionInfosByEntityClassId в Vault API также может вернуть вам всю информацию по свойству.);

3) Строка указывает тип данных значения свойства.

Эти три части разделяются восклицательным знаком. Вот пример значения псевдонима для пользовательского свойства с именем 'UserPropertyTest' в файле Inventor:

UserPropertyTest!{D5CDD505-2E9C-101B-9397-08002B2CF9AE}!nvarchar

Первая часть, как правило, различна для разных свойствах, но вторая часть отображения значения псевдонима к Inventor iProperties постоянна во всех хранилищах. Это может быть неверно для других продуктов. Например, было сказано, что вторая часть для каждого из атрибута заглавного блока AutoCAD отличается, и даже для одного и того же атрибута, вторая часть на другом сервере хранилища не такая же.

Приведенный ниже пример на C# описывает, как добавить UDP с именем "TestMapAPI" и установить отображение типа запись (без чтения) для связи его с пользовательским свойством с именем "UserPropertyTest" в файле Inventor. Перед запуском примера, необходимо иметь существующий UDP с именем "Test" в Vault и его отображение в свойство "UserPropertyTest" в файле Inventor.

Код - C#: [Выделить]
  1. // Настройте учетные данные для хранилища.
  2. // Для демонстрационных целей, информация записана жестко.
  3. UserPasswordCredentials login = new UserPasswordCredentials(
  4.     "localhost""Vault""Administrator"""false);
  5. // Создание WebServiceManager который может быть использован для всех вызовов Vault Server.
  6. // Помещение менеджера в блок using гарантирует, что он разорвет соединение, когда мы закончим.
  7. using (WebServiceManager serviceManager = new WebServiceManager(login))
  8. {
  9.     PropDef[] props = serviceManager.PropertyService.
  10.       GetPropertyDefinitionsByEntityClassId("FILE");
  11.  
  12.     string Moniker = "";
  13.     foreach (PropDef prop in props)
  14.     {
  15.         if (prop.DispName == "Test")
  16.         {
  17.             PropDefInfo[] propInfos = serviceManager.
  18.                 PropertyService.GetPropertyDefinitionInfosByEntityClassId(
  19.                 "FILE"new long[] { prop.Id });
  20.  
  21.             foreach (PropDefInfo propInfo in propInfos)
  22.             {
  23.                 Moniker = propInfo.EntClassCtntSrcPropCfgArray[0].
  24.                   CtntSrcPropDefArray[0].Moniker.Split('!')[1];
  25.             }
  26.         }
  27.     }
  28.     CtntSrcPropDef ctntSrcPropDef = new CtntSrcPropDef();
  29.     ctntSrcPropDef.DispName = "UserPropertyTest";
  30.     ctntSrcPropDef.CanCreateNew = true;
  31.     ctntSrcPropDef.Classification = Classification.Custom;
  32.     ctntSrcPropDef.CtntSrcDefTyp = CSPDefTypes.File;
  33.     ctntSrcPropDef.CtntSrcId = 4;
  34.     ctntSrcPropDef.MapDirection = AllowedMappingDirection.Write;
  35.     ctntSrcPropDef.Typ = DataType.String;
  36.     ctntSrcPropDef.Moniker = "UserPropertyTest!"+Moniker+"!nvarchar";
  37.  
  38.     EntClassCtntSrcPropCfg entClsCtntSrcPropCfg = newEntClassCtntSrcPropCfg();
  39.     entClsCtntSrcPropCfg.EntClassId = "FILE";
  40.     entClsCtntSrcPropCfg.CanCreateNewArray = new bool[] { true };
  41.     entClsCtntSrcPropCfg.CtntSrcPropDefArray = new CtntSrcPropDef[] {
  42.       ctntSrcPropDef };
  43.     entClsCtntSrcPropCfg.MapDirectionArray = new MappingDirection[] {
  44.       MappingDirection.Write };
  45.     entClsCtntSrcPropCfg.MapTypArray = newAutodesk.Connectivity.WebServices.
  46.       MappingType[] { Autodesk.Connectivity.WebServices.MappingType.Constant };
  47.      entClsCtntSrcPropCfg.PriorityArray = new int[] { 0 };
  48.      PropDefInfo propDefInfo = serviceManager.PropertyService.AddPropertyDefinition(
  49.       "921579AE-C383-4837-AC78-05B19F5DDDDB""TestMapAPI", DataType.String,
  50.       falsetruestring.Emptynew string[] { "FILE" },
  51.       new EntClassCtntSrcPropCfg[] { entityClassCtntSrcPropCfg }null,null);
 

Если вы отображаете не пользовательские Inventor iProperties, например, свойство "Проект", вам необходимо изменить некоторые свойства объекта CtntSrcPropDef в коде выше - в том числе.DispName на "Проект", и.Classification to “Classification.Standard”, возле .Moniker изменить на: "Project!" + Moniker + "!nvarchar";

Источник: http://adndevblog.typepad.com/manufacturing/2012/06/add-user-defined-property-by-vault-api.html

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

Опубликовано 19.09.2014
Отредактировано 19.09.2014 в 14:09:19