ビューア用に変換
バケットにアップロードしたオブジェクトを、ビューア用のデータである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フォーム |
ButtonFieldを付けくわて、ButtonStyleをButtonにする |
コードサンプル
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
実行してみる
まず、バケットの一覧を表示します。
バケットの一覧 |
バケットを選択すると、
変換が開始されるとURNが表示されます |
このURNを使って、ビューアにオブジェクトを表示することができます。