ラベル objectId の投稿を表示しています。 すべての投稿を表示
ラベル objectId の投稿を表示しています。 すべての投稿を表示

2017年2月4日土曜日

バケット内のオブジェクト+VB.net

バケット内のオブジェクト

作成したバケットにどのようなファイルがアップロードされているかを表示してみます。APIはData Management APIの「GET buckets/:bucketKey/objects」です。

リファレンスによると、必要な情報は

  • data:readのアクセストークン
  • バケットキー

の二つです。

(1) バケットの一覧を取得し表示
(2) 表示された一覧からバケットを選択
バケットの一覧を表示し「選択」をクリック
(3)バケット内のオブジェクトの一覧を表示
バケット内のオブジェクトを表示
というシナリオで構成してみます。
ASP.net Webフォームでこのお題を解いてみます。

バケットの一覧を取得してGridViewに表示する


前回はListViewにバケットの一覧を表示しましたが、今回はGridViewに表示します。新なWebフォームを追加して、GridView(gdvBucket)とラベル(lblStatus)を追加します。FORGE APIの部分は前回と同じですが、GridViewにデータを表示するために、新たにデータセット(DataSet)を作成して、GridViewにバインドします。どうもGridViewはデータベースと結びつけないと作動しないようです。


サンプルコード


Public Class WebForm4
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load


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

        Dim acToken As String = mdlUtils.GetToken("bucket:read")
        If acToken = "" Then
            Exit Sub
        End If

        '**********************************
        '     バケットを取得
        '**********************************

        'RestSharpでクライアントを作成
        Dim url As String = "https://developer.api.autodesk.com"
        Dim _client As New RestSharp.RestClient(url)

        'RestSharpでリクエストを作成
        Dim authReq As New RestSharp.RestRequest()
        With authReq
            .Resource = "oss/v2/buckets"

            'メソッド
            .Method = RestSharp.Method.GET

            'ヘッダー
            .AddHeader("Authorization", "Bearer " + acToken)

        End With

        '送信
        Dim result As RestSharp.IRestResponse = _client.Execute(authReq)

        If result.StatusCode = Net.HttpStatusCode.OK Then

            '200OKの場合


            'データセットを定義
            Dim dsBucket As New DataSet("BucketList")
            Dim tblBucket As DataTable = dsBucket.Tables.Add("Table1")
            tblBucket.Columns.Add("バケットキー", Type.GetType("System.String"))
            tblBucket.Columns.Add("作成日", Type.GetType("System.String"))
            tblBucket.Columns.Add("ポリシーキー", Type.GetType("System.String"))


            Dim responseString As String = result.Content

            'Newtonsont.JsonのJSON解読メソッドを使うと便利
            'まず以下の構文でオブジェクトを作成します。
            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)
            '"items"を取得しjArrayオブジェクトとする
            Dim itemArray As Newtonsoft.Json.Linq.JArray = jsonObj("items")
            '配列を走査し、データテーブルにデータ行を充てんする
            For Each item As Newtonsoft.Json.Linq.JObject In itemArray
                'バケットキー
                Dim strBucketKey As String = item("bucketKey")
                '作成した日付(ミリセカンド)
                Dim strCreatedDate As String = item("createdDate")
                'ポリシーキー
                Dim strPolicyKey As String = item("policyKey")

                'タイムスタンプから日付へ変換
                Dim intTimeStamp As Int64 = Int64.Parse(strCreatedDate)
                Dim dtCreateDate As DateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(intTimeStamp)


                'データセット
                Dim rowBucket As DataRow = tblBucket.NewRow()
                rowBucket("バケットキー") = strBucketKey
                rowBucket("作成日") = dtCreateDate.ToLocalTime.ToString
                rowBucket("ポリシーキー") = strPolicyKey
                tblBucket.Rows.Add(rowBucket)


            Next
            lblStatus.Text = tblBucket.Rows.Count.ToString + "個のバケットが見つかりました。"
            gdvBucket.DataSource = New DataView(tblBucket)
            gdvBucket.DataBind()

        Else
            Dim responseString As String = result.Content
            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)
            lblStatus.Text = "取得に失敗しました。" + vbTab + jsonObj("reason")

        End If
    End Sub
End Class

データグリッドに選択列を追加

デザインビューでデータグリッドを選択し、GridViewタスクから「列の編集」を選択します。
HyperLinkFieldを追加し、
DataNavigateUrlFields  に バケットキー
DataNavigateUrlFormatString に ~/WebForm5.aspx?BucketKey={0}
HeaderText に 詳細表示
Text に 選択

を設定します。
選択列の追加
バケットを選択したときに、次のページを呼び出すときにGridViewに表示されているデータセットテーブルの 「バケットキー」の値を受け渡します。DataNavigateUrlFormatStringには、DataNavigateUrlFieldにカンマ区切りで設定した文字列を、{0} {1}の書式で受け渡すことができます。

バケット内オブジェクト一覧

あらたなWebフォームを追加し、ラベル(lblBucketKey)とGridView(gdvObjects)を追加します。ページが遷移するときのデータの受け渡しは HttpRequestの Request.QueryStringを使います。(サンプルコードの冒頭の部分)
また、バケットの一覧を取得する部分は、バケットキーを使ってURLを作成するだけなので比較的簡単といえるでしょう。

サンプルコード

Public Class WebForm5
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load


        '**********************************
        '     バケットキーを取得
        '**********************************
    
        Dim strBucketKey As String = Request.QueryString("BucketKey")
        lblBucketkey.Text = strBucketKey

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

        'アクセストークンを取得す部分はこちらを参照してください。
        Dim acToken As String = mdlUtils.GetToken("data:read")
        If acToken = "" Then
            lblBucketkey.Text = "アクセストークンの取得に失敗しました。"
        End If

        '**********************************
        '     バケット内のオブジェクト
        '**********************************
        Dim strClient As String = "https://developer.api.autodesk.com"
        Dim _client As New RestSharp.RestClient(strClient)

        Dim chkReq As New RestSharp.RestRequest()
        With chkReq
            .Resource = "oss/v2/buckets/" + strBucketKey + "/objects"
            .Method = RestSharp.Method.GET
            .AddParameter("Authorization", "Bearer " + acToken, RestSharp.ParameterType.HttpHeader)
            .AddParameter("Content-Type", "application/json", RestSharp.ParameterType.HttpHeader)
        End With

        Dim result As RestSharp.IRestResponse = _client.Execute(chkReq)

        '**********************************
        '     データグリッドに表示
        '**********************************
        If result.StatusCode = Net.HttpStatusCode.OK Then
            '成功した場合
            'データセットを定義
            Dim dsObjects As New DataSet("BucketList")
            Dim tblObjects As DataTable = dsObjects.Tables.Add("Table1")
            tblObjects.Columns.Add("オブジェクトキー", Type.GetType("System.String"))
            tblObjects.Columns.Add("オブジェクトID", Type.GetType("System.String"))
            tblObjects.Columns.Add("ロケーション", Type.GetType("System.String"))

            Dim responseString As String = result.Content
            'Newtonsont.JsonのJSON解読メソッドを使うと便利
            'まず以下の構文でオブジェクトを作成します。
            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)
            '"items"を取得しjArrayオブジェクトとする
            Dim itemArray As Newtonsoft.Json.Linq.JArray = jsonObj("items")
            '配列を走査する
            For Each item As Newtonsoft.Json.Linq.JObject In itemArray
                'オブジェクトキー
                Dim strObjectKey As String = item("objectKey")
                'オブジェクトID
                Dim strObjectId As String = item("objectId")
                'ロケーション
                Dim strLoacation As String = item("location")

                'データセット
                Dim rowObjects As DataRow = tblObjects.NewRow()
                rowObjects("オブジェクトキー") = strObjectKey
                rowObjects("オブジェクトID") = strObjectId
                rowObjects("ロケーション") = strLoacation
                tblObjects.Rows.Add(rowObjects)


            Next
            gdvObjects.DataSource = New DataView(tblObjects)
            gdvObjects.DataBind()

        End If

    End Sub

End Class

GridViewを使うことで、少し見栄えも改善されました。

2017年2月1日水曜日

ファイルのアップロード +VB.net

バケットにファイルをアップロードする


作成したバケットにファイルをアップロードします。必要な情報は

  • アクセストークン data:create または  data:write (既存のファイルは上書き)
  • バケットキー   ファイルをアップロードするバケット

です。ここでもRestSharpを使ってファイルをアップロードしてみます。ユーザーインターフェイスは前回のバケット一覧を少し改造して、下の図のようにしてみました。
WebForm3.aspx
[参照]ボタンを押して選択したファイルを、lbxBucketsで選択したバケットに[アップロード]ボタンでアップロードし、そのObjectIDを取得して表示する、というシナリオです。

サンプルコード


アップロードボタンのクリックイベントのハンドラを示します。

    Protected Sub btnUpload_Click(sender As Object, e As EventArgs) Handles btnUpload.Click

        '**********************************
        ' アップロードするファイルを取得
        '**********************************

        'ファイルが選択されているか?
        If FileUpload1.HasFile = False Then
            MsgBox("ファイルが選択されていません。", MsgBoxStyle.OkOnly)
            Exit Sub
        End If

        'バケットにアップロードするファイル
        'FileUploadで転送されたファイル
        Dim fileToUpload As HttpPostedFile = FileUpload1.PostedFile

        'ファイル名(インターネットエクスプローラはフルパスを返す)
        Dim strFullPath As String = fileToUpload.FileName

        'ファイル名だけ取り出す
        Dim strFileName As String = IO.Path.GetFileName(strFullPath)

        '①ファイル名をURLエンコードする
        Dim strObjectKey As String = System.Web.HttpUtility.UrlEncode(strFileName)

        'ファイルの内容を読んでByteの配列とする
        Dim fileData As Byte() = Nothing
        Using binaryReader As New IO.BinaryReader(fileToUpload.InputStream)
            fileData = binaryReader.ReadBytes(fileToUpload.ContentLength)
        End Using


        '現在選択しているバケットキーを取得
        Dim strBucketKey As String = lbxBuckets.SelectedValue

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

        Dim acToken As String = mdlUtils.GetToken("data:write")
        If acToken = "" Then
            Exit Sub
        End If

        '**********************************
        '     ファイルをアップロード
        '**********************************
        'RestSharpでクライアントを作成
        Dim url As String = "https://developer.api.autodesk.com"
        Dim _client As New RestSharp.RestClient(url)

        'RestSharpでリクエストを作成
        Dim authReq As New RestSharp.RestRequest()
        With authReq
            .Resource = "oss/v2/buckets/" + strBucketKey + "/objects/" + strObjectKey

            'メソッド
            .Method = RestSharp.Method.PUT

            'ヘッダー
            .AddHeader("Authorization", "Bearer " + acToken)

            'BODY
            .AddParameter("Content-Type", fileToUpload.ContentType)
            .AddParameter("Content-Length", fileToUpload.ContentLength)

            '②アップロードするファイルをリクエストボディに追加
            .AddParameter("requestBody", fileData, RestSharp.ParameterType.RequestBody)

        End With

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

        '結果
        If result.StatusCode = Net.HttpStatusCode.OK Then

            'ObjectIdを取得する
            Dim responseString As String = result.Content
            'Newtonsont.JsonのJSON解読メソッドを使うと便利
            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)
            'objectId
            lblObjectId.Text = jsonObj("objectId")

        Else
            Dim responseString As String = result.Content
            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)
            lblObjectId.Text = jsonObj("reason")

        End If

    End Sub

ポイントは①のファイルの名前をエンコードすることを忘れないようにするところと、②のファイルをBODYにテンプルすところです。

大きなサイズのデータを送れるようにする


ASP.netのFileUploadコントロールは転送できるファイルサイズが4MB程度に制限されているので、これを300MB(300×1024=307200KB)に緩和します。

ソリューションエクスプローラで「Web.config」ファイルを開き、17行目あたりにある
<httpRuntime targetFramework="4.6"/>
の末尾の/の前をクリックし、maxRequestLength="307200"と追記します。4.6"の後ろにスペースを空けて、maxと打てばインテリセンスが働いて、maxRequestを探すことができます。

  <system.web>
    <authentication mode="None" />
    <compilation debug="true" strict="false" explicit="true" targetFramework="4.6" />
    <httpRuntime targetFramework="4.6" maxRequestLength="307200" />
    <pages>
      <namespaces>
     ・・・・

実行する


デバッグ起動してバケットと、アップロードするファイルを選択して「アップロード」ボタンを押すと、ファイルサイズによっては時間がかかりますが、うまくいけばオブジェクトIDが返ってきます。


2016年12月21日水曜日

ビューア用に変換する

アップロードしたファイルの変換

FORGEビューアで見ることができるファイルフォーマットは多数ありますが、それはそのファイルを直接見ているのではなく、ビューア用に変換する必要があります。その拡張子はどうやら「svf」という形式のようで、この変換は

Model Derivative API

で行います。デリバティブってなんか危なっかしい響きがありますが、大丈夫なんですかね。その方法を説明したチュートリアルがあります。

Prepare a File for the Viewer

その前に!(Before you begin)やるべきことがあります。
(1) アクセストークンを「data:write」と「data:read」で取得しましょう。
(2) ファイルをアップロードして(前回やりました) objectIdのURNをメモしておいてください。

だそうです。(1)はもう慣れたと思いますが、ポイントはスコープを二つ使うということです。DHCを起動しましょう。

変換用のアクセストークンの取得

いちいちアクセストークンを適切なスコープで取得することが重要なポイントとなります。ヘルプにはこのように書いてあります。
DHCの設定は次の図のようになりますが、

ポイントはSCOPEのところに

data:write data:read

と半角スペースでつないで二つのスコープを入れることです。
scopeをdata:write data:read の二つを設定


これで、SENDボタンを押すと、いつものようにアクセストークンが返ってきます。
{
"access_token": "LBBv4IgAg4qhe7P1zaRJcff6f3VK",
"token_type": "Bearer",
"expires_in": 86399
}


変換命令を送る(Model Derivative API)

アクセストークンを取得できたら、前回アップロードしたファイルをSVF形式に変換します。この掟はヘルプに書いてあります。まずはRequestですが

Method and URIPOST https://developer.api.autodesk.com/modelderivative/v2/designdata/job
これは単純に送信先にPOSTするということですから、DHCとしては

次にヘッダーです。
AuthorizationyesstringMust be Bearer <token>, where <token> is obtained via OAuth
Content-TypeyesstringMust be application/json
<token>は先ほど取得したアクセストークンを使います。ですから、DHCのヘッダーは
ヘッダーの設定
となります。
問題はBODYセクションですが、なんだかこむつかしいことが書かれています。
inputyesobjectGroup of inputs
input.urnyesstringThe design URN; returned when uploading the file to Forge The URN needs to be `Base64 (URL Safe) encoded`_span>.




outputyesstringGroup of outputs
output.formatsyesarray: objectGroup of requested formats/types. User can request multiple formats.
formats.typeyesstringThe requested output types. Possible values: DWG, FBX, IFC, IGES, OBJ, STEP, STL, SVF, thumbnail. For a list of supported types, call the GET formats endpoint.
必ず必要なところだけ取り出してみました。JSON形式で書けばいいのですが、なんだかよくわかりませんねぇ。どうやらinputというセクションの中にurnというセクションを入れ子にして作りなさい、という意味らいいです。
従いまして

{
      "input" : {
                   "urn" : Base64でエンコードされたオブジェクト(アップロードしたファイルのobjectid)のurn
                   },
というように書きます。これはこのサイトを使って、前回取得したurnをエンコードします。
urn:の文字も含んでENCODEボタンで変換する。
謎の文字列が表示される
エンコード後の文字はなんだか意味不明ですが、この文字列でオブジェクト(アップロードしたファイル)を指定します。

またoutput.formatsですが、「どんな形式に変換したいのか?」の情報を記入します。これはいろいろなフォーマットを指定できますが、SVFの場合はさらにどんなビューを変換するのかを指定します。
Viewsyesarray: stringRequired options for SVF type. Possible values: 2d, 3d
指定できるのは2dと3dだけですが、これらを[ ]でくくって指定できます。従いまして、Bodyの部分は例えば以下のようになります。{  "input" : {    "urn" : ”dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6YmxhY2tzbWl0aGJ1Y2tldDEyMDMvc2FtcGxlcHJvamVjdDAxLnJ2"  },  "output" : {    "formats" : [      {        "type" : "svf",        "views" : ["2d", "3d"]      }    ]  }}

"output" : [{"type":"svf", "view":["2d","3d"]}]の指定がちょっと特徴的ですが、JSON形式なので、]や}がチャンと対になっているように気を付けてください。DHCの画面は次のようになります。
: { [を間違えないように
これでSendを押すと200OKの値が返ってくるはずです。
200OK     (゜-゜)気持ちいい!
変換命令が受けつけられました。




今どんな感じ?

変換が開始されましたが、それには時間がかかります。お仕事の進行状況を問い合わせて、データが準備できたかどうか確認してみましょう。
ヘルプはこちら。

こちらは現在のオブジェクトの状態を問い合わせるAPIです。使い方はとても単純で
Method and URIGET https://developer.api.autodesk.com/modelderivative/v2/designdata/:urn/manifest
Authentication Contextapp only
Required OAuth Scopesdata:read
Data FormatJSON
これは単純に、URIの「:urn」の部分を、上記のurnに入れ替えて、data:readのアクセストークンを使ってGETするだけです。以下はDHCの設定です。ヘッダーにはAuthorizationに「Bearer アクセストークン」のいつものパターンですね。
長ーいendpoint

やたらと長いendpointになりますねー。この例では
developer.api.autodesk.com/modelderivative/v2/designdata/dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6YmxhY2tzbWl0aGJ1Y2tldDEyMDMvc2FtcGxlcHJvamVjdDAxLnJ2dA/manifest

となりました。レスポンスは
{
"type": "manifest",
"hasThumbnail": "true",
"status": "success",
"progress": "complete",
"region": "US",
"urn": "dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6YmxhY2tzbWl0aGJ1Y2tldDEyMDMvc2FtcGxlcHJvamVjdDAxLnJ2dA",
"version": "1.0",
[
{"name": "sampleproject01.rvt", "hasThumbnail": "true", "status": "success", "progress": "complete",…},
{"status": "success", "progress": "complete", "outputType": "thumbnail", "children":[{"guid": "0576ce39-e54e-369e-da0e-7a306abf2144",…}
]
ですので、progress はcompleteなので、変換はすでに終わったようです。

じゃあ、いよいよビューアで表示してみますか!

2016年12月19日月曜日

バケットにファイルをアップロードする

ファイルのアップロード

引き続き、チュートリアルの後半を実行してみます。

Step 2: Upload a file to a storage location

ファイルのアップロードに必要なHTTPリクエストの項目をこちらで確認します。
Resource Information

Method and URI

  • メソッドは「PUT」
  • URIは

    https://developer.api.autodesk.com/oss/v2/buckets/:bucketKey/objects/:objectName
    となっています。:bucketKeyには取得したバケットの名前(:は必要ありません)を、:ObjectNameにはアップロードするファイルにつける任意の名前をつけます。名前は本当のファイル名でもいいし、GUIDのような名前でも構いませんが、拡張子は変更しないでください。

Required OAuth Scopes

  • data:write または data:create で取得したアクセストークン。data:write の場合は、既存のファイルを上書きすることができます。

Data Format

  • データフォーマットはJSON形式

まずは例によって、アクセストークンを取得します。スコープはdata:writeです。DHCを起動し、以下のように設定して、Sendで応答を待ちます。
DHCでアクセストークンを取得する
すると、応答が返ってきます。
アクセストークンを取得した!

ファイルをアップロード

いよいよファイルをアップロードします。ファイルは任意のRevitのファイル(標準添付のサンプルプロジェクトなどを利用してください。)を使用します。

ヘッダーの必要事項はこちらで確認します。
ヘッダーには何が必要か?
たくさん項目がありますが、必ず必要なのはAuthorizationとContent-Lengthだけです。

Authorization


  • Bearer アクセストークン (Bearer+半角スペース+アクセストークン)

Content-Length


  • DHCも含めて、ほとんどのクライアントはファイルを指定すれば、この項目は自動的に設定されます。

DHCの設定は下の図のようになります。
DHC
① BODYはファイルなので「file」を選ぶ
② Revitのファイルを選択します。
③ Bearer アクセストークン
④ developer.api.autodesk.com/oss/v2/buckets/blacksmithbucket1203/objects/sampleproject01.rvt
バケット名とオブジェクトの名前(②のファイル名と一致しなくてもいいが、拡張子は同じにします。)

ファイルのアップロードの設定は、なにか拍子抜けするほど簡単ですねぇ。ほんとにこれでいいんでしょうか?とりあえず[Send]を押してみます。

しばらくすると・・・・・

おお!ちゃんんとアップロードできたじゃないですか!応答の内容をチェックしてみましょう。
アップロード成功!
{
"bucketKey": "blacksmithbucket1203",
"objectId": "urn:adsk.objects:os.object:blacksmithbucket1203/sampleproject01.rvt",
"objectKey": "sampleproject01.rvt",
"sha1": "55d89511380aeaa070be7072ed7a57d89172e5f3",
"size": 17215488,
"contentType": "application/octet-stream",
}

bucketkey

バケットの名前。アップロード時に指定したものと同じ名前が返されます。

objectId

これがアップロードしたファイルのバケット内でのURN(ID)になります。以降、この名前でファイルをs操作します。

ObjectKey

アップロードしたファイルの名前。ファイルはアップロード後は「オブジェクト」と呼ばれます。

うまくアップロードできました。今度はこのファイルをビューア用に「変換」します。作成したバケットはtransient、急がなければ。なぜなら作成したバケットはtransient、つまり24時間しかデータを保持してくれないのだから・・・・