Py3dsMax 関連でドハマりしたのでメモ。
Py3dsMax であるクラスに関連するオブジェクトを取得するのは、maxScript にある getClassInstances() 関数を使えば取得できます。が、どうやらモノによってはこれで取得したオブジェクトだと、親クラスで定義されているプロパティにアクセスできないようです。
from Py3dsMax import mxs
for n in mxs.getClassInstances(mxs.KrakatoaPRTLoader):
print n.name
これは一見 OK そうですが、実はダメです。なーぜーーーーー!?
PRT Loader を選択した状態で selection から拾う、
from Py3dsMax import mxs
for n in mxs.selection:
print n.name
これならイケるんですね。ぐぬぬぬ。何が違うのか全く不明です。
ちなみにどちらの例でも fileList のように KrakatoaPRTLoaderクラスで定義されているプロパティはアクセスできます。
でまあ、いろいろ試行錯誤した結果こんな感じに。ここで得られた objs なら、 show するなり何なりで通常のオブジェクトと同じように操作できます。
from Py3dsMax import mxs
objs = []
for n in mxs.getClassInstances(mxs.KrakatoaPRTLoader):
objs.append('selectMore ' + mxs.exprForMAXObject(n))
s = '''undo on
(
clearSelection()
%s
)''' % '\n'.join(objs)
mxs.execute(s)
objs = mxs.selection
mxs.execute('max undo')
for o in objs:
print o.name
良い子はマネしちゃいけない、極悪非道なコードです。あまりにも酷すぎます。
全く、なんなんでしょうね、、、、、
Did you ever tried using the mxs.undoOn function with the Python Blur shell for 3dsmax?
Wondering how this function could be use with Python…. any idea?
sorry fo late response. actually, no. If it doesn’t work, you can try mxs.execute() to run max script from python. sometime it works.