hershey.py?<html><img style="float:right" src="http://wiki.linuxcnc.org/uploads/hershey_font.png"></html> It took me a while to find out why hershey.py has the hershey name. The answer may be here: http://en.wikipedia.org/wiki/Hershey_font and http://www.ghostscript.com/doc/current/Hershey.htm . hershey.py has on-board the font data for digits 0-9, -, ., and upper-case letters G, X, Y, Z, U, V, W for labeling axes and the reference frame (for example G54).</td> |
Gremlin is a backplot application that may be used with user interfaces.
For now, this will be a place for notes on particular issues with Gremlin. Hopefully, it will become a comprehensive reference that may be used to create a formal entry into the manual.
Figure 1 |
Figure 2 |
... def redraw(self): s = self.stat s.poll() machine_limit_min, machine_limit_max = self.soft_limits() ... if self.get_show_limits(): print '*** Tool Offsets =', self.stat.tool_offset glLineWidth(1) glColor3f(1.0,0.0,0.0) glLineStipple(1, 0x1111) glEnable(GL_LINE_STIPPLE) glBegin(GL_LINES) if self.is_rear_tool_post_lathe(): x_dir = -1 else: x_dir = 1 # Draw 3d box at soft limits for X, Y, and Z axes glVertex3f(x_dir * (machine_limit_min[0] - self.stat.tool_offset[0]), machine_limit_min[1] - self.stat.tool_offset[1], machine_limit_max[2] - self.stat.tool_offset[2]) glVertex3f(x_dir * (machine_limit_min[0] - self.stat.tool_offset[0]), machine_limit_min[1] - self.stat.tool_offset[1], machine_limit_min[2] - self.stat.tool_offset[2]) glVertex3f(x_dir * (machine_limit_min[0] - self.stat.tool_offset[0]), machine_limit_min[1] - self.stat.tool_offset[1], machine_limit_min[2] - self.stat.tool_offset[2]) glVertex3f(x_dir * (machine_limit_min[0] - self.stat.tool_offset[0]), machine_limit_max[1] - self.stat.tool_offset[1], machine_limit_min[2] - self.stat.tool_offset[2]) ... |
... class Gremlin(gtk.gtkgl.widget.DrawingArea, glnav.GlNavBase, rs274.glcanon.GlCanonDraw): ... temp = inifile.find("DISPLAY", "LATHE") self.lathe_option = bool(temp == "1" or temp == "True" or temp == "true" ) temp2 = inifile.find("DISPLAY", "GEOMETRY") self.is_rear_tp_lathe = bool(temp2 == "-XZ") ... def is_lathe(self): return self.lathe_option def is_rear_tool_post_lathe(self): return self.is_rear_tp_lathe |
... class GLCanon(Translated, ArcsToSegmentsMixin): ... def draw_axes(self, n, letters="XYZ"): ... if self.is_lathe(): ... def calc_extents(self): self.min_extents, self.max_extents, self.min_extents_notool, self.max_extents_notool = gcode.calc_extents(self.arcfeed, self.feed, self.traverse) if self.is_rear_tp_lathe: # the min/max come in from gcode_calc extents as the negative of the actual value # if we're displaying a plot for a rear TP lathe self.min_extents[0] *= (-1) self.max_extents[0] *= (-1) ... def draw_axes(self, n, letters="XYZ"): glNewList(n, GL_COMPILE) x,y,z,p = 0,1,2,3 s = self.stat view = self.get_view() glColor3f(*self.colors['axis_x']) glBegin(GL_LINES) if self.is_rear_tool_post_lathe(): glVertex3f(-1.0,0.0,0.0) else: glVertex3f(1.0,0.0,0.0) glVertex3f(0.0,0.0,0.0) glEnd() if view != x: glPushMatrix() if self.is_lathe(): if self.is_rear_tool_post_lathe(): glTranslatef(-1.3, 0, 0) glRotatef(-90, 0, 0, 1) glRotatef(90, 0, 1, 0) else: glTranslatef(1.3, -0.1, 0) glTranslatef(0, 0, -0.1) glRotatef(-90, 0, 1, 0) glRotatef(90, 1, 0, 0) glTranslatef(0.1, 0, 0) ... |
... glColor3f(*self.colors['axis_x']) glBegin(GL_LINES) if self.is_rear_tool_post_lathe(): glVertex3f(-1.0,0.0,0.0) # Draws line up else: glVertex3f(1.0,0.0,0.0) # Draws line down glVertex3f(0.0,0.0,0.0) glEnd() if view != x: glPushMatrix() if self.is_lathe(): if self.is_rear_tool_post_lathe(): glTranslatef(-1.3, 0, 0) # Draws an X above the line glRotatef(-90, 0, 0, 1) glRotatef(90, 0, 1, 0) # Rotates it to face the viewer else: glTranslatef(1.3, -0.1, 0) glTranslatef(0, 0, -0.1) glRotatef(-90, 0, 1, 0) glRotatef(90, 1, 0, 0) glTranslatef(0.1, 0, 0) ... |
... if orientation == 9: glBegin(GL_TRIANGLE_FAN) for i in range(37): # 10 degree increments in 360 t = i * math.pi / 18 # angle in Radians glVertex3f(radius * math.cos(t), 0.0, radius * math.sin(t)) glEnd() ... |
... def lathetool(self, current_tool): if self.is_rear_tool_post_lathe: lathe_shapes = [ None, # 0 (-1,-1), (-1,1), (1,1), (1,-1), # 1..4 (0,-1), (-1,0), (0,1), (1,0), # 5..8 (0,0) # 9 ] else: lathe_shapes = [ None, # 0 (1,-1), (1,1), (-1,1), (-1,-1), # 1..4 (0,-1), (1,0), (0,1), (-1,0), # 5..8 (0,0) # 9 ] ... if orientation == 9: glBegin(GL_TRIANGLE_FAN) for i in range(37): # 10 degree increments in 360 t = i * math.pi / 18 # angle in Radians glVertex3f(radius * math.cos(t), 0.0, radius * math.sin(t)) glEnd() else: # dx, dy = self.lathe_shapes[orientation] dx, dy = lathe_shapes[orientation] min_angle = min(backangle, frontangle) * math.pi / 180 max_angle = max(backangle, frontangle) * math.pi / 180 ... |
... def redraw(self): s = self.stat s.poll() machine_limit_min, machine_limit_max = self.soft_limits() ... if self.get_show_limits(): glLineWidth(1) glColor3f(1.0,0.0,0.0) glLineStipple(1, 0x1111) glEnable(GL_LINE_STIPPLE) glBegin(GL_LINES) if self.is_rear_tool_post_lathe(): x_dir = -1 else: x_dir = 1 # Draw 3d box at soft limits for X, Y, and Z axes glVertex3f(x_dir * machine_limit_min[0], machine_limit_min[1], machine_limit_max[2]) glVertex3f(x_dir * machine_limit_min[0], machine_limit_min[1], machine_limit_min[2]) glVertex3f(x_dir * machine_limit_min[0], machine_limit_min[1], machine_limit_min[2]) glVertex3f(x_dir * machine_limit_min[0], machine_limit_max[1], machine_limit_min[2]) ... |
... def draw_grid_lines(self, space, (ox, oy), (dx, dy), lim_min, lim_max, inverse_permutation): # draw a series of line segments of the form # dx(x-ox) + dy(y-oy) + k*space = 0 # for integers k that intersect the AABB [lim_min, lim_max] lim_pts = [ (lim_min[0], lim_min[1]), ... if self.is_rear_tool_post_lathe(): x_dir = -1 else: x_dir = 1 glVertex3f(*inverse_permutation((x0, x_dir * y0, lim_min[2]))) glVertex3f(*inverse_permutation((x1, x_dir * y1, lim_min[2]))) ... |
... class GlCanonDraw: colors = { 'traverse': (0.30, 0.50, 0.50), ... def redraw(self): s = self.stat s.poll() ... if self.get_show_live_plot() or self.get_show_program(): alist = self.dlist(('axes', self.get_view()), gen=self.draw_axes) glPushMatrix() if self.get_show_relative() and (s.g5x_offset[0] or s.g5x_offset[1] or s.g5x_offset[2] or s.g92_offset[0] or s.g92_offset[1] or s.g92_offset[2] or s.rotation_xy): olist = self.dlist('draw_small_origin', gen=self.draw_small_origin) glCallList(olist) g5x_offset = self.to_internal_units(s.g5x_offset)[:3] if self.is_rear_tool_post_lathe(): g5x_offset[0] *= -1 g92_offset = self.to_internal_units(s.g92_offset)[:3] ... |
Other features may need work, such as G92?
Created 2013/01/23, Kirk Wallace