Синхронізація BIM 360/ACC
Завантаження моделей з BIM 360/ACC та локальна обробка.
Огляд робочого процесу
Хмара BIM 360 / ACC
Хаб
Проєкт
Тека
Елемент
Версія
Автентифікація
3-Legged OAuth
↓
raps auth login
Операції RAPS
Перегляд/Навігація
Завантаження
Отримання метаданих
Отримання версій
Локальна обробка
Локальні файли
↓
Трансляція
↓
Витяг даних
Підхід CLI
Крок 1: Автентифікація
# Вхід через 3-legged OAuth (відкриє браузер)
raps auth login
# Або для CI/headless із попередньо виданими токенами
raps auth login --token "$APS_ACCESS_TOKEN" --refresh-token "$APS_REFRESH_TOKEN" --non-interactive
Крок 2: Навігація ієрархією проєкту
# Перелік усіх хабів (акаунтів)
raps hub list
# Збереження ID хабу
HUB_ID="b.your-hub-id"
# Перелік проєктів у хабі
raps project list "$HUB_ID"
# Збереження ID проєкту
PROJECT_ID="b.your-project-id"
# Перелік тек верхнього рівня
raps folder list "$PROJECT_ID" --top
# Перелік вмісту конкретної теки
FOLDER_ID="urn:adsk.wipprod:fs.folder:abc123"
raps folder list "$PROJECT_ID" "$FOLDER_ID"
Крок 3: Завантаження файлів
# Перелік елементів у теці
raps folder list "$PROJECT_ID" "$FOLDER_ID" --output json > items.json
# Завантаження конкретного елемента
ITEM_ID=$(jq -r '.[0].id' items.json)
raps item download "$PROJECT_ID" "$ITEM_ID" --output ./downloads/
# Завантаження всіх елементів з теки
jq -r '.[].id' items.json | while read item_id; do
raps item download "$PROJECT_ID" "$item_id" --output ./downloads/
done
Крок 4: Отримання історії версій
# Перелік усіх версій елемента
raps item versions "$PROJECT_ID" "$ITEM_ID" --output json > versions.json
# Завантаження конкретної версії
VERSION_ID=$(jq -r '.[0].id' versions.json)
raps item download "$PROJECT_ID" "$ITEM_ID" --version "$VERSION_ID" --output ./downloads/
CI/CD-конвеєр
# .github/workflows/acc-sync.yml
name: ACC Model Sync
on:
schedule:
- cron: '0 6 * * *' # Щоденно о 6:00
workflow_dispatch:
env:
HUB_ID: ${{ secrets.ACC_HUB_ID }}
PROJECT_ID: ${{ secrets.ACC_PROJECT_ID }}
FOLDER_ID: ${{ secrets.ACC_MODELS_FOLDER_ID }}
jobs:
sync-models:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install RAPS
run: cargo install raps
- name: Authenticate with ACC
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
APS_ACCESS_TOKEN: ${{ secrets.APS_ACCESS_TOKEN }}
APS_REFRESH_TOKEN: ${{ secrets.APS_REFRESH_TOKEN }}
run: |
raps auth login --token "$APS_ACCESS_TOKEN" --refresh-token "$APS_REFRESH_TOKEN" --non-interactive
- name: Sync models from ACC
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
run: |
mkdir -p ./synced-models
# Перелік та завантаження всіх моделей Revit
raps folder list "$PROJECT_ID" "$FOLDER_ID" --output json | \
jq -r '.[] | select(.name | endswith(".rvt")) | .id' | \
while read item_id; do
raps item download "$PROJECT_ID" "$item_id" --output ./synced-models/
done
- name: Upload to OSS for processing
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
run: |
BUCKET="acc-synced-$(date +%Y%m%d)"
raps bucket create --key "$BUCKET" --policy transient --region US 2>/dev/null || true
for model in ./synced-models/*.rvt; do
[ -f "$model" ] || continue
key=$(basename "$model")
raps object upload "$BUCKET" "$model"
URN=$(raps object urn "$BUCKET" "$key" --output plain)
raps translate start "$URN" --format svf2
done
- name: Generate sync report
run: |
echo "# ACC Sync Report" > sync-report.md
echo "Date: $(date)" >> sync-report.md
echo "" >> sync-report.md
echo "## Synced Files" >> sync-report.md
ls -la ./synced-models/ >> sync-report.md
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: sync-report
path: |
sync-report.md
./synced-models/
Потік конвеєра
Розклад/Ручний
Щоденно о 6:00
→
Автентифікація
Refresh Token
→
Синхронізація ACC
Перегляд теки
Завантаження моделей
→
Обробка OSS
Завантаження в бакет
Трансляція SVF2
→
Результат
sync-report.md
synced-models/
Інтеграція з MCP
Навігація та завантаження
User: "Download the latest architectural model from the Main Street project in ACC"
Користувач
AI-асистент
RAPS MCP
Хмара ACC
Завантажити модель Main Street
→
aps_hub_list()
→
Отримати хаби
→
aps_project_list()
→
Отримати проєкти
→
aps_folder_list()
→
Отримати вміст
→
aps_item_download()
→
Завантажити файл
→
←
Завантаження завершено
Відповідь AI:
Завантажено ‘MainStreet-Architectural-v42.rvt’ (156 МБ)
- Останнє редагування: 14 лютого 2024, John Smith
- Версія: 42
- Збережено в: ./downloads/MainStreet-Architectural-v42.rvt
Перегляд останніх змін
User: "Show me what models changed in the Main Street project this week"
Відповідь AI:
Файли, змінені в проєкті Main Street (12-16 лютого 2024):
Файл Змінено Автор Версія Architectural.rvt 14 лют John Smith v42 MEP.rvt 13 лют Jane Doe v28 Structural.rvt 12 лют Bob Wilson v31 Бажаєте завантажити будь-який з них?
Синхронізація та обробка
User: "Sync all the Revit models from the Design folder and translate them"
Відповідь AI:
Синхронізація 5 моделей з теки Design…
Файл Розмір Статус Building-A.rvt 124 МБ Завантажено, трансляція… Building-B.rvt 98 МБ Завантажено, трансляція… Site.rvt 45 МБ Завантажено, транслятовано Landscape.rvt 23 МБ Завантажено, транслятовано Parking.rvt 67 МБ Завантажено, трансляція… Усі файли синхронізовано. 3 трансляції в процесі, 2 завершено.
Типові шаблони
Інкрементальна синхронізація
# Відстеження часу останньої синхронізації
LAST_SYNC=$(cat .last-sync 2>/dev/null || echo "1970-01-01")
# Отримання елементів, змінених після останньої синхронізації
raps folder list "$PROJECT_ID" "$FOLDER_ID" --output json | \
jq --arg since "$LAST_SYNC" '[.[] | select(.lastModified > $since)]' | \
jq -r '.[].id' | while read item_id; do
raps item download "$PROJECT_ID" "$item_id" --output ./synced/
done
# Оновлення часу останньої синхронізації
date -Iseconds > .last-sync
Дзеркалювання структури тек
# Рекурсивна синхронізація структури тек
sync_folder() {
local project_id=$1
local folder_id=$2
local local_path=$3
mkdir -p "$local_path"
raps folder list "$project_id" "$folder_id" --output json | while read -r item; do
type=$(echo "$item" | jq -r '.type')
name=$(echo "$item" | jq -r '.name')
id=$(echo "$item" | jq -r '.id')
if [ "$type" = "folders" ]; then
sync_folder "$project_id" "$id" "$local_path/$name"
else
raps item download "$project_id" "$id" --output "$local_path/"
fi
done
}
sync_folder "$PROJECT_ID" "$FOLDER_ID" "./local-mirror"