【入門】AUTODESK Platform Services（APS）とは何か？基本から活用例まで解説！

## はじめに

3D CADやBIMに関わる開発をしていると、**「Autodesk Platform Services（APS）」** という言葉を耳にすることがあると思います。
この記事では、APSの概要や特徴、ユースケース、APIの活用例について紹介します。

> ✅ Autodesk Forgeという名称でご存知の方もいるかもしれませんが、**Autodesk Forgeは2023年に「Autodesk Platform Services（APS）」にリブランドされました**。


## APSとは？

**Autodesk Platform Services（APS）** は、Autodesk社が提供するクラウドベースのAPI群です。

https://aps.autodesk.com/

Autodesk Platform Servicesの開発ブログにリリースノートや、オンライントレーニングのアーカイブなどが公開されており、情報が豊富です。

https://adndevblog.typepad.com/technology_perspective/

設計データ（CAD/BIM/3Dモデルなど）をWeb上で**表示・変換・管理・連携**するための機能を提供しています。

### できることの例

| 機能カテゴリ | 内容 |
|-------------|------|
| Viewer API | Webブラウザ上で3D/2Dモデルを表示・操作（Forge Viewer） |
| Model Derivative API | CADデータの変換（DWG, RVT, STEP → SVF, OBJなど） |
| Data Management API | ファイルのアップロード・管理（Autodesk DocsやBIM 360連携） |
| Authentication API | OAuth 2.0による認証・トークン管理 |
| BIM/Construction API | BIM 360やAutodesk Construction Cloud（ACC）との連携 |

---

## どんなときに使うの？

APSは以下のようなケースで使われます：

- 自社システム上で3Dモデルを表示したい
- 複数フォーマットのCADデータを統一ビューで確認したい
- 建設プロジェクトの情報（BIM 360やAutodesk Docs）を自動取得・管理したい
- カスタムBIMアプリを開発したい
- 製品データをWebで共有し、コラボレーションを加速したい

## 実際にやってみる：Viewerで3D表示

APSの代表的な機能の1つに、**Viewer（Forge Viewer）** があります。以下のようにHTML+JavaScriptだけでWeb上に3Dモデルを表示できます。

<div style="text-align:center;">
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606327/4ead036a-638c-4efa-aec0-49ab2ed2d427.gif" alt="説明" width="800">
</div>


```none:フォルダ構成
.
├── node_modules
├── package-lock.json
├── package.json
├── public
│   ├── index.html　　　　　// ビューワー
├── .env                  // 環境変数の設定
└── server.js　　　　　　　 // 環境変数のロード
```

```html:index.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Forge Viewer - Minimal</title>
  <script src="https://developer.api.autodesk.com/modelderivative/v2/viewers/7.*/viewer3D.js"></script>
  <link rel="stylesheet" href="https://developer.api.autodesk.com/modelderivative/v2/viewers/7.*/style.min.css" />
  <style>
    html, body {
      margin: 0;
      overflow: hidden;
      height: 100%;
    }
    #forgeViewer {
      width: 100%;
      height: 100%;
      position: relative;
    }
    .viewer-label {
      position: absolute;
      top: 10px;
      left: 10px;
      background-color: rgba(0, 0, 0, 0.7);
      color: white;
      padding: 5px 10px;
      border-radius: 4px;
      font-family: Arial, sans-serif;
      z-index: 100;
    }
  </style>
</head>
<body>
  <div id="forgeViewer">
    <div class="viewer-label">Autodesk Platform Services Viewer</div>
  </div>

  <script>
    let forgeViewer;
    
    // サーバーから環境変数を取得
    fetch('/config')
      .then(response => response.json())
      .then(config => {
        const urn = config.FORGE_MODEL_URN;
        const options = {
          env: 'AutodeskProduction',
          accessToken: config.FORGE_ACCESS_TOKEN
        };

        Autodesk.Viewing.Initializer(options, () => {
          forgeViewer = new Autodesk.Viewing.GuiViewer3D(document.getElementById('forgeViewer'));
          forgeViewer.start();
          const documentId = 'urn:' + urn;
          Autodesk.Viewing.Document.load(documentId, (doc) => {
            const defaultModel = doc.getRoot().getDefaultGeometry();
            forgeViewer.loadDocumentNode(doc, defaultModel);
          }, (err) => console.error(err));
        });
      })
      .catch(error => console.error('設定の読み込みに失敗しました:', error));
  </script>
</body>
</html>
```


``` js:server.js
const express = require('express');
const path = require('path');
const dotenv = require('dotenv');

// Load environment variables
dotenv.config();

const app = express();
const PORT = process.env.PORT || 3000;

// Serve static files
app.use(express.static(path.join(__dirname, 'public')));

// Model Derivative APIの変換設定を調整
const createManifest = async (objectId) => {
  const job = {
    input: {
      urn: Buffer.from(objectId).toString('base64')
    },
    output: {
      formats: [
        {
          type: 'svf',
          views: ['2d', '3d'],
          advanced: {
            materialMode: 2, // マテリアル情報を保持するモード
            renderPrecision: 'detailed' // 詳細な描画精度
          }
        }
      ]
    }
  };
  
  // Model Derivative APIを呼び出し
  return await new Promise((resolve, reject) => {
    // APIコール実装
  });
};

// Endpoint to provide configuration to the client
app.get('/config', (req, res) => {
  res.json({
    FORGE_ACCESS_TOKEN: process.env.FORGE_ACCESS_TOKEN,
    FORGE_MODEL_URN: process.env.FORGE_MODEL_URN
  });
});

app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});
```

``` .env
FORGE_ACCESS_TOKEN=xxx # Autodesk Platform Services で取得したアクセス トークン（API 認証用）
FORGE_MODEL_URN=yyy    # Autodesk Platform Services で使用するモデルの URN（対象モデルの識別子）
```

`.env`内の`FORGE_MODEL_URN`はAutodesk Platform Servicesのモデル変換APIにより取得したURN（Uniform Resource Name）です。

## 終わりに

設計・建設業界では、**オンプレミス環境**（社内PCやローカルサーバー上のCAD/BIMソフト）でデータを扱ってきました。

しかし、オンプレミスにはいろいろ不便な点があります。
- 専用ソフトのインストールやライセンス管理が煩雑  
- 社外や関係会社とのデータ共有がファイル形式の違いで失敗  
- 閲覧には専用ビューアや高性能PCが必要  
- リモートワークやモバイル対応が困難  

例えば、**設計ファイルの拡張子が合わずに開けず、関係者に正しいビューワーを個別にインストールしてもらった**という経験をお持ちの方も多いのではないでしょうか。

そんな時にAPSを使えば、**クラウド上でフォーマット変換 → Web上で表示**という流れが構築でき、環境に依存せず誰でもアクセスできます。クラウドの恩恵ですね。
ファイル形式のトラブルも減り、共有・コラボレーションのハードルが一気に下がります。


### Three.jsなどとの連携

APSはViewer単体でも強力ですが、**Three.jsなどの外部ライブラリと連携することでさらに拡張性が高まります**。

たとえば：

- APS Viewerで表示したモデルにThree.jsでエフェクトやカスタムオブジェクトを追加  
- React / Next.jsと組み合わせてインタラクティブな設計支援Webアプリを開発  
- Node.jsでAPIや認証周りをまとめて自動化

これらについてもキャッチアップしたいところです。