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

14/12/2014

Строка компонента спецификации в Vault

Ранее поднимался вопрос того, как отключить и повторно включить строки спецификации , но это было только начало. Есть на самом деле 2 типа "выключения" строк спецификации.   Ранее рассмотренный способ - это отключение элементов.   Другой тип - это   строка компонента спецификации, это означает, что дочерняя позиция не является реальным элементом. Компоненты имеют потенциал быть элементами, но ещё не совсем.  

Чтение неприсвоенных строк компонентов

При вызове GetItemBOMByItemIdAndDate, убедитесь, что ваш BOMViewEditOptions включает ReturnUnassignedComponents. Если нет, то строки компонентов будут опущены.   Когда вы вернетесь в ItemBOM, вы можете найти объекты компонентов в BOMCompArray.   Сами по себе строки спецификации представлены объектами ItemAssocArray.   Этот массив содержит ссылки как Item-to-Item, так и Item-to-Component.   Таким образом, при чтении объектов ItemAssoc вы должны учитывать оба случая.

В случае ссылки Item-to-Component, BOMCompId будет иметь действительное значение, но CldItemID и CldItemMasterID будут равны 0. Родитель всегда будет элементом, таким образом ParItemID и ParItemMasterID будет иметь действительное значение во всех случаях.   Там нет такого понятия, как ссылка Component-to-Component в спецификации элементов.

Включение строки компонента спецификации

Если у вас есть строка компонента, которую вы хотите включить, есть несколько шагов. Вы должны способствовать компонент в элемент.   Затем вам необходимо обновить связь спецификации так, чтобы она указывала элемента вместо компонента.

Легче показать это на примере кода. Ниже приведена функция, которая позволяет включить одну строку компонента спецификации.

Код - C#: [Выделить]
  1. publicvoid EnableComponentBOMRow(Item parentItem, stringcomponentName)
  2. {
  3.     ItemService itemSvc =
  4.         connection.WebServiceManager.ItemService;
  5.  
  6.      // Поместить родительский элемент в режиме редактирования
  7.     Item editableItem = itemSvc.EditItems(
  8.         newlong [] {parentItem.RevId}).First();
  9.  
  10.      // Читаем данные спецификации
  11.     ItemBOM bom = itemSvc.GetItemBOMByItemIdAndDate(
  12.         editableItem.Id,
  13.         DateTime.MinValue, BOMTyp.Tip,
  14.         BOMViewEditOptions.Defaults |
  15.         BOMViewEditOptions.ReturnExcluded |
  16.         BOMViewEditOptions.ReturnUnassignedComponents);
  17.  
  18.      // Найти компонент, который мы хотим включить
  19.     BOMComp component = bom.BOMCompArray.FirstOrDefault(n =>
  20.         n.Name == componentName);
  21.  
  22.      // Содействовать компонент
  23.     itemSvc.AddComponentsToPromote(newlong [] {component.Id},
  24.         ItemAssignAll.Default, false);
  25.     DateTime timestamp;
  26.     GetPromoteOrderResults orderResult =
  27.         itemSvc.GetPromoteComponentOrder(out timestamp);
  28.     itemSvc.PromoteComponents(timestamp,
  29.         orderResult.PrimaryArray);
  30.     ItemsAndFiles promoteResult =
  31.         itemSvc.GetPromoteComponentsResults(timestamp);
  32.  
  33.      // Обновить ссылку спецификации, чтобы указать на пункт
  34.     // Вместо компонента
  35.     ItemAssoc bomLink = bom.ItemAssocArray.First(n =>
  36.         n.ParItemID == editableItem.Id &&
  37.         n.BOMCompId == component.Id);
  38.     itemSvc.UpdateItemBOMAssociations(
  39.         editableItem.Id,
  40.         newlong [] {bomLink.Id},
  41.         newlong [] {promoteResult.ItemRevArray[0].Id},
  42.         newdouble [] {bomLink.Quant},
  43.         newbool [] {bomLink.IsStatic},
  44.         newbool [] {true},
  45.         newint [] {bomLink.BOMOrder},
  46.         newstring [] {bomLink.PositionNum},
  47.         newBOMEditAction [] {BOMEditAction.Update},
  48.         BOMViewEditOptions.ReturnBOMFragmentsOnEdits);
  49.  
  50.      // Фиксации изменений в качестве родительского элемента и
  51.     // Вновь способствовали пункт
  52.     List<Item> itemsToCommit = newList<Item>();
  53.     itemsToCommit.Add(editableItem);
  54.     itemsToCommit.AddRange(promoteResult.ItemRevArray);
  55.     itemSvc.UpdateAndCommitItems(itemsToCommit.ToArray());
  56. }

Код - VBA: [Выделить]
  1.  
  2. PublicSub EnableComponentBOMRow(parentItem AsItem, componentNameAsString)
  3.        Dim itemSvc AsItemService = connection.WebServiceManager.ItemService
  4.  
  5.         ' Поставить родительский элемент в режиме редактирования
  6.        Dim editableItem AsItem = itemSvc.EditItems(NewLong() {parentItem.RevId}).First()
  7.  
  8.         ' Читать данные спецификации
  9.        Dim bom AsItemBOM = itemSvc.GetItemBOMByItemIdAndDate(editableItem.Id,DateTime.MinValue, BOMTyp.Tip, BOMViewEditOptions.DefaultsOrBOMViewEditOptions.ReturnExcludedOrBOMViewEditOptions.ReturnUnassignedComponents)
  10.  
  11.         ' Найти компонент, который мы хотим включить
  12.        Dim component AsBOMComp = bom.BOMCompArray.FirstOrDefault(Function(n) n.Name = componentName)
  13.  
  14.         ' Содействовать компонент
  15.        itemSvc.AddComponentsToPromote(NewLong() {component.Id}, ItemAssignAll.[Default], False)
  16.        Dim timestamp AsDateTime
  17.        Dim orderResult As GetPromoteOrderResults = itemSvc.GetPromoteComponentOrder(timestamp)
  18.        itemSvc.PromoteComponents (метка, orderResult.{0}PrimaryArray{/0}{0}){/0}
  19.        Dim promoteResult AsItemsAndFiles = itemSvc.GetPromoteComponentsResults(timestamp)
  20.  
  21.         ' Обновить ссылку спецификации, чтобы указать на пункт вместо элемента
  22.        Dim bomLink AsItemAssoc = bom.ItemAssocArray.First(Function(n) n.ParItemID = editableItem.IdAndAlso n.BOMCompId = component.Id)
  23.        itemSvc.UpdateItemBOMAssociations(editableItem.Id,NewLong() {bomLink.Id}, NewLong() {promoteResult.ItemRevArray(0).Id}, NewDouble() {bomLink.Quant},NewBoolean() {bomLink.IsStatic}, NewBoolean() {True}, _
  24.               NewInteger() {bomLink.BOMOrder}, NewString() {bomLink.PositionNum}, New BOMEditAction() {BOMEditAction.Update},BOMViewEditOptions.ReturnBOMFragmentsOnEdits)
  25.  
  26.         ' Фиксации изменений в родительским элементом и вновь способствовали пункт
  27.        Dim itemsToCommit AsNewList(OfItem)()
  28.        itemsToCommit.Add(editableItem)
  29.        itemsToCommit.AddRange(promoteResult.ItemRevArray)
  30.        itemSvc.UpdateAndCommitItems(itemsToCommit.ToArray())
  31. EndSub

Включение строки компонента спецификации

Технически это больше не строка компонента. Это нормальная строка с тех пор, как дочерним является элемент.   Если вы хотите выключить строку, вы можете   отключить её. Отключение строку оставляет элемент без изменений.   Так, строка еще является ссылкой Item-to-Item.

Если мы хотим по-настоящему вернуться в состояние, которое является ссылкой Item-to-Component, можно удалить элемент. Это приведет спецификацию к возврату строки к использованию компонента.   Этот процесс работает только для элементов, которые основаны на компонентах.   Если элементы создается непосредственно в Мастере элементов, то там компонентов нет.   Удаление элемента в этом случае просто удалит его из всех спецификаций, в которых он находится.

Откуда приходят компоненты

Компоненты приходят из файлов САПР. Когда файл САПР загружается в хранилище, плагин САПР включает информацию спецификации.   Эта информация становится компонентами, а компоненты становятся элементами.   Если вы хотите получить больше информации, вы можете прочитать статью о   конвейеризации спецификаций. Основная идея в том, что компоненты являются завязаны на файлы САПР. Элементы, созданные непосредственно в Мастере элементов, не имеют компонентов.

Источник: http://justonesandzeros.typepad.com/blog/2014/05/component-bom-rows.html

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

Опубликовано 14.12.2014