Fusion 360 API と Data Management API の関係

Fusion 360 にはクライアント側で利用できる API が用意されていて、用途に応じて C++、Python、JavaScript を使ってスクリプトやアドインを作成して、Fusion 360 にロードして利用すことが出来ます。Fusion 360 API はモデリング機能を中心に実装が進んでいますが、データパネルに表示される内容、つまり、クラウド ストレージの内容へアクセス API も用意されています。

Fusion 360 のクラウド ストレージ のブログ記事では、3-legged 認証でクラウド ストレージ領域の所有者であるユーザにアクセス許可を得ることが出来れば、Forge を使ったアプリもクラウド ストレージいアクセスが可能でることをご紹介しました。ただし、Fusion 360 API を使ってクラウド ストレージにアクセスする場合には、少し状況が異なります。Fusion 360 利用時にはユーザ アカウントでサインインすることが必須なので、Fusion 360 クライアント内でスクリプトやアドインとして実行される Fusion 360 API はユーザとしてクラウド ストレージにアクセスすることが可能です。Forge の Authentication API や Data Management API を使った処理は必要ありません。

Fusion 360のユーザーインターフェースを表示し、プロジェクト内のフォルダーとファイルのリストを示しています。左側にはプロジェクト名、フォルダー名、及びファイル名が一覧され、右側には操作ツールバーがあります。

 Fusion 360 API で用意される Data オブジェクト を利用すると、データパネルからデザイン ファイルを開いたり、編集中のデザイン ファイルを名前を付けて保存したり出来るほか、新規にデザインを作成するような処理も実装可能です。それぞれの情報は、下記のオンライン ヘルプ記事(英語)で紹介されています。

Documents.open メソッド:http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-879042c8-f064-4b31-927a-4b6a67134936

Documents.add メソッド:http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-2314d09a-c595-4f9a-ab8b-3e302dc5d860

Document.saveAs メソッド:http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-7b292219-62fa-4a01-b522-2a1a297edb28

クラウド ストレージとは直接関係しませんが、Fusion 360 API では、Fusion 360 自身が提供するローカル トランスレータでデザイン ファイル形式を変換する処理を自動化することも出来ます。ブログ記事 Model Derivative API の役割と変換可能なファイル形式 をご存じの方は、データ変換というと Forge では Model Derivative API を連想しがちですが、前述のとおり、Fusion 360 API  は Fusion 360 クライアント内でローカルに実装されることになるため、Model Derivative API に頼ることなく、そのまま Fusion 360 の機能を利用することが出来ます。

変換機能を用いたデザイン ファイルのエクスポートには ExportManager オブジェクト を利用します。ExportManager オブジェクトを利用したサンプルは、次のオンライン ヘルプ記事(英語)で紹介されています。

Export to other formats API Sample:http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-d1462fe6-fd43-11e4-b6b4-f8b156d7cd97

ExportManager API Sample:http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-B801DDA8-9A0C-42AD-AC06-F8244CA08D65

STLExport API Sample:http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-ECA8A484-7EDD-427D-B1E3-BD59A646F4FA

同じくデザイン ファイルのインポートには ImportManager オブジェクト  を利用します。ImportManager オブジェクトを利用したサンプルは、次のオンライン ヘルプ記事(英語)で紹介されています。

Import Manager API Sample:http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-3f24e9e8-422d-11e5-937b-f8b156d7cd97

このように、Fusion 360 API でもある程度、データパネルに表示されるクラウド ストレージ情報を得たり、デザイン ファイルの基本操作を自動化することが可能です。ただ、場合によっては Data Management API と連携して外部アプリ側でデザイン ファイルのサムネイル画像をダウンロードしたり、デザイン ファイルのマニフェスト情報を取得する必要が出てくる可能性もあります。

そのような場面では、最初から Forge の Data Management API や Model Derivative API にアクセスするのではなく、Fusion 360 API 側で当該ファイルの ID(ドキュメントID = URN)を取得して、Forge 使用時に利用することも出来ます。

Autodesk Fusion 360のプロジェクト管理画面のスクリーンショット。画面左側にはプロジェクト名、フォルダ名、ファイル名が表示されており、フォルダやファイルに関連するAPIエンドポイントの情報が示されている。

次の JavaScript コードは、現在 Fusion 360 にサインインしているユーザ アカウント配下にある Hub、Project、Folder、Item の情報を取得するスクリプトです。 プロジェクト配下の情報が多いと、処理に時間がかかるので注意が必要です。

function run(context) {
    "use strict";
    if (adsk.debug === true) {
        /*jslint debug: true*/
        debugger;
        /*jslint debug: false*/
    }
    var ui;
    try {
        var app = adsk.core.Application.get();
        ui = app.userInterface;
        var hub = app.data.activeHub;
        var summary; summary = "nActive Hub = " + hub.name;
        //summary += "nHub.id = " + hub.id;    
        var projects, project;
        var folders, folder;
        var files, file;
        projects = hub.dataProjects;
        for (var index = 0; index < projects.count; index++) {
            project = projects.item(index);
            summary += "nnProject = " + project.name;
            //summary += "nProject.id = " + project.id;  
            folder = project.rootFolder;
            summary += "nntRoot Folder = " + folder.name;
            summary += "ntRoot Folder.id = " + folder.id;
            files = folder.dataFiles;
            for (index = 0; index < files.count; index++) {
                file = files.item(index);
                summary += "nnttFile = " + file.name;
                summary += "nttFile.id = " + file.id;
            }
            folders = project.rootFolder.dataFolders;
            for (index = 0; index < folders.count; index++) {
                folder = folders.item(index);
                summary += "nnttFolder = " + folder.name;
                summary += "nttFolder.id = " + folder.id;
                files = folder.dataFiles;
                for (index = 0; index < files.count; index++) {
                    file = files.item(index);
                    summary += "nntttFile = " + file.name;
                    summary += "ntttFile.id = " + file.id;
                }
            }
        }
        ui.messageBox(summary);
        console.log(summary);
    } catch (e) {
        if (ui) {
            ui.messageBox('Failed : ' + (e.description ? e.description : e));
        } console.log('Failed : ' + (e.description ? e.description : e));
    }
    adsk.terminate();
}

次の Python コードは、 上記 JavaScript と同様の内容を実装する スクリプトとなります。 

import adsk.core, adsk.fusion, adsk.cam, traceback
def run(context): 
    ui = None
    try:  
        app = adsk.core.Application.get()  
        ui = app.userInterface 
        hub = app.data.activeHub; 
        summary = 'nActive Hub = ' + hub.name  
        #summary += summary + 'nHub.id = ' + hub.id     
        projects = hub.dataProjects  
        for index in range(0, projects.count):    
            project = projects.item(index)
            summary += "nnProject = " + project.name  
            #summary += "nnProject.id = " + project.id     
            folder = project.rootFolder    
            summary += "nntRoot Folder = " + folder.name      
            summary += "ntRoot Folder.id = " + folder.id    
            files = folder.dataFiles    
            for index in range(0, files.count):     
                file = files.item(index)       
                summary += "nnttFile = " + file.name   
                summary += "nttFile.id = " + file.id                           
                folders = project.rootFolder.dataFolders   
                for index in range(0, folders.count):                           
                    folder = folders.item(index)    
                    summary += "nnttFolder = " + folder.name    
                    summary += "nttFolder.id = " + folder.id    
                    files = folder.dataFiles     
                    for index in range(0, files.count):                                       
                        file = files.item(index)   
                        summary += "nntttFile = " + file.name  
                        summary += "ntttFile.id = " + file.id   
                        ui.messageBox(summary)                                                 
                        print(summary)
                                              
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

このように、Fusion 360 API は、Forge との連携も含めた運用をスムーズにする API が用意されています。

By Toshiaki Isezaki

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading