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 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()