static-sites/bases/do-blog/resources/documents/python/cad/07-cad-drawing-a-grid.org

3.0 KiB
Executable File

Python CAD Tutorial 07 - Drawing a grid

.. title: Python CAD Tutorial 07 - Drawing a grid .. slug: 07-cad-drawing-a-grid.org .. date: 2013-10-07 12:00:00 UTC .. tags: GTK-3, python, cad, opengl .. category: python .. description: Drawing a grid in 3d space using gl lines .. type: text

View/Download Code

/oly/static-sites/src/commit/7dcc8387d3aa65399657cf6b33c06aa634dbd8ed/bases/do-blog/resources/images/cad/tut07-interface.png
Grid

We created a plane in the previous tutorial. Now we will inherit that class to create a grid, at a later stage we will add snap to grid functionality.The new grid class will take three parameters: a centre point, a spacing value and a size value. We will set the size value to be the size of the viewport and will set a default spacing between the lines.The new methods for the class are below:

  • The grid_spacing method shifts the lines by the amount specified in the spacing parameter until the maximum size has been reached.
  • The draw method draws lines to make up the grid. On every tenth line it changes the colour to a darker line.

Future tutorials will deal with snap to grid functionality and auto calculating based on the zoom level, but for now we have something to work with.

import math

from point import createpoint
from plane import createplanesimple


class creategrid:
    display_color = (0.6, 0.6, 0.6)
    
    large_grid = 10
    small_grid = 2.5

    def __init__(self, p1, spacing=1.5, size=65):
        self.plane = createplanesimple(p1, size * 2)
        self.p1 = createpoint(p1)
        self.normal = createpoint((0, 1, 0))
        self.size = size
        self.small_grid = spacing
        self.large_grid = spacing * 10

    def grid_spacing(self):
        #work out how many times the grid units fit inside our grid size and make it a whole number
        size =  math.ceil(self.size / self.small_grid) * self.small_grid
        #adjust x by size so we can draw the lines
        x = self.p1.x - size
        #loop from start until our lines are greater than our max size
        while x < (self.p1.x + size):
            x += self.small_grid
            yield x

    def draw(self):
        self.plane.draw()
        glColor3f(*self.display_color)
        glBegin(GL_LINES)

        for item in self.grid_spacing():
            #coordinate modulus large_grid (returns 0 if there is no remaineder), so lets draw a different colour line
            if (item % self.large_grid) == 0:
                glColor3f(0.4, 0.4, 0.4)
            else:
                glColor3f(*self.display_color)

            glVertex3f(item, self.p1.y - self.size, self.p1.z)
            glVertex3f(item, self.p1.y + self.size, self.p1.z)

            glVertex3f(self.p1.x - self.size, item, self.p1.z)
            glVertex3f(self.p1.x + self.size, item, self.p1.z)
        glEnd()