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