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