Python CAD Tutorial 07 - Drawing a grid

View/Download Code


Figure 1: 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 gridspacing 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):

	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)

	    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)