Пакетна обробка кількох форматів
Масова обробка кількох CAD-форматів з паралельною трансляцією.
Огляд процесу
Каталог CAD
*.iam
*.ipt
*.stp
*.igs
*.sldprt
Пошук файлів
Сканування каталогу
Фільтрація підтримуваних
Паралельне завантаження
Upload Worker 1
Upload Worker 2
Upload Worker N
Паралельна трансляція
Translate Job 1
Translate Job 2
Translate Job N
Відстеження статусу
Моніторинг прогресу
Збір результатів
Результат
Звіт про статус
Журнал помилок
Вхід→Пошук→Завантаження→Трансляція→Моніторинг→Вихід
Підхід через CLI
Крок 1: Пошук та завантаження файлів
# Upload all supported CAD files
for ext in iam ipt stp step igs iges sldprt sldasm; do
for file in ./cad-files/*.$ext; do
[ -f "$file" ] && raps object upload cad-library "$file"
done
done
Крок 2: Паралельна трансляція
# Start all translations in parallel
raps object list cad-library --output json | jq -r '.[].key' | while read key; do
URN=$(raps object urn cad-library "$key" --output plain)
echo "Starting: $key"
raps translate start "$URN" --format svf2 &
done
# Wait for all background jobs
wait
echo "All translations started"
Крок 3: Моніторинг статусу
# Check status of all translations
echo "Translation Status:"
echo "==================="
raps object list cad-library --output json | jq -r '.[].key' | while read key; do
URN=$(raps object urn cad-library "$key" --output plain)
STATUS=$(raps translate manifest "$URN" 2>/dev/null | jq -r '.status // "pending"')
PROGRESS=$(raps translate manifest "$URN" 2>/dev/null | jq -r '.progress // "0"')
case $STATUS in
success) echo "✓ $key" ;;
failed) echo "✗ $key (FAILED)" ;;
*) echo "⋯ $key ($STATUS $PROGRESS%)" ;;
esac
done
Крок 4: Генерація звіту
# Create batch processing report
echo "# Batch Translation Report" > batch-report.md
echo "Date: $(date)" >> batch-report.md
echo "" >> batch-report.md
SUCCESS=0
FAILED=0
PENDING=0
raps object list cad-library --output json | jq -r '.[].key' | while read key; do
URN=$(raps object urn cad-library "$key" --output plain)
STATUS=$(raps translate manifest "$URN" 2>/dev/null | jq -r '.status // "pending"')
echo "| $key | $STATUS |" >> batch-report.md
done
echo "" >> batch-report.md
echo "Summary: $SUCCESS success, $FAILED failed, $PENDING pending" >> batch-report.md
CI/CD-конвеєр
# .github/workflows/batch-processing.yml
name: Batch CAD Processing
on:
push:
paths:
- 'cad-files/**'
workflow_dispatch:
env:
BUCKET: batch-cad-${{ github.run_id }}
jobs:
process-batch:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install RAPS
run: cargo install raps
- name: Create bucket
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
run: |
raps bucket create --key "$BUCKET" --policy transient --region US
- name: Upload all CAD files
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
run: |
find cad-files -type f \( -name "*.iam" -o -name "*.ipt" -o -name "*.stp" -o -name "*.igs" \) | while read file; do
echo "Uploading: $file"
raps object upload "$BUCKET" "$file" --parallel
done
- name: Start all translations
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
run: |
raps object list "$BUCKET" --output json | jq -r '.[].key' | while read key; do
URN=$(raps object urn "$BUCKET" "$key" --output plain)
raps translate start "$URN" --format svf2 &
done
wait
- name: Wait for translations
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
run: |
MAX_WAIT=1800 # 30 minutes
ELAPSED=0
while [ $ELAPSED -lt $MAX_WAIT ]; do
PENDING=$(raps object list "$BUCKET" --output json | jq -r '.[].key' | while read key; do
URN=$(raps object urn "$BUCKET" "$key" --output plain)
STATUS=$(raps translate manifest "$URN" 2>/dev/null | jq -r '.status // "pending"')
[ "$STATUS" != "success" ] && [ "$STATUS" != "failed" ] && echo "pending"
done | wc -l)
[ "$PENDING" -eq 0 ] && break
echo "Waiting... $PENDING translations in progress"
sleep 30
ELAPSED=$((ELAPSED + 30))
done
- name: Generate report
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
run: |
echo "# Batch Processing Report" > report.md
echo "" >> report.md
echo "| File | Status |" >> report.md
echo "|------|--------|" >> report.md
SUCCESS=0
FAILED=0
raps object list "$BUCKET" --output json | jq -r '.[].key' | while read key; do
URN=$(raps object urn "$BUCKET" "$key" --output plain)
STATUS=$(raps translate manifest "$URN" 2>/dev/null | jq -r '.status // "unknown"')
echo "| $key | $STATUS |" >> report.md
done
- name: Upload report
uses: actions/upload-artifact@v4
with:
name: batch-report
path: report.md
Потік конвеєра
Тригер
Push до cad-files/
→
Налаштування
Створення тимчасового бакета
→
Паралельне завантаження
Пошук CAD-файлів
Завантаження всіх файлів
→
Паралельна трансляція
Запуск усіх завдань
Очікування завершення
→
Звіт
Генерація звіту про статус
Завантаження артефакту
Інтеграція з MCP
Пакетна обробка каталогу
User: "Process all CAD files in the supplier-parts folder"
Користувач
AI-асистент
RAPS MCP
APS Cloud
Користувач
Обробити теку supplier-parts
AI
Сканування каталогу на CAD-файли
цикл: Для кожного файлу
AI
aps_object_upload(bucket, file)
MCP
Завантаження
AI
Завантажено 15 файлів
цикл: Запуск трансляцій
AI
aps_translate_start(urn)
MCP
Запуск завдання
AI
Усі трансляції запущено
цикл: Моніторинг
AI
aps_translate_manifest(urn)
AI
Підсумковий звіт
Відповідь AI:
Обробка теки supplier-parts…
Фаза завантаження: Завантажено 15 файлів (загалом 245 МБ)
Фаза трансляції:
Файл Статус Час bracket-a.stp Завершено 45 с bracket-b.stp Завершено 42 с housing.iam Завершено 2 хв 15 с shaft.ipt Завершено 28 с … … … Підсумок: 15/15 успішно, 0 невдало
Перевірка статусу пакетної обробки
User: "How many files are still processing in the batch?"
Відповідь AI:
Статус пакетної обробки:
- Завершено: 12 файлів
- В обробці: 3 файли (housing.iam на 75%, gearbox.iam на 45%, frame.sldasm на 30%)
- Невдало: 0 файлів
Орієнтовний час залишку: ~3 хвилини
Поради з оптимізації
Паралельне завантаження з обмеженням паралелізму
# Control concurrency to avoid rate limits
MAX_CONCURRENT=5
find ./cad-files -type f \( -name "*.stp" -o -name "*.iam" \) | \
xargs -P $MAX_CONCURRENT -I {} sh -c '
raps object upload cad-library "{}"
echo "Uploaded: {}"
'
Пріоритезація за розміром файлу
# Process smaller files first for quick wins
find ./cad-files -type f -name "*.stp" -printf "%s %p\n" | \
sort -n | cut -d' ' -f2 | while read file; do
raps object upload cad-library "$file"
done
Пропуск вже трансльованих
# Check if already translated before starting
for key in $(raps object list cad-library --output json | jq -r '.[].key'); do
URN=$(raps object urn cad-library "$key" --output plain)
STATUS=$(raps translate manifest "$URN" 2>/dev/null | jq -r '.status // ""')
if [ "$STATUS" != "success" ]; then
echo "Translating: $key"
raps translate start "$URN" --format svf2
else
echo "Skipping (already done): $key"
fi
done