2011年3月11日 (金)キサマ・・・ナニヤツ!?
おはようございます。本日の当番、モーションデザイナーのR.Iです。
前回、ブログを書いたときは年が明ける前でしたが、
最近は少しずつ暖かい日が増えてきました。
皆さんいかがお過ごしでしょうか。
さて今回もスクリプトの話になります。ていうかなっちゃいました。
別にネタがない・・・とかではありませんよ![]()
最近、XSIで使うメインスクリプトをVBSからPythonへシフトしている最中です。
だいぶVBSとの違いにも慣れてきたのですが、
VBSを使用していた時には起こらなかった問題に直面したので、その事について書こうと思います。
なので今回も聞いてやってください。
まずはテストスクリプトが以下になります。
緑色がVBS、青色がPythonで書かれたものです。
スクリプトの内容は選んだオブジェクトの名前をログに表示します。
今回は"TEST"という名前のオブジェクトを選択した時の結果になります。
'VBSの場合
Set oSel = Application.Selection
LogMessage(oSel.GetAsText())
LogMessage(oSel(0))
'---------------------------------------------
結果は
' INFO : TEST
' INFO : TEST
#Pythonの場合
oSel = Application.Selection
Application.LogMessage(oSel.GetAsText())
Application.LogMessage(oSel[0])
#---------------------------------------------
結果は
# INFO : TEST
# INFO : TEST
この段階では両方とも同じ結果を出力しています。
結果を出力した時にわかりにくいので少し手を加えてみます。
'VBS(変更後)の場合
Set oSel = Application.Selection
LogMessage("oSel.GetAsText() ====> " & oSel.GetAsText())
LogMessage("oSel(0) =============> " & oSel(0))
'---------------------------------------------
結果は
' INFO : oSel.GetAsText() ====> TEST
' INFO : oSel(0) =============> TEST
#Python(変更後)の場合
oSel = Application.Selection
oLog = Application.LogMessage
oLog("oSel.GetAsText() ====> " + oSel.GetAsText())
oLog("oSel[0] =============>" + oSel[0])
結果は・・・ってあれ?
# INFO : oSel.GetAsText() ====> TEST
# ERROR : Traceback (most recent call last):
# File <Script Block >, line 6, in <module>
# oLog("oSel[0] =============>" + oSel[0])
# TypeError: cannot concatenate 'str' and 'instance' objects
# - [line 6]
エラーを出してきました。
「同じ文字列入ってんのにどうして?頭爆発しそう・・・
」って
当時は言ってた気がします。
まず、エラー文のここに注目!!
# TypeError: cannot concatenate 'str' and 'instance' objects
# - [line 6]
エラー様は
「文字列とインスタンスじゃ結合できねぇ~よ!」
とおっしゃっております。
エラーを回避する前に内部的にどうなっているのかを比較してみましょう。
選んだオブジェクトが何者なのかを調べるために内容を変更します。
'VBS(再変更後)の場合
Set oSel = Application.Selection
LogMessage("oSel.GetAsText()_Type")
LogMessage(TypeName(oSel.GetAsText()))
LogMessage("")
LogMessage("oSel(0)_Type")
LogMessage(TypeName(oSel(0)))
'---------------------------------------------
結果は
' INFO : oSel.GetAsText()_Type
' INFO : String
' INFO :
' INFO : oSel(0)_Type
' INFO : Null
「TypeName」で選んだオブジェクトが何者なのかがわかります。
VBSでも違いはあるのに、今回はエラーが出ませんでした。
#Python(再変更後)の場合
oSel = Application.Selection
oLog = Application.LogMessage
oLog("oSel.GetAsText()_Type")
oLog(type(oSel.GetAsText()))
oLog("")
oLog("oSel(0)_Type")
oLog(type(oSel[0]))
#---------------------------------------------
結果は
# INFO : oSel.GetAsText()_Type
# INFO : <type 'unicode'>
# INFO :
# INFO : oSel(0)_Type
# INFO : <type 'instance'>
Pythonでは「type」で選んだオブジェクトが何者かがわかります。
エラーでは「str」と「instance」と言っていたのに「unicode」が入っていますが、
あとで少し触れます。
エラーを回避するには、結合するものを同じものに統一する必要があります。
インスタンスを文字列に変換してみましょう。
ということで以下がエラー回避したものです。
#Python(エラー回避後)の場合
oSel = Application.Selection
oLog = Application.LogMessage
oLog("oSel.GetAsText().encode() ====> " + oSel.GetAsText().encode())
oLog("oSel[0].Name.encode() ========> " + oSel[0].Name.encode())
oLog("")
oLog("oSel.GetAsText()_Type.encode()")
oLog(type(oSel.GetAsText().encode()))
oLog("")
oLog("oSel(0).Name_Type.encode()")
oLog(type(oSel[0].Name.encode()))
#---------------------------------------------
結果は
# INFO : oSel.GetAsText().encode() ====> TEST
# INFO : oSel[0].Name.encode() ========> TEST
# INFO :
# INFO : oSel.GetAsText()_Type.encode()
# INFO : <type 'str'>
# INFO :
# INFO : oSel(0).Name_Type.encode()
# INFO : <type 'str'>
「instance」は「.Name」を追加することで「unicode」に変換されます。
更に「.encode()」で「unicode」が「str」に変換されます。
ちなみに「.encode」はオブジェクトが「unicode」であれば
使うことができるメソッドで「unicode」を「str」へ変換する役割があります。
今回は「.encode()」と書きましたが、「.encode('utf-8')」と書いた方が
丁寧かもしれません。
「utf-8」ってなに?っていう詳しい事は自分もよくわからないので
気になる方は調べてみてください。
あともう一つ。
先ほどのエラーでは
# TypeError: cannot concatenate 'str' and 'instance' objects
と表示されましたが、実際、中身を調べると「unicode」でした。
結合する直前に自動でencodeしているのか、XSIの中で「unicode」と「str」が
同じ扱いなのか、もう少し調べる必要があるかもしれませんね。
こんだけ書いたのに、実用的なことは何も書けてないような・・・。
誰もが驚く便利スクリプトでも書けるように頑張ります。
日々精進!
| 固定リンク | コメント (0) | トラックバック (0)
「モーションデザイナー」カテゴリの記事
- この頃 流行りの…(2019.02.28)
- たまには乗らんとね(2019.01.17)
- コミュニケーションを語る!(2018.11.22)
- 12個のアニメーション基本原則とは?(2018.10.11)
- 新人研修を終えて(2018.09.06)
この記事へのコメントは終了しました。








コメント