add PointRef class, convert snap points to PointRef instances
This commit is contained in:
parent
de69e966cb
commit
aebf7df80f
8
PointRef.py
Normal file
8
PointRef.py
Normal 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)
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user