STUDIO TAMA


thumbnail

投稿日:2022-12-15

【Grasshopper】Hopsを使用してSpreadSheetのデータをGrasshopperから取得する

  • #Grasshopper

今回は GoogleDrive に格納されている SpreadSheet のデータを、Hops を使用して Grasshopper から取得してみました。(※Hops は Rhino7.4 以降使用できるプラグインになりますのでご注意ください)

Grasshopper でスプレッドシートを読み込む方法

Grasshopper で SpreadSheet のデータを読み込む方法はいくつかあるかと思います。

  1. SpreadSheet を CSV でダウンロードしてローカルで読み込む。
  2. Google Cloud で API キーを発行し、Ghpython コンポーネントから python の標準パッケージ urllib2 を使用してリクエストを送る。
  3. python のライブラリ gspread, oauth2client をインストールし、それらを使い認証処理を行ってからデータを取得する。取得したデータを Hops などを使って Grasshopper に渡す。(※つまり Grasshopper で Python の外部ライブラリをどうにかして使う。)
  4. そもそも SpreadSheet でデータを管理せず、RDB 系などの DB に移行して、サーバー側の言語で API を作成して Ghpython からリクエストを送る。

などなど、いろんな方法が考えられるかなと思います。

  • 1 に関しては最も簡単な方法ですが、データが頻繁に更新されたりチームで共有する場合などは、グローバルに管理して直接取得したくなるかなと思います。
  • 2 に関しても割と簡単にできますが、認証処理を省いているため、SpreadSheet の設定を「リンクを知っている人全員」が閲覧できる状態にしなけらばならず、外部から見られて困るようなデータは扱えません。
  • 3 に関しては今回やっていく方法です。自信の環境で Python の外部ライブラリ oauth2client を使用して認証処理を行ってからスプレッドシートのデータを取得し、Hops を使用して Grasshopper に渡してあげます。これによって 2 の様な問題が解消されてます。
  • 4 に関しては、そもそも SpreadSheet を使わないという選択です。以前記事を書いたのでご興味あれあば以下の記事を読んでみてください。
thumbnail

【Grasshopper】GhPythonからAPIを叩き、UserAttributesをDBで管理してみた。

UserAttributesをデータベースで管理してみる

今回読み込む SpreadSheet

thumbnail
  • 今回は、単価のデータを SpreadSheet で管理していることを想定して、上画像のようなデータを用意しました。これらを Grasshopper から取得してみます

準備

まずは外部から SpreadSheet にアクセスできるように準備を行っていきます。(※Google アカウントがある前提で解説していきます。)

thumbnail
thumbnail
Google Cloud

にアクセスして、ログイン後上箇所から、新しいプロジェクトを適当なプロジェクト名で作成します。今回は「grasshopper-spreadsheet」という名前で作成しました。

thumbnail
thumbnail

続いて、検索欄から GoogleDriveAPI と GoogleSheetsAPI を検索し有効にします。

thumbnail
thumbnail

サービスアカウントを作成します。適当な名前・ID を入れて作成します。説明以降は省略できます。

thumbnail
thumbnail

サービスアカウントが作成されたら、アカウントをクリックし、秘密鍵を JSON 形式で作成します。JSON ファイルがダウンロードされると思いますが、後ほど使用しますのでデスクトップなどに置いておいてください。

thumbnail
  • SpreadSheet に移動して、共有ボタンから作成したサービスアカウントを追加します。ユーザー検索欄にサービスアカウントのメールアドレスを入れると検索できるかと思います。
  • これでスプレッドシート側の準備は完了です。

Hops を使用して API を作成する

Hops component を作成していきます。開発環境は以下になります。

  • Rhino7.9, conda 22.9.0, Python 3.9.13, Hops0.15.4, Editor : VSCode anaconda で仮想環境を作成してます。python は 3.8 以上, Rhino は 7.4 以上である必要があるのでご注意ください。 Hops を使用するまでの環境構築は省いてますが、以下の記事や動画がわかりやすく解説してくれてます。ご参照ください。
  • Rhino development
  • Grasshopper の Hops のはじめ方
  • Connecting Hops to CPython in Rhino 7
1from flask import Flask
2import ghhops_server as hs
3import gspread
4from oauth2client.service_account import ServiceAccountCredentials
5import os
6
7app = Flask(__name__)
8hops = hs.Hops(app)
9
10@hops.component(
11    "/getSpreadsheet",
12    name="ss",
13    description="Get sheet value",
14    inputs=[],
15    outputs=[
16        hs.HopsString("value", "value", "fetch value"),
17    ],
18)
19
20def getSpreadsheet():
21    scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
22    jsonKey = os.path.abspath('各自ダウンロードしたjsonKeyファイル')
23    credentials = ServiceAccountCredentials.from_json_keyfile_name(jsonKey, scope)
24    gc = gspread.authorize(credentials)
25    sheet = gc.open("スプレッドシートの名前").sheet1
26    getSheet = sheet.get_all_values()
27    return getSheet
28
29if __name__ == "__main__":
30    app.run()
31

上が作成した hops component になります。app.py というファイル名で作成してます。

getSpreadSheet 関数で一連の処理を書いてます。

  • ダウンロードした JSON キーは上の python ファイルと同階層において、jsonKey の行で読み込んでます。ファイル名は各々変わってくるかと思います。
  • その後 Key を用いて認証を行い、スプレッドシートを開き sheet1 を取得し、sheet1 のすべての値を取得して値を返してます。

このファイルを実行すると、 

でサーバーが起動します。

grasshopper から Hops コンポーネントで  

アクセスすれば、Grasshopper 側で値を取得できます。

Grasshopper から値を取得

thumbnail
  • Grasshopper から Hops を使用して値を取得してみます。Hops コンポーネントをダブルクリックし、 http://127.0.0.1:5000/getSpreadsheet にアクセスすることでデータが取得できましたが、取得したデータに日本語が含まれているので、文字コードを decode して文字列に直してあげます。
thumbnail
  • app.py 側で処理したかったんですが、うまくいかなかったのでしぶしぶ Ghpython を使って decode してます。
1response = value.decode('unicode-escape')

これでスプレッドシートの値が取得できました。

おまけ

thumbnail

最後に、取得したデータを少し加工します。 部位・仕上・単価・単位の 4 項目があり、プラグイン human の Item Selector コンポーネントで、部位と仕上でフィルターをかけられるようにしてます。これでほしい値を Selector で選べるようになってます。 Hops component に引数を渡して app.py 側で処理することもできるかなと思います。 スプレッドシートと連携する機会はさほどないかもしれませんが、もしかしらたら役に立つかもと思いブログにしておきました。以上 【参考】

目 次