2017年2月26日日曜日

オブジェクトのトランスレーション+VB.net

ビューア用に変換

バケットにアップロードしたオブジェクトを、ビューア用のデータであるSVF形式に変換します。使用するAPIは「Model Derivative API」の「POST job」です。

シナリオ

前回までのバケットの選択→オブジェクトIDの取得 の流れを利用して、オブジェクトを変換してみます。バケットを選択しオブジェクト一覧を表示するGridViewに「SVF変換」の列を設けて、選択したオブジェクトをSVFに変換します。
SVF変換

使用するAPI

アップロードしたオブジェクトの変換には、「Model Derivative API」の「POST job」を使います。

URI

https://developer.api.autodesk.com/modelderivative/v2/designdata/job

アクセストークン

変換には「data:read」と「data:write または data:create」でアクセストークンを取得します。data:createを使うと、同じオブジェクトでも上書きされず、次々新しい変換ができますので、今回は data:read data:write を使います。

リクエストボディ~JSON

こんかいちょっとややこしいのは、送信するボディにJSONを使用することです。このJSONの形式は以下の通りです。
{
   "input": {
     "urn": "dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6bW9kZWxkZXJpdmF0aXZlL0E1LnppcA",
     "compressedUrn": true,
     "rootFilename": "A5.iam"
   },
   "output": {
     "formats": [
       {
         "type": "svf",
         "views": [
           "2d",
           "3d"
         ]
       }
     ]
   }
 }
これを単に文字列を使って作成してもいいのですが、クラスとしてこのJSONを表現し、Newtonsoft.Json.JsonConvert.SerializeObjectを使ってJSON文字列にしてみましょう。まず、このJSONをクラスに置き換える方法ですが、こちらに大変便利なWebサイトがあります。こちらではJSONとC#クラスの変換を助けてくれます。上記JSONを貼り付けてGenerateボタンを押すと
public class Input
{
    public string urn { get; set; }
    public bool compressedUrn { get; set; }
    public string rootFilename { get; set; }
}

public class Format
{
    public string type { get; set; }
    public List<string> views { get; set; }
}

public class Output
{
    public List<Format> formats { get; set; }
}

public class RootObject
{
    public Input input { get; set; }
    public Output output { get; set; }
}
となり、クラスが4つ作成されました。VB.netでこのクラスを定義すると

Public Class Input
    Public urn As String
End Class

Public Class Format
    Public type As String
    Public views As List(Of String)
End Class

Public Class Output
    Public formats As List(Of Format)
End Class

Public Class RootObject
    Public input As Input
    Public output As Output
End Class

となります。これをプロジェクト内に定義して [RootObject]クラスを生成し、JSONにコンバートすれば、JSON文字列を生成できます。

バケットの内容一覧

バケットの内容一覧を表示する部分は、前回を参照してください。

SVF変換用ButtonField

WebFormをもう一つ追加して、下の図のように設定します。
Webフォーム
SVF変換用のButtonFieldをGridViewに付け加えます。
ButtonFieldを付けくわて、ButtonStyleをButtonにする
このボタンフィールドのハンドラにSVF変換のコードを記入します。

コードサンプル

    Protected Sub gdvObjects_RowCommand(sender As Object, e As GridViewCommandEventArgs) Handles gdvObjects.RowCommand

        '何行目がクリックされたのか?
        Dim index As Integer = Convert.ToInt32(e.CommandArgument)
        Dim row As GridViewRow = gdvObjects.Rows(index)

        'オブジェクトIDの取得
        Dim objKey As String = row.Cells(1).Text
        Dim objId As String = row.Cells(2).Text

        '*******************************************
        '     アクセストークンを取得
        '*******************************************

        Dim acToken As String = mdlUtils.GetToken("data:write data:read")
        If acToken = "" Then
            lblBucketkey.Text = "アクセストークンの取得に失敗しました。"
            Exit Sub
        End If

        '*******************************************
        '     URN(ObjectId)をBase64エンコード
        '*******************************************

        Dim bytes As Byte() = System.Text.Encoding.UTF8.GetBytes(objId)
        Dim convURN As String = Convert.ToBase64String(bytes, Base64FormattingOptions.None)

        '*******************************************
        '     変換リクエスト(RestSharp)
        '*******************************************
        'クライアント
        Dim strClient As String = "https://developer.api.autodesk.com"
        Dim _client As New RestSharp.RestClient(strClient)

        'リクエスト
        Dim transReq As New RestSharp.RestRequest()
        transReq.Resource = "modelderivative/v2/designdata/job"
        'メソッド
        transReq.Method = RestSharp.Method.POST
        'ヘッダー
        transReq.AddHeader("Authorization", "Bearer " + acToken)
        transReq.AddHeader("Content-Type", "application/json")
        'ボディのJSON文字列
        '{
        '   "input" {
        '               "urn": "dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6bW9kZWxkZXJpdmF0aXZlL0E1LnppcA"
        '           },
        '   "output": {
        '               "formats": [
        '                            {
        '                              "type": "svf",
        '                              "views": ["2d","3d"]
        '                             }
        '                           ]
        '              }
        '}
        '送信するJSONをクラスで置き換えて作成
        Dim iInput As New Input
        iInput.urn = convURN

        Dim iFormat As New Format
        iFormat.type = "svf"
        iFormat.views = New List(Of String)
        iFormat.views.Add("2d")
        iFormat.views.Add("3d")

        Dim iOutput As New Output
        iOutput.formats = New List(Of Format)
        iOutput.formats.Add(iFormat)

        Dim iRootObj As New RootObject
        iRootObj.input = iInput
        iRootObj.output = iOutput

        'JSONオブジェクトに変換する
        Dim json As Object = Newtonsoft.Json.JsonConvert.SerializeObject(iRootObj)

        '変換したJSONオブジェクトをボディに追加する
        transReq.AddParameter("application/json", json, RestSharp.ParameterType.RequestBody)

        'リクエストを送信
        Dim result As RestSharp.IRestResponse = _client.Execute(transReq)

        '*******************************************
        '     応答
        '*******************************************
        If result.StatusCode = Net.HttpStatusCode.OK Then

            '200 成功した場合
            '戻り値のJSONは次の形式になっている
            '{
            '  "result": "success",
            '  "urn": "dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6bW9kZWxkZXJpdmF0aXZlL0E1LnppcA",
            '  "acceptedJobs": {
            '    "output": {
            '      "formats": [
            '        {
            '          "type": "svf",
            '          "views": [
            '            "2d",
            '            "3d"
            '          ]
            '        }
            '      ]
            '    }
            '  }
            '}
            Dim responseString As String = result.Content
            'Newtonsont.JsonのJSON解読メソッドを使うと便利
            'まず以下の構文でオブジェクトを作成します。
            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)
            'URNを取得
            Dim strURN As String = jsonObj("urn")
            lblStatus.Text = "変換を開始しました。"
            tbxURN.Text = strURN

        ElseIf result.StatusCode = Net.HttpStatusCode.Created Then
            '201 すでに作成されている場合
            Dim responseString As String = result.Content
            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)
            Dim strURN As String = jsonObj("urn")
            lblStatus.Text = "すでに変換されています。"
            tbxURN.Text = strURN

        ElseIf result.StatusCode = Net.HttpStatusCode.BadRequest Then
            Dim responseString As String = result.Content
            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)
            '"diagnostic"の値にエラーの詳細が記載されている。
            Dim strDiagnostic As String = jsonObj("diagnostic")
            lblStatus.Text = "変換に失敗しました。" + strDiagnostic
            tbxURN.Text = ""

        Else
            '何らかの失敗
            lblStatus.Text = "変換に失敗しました。"
            tbxURN.Text = ""
        End If
    End Sub
End Class

'JSONクラス
Public Class Input
    Public urn As String
End Class

Public Class Format
    Public type As String
    Public views As List(Of String)
End Class

Public Class Output
    Public formats As List(Of Format)
End Class

Public Class RootObject
    Public input As Input
    Public output As Output
End Class

実行してみる

まず、バケットの一覧を表示します。
バケットの一覧
バケットを選択すると、

が表示されます。ここで[SVF変換]ボタンを押して、変換します。
変換が開始されるとURNが表示されます
時間をおいて、再度SVF変換を押すと「すでに変換されています」となります。

このURNを使って、ビューアにオブジェクトを表示することができます。


0 件のコメント:

コメントを投稿