triangles.py
author Dmitriy Morozov <dmitriy@mrzv.org>
Thu, 17 Mar 2011 22:18:46 -0700
changeset 8 2eaa2bffa6f4
parent 7 cbb51ef4dd6d
child 14 9e82d4394fc3
permissions -rw-r--r--
Read filenames as plain arguments

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):
        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]))
            v = Point(map(float, block[3].split()[1:4]))
            w = Point(map(float, block[4].split()[1:4]))
            self.triangles.append((u,v,w))