Design Automation:さまざまな Activity と WorkItem

Design Automation API を利用するには、Activity でコアエンジンで処理させる入出力ファイルを宣言、実際の実行タスクとなる WorkItem の実行時に、Activity で宣言した入出力ファイルの物理的なパス/URL を指定することになります。

Activity の登録には  POST activities エンドポイントを、WorkItem の実行には POST workitems エンドポイントを、それぞれ利用することになります。

両エンドポイントのリクエスト ボディで指定する JSON ペイロードには、リファレンスに記載されるさまざまなパラメータを利用します。

POST activities | Request body

POST workitems | Requst Body

入手力ファイルを指定するパラメータは、アプリの内容によって様々なパターンに別れます。ここでは、Design Automation API:Direct-to-S3 アプローチを簡素化する新機能 の方法を使って、AutoCAD コアエンジンの代表的な例でご紹介します。

  • WorkItem で指定する BUCKET_KEY  と OBJECT_KEY には URL エンコードされた値が必要です。

固定ファイル名での入出力

コイルの回転数、半径、高さを入力してコアエンジンにパラメータとして渡し、コイル形状のスイープ ソリッドを作成して 3D DWG をダウンロードさせる例です。

事前に画層やレイアウト ビューポートを設定したテンプレート DWG を利用することで、モデル空間にスイープ ソリッドを作成、レイアウトでモデル空間のスイープ ソリッドを投影を表示させます。

A 3D graphic of a coil shape displayed in a circular frame, with parameters for turns, radius, and height on one side. There are buttons for submitting the parameters and downloading the resulting file.

入力ファイルのテンプレート DWG を template.dwg、パラメータ ファイル(JSON)を params.json、出力ファイルは result.dwg の固定名にしています。Activity と WorkItem の JSON ペイロードは次のようになります。

Activity:

var payload =
{
"id": DA4A_UQ_ID,
"commandLine": ['$(engine.path)\\accoreconsole.exe /i "$(args[DWGInput].path)" /al "$(appbundles[CreateCoil].path)" /s "$(settings[script].path)"'],
"parameters": {
"DWGInput": {
"zip": false,
"ondemand": false,
"verb": "get",
"description": "Template drawing",
"required": true,
"localName": "template.dwg"
},
"Params": {
"zip": false,
"ondemand": false,
"verb": "get",
"description": "Input parameters to create coil",
"required": true,
"localName": "params.json"
},
"DWGOutput": {
"zip": false,
"ondemand": false,
"verb": "put",
"description": "Created drawing",
"required": true,
"localName": "result.dwg"
}
},
"settings": {
"script": {
"value": "CreateCoil\n"
}
},
"engine": "Autodesk.AutoCAD+23_1",
"appbundles": [DA4A_FQ_ID],
"description": "Create a coil solid to new drawing"
};

WorkItem:

    var payload =
    {
        “activityId”: DA4A_FQ_ID,
        “arguments”: {
            “DWGInput”: {
                “url”: “urn:adsk.objects:os.object:” + BUCKET_KEY + “/template.dwg” ,
                “headers”: {
                    “Authorization”: “Bearer ” + credentials.access_token
                },
                “verb”: “get”
            },
            “Params”: {
                “url”: “data:application/json,” + paramsJSON // ex). {“turn”:”5″,”radius”:”50″,”height”:”100″}
            },
            “DWGOutput”: {
                “url”: “urn:adsk.objects:os.object:” + BUCKET_KEY + “/result.dwg”,
                “headers”: {
                    “Authorization”: “Bearer ” + credentials.access_token
                },
                “verb”: ‘put’
            }
        }
    };

次の例は、卓上扇風機の羽根の色、葉っぱ形状の有無、オーダーする数量をコアエンジンに渡し、あらかじめ用意した DWG の内容を編集して見積書レイアウトと指示書図面レイアウトを用意、 1 つの PDF ファイルに出力してダウンロードさせる例です。

3Dモデルの扇風機の羽根の選択オプションと見積もり表示のインターフェース

入力ファイルとなるテンプレート DWG を template.dwg、パラメータ ファイル(JSON)を params.json、出力ファイルには  quotation.pdf の固定名にしています。また、Design Automation API の実行環境にない TrueType フォントを解決するために、フォント マッピング ファイルを  dwg.fmp の固定名で入力ファイルとしています。 フォント マッピング ファイルの詳細は、Design Automation API for AutoCAD:カスタム フォントの扱いと解決 のブログ記事でご紹介しています。

この Activity と WorkItem の JSON ペイロードは次のようになります。

Activity:

var payload =
{
"id": DA4A_UQ_ID,
"commandLine": ['$(engine.path)\\accoreconsole.exe /i "$(args[DWGInput].path)" /dwgfontmap /al "$(appbundles[TableFanConfigurator].path)" /s $(settings[script].path)'],
"parameters": {
"DWGInput": {
"zip": false,
"ondemand": false,
"verb": "get",
"description": "Template drawing",
"required": true,
"localName": "template.dwg"
},
"Params": {
"zip": false,
"ondemand": false,
"verb": "get",
"description": "Input parameters to specify behavior",
"required": true,
"localName": "params.json"
},
"FontMap": {
"zip": false,
"ondemand": false,
"verb": "get",
"description": "Input font map file for user truetype font",
"required": true,
"localName": "dwg.fmp"
},
"PDFOutput": {
"zip": false,
"ondemand": false,
"verb": "put",
"description": "output PDF quotation",
"required": true,
"localName": "quotation.pdf"
}
},
"settings": {
"script": {
"value": "CreateQuotation\n"
}
},
"engine": "Autodesk.AutoCAD+24_1",
"appbundles": [DA4A_FQ_ID],
"description": "Create Quotation"
};

WotkItem:

var payload =
{
"activityId": DA4A_FQ_ID,
"arguments": {
"DWGInput": {
"url": "urn:adsk.objects:os.object:" + BUCKET_KEY + "/template.dwg",
"headers": {
"Authorization": "Bearer " + credentials.access_token
},
"verb": "get"
},
"Params": {
"url": "data:application/json," + paramsJSON // ex). {"color":"2","quantity":"1","leaf":"true"}
},
"FontMap": {
"url": "urn:adsk.objects:os.object:" + BUCKET_KEY + "/dwg.fmp",
"headers": {
"Authorization": "Bearer " + credentials.access_token
},
"verb": "get"
},
"PDFOutput": {
"url": "urn:adsk.objects:os.object:" + BUCKET_KEY + "/quotation.pdf",
"headers": {
"Authorization": "Bearer " + credentials.access_token
},
"verb": 'put'
}
"onComplete": {
"verb": "post",
"url": "https://**********************/api/oncomplete"
}
}
};

可変ファイル名での入出力

ユーザが選択した任意名の DWG 内部を走査し、不要なブロック定義を削除(パージ)、パージ後のクリーンな DWG を同じファイル名(選択した DWG による)でダウンロードさせる例です。

パージしたブロック定義名とブロック定義内の図形数をグラフ化するため、 Chart.js(https://www.chartjs.org/)へ渡す JSON ファイルも同時に出力してます。

A pie chart visualizing the parts of a CAD drawing titled 'ROBOT BASE STRUCTURE.dwg', with various segments representing different components and their quantities.

入力ファイルとなる DWG ファイル名は可変になるため、Activity の “DWGInput” と名付けたセクション配下の localName で特定名を指定はしていません。同様に、ここでは “DWGOutput” パラメータで指定する出力ファイル名も入力ファイルと同じファイル名にします。つまり、出力ファイル名も可変になりますが、localName 指定がないと Activity 登録時に Bad Request エラーになってしまうため、ダミーの名前  “purged.dwg” を指定しています。

出力ファイル名は、WorkItem 実行時に “DWGOutput” セクション配下に localName で指定することで、ファイル名をオーバーライドすることが出来ます。

なお、入力ファイルのパラメータ ファイル(JSON)は params.json、グラフ化で使用する出力ファイルは chart.json の固定にしています。

アドイン処理で chart.json を生成する内容は、Design Automation API:WorkItem からの JSON 反映 のブログ記事でご紹介しています。

Activity:

var payload =
{
"id": DA4A_UQ_ID,
"commandLine": ['$(engine.path)\\accoreconsole.exe /i "$(args[DWGInput].path)" /al "$(appbundles[PurgeBlock].path)" /s $(settings[script].path)'],
"parameters": {
"DWGInput": {
"zip": false,
"ondemand": false,
"verb": "get",
"description": "Source drawing",
"required": true
},
"Params": {
"zip": false,
"ondemand": false,
"verb": "get",
"description": "Input parameters to specify behavior",
"required": true,
"localName": "params.json"
},
"DWGOutput": {
"zip": false,
"ondemand": false,
"verb": "put",
"description": "Output DWG drawing",
"required": true,
"localName": "purged.dwg"
},
"ChartOutput": {
"zip": false,
"ondemand": false,
"verb": "put",
"description": "Output Chart JSON",
"required": true,
"localName": "chart.json"
}
},
"settings": {
"script": {
"value": "PurgeBlock\n"
}
},
"engine": "Autodesk.AutoCAD+24_1",
"appbundles": [DA4A_FQ_ID],
"description": "Purge Block"
};

WorkItem:

var payload =
{
"activityId": DA4A_FQ_ID,
"arguments": {
"DWGInput": {
"url": "urn:adsk.objects:os.object:" + BUCKET_KEY + "/" + SOURCE_DWG,
"headers": {
"Authorization": "Bearer " + credentials.access_token
},
"verb": "get"
},
"Params": {
"url": "data:application/json," + paramsJSON // ex). {"purge":"true","preview":"false"}
},
"DWGOutput": {
"url": "urn:adsk.objects:os.object:" + BUCKET_KEY + "/" + RESULT_DWG, // 可変
"headers": {
"Authorization": "Bearer " + credentials.access_token
},
"verb": 'put',
"localname": RESULT_DWG // 可変
},
"ChartOutput": {
"url": CHART_JSON,
"headers": {
"Authorization": "Bearer " + credentials.access_token
},
"verb": 'put'
},
"onComplete": {
"verb": "post",
"url": "https://**********************/api/oncomplete"
}
}
};

ZIP 圧縮の入力

外部参照図面と親図面を ZIP 圧縮して、固定ファイル名で PDF 出力、ダウンロードさせる例です。

PDF document preview showing a detailed mechanical floor plan with annotations, buttons for uploading and downloading, and options for managing the activity.

DWG ファイル、ラスター画像ファイル、アンダーレイ ファイルなどを外部参照する DWG 図面を処理する際には、それら一式を ZIP 圧縮後、入力ファイルとしてコアエンジンに渡すことが出来ます。この際、Actvity の zip 指定を true で設定して、WorkItem の同じ名前のセクションで、コアエンジンに開かせる親ファイル名を指定します。親ファイル名の指定で利用するのが、pathInZip パラメータです。

なお、この Activity は AutoCAD のコマンドのみを利用するので、AppBundle を使用しません。このため、appbundles パラメータの値は POST appbundles エンドポイントを使った登録で使用する AppBundle の Id ではなく、ブランク([])になっています。

Activity:

var payload =
{
"id": DA4A_UQ_ID,
"commandLine": ['$(engine.path)\\accoreconsole.exe /i "$(args[DWGInput].path)" /s "$(settings[script].path)" /l ja-JP'],
"parameters": {
"DWGInput": {
"zip": true,
"ondemand": false,
"verb": "get",
"description": "Source drawing",
"required": true
},
"PDFOutput": {
"zip": false,
"ondemand": false,
"verb": "put",
"description": "putput PDF drawing",
"required": true,
"localName": "result.pdf"
}
},
"settings": {
"script": {
"value": "_tilemode 0 -export _pdf _all result.pdf\n"
}
},
"engine": "Autodesk.AutoCAD+24_1",
"appbundles": [],
"description": "PDF output"
};

WorkItem:

var payload =
{
"activityId": DA4A_FQ_ID,
"arguments": {
"DWGInput": {
"pathInZip": PARENT_DWG, // ex) . 8th floor.dwg
"url": "urn:adsk.objects:os.object:" + BUCKET_KEY + "/" + SOURCE_ZIP, // ユーザ選択の任意ファイル名
"headers": {
"Authorization": "Bearer " + credentials.access_token
},
"verb": "get",
},
"PDFOutput": {
"url": "urn:adsk.objects:os.object:" + BUCKET_KEY + "/result.pdf",
"headers": {
"Authorization": "Bearer " + credentials.access_token
},
"verb": 'put'
},
"onComplete": {
"verb": "post",
"url": "https://**********************/api/oncomplete"
}
}
};

By Toshiaki Isezaki

Discover more from Autodesk Developer Blog

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

Continue reading