質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3250閲覧

MAYA Python textFieldで取得したオブジェクトをペアレントしたい

apri

総合スコア2

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/07/10 08:43

編集2021/07/11 04:18

MAYA2018においてPythonを使って選択、取得したオブジェクトをペアレントする
ツールを作りたいと思っています。

・実現したいこと
①親となるオブジェクト(例:pSphere1)を選択し取得してテキスボックスに表示。
②子になるオブジェクト(例:pCube1)を選択し取得してテキスボックスに表示
③”実行ボタン”で①と②で取得したものをペアレント(親子付け)する

①と②までは出来ている?ように思うのですが、③を実行すると
**# エラー: NameError: file <maya console> line 11: global name 'objs_ko' is not defined #
となってしまいます・・・。

なにか解決のヒントでも見つかればと投稿させて頂きました。
よろしくお願いします。

import maya.cmds as cmds def changeUI(): objs = cmds.ls(selection=True) cmds.textField("txt", e=True, text=objs[0]) def changeUI_ko(): objs_ko = cmds.ls(selection=True) cmds.textField("txt_ko", e=True, text=objs_ko[0]) def oParent(): cmds.parent(objs_ko,objs) cmds.window('Window_Selected', title='TEST') cmds.columnLayout(columnAttach=['left', 5], rowSpacing=10) cmds.textField("txt") cmds.button(label="親を選択",command='changeUI()') cmds.textField("txt_ko") cmds.button(label="子を選択",command='changeUI_ko()') cmds.button(label="実行",command='oParent()') cmds.showWindow()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

私は MAYA も Maya Python API も使ったことがないので、Python の知識だけでわかる範囲でお答えします。

Python では、関数の中で変数に代入を行うと、その変数はその関数の中でだけ有効な変数になります。その関数の外や、別の関数の中からは、その変数は見えません。
もしその変数と同じ名前の変数が、その関数の外や別の関数の中にあっても、それは別の変数とみなされます。

changeUI 関数の中で、objs という変数に

Python

1 objs = cmds.ls(selection=True)

と代入が行われています。
このためこの objs という変数は、changeUI 関数の中でだけ有効な変数になります。

同様に、changeUI_ko 関数の中で、objs_ko という変数に

Python

1 objs_ko = cmds.ls(selection=True)

と代入が行われています。
このためこの objs_ko という変数は、changeUI_ko 関数の中でだけ有効な変数になります。

いっぽう oParent 関数の中では、cmds.parent 関数が実行されています。

Python

1 cmds.parent(objs_ko,objs)

このとき cmds.parent 関数に渡されている objs_ko および objs という引数は、プログラマ(質問者さん)の心づもりではそれぞれchangeUI 関数とchangeUI_ko 関数の中で定義済み(値を設定済み)のはずですが、実際は oParent 関数の中から見ると objs_ko 変数も objs 変数も存在しません。
そのために objs_ko 変数なんて存在しないよ(not defined = 定義されてないよ)というエラーが出ています。

これを直すには、関数の返り値(戻り値)として変数の値を関数の外に取り出す、という方法がありますが、見る限りではこのプログラムでは使えそうもありません。

別の方法として、次のようにして global 文を使うという方法があります。

Python

1import maya.cmds as cmds 2 3def changeUI(): 4 global objs 5 objs = cmds.ls(selection=True) 6 cmds.textField("txt", e=True, text=objs[0]) 7 8def changeUI_ko(): 9 global objs_ko 10 objs_ko = cmds.ls(selection=True) 11 cmds.textField("txt_ko", e=True, text=objs_ko[0]) 12 13def oParent(): 14 cmds.parent(objs_ko,objs) 15 16 17cmds.window('Window_Selected', title='TEST') 18cmds.columnLayout(columnAttach=['left', 5], rowSpacing=10) 19cmds.textField("txt") 20cmds.button(label="親を選択",command='changeUI()') 21cmds.textField("txt_ko") 22cmds.button(label="子を選択",command='changeUI_ko()') 23 24cmds.button(label="実行",command='oParent()') 25 26cmds.showWindow()

このようにすると、changeUI 関数の中で代入されていても、objs 変数はグローバル変数であるとみなされます。objs_ko 変数についても同様です。
この結果、oParent 関数の中からでも、これらの変数にアクセスできるようになります。

いちどこのプログラムで "global name 'objs_ko' is not defined" というエラーが消えるかどうか試してみてください。

投稿2021/07/11 13:22

etherbeg

総合スコア1195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apri

2021/07/11 13:40

教えていただいた記述でエラーも消え、希望していた通りの挙動になっていました。 ありがとうございます! 説明もとても分かりやすく勉強になりました。 global分はこれからも沢山活躍してくれそうです! 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問