Help us understand the problem. What is going on with this article?

Mayaとエクセルとかスプレッドシートを連携させるで~

More than 3 years have passed since last update.

pythonでツール作っている人からするとあたりまえかもしれないですが、
せっかくの機会なので、何かしら残したくまとめておきます٩(๑•̀ω•́๑)۶

動機

○csvでもいいんだけど、デザイナーも読みたいし、エクセル使いたいんだよな~
○エクセルのモーションリストからフレーム数とってきたいよな~
○出力してアップしたら勝手にGoogleSpreadsheetのステータス更新してほしいな~

などなど外部のデータを参照・更新したい・・・・・!!!!!!!

外部モジュールとは

pythonにはサードパーティ製の外部モジュールがたくさん存在しています。
melにはできない、あんなことや、こんなことが簡単にできたりします。

import csv
import os

pythonでは最初にimportを挿入することで、いろんなモジュールを呼ぶことができます。
csvやosはもともとあるモジュールなので、別途落としてくる必要はありません。

MayaはPython2系なのでそれ用のモジュールを落としてくるように注意!

今回はmayaのスクリプトフォルダにモジュール群を直接置きますが、
チームでの管理の場合は別ディレクトリで管理したほうがよいので、
詳しくはこのあたりを!
http://www.comtec.daikin.co.jp/DC/UsersNotes/Ritaro/tutorial/maya_04/
http://tm8r.hateblo.jp/entry/2016/10/18/222755

こんな感じで直接scriptsフォルダに置いています。

image

今回の環境
○ Windows 7
○ Maya 2016
○各モジュールの(○.○.○)は今回使用しているバージョンです!

pipを使ってインストールしてくるのがよいかと思います
pipの使い方
http://www.python-izm.com/contents/basis/pip.shtml
今回は簡易的に別のところにインストールしたものをscriptsに移動させました。

excelを使う

xlrd (0.9.4)
xlwt (1.0.0)
xlutils (1.7.1)

エクセルの中にあるシーン名からフレーム数を取得し、かつ今日の日付を書き込む
.xlsでエクセルは保存するべし!

image

import xlrd
import xlwt
from xlutils.copy import copy
import maya.cmds as cmds
import os
import datetime

excel = "" # エクセルファイルのパス
scene = os.path.splitext(cmds.file(q=True, shortName=True, sceneName=True))[0] # シーン名を取得

read = xlrd.open_workbook(excel)

ex_row = 0  #どの行が更新させるか保存しておく

d = datetime.datetime.today() # 今日の日付を取得
today = d.strftime("%Y/%m/%d")

sheet_1 = read.sheet_by_index(0)
for col in range(sheet_1.ncols):
    for row in range(sheet_1.nrows):
        if scene == sheet_1.cell(row, col).value:
            ex_row = row
            print u"スタートフレーム:" + sheet_1.cell(row, 1).value + u" エンドフレーム:" + sheet_1.cell(row, 2).value
            continue

# 必要があれば、出力の処理など 

write = copy(read)   # read用にとってきたオブジェクトを書き込み用のオブジェクトにスタイルも含め完コピ
sheet1 = write.get_sheet(0)    
sheet1.write(ex_row, 3, today) # 4列めに今日の日付を追記する
write.save(excel)

spreadsheetを使う

このあたりを参考にさせていただきました!
http://qiita.com/koyopro/items/d8d56f69f863f07e9378

基本的には上記のエクセルと同じことをします

gspread (0.4.1)
httplib2 (0.9.2)
oauth2client (4.0.0)
requests (2.12.1)
six (1.10.0)

import os
import datetime
import maya.cmds as cmds
import gspread
from oauth2client.file import Storage
from oauth2client.client import OAuth2WebServerFlow


flow = OAuth2WebServerFlow(client_id='クライアントID',
                           client_secret='クライアントシークレット',
                           scope='https://spreadsheets.google.com/feeds',
                           redirect_uri="urn:ietf:wg:oauth:2.0:oob")

scene = os.path.splitext(cmds.file(q=True, shortName=True, sceneName=True))[0]

d = datetime.datetime.today() # 今日の日付を取得
today = d.strftime('%Y/%m/%d')

storage = Storage('cred.dat') # 認証情報を保存しておくファイル
credentials = storage.get()
if credentials is None or credentials.invalid == True:
    authorize_url = flow.step1_get_authorize_url()
    cmds.confirmDialog(m='Go to the following link in your browser: ' + authorize_url)
    code = raw_input('Enter verification code: ').strip()
    credential = flow.step2_exchange(code)
    storage.put(credential)
    credential.set_store(storage)
    credentials = credential

gc = gspread.authorize(credentials)
spr = gc.open_by_key('スプレッドシートのID')

for j, worksheet in enumerate(spr.worksheets()):
    worksheet.get_all_values()
    list_of_lists = worksheet.get_all_values()
    for i, l in enumerate(list_of_lists):
        if l[0] == scene:
            print u'スタートフレーム:' + l[1] + u' エンドフレーム:' + l[2]
            continue

for j, worksheet in enumerate(spr.worksheets()):
    worksheet.get_all_values()
    list_of_lists = worksheet.get_all_values()
    for i, l in enumerate(list_of_lists):
        if l[0] == scene:
           worksheet.update_acell('D' + str(i+1), today)

1回目にアクセスすると
spread1.png
こうゆうのが出てくるのが出てくるので、
アドレスをコピーしてブラウザに貼り付けます
spread2.png
mayaでconfirmをおすと以下のようなウィンドウが出てくるので、ブラウザのコードをコピペする
spread3.png
2回目以降はcred.datの情報を見てアクセスしてくれるので、この作業は1回だけ

Mayaとは関係ないですが、spreadシートにあるデータが
社内のサーバーにあるか確認して、ステータスを更新するようなものも作りました。
Mayaからいろいろできれば、デザイナーさんがPythonを落とさなくてもいろんなツールを配布できるかもしれません!

あんまりMayaPython関係なくてごめんなさいね!

私の宣伝

猫の手も借りたいそこのあなた、仕事をください!!!!!!! twitter: @yukarin33

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away