ForgeのModel Derivative API v2を試す。

ForgeのModel Derivative API v2を試した内容をメモしておく。 一言でいうとデータ変換のAPIです。

事前準備

最初にBucketとモデルのファイルを環境変数に設定する。ここだけそれぞれの環境に合わせた編集が必要。 アップロードするファイルと同じディレクトリで操作することを前提とし、UPLOAD_FILEにはファイル名のみ記載する。

とりあえず、UPLOAD_FILEはrvtでもiptでもなんでもよいとする。

FORGE_CLIENT_ID=<YOUR ID>
FORGE_CLIENT_SECRET=<YOUR SECRET>

FORGE_BUCKET_KEY=<YOUR BUCKET KEY>
UPLOAD_FILE=<YOUR FILE>

あと、jsonを読みやすくするためにjqを使うのでインストールしておく。

Get Access Token

FORGE_TOKEN=`curl -X POST \
    'https://developer.api.autodesk.com/authentication/v1/authenticate' \
    -H 'Content-Type: application/x-www-form-urlencoded' \
    -d "client_id=${FORGE_CLIENT_ID}" \
    -d "client_secret=${FORGE_CLIENT_SECRET}" \
    -d 'grant_type=client_credentials' \
    -d 'scope=data:write data:read bucket:create bucket:delete' \
    | jq -r '.access_token'`

アクセストークンの有効期限は1時間なので期限が切れてしまったときにはコマンドを打ち直して再取得すればよい。

Create Bucket

最初だけバケットを作る必要がある。2回目以降は同じバケットを使いまわせる。 policyKeyをtransientにしているので、24時間でアップロードしたモデルは消える。(バケットは勝手には消えない)

curl -X POST \
    'https://developer.api.autodesk.com/oss/v2/buckets' \
    -H "Authorization: Bearer ${FORGE_TOKEN}" \
    -H 'Content-Type: application/json' \
    -d '{
        "bucketKey": "'${FORGE_BUCKET_KEY}'",
        "access": "full",
        "policyKey": "transient"
    }'

Upload the Revit file to OSS

UPLOADED_URN=`curl -X PUT \
    "https://developer.api.autodesk.com/oss/v2/buckets/${FORGE_BUCKET_KEY}/objects/${UPLOAD_FILE}" \
    -H "Authorization: Bearer ${FORGE_TOKEN}" \
    -H 'Accept-Encoding: gzip, deflate' \
    --data-binary "@${UPLOAD_FILE}" \
    | jq -r ".objectId" \
    | tr -d '\n' \
    | base64`

Translate Source File

この辺からUPLOAD_FILEに何のファイルを指定したかで結果が変わってくる。 例えば、rvtをobjには変換できなかったりというように、なんでも変換できるわけではないらしい。

Option - Translate To SVF

Forge Viewerで表示するためのSVF形式。ファイルをダウンロードせずにオンラインでのみ利用する場合はSVF2でよいが、ダウンロードが必要な場合はSVFを指定する必要がある。

curl -X POST \
    'https://developer.api.autodesk.com/modelderivative/v2/designdata/job' \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer ${FORGE_TOKEN}" \
    -H 'x-ads-force: true' \
    -d '{
        "input": {
            "urn": "'${UPLOADED_URN}'"
        },
        "output": {
            "destination": {
                "region": "us"
            },
            "formats": [
                {
                    "type": "svf",
                    "views": [
                        "2d",
                        "3d"
                    ],
                    "advanced": {
                      "generateMasterViews": true
                    }
                }
            ]
        }
    }' \
    | jq

Option - Translate To Obj

上でも書いたがrvtからの変換はできなかった。

curl -X 'POST' \
    -v 'https://developer.api.autodesk.com/modelderivative/v2/designdata/job' \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer ${FORGE_TOKEN}" \
    -d '{
        "input": {
            "urn": "'${UPLOADED_URN}'"
        },
        "output": {
            "destination": {
                "region": "us"
            },
            "formats": [
                {
                    "type": "obj"
                }
            ]
        }
    }' \
    | jq

Check the Status of the translation job

進捗確認。

curl -X GET \
    "https://developer.api.autodesk.com/modelderivative/v2/designdata/${UPLOADED_URN}/manifest" \
    -H "Authorization: Bearer ${FORGE_TOKEN}" \
    | jq

Download the translated File

completeが確認できれば、以下の環境変数にダウンロードしたいurnを設定する。

TRANSLATED_URN=urn:adsk.viewing:fs.file:...

ダウンロードは以下。

curl -X GET \
    "https://developer.api.autodesk.com/modelderivative/v2/designdata/${UPLOADED_URN}/manifest/${TRANSLATED_URN}" \
    -H "Authorization: Bearer ${FORGE_TOKEN}" \

バイナリ形式の場合は出力ファイルを-oで指定する必要がある。

curl -X GET \
    "https://developer.api.autodesk.com/modelderivative/v2/designdata/${UPLOADED_URN}/manifest/${TRANSLATED_URI}" \
    -H "Authorization: Bearer ${FORGE_TOKEN}" \
    -o obj.svf

なぜかはわかっていないが、svfをダウンロードしようとすると、ダウンロードできないことがあった。