from OpenGL.GL import glGenLists, glNewList, GL_COMPILE, glEndList, glCallList, \
glBegin, glEnd, GL_LINES, glVertex3f, glColor3f, \
glEnable, glDisable, GL_LIGHTING, GL_TRIANGLES
from points import Point, centerMinMax
from ViewerItem import ViewerItem
from os.path import basename
from itertools import izip
from io import line_blocks
class Triangles(ViewerItem):
def __init__(self, filename, parent = None):
filename = filename.split(':')
self.mult = float(filename[1]) if len(filename) > 1 else 1.
filename = filename[0]
super(Triangles, self).__init__(basename(filename), parent, color = (200,200,200))
self.read_triangles(filename)
self.create_display_lists()
self.center, self.min, self.max = centerMinMax(self.vertices())
self.wireframe = False
def createMenu(self):
menu = super(Triangles, self).createMenu()
wireframeAction = menu.addAction("Wireframe")
wireframeAction.setCheckable(True)
wireframeAction.setChecked(self.wireframe)
wireframeAction.command = lambda: self.wireframeCommand()
return menu
def wireframeCommand(self):
self.wireframe = not self.wireframe
def create_display_lists(self):
self.triangles_display_list = glGenLists(1)
glNewList(self.triangles_display_list, GL_COMPILE)
self.draw_triangles()
glEndList()
self.wireframe_display_list = glGenLists(1)
glNewList(self.wireframe_display_list, GL_COMPILE)
self.draw_wireframe()
glEndList()
def draw_triangles(self):
glBegin(GL_TRIANGLES)
for (u,v,w) in self.triangles:
# front
glVertex3f(u.x, u.y, u.z)
glVertex3f(v.x, v.y, v.z)
glVertex3f(w.x, w.y, w.z)
# back
glVertex3f(u.x, u.y, u.z)
glVertex3f(w.x, w.y, w.z)
glVertex3f(v.x, v.y, v.z)
glEnd()
def draw_wireframe(self):
glBegin(GL_LINES)
for (u,v,w) in self.triangles:
glVertex3f(u.x, u.y, u.z)
glVertex3f(v.x, v.y, v.z)
glVertex3f(v.x, v.y, v.z)
glVertex3f(w.x, w.y, w.z)
glVertex3f(w.x, w.y, w.z)
glVertex3f(u.x, u.y, u.z)
glEnd()
def draw(self):
if not self.visible: return
r,g,b,a = self.color.getRgb()
glColor3f(r,g,b)
if self.wireframe:
glCallList(self.wireframe_display_list)
else:
glCallList(self.triangles_display_list)
def vertices(self):
for (u,v,w) in self.triangles:
yield u
yield v
yield w
def __iter__(self):
return self.triangles
def read_triangles(self, filename):
self.triangles = []
for block in line_blocks(filename, 7):
u = Point(map(float, block[2].split()[1:4]))*self.mult
v = Point(map(float, block[3].split()[1:4]))*self.mult
w = Point(map(float, block[4].split()[1:4]))*self.mult
self.triangles.append((u,v,w))