Відстеження ітерацій проєктування
Організація CAD-файлів за ревізіями та відстеження змін проєктування з часом.
Огляд процесу
Конвенція іменування
parts/{part-number}/{revision}/file.ipt
Структура OSS
parts/12345/rev-A/part.ipt
parts/12345/rev-B/part.ipt
parts/12345/rev-C/part.ipt
parts/12345/latest/part.ipt
Трансляція
SVF2 rev-A
SVF2 rev-B
SVF2 rev-C
Порівняння
Різниця властивостей
Зміна геометрії
Конвенція→Зберігання→Трансляція→Порівняння
Підхід через CLI
Крок 1: Завантаження з метаданими ревізії
PART_NUMBER="12345"
REVISION="rev-B"
# Upload with structured key
raps object upload cad-library part.ipt --key "parts/${PART_NUMBER}/${REVISION}/part.ipt"
# Also update "latest" reference
raps object upload cad-library part.ipt --key "parts/${PART_NUMBER}/latest/part.ipt"
Крок 2: Перелік усіх ревізій
PART_NUMBER="12345"
raps object list cad-library --prefix "parts/${PART_NUMBER}/" --output json | \
jq -r '.[] | .key' | sort
# Output:
# parts/12345/latest/part.ipt
# parts/12345/rev-A/part.ipt
# parts/12345/rev-B/part.ipt
# parts/12345/rev-C/part.ipt
Крок 3: Порівняння ревізій
# Get URNs for two revisions
REV_A_URN=$(raps object urn cad-library "parts/12345/rev-A/part.ipt" --output plain)
REV_B_URN=$(raps object urn cad-library "parts/12345/rev-B/part.ipt" --output plain)
# Extract properties for comparison
raps derivative properties "$REV_A_URN" --output json > rev-a-props.json
raps derivative properties "$REV_B_URN" --output json > rev-b-props.json
# Compare key properties
echo "Revision Comparison:"
echo "===================="
for prop in "Mass" "Volume" "Material"; do
VAL_A=$(jq -r ".[0].properties[\"$prop\"] // \"N/A\"" rev-a-props.json)
VAL_B=$(jq -r ".[0].properties[\"$prop\"] // \"N/A\"" rev-b-props.json)
if [ "$VAL_A" != "$VAL_B" ]; then
echo "$prop: $VAL_A → $VAL_B (CHANGED)"
else
echo "$prop: $VAL_A (unchanged)"
fi
done
Крок 4: Генерація звіту про історію ревізій
PART_NUMBER="12345"
echo "# Revision History: Part $PART_NUMBER" > revision-history.md
echo "" >> revision-history.md
raps object list cad-library --prefix "parts/${PART_NUMBER}/rev-" --output json | \
jq -r '.[] | .key' | sort | while read key; do
REV=$(echo "$key" | grep -oP 'rev-\w+')
DATE=$(raps object list cad-library --prefix "$key" --output json | jq -r '.[0].lastModified')
URN=$(raps object urn cad-library "$key" --output plain)
MASS=$(raps derivative properties "$URN" --output json 2>/dev/null | jq -r '.[0].properties.Mass // "N/A"')
echo "## $REV" >> revision-history.md
echo "- Date: $DATE" >> revision-history.md
echo "- Mass: $MASS" >> revision-history.md
echo "" >> revision-history.md
done
CI/CD-конвеєр
# .github/workflows/design-iterations.yml
name: Design Iteration Tracking
on:
push:
paths:
- 'parts/**/*.ipt'
- 'parts/**/*.iam'
jobs:
track-iterations:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # Full history for comparison
- name: Install RAPS
run: cargo install raps
- name: Upload new revisions
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
run: |
BUCKET="design-iterations"
REVISION="rev-$(date +%Y%m%d)"
for file in $(git diff --name-only HEAD~1 HEAD -- 'parts/**'); do
[ -f "$file" ] || continue
# Extract part number from path (parts/XXXXX/file.ipt)
PART_NUM=$(echo "$file" | cut -d'/' -f2)
FILENAME=$(basename "$file")
# Upload versioned
raps object upload "$BUCKET" "$file" --key "parts/${PART_NUM}/${REVISION}/${FILENAME}"
# Upload as latest
raps object upload "$BUCKET" "$file" --key "parts/${PART_NUM}/latest/${FILENAME}"
echo "Uploaded: $PART_NUM $REVISION"
done
- name: Translate latest revisions
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
run: |
for file in $(git diff --name-only HEAD~1 HEAD -- 'parts/**'); do
[ -f "$file" ] || continue
PART_NUM=$(echo "$file" | cut -d'/' -f2)
FILENAME=$(basename "$file")
URN=$(raps object urn design-iterations "parts/${PART_NUM}/latest/${FILENAME}" --output plain)
raps translate start "$URN" --format svf2 --wait
done
- name: Generate comparison report
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
run: |
echo "# Design Change Report" > change-report.md
echo "Commit: ${{ github.sha }}" >> change-report.md
echo "" >> change-report.md
# Add comparison logic here
- name: Upload report
uses: actions/upload-artifact@v4
with:
name: design-change-report
path: change-report.md
Потік конвеєра
Git Push
Файли деталей змінено
→
Версіонування
Генерація ID ревізії
Завантаження rev-YYYYMMDD
Оновлення latest
→
Обробка
Трансляція останньої версії
Порівняння з попередньою
→
Звіт
change-report.md
Інтеграція з MCP
Відстеження нової ревізії
User: "Upload the updated bracket design as rev-C and compare it with rev-B"
Користувач
AI-асистент
RAPS MCP
APS Cloud
Користувач
Завантажити rev-C та порівняти з rev-B
AI
aps_object_upload(key=“parts/12345/rev-C/bracket.ipt”)
MCP
Завантаження
APS
Завершено
AI
aps_translate_start(rev-C URN)
MCP
Трансляція
AI
aps_derivative_properties(rev-B URN)
AI
aps_derivative_properties(rev-C URN)
AI
Порівняння властивостей
AI
Звіт порівняння
Відповідь AI:
Завантажено bracket.ipt як rev-C та порівняно з rev-B:
Зміни властивостей:
Властивість Rev-B Rev-C Зміна Mass 1.25 кг 1.18 кг -5.6% Volume 456 см3 432 см3 -5.3% Material Al 6061 Al 6061 - Підсумок: Зменшення ваги на 70 г досягнуто завдяки оптимізації геометрії.
Перегляд історії ревізій
User: "Show me all revisions of part 12345"
Відповідь AI:
Історія ревізій для деталі 12345:
Ревізія Дата Маса Статус rev-C 15 лют. 2024 1.18 кг Поточна rev-B 01 лют. 2024 1.25 кг Замінена rev-A 15 січ. 2024 1.32 кг Замінена Примітки:
- rev-B → rev-C: Оптимізація ваги
- rev-A → rev-B: Зміна матеріалу
Найкращі практики
Конвенція іменування
bucket/
└── parts/
└── {part-number}/
├── rev-A/
│ └── {part-name}.ipt
├── rev-B/
│ └── {part-name}.ipt
├── rev-C/
│ └── {part-name}.ipt
└── latest/
└── {part-name}.ipt
Скрипт порівняння ревізій
#!/bin/bash
# compare-revisions.sh
BUCKET=$1
PART=$2
REV_OLD=$3
REV_NEW=$4
OLD_URN=$(raps object urn "$BUCKET" "parts/$PART/$REV_OLD/*.ipt" --output plain)
NEW_URN=$(raps object urn "$BUCKET" "parts/$PART/$REV_NEW/*.ipt" --output plain)
echo "Comparing $PART: $REV_OLD vs $REV_NEW"
echo "======================================="
# Get properties
raps derivative properties "$OLD_URN" --output json > /tmp/old.json
raps derivative properties "$NEW_URN" --output json > /tmp/new.json
# Compare
diff <(jq -S '.[0].properties' /tmp/old.json) <(jq -S '.[0].properties' /tmp/new.json)