Mayaのシーンは、DGとDAGによって作られています。
そのうちのDGと同じ原理の仕組みを作ってみましょう。
DGでは、あるノードのアトリビュート値が変更されると、
そのアトリビュートにコネクトされたアトリビュートの値が、
自動的に同じ値に変更される必要があります。
この仕組みを作るためには、デザインパターンの一種であるオブザーバ(Observer)パターンを応用します。
あるオブジェクトの状態が変化したときに、他のオブジェクトにそれを知らせる仕組みです。
オブザーバ・パターンでは、そのために状態が変化したことを知らせる専用のメソッドを定義します。
以下の例では、nmaya1.pyの_notify_observersメソッドなどがコネクトしたノードに状態が変化したことを知らせるメソッドになっています。
以下のスクリプトは、オブザーバ・パターンの原理を利用して、
MayaのDGと似た動作をシミュレートしたものです。
なるべく、スクリプトをシンプルにするために、ノードのアトリビュートは一つだけとします。
また、アトリビュートにコネクトできるアトリビュートも一つだけです。
このスクリプトを実行するとプロンプトが表示されるので、
ノードを作成し、メソッドを実行してゆきます。
作成できるノードの種類は以下の1種類だけです。
ノードで使用できるメソッドの種類は以下の通りです。
その他、以下のメソッドを使用します。
import sys
class Node(object):
def __init__(self, attr=0):
self.attr = attr
self.observer = None
def _update(self, node):
self.setAttr(node.getAttr())
def _notify_observers(self):
if self.observer:
self.observer._update(self)
def connectAttr(self, node):
self.observer = node
self._notify_observers()
def getAttr(self):
return self.attr
def setAttr(self, val):
self.attr = val
self._notify_observers()
def quit():
sys.exit(0)
while(1):
s = raw_input('command: ')
exec(s)
import sys
class Node(object):
def __init__(self, attr=0):
self.attr = attr
self.observer = None
def _update(self, node):
self.setAttr(node.getAttr())
def _notify_observers(self):
if self.observer:
self.observer._update(self)
def connectAttr(self, node):
self.observer = node
self._notify_observers()
def getAttr(self):
return self.attr
def setAttr(self, val):
self.attr = val
self._notify_observers()
def quit():
sys.exit(0)
while(1):
s = raw_input('command: ')
exec(s)