Maya Script Python オブジェクト指向?

# -*- coding: utf-8 -*-
import maya.cmds as cmds

class Test(object):
	#まずはクラスを作ります。
	#名前はTest()です。objectというのは新クラスにするために必要なようです。
	def __init__(self, name):
		#初期化です。例えば、x = Test()のように新たにインスタンスを作成した時に必ずここを通ります。
		#で、今回のスクリプトでは__init__(self, name)となっているので、引数を一つ受け取ります。
		#なので、使うときは、x = Text("a")のようにして使います。"a"のところに選択されているノードの名前をlsコマンドで
		#取得して入れることにします。
		self._name = name
		#クラスオブジェクト内部の変数として、引数から取ってきた名前を入れます。
		#self._nameとnameの前にアンダーバーをつけたのは、dir()関数でインスタンスに設定されているメソッドを確認するとき
		#変数とメソッドが同じように表示されてしまうため、区別するために付けてみました。
		self._shape = cmds.listRelatives(self._name, s=1, pa=1)
		#ついでにシェイプノードがあればそれも取得しておきます。
		if self._shape:
			self._shape = Test(self._shape[0])
			#シェイプノードが存在していれば、それを同じくインスタンス化します。
		else:
			self._shape = None
			#シェイプノードが存在していなければ、自身の_shape変数には None を入れておきます。
		self._nodeType = cmds.nodeType(name)
		#ついでにノードのタイプも取得しておきます。
		self._path = cmds.listRelatives(name, f=1, p=1)
		#パスも取得します。
		self._fullpath = None
		self._rootNode = name
		#このふたつは後のメソッドで使われるので、一応初期化もしておきます。
	def __repr__(self):
		return "nt.{0:}(u'{1:}')".format(self._nodeType[0].upper() + self._nodeType[1:], self._name)
		#インスタンスを print した時に表示される文字列を決めます。Pymelの真似をした表示になります。
	def __str__(self):
		return str(self._name)
		#for文に入れた時にはこっちが表示されるようにします。
	def getShape(self):
		return self._shape
		#メソッドが実行され、シェイプノードが存在しれいれば、その名前を返します。なければ None が帰ってきます。
	def fullPath(self):
		if self._path:
			self._fullpath = self._path[0] + "|" + self._name
		else:
			self._fullpath = "|" + self._name
		return self._fullpath
		#フルパスを返します。そのノードが一番の親であれば、Pymelと同じような感じで返します。
	def root(self):
		if self._path:
			self._rootNode = self._path[0].split("|")[1]
		return self._rootNode
		#パスを元にルートのノードを返します。
	def type(self):
		return self._nodeType
		#ノードタイプを返します。
	def rename(self, newName):
		try:
			cmds.rename(self._name, newName)
			self._name = newName
		except:
			print "#[{0:}] has not rename method#".format(self._name)
		#インスタンスに入っているものが、リネームできるものであればリネームします。
		#リネームすると自身の名前もリネームされます。

sel = cmds.ls(sl=1)
#選択しているオブジェクトを sel 変数に入れます。
if sel:
	#選択が存在すればスクリプトを実行します。
	get = [Test(x) for x in sel]
	#選択をクラスオブジェクトに入れて、まとめて get 変数に入れます。
	print get
	#とりあえずプリントです。Pymelと同じように表示されるかと思います。
	for x in get:
		print x
		print x.fullPath()
		print x.getShape()
		print x.root()
		print x.type()
		print cmds.ls(x)

クラスオブジェクトを作ってみました。人のコードを見たり、サイトを検索して学んでいるので、これが本式かは知りません。
珍しくコメントを書きました。自分がよく理解していないので、間違えているかもしれませんので、ご注意ください。
どうせならMayaコマンドではなくAPIで作りたいところですが、全く分からないのでまだ作れません。

 

renameメソッドを付けたので、リネームが可能です。
Mayaコマンドと違い、自身の名前も変えるので、少し便利そうです。
で、実はアトリビュートの取得で困っております。
Pymelを参考にしているのですが、Pymelだとアトリビュートの取得はx.tx.get()でxのトランスレーションxの値が帰ってきます。
__getattr__を使えば似たようなことはできるのは分かったのですが、そうするとメソッドなしには自身を呼ぶことができなくなる。
x._nameという形になってしまう。

 

どうやらクラスオブジェクトというものは関数が動的なものであるのに対して静的なもの、という感覚でいいように思う。
例えて言うならば、一般的なテレビの枠組みを作る。という感じだろうか?
機能として関数をメソッドとして追加する。
音量調節の機能をなくしてもテレビは動くのと同じで、クラスも存在し得る。
狩猟で例えると、関数だけで行うプログラムは自ら弓矢を持って狩りに出かけるようなもので、
オブジェクトを作るということは、罠を作ってそこに獲物を入れる。そんな感じがする。
どちらも面白い。

コメントする

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トラックバックする

トラックバック用URL:

アニメーションが親切に解説されております

レンダリング、ライティングの基本が分かります

図版が見やすい美術解剖書です