nmaya1.pyを応用して、シンプルなモデリングができるシステムに改良してみます。
作成できるノードの種類は以下の通りです。
これらのノードは、Nodebaseクラスを継承して作成してあります。
ノード、その他で使用できるメソッドの種類は以下の通りです。
import sys
class ObjectSet(object):
def __init__(self, sobjs=None):
self.objs = []
self.saveobjs = sobjs
def setObj(self, obj):
self.objs.append(obj)
def save(self):
if not self.saveobjs:
return
self.saveobjs(self.objs)
class Point(object):
def __init__(self, x=0, y=0):
self.x = x
self.y = y
class TriPoly(object):
def __init__(self, p1, p2, p3):
self.p = [[p1, p2, p3]]
class Nodebase(object):
def __init__(self, attr=None):
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()
class MakeTriPoly(Nodebase):
def __init__(self):
tp = TriPoly(Point(0, 0), Point(0, 1), Point(1, 0))
super(MakeTriPoly, self).__init__(tp)
class MoveTriPoly(Nodebase):
def __init__(self, n, x, y):
self.num = n
self.x = x
self.y = y
super(MoveTriPoly, self).__init__()
def _update(self, node):
tp = node.getAttr()
f = tp.p[0]
f[self.num].x += self.x
f[self.num].y += self.y
self.setAttr(tp)
class Shape(Nodebase):
objset = None
def __init__(self):
if self.objset:
self.objset.setObj(self)
super(Shape, self).__init__()
def saveAllObjs(objs):
n = 0
for o in objs:
print 'g tri' + str(n)
fs = o.getAttr()
for p in fs.p:
print 'vn 0 1 0'
print 'v ',p[0].x, ' 0 ',p[0].y
print 'v ',p[1].x, ' 0 ',p[1].y
print 'v ',p[2].x, ' 0 ',p[2].y
print 'f ' + str(3*n+1) + '//' + str(n+1) + ' ' + str(3*n+2) + '//' + str(n+1) + ' ' + str(3*n+3) + '//' + str(n+1)
n += 1
Shape.objset = ObjectSet(saveAllObjs)
def save():
Shape.objset.save()
def quit():
sys.exit(0)
execfile(sys.argv[1])
m1 = MakeTriPoly()
s1 = Shape()
m1.connectAttr(s1)
save()
quit()
m1 = MakeTriPoly()
s1 = Shape()
m1.connectAttr(s1)
m2 = MakeTriPoly()
mv1 = MoveTriPoly(0, 0, 1)
m2.connectAttr(mv1)
mv2 = MoveTriPoly(1, 1, 0)
mv1.connectAttr(mv2)
s2 = Shape()
mv2.connectAttr(s2)
save()
quit()
for x in range(0, 10):
for y in range(0, 10):
m1 = MakeTriPoly()
mv1 = MoveTriPoly(0, x, y)
m1.connectAttr(mv1)
mv2 = MoveTriPoly(1, x, y)
mv1.connectAttr(mv2)
mv3 = MoveTriPoly(2, x, y)
mv2.connectAttr(mv3)
s1 = Shape()
mv3.connectAttr(s1)
m2 = MakeTriPoly()
mv4 = MoveTriPoly(0, x, y + 1)
m2.connectAttr(mv4)
mv5 = MoveTriPoly(1, x + 1, y)
mv4.connectAttr(mv5)
mv6 = MoveTriPoly(2, x, y)
mv5.connectAttr(mv6)
s2 = Shape()
mv6.connectAttr(s2)
save()
quit()