Витяг специфікації матеріалів
Витяг даних специфікації матеріалів (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-001 Housing Aluminum 6061 1 GBX-002 Input Shaft Steel 4140 1 GBX-003 Output Shaft Steel 4140 1 GBX-010 Gear 32T Steel 8620 2 GBX-011 Gear 48T Steel 8620 1 GBX-020 Bearing 6205 - 4 GBX-030 Seal Nitrile 2 Всього: 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