Ця сторінка ще не перекладена українською. Показано англійську версію. Переглянути англійською

Витяг специфікації матеріалів

Витяг даних специфікації матеріалів (BOM) зі збірок Inventor та інших CAD-систем.

Огляд процесу

Вхідна збірка
Inventor Assembly .iam
Трансляція
Трансляція у SVF2
Витяг даних
Ієрархія дерева моделі
Властивості деталей
Обробка BOM
Вирівнювання ієрархії
Підрахунок кількості
Витяг властивостей
Формати експорту
CSV
JSON
Excel
Імпорт ERP
Вхід→Трансляція→Витяг→Обробка→Експорт

Підхід через CLI

Крок 1: Трансляція збірки

URN=$(raps object urn cad-library assembly.iam --output plain)
raps translate start "$URN" --format svf2 --wait

Крок 2: Витяг дерева моделі (ієрархія)

raps derivative tree "$URN" --output json > bom-tree.json

Крок 3: Витяг властивостей деталей

raps derivative properties "$URN" --output json > part-properties.json

Крок 4: Генерація плоского BOM

# Flatten hierarchy to component list
cat bom-tree.json | jq '
  [.. | objects | select(.name != null and .objectid != null) |
   {name: .name, objectid: .objectid}]
' > bom-flat.json

# Count occurrences (quantities)
cat bom-flat.json | jq '
  group_by(.name) |
  map({part: .[0].name, quantity: length}) |
  sort_by(.part)'

Крок 5: Експорт у CSV

# Full BOM with properties
cat part-properties.json | jq -r '
  ["Part Number", "Description", "Material", "Mass"],
  (.[] | [
    .properties["Part Number"] // .name,
    .properties["Description"] // "",
    .properties["Material"] // "",
    .properties["Mass"] // ""
  ]) | @csv
' > bom.csv

CI/CD-конвеєр

# .github/workflows/bom-extraction.yml
name: BOM Extraction Pipeline

on:
  workflow_dispatch:
    inputs:
      bucket:
        description: 'Bucket name'
        required: true
      assembly:
        description: 'Assembly filename'
        required: true

jobs:
  extract-bom:
    runs-on: ubuntu-latest
    steps:
      - name: Install RAPS
        run: cargo install raps

      - name: Extract BOM data
        env:
          APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
          APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
        run: |
          URN=$(raps object urn "${{ inputs.bucket }}" "${{ inputs.assembly }}" --output plain)

          mkdir -p ./bom-export

          # Extract tree and properties
          raps derivative tree "$URN" --output json > ./bom-export/tree.json
          raps derivative properties "$URN" --output json > ./bom-export/properties.json

      - name: Process BOM
        run: |
          # Create flat BOM with quantities
          cat ./bom-export/tree.json | jq '
            [.. | objects | select(.name != null)] |
            group_by(.name) |
            map({
              part: .[0].name,
              quantity: length,
              objectids: [.[].objectid]
            }) |
            sort_by(.part)
          ' > ./bom-export/bom-summary.json

          # Create CSV export
          echo "Part Number,Description,Material,Quantity" > ./bom-export/bom.csv

          cat ./bom-export/bom-summary.json | jq -r '.[] | .part' | while read part; do
            qty=$(cat ./bom-export/bom-summary.json | jq -r ".[] | select(.part == \"$part\") | .quantity")
            desc=$(cat ./bom-export/properties.json | jq -r ".[] | select(.name == \"$part\") | .properties.Description // \"\"" | head -1)
            mat=$(cat ./bom-export/properties.json | jq -r ".[] | select(.name == \"$part\") | .properties.Material // \"\"" | head -1)
            echo "\"$part\",\"$desc\",\"$mat\",$qty" >> ./bom-export/bom.csv
          done

      - name: Generate report
        run: |
          echo "# BOM Report" > ./bom-export/report.md
          echo "Assembly: ${{ inputs.assembly }}" >> ./bom-export/report.md
          echo "Date: $(date)" >> ./bom-export/report.md
          echo "" >> ./bom-export/report.md
          echo "## Summary" >> ./bom-export/report.md
          echo "- Unique parts: $(cat ./bom-export/bom-summary.json | jq 'length')" >> ./bom-export/report.md
          echo "- Total components: $(cat ./bom-export/bom-summary.json | jq '[.[].quantity] | add')" >> ./bom-export/report.md

      - name: Upload BOM artifacts
        uses: actions/upload-artifact@v4
        with:
          name: bom-export
          path: ./bom-export/

Потік конвеєра

Ручний запуск
бакет + збірка
Витяг
Отримання URN
Витяг дерева
Витяг властивостей
Обробка
Вирівнювання ієрархії
Підрахунок кількості
Об’єднання властивостей
Експорт
bom.csv
bom-summary.json
report.md

Інтеграція з MCP

Витяг BOM

User: "Extract the bill of materials from the gearbox assembly"
Користувач
AI-асистент
RAPS MCP
APS Cloud
Користувач
Витягти BOM зі збірки gearbox
AI
aps_object_urn(bucket, “gearbox.iam”)
MCP
URN
AI
aps_derivative_tree(urn)
MCP
Отримання дерева моделі
APS
Tree JSON
AI
aps_derivative_properties(urn)
MCP
Отримання властивостей
APS
Properties JSON
AI
Обробка та агрегація BOM
AI
Таблиця BOM з кількістю

Відповідь AI:

Специфікація матеріалів для збірки Gearbox:

Номер деталіОписМатеріалКількість
GBX-001HousingAluminum 60611
GBX-002Input ShaftSteel 41401
GBX-003Output ShaftSteel 41401
GBX-010Gear 32TSteel 86202
GBX-011Gear 48TSteel 86201
GBX-020Bearing 6205-4
GBX-030SealNitrile2

Всього: 7 унікальних деталей, 12 компонентів

Порівняння BOM

User: "Compare the BOM of v1 and v2 of the assembly"

Відповідь AI:

Порівняння BOM: Gearbox v1 проти v2

Додано у v2:

  • GBX-035 Gasket (кількість: 1)
  • GBX-040 Breather Plug (кількість: 1)

Видалено з v1:

  • GBX-025 O-Ring (було: 2)

Зміни кількості:

  • GBX-020 Bearing: 4 → 6 (+2)

Підсумок: v2 має 9 унікальних деталей (було 8)


Розширена обробка BOM

Деревоподібний BOM (багаторівневий)

# Generate indented BOM showing hierarchy
cat bom-tree.json | jq '
  def indent(level):
    if level > 0 then ("  " * level) + "└─ " else "" end;

  def walk(node; level):
    (indent(level) + node.name),
    (node.children[]? | walk(.; level + 1));

  walk(.; 0)
' -r

BOM з розрахунком вартості

# Assuming properties include cost
cat part-properties.json | jq '
  group_by(.name) |
  map({
    part: .[0].name,
    quantity: length,
    unit_cost: (.[0].properties["Unit Cost"] // 0 | tonumber),
    extended_cost: (length * (.[0].properties["Unit Cost"] // 0 | tonumber))
  }) |
  . + [{
    part: "TOTAL",
    quantity: ([.[].quantity] | add),
    unit_cost: null,
    extended_cost: ([.[].extended_cost] | add)
  }]'

Експорт для ERP-системи

# Format for ERP import (SAP-style)
cat bom-summary.json | jq -r '
  .[] | [
    "BOM",                    # Record type
    "GEARBOX-ASM",           # Parent
    .part,                    # Component
    .quantity,                # Quantity
    "EA",                     # UOM
    "1"                       # BOM level
  ] | @csv
' > erp-import.csv

Пов’язане