add PointRef class, convert snap points to PointRef instances

This commit is contained in:
Josh Holtrop 2011-07-28 18:01:16 -04:00
parent de69e966cb
commit aebf7df80f
2 changed files with 46 additions and 36 deletions

8
PointRef.py Normal file
View File

@ -0,0 +1,8 @@
class PointRef(object):
def __init__(self, shape, ptNum):
self.shape = shape
self.ptNum = ptNum
def getPt(self):
return self.shape.getPt(self.ptNum)

View File

@ -5,6 +5,7 @@ import gtk.gtkgl
from OpenGL.GL import * from OpenGL.GL import *
from PointRef import PointRef
from shapes import * from shapes import *
from constraints import * from constraints import *
@ -19,12 +20,12 @@ class SketchWidget:
self.drawingShape = None self.drawingShape = None
self.drawingConstraints = {} self.drawingConstraints = {}
self.mode = '' self.mode = ''
self.snap_points = {} # keyed by (shape, ptNum) self.snap_ptrefs = {} # keyed on PointRef
self.cursors = { self.cursors = {
'arrow': gtk.gdk.Cursor(gtk.gdk.ARROW), 'arrow': gtk.gdk.Cursor(gtk.gdk.ARROW),
'crosshair': gtk.gdk.Cursor(gtk.gdk.CROSSHAIR), 'crosshair': gtk.gdk.Cursor(gtk.gdk.CROSSHAIR),
} }
self.hover_snap_point = None self.hover_snap_ptref = None
# Configuration parameters # Configuration parameters
self.line_width = 1.5 self.line_width = 1.5
@ -108,7 +109,7 @@ class SketchWidget:
gldrawable.gl_end() gldrawable.gl_end()
self.update_snap_points() self.update_snap_ptrefs()
return True return True
@ -134,9 +135,9 @@ class SketchWidget:
for c in self.drawingConstraints: for c in self.drawingConstraints:
self.drawConstraint(self.drawingConstraints[c]) self.drawConstraint(self.drawingConstraints[c])
if self.hover_snap_point is not None: if self.hover_snap_ptref is not None:
glColor(*self.hover_color) glColor(*self.hover_color)
s, p = self.hover_snap_point s, p = self.hover_snap_ptref.shape, self.hover_snap_ptref.ptNum
self.drawConnect(Connect(s, p, s, p)) self.drawConnect(Connect(s, p, s, p))
if gldrawable.is_double_buffered(): if gldrawable.is_double_buffered():
@ -250,7 +251,7 @@ class SketchWidget:
def button_release_event(self, widget, event, data = None): def button_release_event(self, widget, event, data = None):
if event.button == 2: if event.button == 2:
self.panning = False self.panning = False
self.update_snap_points() self.update_snap_ptrefs()
def motion_event(self, widget, event, data = None): def motion_event(self, widget, event, data = None):
if self.panning: if self.panning:
@ -275,7 +276,7 @@ class SketchWidget:
self.view_center = (zoom_pt[0] - off_x / self.zoom_factor, self.view_center = (zoom_pt[0] - off_x / self.zoom_factor,
zoom_pt[1] - off_y / self.zoom_factor) zoom_pt[1] - off_y / self.zoom_factor)
self.view_width /= self.zoom_factor self.view_width /= self.zoom_factor
self.update_snap_points() self.update_snap_ptrefs()
self.queue_redraw() self.queue_redraw()
elif event.direction == gtk.gdk.SCROLL_DOWN: elif event.direction == gtk.gdk.SCROLL_DOWN:
zoom_pt = self.screenPtToPt((event.x, zoom_pt = self.screenPtToPt((event.x,
@ -285,7 +286,7 @@ class SketchWidget:
self.view_center = (zoom_pt[0] - off_x * self.zoom_factor, self.view_center = (zoom_pt[0] - off_x * self.zoom_factor,
zoom_pt[1] - off_y * self.zoom_factor) zoom_pt[1] - off_y * self.zoom_factor)
self.view_width *= self.zoom_factor self.view_width *= self.zoom_factor
self.update_snap_points() self.update_snap_ptrefs()
self.queue_redraw() self.queue_redraw()
def queue_redraw(self): def queue_redraw(self):
@ -379,27 +380,29 @@ class SketchWidget:
click_pt = self.screenPtToPt((x, self.size[1] - y)) click_pt = self.screenPtToPt((x, self.size[1] - y))
start = click_pt start = click_pt
start_pt_ref = None start_pt_ref = None
if self.hover_snap_point is not None: if self.hover_snap_ptref is not None:
start = self.hover_snap_point[0].getPt(self.hover_snap_point[1]) start = self.hover_snap_ptref.getPt()
start_pt_ref = self.hover_snap_point start_pt_ref = self.hover_snap_ptref
if self.drawingShape is not None: if self.drawingShape is not None:
# end a currently drawing line # end a currently drawing line
start = self.drawingShape.getPt(1) # start at last snap point start = self.drawingShape.getPt(1) # start at last snap point
prev_line = self.drawingShape prev_line = self.drawingShape
if self.hover_snap_point is not None: if self.hover_snap_ptref is not None:
c = Connect(self.hover_snap_point[0], self.hover_snap_point[1], c = Connect(self.hover_snap_ptref.shape,
self.hover_snap_ptref.ptNum,
self.drawingShape, 1) self.drawingShape, 1)
self.drawingConstraints['c2'] = c self.drawingConstraints['c2'] = c
pt = self.hover_snap_point[0].getPt(self.hover_snap_point[1]) pt = self.hover_snap_ptref.getPt()
self.drawingShape.setPt(1, pt) self.drawingShape.setPt(1, pt)
self.merge_in_drawing_shape() self.merge_in_drawing_shape()
start = prev_line.getPt(1) start = prev_line.getPt(1)
start_pt_ref = (prev_line, 1) start_pt_ref = PointRef(prev_line, 1)
# begin a new line # begin a new line
self.drawingShape = Line( self.drawingShape = Line(
start[0], start[1], click_pt[0], click_pt[1]) start[0], start[1], click_pt[0], click_pt[1])
if start_pt_ref is not None: if start_pt_ref is not None:
c = Connect(start_pt_ref[0], start_pt_ref[1], self.drawingShape, 0) c = Connect(start_pt_ref.shape, start_pt_ref.ptNum,
self.drawingShape, 0)
self.drawingConstraints['c1'] = c self.drawingConstraints['c1'] = c
self.queue_redraw() self.queue_redraw()
@ -438,7 +441,7 @@ class SketchWidget:
del self.drawingConstraints['hv'] del self.drawingConstraints['hv']
self.drawingShape.setPt(1, this_pt) self.drawingShape.setPt(1, this_pt)
self.queue_redraw() self.queue_redraw()
sp = self.get_closest_snap_point(x, y) sp = self.get_closest_snap_ptref(x, y)
self.update_hover_snap_point(sp) self.update_hover_snap_point(sp)
def do_circle_left_click(self, x, y): def do_circle_left_click(self, x, y):
@ -462,13 +465,13 @@ class SketchWidget:
self.queue_redraw() self.queue_redraw()
self.update_hover_snap_point(None) self.update_hover_snap_point(None)
else: else:
sp = self.get_closest_snap_point(x, y) sp = self.get_closest_snap_ptref(x, y)
self.update_hover_snap_point(sp) self.update_hover_snap_point(sp)
def cancel_drawing_shape(self): def cancel_drawing_shape(self):
self.drawingShape = None self.drawingShape = None
self.drawingConstraints = {} self.drawingConstraints = {}
self.hover_snap_point = None self.hover_snap_ptref = None
def merge_in_drawing_shape(self): def merge_in_drawing_shape(self):
self.sketch.shapes.append(self.drawingShape) self.sketch.shapes.append(self.drawingShape)
@ -487,36 +490,35 @@ class SketchWidget:
y = pt2[1] - pt1[1] y = pt2[1] - pt1[1]
return x * x + y * y return x * x + y * y
def update_snap_points(self): def update_snap_ptrefs(self):
self.snap_points = {} self.snap_ptrefs = {}
for s in self.sketch.shapes: for s in self.sketch.shapes:
self.add_snap_points(s) self.add_snap_ptref(s)
def add_snap_points(self, shape): def add_snap_ptref(self, shape):
for i in range(shape.nPts()): for i in range(shape.nPts()):
pt = self.ptToScreenPt(shape.getPt(i)) pt = self.ptToScreenPt(shape.getPt(i))
self.snap_points[(shape, i)] = pt self.snap_ptrefs[PointRef(shape, i)] = pt
def get_closest_snap_point(self, x, y): def get_closest_snap_ptref(self, x, y):
closest_point = None closest_ptref = None
closest_dist = self.snap_dist2 * 2 closest_dist = self.snap_dist2 * 2
for p in self.snap_points: for p in self.snap_ptrefs:
shape, ptNum = p screen_pt = self.snap_ptrefs[p]
pt = self.ptToScreenPt(shape.getPt(ptNum)) dist = self.dist2_bw((x, self.size[1] - y), screen_pt)
dist = self.dist2_bw((x, self.size[1] - y), pt)
if dist < closest_dist: if dist < closest_dist:
closest_dist = dist closest_dist = dist
closest_point = p closest_ptref = p
if closest_dist <= self.snap_dist2: if closest_dist <= self.snap_dist2:
return closest_point return closest_ptref
return None return None
def update_hover_snap_point(self, sp): def update_hover_snap_point(self, sp):
if sp is not None: if sp is not None:
if sp != self.hover_snap_point: if sp != self.hover_snap_ptref:
self.hover_snap_point = sp self.hover_snap_ptref = sp
self.queue_redraw() self.queue_redraw()
else: else:
if self.hover_snap_point is not None: if self.hover_snap_ptref is not None:
self.hover_snap_point = None self.hover_snap_ptref = None
self.queue_redraw() self.queue_redraw()