Autodesk Inventor API. Первые шаги/Спецификация
Введение в Спецификацию (BOM)
правитьИнвентор может отслеживать изменения состава компонентов в сборке с целью генерации спецификаций (BOM, Bill of Materials), широко используемых в производственной практике.
Для программного управления выборкой данных для спецификаций, их экспорта во внешние приложения и обеспечения прямого доступа к структуре данных спецификаций предусмотрен программный интерфейс спецификаций BOM API.
BOM представляет собой, как минимум, список компонентов, их количества, вычисляемые итоги. Кроме того, BOM нередко включает шифры деталей, инвентарные номера, размеры заготовок и т.п. Autodesk Inventor имеет средства для отображения всей этой информации в табличном формате на чертежах.
Данные для спецификации формируются на основе выборки информации из структуры данных сборки и могут подвергаться разнообразной обработке. Например, вычисленные количественные суммы могут быть преобразованы к другим единицам измерения, переопределены или сделаны значением параметра. Позиции в спецификации могут быть перенумерованы и реорганизованы.
Компонентам, на которые ссылается BOM, могут быть поставлены в соответствие типы, указывающие каким образом данный компонент должен найти отражение в спецификации. С этой целью в BOM API доступно значение свойства компонента «Структура спецификации» (BOM Structure). Оно определяет тип компонента в спецификации и может принимать одно из пяти значений:
- Обычный (Normal)
- Фантомный (Phantom), присутствуют в модели, но не указываются в спецификации отдельной строкой.
- Ссылочный (Reference), полностью исключаются из BOM, хотя и является компонентом модели.
- Приобретенный (Purchased), представляется в спецификации одной строкой, даже если на самом деле является подсборкой.
- Неразделяемый (Inseparable). Обычно является сборочной единицей, разборка которой невозможна без физических повреждений. Во многих производственных процессах неразделяемые сборки, как и приобретаемые компоненты, удобно представлять одной позицией, но, как правило, они являются изделиями собственного производства.
Объектная модель BOM
править
Использование API для работы с BOM
правитьВнутренние механизмы Autodesk Inventor поддерживают актуальность BOM, отслеживая изменения состава сборки и обновляя соответствующим образом типы компонентов и количественные показатели. Актуализация BOM может выполняться как средствами пользовательского интерфейса так и инструментами BOM API. С помощью API можно вносить в BOM дополнительные изменения, производить выборки и экспортировать данные. Autodesk Inventor активно использует объекты PropertySet для хранения в BOM свойств компонентов. Клиентский код может получить прямой и непосредственный доступ к этим данным.
Запрос на формирование BOM
Код следующего примера иллюстрирует применение API для выборки из сборки данных для спецификации. Предполагается, что в Инвентор загружена демонстрационная сборка Arbor_Press.iam. Для уменьшения размера и улучшения читаемости программы опущены процедуры обработки ошибок.
Рекомендуется всегда проверять значения, возвращаемые процедурами и функциями, на корректность типа и попадание в диапазон допустимых величин. |
Итак, сначала следует получить ссылку на объект BOM, предоставляемый описанием сборки — её объектом ComponentDefinition.
Dim oBOM As BOM Set oBOM = ThisApplication.ActiveDocument.ComponentDefinition.BOM
Далее из BOM получим ссылку на объект BOMView с именем «Structured» (структурированный). BOM может также содержать представления, в которых позиции упорядочены или перенумерованы.
Dim oBOMView As BOMView Set oBOMView = oBOM.BOMViews.Item("Structured")
Организуем цикл по элементам коллекции строк BOMRows объекта BOMView, получая для каждой строки ссылку на объект BOMRow.
Dim i As Long For i = 1 To oBOMView.BOMRows.Count Dim oRow As BOMRow Set oRow = oBOMView.BOMRows.Item(i)
Для некоторых видов данных BOM нам требуется обращение к свойствам компонента, представленного в данной строке. Доступ к коллекции PropertySets компонента обеспечивает объект ComponentDefinition компонента.
Dim oCompDef As ComponentDefinition Set oCompDef = oRow.ComponentDefinitions.Item(1)
Нужный в данном случае набор свойств называется «Design Tracking Properties». Ссылку на него можно получить как свойство документа-владельца нашего компонента.
Dim oPropSet As PropertySet Set oPropSet = oCompDef.Document.PropertySets.Item("Design Tracking Properties")
Теперь у нас есть вся необходимая информация о содержимом спецификации. Извлекаем из объекта BOMRow и выводим в окно отладочной печати номера позиций (ItemNumber) и количество в строке (ItemQuantity), а из набора свойств oPropSet — номер детали и ее описание.
Debug.Print "#: "; oRow.ItemNumber; _ " Quantity:"; oRow.ItemQuantity; _ "Part: "; oPropSet.Item("Part Number").Value; _ " Desc: "; oPropSet.Item("Description").Value Next
Приведенный фрагмент программы в цикле по всем строкам BOMRows объекта BOMView выводит в окно отладочной печати данные спецификации. Результат работы программы должен выглядеть примерно так:
#: 1 Quantity: 1 Part: Arbor Press Desc: #: 2 Quantity: 1 Part: FACE PLATE Desc: #: 3 Quantity: 1 Part: PINION SHAFT Desc: #: 4 Quantity: 1 Part: LEVER ARM Desc: #: 5 Quantity: 1 Part: THUMB SCREW Desc: #: 6 Quantity: 1 Part: TABLE PLATE Desc: #: 7 Quantity: 1 Part: RAM Desc: #: 8 Quantity: 2 Part: HANDLE CAPipt Desc: #: 9 Quantity: 1 Part: COLLAR Desc: #: 10 Quantity: 1 Part: GIB PLATE Desc: #: 11 Quantity: 1 Part: GROOVE PIN Desc: #: 12 Quantity: 4 Part: ANSI B18.3 - 1/4 - 20 - 7/8 Desc: Hexagon Socket Head Cap Screw #: 13 Quantity: 4 Part: ANSI B18.3 - 10-32 UNF x 0.58 Desc: Hexagon Socket Set Screw - Flat Point #: 14 Quantity: 1 Part: ANSI B18.6.2 - 10-32 UNF - 0.1875 Desc: Slotted Headless Set Screw - Flat Point - UNF (Fine Thread - Inch)
Развернутый пример
правитьНиже приведен более развернутый пример из справочной системы AIS 2009, демонстрирующий функциональность BOM API в сборке. Перед выполнением программы следует сделать активным документ сборки.
Public Sub BOMQuery() ' Получим ссылку на активный документ. ' Предполагается, что активна сборка. Dim oDoc As AssemblyDocument Set oDoc = ThisApplication.ActiveDocument 'Зададим глубину выборки данных для BOM Dim FirstLevelOnly As Boolean If MsgBox("Только верхний уровень?", vbYesNo) = vbYes Then FirstLevelOnly = True Else FirstLevelOnly = False End If ' Ссылка на объект BOM сборки Dim oBOM As BOM Set oBOM = oDoc.ComponentDefinition.BOM ' Выставим в BOM свойство глубины выборки данных ' в соответствии с указанием пользователя If FirstLevelOnly Then oBOM.StructuredViewFirstLevelOnly = True Else oBOM.StructuredViewFirstLevelOnly = False End If ' Зададим явно структурированный вид спецификации oBOM.StructuredViewEnabled = True 'из BOM получим ссылку на объект BOMView с именем "Structured" Dim oBOMView As BOMView Set oBOMView = oBOM.BOMViews.Item("Structured") Debug.Print "Поз."; Tab(15); "Кол-во"; Tab(30); "Номер детали"; Tab(70); "Описание" Debug.Print "----------------------------------------------------------------------------------" 'Начальное значение для переменной ItemNumber Dim ItemTab As Long ItemTab = -3 Call QueryBOMRowProperties(oBOMView.BOMRows, ItemTab) End Sub '~~~ BOMQuery ~~~ Private Sub QueryBOMRowProperties(oBOMRows As BOMRowsEnumerator, ItemTab As Long) ItemTab = ItemTab + 3 ' Цикл по строкам спецификации Dim i As Long For i = 1 To oBOMRows.Count ' ссылка на текущую строку #i Dim oRow As BOMRow Set oRow = oBOMRows.Item(i) ' ссылка на ComponentDefinition данной строки Dim oCompDef As ComponentDefinition Set oCompDef = oRow.ComponentDefinitions.Item(1) Dim oPartNumProperty As Property Dim oDescripProperty As Property If TypeOf oCompDef Is VirtualComponentDefinition Then ' Если компонент является виртуальным: ' Из определения виртуального компонента ' считываем свойство компонента "Part Number" Set oPartNumProperty = oCompDef.PropertySets _ .Item("Design Tracking Properties").Item("Part Number") ' считываем свойство компонента "Description" Set oDescripProperty = oCompDef.PropertySets _ .Item("Design Tracking Properties").Item("Description") 'вывод строки в отладочное окно Debug.Print Tab(ItemTab); oRow.ItemNumber; Tab(17); oRow.ItemQuantity; Tab(30); _ oPartNumProperty.Value; Tab(70); oDescripProperty.Value Else ' Cвойство компонента "Part Number" считываем ' из документа, связанного с ComponentDefinition компонента. Set oPartNumProperty = oCompDef.Document.PropertySets _ .Item("Design Tracking Properties").Item("Part Number") ' считываем свойство компонента "Description" Set oDescripProperty = oCompDef.Document.PropertySets _ .Item("Design Tracking Properties").Item("Description") 'вывод строки в отладочное окно Debug.Print Tab(ItemTab); oRow.ItemNumber; Tab(17); oRow.ItemQuantity; Tab(30); _ oPartNumProperty.Value; Tab(70); oDescripProperty.Value 'Рекурсивный перебор дочерних строк, если таковые имеются If Not oRow.ChildRows Is Nothing Then Call QueryBOMRowProperties(oRow.ChildRows, ItemTab) End If End If Next ItemTab = ItemTab - 3 End Sub '~~~ QueryBOMRowProperties ~~~
Продемонстрируем работу программы BOMQuery на примере сборки Stapler.iam из комплекта поставки Autodesk Inventor Suite 2009.
Если глубину выборки данных ограничить компонентами верхнего уровня сборки, то результат работы программы будет выглядеть следующим образом.
Поз. Кол-во Номер детали Описание ---------------------------------------------------------------------------------- 1 1 Bottom 2 1 Upper
Если же глубину выборки не ограничивать, картина получится существенно разнообразнее, поскольку мы увидим структуру сборки.
Поз. Кол-во Номер детали Описание ---------------------------------------------------------------------------------- 1 1 Bottom 1.1 1 Bottom - Back 1.2 1 Bottom - Front 1.3 1 Lower Mount 1.4 1 Spring 1.5 1 Bottom - Anvil 2 1 Upper 2.4 1 Upper - Insert 2.1 1 Upper - Derrived 2.2 1 Channel - Spring Clip 2.3 1 Channel 2.3.6 1 Channel - Cover1 2.3.2 1 Pusher 2.3.1 1 Channel - Cover2 2.3.3 1 Channel - Hinge Pin 2.3.4 1 Staples 2.3.5 1 Channel - Bumper