OBJデータを読み込んで出力するPythonスクリプトをオブジェクト指向をもとに作成してください。
(入力)
f 1/1/1 2/2/2 4/4/3
f 3/3/5 4/4/6 6/6/7 5/5/8
(実行方法)
# python スクリプト名.py
(出力)
一行目がフェースの頂点番号のリスト、
二行目がエッジのリストです。
[[0, 1, 3], [2, 3, 5, 4]]
[[0, 1], [1, 3], [3, 0], [2, 3], [3, 5], [5, 4], [4, 2]]
(解答例)
#!/usr/bin/env python
class OBJList(object):
def __init__(self):
self.data = []
def printPolygon(self):
print self.data
def append(self, d):
self.data.append(d)
class FaceList(OBJList):
def append(self, f):
self.data.append(f[:])
class EdgeList(OBJList):
def append(self, e):
self.data.extend(e[:])
class PolygonData(object):
def __init__(self):
self.data = {
'face':FaceList(),
'edge':EdgeList()
}
def printPolygon(self):
for d in self.data.values():
d.printPolygon()
def appendFace(self, f):
self.data['face'].append(f)
def appendEdge(self, e):
self.data['edge'].append(e)
class OBJConvert(object):
def __init__(self, obj):
self.poly = PolygonData()
self.func = {
'v':self.vertexConvert,
'vn':self.normalConvert,
'vt':self.uvConvert,
'f':self.faceEdgeConvert,
None:self._doNothing
}
for d in obj:
self._convert(d)
def _convert(self, d):
t = d.getType()
self.func.get(t, self._doNothing)(self.poly, d)
def convert(self):
return self.poly
def _doNothing(self, poly, d):
pass
def vertexConvert(self, poly, d):
pass
def normalConvert(self, poly, d):
pass
def uvConvert(self, poly, d):
pass
def faceEdgeConvert(self, poly, d):
pass
class FaceConvert(OBJConvert):
def faceEdgeConvert(self, poly, d):
val = d.getValue()
f = [int(v.split('/')[0]) - 1 for v in val]
poly.appendFace(f)
f.append(f[0])
poly.appendEdge(zip(f[:-1], f[1:]))
class OBJElement(object):
def __init__(self, d):
self.type = None
self.value = None
val = d.split()
if not val:
return None
self.type = val[0]
self.value = val[1:]
def getType(self):
return self.type
def getValue(self):
return self.value
class OBJInput(object):
def __init__(self, fn='data1'):
self.data = []
self._readdata(fn)
self.__i = len(self.data)
def _readdata(self, fn):
fp = open(fn, 'r')
for d in fp.readlines():
self._append(d)
fp.close()
def _append(self, d):
obj = OBJElement(d)
if not obj:
return
self.data.append(obj)
def __iter__(self):
return self
def next(self):
if self.__i == 0:
raise StopIteration
self.__i -= 1
return self.data[self.__i]
class OBJFile(object):
def __init__(self):
data = OBJInput()
fc = FaceConvert(data)
self.poly = fc.convert()
def getFace(self):
self.poly.printPolygon()
def main():
obj = OBJFile()
obj.getFace()
if __name__ == '__main__':
main()