おはようございます。本日の当番、モーションデザイナーのR.Iです。
前回、ブログを書いた日から約3ヶ月強経ちました。
アクセスゲームズも人数が増えてきて、ブログを書く順番の間が長くなってきました。
さて、今回もしつこくスクリプトの話になります。
今回は会社の同僚から頼まれたスクリプトをネタにしたいと思います。
頼まれた内容としては以下になります。
「Maya上で特定の名前のネームスペースを簡単につけれるようにしたい」という内容です。
ここでいうネームスペースとは

同じ名前のノードがあったとしても違うネームスペースに属させることで、違うノードとして判別したりするものです。
XSIからMayaへ移行した身としてはあまり詳しく知らないので、この程度の理解です。

ネームスペースを設定すると、それ以降、作成したオブジェクトの名前の前にネームスペース名が付きます。
同僚から頼まれたスクリプトでやってほしいことは以下になります。
①指定した名前のネームスペースを作成
②作成したネームスペースを現在のネームスペースとして設定
Mayaの既存機能でも十分に対応可能ですが、各所、ネックになる部分があります。
例えば、①の所で「指定した名前に間違いがあったら?」とか「どういう名前をつければいいの?」とかでしょうか。
あとは①と②の作業を一括で行うとかですね。
上記を踏まえた上で以下のスクリプトを作成しました。
ネームスペース名はいくつか決まったものですので、プルダウンメニューから選べるようにしています。

これでネームスペース名の間違いはある程度、回避することができます。
プルダウンメニューから名前を選んで実行ボタンを押すと、①と②の工程をやるように作成しています。
このスクリプトを「ネームスペースファクトリー」と命名。(ネーミングセンス...)
さて以下から内容になります。
スクリプトの階層構造は以下になります。
name_space_factory(フォルダ)
├ __init__.py
├ run.py(実行用ファイル)
│
├ module(フォルダ)
│ ├ __init__.py
│ ├ ini.py
│ └ NameSpaceList.ini
│
└ ui(フォルダ)
├ __init__.py
├ gui.ui
└ ui.py
まずは「module」フォルダ内から説明します。
「module」フォルダ内にはプルダウンメニューの内容を「iniファイル」から読み込む仕組みを実装しています。
今回のようなスクリプトに今後、編集作業が発生するとすれば、「プルダウンメニューの内容に新しい名前を追加したい」ということが想定されるからです。
追加したいということは削除したいという要望もあるはずです。
それもそんなに難しくないのですが、自分のように知識を有していない人でも簡単に編集できるようにするべきと考えました。
特に今回のような「項目に名前を追加したい」という簡単で且つ、目的が明確なやつについて、頼まないとできないなんてストレスになるに違いない。
設計段階で回避できるならしておきましょう。
今回は「iniファイル」から設定を読み込む処理があればよさそうです。
まずはテスト用のiniファイル「NameSpaceList.ini」を作成しましょう。
中身はこんな感じになります。
[name_list]
0=Good_Morning
1=Good_Afternoon
2=Good_Night
|
[name_list]がセクション名
「0, 1, 2」はキー名
「Good_Morning, Good_Afternoon, Good_Night」は値になります。
今回、必要な情報はプルダウンメニューに登録する「値」になりますので、「セクション名」に書かれている「全ての値」がリストで取得できれば、良さそうです。
それを処理する「ini.py」が以下になります。
# -*- coding: utf-8 -*-
from ConfigParser import SafeConfigParser
import os
class Ini():
def __init__(self, inifile):
self.file_name = inifile
def ini_Get(self, section, key):
os.chdir(os.path.dirname(os.path.abspath(__file__)))
ini = SafeConfigParser() ini.read(self.file_name) return ini.get(section, key)
def ini_Get_value_list(self, section):
os.chdir(os.path.dirname(os.path.abspath(__file__)))
ini = SafeConfigParser() ini.read(self.file_name) value_list = []
for key in ini.options(section):
value_list.append(self.ini_Get(section, key))
return value_list
|
クラス「Ini」を使って、インスタンス生成時に「iniファイルのフルパス」を引数として渡します。
それ以降は「ini_Get_value_list関数」を使用し、上記で指定した「iniファイル」から["Good_Morning", "Good_Afternoon", "Good_Night"]というリストを生成する処理になります。
外部ファイルからテキストを読み込む処理は使用する頻度は高いので、汎用的な処理にしておいて、今後、使えるようにしておくと便利です。
次に「gui.ui」ファイルについて、これはツールで作成したものですが、テキストをコピーして.uiとすることで使えます。
UIファイルのテキストはコチラ
UIで使用されているプルダウンメニューとボタンの名前は以下になります。

次にメインの処理を書いている「ui.py」について
# -*- coding: utf-8 -*-
import PySide.QtGui as QtGui
import PySide.QtCore as QtCore
import shiboken
from PySide.QtUiTools import QUiLoader from maya import OpenMayaUI as OpenMayaUI
import maya.cmds as cmds
import os
from ConfigParser import SafeConfigParser
# import module
import name_space_factory.module.ini as ini
reload(ini)
def getMayaWindow():
Ptr = OpenMayaUI.MQtUtil.mainWindow()
return shiboken.wrapInstance(long(Ptr), QtGui.QWidget)
class Ui_MainWidget(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, getMayaWindow())
loader = QUiLoader()
uifile = os.path.dirname(os.path.abspath(__file__)) + "/gui.ui"
self.ui = loader.load(uifile)
self.setCentralWidget(self.ui)
self.setGeometry(300, 300, 190, 80)
self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed))
self.setWindowTitle("NS Factory")
##プルダウンメニューの項目リスト生成
self.cbb_name_list_listup(self.ui.cbb_name_list)
##各種UIのイベント
self.ui.btn_apply.clicked.connect(self.btn_apply_clicked)
def cbb_name_list_listup(self, ui):
##プルダウンメニューに項目を設定する
ini_file = ini.Ini("NameSpaceList.ini")
key_list = ini_file.ini_Get_value_list("name_list")
ui.addItems(key_list)
def btn_apply_clicked(self):
namespace_name = self.ui.cbb_name_list.currentText()
##ネームスペースが既に存在しているかどうかの判定
if cmds.namespace(ex=":%s" %(namespace_name)) == False:
cmds.namespace(add=namespace_name, p=":")
cmds.namespace(set=":%s" %(namespace_name))
else:
cmds.namespace(set=":%s" %(namespace_name))
|
少し長いですが、ここでやっている作業は2つ。
①「iniファイル」から取得したリストを使用してプルダウンメニューに文字の反映をすること。
②「実行ボタン」を押したら、プルダウンメニューで指定したネームスペースが作成されること。
「getMayaWindow関数」と「Ui_MainWidgetクラス」はMayaでPySideのUIを設定するための処理になります。
「cbb_name_list_listup関数」でプルダウンメニューに文字を反映します。
引数として名前を追加するプルダウンメニューの情報を渡します。
「btn_apply_clicked関数」でボタンをクリックしたときの処理になります。
指定したネームスペースが存在しない場合はネームスペースを作成し、現在のネームスペースとして設定します。
既に存在する場合は、指定したネームスペースを現在のネームスペースとして設定するのみになります。
最後に実行用のファイルとして「run.py」を用意しました。
import name_space_factory.run
reload(name_space_factory.run)
name_space_factory.run.main()
|
駆け足になりましたが、説明は以上になります。
次回も懲りずに勉強結果を書いていこうと思います。
このシリーズ?はいつまで続くのやら...頑張ります。
最近のコメント