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という形になってしまう。

 

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

PyModo modoのPythonラッパー

こちらのページです。

Mayaでクラスオブジェクトの作成を勉強しております。
Pymelがない環境でもメソッドで色々と出来るように、とMayaコマンドを使ってラップを作ってみているのですが、
せっかくならばAPIで作りたいなぁ、などと思いながらLuxologyのフォーラムを久しぶりに見ると、
modoのPythonラッパーがありました。

 

これは便利だ。
ただ、基本的に情報を取得するだけで、セットすることができない。
改造してプロパティなり、__setattr__などのメソッドを追加する必要がありそうだ。
その場合色々とエラー処理を組み込まなくてはならない。
ちょっと大変そうだけど、面白そうなので、しばらく遊んでみよう。

Maya Script Pymel バインドされたメッシュを選択

import pymel.core as pm
pm.select([x.getParent() for x in pm.ls(s=1)if x.listHistory(type="skinCluster")])

シーン内にある、バインドされたメッシュだけを選択したい。
そんな時はないでしょうか?
いちいち覚えていられないし、色を変えるのも面倒くさい。
そうなると、メッシュを選択して、入力を確認する。というとても面倒くさいことになる。
で、Pymelで作りました。
一行でできてしまった。素晴らしい。

 

シーン内のシェイプノードのリストを取得し、ヒストリーを見てスキンクラスターが存在するものだけを選別、
選別されたシェイプの親のノード、要するにトランスフォームノードを取得。
それをセレクトコマンドに放り込む。

 

Pythonのリスト内包表現は楽しい。パズルみたいだ。
どうもPythonでMayaAPIを使うにしても、Pythonらしい書き方はできないようだ。
恐らくCに最適化されているためだろう。ポインタや参照があることが前提になっているように思う。
ますますMayaAPIから遠ざかってしまいそうだ。
Pythonの弊害は他の言語で書くのが億劫になってしまうことのように思えてくる。

雑記100

ついに雑記も100回目になってしまった。

 

ZBrush、買いそびれております。
そろそろお金に少し余裕ができたので、買おうかなぁ、などと思っていたら、円安です。
一万円近く値段が違う。
欲しい時が買い時、とは良く言いますが、さすがに躊躇してしまう。
年末にセールでもやってくれないものだろうか。

 

円安といえば、その原因は私の発言によるものだ。とおっしゃる方がおりました。
それが本当ならば、検証のため、逆のことを言って円高にしてください。
と、お願いしたいところです。

 

どうも物事に因果関係を求めるのは人間だけの性質というわけではなく、
他の動物一般に見受けられるようです。
そもそも全てが化合物である限り、化学反応によって別の化学反応が誘発される。
ということを考えると、当然のようにも思えます。

 

動物の感じる因果関係、とうのは、ある実験によって観測されたようです。
鳩は賢い動物であることが知られていますが、鳩が入った檻に、ある仕掛けを作ります。
檻の中にはボタンがあり、そのボタンを押すと餌が出る。
時間の経過とともに鳩は因果関係を学び、餌がほしい時にボタンを押すようになる。
猿の脳みそに電極を刺し、快楽物質を出すニューロンを刺激させると、疲労して死ぬまでボタンを押し続けるのも
同じ事だと思います。

 

で、肝心の実験では、檻にスイッチはなく、自動制御で餌が与えられる、というものでした。
その自動制御というのも、何かのセンサーが付いているわけではなく、ランダムに与えられる。というものです。
すると、その檻に折れられた鳩は自然界では余り見られない行動を頻繁にするようになるそうです。
それを観測した人間からすると、鳩が自分の行動と、餌の出現に因果関係を結び、その行動を繰り返すことで
餌が出る。ということを期待しているかのように見えるそうです。
かつて人間が雨乞いをしたり、生贄を捧げたりすることと同じなのではないか、と考える人もいます。
鳩がそう感じているのか、それを見ている人間が鳩がそう感じていると、考えているのか、良く分かりません。

 

あーあ、どうしようかなぁ。
円高乞いでもしてみたほうが良いのかな?

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

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

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