IFC Open BIM Workflow
Process IFC🌐IFCOpen standard for BIM data exchange.View in glossary files for open BIM🏛️BIMIntelligent 3D model-based design for buildings.View in glossary collaboration with external partners.
Workflow Overview
External Partners
ArchiCAD
Tekla
Bentley
Other BIM
IFC Exchange
IFC Files
RAPS🌼RAPSRust CLI for Autodesk Platform Services.View in glossary Processing
Upload
Translate SVF2🚀SVF2Current APS viewing format (improved performance).View in glossary
APS☁️APSAutodesk Platform Services - cloud APIs for CAD/BIM automation.View in glossary Cloud
OSS📦OSSAPS cloud storage for files and models.View in glossary Bucket🪣BucketContainer for storing objects in OSS.View in glossary
Viewables
Metadata
Coordination
Forge🔥ForgeLegacy name for Autodesk Platform Services (APS).View in glossary Viewer
Reports
Partners→IFC→Process→Cloud→Output
CLI Approach
Step 1: Upload IFC File
raps object upload my-bucket model.ifc
Step 2: Translate to SVF2
URN=$(raps object urn my-bucket model.ifc --output plain)
raps translate start "$URN" --format svf2 --wait
Step 3: Verify Translation
raps translate manifest "$URN"
Step 4: Extract IFC Data
# Get metadata
raps derivative metadata "$URN" --output json > ifc-metadata.json
# Get IFC property sets
raps derivative properties "$URN" --output json > ifc-properties.json
# Get model hierarchy
raps derivative tree "$URN" --output json > ifc-tree.json
Step 5: Analyze IFC Content
# Count elements by IFC type
cat ifc-properties.json | jq '
group_by(.properties.IfcType) |
map({type: .[0].properties.IfcType, count: length}) |
sort_by(-.count)'
# List all property sets
cat ifc-properties.json | jq '[.[].properties | keys] | flatten | unique'
CI/CD Pipeline
# .github/workflows/ifc-processing.yml
name: IFC Processing Pipeline
on:
push:
paths:
- 'ifc/**/*.ifc'
env:
BUCKET: ifc-exchange-${{ github.repository_id }}
jobs:
process-ifc:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install RAPS
run: cargo install raps
- name: Setup bucket
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
run: |
raps bucket create --key "$BUCKET" --policy persistent --region US 2>/dev/null || true
- name: Process IFC files
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
run: |
mkdir -p ./ifc-reports
for ifc in ifc/**/*.ifc; do
[ -f "$ifc" ] || continue
filename=$(basename "$ifc")
name="${filename%.ifc}"
echo "Processing: $ifc"
# Upload
raps object upload "$BUCKET" "$ifc"
# Translate
URN=$(raps object urn "$BUCKET" "$filename" --output plain)
raps translate start "$URN" --format svf2 --wait
# Extract metadata
raps derivative metadata "$URN" --output json > "./ifc-reports/${name}-metadata.json"
raps derivative properties "$URN" --output json > "./ifc-reports/${name}-properties.json"
# Generate report
echo "# IFC Report: $filename" > "./ifc-reports/${name}-report.md"
echo "Processed: $(date)" >> "./ifc-reports/${name}-report.md"
echo "" >> "./ifc-reports/${name}-report.md"
echo "## Element Count by Type" >> "./ifc-reports/${name}-report.md"
cat "./ifc-reports/${name}-properties.json" | jq -r '
group_by(.properties.IfcType) |
map({type: .[0].properties.IfcType, count: length}) |
sort_by(-.count) |
.[] | "- \(.type): \(.count)"
' >> "./ifc-reports/${name}-report.md"
done
- name: Upload reports
uses: actions/upload-artifact@v4
with:
name: ifc-reports
path: ./ifc-reports/
Pipeline Flow
Git Push
ifc/**/*.ifc changed
For Each IFC
Upload to OSS
↓
Translate SVF2
↓
Extract Metadata
↓
Generate Report
Artifacts
MCP Integration
Process IFC from Partner
User: "We received IFC files from the structural engineer. Upload them and check if they translated correctly."
Process partner IFC files
→
aps_object_upload()
→
Upload IFC
→
aps_translate_start()
→
Wait for completion:
aps_translate_manifest()
→
Check status
→
aps_derivative_properties()
→
Get properties
→
IFC data
←
Translation⚙️Translation JobBackground process converting CAD files to viewable formats.View in glossary complete + summary
AI Response:
The structural IFC file has been uploaded and translated successfully.
Model Summary:
- File: structural-model.ifc
- Status: Complete
- Elements: 2,847 total
By IFC Type:
- IfcColumn: 156
- IfcBeam: 89
- IfcSlab: 12
- IfcFooting: 24
- IfcWall: 45
- IfcConnection: 2,521
Compare IFC Versions
User: "Compare the structural IFC we received today with last week's version"
AI Response:
IFC Version Comparison:
Element Type Last Week Today Change IfcColumn 148 156 +8 IfcBeam 85 89 +4 IfcSlab 12 12 0 IfcFooting 24 24 0 Total 2,789 2,847 +58 New elements appear to be in Grid Lines E-F, Levels 3-4.
IFC Validation
Check Required Properties
# Verify all elements have required properties
cat ifc-properties.json | jq '
[.[] | select(
.properties.GlobalId == null or
.properties.Name == null
)] | length'
Export Property Set Summary
# List all Pset definitions
cat ifc-properties.json | jq '
[.[].properties | to_entries | .[] | select(.key | startswith("Pset_"))] |
group_by(.key) |
map({pset: .[0].key, count: length})'
Validate IFC Schema
# Check IFC types distribution
cat ifc-properties.json | jq '
group_by(.properties.IfcType) |
map({
type: .[0].properties.IfcType,
count: length,
hasGlobalId: ([.[] | select(.properties.GlobalId != null)] | length),
hasName: ([.[] | select(.properties.Name != null)] | length)
}) |
sort_by(-.count)'