Maya Advent Calendar 2018 に空きがございましたので
https://qiita.com/advent-calendar/2018/maya
参戦してみます
Maya Typeツールでも愛が生まれた
https://qiita.com/it_ks/items/7cfd0c3069b980be8d86
(▲)こちらの内容の続きのようなものを書いていきたいと思います。
「~~でも愛が生まれた」、懐かしいですね。
Maya 2016 Ext2らへんで登場したTypeツール(Typeノード)ですが、
Typeノードの textInput アトリビュートに set すればpythonからも文字入力できるのですが、
なんと
普通に文字をsetしても受け付けてくれません。
例えばこのような感じです
set('a')
とすれば「a」という文字が入ってくれてもよさそうなものですが、ダメです。
なにならいいのかというと、
先に挙げた記事でもやっているのですが、unicodeコードなら受け付けてくれます。
コード変換
「a」を入力したければ「a」のunicodeコード '61' を渡す必要があります。
これを得るには「ord」と「hex」を使います。
hex( ord(u'a') )
これで大丈夫かと思いきや、まだダメです
アトリビュートエディタには「a」を入力できたのですが、
警告が出てTypeノード自体には反映されません。
接頭辞
よくみてみると、単に61が得られたのではなく、
16進数として扱うための接頭辞「0x」がついていることがわかります
これで大丈夫
…かと思いきや、まだダメです
複数文字対応
ord
は一文字しか変換できず、複数文字あたえるとエラーになってしまいます
もうちょっと気合みせてくれよ…
そんなわけで、forに渡して個別に処理します。
さらに、複数文字を textInput.set するときは、
文字ごとに 半角スペースで区切り ます。
これは実際に入力してみて確認しました。
なるほどね。
できた
以上をまとめて、次のような関数にしてみました
import pymel.core as pm
def set_type_node_text( target_str ):
# unicode型で来なかったら変換
if not isinstance(target_str,unicode):
target_str = unicode( target_str,'cp932' )
# unicodeコードに変換、リストにためる
input_str = []
for c in target_str:
input_str.append( hex(ord(c))[2:] )
# 半角スペース区切りにして textInput.set
pm.selected()[0].textInput.set( u' '.join(input_str) )
target_str = "かきくけこ"
set_type_node_text( target_str )
実行時には Type ノードを選択していることを期待しています。
これで愛が生まれた系の文言(?)を与えても大丈夫(大変にシュール)
参考
タイプ ツール(Type Tool)オプション
https://knowledge.autodesk.com/ja/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2018/JPN/Maya-Modeling/files/GUID-92112B70-161B-4D89-A1E5-BC3D58274EFB-htm.html
ポリゴン テキストを作成する
http://help.autodesk.com/view/MAYAUL/2018/JPN/?guid=GUID-5715F385-F27A-49E0-A624-CB376B669EDC